| @@ -273,6 +273,7 @@ typedef struct { | |||||
| /* Primary audio coding header */ | /* Primary audio coding header */ | ||||
| int subframes; ///< number of subframes | int subframes; ///< number of subframes | ||||
| int is_channels_set; ///< check for if the channel number is already set | |||||
| int total_channels; ///< number of channels including extensions | int total_channels; ///< number of channels including extensions | ||||
| int prim_channels; ///< number of primary audio channels | int prim_channels; ///< number of primary audio channels | ||||
| int subband_activity[DCA_PRIM_CHANNELS_MAX]; ///< subband activity count | int subband_activity[DCA_PRIM_CHANNELS_MAX]; ///< subband activity count | ||||
| @@ -1774,7 +1775,15 @@ static int dca_decode_frame(AVCodecContext * avctx, | |||||
| unset. Ideally during the first probe for channels the crc should be checked | unset. Ideally during the first probe for channels the crc should be checked | ||||
| and only set avctx->channels when the crc is ok. Right now the decoder could | and only set avctx->channels when the crc is ok. Right now the decoder could | ||||
| set the channels based on a broken first frame.*/ | set the channels based on a broken first frame.*/ | ||||
| if (s->is_channels_set == 0) { | |||||
| s->is_channels_set = 1; | |||||
| avctx->channels = channels; | avctx->channels = channels; | ||||
| } | |||||
| if (avctx->channels != channels) { | |||||
| av_log(avctx, AV_LOG_ERROR, "DCA decoder does not support number of " | |||||
| "channels changing in stream. Skipping frame.\n"); | |||||
| return -1; | |||||
| } | |||||
| if (*data_size < (s->sample_blocks / 8) * 256 * sizeof(int16_t) * channels) | if (*data_size < (s->sample_blocks / 8) * 256 * sizeof(int16_t) * channels) | ||||
| return -1; | return -1; | ||||