summaryrefslogtreecommitdiff
path: root/libavcodec/mpeg12.c
diff options
context:
space:
mode:
authorIvan Kalvachev <ikalvachev@gmail.com>2004-03-15 16:41:15 +0000
committerIvan Kalvachev <ikalvachev@gmail.com>2004-03-15 16:41:15 +0000
commit5ac4768362c7a7ea336e3c0d203a9f5bd451a9bb (patch)
tree37b285a1bdc6a4e48e4fd34868dc1afbdc91b7ae /libavcodec/mpeg12.c
parente15dec10d5eb1fba001714a512779f459a8b51fc (diff)
mpeg12 fix 10l of aspect calucalations, return gop perser to print debug info, and make mpeg1_seq_header hot overwrite height/width
Originally committed as revision 2897 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/mpeg12.c')
-rw-r--r--libavcodec/mpeg12.c54
1 files changed, 45 insertions, 9 deletions
diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c
index 4d2cba8f37..c1b7181579 100644
--- a/libavcodec/mpeg12.c
+++ b/libavcodec/mpeg12.c
@@ -1840,7 +1840,10 @@ uint8_t old_permutation[64];
if(s->aspect_ratio_info > 1){
if( (s1->display_weight == 0 )||(s1->display_height == 0) ){
s->avctx->sample_aspect_ratio=
- mpeg2_aspect[s->aspect_ratio_info];
+ av_div_q(
+ mpeg2_aspect[s->aspect_ratio_info],
+ (AVRational){s->width, s->height}
+ );
}else{
s->avctx->sample_aspect_ratio=
av_div_q(
@@ -1850,10 +1853,7 @@ uint8_t old_permutation[64];
}
}else{
s->avctx->sample_aspect_ratio=
- av_div_q(
- mpeg2_aspect[s->aspect_ratio_info],
- (AVRational){s->width, s->height}
- );
+ mpeg2_aspect[s->aspect_ratio_info];
}
}//mpeg2
@@ -2482,12 +2482,16 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx,
{
Mpeg1Context *s1 = avctx->priv_data;
MpegEncContext *s = &s1->mpeg_enc_ctx;
+ int width,height;
int i, v, j;
init_get_bits(&s->gb, buf, buf_size*8);
- s->width = get_bits(&s->gb, 12);
- s->height = get_bits(&s->gb, 12);
+ width = get_bits(&s->gb, 12);
+ height = get_bits(&s->gb, 12);
+ if (width <= 0 || height <= 0 ||
+ (width % 2) != 0 || (height % 2) != 0)
+ return -1;
s->aspect_ratio_info= get_bits(&s->gb, 4);
if (s->aspect_ratio_info == 0)
return -1;
@@ -2497,8 +2501,8 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx,
s->bit_rate = get_bits(&s->gb, 18) * 400;
if (get_bits1(&s->gb) == 0) /* marker */
return -1;
- if (s->width <= 0 || s->height <= 0)
- return -1;
+ s->width = width;
+ s->height = height;
s->avctx->rc_buffer_size= get_bits(&s->gb, 10) * 1024*16;
skip_bits(&s->gb, 1);
@@ -2662,6 +2666,36 @@ static void mpeg_decode_user_data(AVCodecContext *avctx,
}
}
+static void mpeg_decode_gop(AVCodecContext *avctx,
+ const uint8_t *buf, int buf_size){
+ Mpeg1Context *s1 = avctx->priv_data;
+ MpegEncContext *s = &s1->mpeg_enc_ctx;
+
+ int drop_frame_flag;
+ int time_code_hours, time_code_minutes;
+ int time_code_seconds, time_code_pictures;
+ int broken_link;
+
+ init_get_bits(&s->gb, buf, buf_size*8);
+
+ drop_frame_flag = get_bits1(&s->gb);
+
+ time_code_hours=get_bits(&s->gb,5);
+ time_code_minutes = get_bits(&s->gb,6);
+ skip_bits1(&s->gb);//marker bit
+ time_code_seconds = get_bits(&s->gb,6);
+ time_code_pictures = get_bits(&s->gb,6);
+
+ /*broken_link indicate that after editing the
+ reference frames of the first B-Frames after GOP I-Frame
+ are missing (open gop)*/
+ broken_link = get_bits1(&s->gb);
+
+ if(s->avctx->debug & FF_DEBUG_PICT_INFO)
+ av_log(s->avctx, AV_LOG_DEBUG, "GOP (%2d:%02d:%02d.[%02d]) broken_link=%d\n",
+ time_code_hours, time_code_minutes, time_code_seconds,
+ time_code_pictures, broken_link);
+}
/**
* finds the end of the current frame in the bitstream.
* @return the position of the first byte of the next frame, or -1
@@ -2800,6 +2834,8 @@ static int mpeg_decode_frame(AVCodecContext *avctx,
break;
case GOP_START_CODE:
s2->first_field=0;
+ mpeg_decode_gop(avctx,
+ buf_ptr, input_size);
break;
default:
if (start_code >= SLICE_MIN_START_CODE &&