[FFmpeg-devel] [PATCH] mpeg4video: ignore broken GOP headers

Janne Grunau janne-ffmpeg
Sun Feb 13 19:22:19 CET 2011


On Sun, Feb 13, 2011 at 03:57:44PM +0000, Mans Rullgard wrote:
> From: Anatoly Nenashev <anatoly.nenashev at ovsoft.ru>
> 
> Some MPEG4 cameras produce files with empty GOP headers.
> This patch makes the decoder ignore such broken headers and proceed
> with the following I-frame.  Without this change, the following
> start code is missed resulting in the entire I-frame being skipped.
> 
> Signed-off-by: Mans Rullgard <mans at mansr.com>
> ---
>  libavcodec/mpeg4videodec.c |   21 +++++++++++----------
>  1 files changed, 11 insertions(+), 10 deletions(-)
> 
> diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c
> index 673c4e8..617dcb9 100644
> --- a/libavcodec/mpeg4videodec.c
> +++ b/libavcodec/mpeg4videodec.c
> @@ -1494,16 +1494,17 @@ end:
>  
>  static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
>      int hours, minutes, seconds;
> -
> -    hours= get_bits(gb, 5);
> -    minutes= get_bits(gb, 6);
> -    skip_bits1(gb);
> -    seconds= get_bits(gb, 6);
> -
> -    s->time_base= seconds + 60*(minutes + 60*hours);
> -
> -    skip_bits1(gb);
> -    skip_bits1(gb);
> +    unsigned time_code = show_bits(gb, 18);
> +
> +    if (time_code & 0x40) {     /* marker_bit */
> +        hours   = time_code >> 13;
> +        minutes = time_code >>  7 & 0x3f;
> +        seconds = time_code       & 0x3f;
> +        s->time_base = seconds + 60*(minutes + 60*hours);
> +        skip_bits(gb, 20);      /* time_code, closed_gov, broken_link */
> +    } else {
> +        av_log(s->avctx, AV_LOG_WARNING, "GOP header missing marker_bit\n");
> +    }
>  
>      return 0;
>  }

ok

Janne



More information about the ffmpeg-devel mailing list