mirror of
https://gitlab.com/mbunkus/mkvtoolnix.git
synced 2024-12-25 12:27:21 +00:00
116 lines
2.8 KiB
C++
116 lines
2.8 KiB
C++
/*
|
|
mkvmerge -- utility for splicing together matroska files
|
|
from component media subtypes
|
|
|
|
dts_common.cpp
|
|
|
|
Written by Moritz Bunkus <moritz@bunkus.org>
|
|
|
|
Distributed under the GPL
|
|
see the file COPYING for details
|
|
or visit http://www.gnu.org/copyleft/gpl.html
|
|
*/
|
|
|
|
/*!
|
|
\file
|
|
\version \$Id: dts_common.cpp,v 1.1 2003/05/15 08:58:52 mosu Exp $
|
|
\brief helper function for DTS data
|
|
\author Moritz Bunkus <moritz @ bunkus.org>
|
|
*/
|
|
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
#include "dts_common.h"
|
|
|
|
static int DTS_SAMPLEFREQS[16] =
|
|
{
|
|
0, 8000, 16000, 32000, 64000, 128000, 11025, 22050,
|
|
44100, 88200, 176400, 12000, 24000, 48000, 96000, 192000
|
|
};
|
|
|
|
static int DTS_BITRATES[30] =
|
|
{
|
|
32000, 56000, 64000, 96000, 112000, 128000, 192000,
|
|
224000, 256000, 320000, 384000, 448000, 512000, 576000,
|
|
640000, 768000, 896000, 1024000, 1152000, 1280000, 1344000,
|
|
1408000, 1411200, 1472000, 1536000, 1920000, 2048000, 3072000,
|
|
3840000, 4096000
|
|
};
|
|
|
|
|
|
int find_dts_header(unsigned char *buf, int size, dts_header_t *dts_header) {
|
|
// dts_header_t header;
|
|
int i;
|
|
unsigned char * indata_ptr;
|
|
int ftype;
|
|
int surp;
|
|
int unknown_bit;
|
|
int fsize;
|
|
int amode;
|
|
int nblks;
|
|
int sfreq;
|
|
int rate;
|
|
|
|
for (i = 0; i < (size - 9); i++) {
|
|
if ((buf[i] != 0x7f) || (buf[i + 1] != 0xfe) || (buf[i + 2] != 0x80) ||
|
|
(buf[i + 3] != 0x01))
|
|
continue;
|
|
|
|
indata_ptr = buf + i;
|
|
|
|
ftype = indata_ptr[4] >> 7;
|
|
|
|
surp = (indata_ptr[4] >> 2) & 0x1f;
|
|
surp = (surp + 1) % 32;
|
|
//fprintf(stderr,"surp = %d\n", surp);
|
|
|
|
unknown_bit = (indata_ptr[4] >> 1) & 0x01;
|
|
|
|
nblks = (indata_ptr[4] & 0x01) << 6 | (indata_ptr[5] >> 2);
|
|
nblks = nblks + 1;
|
|
|
|
fsize = (indata_ptr[5] & 0x03) << 12 | (indata_ptr[6] << 4) |
|
|
(indata_ptr[7] >> 4);
|
|
fsize = fsize + 1;
|
|
|
|
amode = (indata_ptr[7] & 0x0f) << 2 | (indata_ptr[8] >> 6);
|
|
sfreq = (indata_ptr[8] >> 2) & 0x0f;
|
|
rate = (indata_ptr[8] & 0x03) << 3 | ((indata_ptr[9] >> 5) & 0x07);
|
|
|
|
if (ftype != 1) {
|
|
// "DTS: Termination frames not handled, REPORT BUG\n";
|
|
return -1;
|
|
}
|
|
|
|
if (sfreq != 13) {
|
|
// "DTS: Only 48kHz supported, REPORT BUG\n";
|
|
return -1;
|
|
}
|
|
|
|
if ((fsize > 8192) || (fsize < 96)) {
|
|
// "DTS: fsize: %d invalid, REPORT BUG\n", fsize;
|
|
return -1;
|
|
}
|
|
|
|
if ((nblks != 8) &&
|
|
(nblks != 16) &&
|
|
(nblks != 32) &&
|
|
(nblks != 64) &&
|
|
(nblks != 128) &&
|
|
(ftype == 1)) {
|
|
// "DTS: nblks %d not valid for normal frame, REPORT BUG\n", nblks;
|
|
return -1;
|
|
}
|
|
|
|
// header ok
|
|
dts_header->sample_rate = DTS_SAMPLEFREQS[sfreq];
|
|
dts_header->bit_rate = DTS_BITRATES[rate];
|
|
dts_header->bytes = fsize;
|
|
|
|
return i;
|
|
}
|
|
|
|
return -1;
|
|
}
|