[V2,1/3] lavc/qsvdec: set complete_frame flags for progressive picture

Message ID 1521729713-22225-1-git-send-email-zhong.li@intel.com
State New
Headers show
Series
  • [V2,1/3] lavc/qsvdec: set complete_frame flags for progressive picture
Related show

Commit Message

Li, Zhong March 22, 2018, 2:41 p.m.
Set the flag MFX_BITSTREAM_COMPLETE_FRAME when it is a progressive picture.
This can fix vc1 decoding segment fault issues because can't set the start
code correctly.
See: ./avconv -hwaccel qsv -c:v vc1_qsv -i /fate-suite/vc1/SA00040.vc1
-vf "hwdownload, format=nv12" -f rawvideo /dev/null

v2: fix some h264 interlaced clips regression
a. field_order of some h264 interlaced video (e.g: cama3_vtc_b.avc) is marked as AV_FIELD_UNKNOWN
   in h264_parser.c. This is not a completed frames.
   So only set the MFX_BITSTREAM_COMPLETE_FRAME when it is progressive.
b. some clips have both progressive and interlaced frames (e.g.CAPAMA3_Sand_F.264),
   the parsed field_order maybe changed druing the decoding progress.

This patch has been verified for other codecs(mpeg2/hevc/vp8).

Signed-off-by: Zhong Li <zhong.li@intel.com>
---
 libavcodec/qsvdec.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Li, Zhong March 29, 2018, 2:05 p.m. | #1
Ping? 

> -----Original Message-----
> From: Li, Zhong
> Sent: Thursday, March 22, 2018 10:42 PM
> To: libav-devel@libav.org
> Cc: Li, Zhong <zhong.li@intel.com>
> Subject: [PATCH V2 1/3] lavc/qsvdec: set complete_frame flags for
> progressive picture
> 
> Set the flag MFX_BITSTREAM_COMPLETE_FRAME when it is a progressive
> picture.
> This can fix vc1 decoding segment fault issues because can't set the start
> code correctly.
> See: ./avconv -hwaccel qsv -c:v vc1_qsv -i /fate-suite/vc1/SA00040.vc1 -vf
> "hwdownload, format=nv12" -f rawvideo /dev/null
> 
> v2: fix some h264 interlaced clips regression a. field_order of some h264
> interlaced video (e.g: cama3_vtc_b.avc) is marked as AV_FIELD_UNKNOWN
>    in h264_parser.c. This is not a completed frames.
>    So only set the MFX_BITSTREAM_COMPLETE_FRAME when it is
> progressive.
> b. some clips have both progressive and interlaced frames
> (e.g.CAPAMA3_Sand_F.264),
>    the parsed field_order maybe changed druing the decoding progress.
> 
> This patch has been verified for other codecs(mpeg2/hevc/vp8).
> 
> Signed-off-by: Zhong Li <zhong.li@intel.com>
> ---
>  libavcodec/qsvdec.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index
> c74ec68..8148beb 100644
> --- a/libavcodec/qsvdec.c
> +++ b/libavcodec/qsvdec.c
> @@ -321,6 +321,8 @@ static int qsv_decode(AVCodecContext *avctx,
> QSVContext *q,
>          bs.DataLength = avpkt->size;
>          bs.MaxLength  = bs.DataLength;
>          bs.TimeStamp  = avpkt->pts;
> +        if (avctx->field_order == AV_FIELD_PROGRESSIVE)
> +            bs.DataFlag   |= MFX_BITSTREAM_COMPLETE_FRAME;
>      }
> 
>      sync = av_mallocz(sizeof(*sync));
> @@ -509,6 +511,7 @@ int ff_qsv_process_data(AVCodecContext *avctx,
> QSVContext *q,
>                       pkt->data, pkt->size, pkt->pts, pkt->dts,
>                       pkt->pos);
> 
> +    avctx->field_order  = q->parser->field_order;
>      /* TODO: flush delayed frames on reinit */
>      if (q->parser->format       != q->orig_pix_fmt    ||
>          q->parser->coded_width  != avctx->coded_width || @@ -533,7
> +536,6 @@ int ff_qsv_process_data(AVCodecContext *avctx, QSVContext
> *q,
>          avctx->height       = q->parser->height;
>          avctx->coded_width  = q->parser->coded_width;
>          avctx->coded_height = q->parser->coded_height;
> -        avctx->field_order  = q->parser->field_order;
>          avctx->level        = q->avctx_internal->level;
>          avctx->profile      = q->avctx_internal->profile;
> 
> --
> 1.8.3.1

Patch

diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c
index c74ec68..8148beb 100644
--- a/libavcodec/qsvdec.c
+++ b/libavcodec/qsvdec.c
@@ -321,6 +321,8 @@  static int qsv_decode(AVCodecContext *avctx, QSVContext *q,
         bs.DataLength = avpkt->size;
         bs.MaxLength  = bs.DataLength;
         bs.TimeStamp  = avpkt->pts;
+        if (avctx->field_order == AV_FIELD_PROGRESSIVE)
+            bs.DataFlag   |= MFX_BITSTREAM_COMPLETE_FRAME;
     }
 
     sync = av_mallocz(sizeof(*sync));
@@ -509,6 +511,7 @@  int ff_qsv_process_data(AVCodecContext *avctx, QSVContext *q,
                      pkt->data, pkt->size, pkt->pts, pkt->dts,
                      pkt->pos);
 
+    avctx->field_order  = q->parser->field_order;
     /* TODO: flush delayed frames on reinit */
     if (q->parser->format       != q->orig_pix_fmt    ||
         q->parser->coded_width  != avctx->coded_width ||
@@ -533,7 +536,6 @@  int ff_qsv_process_data(AVCodecContext *avctx, QSVContext *q,
         avctx->height       = q->parser->height;
         avctx->coded_width  = q->parser->coded_width;
         avctx->coded_height = q->parser->coded_height;
-        avctx->field_order  = q->parser->field_order;
         avctx->level        = q->avctx_internal->level;
         avctx->profile      = q->avctx_internal->profile;