@@ -60,7 +60,7 @@ static int64_t read_ts(const char *s)
static int webvtt_read_header(AVFormatContext *s)
{
WebVTTContext *webvtt = s->priv_data;
- AVBPrint cue;
+ AVBPrint cue, header;
int res = 0;
AVStream *st = avformat_new_stream(s, NULL);
@@ -72,6 +72,7 @@ static int webvtt_read_header(AVFormatContext *s)
st->disposition |= webvtt->kind;
av_bprint_init(&cue, 0, AV_BPRINT_SIZE_UNLIMITED);
+ av_bprint_init(&header, 0, AV_BPRINT_SIZE_UNLIMITED);
for (;;) {
int i;
@@ -89,12 +90,18 @@ static int webvtt_read_header(AVFormatContext *s)
p = identifier = cue.str;
pos = avio_tell(s->pb);
- /* ignore header chunk */
+ /* ignore the magic word and any comments */
if (!strncmp(p, "\xEF\xBB\xBFWEBVTT", 9) ||
!strncmp(p, "WEBVTT", 6) ||
!strncmp(p, "NOTE", 4))
continue;
+ /* store the style and region blocks from the header */
+ if (!strncmp(p, "STYLE", 5) || !strncmp(p, "REGION", 6)) {
+ av_bprintf(&header, "%s%s", header.len ? "\n\n" : "", p);
+ continue;
+ }
+
/* optional cue identifier (can be a number like in SRT or some kind of
* chaptering id) */
for (i = 0; p[i] && p[i] != '\n' && p[i] != '\r'; i++) {
@@ -161,12 +168,17 @@ static int webvtt_read_header(AVFormatContext *s)
SET_SIDE_DATA(settings, AV_PKT_DATA_WEBVTT_SETTINGS);
}
+ res = ff_bprint_to_codecpar_extradata(st->codecpar, &header);
+ if (res < 0)
+ goto end;
+
ff_subtitles_queue_finalize(s, &webvtt->q);
end:
if (res < 0)
ff_subtitles_queue_clean(&webvtt->q);
av_bprint_finalize(&cue, NULL);
+ av_bprint_finalize(&header, NULL);
return res;
}
@@ -58,6 +58,18 @@ static int webvtt_write_header(AVFormatContext *ctx)
avio_printf(pb, "WEBVTT\n");
+ if (par->extradata_size > 0) {
+ size_t header_size = par->extradata_size;
+
+ if (par->extradata[0] != '\n')
+ avio_printf(pb, "\n");
+
+ avio_write(pb, par->extradata, header_size);
+
+ if (par->extradata[header_size - 1] != '\n')
+ avio_printf(pb, "\n");
+ }
+
return 0;
}
@@ -91,6 +91,9 @@ fate-sub-webvtt: CMD = fmtstdout ass -i $(TARGET_SAMPLES)/sub/WebVTT_capability_
FATE_SUBTITLES_ASS-$(call DEMDEC, WEBVTT, WEBVTT) += fate-sub-webvtt2
fate-sub-webvtt2: CMD = fmtstdout ass -i $(TARGET_SAMPLES)/sub/WebVTT_extended_tester.vtt
+FATE_SUBTITLES-$(call ALLYES, WEBVTT_DEMUXER, WEBVTT_MUXER) += fate-sub-webvtt-styleandregions
+fate-sub-webvtt-styleandregions: CMD = fmtstdout webvtt -i $(TARGET_SAMPLES)/sub/webvtt_style_and_regions.vtt -c:s copy
+
FATE_SUBTITLES-$(call ALLYES, SRT_DEMUXER SUBRIP_DECODER WEBVTT_ENCODER WEBVTT_MUXER) += fate-sub-webvttenc
fate-sub-webvttenc: CMD = fmtstdout webvtt -i $(TARGET_SAMPLES)/sub/SubRip_capability_tester.srt
new file mode 100644
@@ -0,0 +1,51 @@
+WEBVTT
+
+REGION
+id:son
+width:40%
+lines:3
+regionanchor:20%,80%
+viewportanchor:20%,80%
+scroll:up
+
+REGION
+id:father
+width:40%
+lines:3
+regionanchor:80%,80%
+viewportanchor:80%,80%
+scroll:up
+
+STYLE
+::cue(i) {
+ /* make i tags italic */
+ font-style: italic
+}
+
+STYLE
+::cue(v[voice="Son"]) {
+ color: magenta
+}
+
+STYLE
+::cue(v[voice="Father"]) {
+ color: yellow
+}
+
+00:10.000 --> 00:25.000 region:son align:left
+<v Son>Can I tell you a joke, Dad?
+
+00:12.500 --> 00:27.500 region:father align:right
+<v Father>Sure, I could do with a laugh.
+
+00:15.000 --> 00:30.000 region:son align:left
+<v Son>Where do sheep go to get their hair cut?
+
+00:17.500 --> 00:32.500 region:father align:right
+<v Father>I don't know, son. Where do sheep go to get their hair cut?
+
+00:20.000 --> 00:35.000 region:son align:left
+<v Son>To the baa-baa shop!
+
+00:22.500 --> 00:37.500 region:father align:right
+<v Father><i>[facepalms]</i>