summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2020-05-29 13:59:12 -0300
committerJames Almer <jamrial@gmail.com>2020-06-09 18:18:11 -0300
commit1ee3c984b91e0241068d1c093d222ecec2e6052c (patch)
treef72a0f636ed419806133596ecc6d83dbcd20dfa9 /libavcodec
parent7ab375f57488112fcdc8c286cdf74276d50887c2 (diff)
avcodec/snow: ensure current_picture is writable before modifying its data
current_picture was not writable here because a reference existed in at least avctx->coded_frame, and potentially elsewhere if the caller created new ones from it. Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/snowenc.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/libavcodec/snowenc.c b/libavcodec/snowenc.c
index fb8983cd2f..b1cf1426ee 100644
--- a/libavcodec/snowenc.c
+++ b/libavcodec/snowenc.c
@@ -1625,10 +1625,22 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
s->lambda = 0;
}//else keep previous frame's qlog until after motion estimation
+#if FF_API_CODED_FRAME
+FF_DISABLE_DEPRECATION_WARNINGS
+ av_frame_unref(avctx->coded_frame);
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
+
if (s->current_picture->data[0]) {
int w = s->avctx->width;
int h = s->avctx->height;
+#if FF_API_CODED_FRAME
+ ret = av_frame_make_writable(s->current_picture);
+ if (ret < 0)
+ return ret;
+#endif
+
s->mpvencdsp.draw_edges(s->current_picture->data[0],
s->current_picture->linesize[0], w , h ,
EDGE_WIDTH , EDGE_WIDTH , EDGE_TOP | EDGE_BOTTOM);
@@ -1646,7 +1658,6 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
ff_snow_frame_start(s);
#if FF_API_CODED_FRAME
FF_DISABLE_DEPRECATION_WARNINGS
- av_frame_unref(avctx->coded_frame);
ret = av_frame_ref(avctx->coded_frame, s->current_picture);
FF_ENABLE_DEPRECATION_WARNINGS
#endif