History

avformat/matroskaenc: Avoid swapping codecpar->extradata temporarily

Instead pass extradata and extradata_size explicitly. (It is not perfect, as ff_put_(wav|bmp)_header() still uses the extradata embedded in codecpar, but this is not an issue as long as their CodecPrivate isn't updated.)

Andreas Rheinhardt committed 4 years ago

Commit 3a00a1a1 parent 1056f9a1 file · +47 −35Browse files

Unified · Split

libavformat/matroskaenc.c+47−35
@@ -990,7 +990,8 @@ static int mkv_assemble_cues(AVStream **streams, AVIOContext *dyn_cp, · 989 unmodified lines
990990 }
991991
992992 static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb,
993− const AVCodecParameters *par)
993+ const AVCodecParameters *par,
994+ const uint8_t *extradata, int extradata_size)
994995 {
995996 const uint8_t *header_start[3];
996997 int header_len[3];
@@ -1002,7 +1003,7 @@ static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, · 5 unmodified lines
10021003 else
10031004 first_header_size = 42;
10041005
1005− err = avpriv_split_xiph_headers(par->extradata, par->extradata_size,
1006+ err = avpriv_split_xiph_headers(extradata, extradata_size,
10061007 first_header_size, header_start, header_len);
10071008 if (err < 0) {
10081009 av_log(s, AV_LOG_ERROR, "Extradata corrupt.\n");
@@ -1020,22 +1021,23 @@ static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, · 11 unmodified lines
10201021 }
10211022
10221023 #if CONFIG_MATROSKA_MUXER
1023−static int put_wv_codecpriv(AVIOContext *pb, const AVCodecParameters *par)
1024+static int put_wv_codecpriv(AVIOContext *pb, const uint8_t *extradata, int extradata_size)
10241025 {
1025− if (par->extradata && par->extradata_size == 2)
1026− avio_write(pb, par->extradata, 2);
1026+ if (extradata && extradata_size == 2)
1027+ avio_write(pb, extradata, 2);
10271028 else
10281029 avio_wl16(pb, 0x410); // fallback to the most recent version
10291030 return 0;
10301031 }
10311032
10321033 static int put_flac_codecpriv(AVFormatContext *s, AVIOContext *pb,
1033− const AVCodecParameters *par)
1034+ const AVCodecParameters *par,
1035+ const uint8_t *extradata, int extradata_size)
10341036 {
10351037 int write_comment = (par->ch_layout.order == AV_CHANNEL_ORDER_NATIVE &&
10361038 !(par->ch_layout.u.mask & ~0x3ffffULL) &&
10371039 !ff_flac_is_native_layout(par->ch_layout.u.mask));
1038− int ret = ff_flac_write_header(pb, par->extradata, par->extradata_size,
1040+ int ret = ff_flac_write_header(pb, extradata, extradata_size,
10391041 !write_comment);
10401042
10411043 if (ret < 0)
@@ -1101,43 +1103,45 @@ static int get_aac_sample_rates(AVFormatContext *s, MatroskaMuxContext *mkv, · 59 unmodified lines
11011103
11021104 static int mkv_assemble_native_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp,
11031105 const AVCodecParameters *par,
1106+ const uint8_t *extradata,
1107+ int extradata_size,
11041108 unsigned *size_to_reserve)
11051109 {
11061110 switch (par->codec_id) {
11071111 case AV_CODEC_ID_VORBIS:
11081112 case AV_CODEC_ID_THEORA:
1109− return put_xiph_codecpriv(s, dyn_cp, par);
1113+ return put_xiph_codecpriv(s, dyn_cp, par, extradata, extradata_size);
11101114 case AV_CODEC_ID_AV1:
1111− if (par->extradata_size)
1112− return ff_isom_write_av1c(dyn_cp, par->extradata,
1113− par->extradata_size, 1);
1115+ if (extradata_size)
1116+ return ff_isom_write_av1c(dyn_cp, extradata,
1117+ extradata_size, 1);
11141118 else
11151119 *size_to_reserve = 4 + 3;
11161120 break;
11171121 #if CONFIG_MATROSKA_MUXER
11181122 case AV_CODEC_ID_FLAC:
1119− return put_flac_codecpriv(s, dyn_cp, par);
1123+ return put_flac_codecpriv(s, dyn_cp, par, extradata, extradata_size);
11201124 case AV_CODEC_ID_WAVPACK:
1121− return put_wv_codecpriv(dyn_cp, par);
1125+ return put_wv_codecpriv(dyn_cp, extradata, extradata_size);
11221126 case AV_CODEC_ID_H264:
1123− return ff_isom_write_avcc(dyn_cp, par->extradata,
1124− par->extradata_size);
1127+ return ff_isom_write_avcc(dyn_cp, extradata,
1128+ extradata_size);
11251129 case AV_CODEC_ID_HEVC:
1126− return ff_isom_write_hvcc(dyn_cp, par->extradata,
1127− par->extradata_size, 0);
1130+ return ff_isom_write_hvcc(dyn_cp, extradata,
1131+ extradata_size, 0);
11281132 case AV_CODEC_ID_ALAC:
1129− if (par->extradata_size < 36) {
1133+ if (extradata_size < 36) {
11301134 av_log(s, AV_LOG_ERROR,
11311135 "Invalid extradata found, ALAC expects a 36-byte "
11321136 "QuickTime atom.");
11331137 return AVERROR_INVALIDDATA;
11341138 } else
1135− avio_write(dyn_cp, par->extradata + 12,
1136− par->extradata_size - 12);
1139+ avio_write(dyn_cp, extradata + 12,
1140+ extradata_size - 12);
11371141 break;
11381142 case AV_CODEC_ID_AAC:
1139− if (par->extradata_size)
1140− avio_write(dyn_cp, par->extradata, par->extradata_size);
1143+ if (extradata_size)
1144+ avio_write(dyn_cp, extradata, extradata_size);
11411145 else
11421146 *size_to_reserve = 4 + MAX_PCE_SIZE + 2;
11431147 break;
@@ -1146,8 +1150,8 @@ static int mkv_assemble_native_codecprivate(AVFormatContext *s, AVIOContext *dyn · 2 unmodified lines
11461150 if (CONFIG_MATROSKA_MUXER && par->codec_id == AV_CODEC_ID_PRORES &&
11471151 ff_codec_get_id(ff_codec_movvideo_tags, par->codec_tag) == AV_CODEC_ID_PRORES) {
11481152 avio_wl32(dyn_cp, par->codec_tag);
1149− } else if (par->extradata_size && par->codec_id != AV_CODEC_ID_TTA)
1150− avio_write(dyn_cp, par->extradata, par->extradata_size);
1153+ } else if (extradata_size && par->codec_id != AV_CODEC_ID_TTA)
1154+ avio_write(dyn_cp, extradata, extradata_size);
11511155 }
11521156
11531157 return 0;
@@ -1155,6 +1159,7 @@ static int mkv_assemble_native_codecprivate(AVFormatContext *s, AVIOContext *dyn · 1 unmodified line
11551159
11561160 static int mkv_assemble_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp,
11571161 AVCodecParameters *par,
1162+ const uint8_t *extradata, int extradata_size,
11581163 int native_id, int qt_id,
11591164 uint8_t **codecpriv, int *codecpriv_size,
11601165 unsigned *size_to_reserve)
@@ -1165,7 +1170,9 @@ static int mkv_assemble_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp, · 4 unmodified lines
11651170 *size_to_reserve = 0;
11661171
11671172 if (native_id) {
1168− ret = mkv_assemble_native_codecprivate(s, dyn_cp, par, size_to_reserve);
1173+ ret = mkv_assemble_native_codecprivate(s, dyn_cp, par,
1174+ extradata, extradata_size,
1175+ size_to_reserve);
11691176 if (ret < 0)
11701177 return ret;
11711178 #if CONFIG_MATROSKA_MUXER
@@ -1175,13 +1182,13 @@ static int mkv_assemble_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp, · 3 unmodified lines
11751182 par->codec_tag = ff_codec_get_tag(ff_codec_movvideo_tags,
11761183 par->codec_id);
11771184 if ( ff_codec_get_id(ff_codec_movvideo_tags, par->codec_tag) == par->codec_id
1178− && (!par->extradata_size || ff_codec_get_id(ff_codec_movvideo_tags, AV_RL32(par->extradata + 4)) != par->codec_id)
1185+ && (!extradata_size || ff_codec_get_id(ff_codec_movvideo_tags, AV_RL32(extradata + 4)) != par->codec_id)
11791186 ) {
1180− avio_wb32(dyn_cp, 0x5a + par->extradata_size);
1187+ avio_wb32(dyn_cp, 0x5a + extradata_size);
11811188 avio_wl32(dyn_cp, par->codec_tag);
11821189 ffio_fill(dyn_cp, 0, 0x5a - 8);
11831190 }
1184− avio_write(dyn_cp, par->extradata, par->extradata_size);
1191+ avio_write(dyn_cp, extradata, extradata_size);
11851192 } else {
11861193 if (!ff_codec_get_tag(ff_codec_bmp_tags, par->codec_id))
11871194 av_log(s, AV_LOG_WARNING, "codec %s is not supported by this format\n",
@@ -1196,6 +1203,8 @@ static int mkv_assemble_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp, · 8 unmodified lines
11961203 return AVERROR(EINVAL);
11971204 }
11981205
1206+ /* If vfw extradata updates are supported, this will have
1207+ * to be updated to pass extradata(_size) explicitly. */
11991208 ff_put_bmp_header(dyn_cp, par, 0, 0, mkv->flipped_raw_rgb);
12001209 }
12011210 } else if (par->codec_type == AVMEDIA_TYPE_AUDIO) {
@@ -1209,6 +1218,7 @@ static int mkv_assemble_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp, · 7 unmodified lines
12091218 if (!par->codec_tag)
12101219 par->codec_tag = tag;
12111220
1221+ /* Same comment as for ff_put_bmp_header applies here. */
12121222 ff_put_wav_header(s, dyn_cp, par, FF_PUT_WAV_HEADER_FORCE_WAVEFORMATEX);
12131223 #endif
12141224 }
@@ -1221,6 +1231,7 @@ static int mkv_assemble_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp, · 6 unmodified lines
12211231
12221232 static int mkv_write_codecprivate(AVFormatContext *s, MatroskaMuxContext *mkv,
12231233 AVCodecParameters *par,
1234+ const uint8_t *extradata, int extradata_size,
12241235 int native_id, int qt_id, AVIOContext *pb)
12251236 {
12261237 AVIOContext *const dyn_bc = mkv->tmp_bc;
@@ -1228,7 +1239,8 @@ static int mkv_write_codecprivate(AVFormatContext *s, MatroskaMuxContext *mkv, · 1 unmodified line
12281239 unsigned size_to_reserve;
12291240 int ret, codecpriv_size;
12301241
1231− ret = mkv_assemble_codecprivate(s, dyn_bc, par, native_id, qt_id,
1242+ ret = mkv_assemble_codecprivate(s, dyn_bc, par, extradata, extradata_size,
1243+ native_id, qt_id,
12321244 &codecpriv, &codecpriv_size, &size_to_reserve);
12331245 if (ret < 0)
12341246 goto end;
@@ -1851,7 +1863,8 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, · 616 unmodified lines
18511863
18521864 if (!IS_WEBM(mkv) || par->codec_id != AV_CODEC_ID_WEBVTT) {
18531865 track->codecpriv_offset = avio_tell(pb);
1854− ret = mkv_write_codecprivate(s, mkv, par, native_id, qt_id, pb);
1866+ ret = mkv_write_codecprivate(s, mkv, par, par->extradata, par->extradata_size,
1867+ native_id, qt_id, pb);
18551868 if (ret < 0)
18561869 return ret;
18571870 }
@@ -2644,7 +2657,8 @@ static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt) · 786 unmodified lines
26442657 return ret;
26452658 memcpy(par->extradata, side_data, side_data_size);
26462659 avio_seek(mkv->track.bc, track->codecpriv_offset, SEEK_SET);
2647− mkv_write_codecprivate(s, mkv, par, 1, 0, mkv->track.bc);
2660+ mkv_write_codecprivate(s, mkv, par, side_data, side_data_size,
2661+ 1, 0, mkv->track.bc);
26482662 filler = MAX_PCE_SIZE + 2 + 4 - (avio_tell(mkv->track.bc) - track->codecpriv_offset);
26492663 if (filler)
26502664 put_ebml_void(mkv->track.bc, filler);
@@ -2659,16 +2673,14 @@ static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt) · 8 unmodified lines
26592673 break;
26602674 case AV_CODEC_ID_FLAC:
26612675 if (side_data_size && mkv->track.bc) {
2662− uint8_t *old_extradata = par->extradata;
26632676 if (side_data_size != par->extradata_size) {
26642677 av_log(s, AV_LOG_ERROR, "Invalid FLAC STREAMINFO metadata for output stream %d\n",
26652678 pkt->stream_index);
26662679 return AVERROR(EINVAL);
26672680 }
2668− par->extradata = side_data;
26692681 avio_seek(mkv->track.bc, track->codecpriv_offset, SEEK_SET);
2670− mkv_write_codecprivate(s, mkv, par, 1, 0, mkv->track.bc);
2671− par->extradata = old_extradata;
2682+ mkv_write_codecprivate(s, mkv, par, side_data, side_data_size,
2683+ 1, 0, mkv->track.bc);
26722684 }
26732685 break;
26742686 #endif

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t