summaryrefslogtreecommitdiffstats
path: root/demux
diff options
context:
space:
mode:
Diffstat (limited to 'demux')
-rw-r--r--demux/demux_mkv.c49
1 files changed, 12 insertions, 37 deletions
diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c
index 5a7f6845eb..8f5884fd1e 100644
--- a/demux/demux_mkv.c
+++ b/demux/demux_mkv.c
@@ -1333,8 +1333,11 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track)
track->stream = sh;
sh_audio_t *sh_a = sh->audio;
- unsigned char *extradata = NULL;
- int extradata_len = 0;
+ if (track->private_size > 0x1000000)
+ goto error;
+
+ unsigned char *extradata = track->private_data;
+ unsigned int extradata_len = track->private_size;
if (track->language && (strcmp(track->language, "und") != 0))
sh->lang = talloc_strdup(sh_a, track->language);
@@ -1401,20 +1404,11 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track)
|| !strcmp(track->codec_id, MKV_A_QDMC2)) {
sh_a->bitrate = 16000 * 8;
sh_a->block_align = 1486;
- if (!extradata_len) {
- extradata = track->private_data;
- extradata_len = track->private_size;
- }
} else if (track->a_formattag == MP_FOURCC('M', 'P', '4', 'A')) {
sh_a->bitrate = 16000 * 8;
sh_a->block_align = 1024;
- if (!strcmp(track->codec_id, MKV_A_AAC)) {
- if (track->private_data && !extradata_len) {
- extradata = track->private_data;
- extradata_len = track->private_size;
- }
- } else {
+ if (strcmp(track->codec_id, MKV_A_AAC)) {
/* Recreate the 'private data' */
int srate_idx = aac_get_sample_rate_index(track->a_sfreq);
const char *tail = "";
@@ -1448,19 +1442,9 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track)
}
} else if (track->a_formattag == MP_FOURCC('v', 'r', 'b', 's')) {
/* VORBIS */
- if (track->private_size == 0 || (track->ms_compat && !extradata_len))
- goto error;
- if (!track->ms_compat) {
- extradata = track->private_data;
- extradata_len = track->private_size;
- }
} else if (!strcmp(track->codec_id, MKV_A_OPUS)
|| !strcmp(track->codec_id, MKV_A_OPUS_EXP)) {
sh->format = MP_FOURCC('O', 'p', 'u', 's');
- if (!track->ms_compat) {
- extradata = track->private_data;
- extradata_len = track->private_size;
- }
} else if (!strncmp(track->codec_id, MKV_A_REALATRC, 7)) {
if (track->private_size < RAPROPERTIES4_SIZE)
goto error;
@@ -1536,13 +1520,10 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track)
sh_a->bitrate = 0;
sh_a->block_align = 0;
- unsigned char *ptr = track->private_data;
- int size = track->private_size;
- if (track->ms_compat) {
+ if (track->ms_compat)
sh->format = MP_FOURCC('f', 'L', 'a', 'C');
- ptr = extradata;
- size = extradata_len;
- }
+ unsigned char *ptr = extradata;
+ unsigned int size = extradata_len;
if (size < 4 || ptr[0] != 'f' || ptr[1] != 'L' || ptr[2] != 'a'
|| ptr[3] != 'C') {
sh_a->codecdata = talloc_size(sh_a, 4);
@@ -1554,7 +1535,7 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track)
memcpy(sh_a->codecdata, ptr, size);
}
} else if (!strcmp(track->codec_id, MKV_A_ALAC)) {
- if (track->private_size && track->private_size < 10000000) {
+ if (track->private_size) {
sh_a->codecdata_len = track->private_size + 12;
sh_a->codecdata = talloc_size(sh_a, sh_a->codecdata_len);
char *data = sh_a->codecdata;
@@ -1565,10 +1546,7 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track)
}
} else if (track->a_formattag == MP_FOURCC('W', 'V', 'P', 'K') ||
track->a_formattag == MP_FOURCC('T', 'R', 'H', 'D')) {
- if (!track->ms_compat) {
- extradata = track->private_data;
- extradata_len = track->private_size;
- }
+ /* ok */
} else if (track->a_formattag == MP_FOURCC('T', 'T', 'A', '1')) {
sh_a->codecdata_len = 30;
sh_a->codecdata = talloc_zero_size(sh_a, sh_a->codecdata_len);
@@ -1594,10 +1572,7 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track)
mp_set_codec_from_tag(sh);
- if (track->private_size > 0x1000000 || extradata_len > 0x1000000)
- goto error;
-
- if (!sh_a->codecdata && extradata) {
+ if (!sh_a->codecdata && extradata_len) {
sh_a->codecdata = talloc_memdup(sh_a, extradata, extradata_len);
sh_a->codecdata_len = extradata_len;
}