diff options
author | Zhong Li <zhong.li@intel.com> | 2018-04-07 19:38:55 +0200 |
---|---|---|
committer | Maxym Dmytrychenko <maxim.d33@gmail.com> | 2018-04-08 20:47:59 +0200 |
commit | 54307b35311e9a871b3d8ecb2b2eecfc16de0163 (patch) | |
tree | 7cbfcfc67caeef6d1d0a240175f6735a15be7241 | |
parent | cca5e4f040971db6de0bfe6968f00c021d8a9c42 (diff) | |
download | ffmpeg-streaming-54307b35311e9a871b3d8ecb2b2eecfc16de0163.zip ffmpeg-streaming-54307b35311e9a871b3d8ecb2b2eecfc16de0163.tar.gz |
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>
Signed-off-by: Maxym Dmytrychenko <maxim.d33@gmail.com>
-rw-r--r-- | libavcodec/qsvdec.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index c1b6238..31cce2d 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -323,6 +323,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)); @@ -516,6 +518,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 || FFALIGN(q->parser->coded_width, 16) != FFALIGN(avctx->coded_width, 16) || @@ -540,7 +543,6 @@ int ff_qsv_process_data(AVCodecContext *avctx, QSVContext *q, avctx->height = q->parser->height; avctx->coded_width = FFALIGN(q->parser->coded_width, 16); avctx->coded_height = FFALIGN(q->parser->coded_height, 16); - avctx->field_order = q->parser->field_order; avctx->level = q->avctx_internal->level; avctx->profile = q->avctx_internal->profile; |