+ /* calculate output size */
+ switch(avctx->codec->id) {
+ case CODEC_ID_ROQ_DPCM:
+ out = buf_size - 8;
+ break;
+ case CODEC_ID_INTERPLAY_DPCM:
+ out = buf_size - 6 - s->channels;
+ break;
+ case CODEC_ID_XAN_DPCM:
+ out = buf_size - 2 * s->channels;
+ break;
+ case CODEC_ID_SOL_DPCM:
+ if (avctx->codec_tag != 3)
+ out = buf_size * 2;
+ else
+ out = buf_size;
+ break;
+ }
+ if (out <= 0) {
+ av_log(avctx, AV_LOG_ERROR, "packet is too small\n");
+ return AVERROR(EINVAL);
+ }
+
+ /* get output buffer */
+ s->frame.nb_samples = out / s->channels;
+ if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
+ return ret;
+ }
+ output_samples = (int16_t *)s->frame.data[0];
+ samples_end = output_samples + out;