diff options
author | Kovensky <diogomfranco@gmail.com> | 2010-04-02 10:00:42 -0300 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2012-11-08 01:39:32 +0100 |
commit | d53d75e0807747b59b54f6febe774cd2d0f6546e (patch) | |
tree | 10a1919fc169f412171de9b79e0d2a5302114c91 /libmpdemux | |
parent | ed2c54cea99fc5b3a28c2df9370db3aa88b256cc (diff) | |
download | mpv-d53d75e0807747b59b54f6febe774cd2d0f6546e.tar.bz2 mpv-d53d75e0807747b59b54f6febe774cd2d0f6546e.tar.xz |
demux_mkv: TTA support
Code from libavformat's demuxer.
Merged by wm4. It looks like the byte stream writer API is private in
newer ffmpeg, so use the macros from <libavutil/intreadwrite.h>
instead.
It's not really known how to correctly set the field that is used by
the decoder to calculate the length of the last frame. The original
patch used:
put_le32(&b, (demuxer->movi_end - demuxer->movi_start) * sh_a->samplerate);
This doesn't seem to be correct. Write 0 instead. This is also
incorrect, but better than writing an essentially random value.
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/demux_mkv.c | 15 | ||||
-rw-r--r-- | libmpdemux/matroska.h | 1 |
2 files changed, 15 insertions, 1 deletions
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c index b12f1eb061..3093fcae0f 100644 --- a/libmpdemux/demux_mkv.c +++ b/libmpdemux/demux_mkv.c @@ -50,7 +50,6 @@ #include "mp_msg.h" - static const unsigned char sipr_swaps[38][2] = { {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68}, {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46}, @@ -1301,6 +1300,7 @@ static struct mkv_audio_tag { { MKV_A_REALCOOK, 0, mmioFOURCC('c', 'o', 'o', 'k') }, { MKV_A_REALDNET, 0, mmioFOURCC('d', 'n', 'e', 't') }, { MKV_A_REALSIPR, 0, mmioFOURCC('s', 'i', 'p', 'r') }, + { MKV_A_TTA1, 0, mmioFOURCC('T', 'T', 'A', '1') }, { NULL }, }; @@ -1532,6 +1532,19 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track, sh_a->codecdata_len = track->private_size; memcpy(sh_a->codecdata, track->private_data, track->private_size); } + } else if (track->a_formattag == mmioFOURCC('T', 'T', 'A', '1')) { + sh_a->codecdata_len = 30; + sh_a->codecdata = calloc(1, sh_a->codecdata_len); + if (!sh_a->codecdata) + goto error; + char *data = sh_a->codecdata; + memcpy(data + 0, "TTA1", 4); + AV_WL16(data + 4, 1); + AV_WL16(data + 6, sh_a->channels); + AV_WL16(data + 8, sh_a->wf->wBitsPerSample); + AV_WL32(data + 10, sh_a->samplerate); + // Bogus: last frame won't be played. + AV_WL32(data + 14, 0); } else if (!track->ms_compat) { goto error; } diff --git a/libmpdemux/matroska.h b/libmpdemux/matroska.h index c233cd1336..6d56008cb1 100644 --- a/libmpdemux/matroska.h +++ b/libmpdemux/matroska.h @@ -50,6 +50,7 @@ #define MKV_A_QDMC "A_QUICKTIME/QDMC" #define MKV_A_QDMC2 "A_QUICKTIME/QDM2" #define MKV_A_FLAC "A_FLAC" +#define MKV_A_TTA1 "A_TTA1" #define MKV_A_WAVPACK "A_WAVPACK4" #define MKV_A_TRUEHD "A_TRUEHD" |