|
@@ -2545,30 +2545,29 @@ static int matroska_parse_tracks(AVFormatContext *s) |
|
|
memcpy(&extradata[12], track->codec_priv.data, |
|
|
memcpy(&extradata[12], track->codec_priv.data, |
|
|
track->codec_priv.size); |
|
|
track->codec_priv.size); |
|
|
} else if (codec_id == AV_CODEC_ID_TTA) { |
|
|
} else if (codec_id == AV_CODEC_ID_TTA) { |
|
|
extradata_size = 30; |
|
|
|
|
|
extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE); |
|
|
|
|
|
if (!extradata) |
|
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
|
ffio_init_context(&b, extradata, extradata_size, 1, |
|
|
|
|
|
NULL, NULL, NULL, NULL); |
|
|
|
|
|
avio_write(&b, "TTA1", 4); |
|
|
|
|
|
avio_wl16(&b, 1); |
|
|
|
|
|
if (track->audio.channels > UINT16_MAX || |
|
|
if (track->audio.channels > UINT16_MAX || |
|
|
track->audio.bitdepth > UINT16_MAX) { |
|
|
track->audio.bitdepth > UINT16_MAX) { |
|
|
av_log(matroska->ctx, AV_LOG_WARNING, |
|
|
av_log(matroska->ctx, AV_LOG_WARNING, |
|
|
"Too large audio channel number %"PRIu64 |
|
|
"Too large audio channel number %"PRIu64 |
|
|
" or bitdepth %"PRIu64". Skipping track.\n", |
|
|
" or bitdepth %"PRIu64". Skipping track.\n", |
|
|
track->audio.channels, track->audio.bitdepth); |
|
|
track->audio.channels, track->audio.bitdepth); |
|
|
av_freep(&extradata); |
|
|
|
|
|
if (matroska->ctx->error_recognition & AV_EF_EXPLODE) |
|
|
if (matroska->ctx->error_recognition & AV_EF_EXPLODE) |
|
|
return AVERROR_INVALIDDATA; |
|
|
return AVERROR_INVALIDDATA; |
|
|
else |
|
|
else |
|
|
continue; |
|
|
continue; |
|
|
} |
|
|
} |
|
|
avio_wl16(&b, track->audio.channels); |
|
|
|
|
|
avio_wl16(&b, track->audio.bitdepth); |
|
|
|
|
|
if (track->audio.out_samplerate < 0 || track->audio.out_samplerate > INT_MAX) |
|
|
if (track->audio.out_samplerate < 0 || track->audio.out_samplerate > INT_MAX) |
|
|
return AVERROR_INVALIDDATA; |
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
extradata_size = 30; |
|
|
|
|
|
extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE); |
|
|
|
|
|
if (!extradata) |
|
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
|
ffio_init_context(&b, extradata, extradata_size, 1, |
|
|
|
|
|
NULL, NULL, NULL, NULL); |
|
|
|
|
|
avio_write(&b, "TTA1", 4); |
|
|
|
|
|
avio_wl16(&b, 1); |
|
|
|
|
|
avio_wl16(&b, track->audio.channels); |
|
|
|
|
|
avio_wl16(&b, track->audio.bitdepth); |
|
|
avio_wl32(&b, track->audio.out_samplerate); |
|
|
avio_wl32(&b, track->audio.out_samplerate); |
|
|
avio_wl32(&b, av_rescale((matroska->duration * matroska->time_scale), |
|
|
avio_wl32(&b, av_rescale((matroska->duration * matroska->time_scale), |
|
|
track->audio.out_samplerate, |
|
|
track->audio.out_samplerate, |
|
|