avformat/mov: enable identifying TTML subtitle streams as such

The contents are full TTML XML documents. TTML writing tests'
results are updated as the streams are now properly identified
as TTML ones.

Signed-off-by: Jan Ekström <jan.ekstrom@24i.com>
This commit is contained in:
Jan Ekström 2023-04-21 16:07:08 +03:00 committed by Jan Ekström
parent 7de3fcb059
commit b300552dfb
3 changed files with 20 additions and 10 deletions

View File

@ -2263,6 +2263,11 @@ static int mov_codec_id(AVStream *st, uint32_t format)
(st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE && (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE &&
st->codecpar->codec_id == AV_CODEC_ID_NONE)) { st->codecpar->codec_id == AV_CODEC_ID_NONE)) {
id = ff_codec_get_id(ff_codec_movsubtitle_tags, format); id = ff_codec_get_id(ff_codec_movsubtitle_tags, format);
if (id <= 0) {
id = (format == MOV_MP4_TTML_TAG || format == MOV_ISMV_TTML_TAG) ?
AV_CODEC_ID_TTML : id;
}
if (id > 0) if (id > 0)
st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE; st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE;
else else
@ -2457,8 +2462,10 @@ static void mov_parse_stsd_subtitle(MOVContext *c, AVIOContext *pb,
// ttxt stsd contains display flags, justification, background // ttxt stsd contains display flags, justification, background
// color, fonts, and default styles, so fake an atom to read it // color, fonts, and default styles, so fake an atom to read it
MOVAtom fake_atom = { .size = size }; MOVAtom fake_atom = { .size = size };
// mp4s contains a regular esds atom // mp4s contains a regular esds atom, dfxp ISMV TTML has no content
if (st->codecpar->codec_tag != AV_RL32("mp4s")) // in extradata unlike stpp MP4 TTML.
if (st->codecpar->codec_tag != AV_RL32("mp4s") &&
st->codecpar->codec_tag != MOV_ISMV_TTML_TAG)
mov_read_glbl(c, pb, fake_atom); mov_read_glbl(c, pb, fake_atom);
st->codecpar->width = sc->width; st->codecpar->width = sc->width;
st->codecpar->height = sc->height; st->codecpar->height = sc->height;

View File

@ -1,13 +1,13 @@
2e7e01c821c111466e7a2844826b7f6d *tests/data/fate/mov-mp4-ttml-dfxp.mp4 2e7e01c821c111466e7a2844826b7f6d *tests/data/fate/mov-mp4-ttml-dfxp.mp4
8519 tests/data/fate/mov-mp4-ttml-dfxp.mp4 8519 tests/data/fate/mov-mp4-ttml-dfxp.mp4
#tb 0: 1/1000 #tb 0: 1/1000
#media_type 0: data #media_type 0: subtitle
#codec_id 0: none #codec_id 0: ttml
0, 0, 0, 68500, 7866, 0x456c36b7 0, 0, 0, 68500, 7866, 0x456c36b7
{ {
"packets": [ "packets": [
{ {
"codec_type": "data", "codec_type": "subtitle",
"stream_index": 0, "stream_index": 0,
"pts": 0, "pts": 0,
"pts_time": "0.000000", "pts_time": "0.000000",
@ -26,7 +26,8 @@
"streams": [ "streams": [
{ {
"index": 0, "index": 0,
"codec_type": "data", "codec_name": "ttml",
"codec_type": "subtitle",
"codec_tag_string": "dfxp", "codec_tag_string": "dfxp",
"codec_tag": "0x70786664", "codec_tag": "0x70786664",
"time_base": "1/1000", "time_base": "1/1000",

View File

@ -1,13 +1,14 @@
cbd2c7ff864a663b0d893deac5a0caec *tests/data/fate/mov-mp4-ttml-stpp.mp4 cbd2c7ff864a663b0d893deac5a0caec *tests/data/fate/mov-mp4-ttml-stpp.mp4
8547 tests/data/fate/mov-mp4-ttml-stpp.mp4 8547 tests/data/fate/mov-mp4-ttml-stpp.mp4
#extradata 0: 48, 0x62100c0d
#tb 0: 1/1000 #tb 0: 1/1000
#media_type 0: data #media_type 0: subtitle
#codec_id 0: none #codec_id 0: ttml
0, 0, 0, 68500, 7866, 0x456c36b7 0, 0, 0, 68500, 7866, 0x456c36b7
{ {
"packets": [ "packets": [
{ {
"codec_type": "data", "codec_type": "subtitle",
"stream_index": 0, "stream_index": 0,
"pts": 0, "pts": 0,
"pts_time": "0.000000", "pts_time": "0.000000",
@ -26,7 +27,8 @@ cbd2c7ff864a663b0d893deac5a0caec *tests/data/fate/mov-mp4-ttml-stpp.mp4
"streams": [ "streams": [
{ {
"index": 0, "index": 0,
"codec_type": "data", "codec_name": "ttml",
"codec_type": "subtitle",
"codec_tag_string": "stpp", "codec_tag_string": "stpp",
"codec_tag": "0x70707473", "codec_tag": "0x70707473",
"time_base": "1/1000", "time_base": "1/1000",