[FFmpeg-devel] [PATCHv4 3/7] ogg: allow streams to update metadata
Ben Boeckel
mathstuf at gmail.com
Mon Nov 18 02:36:27 CET 2013
Signed-off-by: Ben Boeckel <mathstuf at gmail.com>
---
libavformat/oggdec.c | 26 +++++++++++++++++++++-----
libavformat/oggdec.h | 2 ++
2 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
index a099eb3..da76d2f 100644
--- a/libavformat/oggdec.c
+++ b/libavformat/oggdec.c
@@ -77,6 +77,8 @@ static int ogg_save(AVFormatContext *s)
struct ogg_stream *os = ogg->streams + i;
os->buf = av_mallocz(os->bufsize + FF_INPUT_BUFFER_PADDING_SIZE);
memcpy(os->buf, ost->streams[i].buf, os->bufpos);
+ os->new_metadata = NULL;
+ os->new_metadata_size = 0;
}
ogg->state = ost;
@@ -142,6 +144,8 @@ static int ogg_reset(AVFormatContext *s)
if (start_pos <= s->data_offset) {
os->lastpts = 0;
}
+ av_freep(&os->new_metadata);
+ os->new_metadata_size = 0;
}
ogg->page_pos = -1;
@@ -243,11 +247,13 @@ static int ogg_new_stream(AVFormatContext *s, uint32_t serial)
ogg->streams = os;
os = ogg->streams + idx;
memset(os, 0, sizeof(*os));
- os->serial = serial;
- os->bufsize = DECODER_BUFFER_SIZE;
- os->buf = av_malloc(os->bufsize + FF_INPUT_BUFFER_PADDING_SIZE);
- os->header = -1;
- os->start_granule = OGG_NOGRANULE_VALUE;
+ os->serial = serial;
+ os->bufsize = DECODER_BUFFER_SIZE;
+ os->buf = av_malloc(os->bufsize + FF_INPUT_BUFFER_PADDING_SIZE);
+ os->header = -1;
+ os->start_granule = OGG_NOGRANULE_VALUE;
+ os->new_metadata = NULL;
+ os->new_metadata_size = 0;
if (!os->buf)
return AVERROR(ENOMEM);
@@ -639,6 +645,7 @@ static int ogg_read_close(AVFormatContext *s)
ogg->streams[i].codec->cleanup(s, i);
}
av_freep(&ogg->streams[i].private);
+ av_freep(&ogg->streams[i].new_metadata);
}
av_freep(&ogg->streams);
return 0;
@@ -786,6 +793,15 @@ retry:
AV_WL32(side_data + 4, os->end_trimming);
}
+ if (os->new_metadata) {
+ uint8_t *side_data = av_packet_new_side_data(pkt,
+ AV_PKT_DATA_METADATA_UPDATE,
+ os->new_metadata_size);
+ memcpy(side_data, os->new_metadata, os->new_metadata_size);
+ av_freep(&os->new_metadata);
+ os->new_metadata_size = 0;
+ }
+
return psize;
}
diff --git a/libavformat/oggdec.h b/libavformat/oggdec.h
index c31859f..cad1950 100644
--- a/libavformat/oggdec.h
+++ b/libavformat/oggdec.h
@@ -85,6 +85,8 @@ struct ogg_stream {
int got_data; ///< 1 if the stream got some data (non-initial packets), 0 otherwise
int nb_header; ///< set to the number of parsed headers
int end_trimming; ///< set the number of packets to drop from the end
+ uint8_t *new_metadata;
+ unsigned int new_metadata_size;
void *private;
};
--
1.8.4.2
More information about the ffmpeg-devel
mailing list