Mercurial > mplayer.hg
annotate libmpcodecs/ad_hwac3.c @ 34218:fb4ff8e46d79
Improve support for reget_buffer, this fixes DR1 with C93 FFmpeg decoder.
author | reimar |
---|---|
date | Sat, 05 Nov 2011 19:11:21 +0000 |
parents | cc27da5d7286 |
children | 025d6c8eebb6 |
rev | line source |
---|---|
30421
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
1 /* |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
2 * DTS code based on "ac3/decode_dts.c" and "ac3/conversion.c" from "ogle 0.9" |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
3 * (see http://www.dtek.chalmers.se/~dvd/) |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
4 * Reference: DOCS/tech/hwac3.txt !!!!! |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
5 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
6 * This file is part of MPlayer. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
7 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
8 * MPlayer is free software; you can redistribute it and/or modify |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
9 * it under the terms of the GNU General Public License as published by |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
10 * the Free Software Foundation; either version 2 of the License, or |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
11 * (at your option) any later version. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
12 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
13 * MPlayer is distributed in the hope that it will be useful, |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
16 * GNU General Public License for more details. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
17 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
18 * You should have received a copy of the GNU General Public License along |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
19 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
30248
diff
changeset
|
21 */ |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
22 |
28445
c6cef3c6768f
Give _XOPEN_SOURCE #define an explicit 600 value. Fixes build on Open Solaris.
diego
parents:
28420
diff
changeset
|
23 #define _XOPEN_SOURCE 600 |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
24 #include <stdio.h> |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
25 #include <stdlib.h> |
5370 | 26 #include <string.h> |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
27 #include <unistd.h> |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
28 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
29 #include "config.h" |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
30 #include "mp_msg.h" |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
31 #include "help_mp.h" |
23638
a81e246e3b38
Make sure we always have a swab() prototype when we use it,
reimar
parents:
18512
diff
changeset
|
32 #include "mpbswap.h" |
30238
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
33 #include "libavutil/common.h" |
30243
05f085c36d5b
Let the format filter do the AC3 endianness conversion instead of duplicating
reimar
parents:
30241
diff
changeset
|
34 #include "libavutil/intreadwrite.h" |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
35 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
36 #include "ad_internal.h" |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
37 |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
38 |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
39 static int isdts = -1; |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
40 |
30504
cc27da5d7286
Mark all ad_info_t/vd_info_t structure declarations as const.
diego
parents:
30421
diff
changeset
|
41 static const ad_info_t info = |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
42 { |
14710 | 43 "AC3/DTS pass-through S/PDIF", |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
44 "hwac3", |
23734 | 45 "Nick Kurshev/Peter Schüller", |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
46 "???", |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
47 "" |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
48 }; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
49 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
50 LIBAD_EXTERN(hwac3) |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
51 |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
52 |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
53 static int dts_syncinfo(uint8_t *indata_ptr, int *flags, int *sample_rate, int *bit_rate); |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
54 static int decode_audio_dts(unsigned char *indata_ptr, int len, unsigned char *buf); |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
55 |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
56 |
30238
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
57 static int a52_syncinfo (uint8_t *buf, int *sample_rate, int *bit_rate) |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
58 { |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
59 static const uint16_t rate[] = { 32, 40, 48, 56, 64, 80, 96, 112, |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
60 128, 160, 192, 224, 256, 320, 384, 448, |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
61 512, 576, 640}; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
62 int frmsizecod; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
63 int bitrate; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
64 int half; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
65 |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
66 if (buf[0] != 0x0b || buf[1] != 0x77) /* syncword */ |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
67 return 0; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
68 |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
69 if (buf[5] >= 0x60) /* bsid >= 12 */ |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
70 return 0; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
71 half = buf[5] >> 3; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
72 half = FFMAX(half - 8, 0); |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
73 |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
74 frmsizecod = buf[4] & 63; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
75 if (frmsizecod >= 38) |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
76 return 0; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
77 bitrate = rate[frmsizecod >> 1]; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
78 *bit_rate = (bitrate * 1000) >> half; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
79 |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
80 switch (buf[4] & 0xc0) { |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
81 case 0: |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
82 *sample_rate = 48000 >> half; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
83 return 4 * bitrate; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
84 case 0x40: |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
85 *sample_rate = 44100 >> half; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
86 return 2 * (320 * bitrate / 147 + (frmsizecod & 1)); |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
87 case 0x80: |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
88 *sample_rate = 32000 >> half; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
89 return 6 * bitrate; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
90 default: |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
91 return 0; |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
92 } |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
93 } |
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
94 |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
95 static int ac3dts_fillbuff(sh_audio_t *sh_audio) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
96 { |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
97 int length = 0; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
98 int flags = 0; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
99 int sample_rate = 0; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
100 int bit_rate = 0; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
101 |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
102 sh_audio->a_in_buffer_len = 0; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
103 /* sync frame:*/ |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
104 while(1) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
105 { |
25102
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
106 // Original code DTS has a 10 bytes header. |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
107 // Now max 12 bytes for 14 bits DTS header. |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
108 while(sh_audio->a_in_buffer_len < 12) |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
109 { |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
110 int c = demux_getc(sh_audio->ds); |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
111 if(c<0) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
112 return -1; /* EOF*/ |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
113 sh_audio->a_in_buffer[sh_audio->a_in_buffer_len++] = c; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
114 } |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
115 |
26661 | 116 if (sh_audio->format == 0x2001) |
117 { | |
26662 | 118 length = dts_syncinfo(sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate); |
119 if(length >= 12) | |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
120 { |
26662 | 121 if(isdts != 1) |
122 { | |
123 mp_msg(MSGT_DECAUDIO, MSGL_STATUS, "hwac3: switched to DTS, %d bps, %d Hz\n", bit_rate, sample_rate); | |
124 isdts = 1; | |
125 } | |
126 break; | |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
127 } |
26661 | 128 } |
129 else | |
130 { | |
30238
faed63286179
Make ad_hwac3 independent of liba52. Needs a minor amount of code duplication,
reimar
parents:
29401
diff
changeset
|
131 length = a52_syncinfo(sh_audio->a_in_buffer, &sample_rate, &bit_rate); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28445
diff
changeset
|
132 if(length >= 7 && length <= 3840) |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
133 { |
26662 | 134 if(isdts != 0) |
135 { | |
136 mp_msg(MSGT_DECAUDIO, MSGL_STATUS, "hwac3: switched to AC3, %d bps, %d Hz\n", bit_rate, sample_rate); | |
137 isdts = 0; | |
138 } | |
139 break; /* we're done.*/ | |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
140 } |
26661 | 141 } |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
142 /* bad file => resync*/ |
25102
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
143 memcpy(sh_audio->a_in_buffer, sh_audio->a_in_buffer + 1, 11); |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
144 --sh_audio->a_in_buffer_len; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
145 } |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
146 mp_msg(MSGT_DECAUDIO, MSGL_DBG2, "ac3dts: %s len=%d flags=0x%X %d Hz %d bit/s\n", isdts == 1 ? "DTS" : isdts == 0 ? "AC3" : "unknown", length, flags, sample_rate, bit_rate); |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
147 |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
148 sh_audio->samplerate = sample_rate; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
149 sh_audio->i_bps = bit_rate / 8; |
25102
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
150 demux_read_data(sh_audio->ds, sh_audio->a_in_buffer + 12, length - 12); |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
151 sh_audio->a_in_buffer_len = length; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28445
diff
changeset
|
152 |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
153 return length; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
154 } |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
155 |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
156 |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
157 static int preinit(sh_audio_t *sh) |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
158 { |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
159 /* Dolby AC3 audio: */ |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
160 sh->audio_out_minsize = 128 * 32 * 2 * 2; // DTS seems to need more than AC3 |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
161 sh->audio_in_minsize = 8192; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
162 sh->channels = 2; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
163 sh->samplesize = 2; |
30243
05f085c36d5b
Let the format filter do the AC3 endianness conversion instead of duplicating
reimar
parents:
30241
diff
changeset
|
164 sh->sample_format = AF_FORMAT_AC3_BE; |
30246 | 165 // HACK for DTS where useless swapping can't easily be removed |
30248
cb820f087ce0
100l, fix typo that caused ad_hwac3 to fail to compile.
reimar
parents:
30246
diff
changeset
|
166 if (sh->format == 0x2001) |
30246 | 167 sh->sample_format = AF_FORMAT_AC3_NE; |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
168 return 1; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
169 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
170 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
171 static int init(sh_audio_t *sh_audio) |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
172 { |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
173 /* Dolby AC3 passthrough:*/ |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
174 if(ac3dts_fillbuff(sh_audio) < 0) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
175 { |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
176 mp_msg(MSGT_DECAUDIO, MSGL_ERR, "AC3/DTS sync failed\n"); |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
177 return 0; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
178 } |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
179 return 1; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
180 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
181 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
182 static void uninit(sh_audio_t *sh) |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
183 { |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
184 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
185 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
186 static int control(sh_audio_t *sh,int cmd,void* arg, ...) |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
187 { |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
188 switch(cmd) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
189 { |
15558 | 190 case ADCTRL_RESYNC_STREAM: |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
191 case ADCTRL_SKIP_FRAME: |
15558 | 192 ac3dts_fillbuff(sh); |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
193 return CONTROL_TRUE; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
194 } |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
195 return CONTROL_UNKNOWN; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
196 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
197 |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
198 |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
199 static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen) |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
200 { |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
201 int len = sh_audio->a_in_buffer_len; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28445
diff
changeset
|
202 |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
203 if(len <= 0) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
204 if((len = ac3dts_fillbuff(sh_audio)) <= 0) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
205 return len; /*EOF*/ |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
206 sh_audio->a_in_buffer_len = 0; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
207 |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
208 if(isdts == 1) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
209 { |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
210 return decode_audio_dts(sh_audio->a_in_buffer, len, buf); |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
211 } |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
212 else if(isdts == 0) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
213 { |
30243
05f085c36d5b
Let the format filter do the AC3 endianness conversion instead of duplicating
reimar
parents:
30241
diff
changeset
|
214 AV_WB16(buf, 0xF872); // iec 61937 syncword 1 |
05f085c36d5b
Let the format filter do the AC3 endianness conversion instead of duplicating
reimar
parents:
30241
diff
changeset
|
215 AV_WB16(buf + 2, 0x4E1F); // iec 61937 syncword 2 |
05f085c36d5b
Let the format filter do the AC3 endianness conversion instead of duplicating
reimar
parents:
30241
diff
changeset
|
216 buf[4] = sh_audio->a_in_buffer[5] & 0x7; // bsmod |
05f085c36d5b
Let the format filter do the AC3 endianness conversion instead of duplicating
reimar
parents:
30241
diff
changeset
|
217 buf[5] = 0x01; // data-type ac3 |
05f085c36d5b
Let the format filter do the AC3 endianness conversion instead of duplicating
reimar
parents:
30241
diff
changeset
|
218 AV_WB16(buf + 6, len << 3); // number of bits in payload |
24433
435b37266f1e
Improved comments, based on patches by Ulion [ulion2002 gmail com]
reimar
parents:
24432
diff
changeset
|
219 memcpy(buf + 8, sh_audio->a_in_buffer, len); |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
220 memset(buf + 8 + len, 0, 6144 - 8 - len); |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
221 |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
222 return 6144; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
223 } |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
224 else |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
225 return -1; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
226 } |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
227 |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
228 |
24435 | 229 static const int DTS_SAMPLEFREQS[16] = |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
230 { |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
231 0, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
232 8000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
233 16000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
234 32000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
235 64000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
236 128000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
237 11025, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
238 22050, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
239 44100, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
240 88200, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
241 176400, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
242 12000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
243 24000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
244 48000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
245 96000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
246 192000 |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
247 }; |
5370 | 248 |
24435 | 249 static const int DTS_BITRATES[30] = |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
250 { |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
251 32000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
252 56000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
253 64000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
254 96000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
255 112000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
256 128000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
257 192000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
258 224000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
259 256000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
260 320000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
261 384000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
262 448000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
263 512000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
264 576000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
265 640000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
266 768000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
267 896000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
268 1024000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
269 1152000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
270 1280000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
271 1344000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
272 1408000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
273 1411200, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
274 1472000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
275 1536000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
276 1920000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
277 2048000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
278 3072000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
279 3840000, |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
280 4096000 |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
281 }; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
282 |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
283 static int dts_decode_header(uint8_t *indata_ptr, int *rate, int *nblks, int *sfreq) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
284 { |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
285 int ftype; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
286 int surp; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
287 int unknown_bit; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
288 int fsize; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
289 int amode; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
290 |
25102
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
291 int word_mode; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
292 int le_mode; |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
293 |
25102
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
294 unsigned int first4bytes = indata_ptr[0] << 24 | indata_ptr[1] << 16 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
295 | indata_ptr[2] << 8 | indata_ptr[3]; |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
296 |
25102
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
297 switch(first4bytes) |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
298 { |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
299 /* 14 bits LE */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
300 case 0xff1f00e8: |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
301 /* Also make sure frame type is 1. */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
302 if ((indata_ptr[4]&0xf0) != 0xf0 || indata_ptr[5] != 0x07) |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
303 return -1; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
304 word_mode = 0; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
305 le_mode = 1; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
306 break; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
307 /* 14 bits BE */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
308 case 0x1fffe800: |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
309 /* Also make sure frame type is 1. */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
310 if (indata_ptr[4] != 0x07 || (indata_ptr[5]&0xf0) != 0xf0) |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
311 return -1; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
312 word_mode = 0; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
313 le_mode = 0; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
314 break; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
315 /* 16 bits LE */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
316 case 0xfe7f0180: |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
317 word_mode = 1; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
318 le_mode = 1; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
319 break; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
320 /* 16 bits BE */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
321 case 0x7ffe8001: |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
322 word_mode = 1; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
323 le_mode = 0; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
324 break; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
325 default: |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
326 return -1; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
327 } |
5370 | 328 |
25102
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
329 if(word_mode) |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
330 { |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
331 /* First bit after first 32 bits: |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
332 Frame type ( 1: Normal frame; 0: Termination frame ) */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
333 ftype = indata_ptr[4+le_mode] >> 7; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
334 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28445
diff
changeset
|
335 if(ftype != 1) |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
336 { |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
337 mp_msg(MSGT_DECAUDIO, MSGL_ERR, "DTS: Termination frames not handled, REPORT BUG\n"); |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
338 return -1; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
339 } |
25102
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
340 /* Next 5 bits: Surplus Sample Count V SURP 5 bits */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
341 surp = indata_ptr[4+le_mode] >> 2 & 0x1f; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
342 /* Number of surplus samples */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
343 surp = (surp + 1) % 32; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
344 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
345 /* One unknown bit, crc? */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
346 unknown_bit = indata_ptr[4+le_mode] >> 1 & 0x01; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
347 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
348 /* NBLKS 7 bits: Valid Range=5-127, Invalid Range=0-4 */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
349 *nblks = (indata_ptr[4+le_mode] & 0x01) << 6 | indata_ptr[5-le_mode] >> 2; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
350 /* NBLKS+1 indicates the number of 32 sample PCM audio blocks per channel |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
351 encoded in the current frame per channel. */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
352 ++(*nblks); |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
353 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
354 /* Frame Byte Size V FSIZE 14 bits: 0-94=Invalid, 95-8191=Valid range-1 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
355 (ie. 96 bytes to 8192 bytes), 8192-16383=Invalid |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
356 FSIZE defines the byte size of the current audio frame. */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
357 fsize = (indata_ptr[5-le_mode] & 0x03) << 12 | indata_ptr[6+le_mode] << 4 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
358 | indata_ptr[7-le_mode] >> 4; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
359 ++fsize; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
360 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
361 /* Audio Channel Arrangement ACC AMODE 6 bits */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
362 amode = (indata_ptr[7-le_mode] & 0x0f) << 2 | indata_ptr[8+le_mode] >> 6; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
363 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
364 /* Source Sampling rate ACC SFREQ 4 bits */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
365 *sfreq = indata_ptr[8+le_mode] >> 2 & 0x0f; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
366 /* Transmission Bit Rate ACC RATE 5 bits */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
367 *rate = (indata_ptr[8+le_mode] & 0x03) << 3 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
368 | (indata_ptr[9-le_mode] >> 5 & 0x07); |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
369 } |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
370 else |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
371 { |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
372 /* in the case judgement, we assure this */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
373 ftype = 1; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
374 surp = 0; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
375 /* 14 bits support, every 2 bytes, & 0x3fff, got used 14 bits */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
376 /* Bits usage: |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
377 32 bits: Sync code (28 + 4) 1th and 2th word, 4 bits in 3th word |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
378 1 bits: Frame type 1 bits in 3th word |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
379 5 bits: SURP 5 bits in 3th word |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
380 1 bits: crc? 1 bits in 3th word |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
381 7 bits: NBLKS 3 bits in 3th word, 4 bits in 4th word |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
382 14 bits: FSIZE 10 bits in 4th word, 4 bits in 5th word |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
383 in 14 bits mode, FSIZE = FSIZE*8/14*2 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
384 6 bits: AMODE 6 bits in 5th word |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
385 4 bits: SFREQ 4 bits in 5th word |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
386 5 bits: RATE 5 bits in 6th word |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
387 total bits: 75 bits */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
388 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
389 /* NBLKS 7 bits: Valid Range=5-127, Invalid Range=0-4 */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
390 *nblks = (indata_ptr[5-le_mode] & 0x07) << 4 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
391 | (indata_ptr[6+le_mode] & 0x3f) >> 2; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
392 /* NBLKS+1 indicates the number of 32 sample PCM audio blocks per channel |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
393 encoded in the current frame per channel. */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
394 ++(*nblks); |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
395 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
396 /* Frame Byte Size V FSIZE 14 bits: 0-94=Invalid, 95-8191=Valid range-1 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
397 (ie. 96 bytes to 8192 bytes), 8192-16383=Invalid |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
398 FSIZE defines the byte size of the current audio frame. */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
399 fsize = (indata_ptr[6+le_mode] & 0x03) << 12 | indata_ptr[7-le_mode] << 4 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
400 | (indata_ptr[8+le_mode] & 0x3f) >> 2; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
401 ++fsize; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
402 fsize = fsize * 8 / 14 * 2; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
403 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
404 /* Audio Channel Arrangement ACC AMODE 6 bits */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
405 amode = (indata_ptr[8+le_mode] & 0x03) << 4 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
406 | (indata_ptr[9-le_mode] & 0xf0) >> 4; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
407 |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
408 /* Source Sampling rate ACC SFREQ 4 bits */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
409 *sfreq = indata_ptr[9-le_mode] & 0x0f; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
410 /* Transmission Bit Rate ACC RATE 5 bits */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
411 *rate = (indata_ptr[10+le_mode] & 0x3f) >> 1; |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
412 } |
25124
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
413 #if 0 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28445
diff
changeset
|
414 if(*sfreq != 13) |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
415 { |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
416 mp_msg(MSGT_DECAUDIO, MSGL_ERR, "DTS: Only 48kHz supported, REPORT BUG\n"); |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
417 return -1; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
418 } |
25124
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
419 #endif |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28445
diff
changeset
|
420 if((fsize > 8192) || (fsize < 96)) |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
421 { |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
422 mp_msg(MSGT_DECAUDIO, MSGL_ERR, "DTS: fsize: %d invalid, REPORT BUG\n", fsize); |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
423 return -1; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
424 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28445
diff
changeset
|
425 |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
426 if(*nblks != 8 && |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
427 *nblks != 16 && |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
428 *nblks != 32 && |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
429 *nblks != 64 && |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
430 *nblks != 128 && |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28445
diff
changeset
|
431 ftype == 1) |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
432 { |
10948
aebf939834c3
10l found by Dominik 'Rathann' Mierzejewski <dominik@rangers.eu.org>
alex
parents:
10012
diff
changeset
|
433 mp_msg(MSGT_DECAUDIO, MSGL_ERR, "DTS: nblks %d not valid for normal frame, REPORT BUG\n", *nblks); |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
434 return -1; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
435 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28445
diff
changeset
|
436 |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
437 return fsize; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
438 } |
5370 | 439 |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
440 static int dts_syncinfo(uint8_t *indata_ptr, int *flags, int *sample_rate, int *bit_rate) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
441 { |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
442 int nblks; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
443 int fsize; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
444 int rate; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
445 int sfreq; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28445
diff
changeset
|
446 |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
447 fsize = dts_decode_header(indata_ptr, &rate, &nblks, &sfreq); |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
448 if(fsize >= 0) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
449 { |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
450 if(rate >= 0 && rate <= 29) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
451 *bit_rate = DTS_BITRATES[rate]; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
452 else |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
453 *bit_rate = 0; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
454 if(sfreq >= 1 && sfreq <= 15) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
455 *sample_rate = DTS_SAMPLEFREQS[sfreq]; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
456 else |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
457 *sample_rate = 0; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
458 } |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
459 return fsize; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
460 } |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
461 |
25124
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
462 static int convert_14bits_to_16bits(const unsigned char *src, |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
463 unsigned char *dest, |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
464 int len, |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
465 int is_le) |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
466 { |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
467 uint16_t *p = (uint16_t *)dest; |
25139
94e618df1dea
Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents:
25124
diff
changeset
|
468 uint16_t buf = 0; |
25124
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
469 int spacebits = 16; |
25139
94e618df1dea
Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents:
25124
diff
changeset
|
470 if (len <= 0) return 0; |
25124
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
471 while (len > 0) { |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
472 uint16_t v; |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
473 if (len == 1) |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
474 v = is_le ? src[0] : src[0] << 8; |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
475 else |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
476 v = is_le ? src[1] << 8 | src[0] : src[0] << 8 | src[1]; |
25139
94e618df1dea
Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents:
25124
diff
changeset
|
477 v <<= 2; |
25124
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
478 src += 2; |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
479 len -= 2; |
25139
94e618df1dea
Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents:
25124
diff
changeset
|
480 buf |= v >> (16 - spacebits); |
94e618df1dea
Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents:
25124
diff
changeset
|
481 spacebits -= 14; |
94e618df1dea
Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents:
25124
diff
changeset
|
482 if (spacebits < 0) { |
94e618df1dea
Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents:
25124
diff
changeset
|
483 *p++ = buf; |
94e618df1dea
Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents:
25124
diff
changeset
|
484 spacebits += 16; |
94e618df1dea
Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents:
25124
diff
changeset
|
485 buf = v << (spacebits - 2); |
25124
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
486 } |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
487 } |
25139
94e618df1dea
Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents:
25124
diff
changeset
|
488 *p++ = buf; |
25124
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
489 return (unsigned char *)p - dest; |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
490 } |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
491 |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
492 static int decode_audio_dts(unsigned char *indata_ptr, int len, unsigned char *buf) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
493 { |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
494 int nblks; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
495 int fsize; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
496 int rate; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
497 int sfreq; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
498 int nr_samples; |
25124
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
499 int convert_16bits = 0; |
24432
79fcacd73f9b
Simplify and fix big-endian hwac3 header generation code.
reimar
parents:
23734
diff
changeset
|
500 uint16_t *buf16 = (uint16_t *)buf; |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
501 |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
502 fsize = dts_decode_header(indata_ptr, &rate, &nblks, &sfreq); |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
503 if(fsize < 0) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
504 return -1; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
505 nr_samples = nblks * 32; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
506 |
24432
79fcacd73f9b
Simplify and fix big-endian hwac3 header generation code.
reimar
parents:
23734
diff
changeset
|
507 buf16[0] = 0xf872; /* iec 61937 */ |
24434 | 508 buf16[1] = 0x4e1f; /* syncword */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28445
diff
changeset
|
509 switch(nr_samples) |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
510 { |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
511 case 512: |
24432
79fcacd73f9b
Simplify and fix big-endian hwac3 header generation code.
reimar
parents:
23734
diff
changeset
|
512 buf16[2] = 0x000b; /* DTS-1 (512-sample bursts) */ |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
513 break; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
514 case 1024: |
24432
79fcacd73f9b
Simplify and fix big-endian hwac3 header generation code.
reimar
parents:
23734
diff
changeset
|
515 buf16[2] = 0x000c; /* DTS-2 (1024-sample bursts) */ |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
516 break; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
517 case 2048: |
24432
79fcacd73f9b
Simplify and fix big-endian hwac3 header generation code.
reimar
parents:
23734
diff
changeset
|
518 buf16[2] = 0x000d; /* DTS-3 (2048-sample bursts) */ |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
519 break; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
520 default: |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
521 mp_msg(MSGT_DECAUDIO, MSGL_ERR, "DTS: %d-sample bursts not supported\n", nr_samples); |
24432
79fcacd73f9b
Simplify and fix big-endian hwac3 header generation code.
reimar
parents:
23734
diff
changeset
|
522 buf16[2] = 0x0000; |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
523 break; |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
524 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28445
diff
changeset
|
525 |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
526 if(fsize + 8 > nr_samples * 2 * 2) |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
527 { |
25124
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
528 // dts wav (14bits LE) match this condition, one way to passthrough |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
529 // is not add iec 61937 header, decoders will notice the dts header |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
530 // and identify the dts stream. Another way here is convert |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
531 // the stream from 14 bits to 16 bits. |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
532 if ((indata_ptr[0] == 0xff || indata_ptr[0] == 0x1f) |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
533 && fsize * 14 / 16 + 8 <= nr_samples * 2 * 2) { |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
534 // The input stream is 14 bits, we can shrink it to 16 bits |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
535 // to save space for add the 61937 header |
25149 | 536 fsize = convert_14bits_to_16bits(indata_ptr, |
537 &buf[8], | |
25124
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
538 fsize, |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
539 indata_ptr[0] == 0xff /* is LE */ |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
540 ); |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
541 mp_msg(MSGT_DECAUDIO, MSGL_DBG3, "DTS: shrink 14 bits stream to " |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
542 "16 bits %02x%02x%02x%02x => %02x%02x%02x%02x, new size %d.\n", |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
543 indata_ptr[0], indata_ptr[1], indata_ptr[2], indata_ptr[3], |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
544 buf[8], buf[9], buf[10], buf[11], fsize); |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
545 convert_16bits = 1; |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
546 } |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
547 else |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
548 mp_msg(MSGT_DECAUDIO, MSGL_ERR, "DTS: more data than fits\n"); |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
549 } |
25124
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
550 |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
551 buf16[3] = fsize << 3; |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
552 |
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
553 if (!convert_16bits) { |
29401
f01023c524c3
Replace WORDS_BIGENDIAN by HAVE_BIGENDIAN in all internal code.
diego
parents:
29263
diff
changeset
|
554 #if HAVE_BIGENDIAN |
25102
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
555 /* BE stream */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
556 if (indata_ptr[0] == 0x1f || indata_ptr[0] == 0x7f) |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
557 #else |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
558 /* LE stream */ |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
559 if (indata_ptr[0] == 0xff || indata_ptr[0] == 0xfe) |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
560 #endif |
24433
435b37266f1e
Improved comments, based on patches by Ulion [ulion2002 gmail com]
reimar
parents:
24432
diff
changeset
|
561 memcpy(&buf[8], indata_ptr, fsize); |
25102
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
562 else |
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
563 { |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
564 swab(indata_ptr, &buf[8], fsize); |
24508
4f9b7524f65d
Handle swab when input length is odd (treat it as if there was an additional
reimar
parents:
24436
diff
changeset
|
565 if (fsize & 1) { |
4f9b7524f65d
Handle swab when input length is odd (treat it as if there was an additional
reimar
parents:
24436
diff
changeset
|
566 buf[8+fsize-1] = 0; |
4f9b7524f65d
Handle swab when input length is odd (treat it as if there was an additional
reimar
parents:
24436
diff
changeset
|
567 buf[8+fsize] = indata_ptr[fsize-1]; |
4f9b7524f65d
Handle swab when input length is odd (treat it as if there was an additional
reimar
parents:
24436
diff
changeset
|
568 fsize++; |
4f9b7524f65d
Handle swab when input length is odd (treat it as if there was an additional
reimar
parents:
24436
diff
changeset
|
569 } |
25102
55d8b87b62da
Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents:
24509
diff
changeset
|
570 } |
25124
8809817b2266
Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents:
25102
diff
changeset
|
571 } |
10012
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
572 memset(&buf[fsize + 8], 0, nr_samples * 2 * 2 - (fsize + 8)); |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
573 |
f8f3f8b4e0d7
DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents:
8026
diff
changeset
|
574 return nr_samples * 2 * 2; |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
575 } |