avformat/utils: Inject global side data into first packet.
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 13 Apr 2014 15:57:43 +0000 (17:57 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 13 Apr 2014 16:02:05 +0000 (18:02 +0200)
This fixes replaygain handling in ffplay and probably other applications.

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavformat/avformat.h
libavformat/utils.c

index 4181e36..ebebb3f 100644 (file)
@@ -1040,6 +1040,11 @@ typedef struct AVStream {
     uint8_t dts_ordered;
     uint8_t dts_misordered;
 
+    /**
+     * Internal data to inject global side data
+     */
+    int global_side_data_injected;
+
 } AVStream;
 
 AVRational av_stream_get_r_frame_rate(const AVStream *s);
index 25736f9..685a5fe 100644 (file)
@@ -1526,6 +1526,25 @@ static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
             }
             st->skip_samples = 0;
         }
+
+        if (!st->global_side_data_injected) {
+            for (i = 0; i < st->nb_side_data; i++) {
+                AVPacketSideData *src_sd = &st->side_data[i];
+                uint8_t *dst_data;
+
+                if (av_packet_get_side_data(pkt, src_sd->type, NULL))
+                    continue;
+
+                dst_data = av_packet_new_side_data(pkt, src_sd->type, src_sd->size);
+                if (!dst_data) {
+                    av_log(s, AV_LOG_WARNING, "Couldnt inject global side data\n");
+                    continue;
+                }
+
+                memcpy(dst_data, src_sd->data, src_sd->size);
+            }
+            st->global_side_data_injected = 1;
+        }
     }
 
     if (ret >= 0 && !(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))