From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> To: ffmpeg-devel@ffmpeg.org Cc: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> Subject: [FFmpeg-devel] [PATCH 20/20] avformat/matroskadec: Factor parsing content encodings out Date: Mon, 4 Sep 2023 13:27:59 +0200 Message-ID: <AS8P250MB0744AD1CAE143EB8A076C33A8FE9A@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM> (raw) In-Reply-To: <AS8P250MB0744314AD7A516CFC71F61BF8FE9A@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM> Namely, out of matroska_parse_tracks(). Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> --- libavformat/matroskadec.c | 146 +++++++++++++++++++++----------------- 1 file changed, 79 insertions(+), 67 deletions(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 51c47e9404..0d6f153d18 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -2029,6 +2029,80 @@ static void matroska_parse_cues(MatroskaDemuxContext *matroska) { matroska_add_index_entries(matroska); } +static int matroska_parse_content_encodings(MatroskaTrackEncoding *encodings, + unsigned nb_encodings, + MatroskaTrack *track, + char **key_id_base64, void *logctx) +{ + if (nb_encodings > 1) { + av_log(logctx, AV_LOG_ERROR, + "Multiple combined encodings not supported"); + return 0; + } + if (!nb_encodings) + return 0; + if (encodings->type) { + if (encodings->encryption.key_id.size > 0) { + /* Save the encryption key id to be stored later + * as a metadata tag. */ + const int b64_size = AV_BASE64_SIZE(encodings->encryption.key_id.size); + *key_id_base64 = av_malloc(b64_size); + if (!*key_id_base64) + return AVERROR(ENOMEM); + + av_base64_encode(*key_id_base64, b64_size, + encodings->encryption.key_id.data, + encodings->encryption.key_id.size); + } else { + encodings->scope = 0; + av_log(logctx, AV_LOG_ERROR, "Unsupported encoding type"); + } + } else if ( +#if CONFIG_ZLIB + encodings->compression.algo != MATROSKA_TRACK_ENCODING_COMP_ZLIB && +#endif +#if CONFIG_BZLIB + encodings->compression.algo != MATROSKA_TRACK_ENCODING_COMP_BZLIB && +#endif + encodings->compression.algo != MATROSKA_TRACK_ENCODING_COMP_LZO && + encodings->compression.algo != MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP) { + encodings->scope = 0; + av_log(logctx, AV_LOG_ERROR, "Unsupported encoding type"); + } else if (track->codec_priv.size && encodings[0].scope & 2) { + uint8_t *codec_priv = track->codec_priv.data; + int ret = matroska_decode_buffer(&track->codec_priv.data, + &track->codec_priv.size, + track); + if (ret < 0) { + track->codec_priv.data = NULL; + track->codec_priv.size = 0; + av_log(logctx, AV_LOG_ERROR, + "Failed to decode codec private data\n"); + } + + if (codec_priv != track->codec_priv.data) { + av_buffer_unref(&track->codec_priv.buf); + if (track->codec_priv.data) { + track->codec_priv.buf = av_buffer_create(track->codec_priv.data, + track->codec_priv.size + AV_INPUT_BUFFER_PADDING_SIZE, + NULL, NULL, 0); + if (!track->codec_priv.buf) { + av_freep(&track->codec_priv.data); + track->codec_priv.size = 0; + return AVERROR(ENOMEM); + } + } + } + } + track->needs_decoding = !encodings->type && + encodings->scope & 1 && + (encodings->compression.algo != + MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP || + encodings->compression.settings.size); + + return 0; +} + static int matroska_aac_profile(char *codec_id) { static const char *const aac_profiles[] = { "MAIN", "LC", "SSR" }; @@ -3008,8 +3082,6 @@ static int matroska_parse_tracks(AVFormatContext *s) for (i = 0; i < matroska->tracks.nb_elem; i++) { MatroskaTrack *track = &tracks[i]; enum AVCodecID codec_id = AV_CODEC_ID_NONE; - EbmlList *encodings_list = &track->encodings; - MatroskaTrackEncoding *encodings = encodings_list->elem; AVCodecParameters *par; MatroskaTrackType type; int extradata_offset = 0; @@ -3065,71 +3137,11 @@ static int matroska_parse_tracks(AVFormatContext *s) if (!track->audio.out_samplerate) track->audio.out_samplerate = track->audio.samplerate; } - if (encodings_list->nb_elem > 1) { - av_log(matroska->ctx, AV_LOG_ERROR, - "Multiple combined encodings not supported"); - } else if (encodings_list->nb_elem == 1) { - if (encodings[0].type) { - if (encodings[0].encryption.key_id.size > 0) { - /* Save the encryption key id to be stored later as a - metadata tag. */ - const int b64_size = AV_BASE64_SIZE(encodings[0].encryption.key_id.size); - key_id_base64 = av_malloc(b64_size); - if (key_id_base64 == NULL) - return AVERROR(ENOMEM); - - av_base64_encode(key_id_base64, b64_size, - encodings[0].encryption.key_id.data, - encodings[0].encryption.key_id.size); - } else { - encodings[0].scope = 0; - av_log(matroska->ctx, AV_LOG_ERROR, - "Unsupported encoding type"); - } - } else if ( -#if CONFIG_ZLIB - encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_ZLIB && -#endif -#if CONFIG_BZLIB - encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_BZLIB && -#endif - encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_LZO && - encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP) { - encodings[0].scope = 0; - av_log(matroska->ctx, AV_LOG_ERROR, - "Unsupported encoding type"); - } else if (track->codec_priv.size && encodings[0].scope & 2) { - uint8_t *codec_priv = track->codec_priv.data; - int ret = matroska_decode_buffer(&track->codec_priv.data, - &track->codec_priv.size, - track); - if (ret < 0) { - track->codec_priv.data = NULL; - track->codec_priv.size = 0; - av_log(matroska->ctx, AV_LOG_ERROR, - "Failed to decode codec private data\n"); - } - - if (codec_priv != track->codec_priv.data) { - av_buffer_unref(&track->codec_priv.buf); - if (track->codec_priv.data) { - track->codec_priv.buf = av_buffer_create(track->codec_priv.data, - track->codec_priv.size + AV_INPUT_BUFFER_PADDING_SIZE, - NULL, NULL, 0); - if (!track->codec_priv.buf) { - av_freep(&track->codec_priv.data); - track->codec_priv.size = 0; - return AVERROR(ENOMEM); - } - } - } - } - } - track->needs_decoding = encodings && !encodings[0].type && - encodings[0].scope & 1 && - (encodings[0].compression.algo != - MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP || - encodings[0].compression.settings.size); + ret = matroska_parse_content_encodings(track->encodings.elem, + track->encodings.nb_elem, + track, &key_id_base64, matroska->ctx); + if (ret < 0) + return ret; for (j = 0; ff_mkv_codec_tags[j].id != AV_CODEC_ID_NONE; j++) { if (av_strstart(track->codec_id, ff_mkv_codec_tags[j].str, NULL)) { -- 2.34.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2023-09-04 11:47 UTC|newest] Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 02/20] avformat/matroskadec: Set several stream parameters earlier Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 03/20] avformat/matroskadec: Use dedicated pointer for access to codecpar Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 04/20] avformat/matroskadec: Redo handling extradata allocation Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 05/20] avformat/matroskadec: Set AVCodecParameters earlier Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 06/20] avformat/matroskdec: Factor audio parsing out of matroska_parse_tracks() Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 07/20] avformat/matroskadec: Remove redundant checks Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 08/20] avformat/matroskadec: Reindent after the previous commit Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 09/20] avformat/matroskadec: Factor video parsing out of matroska_parse_tracks() Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 10/20] avformat/matroskadec: Reindent after the previous commit Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 11/20] avformat/matroskadec: Move reading color space to a better place Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 12/20] avformat/matroskadec: Avoid clobbering CodecPrivate size Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 13/20] avformat/matroskadec: Use av_dict_set_int() where appropriate Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 14/20] avformat/matroskadec: Factor parsing subtitle codecs out Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 15/20] avformat/matroskadec: Factor generic parsing of video tracks out Andreas Rheinhardt 2023-09-04 11:46 ` James Almer 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 16/20] avformat/matroskadec: Reindent after the previous commit Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 17/20] avformat/matroskadec: Factor generic parsing of audio tracks out Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 18/20] avformat/matroskdec: Reindent after the previous commit Andreas Rheinhardt 2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 19/20] avformat/matroskadec: Move WEBVTT code to mkv_parse_subtitle_codec() Andreas Rheinhardt 2023-09-04 11:27 ` Andreas Rheinhardt [this message] 2023-09-06 9:37 ` [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=AS8P250MB0744AD1CAE143EB8A076C33A8FE9A@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM \ --to=andreas.rheinhardt@outlook.com \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git