I don't know if returning pixel aspect ratios like 14097:10000 is nice,

but at least it's not that broken as always using 1:1


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@9833 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
beveloper
2004-11-07 18:05:28 +00:00
parent 1682c6b4ab
commit 8dc315d3db
3 changed files with 38 additions and 15 deletions
@@ -235,6 +235,14 @@ mkvReader::SetupVideoCookie(mkv_cookie *cookie)
TRACE("mkvReader::SetupVideoCookie: codec not recognized\n"); TRACE("mkvReader::SetupVideoCookie: codec not recognized\n");
return B_ERROR; 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.max_bit_rate =
// cookie->format.u.encoded_video.avg_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.first_active = 0;
cookie->format.u.encoded_video.output.last_active = cookie->line_count - 1; 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.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_width_aspect = width_aspect_ratio;
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_height_aspect = height_aspect_ratio;
// cookie->format.u.encoded_video.output.display.format = 0; // 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_width = cookie->track_info->Video.PixelWidth;
cookie->format.u.encoded_video.output.display.line_count = cookie->track_info->Video.PixelHeight; cookie->format.u.encoded_video.output.display.line_count = cookie->track_info->Video.PixelHeight;
@@ -23,6 +23,7 @@
* OF THE POSSIBILITY OF SUCH DAMAGE. * OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include <string.h> #include <string.h>
#include <stdio.h>
#include "matroska_util.h" #include "matroska_util.h"
@@ -64,16 +65,29 @@ get_frame_count_by_default_duration(uint64 duration, uint64 default_duration)
} }
uint16 void
get_pixel_width_aspect(unsigned int pixel_width, unsigned int display_width) 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;
}
@@ -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_frame_rate(uint64 duration, float frame_rate);
uint64 get_frame_count_by_default_duration(uint64 duration, uint64 default_duration); 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); void get_pixel_aspect_ratio(uint16 *width_aspect_ratio, uint16 *height_aspect_ratio,
uint16 get_pixel_height_aspect(unsigned int pixel_height, unsigned int display_height); unsigned int pixel_width, unsigned int pixel_height,
unsigned int display_width, unsigned int display_height);
#endif #endif