annotate libmpcodecs/ad_hwac3.c @ 24674:f6cf2c01315d

Format 0x01 cannot be used with "AMV IMA ADPCM", because it belongs to normal PCM. Make lavf demuxer set codec tag to AMVA in this case. No need to use -ac +ffadpcmimaamva anymore.
author voroshil
date Wed, 03 Oct 2007 15:27:02 +0000
parents 767a9fd651c7
children 55d8b87b62da
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
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
8 #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
9 #include <stdlib.h>
5370
bb1d63fea638 ac3_iec958_build_burst moved from ac3-iec958.c
arpi
parents: 5340
diff changeset
10 #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
11 #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
12
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
13 #include "config.h"
8026
b465ba5897a3 usage of libmpeg2, liba52, mp3lib & svq1 can be disabled
arpi
parents: 7405
diff changeset
14 #ifdef USE_LIBA52
b465ba5897a3 usage of libmpeg2, liba52, mp3lib & svq1 can be disabled
arpi
parents: 7405
diff changeset
15
5340
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 "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
17 #include "help_mp.h"
23638
a81e246e3b38 Make sure we always have a swab() prototype when we use it,
reimar
parents: 18512
diff changeset
18 #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
19
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
20 #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
21
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15558
diff changeset
22 #include "liba52/a52.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
23
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
24
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
25 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
26
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
27 static ad_info_t info =
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
28 {
14710
diego
parents: 14245
diff changeset
29 "AC3/DTS pass-through S/PDIF",
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
30 "hwac3",
23734
acfe034e5386 ISO8859-1 --> UTF-8
diego
parents: 23638
diff changeset
31 "Nick Kurshev/Peter Schüller",
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
32 "???",
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
33 ""
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
34 };
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 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
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 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
40 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
41
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
42
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
43 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
44 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
45 int length = 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
46 int flags = 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
47 int sample_rate = 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
48 int bit_rate = 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
49
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
50 sh_audio->a_in_buffer_len = 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
51 /* sync frame:*/
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
52 while(1)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
53 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
54 // DTS has a 10 byte header
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
55 while(sh_audio->a_in_buffer_len < 10)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
56 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
57 int c = demux_getc(sh_audio->ds);
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
58 if(c<0)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
59 return -1; /* EOF*/
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
60 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
61 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
62
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
63 length = dts_syncinfo(sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate);
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
64 if(length >= 10)
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 if(isdts != 1)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
67 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
68 mp_msg(MSGT_DECAUDIO, MSGL_STATUS, "hwac3: switched to DTS, %d bps, %d Hz\n", bit_rate, sample_rate);
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
69 isdts = 1;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
70 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
71 break;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
72 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
73 length = a52_syncinfo(sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate);
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
74 if(length >= 7 && length <= 3840)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
75 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
76 if(isdts != 0)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
77 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
78 mp_msg(MSGT_DECAUDIO, MSGL_STATUS, "hwac3: switched to AC3, %d bps, %d Hz\n", bit_rate, sample_rate);
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
79 isdts = 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
80 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
81 break; /* we're done.*/
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
82 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
83 /* bad file => resync*/
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
84 memcpy(sh_audio->a_in_buffer, sh_audio->a_in_buffer + 1, 9);
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
85 --sh_audio->a_in_buffer_len;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
86 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
87 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
88
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
89 sh_audio->samplerate = sample_rate;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
90 sh_audio->i_bps = bit_rate / 8;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
91 demux_read_data(sh_audio->ds, sh_audio->a_in_buffer + 10, length - 10);
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
92 sh_audio->a_in_buffer_len = length;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
93
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
94 // TODO: is DTS also checksummed?
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
95 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
96 mp_msg(MSGT_DECAUDIO, MSGL_STATUS, "a52: CRC check failed! \n");
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
97
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
98 return length;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
99 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
100
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
101
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
102 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
103 {
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
104 /* Dolby AC3 audio: */
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
105 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
106 sh->audio_in_minsize = 8192;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
107 sh->channels = 2;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
108 sh->samplesize = 2;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14187
diff changeset
109 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
110 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
111 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
112
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
113 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
114 {
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
115 /* Dolby AC3 passthrough:*/
18512
rathann
parents: 17012
diff changeset
116 a52_state_t *a52_state = a52_init(0);
rathann
parents: 17012
diff changeset
117 if(a52_state == NULL)
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
118 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
119 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
120 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
121 }
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
122 if(ac3dts_fillbuff(sh_audio) < 0)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
123 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
124 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
125 return 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
126 }
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
127 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
128 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
129
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
130 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
131 {
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
132 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
133
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
134 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
135 {
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
136 switch(cmd)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
137 {
15558
3aee7daaa8e5 Fix ADCTRL_SKIP_FRAME and add ADCTRL_RESYNC_STREAM
hzoli
parents: 14710
diff changeset
138 case ADCTRL_RESYNC_STREAM:
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
139 case ADCTRL_SKIP_FRAME:
15558
3aee7daaa8e5 Fix ADCTRL_SKIP_FRAME and add ADCTRL_RESYNC_STREAM
hzoli
parents: 14710
diff changeset
140 ac3dts_fillbuff(sh);
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
141 return CONTROL_TRUE;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
142 }
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
143 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
144 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
145
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
146
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 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
148 {
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
149 int len = sh_audio->a_in_buffer_len;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
150
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
151 if(len <= 0)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
152 if((len = ac3dts_fillbuff(sh_audio)) <= 0)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
153 return len; /*EOF*/
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
154 sh_audio->a_in_buffer_len = 0;
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 if(isdts == 1)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
157 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
158 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
159 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
160 else if(isdts == 0)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
161 {
24432
79fcacd73f9b Simplify and fix big-endian hwac3 header generation code.
reimar
parents: 23734
diff changeset
162 uint16_t *buf16 = (uint16_t *)buf;
24433
435b37266f1e Improved comments, based on patches by Ulion [ulion2002 gmail com]
reimar
parents: 24432
diff changeset
163 buf16[0] = 0xF872; // iec 61937 syncword 1
435b37266f1e Improved comments, based on patches by Ulion [ulion2002 gmail com]
reimar
parents: 24432
diff changeset
164 buf16[1] = 0x4E1F; // iec 61937 syncword 2
435b37266f1e Improved comments, based on patches by Ulion [ulion2002 gmail com]
reimar
parents: 24432
diff changeset
165 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
166 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
167 buf16[3] = len << 3; // number of bits in payload
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
168 #ifdef WORDS_BIGENDIAN
24433
435b37266f1e Improved comments, based on patches by Ulion [ulion2002 gmail com]
reimar
parents: 24432
diff changeset
169 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
170 #else
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
171 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
172 if (len & 1) {
4f9b7524f65d Handle swab when input length is odd (treat it as if there was an additional
reimar
parents: 24436
diff changeset
173 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
174 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
175 len++;
4f9b7524f65d Handle swab when input length is odd (treat it as if there was an additional
reimar
parents: 24436
diff changeset
176 }
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
177 #endif
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
178 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
179
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
180 return 6144;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
181 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
182 else
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
183 return -1;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
184 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
185
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
186
24435
79163e100830 Mark DTS tables as const
reimar
parents: 24434
diff changeset
187 static const int DTS_SAMPLEFREQS[16] =
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
188 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
189 0,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
190 8000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
191 16000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
192 32000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
193 64000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
194 128000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
195 11025,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
196 22050,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
197 44100,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
198 88200,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
199 176400,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
200 12000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
201 24000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
202 48000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
203 96000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
204 192000
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
205 };
5370
bb1d63fea638 ac3_iec958_build_burst moved from ac3-iec958.c
arpi
parents: 5340
diff changeset
206
24435
79163e100830 Mark DTS tables as const
reimar
parents: 24434
diff changeset
207 static const int DTS_BITRATES[30] =
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
208 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
209 32000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
210 56000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
211 64000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
212 96000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
213 112000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
214 128000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
215 192000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
216 224000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
217 256000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
218 320000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
219 384000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
220 448000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
221 512000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
222 576000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
223 640000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
224 768000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
225 896000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
226 1024000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
227 1152000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
228 1280000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
229 1344000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
230 1408000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
231 1411200,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
232 1472000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
233 1536000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
234 1920000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
235 2048000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
236 3072000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
237 3840000,
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
238 4096000
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
239 };
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
240
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
241 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
242 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
243 int ftype;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
244 int surp;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
245 int unknown_bit;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
246 int fsize;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
247 int amode;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
248
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
249 if(((indata_ptr[0] << 24) | (indata_ptr[1] << 16) | (indata_ptr[2] << 8)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
250 | (indata_ptr[3])) != 0x7ffe8001)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
251 return -1;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
252
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
253 ftype = indata_ptr[4] >> 7;
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 surp = (indata_ptr[4] >> 2) & 0x1f;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
256 surp = (surp + 1) % 32;
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 unknown_bit = (indata_ptr[4] >> 1) & 0x01;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
259
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
260 *nblks = (indata_ptr[4] & 0x01) << 6 | (indata_ptr[5] >> 2);
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
261 *nblks = *nblks + 1;
5370
bb1d63fea638 ac3_iec958_build_burst moved from ac3-iec958.c
arpi
parents: 5340
diff changeset
262
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
263 fsize = (indata_ptr[5] & 0x03) << 12 | (indata_ptr[6] << 4) | (indata_ptr[7] >> 4);
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
264 fsize = fsize + 1;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
265
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
266 amode = (indata_ptr[7] & 0x0f) << 2 | (indata_ptr[8] >> 6);
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
267 *sfreq = (indata_ptr[8] >> 2) & 0x0f;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
268 *rate = (indata_ptr[8] & 0x03) << 3 | ((indata_ptr[9] >> 5) & 0x07);
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
269
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
270 if(ftype != 1)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
271 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
272 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
273 return -1;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
274 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
275
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
276 if(*sfreq != 13)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
277 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
278 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
279 return -1;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
280 }
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 if((fsize > 8192) || (fsize < 96))
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
283 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
284 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
285 return -1;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
286 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
287
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
288 if(*nblks != 8 &&
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
289 *nblks != 16 &&
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
290 *nblks != 32 &&
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
291 *nblks != 64 &&
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
292 *nblks != 128 &&
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
293 ftype == 1)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
294 {
10948
aebf939834c3 10l found by Dominik 'Rathann' Mierzejewski <dominik@rangers.eu.org>
alex
parents: 10012
diff changeset
295 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
296 return -1;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
297 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
298
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
299 return fsize;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
300 }
5370
bb1d63fea638 ac3_iec958_build_burst moved from ac3-iec958.c
arpi
parents: 5340
diff changeset
301
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
302 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
303 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
304 int nblks;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
305 int fsize;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
306 int rate;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
307 int sfreq;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
308
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
309 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
310 if(fsize >= 0)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
311 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
312 if(rate >= 0 && rate <= 29)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
313 *bit_rate = DTS_BITRATES[rate];
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
314 else
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
315 *bit_rate = 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
316 if(sfreq >= 1 && sfreq <= 15)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
317 *sample_rate = DTS_SAMPLEFREQS[sfreq];
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
318 else
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
319 *sample_rate = 0;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
320 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
321 return fsize;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
322 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
323
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
324
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
325 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
326 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
327 int nblks;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
328 int fsize;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
329 int rate;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
330 int sfreq;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
331 int burst_len;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
332 int nr_samples;
24432
79fcacd73f9b Simplify and fix big-endian hwac3 header generation code.
reimar
parents: 23734
diff changeset
333 uint16_t *buf16 = (uint16_t *)buf;
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
334
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
335 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
336 if(fsize < 0)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
337 return -1;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
338
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
339 burst_len = fsize * 8;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
340 nr_samples = nblks * 32;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
341
24432
79fcacd73f9b Simplify and fix big-endian hwac3 header generation code.
reimar
parents: 23734
diff changeset
342 buf16[0] = 0xf872; /* iec 61937 */
24434
8b5437063481 Fix 10l typo in syncword
reimar
parents: 24433
diff changeset
343 buf16[1] = 0x4e1f; /* syncword */
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
344 switch(nr_samples)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
345 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
346 case 512:
24432
79fcacd73f9b Simplify and fix big-endian hwac3 header generation code.
reimar
parents: 23734
diff changeset
347 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
348 break;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
349 case 1024:
24432
79fcacd73f9b Simplify and fix big-endian hwac3 header generation code.
reimar
parents: 23734
diff changeset
350 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
351 break;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
352 case 2048:
24432
79fcacd73f9b Simplify and fix big-endian hwac3 header generation code.
reimar
parents: 23734
diff changeset
353 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
354 break;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
355 default:
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
356 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
357 buf16[2] = 0x0000;
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
358 break;
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
359 }
24432
79fcacd73f9b Simplify and fix big-endian hwac3 header generation code.
reimar
parents: 23734
diff changeset
360 buf16[3] = burst_len;
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
361
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
362 if(fsize + 8 > nr_samples * 2 * 2)
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
363 {
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
364 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
365 }
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
366 #ifdef WORDS_BIGENDIAN
24433
435b37266f1e Improved comments, based on patches by Ulion [ulion2002 gmail com]
reimar
parents: 24432
diff changeset
367 memcpy(&buf[8], indata_ptr, fsize);
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
368 #else
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
369 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
370 if (fsize & 1) {
4f9b7524f65d Handle swab when input length is odd (treat it as if there was an additional
reimar
parents: 24436
diff changeset
371 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
372 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
373 fsize++;
4f9b7524f65d Handle swab when input length is odd (treat it as if there was an additional
reimar
parents: 24436
diff changeset
374 }
10012
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
375 #endif
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
376 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
377
f8f3f8b4e0d7 DTS support by Peter Schuller <peterschueller@telemed.de> (revised by arpi)
alex
parents: 8026
diff changeset
378 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
379 }
8026
b465ba5897a3 usage of libmpeg2, liba52, mp3lib & svq1 can be disabled
arpi
parents: 7405
diff changeset
380 #endif