[FFmpeg-devel] [PATCH] libavcodec/h263dec.c: Duplicate the last decoded frame when xvid marks the packet as skipped.

Thierry Foucu tfoucu at gmail.com
Wed Oct 25 04:45:20 EEST 2017


Michael,

what do you think of this patch?

I tried to reflect what the xvid decoder does for those N_VOP frame and in
case it is not packed.



On Tue, Oct 24, 2017 at 6:42 PM, Thierry Foucu <tfoucu at gmail.com> wrote:

> Changed the return value when no VOD were encoded in Mpeg4 bistream.
> And if we do have already a decoded frames and we are not in xvid_packed
> mode, output the existing decoded frame instead of nothing.
> ---
>  libavcodec/h263dec.c       | 9 ++++++++-
>  libavcodec/mpeg4videodec.c | 2 +-
>  libavcodec/mpegutils.h     | 1 +
>  3 files changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
> index c7cf4bc0c2..394a366f9c 100644
> --- a/libavcodec/h263dec.c
> +++ b/libavcodec/h263dec.c
> @@ -506,8 +506,15 @@ retry:
>                  s->height= avctx->coded_height;
>          }
>      }
> -    if (ret == FRAME_SKIPPED)
> +    if (ret == FRAME_SKIPPED || ret == FRAME_NOT_CODED) {
> +        if (s->next_picture_ptr && ret == FRAME_NOT_CODED &&
> !s->divx_packed) {
> +            if ((ret = av_frame_ref(pict, s->next_picture_ptr->f)) < 0) {
> +                return ret;
> +            }
> +            *got_frame = 1;
> +        }
>          return get_consumed_bytes(s, buf_size);
> +    }
>
>      /* skip if the header was thrashed */
>      if (ret < 0) {
> diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c
> index 82c4f8fc8c..3a9ed12971 100644
> --- a/libavcodec/mpeg4videodec.c
> +++ b/libavcodec/mpeg4videodec.c
> @@ -2394,7 +2394,7 @@ static int decode_vop_header(Mpeg4DecContext *ctx,
> GetBitContext *gb)
>      if (get_bits1(gb) != 1) {
>          if (s->avctx->debug & FF_DEBUG_PICT_INFO)
>              av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n");
> -        return FRAME_SKIPPED;
> +        return FRAME_NOT_CODED;
>      }
>      if (ctx->new_pred)
>          decode_new_pred(ctx, gb);
> diff --git a/libavcodec/mpegutils.h b/libavcodec/mpegutils.h
> index 1bf73fea02..97786135c6 100644
> --- a/libavcodec/mpegutils.h
> +++ b/libavcodec/mpegutils.h
> @@ -32,6 +32,7 @@
>   * Return value for header parsers if frame is not coded.
>   * */
>  #define FRAME_SKIPPED 100
> +#define FRAME_NOT_CODED 101
>
>  /* picture type */
>  #define PICT_TOP_FIELD     1
> --
> 2.15.0.rc0.271.g36b669edcc-goog
>
>


More information about the ffmpeg-devel mailing list