[FFmpeg-cvslog] avcodec/bsf: make sure the AVBSFInternal stored packet is reference counted

James Almer git at videolan.org
Sat Mar 24 03:11:54 EET 2018

ffmpeg | branch: master | James Almer <jamrial at gmail.com> | Fri Mar 23 18:16:11 2018 -0300| [ed1f08bfb5500340463e630290360609a90d2886] | committer: James Almer

avcodec/bsf: make sure the AVBSFInternal stored packet is reference counted

Some bitstream filters may buffer said packet in their own contexts
for latter use. The documentation for av_bsf_send_packet() doesn't
forbid feeding it non-reference counted packets, which depending on
the way said packets were internally buffered by the bsf it may
result in the data described in them becoming invalid or unavailable
at any time.
This was the case with vp9_superframe after commit e1bc3f4396, which
was then promptly fixed in 37f4a093f7 and 7a02b364b6. It is still the
case even today with vp9_reorder_raw.

With this change the bitstream filters will not have to worry how to
store or consume the packets fed to them.

Reviewed-by: wm4 <nfxjfg at googlemail.com>
Signed-off-by: James Almer <jamrial at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ed1f08bfb5500340463e630290360609a90d2886

 libavcodec/bsf.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/libavcodec/bsf.c b/libavcodec/bsf.c
index 38b423101c..05a44e2e31 100644
--- a/libavcodec/bsf.c
+++ b/libavcodec/bsf.c
@@ -188,7 +188,15 @@ int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt)
         return AVERROR(EAGAIN);
-    av_packet_move_ref(ctx->internal->buffer_pkt, pkt);
+    if (pkt->buf) {
+        av_packet_move_ref(ctx->internal->buffer_pkt, pkt);
+    } else {
+        int ret = av_packet_ref(ctx->internal->buffer_pkt, pkt);
+        if (ret < 0)
+            return ret;
+        av_packet_unref(pkt);
+    }
     return 0;

More information about the ffmpeg-cvslog mailing list