[FFmpeg-devel] [PATCH v2 2/2] avformat/{isom, movenc}: add kind box compatibility mode for Unified Origin
"zhilizhao(赵志立)"
quinkblack at foxmail.com
Wed Sep 1 11:45:58 EEST 2021
> On Aug 30, 2021, at 7:14 PM, Jan Ekström <jeebjp at gmail.com> wrote:
>
> From: Jan Ekström <jan.ekstrom at 24i.com>
>
> Unfortunately the current production versions of this software
> do not 100% adhere to the CMAF specification, and have decided
> to utilize the HTML5 media track identifier for audio descriptions.
>
> This way the default mode of operation is according to the CMAF
> specification, but it is also possible to output streams with which
> this piece of software is capable of interoperating with.
>
> Signed-off-by: Jan Ekström <jan.ekstrom at 24i.com>
> ---
> libavformat/isom.c | 23 ++++--
> libavformat/isom.h | 6 ++
> libavformat/movenc.c | 12 ++-
> libavformat/movenc.h | 2 +
> tests/fate/mov.mak | 8 ++
> ...p4-disposition-unified-origin-mpegts-remux | 81 +++++++++++++++++++
> 6 files changed, 124 insertions(+), 8 deletions(-)
> create mode 100644 tests/ref/fate/mov-mp4-disposition-unified-origin-mpegts-remux
>
> diff --git a/libavformat/isom.c b/libavformat/isom.c
> index 300ba927c2..fb8ad3d824 100644
> --- a/libavformat/isom.c
> +++ b/libavformat/isom.c
> @@ -433,19 +433,32 @@ void ff_mov_write_chan(AVIOContext *pb, int64_t channel_layout)
>
> static const struct MP4TrackKindValueMapping dash_role_map[] = {
> { AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_CAPTIONS,
> - "caption" },
> + "caption",
> + KindWritingModeCMAF|KindWritingModeUnifiedOrigin },
> { AV_DISPOSITION_COMMENT,
> - "commentary" },
> + "commentary",
> + KindWritingModeCMAF|KindWritingModeUnifiedOrigin },
> { AV_DISPOSITION_VISUAL_IMPAIRED|AV_DISPOSITION_DESCRIPTIONS,
> - "description" },
> + "description",
> + KindWritingModeCMAF },
> { AV_DISPOSITION_DUB,
> - "dub" },
> + "dub",
> + KindWritingModeCMAF|KindWritingModeUnifiedOrigin },
> { AV_DISPOSITION_FORCED,
> - "forced-subtitle" },
> + "forced-subtitle",
> + KindWritingModeCMAF|KindWritingModeUnifiedOrigin },
> + { 0, NULL }
> +};
The patch set LGTM. Nit-picking, it’s hard to see `KindWritingModeCMAF|KindWritingModeUnifiedOrigin` is a bitwise or.
> +
> +static const struct MP4TrackKindValueMapping html_kind_map[] = {
> + { AV_DISPOSITION_VISUAL_IMPAIRED|AV_DISPOSITION_DESCRIPTIONS,
> + "main-desc",
> + KindWritingModeUnifiedOrigin },
> { 0, NULL }
> };
>
> const struct MP4TrackKindMapping ff_mov_track_kind_table[] = {
> { "urn:mpeg:dash:role:2011", dash_role_map },
> + { "about:html-kind", html_kind_map },
> { 0, NULL }
> };
> diff --git a/libavformat/isom.h b/libavformat/isom.h
> index c62fcf2bfe..1252fc6603 100644
> --- a/libavformat/isom.h
> +++ b/libavformat/isom.h
> @@ -390,9 +390,15 @@ static inline enum AVCodecID ff_mov_get_lpcm_codec_id(int bps, int flags)
> #define MOV_ISMV_TTML_TAG MKTAG('d', 'f', 'x', 'p')
> #define MOV_MP4_TTML_TAG MKTAG('s', 't', 'p', 'p')
>
> +enum MP4TrackKindWritingMode {
> + KindWritingModeCMAF = (1 << 0),
> + KindWritingModeUnifiedOrigin = (1 << 1),
> +};
> +
> struct MP4TrackKindValueMapping {
> int disposition;
> const char *value;
> + uint32_t writing_modes;
> };
>
> struct MP4TrackKindMapping {
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index 4070fc9ef7..baaae7d3ad 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -111,6 +111,9 @@ static const AVOption options[] = {
> { "pts", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = MOV_PRFT_SRC_PTS}, 0, 0, AV_OPT_FLAG_ENCODING_PARAM, "prft"},
> { "empty_hdlr_name", "write zero-length name string in hdlr atoms within mdia and minf atoms", offsetof(MOVMuxContext, empty_hdlr_name), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM},
> { "movie_timescale", "set movie timescale", offsetof(MOVMuxContext, movie_timescale), AV_OPT_TYPE_INT, {.i64 = MOV_TIMESCALE}, 1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
> + { "kind_writing_mode", "set kind box writing mode", offsetof(MOVMuxContext, kind_writing_mode), AV_OPT_TYPE_INT, {.i64 = KindWritingModeCMAF}, KindWritingModeCMAF, KindWritingModeUnifiedOrigin, AV_OPT_FLAG_ENCODING_PARAM, "kind_writing_mode"},
> + { "cmaf", "CMAF writing mode", 0, AV_OPT_TYPE_CONST, {.i64 = KindWritingModeCMAF}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "kind_writing_mode"},
> + { "unified_origin", "Compatibility mode for Unified Origin (all DASH except for audio description)", 0, AV_OPT_TYPE_CONST, {.i64 = KindWritingModeUnifiedOrigin}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "kind_writing_mode"},
> { NULL },
> };
>
> @@ -3355,7 +3358,8 @@ static int mov_write_track_kind(AVIOContext *pb, const char *scheme_uri,
> return update_size(pb, pos);
> }
>
> -static int mov_write_track_kinds(AVIOContext *pb, AVStream *st)
> +static int mov_write_track_kinds(AVIOContext *pb, AVStream *st,
> + enum MP4TrackKindWritingMode mode)
> {
> int ret = AVERROR_BUG;
>
> @@ -3364,7 +3368,8 @@ static int mov_write_track_kinds(AVIOContext *pb, AVStream *st)
>
> for (int j = 0; map.value_maps[j].disposition; j++) {
> const struct MP4TrackKindValueMapping value_map = map.value_maps[j];
> - if (!(st->disposition & value_map.disposition))
> + if (!(st->disposition & value_map.disposition) ||
> + !(value_map.writing_modes & mode))
> continue;
>
> if ((ret = mov_write_track_kind(pb, map.scheme_uri, value_map.value)) < 0)
> @@ -3393,7 +3398,8 @@ static int mov_write_track_udta_tag(AVIOContext *pb, MOVMuxContext *mov,
> mov_write_track_metadata(pb_buf, st, "name", "title");
>
> if (mov->mode & MODE_MP4) {
> - if ((ret = mov_write_track_kinds(pb_buf, st)) < 0)
> + if ((ret = mov_write_track_kinds(pb_buf, st,
> + mov->kind_writing_mode)) < 0)
> return ret;
> }
>
> diff --git a/libavformat/movenc.h b/libavformat/movenc.h
> index 40077b1afe..e02a086b1f 100644
> --- a/libavformat/movenc.h
> +++ b/libavformat/movenc.h
> @@ -25,6 +25,7 @@
> #define AVFORMAT_MOVENC_H
>
> #include "avformat.h"
> +#include "isom.h"
> #include "movenccenc.h"
> #include "libavcodec/packet_internal.h"
>
> @@ -242,6 +243,7 @@ typedef struct MOVMuxContext {
> MOVPrftBox write_prft;
> int empty_hdlr_name;
> int movie_timescale;
> + enum MP4TrackKindWritingMode kind_writing_mode;
> } MOVMuxContext;
>
> #define FF_MOV_FLAG_RTP_HINT (1 << 0)
> diff --git a/tests/fate/mov.mak b/tests/fate/mov.mak
> index 5ca992e181..20f085803b 100644
> --- a/tests/fate/mov.mak
> +++ b/tests/fate/mov.mak
> @@ -145,6 +145,14 @@ FATE_MOV_FFMPEG_FFPROBE-$(call ALLYES, FILE_PROTOCOL PIPE_PROTOCOL \
> += fate-mov-mp4-disposition-mpegts-remux
> fate-mov-mp4-disposition-mpegts-remux: CMD = transcode mpegts $(TARGET_SAMPLES)/mpegts/pmtchange.ts mp4 "-map 0:1 -map 0:2 -c copy -disposition:a:0 +hearing_impaired" "-map 0 -c copy" "" "-of json -show_entries stream_disposition:stream=index"
>
> +# Same as the previous test, but the audio disposition should now be tagged
> +# with the HTML5 media track identifier as opposed to the DASH identifier.
> +FATE_MOV_FFMPEG_FFPROBE-$(call ALLYES, FILE_PROTOCOL PIPE_PROTOCOL \
> + MPEGTS_DEMUXER MOV_DEMUXER AC3_DECODER \
> + MP4_MUXER FRAMECRC_MUXER ) \
> + += fate-mov-mp4-disposition-unified-origin-mpegts-remux
> +fate-mov-mp4-disposition-unified-origin-mpegts-remux: CMD = transcode mpegts $(TARGET_SAMPLES)/mpegts/pmtchange.ts mp4 "-map 0:1 -map 0:2 -c copy -disposition:a:0 +hearing_impaired -kind_writing_mode unified_origin" "-map 0 -c copy" "" "-of json -show_entries stream_disposition:stream=index"
> +
> FATE_SAMPLES_FFMPEG_FFPROBE += $(FATE_MOV_FFMPEG_FFPROBE-yes)
>
> fate-mov: $(FATE_MOV) $(FATE_MOV_FFPROBE) $(FATE_MOV_FASTSTART) $(FATE_MOV_FFMPEG_FFPROBE-yes)
> diff --git a/tests/ref/fate/mov-mp4-disposition-unified-origin-mpegts-remux b/tests/ref/fate/mov-mp4-disposition-unified-origin-mpegts-remux
> new file mode 100644
> index 0000000000..0242cffb9b
> --- /dev/null
> +++ b/tests/ref/fate/mov-mp4-disposition-unified-origin-mpegts-remux
> @@ -0,0 +1,81 @@
> +99f1d34f8028c674cb10d2604a7f0117 *tests/data/fate/mov-mp4-disposition-unified-origin-mpegts-remux.mp4
> +5695 tests/data/fate/mov-mp4-disposition-unified-origin-mpegts-remux.mp4
> +#tb 0: 1/48000
> +#media_type 0: audio
> +#codec_id 0: ac3
> +#sample_rate 0: 48000
> +#channel_layout 0: 3
> +#channel_layout_name 0: stereo
> +#tb 1: 1/48000
> +#media_type 1: audio
> +#codec_id 1: ac3
> +#sample_rate 1: 48000
> +#channel_layout 1: 3
> +#channel_layout_name 1: stereo
> +1, 0, 0, 1536, 768, 0xa63778d4, S=1, 4
> +1, 1536, 1536, 1536, 768, 0x7d577f3f
> +0, 3072, 3072, 1536, 768, 0xc2867884, S=1, 4
> +1, 3072, 3072, 1536, 768, 0xd86b7c8f
> +0, 4608, 4608, 1536, 690, 0xa2714bf3
> +1, 4608, 4608, 1536, 626, 0x09f4382f
> +{
> + "programs": [
> +
> + ],
> + "streams": [
> + {
> + "index": 0,
> + "disposition": {
> + "default": 1,
> + "dub": 0,
> + "original": 0,
> + "comment": 0,
> + "lyrics": 0,
> + "karaoke": 0,
> + "forced": 0,
> + "hearing_impaired": 1,
> + "visual_impaired": 0,
> + "clean_effects": 0,
> + "attached_pic": 0,
> + "timed_thumbnails": 0,
> + "captions": 1,
> + "descriptions": 0,
> + "metadata": 0,
> + "dependent": 0,
> + "still_image": 0
> + },
> + "side_data_list": [
> + {
> +
> + }
> + ]
> + },
> + {
> + "index": 1,
> + "disposition": {
> + "default": 0,
> + "dub": 0,
> + "original": 0,
> + "comment": 0,
> + "lyrics": 0,
> + "karaoke": 0,
> + "forced": 0,
> + "hearing_impaired": 0,
> + "visual_impaired": 1,
> + "clean_effects": 0,
> + "attached_pic": 0,
> + "timed_thumbnails": 0,
> + "captions": 0,
> + "descriptions": 1,
> + "metadata": 0,
> + "dependent": 0,
> + "still_image": 0
> + },
> + "side_data_list": [
> + {
> +
> + }
> + ]
> + }
> + ]
> +}
> --
> 2.31.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list