- if (unp_size & 0xC0000000 || (unp_size << !bits) > *data_size) {
- av_log(avctx, AV_LOG_ERROR, "Frame is too large to fit in buffer\n");
- return -1;
+ if (stereo ^ (avctx->channels != 1)) {
+ av_log(avctx, AV_LOG_ERROR, "channels mismatch\n");
+ return AVERROR(EINVAL);
+ }
+ if (bits && avctx->sample_fmt == AV_SAMPLE_FMT_U8) {
+ av_log(avctx, AV_LOG_ERROR, "sample format mismatch\n");
+ return AVERROR(EINVAL);
+ }
+
+ /* get output buffer */
+ frame->nb_samples = unp_size / (avctx->channels * (bits + 1));
+ if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
+ return ret;