aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/decode.c
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2019-08-30 11:37:25 -0300
committerJames Almer <jamrial@gmail.com>2019-09-04 10:07:12 -0300
commit9ea6d2149e25d68885a24894bb911077b05388c4 (patch)
treed302ed27dd814bea2189537f62c4120f69ecb669 /libavcodec/decode.c
parent39f129593756e3e270ed3881ca076627f30e1eb7 (diff)
downloadffmpeg-9ea6d2149e25d68885a24894bb911077b05388c4.tar.gz
avcodec/decode: add a flags parameter to ff_reget_buffer()
Some decoders may not need a writable buffer in some specific cases, but only a reference to the existing buffer with updated frame properties instead, for the purpose of returning duplicate frames. For this, the FF_REGET_BUFFER_FLAG_READONLY flag is added, which will prevent potential allocations and buffer copies when they are not needed. Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavcodec/decode.c')
-rw-r--r--libavcodec/decode.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index cf9676e2ac..a9ea5a51e6 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -1970,7 +1970,7 @@ int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
return ret;
}
-static int reget_buffer_internal(AVCodecContext *avctx, AVFrame *frame)
+static int reget_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags)
{
AVFrame *tmp;
int ret;
@@ -1986,7 +1986,7 @@ static int reget_buffer_internal(AVCodecContext *avctx, AVFrame *frame)
if (!frame->data[0])
return ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF);
- if (av_frame_is_writable(frame))
+ if ((flags & FF_REGET_BUFFER_FLAG_READONLY) || av_frame_is_writable(frame))
return ff_decode_frame_props(avctx, frame);
tmp = av_frame_alloc();
@@ -2007,9 +2007,9 @@ static int reget_buffer_internal(AVCodecContext *avctx, AVFrame *frame)
return 0;
}
-int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame)
+int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
{
- int ret = reget_buffer_internal(avctx, frame);
+ int ret = reget_buffer_internal(avctx, frame, flags);
if (ret < 0)
av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
return ret;