avformat/matroskadec: Move WEBVTT code to mkv_parse_subtitle_codec()

and also perform the remainder of the subtitle parsing directly
after mkv_parse_subtitle_codec().

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt 2023-09-04 00:22:14 +02:00
parent ee25dcd5fb
commit b105ad50c5
1 changed files with 27 additions and 22 deletions

View File

@ -2948,7 +2948,8 @@ static int mkv_parse_video(MatroskaTrack *track, AVStream *st,
} }
/* Performs the codec-specific part of parsing a subtitle track. */ /* Performs the codec-specific part of parsing a subtitle track. */
static int mkv_parse_subtitle_codec(MatroskaTrack *track, AVCodecParameters *par, static int mkv_parse_subtitle_codec(MatroskaTrack *track, AVStream *st,
AVCodecParameters *par,
const MatroskaDemuxContext *matroska) const MatroskaDemuxContext *matroska)
{ {
switch (par->codec_id) { switch (par->codec_id) {
@ -2984,6 +2985,15 @@ static int mkv_parse_subtitle_codec(MatroskaTrack *track, AVCodecParameters *par
track->codec_priv.size = 0; track->codec_priv.size = 0;
} }
break; break;
case AV_CODEC_ID_WEBVTT:
if (!strcmp(track->codec_id, "D_WEBVTT/CAPTIONS")) {
st->disposition |= AV_DISPOSITION_CAPTIONS;
} else if (!strcmp(track->codec_id, "D_WEBVTT/DESCRIPTIONS")) {
st->disposition |= AV_DISPOSITION_DESCRIPTIONS;
} else if (!strcmp(track->codec_id, "D_WEBVTT/METADATA")) {
st->disposition |= AV_DISPOSITION_METADATA;
}
break;
} }
return 0; return 0;
@ -3001,6 +3011,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
EbmlList *encodings_list = &track->encodings; EbmlList *encodings_list = &track->encodings;
MatroskaTrackEncoding *encodings = encodings_list->elem; MatroskaTrackEncoding *encodings = encodings_list->elem;
AVCodecParameters *par; AVCodecParameters *par;
MatroskaTrackType type;
int extradata_offset = 0; int extradata_offset = 0;
AVStream *st; AVStream *st;
char* key_id_base64 = NULL; char* key_id_base64 = NULL;
@ -3174,21 +3185,32 @@ static int matroska_parse_tracks(AVFormatContext *s)
(AVRational){ 1, 1000000000 }, (AVRational){ 1, 1000000000 },
st->time_base); st->time_base);
if (track->type == MATROSKA_TRACK_TYPE_AUDIO) { type = track->type;
if (par->codec_id == AV_CODEC_ID_WEBVTT)
type = MATROSKA_TRACK_TYPE_SUBTITLE;
switch (type) {
case MATROSKA_TRACK_TYPE_AUDIO:
ret = mka_parse_audio(track, st, par, matroska, ret = mka_parse_audio(track, st, par, matroska,
s, &extradata_offset); s, &extradata_offset);
if (ret < 0) if (ret < 0)
return ret; return ret;
if (ret == SKIP_TRACK) if (ret == SKIP_TRACK)
continue; continue;
} else if (track->type == MATROSKA_TRACK_TYPE_VIDEO) { break;
case MATROSKA_TRACK_TYPE_VIDEO:
ret = mkv_parse_video(track, st, par, matroska, &extradata_offset); ret = mkv_parse_video(track, st, par, matroska, &extradata_offset);
if (ret < 0) if (ret < 0)
return ret; return ret;
} else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) { break;
ret = mkv_parse_subtitle_codec(track, par, matroska); case MATROSKA_TRACK_TYPE_SUBTITLE:
ret = mkv_parse_subtitle_codec(track, st, par, matroska);
if (ret < 0) if (ret < 0)
return ret; return ret;
par->codec_type = AVMEDIA_TYPE_SUBTITLE;
if (track->flag_textdescriptions)
st->disposition |= AV_DISPOSITION_DESCRIPTIONS;
break;
} }
if (par->codec_id == AV_CODEC_ID_NONE) if (par->codec_id == AV_CODEC_ID_NONE)
@ -3204,23 +3226,6 @@ static int matroska_parse_tracks(AVFormatContext *s)
memcpy(par->extradata, src, extra_size); memcpy(par->extradata, src, extra_size);
} }
if (par->codec_id == AV_CODEC_ID_WEBVTT) {
par->codec_type = AVMEDIA_TYPE_SUBTITLE;
if (!strcmp(track->codec_id, "D_WEBVTT/CAPTIONS")) {
st->disposition |= AV_DISPOSITION_CAPTIONS;
} else if (!strcmp(track->codec_id, "D_WEBVTT/DESCRIPTIONS")) {
st->disposition |= AV_DISPOSITION_DESCRIPTIONS;
} else if (!strcmp(track->codec_id, "D_WEBVTT/METADATA")) {
st->disposition |= AV_DISPOSITION_METADATA;
}
} else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) {
par->codec_type = AVMEDIA_TYPE_SUBTITLE;
if (track->flag_textdescriptions)
st->disposition |= AV_DISPOSITION_DESCRIPTIONS;
}
ret = mkv_parse_block_addition_mappings(s, st, track); ret = mkv_parse_block_addition_mappings(s, st, track);
if (ret < 0) if (ret < 0)
return ret; return ret;