* [FFmpeg-devel] [PATCH 02/20] avformat/matroskadec: Set several stream parameters earlier
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 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 03/20] avformat/matroskadec: Use dedicated pointer for access to codecpar Andreas Rheinhardt
` (18 subsequent siblings)
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
Don't do it in between parsing and setting extradata.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 64 +++++++++++++++++++--------------------
1 file changed, 32 insertions(+), 32 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index fda77b0b89..ac3800b880 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2654,12 +2654,44 @@ static int matroska_parse_tracks(AVFormatContext *s)
}
sti = ffstream(st);
+ if (track->flag_default)
+ st->disposition |= AV_DISPOSITION_DEFAULT;
+ if (track->flag_forced)
+ st->disposition |= AV_DISPOSITION_FORCED;
+ if (track->flag_comment)
+ st->disposition |= AV_DISPOSITION_COMMENT;
+ if (track->flag_hearingimpaired)
+ st->disposition |= AV_DISPOSITION_HEARING_IMPAIRED;
+ if (track->flag_visualimpaired)
+ st->disposition |= AV_DISPOSITION_VISUAL_IMPAIRED;
+ if (track->flag_original.count > 0)
+ st->disposition |= track->flag_original.el.u ? AV_DISPOSITION_ORIGINAL
+ : AV_DISPOSITION_DUB;
+
if (key_id_base64) {
/* export encryption key id as base64 metadata tag */
av_dict_set(&st->metadata, "enc_key_id", key_id_base64,
AV_DICT_DONT_STRDUP_VAL);
}
+ if (strcmp(track->language, "und"))
+ av_dict_set(&st->metadata, "language", track->language, 0);
+ av_dict_set(&st->metadata, "title", track->name, 0);
+
+ if (track->time_scale < 0.01) {
+ av_log(matroska->ctx, AV_LOG_WARNING,
+ "Track TimestampScale too small %f, assuming 1.0.\n",
+ track->time_scale);
+ track->time_scale = 1.0;
+ }
+ avpriv_set_pts_info(st, 64, matroska->time_scale * track->time_scale,
+ 1000 * 1000 * 1000); /* 64 bit pts in ns */
+
+ /* convert the delay from ns to the track timebase */
+ track->codec_delay_in_track_tb = av_rescale_q(track->codec_delay,
+ (AVRational){ 1, 1000000000 },
+ st->time_base);
+
if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") &&
track->codec_priv.size >= 40 &&
track->codec_priv.data) {
@@ -2923,40 +2955,8 @@ static int matroska_parse_tracks(AVFormatContext *s)
av_log(matroska->ctx, AV_LOG_INFO,
"Unknown/unsupported AVCodecID %s.\n", track->codec_id);
- if (track->time_scale < 0.01) {
- av_log(matroska->ctx, AV_LOG_WARNING,
- "Track TimestampScale too small %f, assuming 1.0.\n",
- track->time_scale);
- track->time_scale = 1.0;
- }
- avpriv_set_pts_info(st, 64, matroska->time_scale * track->time_scale,
- 1000 * 1000 * 1000); /* 64 bit pts in ns */
-
- /* convert the delay from ns to the track timebase */
- track->codec_delay_in_track_tb = av_rescale_q(track->codec_delay,
- (AVRational){ 1, 1000000000 },
- st->time_base);
-
st->codecpar->codec_id = codec_id;
- if (strcmp(track->language, "und"))
- av_dict_set(&st->metadata, "language", track->language, 0);
- av_dict_set(&st->metadata, "title", track->name, 0);
-
- if (track->flag_default)
- st->disposition |= AV_DISPOSITION_DEFAULT;
- if (track->flag_forced)
- st->disposition |= AV_DISPOSITION_FORCED;
- if (track->flag_comment)
- st->disposition |= AV_DISPOSITION_COMMENT;
- if (track->flag_hearingimpaired)
- st->disposition |= AV_DISPOSITION_HEARING_IMPAIRED;
- if (track->flag_visualimpaired)
- st->disposition |= AV_DISPOSITION_VISUAL_IMPAIRED;
- if (track->flag_original.count > 0)
- st->disposition |= track->flag_original.el.u ? AV_DISPOSITION_ORIGINAL
- : AV_DISPOSITION_DUB;
-
if (!st->codecpar->extradata) {
if (extradata) {
st->codecpar->extradata = extradata;
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 03/20] avformat/matroskadec: Use dedicated pointer for access to codecpar
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 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 04/20] avformat/matroskadec: Redo handling extradata allocation Andreas Rheinhardt
` (17 subsequent siblings)
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
Shortens code and improves readability.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 98 ++++++++++++++++++++-------------------
1 file changed, 50 insertions(+), 48 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index ac3800b880..fd28ff8ab2 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2513,6 +2513,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
enum AVCodecID codec_id = AV_CODEC_ID_NONE;
EbmlList *encodings_list = &track->encodings;
MatroskaTrackEncoding *encodings = encodings_list->elem;
+ AVCodecParameters *par;
uint8_t *extradata = NULL;
int extradata_size = 0;
int extradata_offset = 0;
@@ -2653,6 +2654,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
return AVERROR(ENOMEM);
}
sti = ffstream(st);
+ par = st->codecpar;
if (track->flag_default)
st->disposition |= AV_DISPOSITION_DEFAULT;
@@ -2711,12 +2713,12 @@ static int matroska_parse_tracks(AVFormatContext *s)
ffio_init_context(&b, track->codec_priv.data,
track->codec_priv.size,
0, NULL, NULL, NULL, NULL);
- ret = ff_get_wav_header(s, &b.pub, st->codecpar,
+ ret = ff_get_wav_header(s, &b.pub, par,
track->codec_priv.size, 0);
if (ret < 0)
return ret;
- codec_id = st->codecpar->codec_id;
- fourcc = st->codecpar->codec_tag;
+ codec_id = par->codec_id;
+ fourcc = par->codec_tag;
extradata_offset = FFMIN(track->codec_priv.size, 18);
} else if (!strcmp(track->codec_id, "A_QUICKTIME")
/* Normally 36, but allow noncompliant private data */
@@ -2882,7 +2884,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
if (track->audio.sub_packet_h & 1 || 2 * track->audio.frame_size
!= (int64_t)track->audio.sub_packet_h * track->audio.coded_framesize)
return AVERROR_INVALIDDATA;
- st->codecpar->block_align = track->audio.coded_framesize;
+ par->block_align = track->audio.coded_framesize;
track->codec_priv.size = 0;
} else {
if (codec_id == AV_CODEC_ID_SIPR) {
@@ -2890,11 +2892,11 @@ static int matroska_parse_tracks(AVFormatContext *s)
if (flavor > 3)
return AVERROR_INVALIDDATA;
track->audio.sub_packet_size = ff_sipr_subpk_size[flavor];
- st->codecpar->bit_rate = sipr_bit_rate[flavor];
+ par->bit_rate = sipr_bit_rate[flavor];
} else if (track->audio.sub_packet_size <= 0 ||
track->audio.frame_size % track->audio.sub_packet_size)
return AVERROR_INVALIDDATA;
- st->codecpar->block_align = track->audio.sub_packet_size;
+ par->block_align = track->audio.sub_packet_size;
extradata_offset = 78;
}
track->audio.buf = av_malloc_array(track->audio.sub_packet_h,
@@ -2928,21 +2930,21 @@ static int matroska_parse_tracks(AVFormatContext *s)
// [0x30..0x37] are component tags utilized for
// non-mobile captioning service ("profile A").
if (component_tag >= 0x30 && component_tag <= 0x37) {
- st->codecpar->profile = FF_PROFILE_ARIB_PROFILE_A;
+ par->profile = FF_PROFILE_ARIB_PROFILE_A;
}
break;
case 0x0012:
// component tag 0x87 signifies a mobile/partial reception
// (1seg) captioning service ("profile C").
if (component_tag == 0x87) {
- st->codecpar->profile = FF_PROFILE_ARIB_PROFILE_C;
+ par->profile = FF_PROFILE_ARIB_PROFILE_C;
}
break;
default:
break;
}
- if (st->codecpar->profile == FF_PROFILE_UNKNOWN)
+ if (par->profile == FF_PROFILE_UNKNOWN)
av_log(matroska->ctx, AV_LOG_WARNING,
"Unknown ARIB caption profile utilized: %02x / %04x\n",
component_tag, data_component_id);
@@ -2955,16 +2957,16 @@ static int matroska_parse_tracks(AVFormatContext *s)
av_log(matroska->ctx, AV_LOG_INFO,
"Unknown/unsupported AVCodecID %s.\n", track->codec_id);
- st->codecpar->codec_id = codec_id;
+ par->codec_id = codec_id;
- if (!st->codecpar->extradata) {
+ if (!par->extradata) {
if (extradata) {
- st->codecpar->extradata = extradata;
- st->codecpar->extradata_size = extradata_size;
+ par->extradata = extradata;
+ par->extradata_size = extradata_size;
} else if (track->codec_priv.data && track->codec_priv.size > 0) {
- if (ff_alloc_extradata(st->codecpar, track->codec_priv.size))
+ if (ff_alloc_extradata(par, track->codec_priv.size))
return AVERROR(ENOMEM);
- memcpy(st->codecpar->extradata,
+ memcpy(par->extradata,
track->codec_priv.data + extradata_offset,
track->codec_priv.size);
}
@@ -2975,32 +2977,32 @@ static int matroska_parse_tracks(AVFormatContext *s)
int display_width_mul = 1;
int display_height_mul = 1;
- st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
- st->codecpar->codec_tag = fourcc;
+ par->codec_type = AVMEDIA_TYPE_VIDEO;
+ par->codec_tag = fourcc;
if (bit_depth >= 0)
- st->codecpar->bits_per_coded_sample = bit_depth;
- st->codecpar->width = track->video.pixel_width;
- st->codecpar->height = track->video.pixel_height;
+ par->bits_per_coded_sample = bit_depth;
+ par->width = track->video.pixel_width;
+ par->height = track->video.pixel_height;
if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED)
- st->codecpar->field_order = mkv_field_order(matroska, track->video.field_order);
+ par->field_order = mkv_field_order(matroska, track->video.field_order);
else if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE)
- st->codecpar->field_order = AV_FIELD_PROGRESSIVE;
+ par->field_order = AV_FIELD_PROGRESSIVE;
if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
mkv_stereo_mode_display_mul(track->video.stereo_mode, &display_width_mul, &display_height_mul);
if (track->video.display_unit < MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN) {
if (track->video.display_width && track->video.display_height &&
- st->codecpar->height < INT64_MAX / track->video.display_width / display_width_mul &&
- st->codecpar->width < INT64_MAX / track->video.display_height / display_height_mul)
+ par->height < INT64_MAX / track->video.display_width / display_width_mul &&
+ par->width < INT64_MAX / track->video.display_height / display_height_mul)
av_reduce(&st->sample_aspect_ratio.num,
&st->sample_aspect_ratio.den,
- st->codecpar->height * track->video.display_width * display_width_mul,
- st->codecpar->width * track->video.display_height * display_height_mul,
+ par->height * track->video.display_width * display_width_mul,
+ par->width * track->video.display_height * display_height_mul,
INT_MAX);
}
- if (st->codecpar->codec_id != AV_CODEC_ID_HEVC)
+ if (par->codec_id != AV_CODEC_ID_HEVC)
sti->need_parsing = AVSTREAM_PARSE_HEADERS;
if (track->default_duration) {
@@ -3052,35 +3054,35 @@ static int matroska_parse_tracks(AVFormatContext *s)
if (ret < 0)
return ret;
} else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
- st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
- st->codecpar->codec_tag = fourcc;
- st->codecpar->sample_rate = track->audio.out_samplerate;
+ par->codec_type = AVMEDIA_TYPE_AUDIO;
+ par->codec_tag = fourcc;
+ par->sample_rate = track->audio.out_samplerate;
// channel layout may be already set by codec private checks above
- if (!av_channel_layout_check(&st->codecpar->ch_layout)) {
- st->codecpar->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
- st->codecpar->ch_layout.nb_channels = track->audio.channels;
+ if (!av_channel_layout_check(&par->ch_layout)) {
+ par->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
+ par->ch_layout.nb_channels = track->audio.channels;
}
- if (!st->codecpar->bits_per_coded_sample)
- st->codecpar->bits_per_coded_sample = track->audio.bitdepth;
- if (st->codecpar->codec_id == AV_CODEC_ID_MP3 ||
- st->codecpar->codec_id == AV_CODEC_ID_MLP ||
- st->codecpar->codec_id == AV_CODEC_ID_TRUEHD)
+ if (!par->bits_per_coded_sample)
+ par->bits_per_coded_sample = track->audio.bitdepth;
+ if (par->codec_id == AV_CODEC_ID_MP3 ||
+ par->codec_id == AV_CODEC_ID_MLP ||
+ par->codec_id == AV_CODEC_ID_TRUEHD)
sti->need_parsing = AVSTREAM_PARSE_FULL;
- else if (st->codecpar->codec_id != AV_CODEC_ID_AAC)
+ else if (par->codec_id != AV_CODEC_ID_AAC)
sti->need_parsing = AVSTREAM_PARSE_HEADERS;
if (track->codec_delay > 0) {
- st->codecpar->initial_padding = av_rescale_q(track->codec_delay,
- (AVRational){1, 1000000000},
- (AVRational){1, st->codecpar->codec_id == AV_CODEC_ID_OPUS ?
- 48000 : st->codecpar->sample_rate});
+ par->initial_padding = av_rescale_q(track->codec_delay,
+ (AVRational){1, 1000000000},
+ (AVRational){1, par->codec_id == AV_CODEC_ID_OPUS ?
+ 48000 : par->sample_rate});
}
if (track->seek_preroll > 0) {
- st->codecpar->seek_preroll = av_rescale_q(track->seek_preroll,
- (AVRational){1, 1000000000},
- (AVRational){1, st->codecpar->sample_rate});
+ par->seek_preroll = av_rescale_q(track->seek_preroll,
+ (AVRational){1, 1000000000},
+ (AVRational){1, par->sample_rate});
}
} else if (codec_id == AV_CODEC_ID_WEBVTT) {
- st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE;
+ par->codec_type = AVMEDIA_TYPE_SUBTITLE;
if (!strcmp(track->codec_id, "D_WEBVTT/CAPTIONS")) {
st->disposition |= AV_DISPOSITION_CAPTIONS;
@@ -3090,7 +3092,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
st->disposition |= AV_DISPOSITION_METADATA;
}
} else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) {
- st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE;
+ par->codec_type = AVMEDIA_TYPE_SUBTITLE;
if (track->flag_textdescriptions)
st->disposition |= AV_DISPOSITION_DESCRIPTIONS;
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 04/20] avformat/matroskadec: Redo handling extradata allocation
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 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 05/20] avformat/matroskadec: Set AVCodecParameters earlier Andreas Rheinhardt
` (16 subsequent siblings)
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
Up until now, matroska_parse_tracks() has two main ways
to set AVCodecParameters.extradata: A generic way via CodecPrivate
(possibly with an offset) and by allocating a buffer manually;
the pointer to this buffer is stored in a stack pointer.
In particular, the latter method is problematic, as the buffer
needs to be freed manually in case of error (currently there
are no error conditions between the place where it is set
to AVCodecParameters.extradata).
Most of these buffers are very small (<= 22B), so replace
the pointer to an allocated buffer with a stack buffer
and set the extradata directly for the one place where
the buffer may not be small.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 60 ++++++++++++++++++---------------------
1 file changed, 27 insertions(+), 33 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index fd28ff8ab2..50a159460d 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2501,6 +2501,10 @@ static int get_qt_codec(MatroskaTrack *track, uint32_t *fourcc, enum AVCodecID *
return 0;
}
+#define AAC_MAX_EXTRADATA_SIZE 5
+#define TTA_EXTRADATA_SIZE 22
+#define WAVPACK_EXTRADATA_SIZE 2
+
static int matroska_parse_tracks(AVFormatContext *s)
{
MatroskaDemuxContext *matroska = s->priv_data;
@@ -2514,8 +2518,10 @@ static int matroska_parse_tracks(AVFormatContext *s)
EbmlList *encodings_list = &track->encodings;
MatroskaTrackEncoding *encodings = encodings_list->elem;
AVCodecParameters *par;
- uint8_t *extradata = NULL;
- int extradata_size = 0;
+ uint8_t extradata[FFMAX3(AAC_MAX_EXTRADATA_SIZE,
+ TTA_EXTRADATA_SIZE,
+ WAVPACK_EXTRADATA_SIZE)];
+ int extradata_size = 0; // > 0 means that the extradata buffer is used
int extradata_offset = 0;
uint32_t fourcc = 0;
FFIOContext b;
@@ -2795,9 +2801,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
} else if (codec_id == AV_CODEC_ID_AAC && !track->codec_priv.size) {
int profile = matroska_aac_profile(track->codec_id);
int sri = matroska_aac_sri(track->audio.samplerate);
- extradata = av_mallocz(5 + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!extradata)
- return AVERROR(ENOMEM);
+
extradata[0] = (profile << 3) | ((sri & 0x0E) >> 1);
extradata[1] = ((sri & 0x01) << 7) | (track->audio.channels << 3);
if (strstr(track->codec_id, "SBR")) {
@@ -2812,15 +2816,13 @@ static int matroska_parse_tracks(AVFormatContext *s)
/* Only ALAC's magic cookie is stored in Matroska's track headers.
* Create the "atom size", "tag", and "tag version" fields the
* decoder expects manually. */
- extradata_size = 12 + track->codec_priv.size;
- extradata = av_mallocz(extradata_size +
- AV_INPUT_BUFFER_PADDING_SIZE);
- if (!extradata)
- return AVERROR(ENOMEM);
- AV_WB32(extradata, extradata_size);
- memcpy(&extradata[4], "alac", 4);
- AV_WB32(&extradata[8], 0);
- memcpy(&extradata[12], track->codec_priv.data,
+ ret = ff_alloc_extradata(par, 12 + track->codec_priv.size);
+ if (ret < 0)
+ return ret;
+ AV_WB32(par->extradata, par->extradata_size);
+ AV_WB32(&par->extradata[4], MKBETAG('a', 'l', 'a', 'c'));
+ AV_WB32(&par->extradata[8], 0);
+ memcpy(&par->extradata[12], track->codec_priv.data,
track->codec_priv.size);
} else if (codec_id == AV_CODEC_ID_TTA) {
uint8_t *ptr;
@@ -2837,10 +2839,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
}
if (track->audio.out_samplerate < 0 || track->audio.out_samplerate > INT_MAX)
return AVERROR_INVALIDDATA;
- extradata_size = 22;
- extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!extradata)
- return AVERROR(ENOMEM);
+ extradata_size = TTA_EXTRADATA_SIZE;
ptr = extradata;
bytestream_put_be32(&ptr, AV_RB32("TTA1"));
bytestream_put_le16(&ptr, 1);
@@ -2910,10 +2909,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
} else if (codec_id == AV_CODEC_ID_WAVPACK && track->codec_priv.size < 2) {
av_log(matroska->ctx, AV_LOG_INFO, "Assuming WavPack version 4.10 "
"in absence of valid CodecPrivate.\n");
- extradata_size = 2;
- extradata = av_mallocz(2 + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!extradata)
- return AVERROR(ENOMEM);
+ extradata_size = WAVPACK_EXTRADATA_SIZE;
AV_WL16(extradata, 0x410);
} else if (codec_id == AV_CODEC_ID_PRORES && track->codec_priv.size == 4) {
fourcc = AV_RL32(track->codec_priv.data);
@@ -2959,17 +2955,15 @@ static int matroska_parse_tracks(AVFormatContext *s)
par->codec_id = codec_id;
- if (!par->extradata) {
- if (extradata) {
- par->extradata = extradata;
- par->extradata_size = extradata_size;
- } else if (track->codec_priv.data && track->codec_priv.size > 0) {
- if (ff_alloc_extradata(par, track->codec_priv.size))
- return AVERROR(ENOMEM);
- memcpy(par->extradata,
- track->codec_priv.data + extradata_offset,
- track->codec_priv.size);
- }
+ if (!par->extradata && (extradata_size > 0 || track->codec_priv.size > 0)) {
+ const uint8_t *src = extradata_size > 0 ? extradata :
+ track->codec_priv.data + extradata_offset;
+ unsigned extra_size = extradata_size > 0 ? extradata_size :
+ track->codec_priv.size;
+ ret = ff_alloc_extradata(par, extra_size);
+ if (ret < 0)
+ return ret;
+ memcpy(par->extradata, src, extra_size);
}
if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 05/20] avformat/matroskadec: Set AVCodecParameters earlier
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (2 preceding siblings ...)
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 04/20] avformat/matroskadec: Redo handling extradata allocation Andreas Rheinhardt
@ 2023-09-04 11:27 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 06/20] avformat/matroskdec: Factor audio parsing out of matroska_parse_tracks() Andreas Rheinhardt
` (15 subsequent siblings)
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
This is in preparation for future commits.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 55 ++++++++++++++++++++-------------------
1 file changed, 28 insertions(+), 27 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 50a159460d..e1524a5943 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2528,7 +2528,6 @@ static int matroska_parse_tracks(AVFormatContext *s)
AVStream *st;
FFStream *sti;
char* key_id_base64 = NULL;
- int bit_depth = -1;
/* Apply some sanity checks. */
if (track->type != MATROSKA_TRACK_TYPE_VIDEO &&
@@ -2662,6 +2661,9 @@ static int matroska_parse_tracks(AVFormatContext *s)
sti = ffstream(st);
par = st->codecpar;
+ par->codec_id = codec_id;
+ par->codec_tag = fourcc;
+
if (track->flag_default)
st->disposition |= AV_DISPOSITION_DEFAULT;
if (track->flag_forced)
@@ -2704,13 +2706,13 @@ static int matroska_parse_tracks(AVFormatContext *s)
track->codec_priv.size >= 40 &&
track->codec_priv.data) {
track->ms_compat = 1;
- bit_depth = AV_RL16(track->codec_priv.data + 14);
- fourcc = AV_RL32(track->codec_priv.data + 16);
- codec_id = ff_codec_get_id(ff_codec_bmp_tags,
- fourcc);
- if (!codec_id)
- codec_id = ff_codec_get_id(ff_codec_movvideo_tags,
- fourcc);
+ par->bits_per_coded_sample = AV_RL16(track->codec_priv.data + 14);
+ par->codec_tag = AV_RL32(track->codec_priv.data + 16);
+ par->codec_id = ff_codec_get_id(ff_codec_bmp_tags,
+ par->codec_tag);
+ if (!par->codec_id)
+ par->codec_id = ff_codec_get_id(ff_codec_movvideo_tags,
+ par->codec_tag);
extradata_offset = 40;
} else if (!strcmp(track->codec_id, "A_MS/ACM") &&
track->codec_priv.size >= 14 &&
@@ -2723,13 +2725,12 @@ static int matroska_parse_tracks(AVFormatContext *s)
track->codec_priv.size, 0);
if (ret < 0)
return ret;
- codec_id = par->codec_id;
- fourcc = par->codec_tag;
extradata_offset = FFMIN(track->codec_priv.size, 18);
} else if (!strcmp(track->codec_id, "A_QUICKTIME")
/* Normally 36, but allow noncompliant private data */
&& (track->codec_priv.size >= 32)
&& (track->codec_priv.data)) {
+ uint32_t fourcc;
uint16_t sample_size;
int ret = get_qt_codec(track, &fourcc, &codec_id);
if (ret < 0)
@@ -2748,9 +2749,12 @@ static int matroska_parse_tracks(AVFormatContext *s)
fourcc == MKTAG('s','o','w','t')) &&
sample_size == 8)
codec_id = AV_CODEC_ID_PCM_S8;
+ par->codec_id = codec_id;
+ par->codec_tag = fourcc;
} else if (!strcmp(track->codec_id, "V_QUICKTIME") &&
(track->codec_priv.size >= 21) &&
(track->codec_priv.data)) {
+ uint32_t fourcc;
int ret = get_qt_codec(track, &fourcc, &codec_id);
if (ret < 0)
return ret;
@@ -2758,11 +2762,12 @@ static int matroska_parse_tracks(AVFormatContext *s)
fourcc = MKTAG('S','V','Q','3');
codec_id = ff_codec_get_id(ff_codec_movvideo_tags, fourcc);
}
+ par->codec_id = codec_id;
if (codec_id == AV_CODEC_ID_NONE)
av_log(matroska->ctx, AV_LOG_ERROR,
"mov FourCC not found %s.\n", av_fourcc2str(fourcc));
if (track->codec_priv.size >= 86) {
- bit_depth = AV_RB16(track->codec_priv.data + 82);
+ unsigned bit_depth = AV_RB16(track->codec_priv.data + 82);
ffio_init_context(&b, track->codec_priv.data,
track->codec_priv.size,
0, NULL, NULL, NULL, NULL);
@@ -2770,34 +2775,36 @@ static int matroska_parse_tracks(AVFormatContext *s)
bit_depth &= 0x1F;
track->has_palette = 1;
}
+ par->bits_per_coded_sample = bit_depth;
}
+ par->codec_tag = fourcc;
} else if (codec_id == AV_CODEC_ID_PCM_S16BE) {
switch (track->audio.bitdepth) {
case 8:
- codec_id = AV_CODEC_ID_PCM_U8;
+ par->codec_id = AV_CODEC_ID_PCM_U8;
break;
case 24:
- codec_id = AV_CODEC_ID_PCM_S24BE;
+ par->codec_id = AV_CODEC_ID_PCM_S24BE;
break;
case 32:
- codec_id = AV_CODEC_ID_PCM_S32BE;
+ par->codec_id = AV_CODEC_ID_PCM_S32BE;
break;
}
} else if (codec_id == AV_CODEC_ID_PCM_S16LE) {
switch (track->audio.bitdepth) {
case 8:
- codec_id = AV_CODEC_ID_PCM_U8;
+ par->codec_id = AV_CODEC_ID_PCM_U8;
break;
case 24:
- codec_id = AV_CODEC_ID_PCM_S24LE;
+ par->codec_id = AV_CODEC_ID_PCM_S24LE;
break;
case 32:
- codec_id = AV_CODEC_ID_PCM_S32LE;
+ par->codec_id = AV_CODEC_ID_PCM_S32LE;
break;
}
} else if (codec_id == AV_CODEC_ID_PCM_F32LE &&
track->audio.bitdepth == 64) {
- codec_id = AV_CODEC_ID_PCM_F64LE;
+ par->codec_id = AV_CODEC_ID_PCM_F64LE;
} else if (codec_id == AV_CODEC_ID_AAC && !track->codec_priv.size) {
int profile = matroska_aac_profile(track->codec_id);
int sri = matroska_aac_sri(track->audio.samplerate);
@@ -2912,7 +2919,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
extradata_size = WAVPACK_EXTRADATA_SIZE;
AV_WL16(extradata, 0x410);
} else if (codec_id == AV_CODEC_ID_PRORES && track->codec_priv.size == 4) {
- fourcc = AV_RL32(track->codec_priv.data);
+ par->codec_tag = AV_RL32(track->codec_priv.data);
} else if (codec_id == AV_CODEC_ID_VP9) {
/* we don't need any value stored in CodecPrivate.
make sure that it's not exported as extradata. */
@@ -2949,12 +2956,10 @@ static int matroska_parse_tracks(AVFormatContext *s)
}
track->codec_priv.size -= extradata_offset;
- if (codec_id == AV_CODEC_ID_NONE)
+ if (par->codec_id == AV_CODEC_ID_NONE)
av_log(matroska->ctx, AV_LOG_INFO,
"Unknown/unsupported AVCodecID %s.\n", track->codec_id);
- par->codec_id = codec_id;
-
if (!par->extradata && (extradata_size > 0 || track->codec_priv.size > 0)) {
const uint8_t *src = extradata_size > 0 ? extradata :
track->codec_priv.data + extradata_offset;
@@ -2972,9 +2977,6 @@ static int matroska_parse_tracks(AVFormatContext *s)
int display_height_mul = 1;
par->codec_type = AVMEDIA_TYPE_VIDEO;
- par->codec_tag = fourcc;
- if (bit_depth >= 0)
- par->bits_per_coded_sample = bit_depth;
par->width = track->video.pixel_width;
par->height = track->video.pixel_height;
@@ -3049,7 +3051,6 @@ static int matroska_parse_tracks(AVFormatContext *s)
return ret;
} else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
par->codec_type = AVMEDIA_TYPE_AUDIO;
- par->codec_tag = fourcc;
par->sample_rate = track->audio.out_samplerate;
// channel layout may be already set by codec private checks above
if (!av_channel_layout_check(&par->ch_layout)) {
@@ -3075,7 +3076,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
(AVRational){1, 1000000000},
(AVRational){1, par->sample_rate});
}
- } else if (codec_id == AV_CODEC_ID_WEBVTT) {
+ } else if (par->codec_id == AV_CODEC_ID_WEBVTT) {
par->codec_type = AVMEDIA_TYPE_SUBTITLE;
if (!strcmp(track->codec_id, "D_WEBVTT/CAPTIONS")) {
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 06/20] avformat/matroskdec: Factor audio parsing out of matroska_parse_tracks()
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (3 preceding siblings ...)
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 05/20] avformat/matroskadec: Set AVCodecParameters earlier Andreas Rheinhardt
@ 2023-09-04 11:27 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 07/20] avformat/matroskadec: Remove redundant checks Andreas Rheinhardt
` (14 subsequent siblings)
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
More exactly, factor codec-specific audio parsing out of
matroska_parse_tracks(). This is intended to improve readability.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 424 ++++++++++++++++++++++----------------
1 file changed, 243 insertions(+), 181 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index e1524a5943..8846e9358d 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2501,9 +2501,241 @@ static int get_qt_codec(MatroskaTrack *track, uint32_t *fourcc, enum AVCodecID *
return 0;
}
+/* An enum with potential return values of the functions for parsing a track.
+ * Apart from that all these functions can also indicate ordinary errors via
+ * negative return values. */
+enum {
+ SKIP_TRACK = 1,
+};
+
#define AAC_MAX_EXTRADATA_SIZE 5
#define TTA_EXTRADATA_SIZE 22
#define WAVPACK_EXTRADATA_SIZE 2
+/* Performs the codec-specific part of parsing an audio track. */
+static int mka_parse_audio_codec(MatroskaTrack *track, AVCodecParameters *par,
+ const MatroskaDemuxContext *matroska,
+ AVFormatContext *s, int *extradata_offset)
+{
+ uint8_t extradata[FFMAX3(AAC_MAX_EXTRADATA_SIZE,
+ TTA_EXTRADATA_SIZE,
+ WAVPACK_EXTRADATA_SIZE)];
+ int extradata_size = 0; // > 0 means that the extradata buffer is used
+ int ret;
+
+ if (!strcmp(track->codec_id, "A_MS/ACM") &&
+ track->codec_priv.size >= 14 &&
+ track->codec_priv.data) {
+ FFIOContext b;
+ int ret;
+ ffio_init_context(&b, track->codec_priv.data,
+ track->codec_priv.size,
+ 0, NULL, NULL, NULL, NULL);
+ ret = ff_get_wav_header(s, &b.pub, par,
+ track->codec_priv.size, 0);
+ if (ret < 0)
+ return ret;
+ *extradata_offset = FFMIN(track->codec_priv.size, 18);
+ return 0;
+ } else if (!strcmp(track->codec_id, "A_QUICKTIME")
+ /* Normally 36, but allow noncompliant private data */
+ && (track->codec_priv.size >= 32)
+ && (track->codec_priv.data)) {
+ enum AVCodecID codec_id;
+ uint32_t fourcc;
+ uint16_t sample_size;
+ int ret = get_qt_codec(track, &fourcc, &codec_id);
+ if (ret < 0)
+ return ret;
+ sample_size = AV_RB16(track->codec_priv.data + 26);
+ if (fourcc == 0) {
+ if (sample_size == 8) {
+ fourcc = MKTAG('r','a','w',' ');
+ codec_id = ff_codec_get_id(ff_codec_movaudio_tags, fourcc);
+ } else if (sample_size == 16) {
+ fourcc = MKTAG('t','w','o','s');
+ codec_id = ff_codec_get_id(ff_codec_movaudio_tags, fourcc);
+ }
+ }
+ if ((fourcc == MKTAG('t','w','o','s') ||
+ fourcc == MKTAG('s','o','w','t')) &&
+ sample_size == 8)
+ codec_id = AV_CODEC_ID_PCM_S8;
+ par->codec_id = codec_id;
+ par->codec_tag = fourcc;
+ return 0;
+ }
+
+ switch (par->codec_id) {
+ case AV_CODEC_ID_PCM_S16BE:
+ switch (track->audio.bitdepth) {
+ case 8:
+ par->codec_id = AV_CODEC_ID_PCM_U8;
+ break;
+ case 24:
+ par->codec_id = AV_CODEC_ID_PCM_S24BE;
+ break;
+ case 32:
+ par->codec_id = AV_CODEC_ID_PCM_S32BE;
+ break;
+ }
+ break;
+ case AV_CODEC_ID_PCM_S16LE:
+ switch (track->audio.bitdepth) {
+ case 8:
+ par->codec_id = AV_CODEC_ID_PCM_U8;
+ break;
+ case 24:
+ par->codec_id = AV_CODEC_ID_PCM_S24LE;
+ break;
+ case 32:
+ par->codec_id = AV_CODEC_ID_PCM_S32LE;
+ break;
+ }
+ break;
+ case AV_CODEC_ID_PCM_F32LE:
+ if (track->audio.bitdepth == 64)
+ par->codec_id = AV_CODEC_ID_PCM_F64LE;
+ break;
+ case AV_CODEC_ID_AAC:
+ if (!track->codec_priv.size) {
+ int profile = matroska_aac_profile(track->codec_id);
+ int sri = matroska_aac_sri(track->audio.samplerate);
+
+ extradata[0] = (profile << 3) | ((sri & 0x0E) >> 1);
+ extradata[1] = ((sri & 0x01) << 7) | (track->audio.channels << 3);
+ if (strstr(track->codec_id, "SBR")) {
+ sri = matroska_aac_sri(track->audio.out_samplerate);
+ extradata[2] = 0x56;
+ extradata[3] = 0xE5;
+ extradata[4] = 0x80 | (sri << 3);
+ extradata_size = 5;
+ } else
+ extradata_size = 2;
+ }
+ break;
+ case AV_CODEC_ID_ALAC:
+ if (track->codec_priv.size && track->codec_priv.size < INT_MAX - 12 - AV_INPUT_BUFFER_PADDING_SIZE) {
+ /* Only ALAC's magic cookie is stored in Matroska's track headers.
+ * Create the "atom size", "tag", and "tag version" fields the
+ * decoder expects manually. */
+ ret = ff_alloc_extradata(par, 12 + track->codec_priv.size);
+ if (ret < 0)
+ return ret;
+ AV_WB32(par->extradata, par->extradata_size);
+ AV_WB32(&par->extradata[4], MKBETAG('a', 'l', 'a', 'c'));
+ AV_WB32(&par->extradata[8], 0);
+ memcpy(&par->extradata[12], track->codec_priv.data,
+ track->codec_priv.size);
+ }
+ break;
+ case AV_CODEC_ID_TTA:
+ {
+ uint8_t *ptr;
+ if (track->audio.channels > UINT16_MAX ||
+ track->audio.bitdepth > UINT16_MAX) {
+ av_log(matroska->ctx, AV_LOG_WARNING,
+ "Too large audio channel number %"PRIu64
+ " or bitdepth %"PRIu64". Skipping track.\n",
+ track->audio.channels, track->audio.bitdepth);
+ if (matroska->ctx->error_recognition & AV_EF_EXPLODE)
+ return AVERROR_INVALIDDATA;
+ else
+ return SKIP_TRACK;
+ }
+ if (track->audio.out_samplerate < 0 || track->audio.out_samplerate > INT_MAX)
+ return AVERROR_INVALIDDATA;
+ extradata_size = TTA_EXTRADATA_SIZE;
+ ptr = extradata;
+ bytestream_put_be32(&ptr, AV_RB32("TTA1"));
+ bytestream_put_le16(&ptr, 1);
+ bytestream_put_le16(&ptr, track->audio.channels);
+ bytestream_put_le16(&ptr, track->audio.bitdepth);
+ bytestream_put_le32(&ptr, track->audio.out_samplerate);
+ bytestream_put_le32(&ptr, av_rescale(matroska->duration * matroska->time_scale,
+ track->audio.out_samplerate,
+ AV_TIME_BASE * 1000));
+ break;
+ }
+ case AV_CODEC_ID_RA_144:
+ track->audio.out_samplerate = 8000;
+ track->audio.channels = 1;
+ break;
+ case AV_CODEC_ID_RA_288:
+ case AV_CODEC_ID_COOK:
+ case AV_CODEC_ID_ATRAC3:
+ case AV_CODEC_ID_SIPR:
+ {
+ const uint8_t *ptr = track->codec_priv.data;
+ int flavor;
+
+ if (!track->codec_priv.size)
+ break;
+
+ if (track->codec_priv.size < 46)
+ return AVERROR_INVALIDDATA;
+ ptr += 22;
+ flavor = bytestream_get_be16(&ptr);
+ track->audio.coded_framesize = bytestream_get_be32(&ptr);
+ ptr += 12;
+ track->audio.sub_packet_h = bytestream_get_be16(&ptr);
+ track->audio.frame_size = bytestream_get_be16(&ptr);
+ track->audio.sub_packet_size = bytestream_get_be16(&ptr);
+ if (track->audio.coded_framesize <= 0 ||
+ track->audio.sub_packet_h <= 0 ||
+ track->audio.frame_size <= 0)
+ return AVERROR_INVALIDDATA;
+
+ if (par->codec_id == AV_CODEC_ID_RA_288) {
+ if (track->audio.sub_packet_h & 1 || 2 * track->audio.frame_size
+ != (int64_t)track->audio.sub_packet_h * track->audio.coded_framesize)
+ return AVERROR_INVALIDDATA;
+ par->block_align = track->audio.coded_framesize;
+ track->codec_priv.size = 0;
+ } else {
+ if (par->codec_id == AV_CODEC_ID_SIPR) {
+ static const int sipr_bit_rate[4] = { 6504, 8496, 5000, 16000 };
+ if (flavor > 3)
+ return AVERROR_INVALIDDATA;
+ track->audio.sub_packet_size = ff_sipr_subpk_size[flavor];
+ par->bit_rate = sipr_bit_rate[flavor];
+ } else if (track->audio.sub_packet_size <= 0 ||
+ track->audio.frame_size % track->audio.sub_packet_size)
+ return AVERROR_INVALIDDATA;
+ par->block_align = track->audio.sub_packet_size;
+ *extradata_offset = 78;
+ }
+ track->audio.buf = av_malloc_array(track->audio.sub_packet_h,
+ track->audio.frame_size);
+ if (!track->audio.buf)
+ return AVERROR(ENOMEM);
+ break;
+ }
+ case AV_CODEC_ID_FLAC:
+ if (track->codec_priv.size) {
+ ret = matroska_parse_flac(s, track, extradata_offset);
+ if (ret < 0)
+ return ret;
+ }
+ break;
+ case AV_CODEC_ID_WAVPACK:
+ if (track->codec_priv.size < 2) {
+ av_log(matroska->ctx, AV_LOG_INFO, "Assuming WavPack version 4.10 "
+ "in absence of valid CodecPrivate.\n");
+ extradata_size = WAVPACK_EXTRADATA_SIZE;
+ AV_WL16(extradata, 0x410);
+ }
+ break;
+ }
+
+ if (extradata_size > 0) {
+ ret = ff_alloc_extradata(par, extradata_size);
+ if (ret < 0)
+ return ret;
+ memcpy(par->extradata, extradata, extradata_size);
+ }
+
+ return 0;
+}
static int matroska_parse_tracks(AVFormatContext *s)
{
@@ -2518,10 +2750,6 @@ static int matroska_parse_tracks(AVFormatContext *s)
EbmlList *encodings_list = &track->encodings;
MatroskaTrackEncoding *encodings = encodings_list->elem;
AVCodecParameters *par;
- uint8_t extradata[FFMAX3(AAC_MAX_EXTRADATA_SIZE,
- TTA_EXTRADATA_SIZE,
- WAVPACK_EXTRADATA_SIZE)];
- int extradata_size = 0; // > 0 means that the extradata buffer is used
int extradata_offset = 0;
uint32_t fourcc = 0;
FFIOContext b;
@@ -2702,6 +2930,14 @@ static int matroska_parse_tracks(AVFormatContext *s)
(AVRational){ 1, 1000000000 },
st->time_base);
+ if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
+ ret = mka_parse_audio_codec(track, par, matroska,
+ s, &extradata_offset);
+ if (ret < 0)
+ return ret;
+ if (ret == SKIP_TRACK)
+ continue;
+ } else
if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") &&
track->codec_priv.size >= 40 &&
track->codec_priv.data) {
@@ -2714,43 +2950,6 @@ static int matroska_parse_tracks(AVFormatContext *s)
par->codec_id = ff_codec_get_id(ff_codec_movvideo_tags,
par->codec_tag);
extradata_offset = 40;
- } else if (!strcmp(track->codec_id, "A_MS/ACM") &&
- track->codec_priv.size >= 14 &&
- track->codec_priv.data) {
- int ret;
- ffio_init_context(&b, track->codec_priv.data,
- track->codec_priv.size,
- 0, NULL, NULL, NULL, NULL);
- ret = ff_get_wav_header(s, &b.pub, par,
- track->codec_priv.size, 0);
- if (ret < 0)
- return ret;
- extradata_offset = FFMIN(track->codec_priv.size, 18);
- } else if (!strcmp(track->codec_id, "A_QUICKTIME")
- /* Normally 36, but allow noncompliant private data */
- && (track->codec_priv.size >= 32)
- && (track->codec_priv.data)) {
- uint32_t fourcc;
- uint16_t sample_size;
- int ret = get_qt_codec(track, &fourcc, &codec_id);
- if (ret < 0)
- return ret;
- sample_size = AV_RB16(track->codec_priv.data + 26);
- if (fourcc == 0) {
- if (sample_size == 8) {
- fourcc = MKTAG('r','a','w',' ');
- codec_id = ff_codec_get_id(ff_codec_movaudio_tags, fourcc);
- } else if (sample_size == 16) {
- fourcc = MKTAG('t','w','o','s');
- codec_id = ff_codec_get_id(ff_codec_movaudio_tags, fourcc);
- }
- }
- if ((fourcc == MKTAG('t','w','o','s') ||
- fourcc == MKTAG('s','o','w','t')) &&
- sample_size == 8)
- codec_id = AV_CODEC_ID_PCM_S8;
- par->codec_id = codec_id;
- par->codec_tag = fourcc;
} else if (!strcmp(track->codec_id, "V_QUICKTIME") &&
(track->codec_priv.size >= 21) &&
(track->codec_priv.data)) {
@@ -2778,146 +2977,11 @@ static int matroska_parse_tracks(AVFormatContext *s)
par->bits_per_coded_sample = bit_depth;
}
par->codec_tag = fourcc;
- } else if (codec_id == AV_CODEC_ID_PCM_S16BE) {
- switch (track->audio.bitdepth) {
- case 8:
- par->codec_id = AV_CODEC_ID_PCM_U8;
- break;
- case 24:
- par->codec_id = AV_CODEC_ID_PCM_S24BE;
- break;
- case 32:
- par->codec_id = AV_CODEC_ID_PCM_S32BE;
- break;
- }
- } else if (codec_id == AV_CODEC_ID_PCM_S16LE) {
- switch (track->audio.bitdepth) {
- case 8:
- par->codec_id = AV_CODEC_ID_PCM_U8;
- break;
- case 24:
- par->codec_id = AV_CODEC_ID_PCM_S24LE;
- break;
- case 32:
- par->codec_id = AV_CODEC_ID_PCM_S32LE;
- break;
- }
- } else if (codec_id == AV_CODEC_ID_PCM_F32LE &&
- track->audio.bitdepth == 64) {
- par->codec_id = AV_CODEC_ID_PCM_F64LE;
- } else if (codec_id == AV_CODEC_ID_AAC && !track->codec_priv.size) {
- int profile = matroska_aac_profile(track->codec_id);
- int sri = matroska_aac_sri(track->audio.samplerate);
-
- extradata[0] = (profile << 3) | ((sri & 0x0E) >> 1);
- extradata[1] = ((sri & 0x01) << 7) | (track->audio.channels << 3);
- if (strstr(track->codec_id, "SBR")) {
- sri = matroska_aac_sri(track->audio.out_samplerate);
- extradata[2] = 0x56;
- extradata[3] = 0xE5;
- extradata[4] = 0x80 | (sri << 3);
- extradata_size = 5;
- } else
- extradata_size = 2;
- } else if (codec_id == AV_CODEC_ID_ALAC && track->codec_priv.size && track->codec_priv.size < INT_MAX - 12 - AV_INPUT_BUFFER_PADDING_SIZE) {
- /* Only ALAC's magic cookie is stored in Matroska's track headers.
- * Create the "atom size", "tag", and "tag version" fields the
- * decoder expects manually. */
- ret = ff_alloc_extradata(par, 12 + track->codec_priv.size);
- if (ret < 0)
- return ret;
- AV_WB32(par->extradata, par->extradata_size);
- AV_WB32(&par->extradata[4], MKBETAG('a', 'l', 'a', 'c'));
- AV_WB32(&par->extradata[8], 0);
- memcpy(&par->extradata[12], track->codec_priv.data,
- track->codec_priv.size);
- } else if (codec_id == AV_CODEC_ID_TTA) {
- uint8_t *ptr;
- if (track->audio.channels > UINT16_MAX ||
- track->audio.bitdepth > UINT16_MAX) {
- av_log(matroska->ctx, AV_LOG_WARNING,
- "Too large audio channel number %"PRIu64
- " or bitdepth %"PRIu64". Skipping track.\n",
- track->audio.channels, track->audio.bitdepth);
- if (matroska->ctx->error_recognition & AV_EF_EXPLODE)
- return AVERROR_INVALIDDATA;
- else
- continue;
- }
- if (track->audio.out_samplerate < 0 || track->audio.out_samplerate > INT_MAX)
- return AVERROR_INVALIDDATA;
- extradata_size = TTA_EXTRADATA_SIZE;
- ptr = extradata;
- bytestream_put_be32(&ptr, AV_RB32("TTA1"));
- bytestream_put_le16(&ptr, 1);
- bytestream_put_le16(&ptr, track->audio.channels);
- bytestream_put_le16(&ptr, track->audio.bitdepth);
- bytestream_put_le32(&ptr, track->audio.out_samplerate);
- bytestream_put_le32(&ptr, av_rescale(matroska->duration * matroska->time_scale,
- track->audio.out_samplerate,
- AV_TIME_BASE * 1000));
} else if (codec_id == AV_CODEC_ID_RV10 ||
codec_id == AV_CODEC_ID_RV20 ||
codec_id == AV_CODEC_ID_RV30 ||
codec_id == AV_CODEC_ID_RV40) {
extradata_offset = 26;
- } else if (codec_id == AV_CODEC_ID_RA_144) {
- track->audio.out_samplerate = 8000;
- track->audio.channels = 1;
- } else if ((codec_id == AV_CODEC_ID_RA_288 ||
- codec_id == AV_CODEC_ID_COOK ||
- codec_id == AV_CODEC_ID_ATRAC3 ||
- codec_id == AV_CODEC_ID_SIPR)
- && track->codec_priv.data) {
- const uint8_t *ptr = track->codec_priv.data;
- int flavor;
-
- if (track->codec_priv.size < 46)
- return AVERROR_INVALIDDATA;
- ptr += 22;
- flavor = bytestream_get_be16(&ptr);
- track->audio.coded_framesize = bytestream_get_be32(&ptr);
- ptr += 12;
- track->audio.sub_packet_h = bytestream_get_be16(&ptr);
- track->audio.frame_size = bytestream_get_be16(&ptr);
- track->audio.sub_packet_size = bytestream_get_be16(&ptr);
- if (track->audio.coded_framesize <= 0 ||
- track->audio.sub_packet_h <= 0 ||
- track->audio.frame_size <= 0)
- return AVERROR_INVALIDDATA;
-
- if (codec_id == AV_CODEC_ID_RA_288) {
- if (track->audio.sub_packet_h & 1 || 2 * track->audio.frame_size
- != (int64_t)track->audio.sub_packet_h * track->audio.coded_framesize)
- return AVERROR_INVALIDDATA;
- par->block_align = track->audio.coded_framesize;
- track->codec_priv.size = 0;
- } else {
- if (codec_id == AV_CODEC_ID_SIPR) {
- static const int sipr_bit_rate[4] = { 6504, 8496, 5000, 16000 };
- if (flavor > 3)
- return AVERROR_INVALIDDATA;
- track->audio.sub_packet_size = ff_sipr_subpk_size[flavor];
- par->bit_rate = sipr_bit_rate[flavor];
- } else if (track->audio.sub_packet_size <= 0 ||
- track->audio.frame_size % track->audio.sub_packet_size)
- return AVERROR_INVALIDDATA;
- par->block_align = track->audio.sub_packet_size;
- extradata_offset = 78;
- }
- track->audio.buf = av_malloc_array(track->audio.sub_packet_h,
- track->audio.frame_size);
- if (!track->audio.buf)
- return AVERROR(ENOMEM);
- } else if (codec_id == AV_CODEC_ID_FLAC && track->codec_priv.size) {
- ret = matroska_parse_flac(s, track, &extradata_offset);
- if (ret < 0)
- return ret;
- } else if (codec_id == AV_CODEC_ID_WAVPACK && track->codec_priv.size < 2) {
- av_log(matroska->ctx, AV_LOG_INFO, "Assuming WavPack version 4.10 "
- "in absence of valid CodecPrivate.\n");
- extradata_size = WAVPACK_EXTRADATA_SIZE;
- AV_WL16(extradata, 0x410);
} else if (codec_id == AV_CODEC_ID_PRORES && track->codec_priv.size == 4) {
par->codec_tag = AV_RL32(track->codec_priv.data);
} else if (codec_id == AV_CODEC_ID_VP9) {
@@ -2960,11 +3024,9 @@ static int matroska_parse_tracks(AVFormatContext *s)
av_log(matroska->ctx, AV_LOG_INFO,
"Unknown/unsupported AVCodecID %s.\n", track->codec_id);
- if (!par->extradata && (extradata_size > 0 || track->codec_priv.size > 0)) {
- const uint8_t *src = extradata_size > 0 ? extradata :
- track->codec_priv.data + extradata_offset;
- unsigned extra_size = extradata_size > 0 ? extradata_size :
- track->codec_priv.size;
+ if (!par->extradata && track->codec_priv.size > 0) {
+ const uint8_t *src = track->codec_priv.data + extradata_offset;
+ unsigned extra_size = track->codec_priv.size;
ret = ff_alloc_extradata(par, extra_size);
if (ret < 0)
return ret;
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 07/20] avformat/matroskadec: Remove redundant checks
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (4 preceding siblings ...)
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 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 08/20] avformat/matroskadec: Reindent after the previous commit Andreas Rheinhardt
` (13 subsequent siblings)
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
If the size of the data of an EbmlBin is > 0, its data is always
present, as ebml_read_binary() always leaves the buffer
in a consistent state (even on error).
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 8846e9358d..e30dedf434 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2523,8 +2523,7 @@ static int mka_parse_audio_codec(MatroskaTrack *track, AVCodecParameters *par,
int ret;
if (!strcmp(track->codec_id, "A_MS/ACM") &&
- track->codec_priv.size >= 14 &&
- track->codec_priv.data) {
+ track->codec_priv.size >= 14) {
FFIOContext b;
int ret;
ffio_init_context(&b, track->codec_priv.data,
@@ -2538,8 +2537,7 @@ static int mka_parse_audio_codec(MatroskaTrack *track, AVCodecParameters *par,
return 0;
} else if (!strcmp(track->codec_id, "A_QUICKTIME")
/* Normally 36, but allow noncompliant private data */
- && (track->codec_priv.size >= 32)
- && (track->codec_priv.data)) {
+ && track->codec_priv.size >= 32) {
enum AVCodecID codec_id;
uint32_t fourcc;
uint16_t sample_size;
@@ -2939,8 +2937,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
continue;
} else
if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") &&
- track->codec_priv.size >= 40 &&
- track->codec_priv.data) {
+ track->codec_priv.size >= 40) {
track->ms_compat = 1;
par->bits_per_coded_sample = AV_RL16(track->codec_priv.data + 14);
par->codec_tag = AV_RL32(track->codec_priv.data + 16);
@@ -2951,8 +2948,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
par->codec_tag);
extradata_offset = 40;
} else if (!strcmp(track->codec_id, "V_QUICKTIME") &&
- (track->codec_priv.size >= 21) &&
- (track->codec_priv.data)) {
+ track->codec_priv.size >= 21) {
uint32_t fourcc;
int ret = get_qt_codec(track, &fourcc, &codec_id);
if (ret < 0)
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 08/20] avformat/matroskadec: Reindent after the previous commit
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (5 preceding siblings ...)
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 07/20] avformat/matroskadec: Remove redundant checks Andreas Rheinhardt
@ 2023-09-04 11:27 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 09/20] avformat/matroskadec: Factor video parsing out of matroska_parse_tracks() Andreas Rheinhardt
` (12 subsequent siblings)
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
Also fix a variable shadowing.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 251 +++++++++++++++++++-------------------
1 file changed, 125 insertions(+), 126 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index e30dedf434..e9ad0c7e11 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2516,79 +2516,78 @@ static int mka_parse_audio_codec(MatroskaTrack *track, AVCodecParameters *par,
const MatroskaDemuxContext *matroska,
AVFormatContext *s, int *extradata_offset)
{
- uint8_t extradata[FFMAX3(AAC_MAX_EXTRADATA_SIZE,
- TTA_EXTRADATA_SIZE,
- WAVPACK_EXTRADATA_SIZE)];
- int extradata_size = 0; // > 0 means that the extradata buffer is used
- int ret;
+ uint8_t extradata[FFMAX3(AAC_MAX_EXTRADATA_SIZE,
+ TTA_EXTRADATA_SIZE,
+ WAVPACK_EXTRADATA_SIZE)];
+ int extradata_size = 0; // > 0 means that the extradata buffer is used
+ int ret;
- if (!strcmp(track->codec_id, "A_MS/ACM") &&
- track->codec_priv.size >= 14) {
+ if (!strcmp(track->codec_id, "A_MS/ACM") &&
+ track->codec_priv.size >= 14) {
FFIOContext b;
- int ret;
- ffio_init_context(&b, track->codec_priv.data,
- track->codec_priv.size,
- 0, NULL, NULL, NULL, NULL);
- ret = ff_get_wav_header(s, &b.pub, par,
- track->codec_priv.size, 0);
- if (ret < 0)
- return ret;
- *extradata_offset = FFMIN(track->codec_priv.size, 18);
- return 0;
- } else if (!strcmp(track->codec_id, "A_QUICKTIME")
- /* Normally 36, but allow noncompliant private data */
- && track->codec_priv.size >= 32) {
- enum AVCodecID codec_id;
- uint32_t fourcc;
- uint16_t sample_size;
- int ret = get_qt_codec(track, &fourcc, &codec_id);
- if (ret < 0)
- return ret;
- sample_size = AV_RB16(track->codec_priv.data + 26);
- if (fourcc == 0) {
- if (sample_size == 8) {
- fourcc = MKTAG('r','a','w',' ');
- codec_id = ff_codec_get_id(ff_codec_movaudio_tags, fourcc);
- } else if (sample_size == 16) {
- fourcc = MKTAG('t','w','o','s');
- codec_id = ff_codec_get_id(ff_codec_movaudio_tags, fourcc);
- }
+ ffio_init_context(&b, track->codec_priv.data,
+ track->codec_priv.size,
+ 0, NULL, NULL, NULL, NULL);
+ ret = ff_get_wav_header(s, &b.pub, par,
+ track->codec_priv.size, 0);
+ if (ret < 0)
+ return ret;
+ *extradata_offset = FFMIN(track->codec_priv.size, 18);
+ return 0;
+ } else if (!strcmp(track->codec_id, "A_QUICKTIME") &&
+ /* Normally 36, but allow noncompliant private data */
+ track->codec_priv.size >= 32) {
+ enum AVCodecID codec_id;
+ uint32_t fourcc;
+ uint16_t sample_size;
+
+ ret = get_qt_codec(track, &fourcc, &codec_id);
+ if (ret < 0)
+ return ret;
+ sample_size = AV_RB16(track->codec_priv.data + 26);
+ if (fourcc == 0) {
+ if (sample_size == 8) {
+ fourcc = MKTAG('r','a','w',' ');
+ codec_id = ff_codec_get_id(ff_codec_movaudio_tags, fourcc);
+ } else if (sample_size == 16) {
+ fourcc = MKTAG('t','w','o','s');
+ codec_id = ff_codec_get_id(ff_codec_movaudio_tags, fourcc);
}
- if ((fourcc == MKTAG('t','w','o','s') ||
- fourcc == MKTAG('s','o','w','t')) &&
- sample_size == 8)
- codec_id = AV_CODEC_ID_PCM_S8;
- par->codec_id = codec_id;
- par->codec_tag = fourcc;
- return 0;
}
+ if ((fourcc == MKTAG('t','w','o','s') ||
+ fourcc == MKTAG('s','o','w','t')) && sample_size == 8)
+ codec_id = AV_CODEC_ID_PCM_S8;
+ par->codec_id = codec_id;
+ par->codec_tag = fourcc;
+ return 0;
+ }
switch (par->codec_id) {
case AV_CODEC_ID_PCM_S16BE:
- switch (track->audio.bitdepth) {
- case 8:
- par->codec_id = AV_CODEC_ID_PCM_U8;
- break;
- case 24:
- par->codec_id = AV_CODEC_ID_PCM_S24BE;
- break;
- case 32:
- par->codec_id = AV_CODEC_ID_PCM_S32BE;
- break;
- }
+ switch (track->audio.bitdepth) {
+ case 8:
+ par->codec_id = AV_CODEC_ID_PCM_U8;
+ break;
+ case 24:
+ par->codec_id = AV_CODEC_ID_PCM_S24BE;
+ break;
+ case 32:
+ par->codec_id = AV_CODEC_ID_PCM_S32BE;
+ break;
+ }
break;
case AV_CODEC_ID_PCM_S16LE:
- switch (track->audio.bitdepth) {
- case 8:
- par->codec_id = AV_CODEC_ID_PCM_U8;
- break;
- case 24:
- par->codec_id = AV_CODEC_ID_PCM_S24LE;
- break;
- case 32:
- par->codec_id = AV_CODEC_ID_PCM_S32LE;
- break;
- }
+ switch (track->audio.bitdepth) {
+ case 8:
+ par->codec_id = AV_CODEC_ID_PCM_U8;
+ break;
+ case 24:
+ par->codec_id = AV_CODEC_ID_PCM_S24LE;
+ break;
+ case 32:
+ par->codec_id = AV_CODEC_ID_PCM_S32LE;
+ break;
+ }
break;
case AV_CODEC_ID_PCM_F32LE:
if (track->audio.bitdepth == 64)
@@ -2628,84 +2627,84 @@ static int mka_parse_audio_codec(MatroskaTrack *track, AVCodecParameters *par,
break;
case AV_CODEC_ID_TTA:
{
- uint8_t *ptr;
- if (track->audio.channels > UINT16_MAX ||
- track->audio.bitdepth > UINT16_MAX) {
- av_log(matroska->ctx, AV_LOG_WARNING,
- "Too large audio channel number %"PRIu64
- " or bitdepth %"PRIu64". Skipping track.\n",
- track->audio.channels, track->audio.bitdepth);
- if (matroska->ctx->error_recognition & AV_EF_EXPLODE)
- return AVERROR_INVALIDDATA;
- else
- return SKIP_TRACK;
- }
- if (track->audio.out_samplerate < 0 || track->audio.out_samplerate > INT_MAX)
+ uint8_t *ptr;
+ if (track->audio.channels > UINT16_MAX ||
+ track->audio.bitdepth > UINT16_MAX) {
+ av_log(matroska->ctx, AV_LOG_WARNING,
+ "Too large audio channel number %"PRIu64
+ " or bitdepth %"PRIu64". Skipping track.\n",
+ track->audio.channels, track->audio.bitdepth);
+ if (matroska->ctx->error_recognition & AV_EF_EXPLODE)
return AVERROR_INVALIDDATA;
- extradata_size = TTA_EXTRADATA_SIZE;
- ptr = extradata;
- bytestream_put_be32(&ptr, AV_RB32("TTA1"));
- bytestream_put_le16(&ptr, 1);
- bytestream_put_le16(&ptr, track->audio.channels);
- bytestream_put_le16(&ptr, track->audio.bitdepth);
- bytestream_put_le32(&ptr, track->audio.out_samplerate);
- bytestream_put_le32(&ptr, av_rescale(matroska->duration * matroska->time_scale,
- track->audio.out_samplerate,
- AV_TIME_BASE * 1000));
+ else
+ return SKIP_TRACK;
+ }
+ if (track->audio.out_samplerate < 0 || track->audio.out_samplerate > INT_MAX)
+ return AVERROR_INVALIDDATA;
+ extradata_size = TTA_EXTRADATA_SIZE;
+ ptr = extradata;
+ bytestream_put_be32(&ptr, AV_RB32("TTA1"));
+ bytestream_put_le16(&ptr, 1);
+ bytestream_put_le16(&ptr, track->audio.channels);
+ bytestream_put_le16(&ptr, track->audio.bitdepth);
+ bytestream_put_le32(&ptr, track->audio.out_samplerate);
+ bytestream_put_le32(&ptr, av_rescale(matroska->duration * matroska->time_scale,
+ track->audio.out_samplerate,
+ AV_TIME_BASE * 1000));
break;
}
case AV_CODEC_ID_RA_144:
- track->audio.out_samplerate = 8000;
- track->audio.channels = 1;
+ track->audio.out_samplerate = 8000;
+ track->audio.channels = 1;
break;
case AV_CODEC_ID_RA_288:
case AV_CODEC_ID_COOK:
case AV_CODEC_ID_ATRAC3:
case AV_CODEC_ID_SIPR:
{
- const uint8_t *ptr = track->codec_priv.data;
- int flavor;
+ const uint8_t *ptr = track->codec_priv.data;
+ int flavor;
if (!track->codec_priv.size)
break;
- if (track->codec_priv.size < 46)
- return AVERROR_INVALIDDATA;
- ptr += 22;
- flavor = bytestream_get_be16(&ptr);
- track->audio.coded_framesize = bytestream_get_be32(&ptr);
- ptr += 12;
- track->audio.sub_packet_h = bytestream_get_be16(&ptr);
- track->audio.frame_size = bytestream_get_be16(&ptr);
- track->audio.sub_packet_size = bytestream_get_be16(&ptr);
- if (track->audio.coded_framesize <= 0 ||
- track->audio.sub_packet_h <= 0 ||
- track->audio.frame_size <= 0)
- return AVERROR_INVALIDDATA;
+ if (track->codec_priv.size < 46)
+ return AVERROR_INVALIDDATA;
+ ptr += 22;
+ flavor = bytestream_get_be16(&ptr);
+ track->audio.coded_framesize = bytestream_get_be32(&ptr);
+ ptr += 12;
+ track->audio.sub_packet_h = bytestream_get_be16(&ptr);
+ track->audio.frame_size = bytestream_get_be16(&ptr);
+ track->audio.sub_packet_size = bytestream_get_be16(&ptr);
+ if (track->audio.coded_framesize <= 0 ||
+ track->audio.sub_packet_h <= 0 ||
+ track->audio.frame_size <= 0)
+ return AVERROR_INVALIDDATA;
- if (par->codec_id == AV_CODEC_ID_RA_288) {
- if (track->audio.sub_packet_h & 1 || 2 * track->audio.frame_size
- != (int64_t)track->audio.sub_packet_h * track->audio.coded_framesize)
- return AVERROR_INVALIDDATA;
- par->block_align = track->audio.coded_framesize;
- track->codec_priv.size = 0;
- } else {
- if (par->codec_id == AV_CODEC_ID_SIPR) {
- static const int sipr_bit_rate[4] = { 6504, 8496, 5000, 16000 };
- if (flavor > 3)
- return AVERROR_INVALIDDATA;
- track->audio.sub_packet_size = ff_sipr_subpk_size[flavor];
- par->bit_rate = sipr_bit_rate[flavor];
- } else if (track->audio.sub_packet_size <= 0 ||
- track->audio.frame_size % track->audio.sub_packet_size)
+ if (par->codec_id == AV_CODEC_ID_RA_288) {
+ if (track->audio.sub_packet_h & 1 || 2 * track->audio.frame_size
+ != (int64_t)track->audio.sub_packet_h * track->audio.coded_framesize)
+ return AVERROR_INVALIDDATA;
+ par->block_align = track->audio.coded_framesize;
+ track->codec_priv.size = 0;
+ } else {
+ if (par->codec_id == AV_CODEC_ID_SIPR) {
+ static const int sipr_bit_rate[4] = { 6504, 8496, 5000, 16000 };
+ if (flavor > 3)
return AVERROR_INVALIDDATA;
- par->block_align = track->audio.sub_packet_size;
- *extradata_offset = 78;
- }
- track->audio.buf = av_malloc_array(track->audio.sub_packet_h,
- track->audio.frame_size);
- if (!track->audio.buf)
- return AVERROR(ENOMEM);
+ track->audio.sub_packet_size = ff_sipr_subpk_size[flavor];
+ par->bit_rate = sipr_bit_rate[flavor];
+ } else if (track->audio.sub_packet_size <= 0 ||
+ track->audio.frame_size % track->audio.sub_packet_size)
+ return AVERROR_INVALIDDATA;
+ par->block_align = track->audio.sub_packet_size;
+ *extradata_offset = 78;
+ }
+ track->audio.buf = av_malloc_array(track->audio.sub_packet_h,
+ track->audio.frame_size);
+ if (!track->audio.buf)
+ return AVERROR(ENOMEM);
break;
}
case AV_CODEC_ID_FLAC:
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 09/20] avformat/matroskadec: Factor video parsing out of matroska_parse_tracks()
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (6 preceding siblings ...)
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 08/20] avformat/matroskadec: Reindent after the previous commit Andreas Rheinhardt
@ 2023-09-04 11:27 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 10/20] avformat/matroskadec: Reindent after the previous commit Andreas Rheinhardt
` (11 subsequent siblings)
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
More exactly, factor codec-specific video parsing out of
matroska_parse_tracks(). This is intended to improve readability.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 120 +++++++++++++++++++++++---------------
1 file changed, 72 insertions(+), 48 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index e9ad0c7e11..3348ce161e 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2734,6 +2734,75 @@ static int mka_parse_audio_codec(MatroskaTrack *track, AVCodecParameters *par,
return 0;
}
+/* Performs the codec-specific part of parsing a video track. */
+static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par,
+ const MatroskaDemuxContext *matroska,
+ int *extradata_offset)
+{
+ if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") &&
+ track->codec_priv.size >= 40) {
+ track->ms_compat = 1;
+ par->bits_per_coded_sample = AV_RL16(track->codec_priv.data + 14);
+ par->codec_tag = AV_RL32(track->codec_priv.data + 16);
+ par->codec_id = ff_codec_get_id(ff_codec_bmp_tags,
+ par->codec_tag);
+ if (!par->codec_id)
+ par->codec_id = ff_codec_get_id(ff_codec_movvideo_tags,
+ par->codec_tag);
+ *extradata_offset = 40;
+ return 0;
+ } else if (!strcmp(track->codec_id, "V_QUICKTIME") &&
+ track->codec_priv.size >= 21) {
+ enum AVCodecID codec_id;
+ uint32_t fourcc;
+ int ret = get_qt_codec(track, &fourcc, &codec_id);
+ if (ret < 0)
+ return ret;
+ if (codec_id == AV_CODEC_ID_NONE && AV_RL32(track->codec_priv.data+4) == AV_RL32("SMI ")) {
+ fourcc = MKTAG('S','V','Q','3');
+ codec_id = ff_codec_get_id(ff_codec_movvideo_tags, fourcc);
+ }
+ par->codec_id = codec_id;
+ if (codec_id == AV_CODEC_ID_NONE)
+ av_log(matroska->ctx, AV_LOG_ERROR,
+ "mov FourCC not found %s.\n", av_fourcc2str(fourcc));
+ if (track->codec_priv.size >= 86) {
+ FFIOContext b;
+ unsigned bit_depth = AV_RB16(track->codec_priv.data + 82);
+ ffio_init_context(&b, track->codec_priv.data,
+ track->codec_priv.size,
+ 0, NULL, NULL, NULL, NULL);
+ if (ff_get_qtpalette(codec_id, &b.pub, track->palette)) {
+ bit_depth &= 0x1F;
+ track->has_palette = 1;
+ }
+ par->bits_per_coded_sample = bit_depth;
+ }
+ par->codec_tag = fourcc;
+ return 0;
+ }
+
+ switch (par->codec_id) {
+ case AV_CODEC_ID_RV10:
+ case AV_CODEC_ID_RV20:
+ case AV_CODEC_ID_RV30:
+ case AV_CODEC_ID_RV40:
+ *extradata_offset = 26;
+ break;
+ case AV_CODEC_ID_PRORES:
+ if (track->codec_priv.size == 4)
+ par->codec_tag = AV_RL32(track->codec_priv.data);
+ break;
+ case AV_CODEC_ID_VP9:
+ /* we don't need any value stored in CodecPrivate.
+ make sure that it's not exported as extradata. */
+ track->codec_priv.size = 0;
+ break;
+ }
+
+ return 0;
+}
+
static int matroska_parse_tracks(AVFormatContext *s)
{
MatroskaDemuxContext *matroska = s->priv_data;
@@ -2749,7 +2818,6 @@ static int matroska_parse_tracks(AVFormatContext *s)
AVCodecParameters *par;
int extradata_offset = 0;
uint32_t fourcc = 0;
- FFIOContext b;
AVStream *st;
FFStream *sti;
char* key_id_base64 = NULL;
@@ -2934,55 +3002,11 @@ static int matroska_parse_tracks(AVFormatContext *s)
return ret;
if (ret == SKIP_TRACK)
continue;
- } else
- if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") &&
- track->codec_priv.size >= 40) {
- track->ms_compat = 1;
- par->bits_per_coded_sample = AV_RL16(track->codec_priv.data + 14);
- par->codec_tag = AV_RL32(track->codec_priv.data + 16);
- par->codec_id = ff_codec_get_id(ff_codec_bmp_tags,
- par->codec_tag);
- if (!par->codec_id)
- par->codec_id = ff_codec_get_id(ff_codec_movvideo_tags,
- par->codec_tag);
- extradata_offset = 40;
- } else if (!strcmp(track->codec_id, "V_QUICKTIME") &&
- track->codec_priv.size >= 21) {
- uint32_t fourcc;
- int ret = get_qt_codec(track, &fourcc, &codec_id);
+ } else if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
+ ret = mkv_parse_video_codec(track, par, matroska,
+ &extradata_offset);
if (ret < 0)
return ret;
- if (codec_id == AV_CODEC_ID_NONE && AV_RL32(track->codec_priv.data+4) == AV_RL32("SMI ")) {
- fourcc = MKTAG('S','V','Q','3');
- codec_id = ff_codec_get_id(ff_codec_movvideo_tags, fourcc);
- }
- par->codec_id = codec_id;
- if (codec_id == AV_CODEC_ID_NONE)
- av_log(matroska->ctx, AV_LOG_ERROR,
- "mov FourCC not found %s.\n", av_fourcc2str(fourcc));
- if (track->codec_priv.size >= 86) {
- unsigned bit_depth = AV_RB16(track->codec_priv.data + 82);
- ffio_init_context(&b, track->codec_priv.data,
- track->codec_priv.size,
- 0, NULL, NULL, NULL, NULL);
- if (ff_get_qtpalette(codec_id, &b.pub, track->palette)) {
- bit_depth &= 0x1F;
- track->has_palette = 1;
- }
- par->bits_per_coded_sample = bit_depth;
- }
- par->codec_tag = fourcc;
- } else if (codec_id == AV_CODEC_ID_RV10 ||
- codec_id == AV_CODEC_ID_RV20 ||
- codec_id == AV_CODEC_ID_RV30 ||
- codec_id == AV_CODEC_ID_RV40) {
- extradata_offset = 26;
- } else if (codec_id == AV_CODEC_ID_PRORES && track->codec_priv.size == 4) {
- par->codec_tag = AV_RL32(track->codec_priv.data);
- } else if (codec_id == AV_CODEC_ID_VP9) {
- /* we don't need any value stored in CodecPrivate.
- make sure that it's not exported as extradata. */
- track->codec_priv.size = 0;
} else if (codec_id == AV_CODEC_ID_ARIB_CAPTION && track->codec_priv.size == 3) {
int component_tag = track->codec_priv.data[0];
int data_component_id = AV_RB16(track->codec_priv.data + 1);
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 10/20] avformat/matroskadec: Reindent after the previous commit
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (7 preceding siblings ...)
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 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 11/20] avformat/matroskadec: Move reading color space to a better place Andreas Rheinhardt
` (10 subsequent siblings)
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 86 +++++++++++++++++++--------------------
1 file changed, 43 insertions(+), 43 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 3348ce161e..854b225c9e 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2739,48 +2739,48 @@ static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par,
const MatroskaDemuxContext *matroska,
int *extradata_offset)
{
- if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") &&
- track->codec_priv.size >= 40) {
- track->ms_compat = 1;
- par->bits_per_coded_sample = AV_RL16(track->codec_priv.data + 14);
- par->codec_tag = AV_RL32(track->codec_priv.data + 16);
- par->codec_id = ff_codec_get_id(ff_codec_bmp_tags,
- par->codec_tag);
- if (!par->codec_id)
- par->codec_id = ff_codec_get_id(ff_codec_movvideo_tags,
- par->codec_tag);
- *extradata_offset = 40;
- return 0;
- } else if (!strcmp(track->codec_id, "V_QUICKTIME") &&
- track->codec_priv.size >= 21) {
- enum AVCodecID codec_id;
- uint32_t fourcc;
- int ret = get_qt_codec(track, &fourcc, &codec_id);
- if (ret < 0)
- return ret;
- if (codec_id == AV_CODEC_ID_NONE && AV_RL32(track->codec_priv.data+4) == AV_RL32("SMI ")) {
- fourcc = MKTAG('S','V','Q','3');
- codec_id = ff_codec_get_id(ff_codec_movvideo_tags, fourcc);
- }
- par->codec_id = codec_id;
- if (codec_id == AV_CODEC_ID_NONE)
- av_log(matroska->ctx, AV_LOG_ERROR,
- "mov FourCC not found %s.\n", av_fourcc2str(fourcc));
- if (track->codec_priv.size >= 86) {
- FFIOContext b;
- unsigned bit_depth = AV_RB16(track->codec_priv.data + 82);
- ffio_init_context(&b, track->codec_priv.data,
- track->codec_priv.size,
- 0, NULL, NULL, NULL, NULL);
- if (ff_get_qtpalette(codec_id, &b.pub, track->palette)) {
- bit_depth &= 0x1F;
- track->has_palette = 1;
- }
- par->bits_per_coded_sample = bit_depth;
+ if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") &&
+ track->codec_priv.size >= 40) {
+ track->ms_compat = 1;
+ par->bits_per_coded_sample = AV_RL16(track->codec_priv.data + 14);
+ par->codec_tag = AV_RL32(track->codec_priv.data + 16);
+ par->codec_id = ff_codec_get_id(ff_codec_bmp_tags,
+ par->codec_tag);
+ if (!par->codec_id)
+ par->codec_id = ff_codec_get_id(ff_codec_movvideo_tags,
+ par->codec_tag);
+ *extradata_offset = 40;
+ return 0;
+ } else if (!strcmp(track->codec_id, "V_QUICKTIME") &&
+ track->codec_priv.size >= 21) {
+ enum AVCodecID codec_id;
+ uint32_t fourcc;
+ int ret = get_qt_codec(track, &fourcc, &codec_id);
+ if (ret < 0)
+ return ret;
+ if (codec_id == AV_CODEC_ID_NONE && AV_RL32(track->codec_priv.data+4) == AV_RL32("SMI ")) {
+ fourcc = MKTAG('S','V','Q','3');
+ codec_id = ff_codec_get_id(ff_codec_movvideo_tags, fourcc);
+ }
+ par->codec_id = codec_id;
+ if (codec_id == AV_CODEC_ID_NONE)
+ av_log(matroska->ctx, AV_LOG_ERROR,
+ "mov FourCC not found %s.\n", av_fourcc2str(fourcc));
+ if (track->codec_priv.size >= 86) {
+ FFIOContext b;
+ unsigned bit_depth = AV_RB16(track->codec_priv.data + 82);
+ ffio_init_context(&b, track->codec_priv.data,
+ track->codec_priv.size,
+ 0, NULL, NULL, NULL, NULL);
+ if (ff_get_qtpalette(codec_id, &b.pub, track->palette)) {
+ bit_depth &= 0x1F;
+ track->has_palette = 1;
}
- par->codec_tag = fourcc;
- return 0;
+ par->bits_per_coded_sample = bit_depth;
}
+ par->codec_tag = fourcc;
+ return 0;
+ }
switch (par->codec_id) {
case AV_CODEC_ID_RV10:
@@ -2794,9 +2794,9 @@ static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par,
par->codec_tag = AV_RL32(track->codec_priv.data);
break;
case AV_CODEC_ID_VP9:
- /* we don't need any value stored in CodecPrivate.
- make sure that it's not exported as extradata. */
- track->codec_priv.size = 0;
+ /* we don't need any value stored in CodecPrivate.
+ * make sure that it's not exported as extradata. */
+ track->codec_priv.size = 0;
break;
}
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 11/20] avformat/matroskadec: Move reading color space to a better place
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (8 preceding siblings ...)
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 10/20] avformat/matroskadec: Reindent after the previous commit Andreas Rheinhardt
@ 2023-09-04 11:27 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 12/20] avformat/matroskadec: Avoid clobbering CodecPrivate size Andreas Rheinhardt
` (9 subsequent siblings)
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
Namely to a place after the AVStream has already been created,
so that it can be directly attached to it.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 854b225c9e..21a0a1ecd5 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2817,7 +2817,6 @@ static int matroska_parse_tracks(AVFormatContext *s)
MatroskaTrackEncoding *encodings = encodings_list->elem;
AVCodecParameters *par;
int extradata_offset = 0;
- uint32_t fourcc = 0;
AVStream *st;
FFStream *sti;
char* key_id_base64 = NULL;
@@ -2867,8 +2866,6 @@ static int matroska_parse_tracks(AVFormatContext *s)
track->video.display_width = track->video.pixel_width;
if (track->video.display_height == -1)
track->video.display_height = track->video.pixel_height;
- if (track->video.color_space.size == 4)
- fourcc = AV_RL32(track->video.color_space.data);
} else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
if (!track->audio.out_samplerate)
track->audio.out_samplerate = track->audio.samplerate;
@@ -2955,7 +2952,6 @@ static int matroska_parse_tracks(AVFormatContext *s)
par = st->codecpar;
par->codec_id = codec_id;
- par->codec_tag = fourcc;
if (track->flag_default)
st->disposition |= AV_DISPOSITION_DEFAULT;
@@ -3003,6 +2999,9 @@ static int matroska_parse_tracks(AVFormatContext *s)
if (ret == SKIP_TRACK)
continue;
} else if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
+ if (track->video.color_space.size == 4)
+ par->codec_tag = AV_RL32(track->video.color_space.data);
+
ret = mkv_parse_video_codec(track, par, matroska,
&extradata_offset);
if (ret < 0)
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 12/20] avformat/matroskadec: Avoid clobbering CodecPrivate size
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (9 preceding siblings ...)
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 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 13/20] avformat/matroskadec: Use av_dict_set_int() where appropriate Andreas Rheinhardt
` (8 subsequent siblings)
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 21a0a1ecd5..147a146873 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -3036,15 +3036,14 @@ static int matroska_parse_tracks(AVFormatContext *s)
track->codec_priv.size = 0;
}
- track->codec_priv.size -= extradata_offset;
if (par->codec_id == AV_CODEC_ID_NONE)
av_log(matroska->ctx, AV_LOG_INFO,
"Unknown/unsupported AVCodecID %s.\n", track->codec_id);
- if (!par->extradata && track->codec_priv.size > 0) {
+ if (!par->extradata && track->codec_priv.size > extradata_offset) {
const uint8_t *src = track->codec_priv.data + extradata_offset;
- unsigned extra_size = track->codec_priv.size;
+ unsigned extra_size = track->codec_priv.size - extradata_offset;
ret = ff_alloc_extradata(par, extra_size);
if (ret < 0)
return ret;
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 13/20] avformat/matroskadec: Use av_dict_set_int() where appropriate
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (10 preceding siblings ...)
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 12/20] avformat/matroskadec: Avoid clobbering CodecPrivate size Andreas Rheinhardt
@ 2023-09-04 11:27 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 14/20] avformat/matroskadec: Factor parsing subtitle codecs out Andreas Rheinhardt
` (7 subsequent siblings)
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 147a146873..ee546bfffb 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -3097,7 +3097,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
/* export alpha mode flag as metadata tag */
if (track->video.alpha_mode)
- av_dict_set(&st->metadata, "alpha_mode", "1", 0);
+ av_dict_set_int(&st->metadata, "alpha_mode", 1, 0);
/* if we have virtual track, mark the real tracks */
for (j=0; j < track->operation.combine_planes.nb_elem; j++) {
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 14/20] avformat/matroskadec: Factor parsing subtitle codecs out
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (11 preceding siblings ...)
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 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 15/20] avformat/matroskadec: Factor generic parsing of video tracks out Andreas Rheinhardt
` (6 subsequent siblings)
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 75 ++++++++++++++++++++++++---------------
1 file changed, 46 insertions(+), 29 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index ee546bfffb..97e944df7c 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2803,6 +2803,48 @@ static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par,
return 0;
}
+/* Performs the codec-specific part of parsing a subtitle track. */
+static int mkv_parse_subtitle_codec(MatroskaTrack *track, AVCodecParameters *par,
+ const MatroskaDemuxContext *matroska)
+{
+ switch (par->codec_id) {
+ case AV_CODEC_ID_ARIB_CAPTION:
+ if (track->codec_priv.size == 3) {
+ int component_tag = track->codec_priv.data[0];
+ int data_component_id = AV_RB16(track->codec_priv.data + 1);
+
+ switch (data_component_id) {
+ case 0x0008:
+ // [0x30..0x37] are component tags utilized for
+ // non-mobile captioning service ("profile A").
+ if (component_tag >= 0x30 && component_tag <= 0x37) {
+ par->profile = FF_PROFILE_ARIB_PROFILE_A;
+ }
+ break;
+ case 0x0012:
+ // component tag 0x87 signifies a mobile/partial reception
+ // (1seg) captioning service ("profile C").
+ if (component_tag == 0x87) {
+ par->profile = FF_PROFILE_ARIB_PROFILE_C;
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (par->profile == FF_PROFILE_UNKNOWN)
+ av_log(matroska->ctx, AV_LOG_WARNING,
+ "Unknown ARIB caption profile utilized: %02x / %04x\n",
+ component_tag, data_component_id);
+
+ track->codec_priv.size = 0;
+ }
+ break;
+ }
+
+ return 0;
+}
+
static int matroska_parse_tracks(AVFormatContext *s)
{
MatroskaDemuxContext *matroska = s->priv_data;
@@ -3006,35 +3048,10 @@ static int matroska_parse_tracks(AVFormatContext *s)
&extradata_offset);
if (ret < 0)
return ret;
- } else if (codec_id == AV_CODEC_ID_ARIB_CAPTION && track->codec_priv.size == 3) {
- int component_tag = track->codec_priv.data[0];
- int data_component_id = AV_RB16(track->codec_priv.data + 1);
-
- switch (data_component_id) {
- case 0x0008:
- // [0x30..0x37] are component tags utilized for
- // non-mobile captioning service ("profile A").
- if (component_tag >= 0x30 && component_tag <= 0x37) {
- par->profile = FF_PROFILE_ARIB_PROFILE_A;
- }
- break;
- case 0x0012:
- // component tag 0x87 signifies a mobile/partial reception
- // (1seg) captioning service ("profile C").
- if (component_tag == 0x87) {
- par->profile = FF_PROFILE_ARIB_PROFILE_C;
- }
- break;
- default:
- break;
- }
-
- if (par->profile == FF_PROFILE_UNKNOWN)
- av_log(matroska->ctx, AV_LOG_WARNING,
- "Unknown ARIB caption profile utilized: %02x / %04x\n",
- component_tag, data_component_id);
-
- track->codec_priv.size = 0;
+ } else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) {
+ ret = mkv_parse_subtitle_codec(track, par, matroska);
+ if (ret < 0)
+ return ret;
}
if (par->codec_id == AV_CODEC_ID_NONE)
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 15/20] avformat/matroskadec: Factor generic parsing of video tracks out
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (12 preceding siblings ...)
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 14/20] avformat/matroskadec: Factor parsing subtitle codecs out Andreas Rheinhardt
@ 2023-09-04 11:27 ` 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
` (5 subsequent siblings)
19 siblings, 1 reply; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
Out of matroska_parse_tracks(), that is.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 188 +++++++++++++++++++++-----------------
1 file changed, 102 insertions(+), 86 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 97e944df7c..ec6ecb33cc 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2111,7 +2111,7 @@ static int matroska_parse_flac(AVFormatContext *s,
return 0;
}
-static int mkv_field_order(MatroskaDemuxContext *matroska, uint64_t field_order)
+static int mkv_field_order(const MatroskaDemuxContext *matroska, uint64_t field_order)
{
int minor, micro, bttb = 0;
@@ -2803,6 +2803,105 @@ static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par,
return 0;
}
+/* Performs the generic part of parsing a video track. */
+static int mkv_parse_video(MatroskaTrack *track, AVStream *st,
+ AVCodecParameters *par,
+ const MatroskaDemuxContext *matroska,
+ int *extradata_offset)
+{
+ FFStream *const sti = ffstream(st);
+ MatroskaTrackPlane *planes = track->operation.combine_planes.elem;
+ int display_width_mul = 1;
+ int display_height_mul = 1;
+ int ret;
+
+ if (track->video.color_space.size == 4)
+ par->codec_tag = AV_RL32(track->video.color_space.data);
+
+ ret = mkv_parse_video_codec(track, par, matroska,
+ extradata_offset);
+ if (ret < 0)
+ return ret;
+
+
+ par->codec_type = AVMEDIA_TYPE_VIDEO;
+ par->width = track->video.pixel_width;
+ par->height = track->video.pixel_height;
+
+ if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED)
+ par->field_order = mkv_field_order(matroska, track->video.field_order);
+ else if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE)
+ par->field_order = AV_FIELD_PROGRESSIVE;
+
+ if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
+ mkv_stereo_mode_display_mul(track->video.stereo_mode, &display_width_mul, &display_height_mul);
+
+ if (track->video.display_unit < MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN) {
+ if (track->video.display_width && track->video.display_height &&
+ par->height < INT64_MAX / track->video.display_width / display_width_mul &&
+ par->width < INT64_MAX / track->video.display_height / display_height_mul)
+ av_reduce(&st->sample_aspect_ratio.num,
+ &st->sample_aspect_ratio.den,
+ par->height * track->video.display_width * display_width_mul,
+ par->width * track->video.display_height * display_height_mul,
+ INT_MAX);
+ }
+ if (par->codec_id != AV_CODEC_ID_HEVC)
+ sti->need_parsing = AVSTREAM_PARSE_HEADERS;
+
+ if (track->default_duration) {
+ int div = track->default_duration <= INT64_MAX ? 1 : 2;
+ av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
+ 1000000000 / div, track->default_duration / div, 30000);
+#if FF_API_R_FRAME_RATE
+ if ( st->avg_frame_rate.num < st->avg_frame_rate.den * 1000LL
+ && st->avg_frame_rate.num > st->avg_frame_rate.den * 5LL)
+ st->r_frame_rate = st->avg_frame_rate;
+#endif
+ }
+
+ /* export stereo mode flag as metadata tag */
+ if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
+ av_dict_set(&st->metadata, "stereo_mode", ff_matroska_video_stereo_mode[track->video.stereo_mode], 0);
+
+ /* export alpha mode flag as metadata tag */
+ if (track->video.alpha_mode)
+ av_dict_set_int(&st->metadata, "alpha_mode", 1, 0);
+
+ /* if we have virtual track, mark the real tracks */
+ for (int j = 0; j < track->operation.combine_planes.nb_elem; j++) {
+ MatroskaTrack *tracks = matroska->tracks.elem;
+ char buf[32];
+ if (planes[j].type >= MATROSKA_VIDEO_STEREO_PLANE_COUNT)
+ continue;
+ snprintf(buf, sizeof(buf), "%s_%d",
+ matroska_video_stereo_plane[planes[j].type], st->index);
+ for (int k = 0; k < matroska->tracks.nb_elem; k++)
+ if (planes[j].uid == tracks[k].uid && tracks[k].stream) {
+ av_dict_set(&tracks[k].stream->metadata,
+ "stereo_mode", buf, 0);
+ break;
+ }
+ }
+ // add stream level stereo3d side data if it is a supported format
+ if (track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB &&
+ track->video.stereo_mode != MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_CYAN_RED &&
+ track->video.stereo_mode != MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_GREEN_MAG) {
+ int ret = mkv_stereo3d_conv(st, track->video.stereo_mode);
+ if (ret < 0)
+ return ret;
+ }
+
+ ret = mkv_parse_video_color(st, track);
+ if (ret < 0)
+ return ret;
+ ret = mkv_parse_video_projection(st, track, matroska->ctx);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+}
+
/* Performs the codec-specific part of parsing a subtitle track. */
static int mkv_parse_subtitle_codec(MatroskaTrack *track, AVCodecParameters *par,
const MatroskaDemuxContext *matroska)
@@ -2850,7 +2949,6 @@ static int matroska_parse_tracks(AVFormatContext *s)
MatroskaDemuxContext *matroska = s->priv_data;
MatroskaTrack *tracks = matroska->tracks.elem;
int i, j, ret;
- int k;
for (i = 0; i < matroska->tracks.nb_elem; i++) {
MatroskaTrack *track = &tracks[i];
@@ -3041,11 +3139,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
if (ret == SKIP_TRACK)
continue;
} else if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
- if (track->video.color_space.size == 4)
- par->codec_tag = AV_RL32(track->video.color_space.data);
-
- ret = mkv_parse_video_codec(track, par, matroska,
- &extradata_offset);
+ ret = mkv_parse_video(track, st, par, matroska, &extradata_offset);
if (ret < 0)
return ret;
} else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) {
@@ -3067,85 +3161,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
memcpy(par->extradata, src, extra_size);
}
- if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
- MatroskaTrackPlane *planes = track->operation.combine_planes.elem;
- int display_width_mul = 1;
- int display_height_mul = 1;
-
- par->codec_type = AVMEDIA_TYPE_VIDEO;
- par->width = track->video.pixel_width;
- par->height = track->video.pixel_height;
-
- if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED)
- par->field_order = mkv_field_order(matroska, track->video.field_order);
- else if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE)
- par->field_order = AV_FIELD_PROGRESSIVE;
-
- if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
- mkv_stereo_mode_display_mul(track->video.stereo_mode, &display_width_mul, &display_height_mul);
-
- if (track->video.display_unit < MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN) {
- if (track->video.display_width && track->video.display_height &&
- par->height < INT64_MAX / track->video.display_width / display_width_mul &&
- par->width < INT64_MAX / track->video.display_height / display_height_mul)
- av_reduce(&st->sample_aspect_ratio.num,
- &st->sample_aspect_ratio.den,
- par->height * track->video.display_width * display_width_mul,
- par->width * track->video.display_height * display_height_mul,
- INT_MAX);
- }
- if (par->codec_id != AV_CODEC_ID_HEVC)
- sti->need_parsing = AVSTREAM_PARSE_HEADERS;
-
- if (track->default_duration) {
- int div = track->default_duration <= INT64_MAX ? 1 : 2;
- av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
- 1000000000 / div, track->default_duration / div, 30000);
-#if FF_API_R_FRAME_RATE
- if ( st->avg_frame_rate.num < st->avg_frame_rate.den * 1000LL
- && st->avg_frame_rate.num > st->avg_frame_rate.den * 5LL)
- st->r_frame_rate = st->avg_frame_rate;
-#endif
- }
-
- /* export stereo mode flag as metadata tag */
- if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
- av_dict_set(&st->metadata, "stereo_mode", ff_matroska_video_stereo_mode[track->video.stereo_mode], 0);
-
- /* export alpha mode flag as metadata tag */
- if (track->video.alpha_mode)
- av_dict_set_int(&st->metadata, "alpha_mode", 1, 0);
-
- /* if we have virtual track, mark the real tracks */
- for (j=0; j < track->operation.combine_planes.nb_elem; j++) {
- char buf[32];
- if (planes[j].type >= MATROSKA_VIDEO_STEREO_PLANE_COUNT)
- continue;
- snprintf(buf, sizeof(buf), "%s_%d",
- matroska_video_stereo_plane[planes[j].type], i);
- for (k=0; k < matroska->tracks.nb_elem; k++)
- if (planes[j].uid == tracks[k].uid && tracks[k].stream) {
- av_dict_set(&tracks[k].stream->metadata,
- "stereo_mode", buf, 0);
- break;
- }
- }
- // add stream level stereo3d side data if it is a supported format
- if (track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB &&
- track->video.stereo_mode != MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_CYAN_RED &&
- track->video.stereo_mode != MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_GREEN_MAG) {
- int ret = mkv_stereo3d_conv(st, track->video.stereo_mode);
- if (ret < 0)
- return ret;
- }
-
- ret = mkv_parse_video_color(st, track);
- if (ret < 0)
- return ret;
- ret = mkv_parse_video_projection(st, track, matroska->ctx);
- if (ret < 0)
- return ret;
- } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
+ if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
par->codec_type = AVMEDIA_TYPE_AUDIO;
par->sample_rate = track->audio.out_samplerate;
// channel layout may be already set by codec private checks above
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [FFmpeg-devel] [PATCH 15/20] avformat/matroskadec: Factor generic parsing of video tracks out
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
0 siblings, 0 replies; 22+ messages in thread
From: James Almer @ 2023-09-04 11:46 UTC (permalink / raw)
To: ffmpeg-devel
On 9/4/2023 8:27 AM, Andreas Rheinhardt wrote:
> Out of matroska_parse_tracks(), that is.
>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
> ---
> libavformat/matroskadec.c | 188 +++++++++++++++++++++-----------------
> 1 file changed, 102 insertions(+), 86 deletions(-)
>
> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> index 97e944df7c..ec6ecb33cc 100644
> --- a/libavformat/matroskadec.c
> +++ b/libavformat/matroskadec.c
> @@ -2111,7 +2111,7 @@ static int matroska_parse_flac(AVFormatContext *s,
> return 0;
> }
>
> -static int mkv_field_order(MatroskaDemuxContext *matroska, uint64_t field_order)
> +static int mkv_field_order(const MatroskaDemuxContext *matroska, uint64_t field_order)
> {
> int minor, micro, bttb = 0;
>
> @@ -2803,6 +2803,105 @@ static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par,
> return 0;
> }
>
> +/* Performs the generic part of parsing a video track. */
> +static int mkv_parse_video(MatroskaTrack *track, AVStream *st,
> + AVCodecParameters *par,
> + const MatroskaDemuxContext *matroska,
> + int *extradata_offset)
> +{
> + FFStream *const sti = ffstream(st);
> + MatroskaTrackPlane *planes = track->operation.combine_planes.elem;
> + int display_width_mul = 1;
> + int display_height_mul = 1;
> + int ret;
> +
> + if (track->video.color_space.size == 4)
> + par->codec_tag = AV_RL32(track->video.color_space.data);
> +
> + ret = mkv_parse_video_codec(track, par, matroska,
> + extradata_offset);
> + if (ret < 0)
> + return ret;
> +
> +
> + par->codec_type = AVMEDIA_TYPE_VIDEO;
> + par->width = track->video.pixel_width;
> + par->height = track->video.pixel_height;
> +
> + if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED)
> + par->field_order = mkv_field_order(matroska, track->video.field_order);
> + else if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE)
> + par->field_order = AV_FIELD_PROGRESSIVE;
> +
> + if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
> + mkv_stereo_mode_display_mul(track->video.stereo_mode, &display_width_mul, &display_height_mul);
> +
> + if (track->video.display_unit < MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN) {
> + if (track->video.display_width && track->video.display_height &&
> + par->height < INT64_MAX / track->video.display_width / display_width_mul &&
> + par->width < INT64_MAX / track->video.display_height / display_height_mul)
> + av_reduce(&st->sample_aspect_ratio.num,
> + &st->sample_aspect_ratio.den,
> + par->height * track->video.display_width * display_width_mul,
> + par->width * track->video.display_height * display_height_mul,
> + INT_MAX);
> + }
> + if (par->codec_id != AV_CODEC_ID_HEVC)
> + sti->need_parsing = AVSTREAM_PARSE_HEADERS;
> +
> + if (track->default_duration) {
> + int div = track->default_duration <= INT64_MAX ? 1 : 2;
> + av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
> + 1000000000 / div, track->default_duration / div, 30000);
> +#if FF_API_R_FRAME_RATE
> + if ( st->avg_frame_rate.num < st->avg_frame_rate.den * 1000LL
> + && st->avg_frame_rate.num > st->avg_frame_rate.den * 5LL)
> + st->r_frame_rate = st->avg_frame_rate;
> +#endif
> + }
> +
> + /* export stereo mode flag as metadata tag */
> + if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
> + av_dict_set(&st->metadata, "stereo_mode", ff_matroska_video_stereo_mode[track->video.stereo_mode], 0);
> +
> + /* export alpha mode flag as metadata tag */
> + if (track->video.alpha_mode)
> + av_dict_set_int(&st->metadata, "alpha_mode", 1, 0);
> +
> + /* if we have virtual track, mark the real tracks */
> + for (int j = 0; j < track->operation.combine_planes.nb_elem; j++) {
> + MatroskaTrack *tracks = matroska->tracks.elem;
> + char buf[32];
> + if (planes[j].type >= MATROSKA_VIDEO_STEREO_PLANE_COUNT)
> + continue;
> + snprintf(buf, sizeof(buf), "%s_%d",
> + matroska_video_stereo_plane[planes[j].type], st->index);
> + for (int k = 0; k < matroska->tracks.nb_elem; k++)
> + if (planes[j].uid == tracks[k].uid && tracks[k].stream) {
> + av_dict_set(&tracks[k].stream->metadata,
> + "stereo_mode", buf, 0);
> + break;
> + }
> + }
> + // add stream level stereo3d side data if it is a supported format
> + if (track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB &&
> + track->video.stereo_mode != MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_CYAN_RED &&
> + track->video.stereo_mode != MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_GREEN_MAG) {
> + int ret = mkv_stereo3d_conv(st, track->video.stereo_mode);
> + if (ret < 0)
> + return ret;
> + }
> +
> + ret = mkv_parse_video_color(st, track);
> + if (ret < 0)
> + return ret;
> + ret = mkv_parse_video_projection(st, track, matroska->ctx);
> + if (ret < 0)
> + return ret;
> +
> + return 0;
> +}
> +
> /* Performs the codec-specific part of parsing a subtitle track. */
> static int mkv_parse_subtitle_codec(MatroskaTrack *track, AVCodecParameters *par,
> const MatroskaDemuxContext *matroska)
> @@ -2850,7 +2949,6 @@ static int matroska_parse_tracks(AVFormatContext *s)
> MatroskaDemuxContext *matroska = s->priv_data;
> MatroskaTrack *tracks = matroska->tracks.elem;
> int i, j, ret;
> - int k;
>
> for (i = 0; i < matroska->tracks.nb_elem; i++) {
> MatroskaTrack *track = &tracks[i];
> @@ -3041,11 +3139,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
> if (ret == SKIP_TRACK)
> continue;
> } else if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
> - if (track->video.color_space.size == 4)
> - par->codec_tag = AV_RL32(track->video.color_space.data);
> -
> - ret = mkv_parse_video_codec(track, par, matroska,
> - &extradata_offset);
> + ret = mkv_parse_video(track, st, par, matroska, &extradata_offset);
> if (ret < 0)
> return ret;
> } else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) {
> @@ -3067,85 +3161,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
> memcpy(par->extradata, src, extra_size);
> }
>
> - if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
> - MatroskaTrackPlane *planes = track->operation.combine_planes.elem;
> - int display_width_mul = 1;
> - int display_height_mul = 1;
> -
> - par->codec_type = AVMEDIA_TYPE_VIDEO;
> - par->width = track->video.pixel_width;
> - par->height = track->video.pixel_height;
> -
> - if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED)
> - par->field_order = mkv_field_order(matroska, track->video.field_order);
> - else if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE)
> - par->field_order = AV_FIELD_PROGRESSIVE;
> -
> - if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
> - mkv_stereo_mode_display_mul(track->video.stereo_mode, &display_width_mul, &display_height_mul);
> -
> - if (track->video.display_unit < MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN) {
> - if (track->video.display_width && track->video.display_height &&
> - par->height < INT64_MAX / track->video.display_width / display_width_mul &&
> - par->width < INT64_MAX / track->video.display_height / display_height_mul)
> - av_reduce(&st->sample_aspect_ratio.num,
> - &st->sample_aspect_ratio.den,
> - par->height * track->video.display_width * display_width_mul,
> - par->width * track->video.display_height * display_height_mul,
> - INT_MAX);
> - }
> - if (par->codec_id != AV_CODEC_ID_HEVC)
> - sti->need_parsing = AVSTREAM_PARSE_HEADERS;
> -
> - if (track->default_duration) {
> - int div = track->default_duration <= INT64_MAX ? 1 : 2;
> - av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
> - 1000000000 / div, track->default_duration / div, 30000);
> -#if FF_API_R_FRAME_RATE
> - if ( st->avg_frame_rate.num < st->avg_frame_rate.den * 1000LL
> - && st->avg_frame_rate.num > st->avg_frame_rate.den * 5LL)
> - st->r_frame_rate = st->avg_frame_rate;
> -#endif
> - }
> -
> - /* export stereo mode flag as metadata tag */
> - if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
> - av_dict_set(&st->metadata, "stereo_mode", ff_matroska_video_stereo_mode[track->video.stereo_mode], 0);
> -
> - /* export alpha mode flag as metadata tag */
> - if (track->video.alpha_mode)
> - av_dict_set_int(&st->metadata, "alpha_mode", 1, 0);
> -
> - /* if we have virtual track, mark the real tracks */
> - for (j=0; j < track->operation.combine_planes.nb_elem; j++) {
> - char buf[32];
> - if (planes[j].type >= MATROSKA_VIDEO_STEREO_PLANE_COUNT)
> - continue;
> - snprintf(buf, sizeof(buf), "%s_%d",
> - matroska_video_stereo_plane[planes[j].type], i);
> - for (k=0; k < matroska->tracks.nb_elem; k++)
> - if (planes[j].uid == tracks[k].uid && tracks[k].stream) {
> - av_dict_set(&tracks[k].stream->metadata,
> - "stereo_mode", buf, 0);
> - break;
> - }
> - }
> - // add stream level stereo3d side data if it is a supported format
> - if (track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB &&
> - track->video.stereo_mode != MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_CYAN_RED &&
> - track->video.stereo_mode != MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_GREEN_MAG) {
> - int ret = mkv_stereo3d_conv(st, track->video.stereo_mode);
> - if (ret < 0)
> - return ret;
> - }
> -
> - ret = mkv_parse_video_color(st, track);
> - if (ret < 0)
> - return ret;
> - ret = mkv_parse_video_projection(st, track, matroska->ctx);
> - if (ret < 0)
> - return ret;
> - } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
> + if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
> par->codec_type = AVMEDIA_TYPE_AUDIO;
> par->sample_rate = track->audio.out_samplerate;
> // channel layout may be already set by codec private checks above
This and the next patch should be squashed. There's no gain in
legibility as you can see.
_______________________________________________
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 16/20] avformat/matroskadec: Reindent after the previous commit
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (13 preceding siblings ...)
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:27 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 17/20] avformat/matroskadec: Factor generic parsing of audio tracks out Andreas Rheinhardt
` (4 subsequent siblings)
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 157 +++++++++++++++++++-------------------
1 file changed, 79 insertions(+), 78 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index ec6ecb33cc..1bbdb6b980 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2810,94 +2810,95 @@ static int mkv_parse_video(MatroskaTrack *track, AVStream *st,
int *extradata_offset)
{
FFStream *const sti = ffstream(st);
- MatroskaTrackPlane *planes = track->operation.combine_planes.elem;
- int display_width_mul = 1;
- int display_height_mul = 1;
+ MatroskaTrackPlane *planes;
+ int display_width_mul = 1;
+ int display_height_mul = 1;
int ret;
- if (track->video.color_space.size == 4)
- par->codec_tag = AV_RL32(track->video.color_space.data);
+ if (track->video.color_space.size == 4)
+ par->codec_tag = AV_RL32(track->video.color_space.data);
- ret = mkv_parse_video_codec(track, par, matroska,
- extradata_offset);
- if (ret < 0)
- return ret;
-
-
- par->codec_type = AVMEDIA_TYPE_VIDEO;
- par->width = track->video.pixel_width;
- par->height = track->video.pixel_height;
-
- if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED)
- par->field_order = mkv_field_order(matroska, track->video.field_order);
- else if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE)
- par->field_order = AV_FIELD_PROGRESSIVE;
-
- if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
- mkv_stereo_mode_display_mul(track->video.stereo_mode, &display_width_mul, &display_height_mul);
+ ret = mkv_parse_video_codec(track, par, matroska,
+ extradata_offset);
+ if (ret < 0)
+ return ret;
- if (track->video.display_unit < MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN) {
- if (track->video.display_width && track->video.display_height &&
- par->height < INT64_MAX / track->video.display_width / display_width_mul &&
- par->width < INT64_MAX / track->video.display_height / display_height_mul)
- av_reduce(&st->sample_aspect_ratio.num,
- &st->sample_aspect_ratio.den,
- par->height * track->video.display_width * display_width_mul,
- par->width * track->video.display_height * display_height_mul,
- INT_MAX);
- }
- if (par->codec_id != AV_CODEC_ID_HEVC)
- sti->need_parsing = AVSTREAM_PARSE_HEADERS;
+ par->codec_type = AVMEDIA_TYPE_VIDEO;
+ par->width = track->video.pixel_width;
+ par->height = track->video.pixel_height;
+
+ if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED)
+ par->field_order = mkv_field_order(matroska, track->video.field_order);
+ else if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE)
+ par->field_order = AV_FIELD_PROGRESSIVE;
+
+ if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
+ mkv_stereo_mode_display_mul(track->video.stereo_mode,
+ &display_width_mul, &display_height_mul);
+
+ if (track->video.display_unit < MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN) {
+ if (track->video.display_width && track->video.display_height &&
+ par->height < INT64_MAX / track->video.display_width / display_width_mul &&
+ par->width < INT64_MAX / track->video.display_height / display_height_mul)
+ av_reduce(&st->sample_aspect_ratio.num,
+ &st->sample_aspect_ratio.den,
+ par->height * track->video.display_width * display_width_mul,
+ par->width * track->video.display_height * display_height_mul,
+ INT_MAX);
+ }
+ if (par->codec_id != AV_CODEC_ID_HEVC)
+ sti->need_parsing = AVSTREAM_PARSE_HEADERS;
- if (track->default_duration) {
- int div = track->default_duration <= INT64_MAX ? 1 : 2;
- av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
- 1000000000 / div, track->default_duration / div, 30000);
+ if (track->default_duration) {
+ int div = track->default_duration <= INT64_MAX ? 1 : 2;
+ av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
+ 1000000000 / div, track->default_duration / div, 30000);
#if FF_API_R_FRAME_RATE
- if ( st->avg_frame_rate.num < st->avg_frame_rate.den * 1000LL
- && st->avg_frame_rate.num > st->avg_frame_rate.den * 5LL)
- st->r_frame_rate = st->avg_frame_rate;
+ if ( st->avg_frame_rate.num < st->avg_frame_rate.den * 1000LL
+ && st->avg_frame_rate.num > st->avg_frame_rate.den * 5LL)
+ st->r_frame_rate = st->avg_frame_rate;
#endif
- }
+ }
- /* export stereo mode flag as metadata tag */
- if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
- av_dict_set(&st->metadata, "stereo_mode", ff_matroska_video_stereo_mode[track->video.stereo_mode], 0);
-
- /* export alpha mode flag as metadata tag */
- if (track->video.alpha_mode)
- av_dict_set_int(&st->metadata, "alpha_mode", 1, 0);
-
- /* if we have virtual track, mark the real tracks */
- for (int j = 0; j < track->operation.combine_planes.nb_elem; j++) {
- MatroskaTrack *tracks = matroska->tracks.elem;
- char buf[32];
- if (planes[j].type >= MATROSKA_VIDEO_STEREO_PLANE_COUNT)
- continue;
- snprintf(buf, sizeof(buf), "%s_%d",
- matroska_video_stereo_plane[planes[j].type], st->index);
- for (int k = 0; k < matroska->tracks.nb_elem; k++)
- if (planes[j].uid == tracks[k].uid && tracks[k].stream) {
- av_dict_set(&tracks[k].stream->metadata,
- "stereo_mode", buf, 0);
- break;
- }
- }
- // add stream level stereo3d side data if it is a supported format
- if (track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB &&
- track->video.stereo_mode != MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_CYAN_RED &&
- track->video.stereo_mode != MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_GREEN_MAG) {
- int ret = mkv_stereo3d_conv(st, track->video.stereo_mode);
- if (ret < 0)
- return ret;
+ /* export stereo mode flag as metadata tag */
+ if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
+ av_dict_set(&st->metadata, "stereo_mode", ff_matroska_video_stereo_mode[track->video.stereo_mode], 0);
+
+ /* export alpha mode flag as metadata tag */
+ if (track->video.alpha_mode)
+ av_dict_set_int(&st->metadata, "alpha_mode", 1, 0);
+
+ /* if we have virtual track, mark the real tracks */
+ planes = track->operation.combine_planes.elem;
+ for (int j = 0; j < track->operation.combine_planes.nb_elem; j++) {
+ MatroskaTrack *tracks = matroska->tracks.elem;
+ char buf[32];
+ if (planes[j].type >= MATROSKA_VIDEO_STEREO_PLANE_COUNT)
+ continue;
+ snprintf(buf, sizeof(buf), "%s_%d",
+ matroska_video_stereo_plane[planes[j].type], st->index);
+ for (int k = 0; k < matroska->tracks.nb_elem; k++)
+ if (planes[j].uid == tracks[k].uid && tracks[k].stream) {
+ av_dict_set(&tracks[k].stream->metadata,
+ "stereo_mode", buf, 0);
+ break;
}
+ }
+ // add stream level stereo3d side data if it is a supported format
+ if (track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB &&
+ track->video.stereo_mode != MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_CYAN_RED &&
+ track->video.stereo_mode != MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_GREEN_MAG) {
+ int ret = mkv_stereo3d_conv(st, track->video.stereo_mode);
+ if (ret < 0)
+ return ret;
+ }
- ret = mkv_parse_video_color(st, track);
- if (ret < 0)
- return ret;
- ret = mkv_parse_video_projection(st, track, matroska->ctx);
- if (ret < 0)
- return ret;
+ ret = mkv_parse_video_color(st, track);
+ if (ret < 0)
+ return ret;
+ ret = mkv_parse_video_projection(st, track, matroska->ctx);
+ if (ret < 0)
+ return ret;
return 0;
}
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 17/20] avformat/matroskadec: Factor generic parsing of audio tracks out
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (14 preceding siblings ...)
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 16/20] avformat/matroskadec: Reindent after the previous commit Andreas Rheinhardt
@ 2023-09-04 11:27 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 18/20] avformat/matroskdec: Reindent after the previous commit Andreas Rheinhardt
` (3 subsequent siblings)
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 79 +++++++++++++++++++++++----------------
1 file changed, 47 insertions(+), 32 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 1bbdb6b980..7adb72aa23 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2734,6 +2734,50 @@ static int mka_parse_audio_codec(MatroskaTrack *track, AVCodecParameters *par,
return 0;
}
+/* Performs the generic part of parsing an audio track. */
+static int mka_parse_audio(MatroskaTrack *track, AVStream *st,
+ AVCodecParameters *par,
+ const MatroskaDemuxContext *matroska,
+ AVFormatContext *s, int *extradata_offset)
+{
+ FFStream *const sti = ffstream(st);
+ int ret;
+
+ ret = mka_parse_audio_codec(track, par, matroska,
+ s, extradata_offset);
+ if (ret)
+ return ret;
+
+ par->codec_type = AVMEDIA_TYPE_AUDIO;
+ par->sample_rate = track->audio.out_samplerate;
+ // channel layout may be already set by codec private checks above
+ if (!av_channel_layout_check(&par->ch_layout)) {
+ par->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
+ par->ch_layout.nb_channels = track->audio.channels;
+ }
+ if (!par->bits_per_coded_sample)
+ par->bits_per_coded_sample = track->audio.bitdepth;
+ if (par->codec_id == AV_CODEC_ID_MP3 ||
+ par->codec_id == AV_CODEC_ID_MLP ||
+ par->codec_id == AV_CODEC_ID_TRUEHD)
+ sti->need_parsing = AVSTREAM_PARSE_FULL;
+ else if (par->codec_id != AV_CODEC_ID_AAC)
+ sti->need_parsing = AVSTREAM_PARSE_HEADERS;
+ if (track->codec_delay > 0) {
+ par->initial_padding = av_rescale_q(track->codec_delay,
+ (AVRational){1, 1000000000},
+ (AVRational){1, par->codec_id == AV_CODEC_ID_OPUS ?
+ 48000 : par->sample_rate});
+ }
+ if (track->seek_preroll > 0) {
+ par->seek_preroll = av_rescale_q(track->seek_preroll,
+ (AVRational){1, 1000000000},
+ (AVRational){1, par->sample_rate});
+ }
+
+ return 0;
+}
+
/* Performs the codec-specific part of parsing a video track. */
static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par,
const MatroskaDemuxContext *matroska,
@@ -2959,7 +3003,6 @@ static int matroska_parse_tracks(AVFormatContext *s)
AVCodecParameters *par;
int extradata_offset = 0;
AVStream *st;
- FFStream *sti;
char* key_id_base64 = NULL;
/* Apply some sanity checks. */
@@ -3089,7 +3132,6 @@ static int matroska_parse_tracks(AVFormatContext *s)
av_free(key_id_base64);
return AVERROR(ENOMEM);
}
- sti = ffstream(st);
par = st->codecpar;
par->codec_id = codec_id;
@@ -3133,8 +3175,8 @@ static int matroska_parse_tracks(AVFormatContext *s)
st->time_base);
if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
- ret = mka_parse_audio_codec(track, par, matroska,
- s, &extradata_offset);
+ ret = mka_parse_audio(track, st, par, matroska,
+ s, &extradata_offset);
if (ret < 0)
return ret;
if (ret == SKIP_TRACK)
@@ -3162,34 +3204,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
memcpy(par->extradata, src, extra_size);
}
- if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
- par->codec_type = AVMEDIA_TYPE_AUDIO;
- par->sample_rate = track->audio.out_samplerate;
- // channel layout may be already set by codec private checks above
- if (!av_channel_layout_check(&par->ch_layout)) {
- par->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
- par->ch_layout.nb_channels = track->audio.channels;
- }
- if (!par->bits_per_coded_sample)
- par->bits_per_coded_sample = track->audio.bitdepth;
- if (par->codec_id == AV_CODEC_ID_MP3 ||
- par->codec_id == AV_CODEC_ID_MLP ||
- par->codec_id == AV_CODEC_ID_TRUEHD)
- sti->need_parsing = AVSTREAM_PARSE_FULL;
- else if (par->codec_id != AV_CODEC_ID_AAC)
- sti->need_parsing = AVSTREAM_PARSE_HEADERS;
- if (track->codec_delay > 0) {
- par->initial_padding = av_rescale_q(track->codec_delay,
- (AVRational){1, 1000000000},
- (AVRational){1, par->codec_id == AV_CODEC_ID_OPUS ?
- 48000 : par->sample_rate});
- }
- if (track->seek_preroll > 0) {
- par->seek_preroll = av_rescale_q(track->seek_preroll,
- (AVRational){1, 1000000000},
- (AVRational){1, par->sample_rate});
- }
- } else if (par->codec_id == AV_CODEC_ID_WEBVTT) {
+ if (par->codec_id == AV_CODEC_ID_WEBVTT) {
par->codec_type = AVMEDIA_TYPE_SUBTITLE;
if (!strcmp(track->codec_id, "D_WEBVTT/CAPTIONS")) {
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 18/20] avformat/matroskdec: Reindent after the previous commit
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (15 preceding siblings ...)
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 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 19/20] avformat/matroskadec: Move WEBVTT code to mkv_parse_subtitle_codec() Andreas Rheinhardt
` (2 subsequent siblings)
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 52 +++++++++++++++++++--------------------
1 file changed, 26 insertions(+), 26 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 7adb72aa23..d6545fd30d 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2748,32 +2748,32 @@ static int mka_parse_audio(MatroskaTrack *track, AVStream *st,
if (ret)
return ret;
- par->codec_type = AVMEDIA_TYPE_AUDIO;
- par->sample_rate = track->audio.out_samplerate;
- // channel layout may be already set by codec private checks above
- if (!av_channel_layout_check(&par->ch_layout)) {
- par->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
- par->ch_layout.nb_channels = track->audio.channels;
- }
- if (!par->bits_per_coded_sample)
- par->bits_per_coded_sample = track->audio.bitdepth;
- if (par->codec_id == AV_CODEC_ID_MP3 ||
- par->codec_id == AV_CODEC_ID_MLP ||
- par->codec_id == AV_CODEC_ID_TRUEHD)
- sti->need_parsing = AVSTREAM_PARSE_FULL;
- else if (par->codec_id != AV_CODEC_ID_AAC)
- sti->need_parsing = AVSTREAM_PARSE_HEADERS;
- if (track->codec_delay > 0) {
- par->initial_padding = av_rescale_q(track->codec_delay,
- (AVRational){1, 1000000000},
- (AVRational){1, par->codec_id == AV_CODEC_ID_OPUS ?
- 48000 : par->sample_rate});
- }
- if (track->seek_preroll > 0) {
- par->seek_preroll = av_rescale_q(track->seek_preroll,
- (AVRational){1, 1000000000},
- (AVRational){1, par->sample_rate});
- }
+ par->codec_type = AVMEDIA_TYPE_AUDIO;
+ par->sample_rate = track->audio.out_samplerate;
+ // channel layout may be already set by codec private checks above
+ if (!av_channel_layout_check(&par->ch_layout)) {
+ par->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
+ par->ch_layout.nb_channels = track->audio.channels;
+ }
+ if (!par->bits_per_coded_sample)
+ par->bits_per_coded_sample = track->audio.bitdepth;
+ if (par->codec_id == AV_CODEC_ID_MP3 ||
+ par->codec_id == AV_CODEC_ID_MLP ||
+ par->codec_id == AV_CODEC_ID_TRUEHD)
+ sti->need_parsing = AVSTREAM_PARSE_FULL;
+ else if (par->codec_id != AV_CODEC_ID_AAC)
+ sti->need_parsing = AVSTREAM_PARSE_HEADERS;
+ if (track->codec_delay > 0) {
+ par->initial_padding = av_rescale_q(track->codec_delay,
+ (AVRational){1, 1000000000},
+ (AVRational){1, par->codec_id == AV_CODEC_ID_OPUS ?
+ 48000 : par->sample_rate});
+ }
+ if (track->seek_preroll > 0) {
+ par->seek_preroll = av_rescale_q(track->seek_preroll,
+ (AVRational){1, 1000000000},
+ (AVRational){1, par->sample_rate});
+ }
return 0;
}
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 19/20] avformat/matroskadec: Move WEBVTT code to mkv_parse_subtitle_codec()
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (16 preceding siblings ...)
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 18/20] avformat/matroskdec: Reindent after the previous commit Andreas Rheinhardt
@ 2023-09-04 11:27 ` Andreas Rheinhardt
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 20/20] avformat/matroskadec: Factor parsing content encodings out Andreas Rheinhardt
2023-09-06 9:37 ` [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
and also perform the remainder of the subtitle parsing directly
after mkv_parse_subtitle_codec().
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskadec.c | 49 +++++++++++++++++++++------------------
1 file changed, 27 insertions(+), 22 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index d6545fd30d..51c47e9404 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2948,7 +2948,8 @@ static int mkv_parse_video(MatroskaTrack *track, AVStream *st,
}
/* 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)
{
switch (par->codec_id) {
@@ -2984,6 +2985,15 @@ static int mkv_parse_subtitle_codec(MatroskaTrack *track, AVCodecParameters *par
track->codec_priv.size = 0;
}
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;
@@ -3001,6 +3011,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
EbmlList *encodings_list = &track->encodings;
MatroskaTrackEncoding *encodings = encodings_list->elem;
AVCodecParameters *par;
+ MatroskaTrackType type;
int extradata_offset = 0;
AVStream *st;
char* key_id_base64 = NULL;
@@ -3174,21 +3185,32 @@ static int matroska_parse_tracks(AVFormatContext *s)
(AVRational){ 1, 1000000000 },
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,
s, &extradata_offset);
if (ret < 0)
return ret;
if (ret == SKIP_TRACK)
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);
if (ret < 0)
return ret;
- } else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) {
- ret = mkv_parse_subtitle_codec(track, par, matroska);
+ break;
+ case MATROSKA_TRACK_TYPE_SUBTITLE:
+ ret = mkv_parse_subtitle_codec(track, st, par, matroska);
if (ret < 0)
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)
@@ -3204,23 +3226,6 @@ static int matroska_parse_tracks(AVFormatContext *s)
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);
if (ret < 0)
return ret;
--
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* [FFmpeg-devel] [PATCH 20/20] avformat/matroskadec: Factor parsing content encodings out
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (17 preceding siblings ...)
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
2023-09-06 9:37 ` [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-04 11:27 UTC (permalink / raw)
To: ffmpeg-devel; +Cc: Andreas Rheinhardt
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".
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix
2023-09-04 11:26 [FFmpeg-devel] [PATCH 01/20] fate/matroska: Add test for remuxing non-rotation displaymatrix Andreas Rheinhardt
` (18 preceding siblings ...)
2023-09-04 11:27 ` [FFmpeg-devel] [PATCH 20/20] avformat/matroskadec: Factor parsing content encodings out Andreas Rheinhardt
@ 2023-09-06 9:37 ` Andreas Rheinhardt
19 siblings, 0 replies; 22+ messages in thread
From: Andreas Rheinhardt @ 2023-09-06 9:37 UTC (permalink / raw)
To: ffmpeg-devel
Andreas Rheinhardt:
> This provides coverage for the case in which the displaymatrix
> is ignored.
>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
> ---
> In this case, both the x and y axis are rotated in the same way,
> yet both axes are scaled by different factors, so that it is not
> an orthogonal transformation. Yet one could still argue that
> it actually has a well-defined rotation angle.
>
> tests/fate/matroska.mak | 10 ++++++++++
> .../ref/fate/matroska-non-rotation-displaymatrix | 15 +++++++++++++++
> 2 files changed, 25 insertions(+)
> create mode 100644 tests/ref/fate/matroska-non-rotation-displaymatrix
>
> diff --git a/tests/fate/matroska.mak b/tests/fate/matroska.mak
> index d1c316e998..ed6bd58cee 100644
> --- a/tests/fate/matroska.mak
> +++ b/tests/fate/matroska.mak
> @@ -90,6 +90,16 @@ FATE_MATROSKA-$(call TRANSCODE, PCM_S24BE PCM_S24LE, MATROSKA, WAV_DEMUXER) \
> += fate-matroska-move-cues-to-front
> fate-matroska-move-cues-to-front: CMD = transcode wav $(TARGET_SAMPLES)/audio-reference/divertimenti_2ch_96kHz_s24.wav matroska "-map 0 -map 0 -c:a:0 pcm_s24be -c:a:1 copy -cluster_time_limit 5 -cues_to_front yes -metadata_header_padding 7840 -write_crc32 0" "-map 0 -c copy -t 0.1"
>
> +# This test covers the case in which a displaymatrix is not a rotation
> +# and is therefore ignored by the muxer, i.e. the ffprobe output of
> +# side data should be empty.
> +FATE_MATROSKA_FFMPEG_FFPROBE-$(call REMUX, MATROSKA, MOV_DEMUXER H264_PARSER H264_DECODER) \
> + += fate-matroska-non-rotation-displaymatrix
> +fate-matroska-non-rotation-displaymatrix: CMD = transcode mov $(TARGET_SAMPLES)/mov/displaymatrix.mov matroska \
> + "-c copy -frames:v 5" \
> + "-c copy" \
> + "-show_entries stream_side_data_list"
> +
> # This tests DOVI (reading from MP4 and Matroska and writing to Matroska)
> # as well as writing the Cues at the front (by shifting data) if
> # the initially reserved amount of space turns out to be insufficient.
> diff --git a/tests/ref/fate/matroska-non-rotation-displaymatrix b/tests/ref/fate/matroska-non-rotation-displaymatrix
> new file mode 100644
> index 0000000000..c48a4afa43
> --- /dev/null
> +++ b/tests/ref/fate/matroska-non-rotation-displaymatrix
> @@ -0,0 +1,15 @@
> +3d9eac5b7551c5d644443a70451c809c *tests/data/fate/matroska-non-rotation-displaymatrix.matroska
> +7860 tests/data/fate/matroska-non-rotation-displaymatrix.matroska
> +#extradata 0: 34, 0xc1d10b51
> +#tb 0: 1/1000
> +#media_type 0: video
> +#codec_id 0: h264
> +#dimensions 0: 160x240
> +#sar 0: 1/2
> +0, -33, 0, 33, 4133, 0xc48cf152
> +0, 0, 60, 33, 1077, 0x15a71a8a, F=0x0
> +0, 27, 27, 33, 355, 0x1ee8b91a, F=0x0
> +0, 60, 127, 33, 1110, 0x4e1a2b12, F=0x0
> +0, 94, 94, 33, 430, 0x8724d62c, F=0x0
> +[STREAM]
> +[/STREAM]
Will apply this patchset tomorrow unless there are objections.
- Andreas
_______________________________________________
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".
^ permalink raw reply [flat|nested] 22+ messages in thread