annotate libmpcodecs/ad_hwac3.c @ 29269:4d9de809b174

Add a hack to detect when we are writing into a Windows pipe since the fseek incorrectly does not fail like it should. This ensures we will not incorrectly append the file header at the end. Based on patch by Zhou Zongyi [zhouzongyi at pset.suntec.net]
author reimar
date Sat, 16 May 2009 13:59:53 +0000
parents 0f1b5b68af32
children f01023c524c3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5370
bb1d63fea638 ac3_iec958_build_burst moved from ac3-iec958.c
arpi
parents: 5340
diff changeset
1
bb1d63fea638 ac3_iec958_build_burst moved from ac3-iec958.c
arpi
parents: 5340
diff changeset
2 // Reference: DOCS/tech/hwac3.txt !!!!!
bb1d63fea638 ac3_iec958_build_burst moved from ac3-iec958.c
arpi
parents: 5340
diff changeset
3
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
4 /* DTS code based on "ac3/decode_dts.c" and "ac3/conversion.c" from "ogle 0.9"
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
5 (see http://www.dtek.chalmers.se/~dvd/)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
6 */
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
7
28445
c6cef3c6768f Give _XOPEN_SOURCE #define an explicit 600 value. Fixes build on Open Solaris.
diego
parents: 28420
diff changeset
8 #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
9 #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
10 #include <stdlib.h>
5370
bb1d63fea638 ac3_iec958_build_burst moved from ac3-iec958.c
arpi
parents: 5340
diff changeset
11 #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
12 #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
13
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
14 #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
15 #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
16 #include "help_mp.h"
23638
a81e246e3b38 Make sure we always have a swab() prototype when we use it,
reimar
parents: 18512
diff changeset
17 #include "mpbswap.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
18
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
19 #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
20
27588
9b767bba79fb External liba52 support, part 2 of 2.
rathann
parents: 27339
diff changeset
21 #ifdef CONFIG_LIBA52_INTERNAL
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15558
diff changeset
22 #include "liba52/a52.h"
27588
9b767bba79fb External liba52 support, part 2 of 2.
rathann
parents: 27339
diff changeset
23 #else
9b767bba79fb External liba52 support, part 2 of 2.
rathann
parents: 27339
diff changeset
24 #include <a52dec/a52.h>
9b767bba79fb External liba52 support, part 2 of 2.
rathann
parents: 27339
diff changeset
25 #endif
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
26
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
27
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
28 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
29
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28445
diff changeset
30 static 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
31 {
14710
diego
parents: 14245
diff changeset
32 "AC3/DTS pass-through S/PDIF",
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
33 "hwac3",
23734
acfe034e5386 ISO8859-1 --> UTF-8
diego
parents: 23638
diff changeset
34 "Nick Kurshev/Peter Schüller",
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
35 "???",
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
36 ""
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
37 };
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
38
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
39 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
40
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
41
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
42 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
43 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
44
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
45
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
46 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
47 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
48 int length = 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
49 int flags = 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
50 int sample_rate = 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
51 int bit_rate = 0;
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 sh_audio->a_in_buffer_len = 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
54 /* sync frame:*/
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
55 while(1)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
56 {
25102
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
57 // 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
58 // 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
59 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
60 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
61 int c = demux_getc(sh_audio->ds);
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
62 if(c<0)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
63 return -1; /* EOF*/
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
64 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
65 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
66
26661
d22e246ab209 Distinguish between ac3 and dts by format tag.
ulion
parents: 25149
diff changeset
67 if (sh_audio->format == 0x2001)
d22e246ab209 Distinguish between ac3 and dts by format tag.
ulion
parents: 25149
diff changeset
68 {
26662
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
69 length = dts_syncinfo(sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate);
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
70 if(length >= 12)
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
71 {
26662
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
72 if(isdts != 1)
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
73 {
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
74 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
75 isdts = 1;
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
76 }
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
77 break;
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
78 }
26661
d22e246ab209 Distinguish between ac3 and dts by format tag.
ulion
parents: 25149
diff changeset
79 }
d22e246ab209 Distinguish between ac3 and dts by format tag.
ulion
parents: 25149
diff changeset
80 else
d22e246ab209 Distinguish between ac3 and dts by format tag.
ulion
parents: 25149
diff changeset
81 {
26662
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
82 length = a52_syncinfo(sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28445
diff changeset
83 if(length >= 7 && length <= 3840)
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
84 {
26662
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
85 if(isdts != 0)
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
86 {
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
87 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
88 isdts = 0;
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
89 }
1f2553fb3cbe Reindent for last commit.
ulion
parents: 26661
diff changeset
90 break; /* we're done.*/
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
91 }
26661
d22e246ab209 Distinguish between ac3 and dts by format tag.
ulion
parents: 25149
diff changeset
92 }
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
93 /* bad file => resync*/
25102
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
94 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
95 --sh_audio->a_in_buffer_len;
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 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
98
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
99 sh_audio->samplerate = sample_rate;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
100 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
101 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
102 sh_audio->a_in_buffer_len = length;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28445
diff changeset
103
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
104 // TODO: is DTS also checksummed?
27588
9b767bba79fb External liba52 support, part 2 of 2.
rathann
parents: 27339
diff changeset
105 #ifdef CONFIG_LIBA52_INTERNAL
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
106 if(isdts == 0 && crc16_block(sh_audio->a_in_buffer + 2, length - 2) != 0)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
107 mp_msg(MSGT_DECAUDIO, MSGL_STATUS, "a52: CRC check failed! \n");
27588
9b767bba79fb External liba52 support, part 2 of 2.
rathann
parents: 27339
diff changeset
108 #endif
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28445
diff changeset
109
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
110 return length;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
111 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
112
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
113
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
114 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
115 {
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
116 /* Dolby AC3 audio: */
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
117 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
118 sh->audio_in_minsize = 8192;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
119 sh->channels = 2;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
120 sh->samplesize = 2;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14187
diff changeset
121 sh->sample_format = AF_FORMAT_AC3;
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
122 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
123 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
124
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
125 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
126 {
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
127 /* Dolby AC3 passthrough:*/
18512
rathann
parents: 17012
diff changeset
128 a52_state_t *a52_state = a52_init(0);
rathann
parents: 17012
diff changeset
129 if(a52_state == NULL)
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
130 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
131 mp_msg(MSGT_DECAUDIO, MSGL_ERR, "A52 init failed\n");
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
132 return 0;
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
133 }
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
134 if(ac3dts_fillbuff(sh_audio) < 0)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
135 {
26923
cbd9c19ce4d8 Properly free memory allocate by liba52.
reimar
parents: 26662
diff changeset
136 a52_free(a52_state);
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
137 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
138 return 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
139 }
26923
cbd9c19ce4d8 Properly free memory allocate by liba52.
reimar
parents: 26662
diff changeset
140 sh_audio->context = a52_state;
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
141 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
142 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
143
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
144 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
145 {
26923
cbd9c19ce4d8 Properly free memory allocate by liba52.
reimar
parents: 26662
diff changeset
146 a52_free(sh->context);
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
147 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
148
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
149 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
150 {
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
151 switch(cmd)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
152 {
15558
3aee7daaa8e5 Fix ADCTRL_SKIP_FRAME and add ADCTRL_RESYNC_STREAM
hzoli
parents: 14710
diff changeset
153 case ADCTRL_RESYNC_STREAM:
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
154 case ADCTRL_SKIP_FRAME:
15558
3aee7daaa8e5 Fix ADCTRL_SKIP_FRAME and add ADCTRL_RESYNC_STREAM
hzoli
parents: 14710
diff changeset
155 ac3dts_fillbuff(sh);
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
156 return CONTROL_TRUE;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
157 }
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
158 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
159 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
160
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
161
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
162 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
163 {
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
164 int len = sh_audio->a_in_buffer_len;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28445
diff changeset
165
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
166 if(len <= 0)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
167 if((len = ac3dts_fillbuff(sh_audio)) <= 0)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
168 return len; /*EOF*/
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
169 sh_audio->a_in_buffer_len = 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
170
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
171 if(isdts == 1)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
172 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
173 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
174 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
175 else if(isdts == 0)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
176 {
24432
79fcacd73f9b Simplify and fix big-endian hwac3 header generation code.
reimar
parents: 23734
diff changeset
177 uint16_t *buf16 = (uint16_t *)buf;
24433
435b37266f1e Improved comments, based on patches by Ulion [ulion2002 gmail com]
reimar
parents: 24432
diff changeset
178 buf16[0] = 0xF872; // iec 61937 syncword 1
435b37266f1e Improved comments, based on patches by Ulion [ulion2002 gmail com]
reimar
parents: 24432
diff changeset
179 buf16[1] = 0x4E1F; // iec 61937 syncword 2
435b37266f1e Improved comments, based on patches by Ulion [ulion2002 gmail com]
reimar
parents: 24432
diff changeset
180 buf16[2] = 0x0001; // data-type ac3
24509
767a9fd651c7 Copy AC-3 bsmod field into IEC data-type field as required by the specs
reimar
parents: 24508
diff changeset
181 buf16[2] |= (sh_audio->a_in_buffer[5] & 0x7) << 8; // bsmod
24433
435b37266f1e Improved comments, based on patches by Ulion [ulion2002 gmail com]
reimar
parents: 24432
diff changeset
182 buf16[3] = len << 3; // number of bits in payload
28299
8baa89b228c5 revert #ifdef WORDS_BIGENDIAN => #if WORDS_BIGENDIAN changes from r28331
gpoirier
parents: 28296
diff changeset
183 #ifdef WORDS_BIGENDIAN
24433
435b37266f1e Improved comments, based on patches by Ulion [ulion2002 gmail com]
reimar
parents: 24432
diff changeset
184 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
185 #else
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
186 swab(sh_audio->a_in_buffer, buf + 8, len);
24508
4f9b7524f65d Handle swab when input length is odd (treat it as if there was an additional
reimar
parents: 24436
diff changeset
187 if (len & 1) {
4f9b7524f65d Handle swab when input length is odd (treat it as if there was an additional
reimar
parents: 24436
diff changeset
188 buf[8+len-1] = 0;
4f9b7524f65d Handle swab when input length is odd (treat it as if there was an additional
reimar
parents: 24436
diff changeset
189 buf[8+len] = sh_audio->a_in_buffer[len-1];
4f9b7524f65d Handle swab when input length is odd (treat it as if there was an additional
reimar
parents: 24436
diff changeset
190 len++;
4f9b7524f65d Handle swab when input length is odd (treat it as if there was an additional
reimar
parents: 24436
diff changeset
191 }
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
192 #endif
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
193 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
194
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
195 return 6144;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
196 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
197 else
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
198 return -1;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
199 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
200
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
201
24435
79163e100830 Mark DTS tables as const
reimar
parents: 24434
diff changeset
202 static const int DTS_SAMPLEFREQS[16] =
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
203 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
204 0,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
205 8000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
206 16000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
207 32000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
208 64000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
209 128000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
210 11025,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
211 22050,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
212 44100,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
213 88200,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
214 176400,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
215 12000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
216 24000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
217 48000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
218 96000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
219 192000
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
220 };
5370
bb1d63fea638 ac3_iec958_build_burst moved from ac3-iec958.c
arpi
parents: 5340
diff changeset
221
24435
79163e100830 Mark DTS tables as const
reimar
parents: 24434
diff changeset
222 static const int DTS_BITRATES[30] =
10012
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 32000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
225 56000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
226 64000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
227 96000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
228 112000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
229 128000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
230 192000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
231 224000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
232 256000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
233 320000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
234 384000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
235 448000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
236 512000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
237 576000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
238 640000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
239 768000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
240 896000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
241 1024000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
242 1152000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
243 1280000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
244 1344000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
245 1408000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
246 1411200,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
247 1472000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
248 1536000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
249 1920000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
250 2048000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
251 3072000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
252 3840000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
253 4096000
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
254 };
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
255
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
256 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
257 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
258 int ftype;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
259 int surp;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
260 int unknown_bit;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
261 int fsize;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
262 int amode;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
263
25102
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
264 int word_mode;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
265 int le_mode;
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
266
25102
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
267 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
268 | 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
269
25102
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
270 switch(first4bytes)
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
271 {
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
272 /* 14 bits LE */
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
273 case 0xff1f00e8:
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
274 /* 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
275 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
276 return -1;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
277 word_mode = 0;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
278 le_mode = 1;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
279 break;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
280 /* 14 bits BE */
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
281 case 0x1fffe800:
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
282 /* 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
283 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
284 return -1;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
285 word_mode = 0;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
286 le_mode = 0;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
287 break;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
288 /* 16 bits LE */
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
289 case 0xfe7f0180:
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
290 word_mode = 1;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
291 le_mode = 1;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
292 break;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
293 /* 16 bits BE */
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
294 case 0x7ffe8001:
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
295 word_mode = 1;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
296 le_mode = 0;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
297 break;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
298 default:
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
299 return -1;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
300 }
5370
bb1d63fea638 ac3_iec958_build_burst moved from ac3-iec958.c
arpi
parents: 5340
diff changeset
301
25102
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
302 if(word_mode)
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
303 {
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
304 /* 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
305 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
306 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
307
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28445
diff changeset
308 if(ftype != 1)
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
309 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
310 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
311 return -1;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
312 }
25102
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
313 /* 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
314 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
315 /* Number of surplus samples */
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
316 surp = (surp + 1) % 32;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
317
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
318 /* One unknown bit, crc? */
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
319 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
320
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
321 /* 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
322 *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
323 /* 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
324 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
325 ++(*nblks);
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
326
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
327 /* 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
328 (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
329 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
330 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
331 | 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
332 ++fsize;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
333
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
334 /* 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
335 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
336
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
337 /* 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
338 *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
339 /* 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
340 *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
341 | (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
342 }
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
343 else
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 /* 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
346 ftype = 1;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
347 surp = 0;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
348 /* 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
349 /* Bits usage:
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
350 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
351 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
352 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
353 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
354 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
355 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
356 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
357 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
358 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
359 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
360 total bits: 75 bits */
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
361
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
362 /* 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
363 *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
364 | (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
365 /* 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
366 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
367 ++(*nblks);
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
368
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
369 /* 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
370 (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
371 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
372 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
373 | (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
374 ++fsize;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
375 fsize = fsize * 8 / 14 * 2;
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
376
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
377 /* 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
378 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
379 | (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
380
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
381 /* 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
382 *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
383 /* 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
384 *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
385 }
25124
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
386 #if 0
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28445
diff changeset
387 if(*sfreq != 13)
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
388 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
389 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
390 return -1;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
391 }
25124
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
392 #endif
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28445
diff changeset
393 if((fsize > 8192) || (fsize < 96))
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
394 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
395 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
396 return -1;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
397 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28445
diff changeset
398
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
399 if(*nblks != 8 &&
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
400 *nblks != 16 &&
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
401 *nblks != 32 &&
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
402 *nblks != 64 &&
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
403 *nblks != 128 &&
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28445
diff changeset
404 ftype == 1)
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
405 {
10948
aebf939834c3 10l found by Dominik 'Rathann' Mierzejewski <dominik@rangers.eu.org>
alex
parents: 10012
diff changeset
406 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
407 return -1;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
408 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28445
diff changeset
409
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
410 return fsize;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
411 }
5370
bb1d63fea638 ac3_iec958_build_burst moved from ac3-iec958.c
arpi
parents: 5340
diff changeset
412
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
413 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
414 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
415 int nblks;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
416 int fsize;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
417 int rate;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
418 int sfreq;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28445
diff changeset
419
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
420 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
421 if(fsize >= 0)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
422 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
423 if(rate >= 0 && rate <= 29)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
424 *bit_rate = DTS_BITRATES[rate];
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
425 else
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
426 *bit_rate = 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
427 if(sfreq >= 1 && sfreq <= 15)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
428 *sample_rate = DTS_SAMPLEFREQS[sfreq];
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
429 else
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
430 *sample_rate = 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
431 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
432 return fsize;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
433 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
434
25124
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
435 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
436 unsigned char *dest,
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
437 int len,
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
438 int is_le)
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
439 {
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
440 uint16_t *p = (uint16_t *)dest;
25139
94e618df1dea Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents: 25124
diff changeset
441 uint16_t buf = 0;
25124
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
442 int spacebits = 16;
25139
94e618df1dea Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents: 25124
diff changeset
443 if (len <= 0) return 0;
25124
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
444 while (len > 0) {
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
445 uint16_t v;
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
446 if (len == 1)
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
447 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
448 else
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
449 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
450 v <<= 2;
25124
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
451 src += 2;
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
452 len -= 2;
25139
94e618df1dea Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents: 25124
diff changeset
453 buf |= v >> (16 - spacebits);
94e618df1dea Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents: 25124
diff changeset
454 spacebits -= 14;
94e618df1dea Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents: 25124
diff changeset
455 if (spacebits < 0) {
94e618df1dea Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents: 25124
diff changeset
456 *p++ = buf;
94e618df1dea Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents: 25124
diff changeset
457 spacebits += 16;
94e618df1dea Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents: 25124
diff changeset
458 buf = v << (spacebits - 2);
25124
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
459 }
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
460 }
25139
94e618df1dea Simplify convert_14bits_to_16bits function in ad_hwac3
reimar
parents: 25124
diff changeset
461 *p++ = buf;
25124
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
462 return (unsigned char *)p - dest;
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
463 }
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
464
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
465 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
466 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
467 int nblks;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
468 int fsize;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
469 int rate;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
470 int sfreq;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
471 int nr_samples;
25124
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
472 int convert_16bits = 0;
24432
79fcacd73f9b Simplify and fix big-endian hwac3 header generation code.
reimar
parents: 23734
diff changeset
473 uint16_t *buf16 = (uint16_t *)buf;
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
474
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
475 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
476 if(fsize < 0)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
477 return -1;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
478 nr_samples = nblks * 32;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
479
24432
79fcacd73f9b Simplify and fix big-endian hwac3 header generation code.
reimar
parents: 23734
diff changeset
480 buf16[0] = 0xf872; /* iec 61937 */
24434
8b5437063481 Fix 10l typo in syncword
reimar
parents: 24433
diff changeset
481 buf16[1] = 0x4e1f; /* syncword */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28445
diff changeset
482 switch(nr_samples)
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
483 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
484 case 512:
24432
79fcacd73f9b Simplify and fix big-endian hwac3 header generation code.
reimar
parents: 23734
diff changeset
485 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
486 break;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
487 case 1024:
24432
79fcacd73f9b Simplify and fix big-endian hwac3 header generation code.
reimar
parents: 23734
diff changeset
488 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
489 break;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
490 case 2048:
24432
79fcacd73f9b Simplify and fix big-endian hwac3 header generation code.
reimar
parents: 23734
diff changeset
491 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
492 break;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
493 default:
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
494 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
495 buf16[2] = 0x0000;
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
496 break;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
497 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28445
diff changeset
498
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
499 if(fsize + 8 > nr_samples * 2 * 2)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
500 {
25124
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
501 // 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
502 // 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
503 // 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
504 // 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
505 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
506 && 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
507 // 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
508 // to save space for add the 61937 header
25149
7493e9bc7293 Fix warnings:
ulion
parents: 25139
diff changeset
509 fsize = convert_14bits_to_16bits(indata_ptr,
7493e9bc7293 Fix warnings:
ulion
parents: 25139
diff changeset
510 &buf[8],
25124
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
511 fsize,
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
512 indata_ptr[0] == 0xff /* is LE */
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
513 );
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
514 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
515 "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
516 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
517 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
518 convert_16bits = 1;
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
519 }
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
520 else
10012
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: more data than fits\n");
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
522 }
25124
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
523
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
524 buf16[3] = fsize << 3;
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
525
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
526 if (!convert_16bits) {
28299
8baa89b228c5 revert #ifdef WORDS_BIGENDIAN => #if WORDS_BIGENDIAN changes from r28331
gpoirier
parents: 28296
diff changeset
527 #ifdef WORDS_BIGENDIAN
25102
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
528 /* BE stream */
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
529 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
530 #else
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
531 /* LE stream */
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
532 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
533 #endif
24433
435b37266f1e Improved comments, based on patches by Ulion [ulion2002 gmail com]
reimar
parents: 24432
diff changeset
534 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
535 else
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
536 {
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
537 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
538 if (fsize & 1) {
4f9b7524f65d Handle swab when input length is odd (treat it as if there was an additional
reimar
parents: 24436
diff changeset
539 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
540 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
541 fsize++;
4f9b7524f65d Handle swab when input length is odd (treat it as if there was an additional
reimar
parents: 24436
diff changeset
542 }
25102
55d8b87b62da Make hwdts support more dts format identification, 14bits or 16bits, LE or BE.
ulion
parents: 24509
diff changeset
543 }
25124
8809817b2266 Support convert 14-bit DTS stream into 16-bit stream if needed,
ulion
parents: 25102
diff changeset
544 }
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
545 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
546
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
547 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
548 }