ffmpeg | branch: master | Anton Khirnov <an...@khirnov.net> | Wed Jan 6 08:39:27 2016 +0100| [d1cd20e4e33f8139e150034b3c457302312d81bd] | committer: Anton Khirnov
qsvenc: split encoding frames and reading from the async FIFO This makes sure all the frames are returned at the end. Found-By: Maxym Dmytrychenko <maxym.dmytryche...@intel.com> > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d1cd20e4e33f8139e150034b3c457302312d81bd --- libavcodec/qsvenc.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index cda11fa..4a33ade 100644 --- a/libavcodec/qsvenc.c +++ b/libavcodec/qsvenc.c @@ -857,8 +857,8 @@ static void print_interlace_msg(AVCodecContext *avctx, QSVEncContext *q) } } -int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q, - AVPacket *pkt, const AVFrame *frame, int *got_packet) +static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, + const AVFrame *frame) { AVPacket new_pkt = { 0 }; mfxBitstream *bs; @@ -913,8 +913,24 @@ int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q, av_freep(&bs); } + return 0; +} + +int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q, + AVPacket *pkt, const AVFrame *frame, int *got_packet) +{ + int ret; + + ret = encode_frame(avctx, q, frame); + if (ret < 0) + return ret; + if (!av_fifo_space(q->async_fifo) || (!frame && av_fifo_size(q->async_fifo))) { + AVPacket new_pkt; + mfxBitstream *bs; + mfxSyncPoint sync; + av_fifo_generic_read(q->async_fifo, &new_pkt, sizeof(new_pkt), NULL); av_fifo_generic_read(q->async_fifo, &sync, sizeof(sync), NULL); av_fifo_generic_read(q->async_fifo, &bs, sizeof(bs), NULL); _______________________________________________ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog