+ if (!wc->ch_offset) {
+ int sr = (s->frame_flags >> 23) & 0xf;
+ if (sr == 0xf) {
+ if (!sample_rate) {
+ av_log(avctx, AV_LOG_ERROR, "Custom sample rate missing.\n");
+ return AVERROR_INVALIDDATA;
+ }
+ avctx->sample_rate = sample_rate;
+ } else
+ avctx->sample_rate = wv_rates[sr];
+
+ if (multiblock) {
+ if (chan)
+ avctx->channels = chan;
+ if (chmask)
+ avctx->channel_layout = chmask;
+ } else {
+ avctx->channels = s->stereo ? 2 : 1;
+ avctx->channel_layout = s->stereo ? AV_CH_LAYOUT_STEREO :
+ AV_CH_LAYOUT_MONO;
+ }
+
+ /* get output buffer */
+ frame->nb_samples = s->samples;
+ if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
+ return ret;
+ }
+ }
+
+ if (wc->ch_offset + s->stereo >= avctx->channels) {
+ av_log(avctx, AV_LOG_WARNING, "Too many channels coded in a packet.\n");
+ return (avctx->err_recognition & AV_EF_EXPLODE) ? AVERROR_INVALIDDATA : 0;
+ }
+
+ samples_l = frame->extended_data[wc->ch_offset];
+ if (s->stereo)
+ samples_r = frame->extended_data[wc->ch_offset + 1];
+
+ wc->ch_offset += 1 + s->stereo;
+