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

Matthew Heaney matthewjheaney at google.com
Tue Jun 18 00:23:36 CEST 2013


rebase + ping


On Mon, Jun 17, 2013 at 3:20 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 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 | 57
> +++++++++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 68 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..2335ca4 100644
> --- a/libavformat/webvttdec.c
> +++ b/libavformat/webvttdec.c
> @@ -29,9 +29,21 @@
>  #include "subtitles.h"
>  #include "libavutil/bprint.h"
>  #include "libavutil/intreadwrite.h"
> +#include "libavutil/opt.h"
> +
> +enum WebVTTKind {
> +    WEBVTT_KIND_FIRST = 0,
> +    WEBVTT_KIND_SUBTITLES = WEBVTT_KIND_FIRST,
> +    WEBVTT_KIND_CAPTIONS,
> +    WEBVTT_KIND_DESCRIPTIONS,
> +    WEBVTT_KIND_METADATA,
> +    WEBVTT_KIND_LAST = WEBVTT_KIND_METADATA
> +};
>
>  typedef struct {
> +    const AVClass *class;
>      FFDemuxSubtitlesQueue q;
> +    enum WebVTTKind kind;
>  } WebVTTContext;
>
>  static int webvtt_probe(AVProbeData *p)
> @@ -67,6 +79,21 @@ static int webvtt_read_header(AVFormatContext *s)
>      st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
>      st->codec->codec_id   = AV_CODEC_ID_WEBVTT;
>
> +    switch (webvtt->kind) {
> +    case WEBVTT_KIND_CAPTIONS:
> +      st->disposition |= AV_DISPOSITION_CAPTIONS;
> +      break;
> +    case WEBVTT_KIND_DESCRIPTIONS:
> +      st->disposition |= AV_DISPOSITION_DESCRIPTIONS;
> +      break;
> +    case WEBVTT_KIND_METADATA:
> +      st->disposition |= AV_DISPOSITION_METADATA;
> +      break;
> +    case WEBVTT_KIND_SUBTITLES:
> +    default:
> +        break;
> +    };
> +
>      av_bprint_init(&header, 0, AV_BPRINT_SIZE_UNLIMITED);
>      av_bprint_init(&cue,    0, AV_BPRINT_SIZE_UNLIMITED);
>
> @@ -186,6 +213,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 = WEBVTT_KIND_SUBTITLES },
> +      WEBVTT_KIND_FIRST, WEBVTT_KIND_LAST, KIND_FLAGS, "WEBVTT_KIND" },
> +    { "subtitles", "WebVTT subtitles kind",
> +      0, AV_OPT_TYPE_CONST, { .i64 = WEBVTT_KIND_SUBTITLES },
> +      INT_MIN, INT_MAX, 0, "WEBVTT_KIND" },
> +    { "captions", "WebVTT captions kind",
> +      0, AV_OPT_TYPE_CONST, { .i64 = WEBVTT_KIND_CAPTIONS },
> +      INT_MIN, INT_MAX, 0, "WEBVTT_KIND" },
> +    { "descriptions", "WebVTT descriptions kind",
> +      0, AV_OPT_TYPE_CONST, { .i64 = WEBVTT_KIND_DESCRIPTIONS },
> +      INT_MIN, INT_MAX, 0, "WEBVTT_KIND" },
> +    { "metadata", "WebVTT metadata kind",
> +      0, AV_OPT_TYPE_CONST, { .i64 = WEBVTT_KIND_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 +252,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