diff mbox series

[FFmpeg-devel] avcodec/frame_thread_encoder: remove usage of avcodec_encode_video2()

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()
Related show

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

James Almer May 17, 2020, 2:07 p.m. UTC
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(-)

Comments

Carl Eugen Hoyos May 17, 2020, 3:37 p.m. UTC | #1
> 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
James Almer May 17, 2020, 4:17 p.m. UTC | #2
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.
James Almer May 24, 2020, 3:02 p.m. UTC | #3
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 mbox series

Patch

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;