1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-15 14:13:16 +02:00

avformat/matroskaenc: Split assembling CodecPrivate from writing it

This is in preparation for splitting writing and updating
extradata more thoroughly later.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt
2022-06-16 14:42:26 +02:00
parent 70dc5fc658
commit 1056f9a21e

View File

@@ -1099,9 +1099,9 @@ static int get_aac_sample_rates(AVFormatContext *s, MatroskaMuxContext *mkv,
} }
#endif #endif
static int mkv_write_native_codecprivate(AVFormatContext *s, AVIOContext *pb, static int mkv_assemble_native_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp,
const AVCodecParameters *par, const AVCodecParameters *par,
AVIOContext *dyn_cp) unsigned *size_to_reserve)
{ {
switch (par->codec_id) { switch (par->codec_id) {
case AV_CODEC_ID_VORBIS: case AV_CODEC_ID_VORBIS:
@@ -1112,7 +1112,7 @@ static int mkv_write_native_codecprivate(AVFormatContext *s, AVIOContext *pb,
return ff_isom_write_av1c(dyn_cp, par->extradata, return ff_isom_write_av1c(dyn_cp, par->extradata,
par->extradata_size, 1); par->extradata_size, 1);
else else
put_ebml_void(pb, 4 + 3); *size_to_reserve = 4 + 3;
break; break;
#if CONFIG_MATROSKA_MUXER #if CONFIG_MATROSKA_MUXER
case AV_CODEC_ID_FLAC: case AV_CODEC_ID_FLAC:
@@ -1139,7 +1139,7 @@ static int mkv_write_native_codecprivate(AVFormatContext *s, AVIOContext *pb,
if (par->extradata_size) if (par->extradata_size)
avio_write(dyn_cp, par->extradata, par->extradata_size); avio_write(dyn_cp, par->extradata, par->extradata_size);
else else
put_ebml_void(pb, MAX_PCE_SIZE + 2 + 4); *size_to_reserve = 4 + MAX_PCE_SIZE + 2;
break; break;
#endif #endif
default: default:
@@ -1153,21 +1153,21 @@ static int mkv_write_native_codecprivate(AVFormatContext *s, AVIOContext *pb,
return 0; return 0;
} }
static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb, static int mkv_assemble_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp,
AVCodecParameters *par, AVCodecParameters *par,
int native_id, int qt_id) int native_id, int qt_id,
uint8_t **codecpriv, int *codecpriv_size,
unsigned *size_to_reserve)
{ {
MatroskaMuxContext av_unused *const mkv = s->priv_data; MatroskaMuxContext av_unused *const mkv = s->priv_data;
AVIOContext *dyn_cp; int ret;
uint8_t *codecpriv;
int ret, codecpriv_size;
ret = avio_open_dyn_buf(&dyn_cp); *size_to_reserve = 0;
if (ret < 0)
return ret;
if (native_id) { if (native_id) {
ret = mkv_write_native_codecprivate(s, pb, par, dyn_cp); ret = mkv_assemble_native_codecprivate(s, dyn_cp, par, size_to_reserve);
if (ret < 0)
return ret;
#if CONFIG_MATROSKA_MUXER #if CONFIG_MATROSKA_MUXER
} else if (par->codec_type == AVMEDIA_TYPE_VIDEO) { } else if (par->codec_type == AVMEDIA_TYPE_VIDEO) {
if (qt_id) { if (qt_id) {
@@ -1193,7 +1193,7 @@ static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb,
if (!par->codec_tag && par->codec_id != AV_CODEC_ID_RAWVIDEO) { if (!par->codec_tag && par->codec_id != AV_CODEC_ID_RAWVIDEO) {
av_log(s, AV_LOG_ERROR, "No bmp codec tag found for codec %s\n", av_log(s, AV_LOG_ERROR, "No bmp codec tag found for codec %s\n",
avcodec_get_name(par->codec_id)); avcodec_get_name(par->codec_id));
ret = AVERROR(EINVAL); return AVERROR(EINVAL);
} }
ff_put_bmp_header(dyn_cp, par, 0, 0, mkv->flipped_raw_rgb); ff_put_bmp_header(dyn_cp, par, 0, 0, mkv->flipped_raw_rgb);
@@ -1204,7 +1204,7 @@ static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb,
if (!tag) { if (!tag) {
av_log(s, AV_LOG_ERROR, "No wav codec tag found for codec %s\n", av_log(s, AV_LOG_ERROR, "No wav codec tag found for codec %s\n",
avcodec_get_name(par->codec_id)); avcodec_get_name(par->codec_id));
ret = AVERROR(EINVAL); return AVERROR(EINVAL);
} }
if (!par->codec_tag) if (!par->codec_tag)
par->codec_tag = tag; par->codec_tag = tag;
@@ -1213,14 +1213,32 @@ static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb,
#endif #endif
} }
if (ret >= 0) { *codecpriv_size = avio_get_dyn_buf(dyn_cp, codecpriv);
codecpriv_size = avio_get_dyn_buf(dyn_cp, &codecpriv); if (dyn_cp->error < 0)
if ((ret = dyn_cp->error) >= 0 && codecpriv_size) return dyn_cp->error;
put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codecpriv, return 0;
codecpriv_size); }
}
ffio_free_dyn_buf(&dyn_cp); static int mkv_write_codecprivate(AVFormatContext *s, MatroskaMuxContext *mkv,
return ret; AVCodecParameters *par,
int native_id, int qt_id, AVIOContext *pb)
{
AVIOContext *const dyn_bc = mkv->tmp_bc;
uint8_t *codecpriv;
unsigned size_to_reserve;
int ret, codecpriv_size;
ret = mkv_assemble_codecprivate(s, dyn_bc, par, native_id, qt_id,
&codecpriv, &codecpriv_size, &size_to_reserve);
if (ret < 0)
goto end;
if (codecpriv_size)
put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codecpriv, codecpriv_size);
if (size_to_reserve)
put_ebml_void(pb, size_to_reserve);
end:
ffio_reset_dyn_buf(dyn_bc);
return 0;
} }
#define MAX_VIDEO_COLOR_ELEMS 20 #define MAX_VIDEO_COLOR_ELEMS 20
@@ -1833,7 +1851,7 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv,
if (!IS_WEBM(mkv) || par->codec_id != AV_CODEC_ID_WEBVTT) { if (!IS_WEBM(mkv) || par->codec_id != AV_CODEC_ID_WEBVTT) {
track->codecpriv_offset = avio_tell(pb); track->codecpriv_offset = avio_tell(pb);
ret = mkv_write_codecprivate(s, pb, par, native_id, qt_id); ret = mkv_write_codecprivate(s, mkv, par, native_id, qt_id, pb);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
@@ -2626,7 +2644,7 @@ static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt)
return ret; return ret;
memcpy(par->extradata, side_data, side_data_size); memcpy(par->extradata, side_data, side_data_size);
avio_seek(mkv->track.bc, track->codecpriv_offset, SEEK_SET); avio_seek(mkv->track.bc, track->codecpriv_offset, SEEK_SET);
mkv_write_codecprivate(s, mkv->track.bc, par, 1, 0); mkv_write_codecprivate(s, mkv, par, 1, 0, mkv->track.bc);
filler = MAX_PCE_SIZE + 2 + 4 - (avio_tell(mkv->track.bc) - track->codecpriv_offset); filler = MAX_PCE_SIZE + 2 + 4 - (avio_tell(mkv->track.bc) - track->codecpriv_offset);
if (filler) if (filler)
put_ebml_void(mkv->track.bc, filler); put_ebml_void(mkv->track.bc, filler);
@@ -2649,7 +2667,7 @@ static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt)
} }
par->extradata = side_data; par->extradata = side_data;
avio_seek(mkv->track.bc, track->codecpriv_offset, SEEK_SET); avio_seek(mkv->track.bc, track->codecpriv_offset, SEEK_SET);
mkv_write_codecprivate(s, mkv->track.bc, par, 1, 0); mkv_write_codecprivate(s, mkv, par, 1, 0, mkv->track.bc);
par->extradata = old_extradata; par->extradata = old_extradata;
} }
break; break;