|
@@ -771,8 +771,12 @@ static int mkv_write_native_codecprivate(AVFormatContext *s, AVIOContext *pb, |
|
|
par->extradata_size, 0); |
|
|
par->extradata_size, 0); |
|
|
return 0; |
|
|
return 0; |
|
|
case AV_CODEC_ID_AV1: |
|
|
case AV_CODEC_ID_AV1: |
|
|
return ff_isom_write_av1c(dyn_cp, par->extradata, |
|
|
|
|
|
par->extradata_size); |
|
|
|
|
|
|
|
|
if (par->extradata_size) |
|
|
|
|
|
return ff_isom_write_av1c(dyn_cp, par->extradata, |
|
|
|
|
|
par->extradata_size); |
|
|
|
|
|
else |
|
|
|
|
|
put_ebml_void(pb, 4 + 3); |
|
|
|
|
|
break; |
|
|
case AV_CODEC_ID_ALAC: |
|
|
case AV_CODEC_ID_ALAC: |
|
|
if (par->extradata_size < 36) { |
|
|
if (par->extradata_size < 36) { |
|
|
av_log(s, AV_LOG_ERROR, |
|
|
av_log(s, AV_LOG_ERROR, |
|
@@ -2325,6 +2329,37 @@ static int mkv_check_new_extra_data(AVFormatContext *s, AVPacket *pkt) |
|
|
avcodec_parameters_free(&codecpriv_par); |
|
|
avcodec_parameters_free(&codecpriv_par); |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
|
|
|
// FIXME: Remove the following once libaom starts propagating extradata during init() |
|
|
|
|
|
// See https://bugs.chromium.org/p/aomedia/issues/detail?id=2012 |
|
|
|
|
|
case AV_CODEC_ID_AV1: |
|
|
|
|
|
if (side_data_size && (s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live && |
|
|
|
|
|
!par->extradata_size) { |
|
|
|
|
|
AVIOContext *dyn_cp; |
|
|
|
|
|
uint8_t *codecpriv; |
|
|
|
|
|
int codecpriv_size; |
|
|
|
|
|
int64_t curpos; |
|
|
|
|
|
ret = avio_open_dyn_buf(&dyn_cp); |
|
|
|
|
|
if (ret < 0) |
|
|
|
|
|
return ret; |
|
|
|
|
|
ff_isom_write_av1c(dyn_cp, side_data, side_data_size); |
|
|
|
|
|
codecpriv_size = avio_close_dyn_buf(dyn_cp, &codecpriv); |
|
|
|
|
|
if (!codecpriv_size) { |
|
|
|
|
|
av_free(codecpriv); |
|
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
} |
|
|
|
|
|
curpos = avio_tell(mkv->tracks_bc); |
|
|
|
|
|
avio_seek(mkv->tracks_bc, track->codecpriv_offset, SEEK_SET); |
|
|
|
|
|
// Do not write the OBUs as we don't have space saved for them |
|
|
|
|
|
put_ebml_binary(mkv->tracks_bc, MATROSKA_ID_CODECPRIVATE, codecpriv, 4); |
|
|
|
|
|
av_free(codecpriv); |
|
|
|
|
|
avio_seek(mkv->tracks_bc, curpos, SEEK_SET); |
|
|
|
|
|
ret = ff_alloc_extradata(par, side_data_size); |
|
|
|
|
|
if (ret < 0) |
|
|
|
|
|
return ret; |
|
|
|
|
|
memcpy(par->extradata, side_data, side_data_size); |
|
|
|
|
|
} else if (!par->extradata_size) |
|
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
break; |
|
|
default: |
|
|
default: |
|
|
if (side_data_size) |
|
|
if (side_data_size) |
|
|
av_log(s, AV_LOG_DEBUG, "Ignoring new extradata in a packet for stream %d.\n", pkt->stream_index); |
|
|
av_log(s, AV_LOG_DEBUG, "Ignoring new extradata in a packet for stream %d.\n", pkt->stream_index); |
|
|