OSDN Git Service

avpacket: do not copy data when buf ref is available.
authorClément Bœsch <ubitux@gmail.com>
Tue, 12 Mar 2013 07:13:21 +0000 (08:13 +0100)
committerClément Bœsch <ubitux@gmail.com>
Wed, 13 Mar 2013 00:30:20 +0000 (01:30 +0100)
This at least fixes issues with lavf/subtitles. The behaviour of
av_dup_packet() is unchanged, only av_copy_packet() is affected.

libavcodec/avpacket.c

index 16496e2..651036e 100644 (file)
@@ -184,7 +184,15 @@ static int copy_packet_data(AVPacket *pkt, AVPacket *src)
 {
     pkt->data      = NULL;
     pkt->side_data = NULL;
-    DUP_DATA(pkt->data, src->data, pkt->size, 1, ALLOC_BUF);
+    if (pkt->buf) {
+        AVBufferRef *ref = av_buffer_ref(src->buf);
+        if (!ref)
+            return AVERROR(ENOMEM);
+        pkt->buf  = ref;
+        pkt->data = ref->data;
+    } else {
+        DUP_DATA(pkt->data, src->data, pkt->size, 1, ALLOC_BUF);
+    }
 #if FF_API_DESTRUCT_PACKET
     pkt->destruct = dummy_destruct_packet;
 #endif
@@ -228,7 +236,6 @@ int av_dup_packet(AVPacket *pkt)
 int av_copy_packet(AVPacket *dst, AVPacket *src)
 {
     *dst = *src;
-    dst->buf = av_buffer_ref(src->buf);
     return copy_packet_data(dst, src);
 }