[FFmpeg-devel] [PATCH] Use private option to specify WebVTT kind

Matthew Heaney matthewjheaney at google.com
Tue Jun 18 01:12:56 CEST 2013


WebVTT subtitle tracks have four kinds. Certain downstream muxers
(such as for WebM) need to know which WebVTT kind this is, in order to
specify the codec id of the output track.

A new private input option, "-kind", has been added to the WebVTT
demuxer.  It accepts as a value any of "subtitles" (the default),
"captions", "descriptions", and "metadata".  The kind option value is
used to assign a value to the stream disposition flag, to which four
new values have been added, corresponding the four WebVTT kinds.
---
 doc/APIchanges          |  3 +++
 libavformat/avformat.h  |  7 +++++++
 libavformat/version.h   |  2 +-
 libavformat/webvttdec.c | 34 ++++++++++++++++++++++++++++++++++
 4 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index ffdb8a2..8fe1883 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -16,6 +16,9 @@ libavutil:     2012-10-22
 API changes, most recent first:
 
 
+2013-06-xx - xxxxxxx - lavf 55.10.100 - avformat.h
+  Add AV_DISPOSITION_* flags to indicate text track kind.
+
 2013-06-xx - xxxxxxx - lavu 52.36.100
   Add AVRIPEMD:
    av_ripemd_alloc()
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 1d7ba45..bd911ec 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -636,6 +636,13 @@ typedef struct AVIndexEntry {
 #define AV_DISPOSITION_ATTACHED_PIC      0x0400
 
 /**
+ * To specify text track kind (different from subtitles default).
+ */
+#define AV_DISPOSITION_CAPTIONS     0x10000
+#define AV_DISPOSITION_DESCRIPTIONS 0x20000
+#define AV_DISPOSITION_METADATA     0x40000
+
+/**
  * Options for behavior on timestamp wrap detection.
  */
 #define AV_PTS_WRAP_IGNORE      0   ///< ignore the wrap
diff --git a/libavformat/version.h b/libavformat/version.h
index b2221d2..45932d4 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -30,7 +30,7 @@
 #include "libavutil/avutil.h"
 
 #define LIBAVFORMAT_VERSION_MAJOR 55
-#define LIBAVFORMAT_VERSION_MINOR  9
+#define LIBAVFORMAT_VERSION_MINOR 10
 #define LIBAVFORMAT_VERSION_MICRO 100
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
diff --git a/libavformat/webvttdec.c b/libavformat/webvttdec.c
index 7d9910b..cae5243 100644
--- a/libavformat/webvttdec.c
+++ b/libavformat/webvttdec.c
@@ -29,9 +29,12 @@
 #include "subtitles.h"
 #include "libavutil/bprint.h"
 #include "libavutil/intreadwrite.h"
+#include "libavutil/opt.h"
 
 typedef struct {
+    const AVClass *class;
     FFDemuxSubtitlesQueue q;
+    int64_t kind;
 } WebVTTContext;
 
 static int webvtt_probe(AVProbeData *p)
@@ -66,6 +69,7 @@ static int webvtt_read_header(AVFormatContext *s)
     avpriv_set_pts_info(st, 64, 1, 1000);
     st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
     st->codec->codec_id   = AV_CODEC_ID_WEBVTT;
+    st->disposition |= webvtt->kind;
 
     av_bprint_init(&header, 0, AV_BPRINT_SIZE_UNLIMITED);
     av_bprint_init(&cue,    0, AV_BPRINT_SIZE_UNLIMITED);
@@ -186,6 +190,35 @@ static int webvtt_read_close(AVFormatContext *s)
     return 0;
 }
 
+#define OFFSET(x) offsetof(WebVTTContext, x)
+#define KIND_FLAGS AV_OPT_FLAG_SUBTITLE_PARAM
+
+static const AVOption options[] = {
+    { "kind", "Kind of WebVTT track",
+      OFFSET(kind), AV_OPT_TYPE_INT, { .i64 = 0 },
+      0, INT_MAX, KIND_FLAGS, "WEBVTT_KIND" },
+    { "subtitles", "WebVTT subtitles kind",
+      0, AV_OPT_TYPE_CONST, { .i64 = 0 },
+      INT_MIN, INT_MAX, 0, "WEBVTT_KIND" },
+    { "captions", "WebVTT captions kind",
+      0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_CAPTIONS },
+      INT_MIN, INT_MAX, 0, "WEBVTT_KIND" },
+    { "descriptions", "WebVTT descriptions kind",
+      0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DESCRIPTIONS },
+      INT_MIN, INT_MAX, 0, "WEBVTT_KIND" },
+    { "metadata", "WebVTT metadata kind",
+      0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_METADATA },
+      INT_MIN, INT_MAX, 0, "WEBVTT_KIND" },
+    { NULL }
+};
+
+static const AVClass webvtt_demuxer_class = {
+    .class_name  = "WebVTT demuxer",
+    .item_name   = av_default_item_name,
+    .option      = options,
+    .version     = LIBAVUTIL_VERSION_INT,
+};
+
 AVInputFormat ff_webvtt_demuxer = {
     .name           = "webvtt",
     .long_name      = NULL_IF_CONFIG_SMALL("WebVTT subtitle"),
@@ -196,4 +229,5 @@ AVInputFormat ff_webvtt_demuxer = {
     .read_seek2     = webvtt_read_seek,
     .read_close     = webvtt_read_close,
     .extensions     = "vtt",
+    .priv_class     = &webvtt_demuxer_class,
 };
-- 
1.8.3



More information about the ffmpeg-devel mailing list