summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authormosu <mosu@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-05-19 20:55:52 +0000
committermosu <mosu@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-05-19 20:55:52 +0000
commit097a539fbd1712883187e572a56761fbcd6aee24 (patch)
tree2d708b2d22feae5354564bd2f631f58258b23b5c /libmpdemux
parentcc9db7f35dd4f52f838f384dd1bfbfb24cbffe4d (diff)
downloadmpv-097a539fbd1712883187e572a56761fbcd6aee24.tar.bz2
mpv-097a539fbd1712883187e572a56761fbcd6aee24.tar.xz
Endian fixes and proper support for headerless AAC streams.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@10134 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_mkv.cpp75
-rw-r--r--libmpdemux/matroska.h5
2 files changed, 74 insertions, 6 deletions
diff --git a/libmpdemux/demux_mkv.cpp b/libmpdemux/demux_mkv.cpp
index 0b71ce9a12..ad05040cc0 100644
--- a/libmpdemux/demux_mkv.cpp
+++ b/libmpdemux/demux_mkv.cpp
@@ -464,8 +464,13 @@ static int check_track_information(mkv_demuxer_t *d) {
t->a_formattag = 0x2000;
else if (!strcmp(t->codec_id, MKV_A_PCM))
t->a_formattag = 0x0001;
- else if (!strcmp(t->codec_id, MKV_A_AAC_2LC) ||
+ else if (!strcmp(t->codec_id, MKV_A_AAC_2MAIN) ||
+ !strcmp(t->codec_id, MKV_A_AAC_2LC) ||
+ !strcmp(t->codec_id, MKV_A_AAC_2SSR) ||
+ !strcmp(t->codec_id, MKV_A_AAC_4MAIN) ||
!strcmp(t->codec_id, MKV_A_AAC_4LC) ||
+ !strcmp(t->codec_id, MKV_A_AAC_4SSR) ||
+ !strcmp(t->codec_id, MKV_A_AAC_4LTP) ||
!strcmp(t->codec_id, MKV_A_AAC_4SBR))
t->a_formattag = mmioFOURCC('M', 'P', '4', 'A');
else if (!strcmp(t->codec_id, MKV_A_VORBIS)) {
@@ -1439,16 +1444,33 @@ extern "C" int demux_mkv_open(demuxer_t *demuxer) {
if (track) {
if (track->ms_compat) { // MS compatibility mode
+ BITMAPINFOHEADER *src, *dst;
mp_msg(MSGT_DEMUX, MSGL_INFO, "[mkv] Will play video track %u\n",
track->tnum);
sh_v = new_sh_video(demuxer, track->tnum);
- sh_v->bih = (BITMAPINFOHEADER *)calloc(1, sizeof(BITMAPINFOHEADER));
+ sh_v->bih = (BITMAPINFOHEADER *)calloc(1, track->private_size);
if (sh_v->bih == NULL) {
free_mkv_demuxer(mkv_d);
return 0;
}
- memcpy(sh_v->bih, track->private_data, sizeof(BITMAPINFOHEADER));
+ dst = sh_v->bih;
+ src = (BITMAPINFOHEADER *)track->private_data;
+ dst->biSize = get_uint32(&src->biSize);
+ dst->biWidth = get_uint32(&src->biWidth);
+ dst->biHeight = get_uint32(&src->biHeight);
+ dst->biPlanes = get_uint16(&src->biPlanes);
+ dst->biBitCount = get_uint16(&src->biBitCount);
+ dst->biCompression = get_uint32(&src->biCompression);
+ dst->biSizeImage = get_uint32(&src->biSizeImage);
+ dst->biXPelsPerMeter = get_uint32(&src->biXPelsPerMeter);
+ dst->biYPelsPerMeter = get_uint32(&src->biYPelsPerMeter);
+ dst->biClrUsed = get_uint32(&src->biClrUsed);
+ dst->biClrImportant = get_uint32(&src->biClrImportant);
+ memcpy((char *)dst + sizeof(BITMAPINFOHEADER),
+ (char *)src + sizeof(BITMAPINFOHEADER),
+ track->private_size - sizeof(BITMAPINFOHEADER));
+
sh_v->format = sh_v->bih->biCompression;
sh_v->fps = track->v_frate;
sh_v->frametime = 1 / track->v_frate;
@@ -1537,13 +1559,54 @@ extern "C" int demux_mkv_open(demuxer_t *demuxer) {
sh_a->wf->nBlockAlign = sh_a->wf->nAvgBytesPerSec;
sh_a->wf->wBitsPerSample = track->a_bps;
sh_a->samplesize = track->a_bps / 8;
- } else if (!strcmp(track->codec_id, MKV_A_AAC_2LC) ||
- !strcmp(track->codec_id, MKV_A_AAC_4LC) ||
- !strcmp(track->codec_id, MKV_A_AAC_4SBR)) {
+ } else if (track->a_formattag == mmioFOURCC('M', 'P', '4', 'A')) {
+ int profile, srate_idx;
+
sh_a->wf->nAvgBytesPerSec = 16000;
sh_a->wf->nBlockAlign = 1024;
sh_a->wf->wBitsPerSample = 0;
sh_a->samplesize = 0;
+
+ // Recreate the 'private data' which faad2 uses in its initialization.
+ // A_AAC/MPEG2/MAIN
+ // 0123456789012345
+ if (!strcmp(&track->codec_id[12], "MAIN"))
+ profile = 0;
+ else if (!strcmp(&track->codec_id[12], "LC"))
+ profile = 1;
+ else if (!strcmp(&track->codec_id[12], "SSR"))
+ profile = 2;
+ else
+ profile = 3;
+ if (92017 <= sh_a->samplerate)
+ srate_idx = 0;
+ else if (75132 <= sh_a->samplerate)
+ srate_idx = 1;
+ else if (55426 <= sh_a->samplerate)
+ srate_idx = 2;
+ else if (46009 <= sh_a->samplerate)
+ srate_idx = 3;
+ else if (37566 <= sh_a->samplerate)
+ srate_idx = 4;
+ else if (27713 <= sh_a->samplerate)
+ srate_idx = 5;
+ else if (23004 <= sh_a->samplerate)
+ srate_idx = 6;
+ else if (18783 <= sh_a->samplerate)
+ srate_idx = 7;
+ else if (13856 <= sh_a->samplerate)
+ srate_idx = 8;
+ else if (11502 <= sh_a->samplerate)
+ srate_idx = 9;
+ else if (9391 <= sh_a->samplerate)
+ srate_idx = 10;
+ else
+ srate_idx = 11;
+
+ sh_a->codecdata = (unsigned char *)calloc(1, 2);
+ sh_a->codecdata_len = 2;
+ sh_a->codecdata[0] = ((profile + 1) << 3) | ((srate_idx & 0xe) >> 1);
+ sh_a->codecdata[1] = ((srate_idx & 0x1) << 7) | (track->a_channels << 3);
} else if (!strcmp(track->codec_id, MKV_A_VORBIS)) {
for (i = 0; i < 3; i++) {
dp = new_demux_packet(track->header_sizes[i]);
diff --git a/libmpdemux/matroska.h b/libmpdemux/matroska.h
index 2dea7c3f55..404d840a17 100644
--- a/libmpdemux/matroska.h
+++ b/libmpdemux/matroska.h
@@ -7,8 +7,13 @@
#ifndef __MATROSKA_H
#define __MATROSKA_H
+#define MKV_A_AAC_2MAIN "A_AAC/MPEG2/MAIN"
#define MKV_A_AAC_2LC "A_AAC/MPEG2/LC"
+#define MKV_A_AAC_2SSR "A_AAC/MPEG2/SSR"
+#define MKV_A_AAC_4MAIN "A_AAC/MPEG4/MAIN"
#define MKV_A_AAC_4LC "A_AAC/MPEG4/LC"
+#define MKV_A_AAC_4SSR "A_AAC/MPEG4/SSR"
+#define MKV_A_AAC_4LTP "A_AAC/MPEG4/LTP"
#define MKV_A_AAC_4SBR "A_AAC/MPEG4/SBR"
#define MKV_A_AC3 "A_AC3"
#define MKV_A_DTS "A_DTS"