[FFmpeg-devel] [PATCH] WebVTT demuxer - save cue id and settings as side data
Matthew Heaney
matthewjheaney at google.com
Thu May 30 19:51:57 CEST 2013
Oh, I was just trying to conserve flag bits. If there's budget for
WEBVTT flags, then no problem to use separate side data items for id
and settings.
I'll push up a revised patch this afternoon (PST).
Thanks,
Matt
On Thu, May 30, 2013 at 3:47 AM, Clément Bœsch <ubitux at gmail.com> wrote:
> On Wed, May 29, 2013 at 04:26:13PM -0700, Matthew Heaney wrote:
>> Currently the WebVTT demuxer parses the cues but throws away
>> the cue id (the optional first line of the cue) and cue
>> settings (the optional rendering instructions that follow
>> the timestamp).
>>
>> However, in order to write inband text tracks (to WebM
>> files), the entire cue payload from the WebVTT source must
>> be preserved.
>>
>> This change makes no change to the data part of the output
>> buffer packet (where the actual cue text is stored), but
>> does add the cue id and settings as a single new side data
>> item. Existing code that cares only about the data part of
>> the packet can continue to ignore the side data.
>> ---
>> libavformat/webvttdec.c | 32 ++++++++++++++++++++++----------
>> 1 file changed, 22 insertions(+), 10 deletions(-)
>>
>> diff --git a/libavformat/webvttdec.c b/libavformat/webvttdec.c
>> index 694a020..a169d11 100644
>> --- a/libavformat/webvttdec.c
>> +++ b/libavformat/webvttdec.c
>> @@ -74,8 +74,9 @@ static int webvtt_read_header(AVFormatContext *s)
>> int i;
>> int64_t pos;
>> AVPacket *sub;
>> - const char *p, *identifier;
>> - //const char *settings = NULL;
>> + const char *p, *identifier, *settings;
>> + int len, identifier_len, settings_len;
>> + uint8_t* buf;
>> int64_t ts_start, ts_end;
>>
>> ff_subtitles_read_chunk(s->pb, &cue);
>> @@ -92,15 +93,15 @@ static int webvtt_read_header(AVFormatContext *s)
>> continue;
>>
>> /* optional cue identifier (can be a number like in SRT or some kind of
>> - * chaptering id), silently skip it */
>> + * chaptering id) */
>> for (i = 0; p[i] && p[i] != '\n'; i++) {
>> if (!strncmp(p + i, "-->", 3)) {
>> identifier = NULL;
>> break;
>> }
>> }
>> - if (identifier)
>> - p += strcspn(p, "\n");
>> + identifier_len = identifier ? strcspn(p, "\n") : 0;
>> + p += identifier_len;
>>
>> /* cue timestamps */
>> if ((ts_start = read_ts(p)) == AV_NOPTS_VALUE)
>> @@ -112,16 +113,18 @@ static int webvtt_read_header(AVFormatContext *s)
>> if ((ts_end = read_ts(p)) == AV_NOPTS_VALUE)
>> break;
>>
>> - /* optional cue settings, TODO: store in side_data */
>> + /* optional cue settings */
>> p += strcspn(p, "\n\t ");
>> while (*p == '\t' || *p == ' ')
>> p++;
>> + settings = p;
>> + settings_len = strcspn(p, "\n");
>> + p += settings_len;
>> if (*p != '\n') {
>> - //settings = p;
>> - p += strcspn(p, "\n");
>> + av_log(s, AV_LOG_ERROR, "Bad WebVTT cue.\n");
>> + return AVERROR(EINVAL);
>> }
>> - if (*p == '\n')
>> - p++;
>> + p++;
>>
>> /* create packet */
>> sub = ff_subtitles_queue_insert(&webvtt->q, p, strlen(p), 0);
>> @@ -132,6 +135,15 @@ static int webvtt_read_header(AVFormatContext *s)
>> sub->pos = pos;
>> sub->pts = ts_start;
>> sub->duration = ts_end - ts_start;
>> +
>> + len = identifier_len + 1 + settings_len + 1;
>> + buf = av_packet_new_side_data(sub, AV_PKT_DATA_NEW_EXTRADATA, len);
>> + memcpy(buf, identifier, identifier_len);
>> + buf += identifier_len;
>> + *buf++ = '\n';
>> + memcpy(buf, settings, settings_len);
>> + buf += settings_len;
>> + *buf++ = '\n';
>
> Exploiting this might be troublesome: won't you need to split this buffer
> again in the webm muxer (and any potential other muxer such as... webvtt)?
>
> While that may sound overkill, I believe the correct solution is to
> introduce AV_PKT_DATA_WEBVTT_{IDENTIFIER,SETTINGS} side data types.
>
> Those '\n' are likely unwanted too, BTW (of course the middle one looks
> necessary for splitting).
>
> --
> Clément B.
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
More information about the ffmpeg-devel
mailing list