Message ID | 20200517140717.1953-1-jamrial@gmail.com |
---|---|
State | Accepted |
Headers | show |
Series | [FFmpeg-devel] avcodec/frame_thread_encoder: remove usage of avcodec_encode_video2() | expand |
Context | Check | Description |
---|---|---|
andriy/default | pending | |
andriy/make | success | Make finished |
andriy/make_fate | success | Make fate finished |
> Am 17.05.2020 um 16:07 schrieb James Almer <jamrial@gmail.com>: > > Call the encoder's internal AVCodec.encode2() function instead. Is there a performance impact? Carl Eugen
On 5/17/2020 12:37 PM, Carl Eugen Hoyos wrote: > > >> Am 17.05.2020 um 16:07 schrieb James Almer <jamrial@gmail.com>: >> >> Call the encoder's internal AVCodec.encode2() function instead. > > Is there a performance impact? > > Carl Eugen None that i have noticed.
On 5/17/2020 11:07 AM, James Almer wrote: > Call the encoder's internal AVCodec.encode2() function instead. > > Signed-off-by: James Almer <jamrial@gmail.com> > --- > libavcodec/encode.c | 20 ++++++++++++-------- > libavcodec/frame_thread_encoder.c | 14 ++++++++------ > 2 files changed, 20 insertions(+), 14 deletions(-) > > diff --git a/libavcodec/encode.c b/libavcodec/encode.c > index 9ed2cf0f59..1358f33ea5 100644 > --- a/libavcodec/encode.c > +++ b/libavcodec/encode.c > @@ -277,14 +277,12 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx, > return AVERROR(ENOSYS); > } > > - if(CONFIG_FRAME_THREAD_ENCODER && > - avctx->internal->frame_thread_encoder && (avctx->active_thread_type&FF_THREAD_FRAME)) > - return ff_thread_video_encode_frame(avctx, avpkt, frame, got_packet_ptr); > - > if ((avctx->flags&AV_CODEC_FLAG_PASS1) && avctx->stats_out) > avctx->stats_out[0] = '\0'; > > - if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY) && !frame) { > + if (!frame && > + !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY || > + (avctx->internal->frame_thread_encoder && avctx->active_thread_type & FF_THREAD_FRAME))) { > av_packet_unref(avpkt); > return 0; > } > @@ -299,7 +297,15 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx, > > av_assert0(avctx->codec->encode2); > > - ret = avctx->codec->encode2(avctx, avpkt, frame, got_packet_ptr); > + > + if (CONFIG_FRAME_THREAD_ENCODER && > + avctx->internal->frame_thread_encoder && avctx->active_thread_type & FF_THREAD_FRAME) > + ret = ff_thread_video_encode_frame(avctx, avpkt, frame, got_packet_ptr); > + else { > + ret = avctx->codec->encode2(avctx, avpkt, frame, got_packet_ptr); > + if (!ret && *got_packet_ptr && !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY)) > + avpkt->pts = avpkt->dts = frame->pts; > + } > av_assert0(ret <= 0); > > emms_c(); > @@ -326,8 +332,6 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx, > if (!ret) { > if (!*got_packet_ptr) > avpkt->size = 0; > - else if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY)) > - avpkt->pts = avpkt->dts = frame->pts; > > if (needs_realloc && avpkt->data) { > ret = av_buffer_realloc(&avpkt->buf, avpkt->size + AV_INPUT_BUFFER_PADDING_SIZE); > diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c > index 949bc69f81..cea0ea2af3 100644 > --- a/libavcodec/frame_thread_encoder.c > +++ b/libavcodec/frame_thread_encoder.c > @@ -66,7 +66,7 @@ static void * attribute_align_arg worker(void *v){ > AVPacket *pkt = NULL; > > while (!atomic_load(&c->exit)) { > - int got_packet, ret; > + int got_packet = 0, ret; > AVFrame *frame; > Task task; > > @@ -86,19 +86,21 @@ static void * attribute_align_arg worker(void *v){ > pthread_mutex_unlock(&c->task_fifo_mutex); > frame = task.indata; > > - ret = avcodec_encode_video2(avctx, pkt, frame, &got_packet); > - pthread_mutex_lock(&c->buffer_mutex); > - av_frame_unref(frame); > - pthread_mutex_unlock(&c->buffer_mutex); > - av_frame_free(&frame); > + ret = avctx->codec->encode2(avctx, pkt, frame, &got_packet); > if(got_packet) { > int ret2 = av_packet_make_refcounted(pkt); > if (ret >= 0 && ret2 < 0) > ret = ret2; > + if (!ret) > + pkt->pts = pkt->dts = frame->pts; > } else { > pkt->data = NULL; > pkt->size = 0; > } > + pthread_mutex_lock(&c->buffer_mutex); > + av_frame_unref(frame); > + pthread_mutex_unlock(&c->buffer_mutex); > + av_frame_free(&frame); > pthread_mutex_lock(&c->finished_task_mutex); > c->finished_tasks[task.index].outdata = pkt; pkt = NULL; > c->finished_tasks[task.index].return_code = ret; Will push soon if no one objects.
diff --git a/libavcodec/encode.c b/libavcodec/encode.c index 9ed2cf0f59..1358f33ea5 100644 --- a/libavcodec/encode.c +++ b/libavcodec/encode.c @@ -277,14 +277,12 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx, return AVERROR(ENOSYS); } - if(CONFIG_FRAME_THREAD_ENCODER && - avctx->internal->frame_thread_encoder && (avctx->active_thread_type&FF_THREAD_FRAME)) - return ff_thread_video_encode_frame(avctx, avpkt, frame, got_packet_ptr); - if ((avctx->flags&AV_CODEC_FLAG_PASS1) && avctx->stats_out) avctx->stats_out[0] = '\0'; - if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY) && !frame) { + if (!frame && + !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY || + (avctx->internal->frame_thread_encoder && avctx->active_thread_type & FF_THREAD_FRAME))) { av_packet_unref(avpkt); return 0; } @@ -299,7 +297,15 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx, av_assert0(avctx->codec->encode2); - ret = avctx->codec->encode2(avctx, avpkt, frame, got_packet_ptr); + + if (CONFIG_FRAME_THREAD_ENCODER && + avctx->internal->frame_thread_encoder && avctx->active_thread_type & FF_THREAD_FRAME) + ret = ff_thread_video_encode_frame(avctx, avpkt, frame, got_packet_ptr); + else { + ret = avctx->codec->encode2(avctx, avpkt, frame, got_packet_ptr); + if (!ret && *got_packet_ptr && !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY)) + avpkt->pts = avpkt->dts = frame->pts; + } av_assert0(ret <= 0); emms_c(); @@ -326,8 +332,6 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx, if (!ret) { if (!*got_packet_ptr) avpkt->size = 0; - else if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY)) - avpkt->pts = avpkt->dts = frame->pts; if (needs_realloc && avpkt->data) { ret = av_buffer_realloc(&avpkt->buf, avpkt->size + AV_INPUT_BUFFER_PADDING_SIZE); diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index 949bc69f81..cea0ea2af3 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -66,7 +66,7 @@ static void * attribute_align_arg worker(void *v){ AVPacket *pkt = NULL; while (!atomic_load(&c->exit)) { - int got_packet, ret; + int got_packet = 0, ret; AVFrame *frame; Task task; @@ -86,19 +86,21 @@ static void * attribute_align_arg worker(void *v){ pthread_mutex_unlock(&c->task_fifo_mutex); frame = task.indata; - ret = avcodec_encode_video2(avctx, pkt, frame, &got_packet); - pthread_mutex_lock(&c->buffer_mutex); - av_frame_unref(frame); - pthread_mutex_unlock(&c->buffer_mutex); - av_frame_free(&frame); + ret = avctx->codec->encode2(avctx, pkt, frame, &got_packet); if(got_packet) { int ret2 = av_packet_make_refcounted(pkt); if (ret >= 0 && ret2 < 0) ret = ret2; + if (!ret) + pkt->pts = pkt->dts = frame->pts; } else { pkt->data = NULL; pkt->size = 0; } + pthread_mutex_lock(&c->buffer_mutex); + av_frame_unref(frame); + pthread_mutex_unlock(&c->buffer_mutex); + av_frame_free(&frame); pthread_mutex_lock(&c->finished_task_mutex); c->finished_tasks[task.index].outdata = pkt; pkt = NULL; c->finished_tasks[task.index].return_code = ret;
Call the encoder's internal AVCodec.encode2() function instead. Signed-off-by: James Almer <jamrial@gmail.com> --- libavcodec/encode.c | 20 ++++++++++++-------- libavcodec/frame_thread_encoder.c | 14 ++++++++------ 2 files changed, 20 insertions(+), 14 deletions(-)