annotate libmpcodecs/ad_hwac3.c @ 35400:074069bb765a

Don't increment a pointer which might be null.
author ib
date Wed, 28 Nov 2012 11:57:52 +0000
parents cc27da5d7286
children 025d6c8eebb6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
bb1d63fea638 ac3_iec958_build_burst moved from ac3-iec958.c
arpi
parents: 5340
diff changeset
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
diego
parents: 14245
diff changeset
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
acfe034e5386 ISO8859-1 --> UTF-8
diego
parents: 23638
diff changeset
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
d22e246ab209 Distinguish between ac3 and dts by format tag.
ulion
parents: 25149
diff changeset
116 if (sh_audio->format == 0x2001)
d22e246ab209 Distinguish between ac3 and dts by format tag.
ulion
parents: 25149
diff changeset
117 {
26662
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
118 length = dts_syncinfo(sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate);
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
119 if(length >= 12)
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
120 {
26662
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
121 if(isdts != 1)
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
122 {
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
123 mp_msg(MSGT_DECAUDIO, MSGL_STATUS, "hwac3: switched to DTS, %d bps, %d Hz\n", bit_rate, sample_rate);
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
124 isdts = 1;
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
125 }
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
126 break;
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
127 }
26661
d22e246ab209 Distinguish between ac3 and dts by format tag.
ulion
parents: 25149
diff changeset
128 }
d22e246ab209 Distinguish between ac3 and dts by format tag.
ulion
parents: 25149
diff changeset
129 else
d22e246ab209 Distinguish between ac3 and dts by format tag.
ulion
parents: 25149
diff changeset
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
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
134 if(isdts != 0)
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
135 {
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
136 mp_msg(MSGT_DECAUDIO, MSGL_STATUS, "hwac3: switched to AC3, %d bps, %d Hz\n", bit_rate, sample_rate);
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
137 isdts = 0;
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
138 }
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
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
d22e246ab209 Distinguish between ac3 and dts by format tag.
ulion
parents: 25149
diff changeset
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
f394b0820fda Attempt a simple hack to fix -ac hwdts
reimar
parents: 30244
diff changeset
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
f394b0820fda Attempt a simple hack to fix -ac hwdts
reimar
parents: 30244
diff changeset
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
3aee7daaa8e5 Fix ADCTRL_SKIP_FRAME and add ADCTRL_RESYNC_STREAM
hzoli
parents: 14710
diff changeset
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
3aee7daaa8e5 Fix ADCTRL_SKIP_FRAME and add ADCTRL_RESYNC_STREAM
hzoli
parents: 14710
diff changeset
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
79163e100830 Mark DTS tables as const
reimar
parents: 24434
diff changeset
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
bb1d63fea638 ac3_iec958_build_burst moved from ac3-iec958.c
arpi
parents: 5340
diff changeset
248
24435
79163e100830 Mark DTS tables as const
reimar
parents: 24434
diff changeset
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
bb1d63fea638 ac3_iec958_build_burst moved from ac3-iec958.c
arpi
parents: 5340
diff changeset
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
bb1d63fea638 ac3_iec958_build_burst moved from ac3-iec958.c
arpi
parents: 5340
diff changeset
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
8b5437063481 Fix 10l typo in syncword
reimar
parents: 24433
diff changeset
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
7493e9bc7293 Fix warnings:
ulion
parents: 25139
diff changeset
536 fsize = convert_14bits_to_16bits(indata_ptr,
7493e9bc7293 Fix warnings:
ulion
parents: 25139
diff changeset
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 }