diff options
author | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2021-02-07 13:46:11 +0100 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2021-02-16 22:11:53 +0100 |
commit | 76d428e090e0a547b2e6be6dbd22cf87817adec7 (patch) | |
tree | 98afc4450cea4a2aab2a03b9f7adbb847ffbef6c | |
parent | fbf242a51d4005a11d1a52dc5d2bff939311c24d (diff) | |
download | ffmpeg-76d428e090e0a547b2e6be6dbd22cf87817adec7.tar.gz |
avcodec/frame_thread_encoder: Avoid creating reference to frame
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
-rw-r--r-- | libavcodec/encode.c | 4 | ||||
-rw-r--r-- | libavcodec/frame_thread_encoder.c | 11 | ||||
-rw-r--r-- | libavcodec/frame_thread_encoder.h | 3 |
3 files changed, 10 insertions, 8 deletions
diff --git a/libavcodec/encode.c b/libavcodec/encode.c index 29f41c3f92..282337e453 100644 --- a/libavcodec/encode.c +++ b/libavcodec/encode.c @@ -152,6 +152,10 @@ static int encode_simple_internal(AVCodecContext *avctx, AVPacket *avpkt) if (CONFIG_FRAME_THREAD_ENCODER && avci->frame_thread_encoder && (avctx->active_thread_type & FF_THREAD_FRAME)) + /* This might modify frame, but it doesn't matter, because + * the frame properties used below are not used for video + * (due to the delay inherent in frame threaded encoding, it makes + * no sense to use the properties of the current frame anyway). */ ret = ff_thread_video_encode_frame(avctx, avpkt, frame, &got_packet); else { ret = avctx->codec->encode2(avctx, avpkt, frame, &got_packet); diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index bcd3c94f8b..7c2894c933 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -286,10 +286,11 @@ void ff_frame_thread_encoder_free(AVCodecContext *avctx){ av_freep(&avctx->internal->frame_thread_encoder); } -int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet_ptr){ +int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, + AVFrame *frame, int *got_packet_ptr) +{ ThreadContext *c = avctx->internal->frame_thread_encoder; Task *outtask, task; - int ret; av_assert1(!*got_packet_ptr); @@ -297,11 +298,7 @@ int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVF AVFrame *new = av_frame_alloc(); if(!new) return AVERROR(ENOMEM); - ret = av_frame_ref(new, frame); - if(ret < 0) { - av_frame_free(&new); - return ret; - } + av_frame_move_ref(new, frame); task.index = c->task_index; task.indata = (void*)new; diff --git a/libavcodec/frame_thread_encoder.h b/libavcodec/frame_thread_encoder.h index 1f79553f20..c400d6b32c 100644 --- a/libavcodec/frame_thread_encoder.h +++ b/libavcodec/frame_thread_encoder.h @@ -25,6 +25,7 @@ int ff_frame_thread_encoder_init(AVCodecContext *avctx, AVDictionary *options); void ff_frame_thread_encoder_free(AVCodecContext *avctx); -int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet_ptr); +int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, + AVFrame *frame, int *got_packet_ptr); #endif /* AVCODEC_FRAME_THREAD_ENCODER_H */ |