[FFmpeg-devel] [PATCH] Use custom option to specify WebVTT kind
Timothy Gu
timothygu99 at gmail.com
Wed Jun 12 21:06:32 CEST 2013
On Mon, Jun 10, 2013 at 3:06 PM, Matthew Heaney
<matthewjheaney at google.com> wrote:
> 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 custom input option, "-kind", has been added to the WebVTT
nit: "custom" -> "private" (subject too).
> 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.
> ---
> libavformat/avformat.h | 8 ++++++++
> libavformat/webvttdec.c | 33 +++++++++++++++++++++++++++++++++
> 2 files changed, 41 insertions(+)
>
> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> index 1d7ba45..a217420 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -636,6 +636,14 @@ typedef struct AVIndexEntry {
> #define AV_DISPOSITION_ATTACHED_PIC 0x0400
>
> /**
> + * To specify the WebVTT kind.
> + */
> +#define AV_DISPOSITION_SUBTITLES 0x1000
> +#define AV_DISPOSITION_CAPTIONS 0x2000
> +#define AV_DISPOSITION_DESCRIPTIONS 0x4000
> +#define AV_DISPOSITION_METADATA 0x8000
> +
> +/**
> * Options for behavior on timestamp wrap detection.
> */
> #define AV_PTS_WRAP_IGNORE 0 ///< ignore the wrap
> diff --git a/libavformat/webvttdec.c b/libavformat/webvttdec.c
> index 7d9910b..9843b82 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;
> + char* kind;
> } WebVTTContext;
>
> static int webvtt_probe(AVProbeData *p)
> @@ -67,6 +70,18 @@ static int webvtt_read_header(AVFormatContext *s)
> st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
> st->codec->codec_id = AV_CODEC_ID_WEBVTT;
>
> + if (!av_strcasecmp(webvtt->kind, "subtitles")) {
> + st->disposition = AV_DISPOSITION_SUBTITLES;
> + } else if (!av_strcasecmp(webvtt->kind, "captions")) {
> + st->disposition = AV_DISPOSITION_CAPTIONS;
> + } else if (!av_strcasecmp(webvtt->kind, "descriptions")) {
> + st->disposition = AV_DISPOSITION_DESCRIPTIONS;
> + } else if (!av_strcasecmp(webvtt->kind, "metadata")) {
> + st->disposition = AV_DISPOSITION_METADATA;
> + } else {
> + return AVERROR(EINVAL);
> + }
> +
> av_bprint_init(&header, 0, AV_BPRINT_SIZE_UNLIMITED);
> av_bprint_init(&cue, 0, AV_BPRINT_SIZE_UNLIMITED);
>
> @@ -186,6 +201,23 @@ 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_STRING, { .str = "subtitles" },
> + 0, 0, KIND_FLAGS, NULL },
> + { 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 +228,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
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
More information about the ffmpeg-devel
mailing list