diff --git a/src/add-ons/media/plugins/matroska/matroska_reader.cpp b/src/add-ons/media/plugins/matroska/matroska_reader.cpp index d0b661bcbb..e468360d46 100644 --- a/src/add-ons/media/plugins/matroska/matroska_reader.cpp +++ b/src/add-ons/media/plugins/matroska/matroska_reader.cpp @@ -235,6 +235,14 @@ mkvReader::SetupVideoCookie(mkv_cookie *cookie) TRACE("mkvReader::SetupVideoCookie: codec not recognized\n"); return B_ERROR; } + + uint16 width_aspect_ratio; + uint16 height_aspect_ratio; + get_pixel_aspect_ratio(&width_aspect_ratio, &height_aspect_ratio, + cookie->track_info->Video.PixelWidth, + cookie->track_info->Video.PixelHeight, + cookie->track_info->Video.DisplayWidth, + cookie->track_info->Video.DisplayHeight); // cookie->format.u.encoded_video.max_bit_rate = // cookie->format.u.encoded_video.avg_bit_rate = @@ -243,8 +251,8 @@ mkvReader::SetupVideoCookie(mkv_cookie *cookie) cookie->format.u.encoded_video.output.first_active = 0; cookie->format.u.encoded_video.output.last_active = cookie->line_count - 1; cookie->format.u.encoded_video.output.orientation = B_VIDEO_TOP_LEFT_RIGHT; - cookie->format.u.encoded_video.output.pixel_width_aspect = get_pixel_width_aspect(cookie->track_info->Video.PixelWidth, cookie->track_info->Video.DisplayWidth); - cookie->format.u.encoded_video.output.pixel_height_aspect = get_pixel_height_aspect(cookie->track_info->Video.PixelHeight, cookie->track_info->Video.DisplayHeight); + cookie->format.u.encoded_video.output.pixel_width_aspect = width_aspect_ratio; + cookie->format.u.encoded_video.output.pixel_height_aspect = height_aspect_ratio; // cookie->format.u.encoded_video.output.display.format = 0; cookie->format.u.encoded_video.output.display.line_width = cookie->track_info->Video.PixelWidth; cookie->format.u.encoded_video.output.display.line_count = cookie->track_info->Video.PixelHeight; diff --git a/src/add-ons/media/plugins/matroska/matroska_util.cpp b/src/add-ons/media/plugins/matroska/matroska_util.cpp index 1eb23759ed..4fe2ff4779 100644 --- a/src/add-ons/media/plugins/matroska/matroska_util.cpp +++ b/src/add-ons/media/plugins/matroska/matroska_util.cpp @@ -23,6 +23,7 @@ * OF THE POSSIBILITY OF SUCH DAMAGE. */ #include +#include #include "matroska_util.h" @@ -64,16 +65,29 @@ get_frame_count_by_default_duration(uint64 duration, uint64 default_duration) } -uint16 -get_pixel_width_aspect(unsigned int pixel_width, unsigned int display_width) +void +get_pixel_aspect_ratio(uint16 *width_aspect_ratio, uint16 *height_aspect_ratio, + unsigned int pixel_width, unsigned int pixel_height, + unsigned int display_width, unsigned int display_height) { - return 1; + printf("get_pixel_aspect_ratio: pixel_width %u, pixel_height %u, display_width %u, display_height %u\n", + pixel_width, pixel_height, display_width, display_height); + + if (pixel_width == display_width && pixel_height == display_height) { + *width_aspect_ratio = 1; + *height_aspect_ratio = 1; + return; + } + + double w_aspect = display_width / (double)pixel_width; + double h_aspect = display_height / (double)pixel_height; + w_aspect /= h_aspect; + h_aspect = 1; + + printf("w_aspect %.6f, h_aspect %.6f\n", w_aspect, h_aspect); + + *width_aspect_ratio = uint16(w_aspect * 10000 + 0.5); + *height_aspect_ratio = 10000; + + printf("w_aspect %.6f, h_aspect %.6f, ratio %u:%u\n", w_aspect, h_aspect, *width_aspect_ratio, *height_aspect_ratio); } - - -uint16 -get_pixel_height_aspect(unsigned int pixel_height, unsigned int display_height) -{ - return 1; -} - diff --git a/src/add-ons/media/plugins/matroska/matroska_util.h b/src/add-ons/media/plugins/matroska/matroska_util.h index a929827125..0481edbf6c 100644 --- a/src/add-ons/media/plugins/matroska/matroska_util.h +++ b/src/add-ons/media/plugins/matroska/matroska_util.h @@ -32,8 +32,9 @@ float get_frame_rate(uint64 default_duration); uint64 get_frame_count_by_frame_rate(uint64 duration, float frame_rate); uint64 get_frame_count_by_default_duration(uint64 duration, uint64 default_duration); -uint16 get_pixel_width_aspect(unsigned int pixel_width, unsigned int display_width); -uint16 get_pixel_height_aspect(unsigned int pixel_height, unsigned int display_height); +void get_pixel_aspect_ratio(uint16 *width_aspect_ratio, uint16 *height_aspect_ratio, + unsigned int pixel_width, unsigned int pixel_height, + unsigned int display_width, unsigned int display_height); #endif