+ audio_chunks = buf_size / s->chunk_size;
+
+ /* drop incomplete chunks */
+ buf_size = audio_chunks * s->chunk_size;
+
+ /* get output buffer */
+ frame->nb_samples = ((silent_chunks + audio_chunks) * avctx->block_align) /
+ avctx->channels;
+ if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
+ return ret;
+ }
+ output_samples_u8 = frame->data[0];
+ output_samples_s16 = (int16_t *)frame->data[0];
+
+ /* decode silent chunks */
+ if (silent_chunks > 0) {
+ int silent_size = FFMIN(avctx->block_align * silent_chunks,
+ frame->nb_samples * avctx->channels);
+ if (s->out_bps == 2) {
+ memset(output_samples_s16, 0x00, silent_size * 2);
+ output_samples_s16 += silent_size;
+ } else {
+ memset(output_samples_u8, 0x80, silent_size);
+ output_samples_u8 += silent_size;
+ }
+ }
+
+ /* decode audio chunks */
+ if (audio_chunks > 0) {
+ buf_end = buf + (buf_size & ~(avctx->channels > 1));
+ while (buf + s->chunk_size <= buf_end) {
+ if (s->out_bps == 2) {
+ decode_audio_s16(output_samples_s16, buf, s->chunk_size,
+ avctx->channels);
+ output_samples_s16 += avctx->block_align;
+ } else {
+ memcpy(output_samples_u8, buf, s->chunk_size);
+ output_samples_u8 += avctx->block_align;
+ }
+ buf += s->chunk_size;
+ }
+ }