static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen) { sample_t level=a52_level, bias=384; int flags=a52_flags|A52_ADJUST_LEVEL; int i,len=-1; if (sh_audio->sample_format == AF_FORMAT_FLOAT_NE) bias = 0; if(!sh_audio->a_in_buffer_len) if(a52_fillbuff(sh_audio)<0) return len; /* EOF */ sh_audio->a_in_buffer_len=0; if (a52_frame (a52_state, sh_audio->a_in_buffer, &flags, &level, bias)){ mp_msg(MSGT_DECAUDIO,MSGL_WARN,"a52: error decoding frame\n"); return len; } /* handle dynrng */ if (a52_drc_action != DRC_NO_ACTION) { if (a52_drc_action == DRC_NO_COMPRESSION) a52_dynrng(a52_state, NULL, NULL); else a52_dynrng(a52_state, dynrng_call, NULL); } len=0; for (i = 0; i < 6; i++) { if (a52_block (a52_state)){ mp_msg(MSGT_DECAUDIO,MSGL_WARN,"a52: error at resampling\n"); break; } len+=2*a52_resample(a52_samples(a52_state),(int16_t *)&buf[len]); } assert(len <= maxlen); return len; }
static int a52_decode_frame(unsigned char *buf, int maxlen, struct frame_fmt *fmt) { sample_t level = 1, bias = 384; int flags; int i, len = -1; if (!a52_buffer.a_in_buffer_len) if (a52_fillbuff(&a52_buffer) < 0) return len; a52_buffer.a_in_buffer_len = 0; flags = a52_flags | A52_ADJUST_LEVEL; level *= gain; if (a52_frame(a52_state, a52_buffer.a_in_buffer, &flags, &level, bias)) { printf("a52_decode_frame a52: error decoding frame\n"); return len; } len = 0; for (i = 0; i < 6; i++) { if (a52_block(a52_state)) { printf("a52: error at resampling\n"); break; } len += 2 * a52_resample(a52_samples(a52_state), (int16_t *) & buf[len]); } assert(len <= maxlen); return len; }