mirror of https://git.ffmpeg.org/ffmpeg.git
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.dmytrychenko@intel.com>
This commit is contained in:
parent
a6259a6ecb
commit
d1cd20e4e3
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue