diff options
author | Uoti Urpala <uau@mplayer2.org> | 2011-08-20 06:00:57 +0300 |
---|---|---|
committer | Uoti Urpala <uau@mplayer2.org> | 2011-08-20 06:06:12 +0300 |
commit | e2ca8853a6a26ca1afcababea0e4a743b525daa2 (patch) | |
tree | 29df44aaa56786654dd08d1ee25f4e463ee02ebd /libmpdemux/demux_mkv.c | |
parent | 46d90010ba1f78b68cdd6b2ee84a51fe46ee37a8 (diff) | |
download | mpv-e2ca8853a6a26ca1afcababea0e4a743b525daa2.tar.bz2 mpv-e2ca8853a6a26ca1afcababea0e4a743b525daa2.tar.xz |
demux_mkv: support extradata for wavpack audio tracks
Export the codec private data field for WavPack and TrueHD audio
tracks. At least for WavPack this is necessary to make some samples
work.
Also change some other cases to use the same data-copying code.
Diffstat (limited to 'libmpdemux/demux_mkv.c')
-rw-r--r-- | libmpdemux/demux_mkv.c | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c index 8cccf24889..085f2f82a0 100644 --- a/libmpdemux/demux_mkv.c +++ b/libmpdemux/demux_mkv.c @@ -1418,23 +1418,15 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track, sh_a->wf->nBlockAlign = 1486; track->fix_i_bps = 1; track->qt_last_a_pts = 0.0; - if (track->private_data != NULL) { - sh_a->codecdata = malloc(track->private_size); - memcpy(sh_a->codecdata, track->private_data, track->private_size); - sh_a->codecdata_len = track->private_size; - } + goto copy_private_data; } else if (track->a_formattag == mmioFOURCC('M', 'P', '4', 'A')) { int profile, srate_idx; sh_a->wf->nAvgBytesPerSec = 16000; sh_a->wf->nBlockAlign = 1024; - if (!strcmp(track->codec_id, MKV_A_AAC) && track->private_data) { - sh_a->codecdata = malloc(track->private_size); - memcpy(sh_a->codecdata, track->private_data, track->private_size); - sh_a->codecdata_len = track->private_size; - return 0; - } + if (!strcmp(track->codec_id, MKV_A_AAC) && track->private_data) + goto copy_private_data; /* Recreate the 'private data' */ /* which faad2 uses in its initialization */ @@ -1559,7 +1551,14 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track, sh_a->codecdata_len = size; memcpy(sh_a->codecdata, ptr, size); } - } else if (track->a_formattag == mmioFOURCC('W', 'V', 'P', 'K') || track->a_formattag == mmioFOURCC('T', 'R', 'H', 'D')) { /* do nothing, still works */ + } else if (track->a_formattag == mmioFOURCC('W', 'V', 'P', 'K') || + track->a_formattag == mmioFOURCC('T', 'R', 'H', 'D')) { + copy_private_data: + if (!track->ms_compat && track->private_size) { + sh_a->codecdata = malloc(track->private_size); + sh_a->codecdata_len = track->private_size; + memcpy(sh_a->codecdata, track->private_data, track->private_size); + } } else if (!track->ms_compat) { goto error; } |