On Mon, 2021-03-22 at 14:27 +0800, wenbin.c...@intel.com wrote: > From: "Chen,Wenbin" <wenbin.c...@intel.com> > > FFmpeg-qsv decoder reinit codec when width and height change, but there > are not only resolution change need to reinit codec. I change it to use > return value from DecodeFrameAsync() to decide whether decoder need to > be reinitialized. > > Signed-off-by Wenbin Chen <wenbin.c...@intel.com> > --- > libavcodec/qsvdec.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c > index bca6e217fa..124f3e0a7a 100644 > --- a/libavcodec/qsvdec.c > +++ b/libavcodec/qsvdec.c > @@ -438,6 +438,12 @@ static int qsv_decode(AVCodecContext *avctx, QSVContext > *q, > > } while (ret == MFX_WRN_DEVICE_BUSY || ret == MFX_ERR_MORE_SURFACE); > > + if (ret == MFX_ERR_INCOMPATIBLE_VIDEO_PARAM) { > + q->reinit_flag = 1; > + av_log(avctx, AV_LOG_VERBOSE, "Video parameter change\n");
How about using AV_LOG_DEBUG instead? I think it is useful only for developers. In addition, sync should be freed before returning 0. > + return 0; > + } > + > if (ret != MFX_ERR_NONE && > ret != MFX_ERR_MORE_DATA && > ret != MFX_WRN_VIDEO_PARAM_CHANGED && > @@ -591,9 +597,9 @@ int ff_qsv_process_data(AVCodecContext *avctx, QSVContext > *q, > > ret = qsv_decode_header(avctx, q, pkt, pix_fmt, ¶m); > > - if (ret >= 0 && (q->orig_pix_fmt != > ff_qsv_map_fourcc(param.mfx.FrameInfo.FourCC) || > + if (q->reinit_flag || (ret >= 0 && (q->orig_pix_fmt != > ff_qsv_map_fourcc(param.mfx.FrameInfo.FourCC) || > avctx->coded_width != param.mfx.FrameInfo.Width || > - avctx->coded_height != param.mfx.FrameInfo.Height)) { > + avctx->coded_height != param.mfx.FrameInfo.Height))) { > AVPacket zero_pkt = {0}; > > if (q->buffered_count) { _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".