|
|
|
@ -132,7 +132,7 @@ static av_cold int dpcm_decode_init(AVCodecContext *avctx) |
|
|
|
|
DPCMContext *s = avctx->priv_data; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
if (avctx->channels < 1 || avctx->channels > 2) { |
|
|
|
|
if (avctx->ch_layout.nb_channels < 1 || avctx->ch_layout.nb_channels > 2) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "invalid number of channels\n"); |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
@ -215,7 +215,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
|
int out = 0, ret; |
|
|
|
|
int predictor[2]; |
|
|
|
|
int ch = 0; |
|
|
|
|
int stereo = avctx->channels - 1; |
|
|
|
|
int stereo = avctx->ch_layout.nb_channels - 1; |
|
|
|
|
int16_t *output_samples, *samples_end; |
|
|
|
|
GetByteContext gb; |
|
|
|
|
|
|
|
|
@ -229,10 +229,10 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
|
out = buf_size - 8; |
|
|
|
|
break; |
|
|
|
|
case AV_CODEC_ID_INTERPLAY_DPCM: |
|
|
|
|
out = buf_size - 6 - avctx->channels; |
|
|
|
|
out = buf_size - 6 - avctx->ch_layout.nb_channels; |
|
|
|
|
break; |
|
|
|
|
case AV_CODEC_ID_XAN_DPCM: |
|
|
|
|
out = buf_size - 2 * avctx->channels; |
|
|
|
|
out = buf_size - 2 * avctx->ch_layout.nb_channels; |
|
|
|
|
break; |
|
|
|
|
case AV_CODEC_ID_SOL_DPCM: |
|
|
|
|
if (avctx->codec_tag != 3) |
|
|
|
@ -250,12 +250,12 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "packet is too small\n"); |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
|
if (out % avctx->channels) { |
|
|
|
|
if (out % avctx->ch_layout.nb_channels) { |
|
|
|
|
av_log(avctx, AV_LOG_WARNING, "channels have differing number of samples\n"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* get output buffer */ |
|
|
|
|
frame->nb_samples = (out + avctx->channels - 1) / avctx->channels; |
|
|
|
|
frame->nb_samples = (out + avctx->ch_layout.nb_channels - 1) / avctx->ch_layout.nb_channels; |
|
|
|
|
if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) |
|
|
|
|
return ret; |
|
|
|
|
output_samples = (int16_t *)frame->data[0]; |
|
|
|
@ -287,7 +287,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
|
case AV_CODEC_ID_INTERPLAY_DPCM: |
|
|
|
|
bytestream2_skipu(&gb, 6); /* skip over the stream mask and stream length */ |
|
|
|
|
|
|
|
|
|
for (ch = 0; ch < avctx->channels; ch++) { |
|
|
|
|
for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) { |
|
|
|
|
predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16); |
|
|
|
|
*output_samples++ = predictor[ch]; |
|
|
|
|
} |
|
|
|
@ -307,7 +307,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
|
{ |
|
|
|
|
int shift[2] = { 4, 4 }; |
|
|
|
|
|
|
|
|
|
for (ch = 0; ch < avctx->channels; ch++) |
|
|
|
|
for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) |
|
|
|
|
predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16); |
|
|
|
|
|
|
|
|
|
ch = 0; |
|
|
|
|