2 // Reference: DOCS/tech/hwac3.txt !!!!!
4 /* DTS code based on "ac3/decode_dts.c" and "ac3/conversion.c" from "ogle 0.9"
5 (see http://www.dtek.chalmers.se/~dvd/)
18 #include "ad_internal.h"
20 #ifdef CONFIG_LIBA52_INTERNAL
21 #include "liba52/a52.h"
23 #include <a52dec/a52.h>
27 static int isdts
= -1;
29 static const ad_info_t info
=
31 "AC3/DTS pass-through S/PDIF",
33 "Nick Kurshev/Peter Schüller",
41 static int dts_syncinfo(uint8_t *indata_ptr
, int *flags
, int *sample_rate
, int *bit_rate
);
42 static int decode_audio_dts(unsigned char *indata_ptr
, int len
, unsigned char *buf
);
45 static int ac3dts_fillbuff(sh_audio_t
*sh_audio
)
52 sh_audio
->a_in_buffer_len
= 0;
56 // Original code DTS has a 10 bytes header.
57 // Now max 12 bytes for 14 bits DTS header.
58 while(sh_audio
->a_in_buffer_len
< 12)
60 int c
= demux_getc(sh_audio
->ds
);
63 sh_audio
->a_in_buffer
[sh_audio
->a_in_buffer_len
++] = c
;
66 if (sh_audio
->format
== 0x2001)
68 length
= dts_syncinfo(sh_audio
->a_in_buffer
, &flags
, &sample_rate
, &bit_rate
);
73 mp_msg(MSGT_DECAUDIO
, MSGL_STATUS
, "hwac3: switched to DTS, %d bps, %d Hz\n", bit_rate
, sample_rate
);
81 length
= a52_syncinfo(sh_audio
->a_in_buffer
, &flags
, &sample_rate
, &bit_rate
);
82 if(length
>= 7 && length
<= 3840)
86 mp_msg(MSGT_DECAUDIO
, MSGL_STATUS
, "hwac3: switched to AC3, %d bps, %d Hz\n", bit_rate
, sample_rate
);
89 break; /* we're done.*/
92 /* bad file => resync*/
93 memcpy(sh_audio
->a_in_buffer
, sh_audio
->a_in_buffer
+ 1, 11);
94 --sh_audio
->a_in_buffer_len
;
96 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
);
98 sh_audio
->samplerate
= sample_rate
;
99 sh_audio
->i_bps
= bit_rate
/ 8;
100 demux_read_data(sh_audio
->ds
, sh_audio
->a_in_buffer
+ 12, length
- 12);
101 sh_audio
->a_in_buffer_len
= length
;
103 // TODO: is DTS also checksummed?
104 #ifdef CONFIG_LIBA52_INTERNAL
105 if(isdts
== 0 && crc16_block(sh_audio
->a_in_buffer
+ 2, length
- 2) != 0)
106 mp_msg(MSGT_DECAUDIO
, MSGL_STATUS
, "a52: CRC check failed! \n");
113 static int preinit(sh_audio_t
*sh
)
115 /* Dolby AC3 audio: */
116 sh
->audio_out_minsize
= 128 * 32 * 2 * 2; // DTS seems to need more than AC3
117 sh
->audio_in_minsize
= 8192;
120 sh
->sample_format
= AF_FORMAT_AC3
;
124 static int init(sh_audio_t
*sh_audio
)
126 /* Dolby AC3 passthrough:*/
127 a52_state_t
*a52_state
= a52_init(0);
128 if(a52_state
== NULL
)
130 mp_msg(MSGT_DECAUDIO
, MSGL_ERR
, "A52 init failed\n");
133 if(ac3dts_fillbuff(sh_audio
) < 0)
136 mp_msg(MSGT_DECAUDIO
, MSGL_ERR
, "AC3/DTS sync failed\n");
139 sh_audio
->context
= a52_state
;
143 static void uninit(sh_audio_t
*sh
)
145 a52_free(sh
->context
);
148 static int control(sh_audio_t
*sh
,int cmd
,void* arg
, ...)
152 case ADCTRL_RESYNC_STREAM
:
153 case ADCTRL_SKIP_FRAME
:
157 return CONTROL_UNKNOWN
;
161 static int decode_audio(sh_audio_t
*sh_audio
,unsigned char *buf
,int minlen
,int maxlen
)
163 int len
= sh_audio
->a_in_buffer_len
;
166 if((len
= ac3dts_fillbuff(sh_audio
)) <= 0)
168 sh_audio
->a_in_buffer_len
= 0;
172 return decode_audio_dts(sh_audio
->a_in_buffer
, len
, buf
);
176 uint16_t *buf16
= (uint16_t *)buf
;
177 buf16
[0] = 0xF872; // iec 61937 syncword 1
178 buf16
[1] = 0x4E1F; // iec 61937 syncword 2
179 buf16
[2] = 0x0001; // data-type ac3
180 buf16
[2] |= (sh_audio
->a_in_buffer
[5] & 0x7) << 8; // bsmod
181 buf16
[3] = len
<< 3; // number of bits in payload
182 #ifdef WORDS_BIGENDIAN
183 memcpy(buf
+ 8, sh_audio
->a_in_buffer
, len
);
185 swab(sh_audio
->a_in_buffer
, buf
+ 8, len
);
188 buf
[8+len
] = sh_audio
->a_in_buffer
[len
-1];
192 memset(buf
+ 8 + len
, 0, 6144 - 8 - len
);
201 static const int DTS_SAMPLEFREQS
[16] =
221 static const int DTS_BITRATES
[30] =
255 static int dts_decode_header(uint8_t *indata_ptr
, int *rate
, int *nblks
, int *sfreq
)
266 unsigned int first4bytes
= indata_ptr
[0] << 24 | indata_ptr
[1] << 16
267 | indata_ptr
[2] << 8 | indata_ptr
[3];
273 /* Also make sure frame type is 1. */
274 if ((indata_ptr
[4]&0xf0) != 0xf0 || indata_ptr
[5] != 0x07)
281 /* Also make sure frame type is 1. */
282 if (indata_ptr
[4] != 0x07 || (indata_ptr
[5]&0xf0) != 0xf0)
303 /* First bit after first 32 bits:
304 Frame type ( 1: Normal frame; 0: Termination frame ) */
305 ftype
= indata_ptr
[4+le_mode
] >> 7;
309 mp_msg(MSGT_DECAUDIO
, MSGL_ERR
, "DTS: Termination frames not handled, REPORT BUG\n");
312 /* Next 5 bits: Surplus Sample Count V SURP 5 bits */
313 surp
= indata_ptr
[4+le_mode
] >> 2 & 0x1f;
314 /* Number of surplus samples */
315 surp
= (surp
+ 1) % 32;
317 /* One unknown bit, crc? */
318 unknown_bit
= indata_ptr
[4+le_mode
] >> 1 & 0x01;
320 /* NBLKS 7 bits: Valid Range=5-127, Invalid Range=0-4 */
321 *nblks
= (indata_ptr
[4+le_mode
] & 0x01) << 6 | indata_ptr
[5-le_mode
] >> 2;
322 /* NBLKS+1 indicates the number of 32 sample PCM audio blocks per channel
323 encoded in the current frame per channel. */
326 /* Frame Byte Size V FSIZE 14 bits: 0-94=Invalid, 95-8191=Valid range-1
327 (ie. 96 bytes to 8192 bytes), 8192-16383=Invalid
328 FSIZE defines the byte size of the current audio frame. */
329 fsize
= (indata_ptr
[5-le_mode
] & 0x03) << 12 | indata_ptr
[6+le_mode
] << 4
330 | indata_ptr
[7-le_mode
] >> 4;
333 /* Audio Channel Arrangement ACC AMODE 6 bits */
334 amode
= (indata_ptr
[7-le_mode
] & 0x0f) << 2 | indata_ptr
[8+le_mode
] >> 6;
336 /* Source Sampling rate ACC SFREQ 4 bits */
337 *sfreq
= indata_ptr
[8+le_mode
] >> 2 & 0x0f;
338 /* Transmission Bit Rate ACC RATE 5 bits */
339 *rate
= (indata_ptr
[8+le_mode
] & 0x03) << 3
340 | (indata_ptr
[9-le_mode
] >> 5 & 0x07);
344 /* in the case judgement, we assure this */
347 /* 14 bits support, every 2 bytes, & 0x3fff, got used 14 bits */
349 32 bits: Sync code (28 + 4) 1th and 2th word, 4 bits in 3th word
350 1 bits: Frame type 1 bits in 3th word
351 5 bits: SURP 5 bits in 3th word
352 1 bits: crc? 1 bits in 3th word
353 7 bits: NBLKS 3 bits in 3th word, 4 bits in 4th word
354 14 bits: FSIZE 10 bits in 4th word, 4 bits in 5th word
355 in 14 bits mode, FSIZE = FSIZE*8/14*2
356 6 bits: AMODE 6 bits in 5th word
357 4 bits: SFREQ 4 bits in 5th word
358 5 bits: RATE 5 bits in 6th word
359 total bits: 75 bits */
361 /* NBLKS 7 bits: Valid Range=5-127, Invalid Range=0-4 */
362 *nblks
= (indata_ptr
[5-le_mode
] & 0x07) << 4
363 | (indata_ptr
[6+le_mode
] & 0x3f) >> 2;
364 /* NBLKS+1 indicates the number of 32 sample PCM audio blocks per channel
365 encoded in the current frame per channel. */
368 /* Frame Byte Size V FSIZE 14 bits: 0-94=Invalid, 95-8191=Valid range-1
369 (ie. 96 bytes to 8192 bytes), 8192-16383=Invalid
370 FSIZE defines the byte size of the current audio frame. */
371 fsize
= (indata_ptr
[6+le_mode
] & 0x03) << 12 | indata_ptr
[7-le_mode
] << 4
372 | (indata_ptr
[8+le_mode
] & 0x3f) >> 2;
374 fsize
= fsize
* 8 / 14 * 2;
376 /* Audio Channel Arrangement ACC AMODE 6 bits */
377 amode
= (indata_ptr
[8+le_mode
] & 0x03) << 4
378 | (indata_ptr
[9-le_mode
] & 0xf0) >> 4;
380 /* Source Sampling rate ACC SFREQ 4 bits */
381 *sfreq
= indata_ptr
[9-le_mode
] & 0x0f;
382 /* Transmission Bit Rate ACC RATE 5 bits */
383 *rate
= (indata_ptr
[10+le_mode
] & 0x3f) >> 1;
388 mp_msg(MSGT_DECAUDIO
, MSGL_ERR
, "DTS: Only 48kHz supported, REPORT BUG\n");
392 if((fsize
> 8192) || (fsize
< 96))
394 mp_msg(MSGT_DECAUDIO
, MSGL_ERR
, "DTS: fsize: %d invalid, REPORT BUG\n", fsize
);
405 mp_msg(MSGT_DECAUDIO
, MSGL_ERR
, "DTS: nblks %d not valid for normal frame, REPORT BUG\n", *nblks
);
412 static int dts_syncinfo(uint8_t *indata_ptr
, int *flags
, int *sample_rate
, int *bit_rate
)
419 fsize
= dts_decode_header(indata_ptr
, &rate
, &nblks
, &sfreq
);
422 if(rate
>= 0 && rate
<= 29)
423 *bit_rate
= DTS_BITRATES
[rate
];
426 if(sfreq
>= 1 && sfreq
<= 15)
427 *sample_rate
= DTS_SAMPLEFREQS
[sfreq
];
434 static int convert_14bits_to_16bits(const unsigned char *src
,
439 uint16_t *p
= (uint16_t *)dest
;
442 if (len
<= 0) return 0;
446 v
= is_le
? src
[0] : src
[0] << 8;
448 v
= is_le
? src
[1] << 8 | src
[0] : src
[0] << 8 | src
[1];
452 buf
|= v
>> (16 - spacebits
);
457 buf
= v
<< (spacebits
- 2);
461 return (unsigned char *)p
- dest
;
464 static int decode_audio_dts(unsigned char *indata_ptr
, int len
, unsigned char *buf
)
471 int convert_16bits
= 0;
472 uint16_t *buf16
= (uint16_t *)buf
;
474 fsize
= dts_decode_header(indata_ptr
, &rate
, &nblks
, &sfreq
);
477 nr_samples
= nblks
* 32;
479 buf16
[0] = 0xf872; /* iec 61937 */
480 buf16
[1] = 0x4e1f; /* syncword */
484 buf16
[2] = 0x000b; /* DTS-1 (512-sample bursts) */
487 buf16
[2] = 0x000c; /* DTS-2 (1024-sample bursts) */
490 buf16
[2] = 0x000d; /* DTS-3 (2048-sample bursts) */
493 mp_msg(MSGT_DECAUDIO
, MSGL_ERR
, "DTS: %d-sample bursts not supported\n", nr_samples
);
498 if(fsize
+ 8 > nr_samples
* 2 * 2)
500 // dts wav (14bits LE) match this condition, one way to passthrough
501 // is not add iec 61937 header, decoders will notice the dts header
502 // and identify the dts stream. Another way here is convert
503 // the stream from 14 bits to 16 bits.
504 if ((indata_ptr
[0] == 0xff || indata_ptr
[0] == 0x1f)
505 && fsize
* 14 / 16 + 8 <= nr_samples
* 2 * 2) {
506 // The input stream is 14 bits, we can shrink it to 16 bits
507 // to save space for add the 61937 header
508 fsize
= convert_14bits_to_16bits(indata_ptr
,
511 indata_ptr
[0] == 0xff /* is LE */
513 mp_msg(MSGT_DECAUDIO
, MSGL_DBG3
, "DTS: shrink 14 bits stream to "
514 "16 bits %02x%02x%02x%02x => %02x%02x%02x%02x, new size %d.\n",
515 indata_ptr
[0], indata_ptr
[1], indata_ptr
[2], indata_ptr
[3],
516 buf
[8], buf
[9], buf
[10], buf
[11], fsize
);
520 mp_msg(MSGT_DECAUDIO
, MSGL_ERR
, "DTS: more data than fits\n");
523 buf16
[3] = fsize
<< 3;
525 if (!convert_16bits
) {
526 #ifdef WORDS_BIGENDIAN
528 if (indata_ptr
[0] == 0x1f || indata_ptr
[0] == 0x7f)
531 if (indata_ptr
[0] == 0xff || indata_ptr
[0] == 0xfe)
533 memcpy(&buf
[8], indata_ptr
, fsize
);
536 swab(indata_ptr
, &buf
[8], fsize
);
539 buf
[8+fsize
] = indata_ptr
[fsize
-1];
544 memset(&buf
[fsize
+ 8], 0, nr_samples
* 2 * 2 - (fsize
+ 8));
546 return nr_samples
* 2 * 2;