[FFmpeg-cvslog] avformat/utils: Inject global side data into first packet.
Michael Niedermayer
git at videolan.org
Sun Apr 13 18:13:32 CEST 2014
ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Sun Apr 13 17:57:43 2014 +0200| [289f02f923ace4540829c8ee2ca729bf7680fd23] | committer: Michael Niedermayer
avformat/utils: Inject global side data into first packet.
This fixes replaygain handling in ffplay and probably other applications.
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=289f02f923ace4540829c8ee2ca729bf7680fd23
---
libavformat/avformat.h | 5 +++++
libavformat/utils.c | 19 +++++++++++++++++++
2 files changed, 24 insertions(+)
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 4181e36..ebebb3f 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -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);
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 25736f9..685a5fe 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -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))
More information about the ffmpeg-cvslog
mailing list