Mercurial > mplayer.hg
annotate libmpcodecs/ad_hwac3.c @ 32282:606e4157cd4c
Split alloc and init of context so that parameters can be set in the context
instead of requireing being passed through function parameters. This also
makes sws work with AVOptions.
author | michael |
---|---|
date | Sun, 26 Sep 2010 19:33:57 +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 } |