summaryrefslogtreecommitdiff
path: root/src/libmpeg2/decode.c
diff options
context:
space:
mode:
authorMiguel Freitas <miguelfreitas@users.sourceforge.net>2003-09-01 20:12:36 +0000
committerMiguel Freitas <miguelfreitas@users.sourceforge.net>2003-09-01 20:12:36 +0000
commit7cbdb89b95bc11d8ab42a2e3fee21cb8e8d5a7d0 (patch)
treed2c171dce9137a8aa2d8ec2f7c3cf59a550d2e7b /src/libmpeg2/decode.c
parente4dc772846821fe43e3a9c861db5494e16476980 (diff)
downloadxine-lib-7cbdb89b95bc11d8ab42a2e3fee21cb8e8d5a7d0.tar.gz
xine-lib-7cbdb89b95bc11d8ab42a2e3fee21cb8e8d5a7d0.tar.bz2
that should fix mpeg1 aspect ratio as reported by Gert Vervoort
CVS patchset: 5328 CVS date: 2003/09/01 20:12:36
Diffstat (limited to 'src/libmpeg2/decode.c')
-rw-r--r--src/libmpeg2/decode.c76
1 files changed, 39 insertions, 37 deletions
diff --git a/src/libmpeg2/decode.c b/src/libmpeg2/decode.c
index 4ce672022..0f9742fe4 100644
--- a/src/libmpeg2/decode.c
+++ b/src/libmpeg2/decode.c
@@ -152,29 +152,49 @@ static inline void get_frame_duration (mpeg2dec_t * mpeg2dec, vo_frame_t *frame)
/*printf("mpeg2dec: rff=%u\n",frame->repeat_first_field);*/
}
+static double get_aspect_ratio(mpeg2dec_t *mpeg2dec)
+{
+ double ratio;
+ picture_t * picture = mpeg2dec->picture;
+ double mpeg1_pel_ratio[16] = {1.0 /* forbidden */,
+ 1.0, 0.6735, 0.7031, 0.7615, 0.8055, 0.8437, 0.8935, 0.9157,
+ 0.9815, 1.0255, 1.0695, 1.0950, 1.1575, 1.2015, 1.0 /*reserved*/ };
+
+ if( !picture->mpeg1 ) {
+ /* these hardcoded values are defined on mpeg2 standard for
+ * aspect ratio. other values are reserved or forbidden. */
+ switch(picture->aspect_ratio_information) {
+ case 2:
+ ratio = 4.0/3.0;
+ break;
+ case 3:
+ ratio = 16.0/9.0;
+ break;
+ case 4:
+ ratio = 2.11/1.0;
+ break;
+ case 1:
+ default:
+ ratio = (double)picture->coded_picture_width/(double)picture->coded_picture_height;
+ break;
+ }
+ } else {
+ /* mpeg1 constants refer to pixel aspect ratio */
+ ratio = (double)picture->coded_picture_width/(double)picture->coded_picture_height;
+ ratio /= mpeg1_pel_ratio[picture->aspect_ratio_information];
+ }
+
+ return ratio;
+}
+
static void remember_metainfo (mpeg2dec_t *mpeg2dec) {
picture_t * picture = mpeg2dec->picture;
mpeg2dec->stream->stream_info[XINE_STREAM_INFO_VIDEO_WIDTH] = picture->frame_width;
mpeg2dec->stream->stream_info[XINE_STREAM_INFO_VIDEO_HEIGHT] = picture->frame_height;
-
- switch (picture->aspect_ratio_information) {
- case 2:
- mpeg2dec->stream->stream_info[XINE_STREAM_INFO_VIDEO_RATIO] = 10000 * 4.0 / 3.0;
- break;
- case 3:
- mpeg2dec->stream->stream_info[XINE_STREAM_INFO_VIDEO_RATIO] = 10000 * 16.0 /9.0;
- break;
- case 4: /* 2.11:1 */
- mpeg2dec->stream->stream_info[XINE_STREAM_INFO_VIDEO_RATIO] = 10000 * 2.11/1.0;
- break;
- case 1: /* square pels */
- default:
- mpeg2dec->stream->stream_info[XINE_STREAM_INFO_VIDEO_RATIO] = 10000 *
- picture->frame_width/picture->frame_height;
- break;
- }
+ mpeg2dec->stream->stream_info[XINE_STREAM_INFO_VIDEO_RATIO] =
+ ((double)10000 * get_aspect_ratio(mpeg2dec));
switch (mpeg2dec->picture->frame_rate_code) {
case 1: /* 23.976 fps */
@@ -216,7 +236,6 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
{
picture_t * picture;
int is_frame_done;
- double ratio;
/* wait for sequence_header_code */
if (mpeg2dec->is_sequence_needed) {
@@ -462,29 +481,12 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
picture->current_frame != picture->forward_reference_frame ) {
picture->current_frame->free (picture->current_frame);
}
- /* these hardcoded values are defined on mpeg2 standard for
- * aspect ratio. other values are reserved or forbidden. */
- switch(picture->aspect_ratio_information) {
- case 2:
- ratio = 4.0/3.0;
- break;
- case 3:
- ratio = 16.0/9.0;
- break;
- case 4:
- ratio = 2.11/1.0;
- break;
- case 1:
- default:
- ratio = (double)picture->coded_picture_width/(double)picture->coded_picture_height;
- break;
- }
if (picture->picture_coding_type == B_TYPE)
picture->current_frame =
mpeg2dec->stream->video_out->get_frame (mpeg2dec->stream->video_out,
picture->coded_picture_width,
picture->coded_picture_height,
- ratio,
+ get_aspect_ratio(mpeg2dec),
XINE_IMGFMT_YV12,
flags);
else {
@@ -492,7 +494,7 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
mpeg2dec->stream->video_out->get_frame (mpeg2dec->stream->video_out,
picture->coded_picture_width,
picture->coded_picture_height,
- ratio,
+ get_aspect_ratio(mpeg2dec),
XINE_IMGFMT_YV12,
flags);
if (picture->forward_reference_frame &&