50
51
: ADM_Audiocodec(fourcc)
53
ADM_assert(fourcc==WAV_WMA);
54
ADM_assert(fourcc==WAV_WMA || fourcc==WAV_QDM2);
54
55
_contextVoid=(void *)avcodec_alloc_context();
55
56
ADM_assert(_contextVoid);
56
57
// Fills in some values...
57
58
_context->sample_rate = info->frequency;
59
59
_context->channels = info->channels;
61
_context->bit_rate = info->byterate<<3; // byte -> bits
63
// _context->fourcc = fourcc;
64
_context->block_align = info->blockalign; // ...
65
_context->codec_id = CODEC_ID_WMAV2;
66
_blockalign=info->blockalign;
60
_blockalign=_context->block_align = info->blockalign;
61
_context->bit_rate = info->byterate*8;
63
_context->codec_id = CODEC_ID_WMAV2;
66
_context->codec_id = CODEC_ID_QDM2;
68
69
_context->extradata=(void *)d;
69
70
_context->extradata_size=(int)l;
71
71
printf(" Using %ld bytes of extra header data\n",l);
72
72
mixDump((uint8_t *)_context->extradata,_context->extradata_size);
74
AVCodec *codec=avcodec_find_decoder(CODEC_ID_WMAV2);
75
if(!codec) {GUI_Error_HIG("Internal error", "Cannot open WMA2 codec.");ADM_assert(0);}
74
AVCodec *codec=avcodec_find_decoder(_context->codec_id);
75
if(!codec) {GUI_Error_HIG(_("Internal error"), _("Cannot open WMA2 codec."));ADM_assert(0);}
76
76
if (avcodec_open(_context, codec) < 0)
78
78
printf("\n WMA decoder init failed !\n");
83
if(_context->block_align) _blockalign=_context->block_align;
86
printf("FFWMA : no blockalign taking 378\n");
81
90
printf("FFwma init successful (blockalign %d)\n",info->blockalign);
83
92
ADM_AudiocodecWMA::~ADM_AudiocodecWMA()
89
98
/*-------------------------------------------------------------------------------------------------------------------------
90
99
-------------------------------------------------------------------------------------------------------------------------*/
92
uint8_t ADM_AudiocodecWMA::run( uint8_t * ptr, uint32_t nbIn, uint8_t * outptr, uint32_t * nbOut)
101
uint8_t ADM_AudiocodecWMA::run(uint8_t *inptr, uint32_t nbIn, float *outptr, uint32_t *nbOut)
106
117
ADM_assert(nbIn+_tail<ADMWA_BUF);
107
memcpy(_buffer+_tail,ptr,nbIn);
118
memcpy(_buffer+_tail,inptr,nbIn);
109
while(_tail-_head>_blockalign)
120
while(_tail-_head>=_blockalign)
111
out=avcodec_decode_audio(_context,(int16_t *)outptr,&pout,_buffer+_head,_tail-_head);
112
//printf("Align:%d In: %d out:%d\n",_blockalign,out,pout);
115
printf( " *** WMA decoding error ***\n");
116
_head+=1; // Try skipping some bytes
120
_head+=out; // consumed bytes
122
nbChunk=(_tail-_head)/_blockalign;
123
pout=SCRATCH_PAD_SIZE;
124
out=avcodec_decode_audio(_context,(int16_t *)scratchPad,
125
&pout,_buffer+_head,nbChunk*_blockalign);
129
printf( " *** WMA decoding error (%u)***\n",_blockalign);
130
_head+=1; // Try skipping some bytes
133
if(pout>=SCRATCH_PAD_SIZE)
135
printf("Produced : %u, buffer %u,in%u\n",pout,SCRATCH_PAD_SIZE,_tail-_head);
138
_head+=out; // consumed bytes
141
run16=(int16_t *)scratchPad;
142
for(int i=0;i<pout;i++)
144
*outptr++=((float)run16[i])/32767.;
127
152
///************************************************
154
179
printf(" Opening AMR codec\n");
156
181
AVCodec *codec=avcodec_find_decoder(CODEC_ID_AMR_NB);
157
if(!codec) {GUI_Error_HIG("Internal error", "Cannot open AMR codec.");ADM_assert(0);}
182
if(!codec) {GUI_Error_HIG(_("Internal error"), _("Cannot open AMR codec."));ADM_assert(0);}
158
183
if (avcodec_open(_context, codec) < 0)
160
185
printf("\n AMR decoder init failed !\n");
171
196
/*-------------------------------------------------------------------------------------------------------------------------
172
197
-------------------------------------------------------------------------------------------------------------------------*/
173
198
#define AMR_PACKET 32
174
uint8_t ADM_AudiocodecAMR::run( uint8_t * ptr, uint32_t nbIn, uint8_t * outptr, uint32_t * nbOut)
199
uint8_t ADM_AudiocodecAMR::run(uint8_t *inptr, uint32_t nbIn, float *outptr, uint32_t *nbOut)
177
int max=0,pout=0,toread;
181
208
if(_head && (_tail+nbIn)*3>ADM_AMR_BUFFER*2)
183
210
memmove(_buffer,_buffer+_head,_tail-_head);
188
215
ADM_assert(nbIn+_tail<ADM_AMR_BUFFER);
189
memcpy(_buffer+_tail,ptr,nbIn);
216
memcpy(_buffer+_tail,inptr,nbIn);
191
218
while(_tail-_head>AMR_PACKET)
193
out=avcodec_decode_audio(_context,(int16_t *)outptr,&pout,_buffer+_head,_tail-_head);
220
out=avcodec_decode_audio(_context,(int16_t *)scratchPad,
221
&pout,_buffer+_head,_tail-_head);
197
printf( " *** WMA decoding error ***\n");
225
printf( " *** AMR decoding error ***\n");
198
226
_head+=1; // Try skipping some bytes
202
230
_head+=out; // consumed bytes
233
run16=(int16_t *)scratchPad;
234
for(int i=0;i<pout;i++)
236
*outptr++=((float)run16[i])/32767.;