24
24
#include "fourcc.h"
25
25
#include "ADM_audio/aviaudio.hxx"
26
26
#include "ADM_audiocodec/ADM_audiocodec.h"
27
#include "ADM_audiofilter/audiofilter_channel_route.h"
29
#include "ADM_toolkit/ADM_cpuCap.h"
30
#include "ADM_audiocodec/ADM_AC3.h"
32
ADM_AudiocodecAC3::ADM_AudiocodecAC3( uint32_t fourcc) : ADM_Audiocodec(fourcc)
34
#include "ADM_liba52/a52.h"
35
#include "ADM_liba52/mm_accel.h"
38
#define AC3_HANDLE ((a52_state_t *)ac3_handle)
40
ADM_AudiocodecAC3::ADM_AudiocodecAC3( uint32_t fourcc, WAVHeader *info) : ADM_Audiocodec(fourcc)
34
ADM_assert(fourcc==WAV_AC3);
43
ADM_assert(fourcc==WAV_AC3);
46
#if (defined( ARCH_X86) || defined(ARCH_X86_64))
47
#define CHK(x,y) if(CpuCaps::has##x()) flags|=MM_ACCEL_X86_##y;
53
ac3_handle=(void *)a52_init(flags);
56
printf("Cannot init a52\n");
59
ac3_sample=(sample_t *)a52_samples(AC3_HANDLE);
62
printf("Cannot init a52 sample\n");
67
ADM_assert(_wavHeader);
37
70
ADM_AudiocodecAC3::~ADM_AudiocodecAC3( )
41
80
uint8_t ADM_AudiocodecAC3::beginDecompress( void )
45
85
uint8_t ADM_AudiocodecAC3::endDecompress( void )
49
uint8_t ADM_AudiocodecAC3::run( uint8_t * ptr, uint32_t nbIn, uint8_t * outptr, uint32_t * nbOut)
90
uint8_t ADM_AudiocodecAC3::run(uint8_t *inptr, uint32_t nbIn, float *outptr, uint32_t *nbOut)
51
return ADM_AC3Run(ptr,nbIn,outptr,nbOut);
94
int flags = 0, samprate = 0, bitrate = 0;
95
uint8_t chan = _wavHeader->channels;
104
printf("[a52]: no data to decode avail %u\n",nbIn);
107
length = a52_syncinfo(inptr, &flags, &samprate, &bitrate);
110
printf("[a52] No startcode found\n");
119
if (ch_route.mode < 1) {
120
CHANNEL_TYPE *p_ch_type = ch_route.input_type;
121
if (flags & A52_LFE) {
122
*(p_ch_type++) = CH_LFE;
124
switch (flags & A52_CHANNEL_MASK) {
126
*(p_ch_type++) = CH_MONO;
130
*(p_ch_type++) = CH_FRONT_LEFT;
131
*(p_ch_type++) = CH_FRONT_RIGHT;
134
*(p_ch_type++) = CH_FRONT_LEFT;
135
*(p_ch_type++) = CH_FRONT_CENTER;
136
*(p_ch_type++) = CH_FRONT_RIGHT;
139
*(p_ch_type++) = CH_FRONT_LEFT;
140
*(p_ch_type++) = CH_FRONT_RIGHT;
141
*(p_ch_type++) = CH_REAR_CENTER;
144
*(p_ch_type++) = CH_FRONT_LEFT;
145
*(p_ch_type++) = CH_FRONT_CENTER;
146
*(p_ch_type++) = CH_FRONT_RIGHT;
147
*(p_ch_type++) = CH_REAR_CENTER;
150
*(p_ch_type++) = CH_FRONT_LEFT;
151
*(p_ch_type++) = CH_FRONT_RIGHT;
152
*(p_ch_type++) = CH_REAR_LEFT;
153
*(p_ch_type++) = CH_REAR_RIGHT;
156
*(p_ch_type++) = CH_FRONT_LEFT;
157
*(p_ch_type++) = CH_FRONT_CENTER;
158
*(p_ch_type++) = CH_FRONT_RIGHT;
159
*(p_ch_type++) = CH_REAR_LEFT;
160
*(p_ch_type++) = CH_REAR_RIGHT;
167
sample_t level = 1, bias = 0;
169
if (a52_frame(AC3_HANDLE, inptr, &flags, &level, bias))
171
printf("\n A52_frame failed!");
174
*nbOut += 256 * chan * 6;
179
*nbOut += 256 * chan * 6;
182
for (int i = 0; i < 6; i++) {
183
if (a52_block(AC3_HANDLE)) {
184
printf("\n A52_block failed! on fblock :%lu", i);
185
// in that case we silent out the chunk
186
memset(outptr, 0, 256 * chan * sizeof(float));
188
for (int k = 0; k < chan; k++) {
189
sample_t *sample=(sample_t *)ac3_sample;
192
for (int j = 0; j < 256; j++) {
198
outptr += chan * 256;