diff mbox

[FFmpeg-devel] avcodec/vp9_raw_reorder: cache input packets using new references

Message ID 20180322030518.1060-1-jamrial@gmail.com
State Withdrawn
Headers show

Commit Message

James Almer March 22, 2018, 3:05 a.m. UTC
Input packets may not be ref counted, meaning the data described in them
may be gone at any time.

Fixes segfaults related to the above.

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavcodec/vp9_raw_reorder_bsf.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

Comments

James Almer March 24, 2018, 2:56 a.m. UTC | #1
On 3/22/2018 12:05 AM, James Almer wrote:
> Input packets may not be ref counted, meaning the data described in them
> may be gone at any time.
> 
> Fixes segfaults related to the above.

Dropping this patch. Packets are now guaranteed to be ref counted, so
there's no point for the extra alloc this patch introduces anymore.

> 
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
>  libavcodec/vp9_raw_reorder_bsf.c | 15 +++++++++++++--
>  1 file changed, 13 insertions(+), 2 deletions(-)
diff mbox

Patch

diff --git a/libavcodec/vp9_raw_reorder_bsf.c b/libavcodec/vp9_raw_reorder_bsf.c
index 01f3dad898..9c37e9891d 100644
--- a/libavcodec/vp9_raw_reorder_bsf.c
+++ b/libavcodec/vp9_raw_reorder_bsf.c
@@ -278,7 +278,7 @@  static int vp9_raw_reorder_filter(AVBSFContext *bsf, AVPacket *out)
 {
     VP9RawReorderContext *ctx = bsf->priv_data;
     VP9RawReorderFrame *frame;
-    AVPacket *in;
+    AVPacket *in = NULL;
     int err, s;
 
     if (ctx->next_frame) {
@@ -305,7 +305,12 @@  static int vp9_raw_reorder_filter(AVBSFContext *bsf, AVPacket *out)
             return AVERROR(ENOMEM);
         }
 
-        frame->packet   = in;
+        frame->packet = av_packet_clone(in);
+        if (!frame->packet) {
+            err = AVERROR(ENOMEM);
+            goto fail;
+        }
+
         frame->pts      = in->pts;
         frame->sequence = ++ctx->sequence;
         err = vp9_raw_reorder_frame_parse(bsf, frame);
@@ -348,8 +353,10 @@  static int vp9_raw_reorder_filter(AVBSFContext *bsf, AVPacket *out)
                 // Clear the slot anyway, so we don't end up
                 // in an infinite loop.
                 vp9_raw_reorder_clear_slot(ctx, s);
+                av_packet_free(&in);
                 return AVERROR_INVALIDDATA;
             }
+            av_packet_free(&in);
             return 0;
         }
         vp9_raw_reorder_clear_slot(ctx, s);
@@ -368,20 +375,24 @@  static int vp9_raw_reorder_filter(AVBSFContext *bsf, AVPacket *out)
             av_log(bsf, AV_LOG_ERROR, "Failed to create output "
                    "for transient frame.\n");
             ctx->next_frame = NULL;
+            av_packet_free(&in);
             return AVERROR_INVALIDDATA;
         }
         if (!frame->needs_display) {
             vp9_raw_reorder_frame_free(&frame);
             ctx->next_frame = NULL;
         }
+        av_packet_free(&in);
         return 0;
     }
 
     ctx->next_frame = NULL;
+    av_packet_free(&in);
     return AVERROR(EAGAIN);
 
 fail:
     vp9_raw_reorder_frame_free(&frame);
+    av_packet_free(&in);
     return err;
 }