diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-04-13 17:57:43 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-04-13 18:02:05 +0200 |
commit | 289f02f923ace4540829c8ee2ca729bf7680fd23 (patch) | |
tree | 9bbe87b2ee692ce3bccdfa6f0e2a72b1febdd1fd | |
parent | a31547ce2e5c46d7a7005fe70dcf9b3a7c5fc4ac (diff) | |
download | ffmpeg-289f02f923ace4540829c8ee2ca729bf7680fd23.tar.gz |
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@gmx.at>
-rw-r--r-- | libavformat/avformat.h | 5 | ||||
-rw-r--r-- | libavformat/utils.c | 19 |
2 files changed, 24 insertions, 0 deletions
diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 4181e36465..ebebb3fb6e 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 25736f9ab4..685a5fe752 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)) |