|
|
|
@ -1684,18 +1684,6 @@ static int matroska_read_header(AVFormatContext *s) |
|
|
|
|
&& (track->codec_priv.data != NULL)) { |
|
|
|
|
fourcc = AV_RL32(track->codec_priv.data); |
|
|
|
|
codec_id = ff_codec_get_id(ff_codec_movvideo_tags, fourcc); |
|
|
|
|
} else if (codec_id == AV_CODEC_ID_ALAC && track->codec_priv.size && track->codec_priv.size < INT_MAX - 12 - FF_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. */ |
|
|
|
|
extradata_size = 12 + track->codec_priv.size; |
|
|
|
|
extradata = av_mallocz(extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); |
|
|
|
|
if (extradata == NULL) |
|
|
|
|
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, track->codec_priv.size); |
|
|
|
|
} else if (codec_id == AV_CODEC_ID_PCM_S16BE) { |
|
|
|
|
switch (track->audio.bitdepth) { |
|
|
|
|
case 8: codec_id = AV_CODEC_ID_PCM_U8; break; |
|
|
|
@ -1726,6 +1714,19 @@ static int matroska_read_header(AVFormatContext *s) |
|
|
|
|
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 - FF_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. */ |
|
|
|
|
extradata_size = 12 + track->codec_priv.size; |
|
|
|
|
extradata = av_mallocz(extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); |
|
|
|
|
if (extradata == NULL) |
|
|
|
|
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, |
|
|
|
|
track->codec_priv.size); |
|
|
|
|
} else if (codec_id == AV_CODEC_ID_TTA) { |
|
|
|
|
extradata_size = 30; |
|
|
|
|
extradata = av_mallocz(extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); |
|
|
|
|