* [FFmpeg-devel] [PATCH] adpcm fixes and improvements
@ 2023-08-15 14:49 Paul B Mahol
2023-08-16 16:38 ` Michael Niedermayer
0 siblings, 1 reply; 13+ messages in thread
From: Paul B Mahol @ 2023-08-15 14:49 UTC (permalink / raw)
To: FFmpeg development discussions and patches
[-- Attachment #1: Type: text/plain, Size: 9 bytes --]
Attached
[-- Attachment #2: 0001-avcodec-adpcm-refactor-ADPCM_MS-decoder.patch --]
[-- Type: text/x-patch, Size: 6958 bytes --]
From aab0cfb7e37992b1c1ef34740d199cc2bdc4ce40 Mon Sep 17 00:00:00 2001
From: Paul B Mahol <onemda@gmail.com>
Date: Tue, 15 Aug 2023 12:18:02 +0200
Subject: [PATCH 1/4] avcodec/adpcm: refactor ADPCM_MS decoder
Signed-off-by: Paul B Mahol <onemda@gmail.com>
---
libavcodec/adpcm.c | 63 ++++++++++++++++++++++++----------------------
1 file changed, 33 insertions(+), 30 deletions(-)
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index 59b9ef3497..b0c3b91a3b 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -535,12 +535,12 @@ static inline int16_t adpcm_ms_expand_nibble(ADPCMChannelStatus *c, int nibble)
{
int predictor;
- predictor = (((c->sample1) * (c->coeff1)) + ((c->sample2) * (c->coeff2))) / 64;
- predictor += ((nibble & 0x08)?(nibble - 0x10):(nibble)) * c->idelta;
+ predictor = ((c->sample1 * c->coeff1) + (c->sample2 * c->coeff2)) / 64;
+ predictor += ((nibble & 0x08)?(nibble - 0x10):nibble) * c->idelta;
c->sample2 = c->sample1;
c->sample1 = av_clip_int16(predictor);
- c->idelta = (ff_adpcm_AdaptationTable[(int)nibble] * c->idelta) >> 8;
+ c->idelta = (ff_adpcm_AdaptationTable[nibble] * c->idelta) >> 8;
if (c->idelta < 16) c->idelta = 16;
if (c->idelta > INT_MAX/768) {
av_log(NULL, AV_LOG_WARNING, "idelta overflow\n");
@@ -1236,6 +1236,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
if (avctx->ch_layout.nb_channels > 2) {
for (int channel = 0; channel < avctx->ch_layout.nb_channels; channel++) {
+ ADPCMChannelStatus *status = &c->status[channel];
samples = samples_p[channel];
block_predictor = bytestream2_get_byteu(&gb);
if (block_predictor > 6) {
@@ -1243,28 +1244,30 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
channel, block_predictor);
return AVERROR_INVALIDDATA;
}
- c->status[channel].coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
- c->status[channel].coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
- c->status[channel].idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
- c->status[channel].sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
- c->status[channel].sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
- *samples++ = c->status[channel].sample2;
- *samples++ = c->status[channel].sample1;
- for (int n = (nb_samples - 2) >> 1; n > 0; n--) {
+ status->coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
+ status->coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
+ status->idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
+ status->sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
+ status->sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
+ samples[0] = status->sample2;
+ samples[1] = status->sample1;
+ for (int n = 2; n < nb_samples; n += 2) {
int byte = bytestream2_get_byteu(&gb);
- *samples++ = adpcm_ms_expand_nibble(&c->status[channel], byte >> 4 );
- *samples++ = adpcm_ms_expand_nibble(&c->status[channel], byte & 0x0F);
+ samples[n ] = adpcm_ms_expand_nibble(status, byte >> 4 );
+ samples[n+1] = adpcm_ms_expand_nibble(status, byte & 0x0F);
}
}
} else {
+ ADPCMChannelStatus *status0 = &c->status[0];
+ ADPCMChannelStatus *status1 = &c->status[st];
block_predictor = bytestream2_get_byteu(&gb);
if (block_predictor > 6) {
av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[0] = %d\n",
block_predictor);
return AVERROR_INVALIDDATA;
}
- c->status[0].coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
- c->status[0].coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
+ status0->coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
+ status0->coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
if (st) {
block_predictor = bytestream2_get_byteu(&gb);
if (block_predictor > 6) {
@@ -1272,27 +1275,27 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
block_predictor);
return AVERROR_INVALIDDATA;
}
- c->status[1].coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
- c->status[1].coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
+ status1->coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
+ status1->coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
}
- c->status[0].idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
+ status0->idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
if (st){
- c->status[1].idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
+ status1->idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
}
- c->status[0].sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
- if (st) c->status[1].sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
- c->status[0].sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
- if (st) c->status[1].sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
+ status0->sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
+ if (st) status1->sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
+ status0->sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
+ if (st) status1->sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
- *samples++ = c->status[0].sample2;
- if (st) *samples++ = c->status[1].sample2;
- *samples++ = c->status[0].sample1;
- if (st) *samples++ = c->status[1].sample1;
- for (int n = (nb_samples - 2) >> (1 - st); n > 0; n--) {
+ *samples++ = status0->sample2;
+ if (st) *samples++ = status1->sample2;
+ *samples++ = status0->sample1;
+ if (st) *samples++ = status1->sample1;
+ for (int n = 0; n < (nb_samples - 2) * (st + 1); n += 2) {
int byte = bytestream2_get_byteu(&gb);
- *samples++ = adpcm_ms_expand_nibble(&c->status[0 ], byte >> 4 );
- *samples++ = adpcm_ms_expand_nibble(&c->status[st], byte & 0x0F);
+ samples[n ] = adpcm_ms_expand_nibble(status0, byte >> 4 );
+ samples[n+1] = adpcm_ms_expand_nibble(status1, byte & 0x0F);
}
}
) /* End of CASE */
--
2.39.1
[-- Attachment #3: 0003-avcodec-adpcm-use-already-existing-pointer-for-4xm-d.patch --]
[-- Type: text/x-patch, Size: 968 bytes --]
From c6ad6dc7b8725d897e36399e5c7b8174caeb92e6 Mon Sep 17 00:00:00 2001
From: Paul B Mahol <onemda@gmail.com>
Date: Tue, 15 Aug 2023 14:18:47 +0200
Subject: [PATCH 3/4] avcodec/adpcm: use already existing pointer for 4xm
decoder
Signed-off-by: Paul B Mahol <onemda@gmail.com>
---
libavcodec/adpcm.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index b0c3b91a3b..9993c9e531 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -1211,7 +1211,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
for (int i = 0; i < channels; i++) {
ADPCMChannelStatus *cs = &c->status[i];
- samples = (int16_t *)frame->data[i];
+ samples = samples_p[i];
for (int n = nb_samples >> 1; n > 0; n--) {
int v = bytestream2_get_byteu(&gb);
*samples++ = adpcm_ima_expand_nibble(cs, v & 0x0F, 4);
--
2.39.1
[-- Attachment #4: 0004-avcodec-adpcm-consume-all-input-when-decoding.patch --]
[-- Type: text/x-patch, Size: 62229 bytes --]
From 19789bca53548d672bff30b88a8838edaa876bdb Mon Sep 17 00:00:00 2001
From: Paul B Mahol <onemda@gmail.com>
Date: Tue, 15 Aug 2023 15:25:22 +0200
Subject: [PATCH 4/4] avcodec/adpcm: consume all input when decoding
Stops multiple decoding calls for single packet.
Also makes decoding faster.
Signed-off-by: Paul B Mahol <onemda@gmail.com>
---
libavcodec/adpcm.c | 388 +++++++++++++------------
tests/ref/fate/adpcm-creative-8-2.6bit | 2 +-
tests/ref/fate/adpcm-creative-8-2bit | 2 +-
tests/ref/fate/adpcm-creative-8-4bit | 2 +-
tests/ref/fate/adpcm-ms-mono | 60 +---
5 files changed, 227 insertions(+), 227 deletions(-)
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index 9993c9e531..520c76a6be 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -1066,43 +1066,29 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
return nb_samples;
}
-static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
- int *got_frame_ptr, AVPacket *avpkt)
+static int adpcm_decode_block(AVCodecContext *avctx,
+ int16_t *samples, int16_t **samples_p,
+ GetByteContext *gb)
{
- const uint8_t *buf = avpkt->data;
- int buf_size = avpkt->size;
ADPCMDecodeContext *c = avctx->priv_data;
int channels = avctx->ch_layout.nb_channels;
- int16_t *samples;
- int16_t **samples_p;
- int st; /* stereo */
+ const int st = channels == 2 ? 1 : 0; /* stereo */
int nb_samples, coded_samples, approx_nb_samples, ret;
- GetByteContext gb;
- bytestream2_init(&gb, buf, buf_size);
- nb_samples = get_nb_samples(avctx, &gb, buf_size, &coded_samples, &approx_nb_samples);
+ nb_samples = get_nb_samples(avctx, gb, bytestream2_get_bytes_left(gb), &coded_samples, &approx_nb_samples);
if (nb_samples <= 0) {
av_log(avctx, AV_LOG_ERROR, "invalid number of samples in packet\n");
return AVERROR_INVALIDDATA;
}
- /* get output buffer */
- frame->nb_samples = nb_samples;
- if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
- return ret;
- samples = (int16_t *)frame->data[0];
- samples_p = (int16_t **)frame->extended_data;
-
/* use coded_samples when applicable */
/* it is always <= nb_samples, so the output buffer will be large enough */
if (coded_samples) {
if (!approx_nb_samples && coded_samples != nb_samples)
av_log(avctx, AV_LOG_WARNING, "mismatch in coded sample count\n");
- frame->nb_samples = nb_samples = coded_samples;
+ nb_samples = coded_samples;
}
- st = channels == 2 ? 1 : 0;
-
switch(avctx->codec->id) {
CASE(ADPCM_IMA_QT,
/* In QuickTime, IMA is encoded by chunks of 34 bytes (=64 samples).
@@ -1114,7 +1100,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
/* (pppppp) (piiiiiii) */
/* Bits 15-7 are the _top_ 9 bits of the 16-bit initial predictor value */
- predictor = sign_extend(bytestream2_get_be16u(&gb), 16);
+ predictor = sign_extend(bytestream2_get_be16u(gb), 16);
step_index = predictor & 0x7F;
predictor &= ~0x7F;
@@ -1139,7 +1125,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
samples = samples_p[channel];
for (int m = 0; m < 64; m += 2) {
- int byte = bytestream2_get_byteu(&gb);
+ int byte = bytestream2_get_byteu(gb);
samples[m ] = adpcm_ima_qt_expand_nibble(cs, byte & 0x0F);
samples[m + 1] = adpcm_ima_qt_expand_nibble(cs, byte >> 4 );
}
@@ -1148,9 +1134,9 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
CASE(ADPCM_IMA_WAV,
for (int i = 0; i < channels; i++) {
ADPCMChannelStatus *cs = &c->status[i];
- cs->predictor = samples_p[i][0] = sign_extend(bytestream2_get_le16u(&gb), 16);
+ cs->predictor = samples_p[i][0] = sign_extend(bytestream2_get_le16u(gb), 16);
- cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
+ cs->step_index = sign_extend(bytestream2_get_le16u(gb), 16);
if (cs->step_index > 88u){
av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
i, cs->step_index);
@@ -1162,6 +1148,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
int samples_per_block = ff_adpcm_ima_block_samples[avctx->bits_per_coded_sample - 2];
int block_size = ff_adpcm_ima_block_sizes[avctx->bits_per_coded_sample - 2];
uint8_t temp[20 + AV_INPUT_BUFFER_PADDING_SIZE] = { 0 };
+ const uint8_t *buf = gb->buffer;
GetBitContext g;
for (int n = 0; n < (nb_samples - 1) / samples_per_block; n++) {
@@ -1169,7 +1156,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
ADPCMChannelStatus *cs = &c->status[i];
samples = &samples_p[i][1 + n * samples_per_block];
for (int j = 0; j < block_size; j++) {
- temp[j] = buf[4 * channels + block_size * n * channels +
+ temp[j] = buf[block_size * n * channels +
(j % 4) + (j / 4) * (channels * 4) + i * 4];
}
ret = init_get_bits8(&g, (const uint8_t *)&temp, block_size);
@@ -1181,14 +1168,14 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
}
}
- bytestream2_skip(&gb, avctx->block_align - channels * 4);
+ bytestream2_skip(gb, avctx->block_align - channels * 4);
} else {
for (int n = 0; n < (nb_samples - 1) / 8; n++) {
for (int i = 0; i < channels; i++) {
ADPCMChannelStatus *cs = &c->status[i];
samples = &samples_p[i][1 + n * 8];
for (int m = 0; m < 8; m += 2) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
samples[m ] = adpcm_ima_expand_nibble(cs, v & 0x0F, 3);
samples[m + 1] = adpcm_ima_expand_nibble(cs, v >> 4 , 3);
}
@@ -1198,10 +1185,10 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
) /* End of CASE */
CASE(ADPCM_4XM,
for (int i = 0; i < channels; i++)
- c->status[i].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
+ c->status[i].predictor = sign_extend(bytestream2_get_le16u(gb), 16);
for (int i = 0; i < channels; i++) {
- c->status[i].step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
+ c->status[i].step_index = sign_extend(bytestream2_get_le16u(gb), 16);
if (c->status[i].step_index > 88u) {
av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
i, c->status[i].step_index);
@@ -1213,7 +1200,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
ADPCMChannelStatus *cs = &c->status[i];
samples = samples_p[i];
for (int n = nb_samples >> 1; n > 0; n--) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_expand_nibble(cs, v & 0x0F, 4);
*samples++ = adpcm_ima_expand_nibble(cs, v >> 4 , 4);
}
@@ -1221,12 +1208,12 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
) /* End of CASE */
CASE(ADPCM_AGM,
for (int i = 0; i < channels; i++)
- c->status[i].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
+ c->status[i].predictor = sign_extend(bytestream2_get_le16u(gb), 16);
for (int i = 0; i < channels; i++)
- c->status[i].step = sign_extend(bytestream2_get_le16u(&gb), 16);
+ c->status[i].step = sign_extend(bytestream2_get_le16u(gb), 16);
for (int n = 0; n < nb_samples >> (1 - st); n++) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_agm_expand_nibble(&c->status[0], v & 0xF);
*samples++ = adpcm_agm_expand_nibble(&c->status[st], v >> 4 );
}
@@ -1238,7 +1225,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
for (int channel = 0; channel < avctx->ch_layout.nb_channels; channel++) {
ADPCMChannelStatus *status = &c->status[channel];
samples = samples_p[channel];
- block_predictor = bytestream2_get_byteu(&gb);
+ block_predictor = bytestream2_get_byteu(gb);
if (block_predictor > 6) {
av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[%d] = %d\n",
channel, block_predictor);
@@ -1246,13 +1233,13 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
status->coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
status->coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
- status->idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
- status->sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
- status->sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
+ status->idelta = sign_extend(bytestream2_get_le16u(gb), 16);
+ status->sample1 = sign_extend(bytestream2_get_le16u(gb), 16);
+ status->sample2 = sign_extend(bytestream2_get_le16u(gb), 16);
samples[0] = status->sample2;
samples[1] = status->sample1;
for (int n = 2; n < nb_samples; n += 2) {
- int byte = bytestream2_get_byteu(&gb);
+ int byte = bytestream2_get_byteu(gb);
samples[n ] = adpcm_ms_expand_nibble(status, byte >> 4 );
samples[n+1] = adpcm_ms_expand_nibble(status, byte & 0x0F);
}
@@ -1260,7 +1247,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
} else {
ADPCMChannelStatus *status0 = &c->status[0];
ADPCMChannelStatus *status1 = &c->status[st];
- block_predictor = bytestream2_get_byteu(&gb);
+ block_predictor = bytestream2_get_byteu(gb);
if (block_predictor > 6) {
av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[0] = %d\n",
block_predictor);
@@ -1269,7 +1256,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
status0->coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
status0->coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
if (st) {
- block_predictor = bytestream2_get_byteu(&gb);
+ block_predictor = bytestream2_get_byteu(gb);
if (block_predictor > 6) {
av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[1] = %d\n",
block_predictor);
@@ -1278,22 +1265,22 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
status1->coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
status1->coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
}
- status0->idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
+ status0->idelta = sign_extend(bytestream2_get_le16u(gb), 16);
if (st){
- status1->idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
+ status1->idelta = sign_extend(bytestream2_get_le16u(gb), 16);
}
- status0->sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
- if (st) status1->sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
- status0->sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
- if (st) status1->sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
+ status0->sample1 = sign_extend(bytestream2_get_le16u(gb), 16);
+ if (st) status1->sample1 = sign_extend(bytestream2_get_le16u(gb), 16);
+ status0->sample2 = sign_extend(bytestream2_get_le16u(gb), 16);
+ if (st) status1->sample2 = sign_extend(bytestream2_get_le16u(gb), 16);
*samples++ = status0->sample2;
if (st) *samples++ = status1->sample2;
*samples++ = status0->sample1;
if (st) *samples++ = status1->sample1;
for (int n = 0; n < (nb_samples - 2) * (st + 1); n += 2) {
- int byte = bytestream2_get_byteu(&gb);
+ int byte = bytestream2_get_byteu(gb);
samples[n ] = adpcm_ms_expand_nibble(status0, byte >> 4 );
samples[n+1] = adpcm_ms_expand_nibble(status1, byte & 0x0F);
}
@@ -1301,20 +1288,20 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
) /* End of CASE */
CASE(ADPCM_MTAF,
for (int channel = 0; channel < channels; channel += 2) {
- bytestream2_skipu(&gb, 4);
- c->status[channel ].step = bytestream2_get_le16u(&gb) & 0x1f;
- c->status[channel + 1].step = bytestream2_get_le16u(&gb) & 0x1f;
- c->status[channel ].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
- bytestream2_skipu(&gb, 2);
- c->status[channel + 1].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
- bytestream2_skipu(&gb, 2);
+ bytestream2_skipu(gb, 4);
+ c->status[channel ].step = bytestream2_get_le16u(gb) & 0x1f;
+ c->status[channel + 1].step = bytestream2_get_le16u(gb) & 0x1f;
+ c->status[channel ].predictor = sign_extend(bytestream2_get_le16u(gb), 16);
+ bytestream2_skipu(gb, 2);
+ c->status[channel + 1].predictor = sign_extend(bytestream2_get_le16u(gb), 16);
+ bytestream2_skipu(gb, 2);
for (int n = 0; n < nb_samples; n += 2) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
samples_p[channel][n ] = adpcm_mtaf_expand_nibble(&c->status[channel], v & 0x0F);
samples_p[channel][n + 1] = adpcm_mtaf_expand_nibble(&c->status[channel], v >> 4 );
}
for (int n = 0; n < nb_samples; n += 2) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
samples_p[channel + 1][n ] = adpcm_mtaf_expand_nibble(&c->status[channel + 1], v & 0x0F);
samples_p[channel + 1][n + 1] = adpcm_mtaf_expand_nibble(&c->status[channel + 1], v >> 4 );
}
@@ -1323,8 +1310,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
CASE(ADPCM_IMA_DK4,
for (int channel = 0; channel < channels; channel++) {
ADPCMChannelStatus *cs = &c->status[channel];
- cs->predictor = *samples++ = sign_extend(bytestream2_get_le16u(&gb), 16);
- cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
+ cs->predictor = *samples++ = sign_extend(bytestream2_get_le16u(gb), 16);
+ cs->step_index = sign_extend(bytestream2_get_le16u(gb), 16);
if (cs->step_index > 88u){
av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
channel, cs->step_index);
@@ -1332,7 +1319,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
}
for (int n = (nb_samples - 1) >> (1 - st); n > 0; n--) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_expand_nibble(&c->status[0 ], v >> 4 , 3);
*samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3);
}
@@ -1344,7 +1331,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
nibble = last_byte >> 4; \
decode_top_nibble_next = 0; \
} else { \
- last_byte = bytestream2_get_byteu(&gb); \
+ last_byte = bytestream2_get_byteu(gb); \
nibble = last_byte & 0x0F; \
decode_top_nibble_next = 1; \
}
@@ -1355,11 +1342,11 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
int diff_channel;
const int16_t *samples_end = samples + channels * nb_samples;
- bytestream2_skipu(&gb, 10);
- c->status[0].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
- c->status[1].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
- c->status[0].step_index = bytestream2_get_byteu(&gb);
- c->status[1].step_index = bytestream2_get_byteu(&gb);
+ bytestream2_skipu(gb, 10);
+ c->status[0].predictor = sign_extend(bytestream2_get_le16u(gb), 16);
+ c->status[1].predictor = sign_extend(bytestream2_get_le16u(gb), 16);
+ c->status[0].step_index = bytestream2_get_byteu(gb);
+ c->status[1].step_index = bytestream2_get_byteu(gb);
if (c->status[0].step_index > 88u || c->status[1].step_index > 88u){
av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i/%i\n",
c->status[0].step_index, c->status[1].step_index);
@@ -1396,14 +1383,14 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
*samples++ = c->status[0].predictor - c->status[1].predictor;
}
- if ((bytestream2_tell(&gb) & 1))
- bytestream2_skip(&gb, 1);
+ if ((bytestream2_tell(gb) & 1))
+ bytestream2_skip(gb, 1);
) /* End of CASE */
CASE(ADPCM_IMA_ISS,
for (int channel = 0; channel < channels; channel++) {
ADPCMChannelStatus *cs = &c->status[channel];
- cs->predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
- cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
+ cs->predictor = sign_extend(bytestream2_get_le16u(gb), 16);
+ cs->step_index = sign_extend(bytestream2_get_le16u(gb), 16);
if (cs->step_index > 88u){
av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
channel, cs->step_index);
@@ -1413,7 +1400,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
for (int n = nb_samples >> (1 - st); n > 0; n--) {
int v1, v2;
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
/* nibbles are swapped for mono */
if (st) {
v1 = v >> 4;
@@ -1429,8 +1416,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
CASE(ADPCM_IMA_MOFLEX,
for (int channel = 0; channel < channels; channel++) {
ADPCMChannelStatus *cs = &c->status[channel];
- cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
- cs->predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
+ cs->step_index = sign_extend(bytestream2_get_le16u(gb), 16);
+ cs->predictor = sign_extend(bytestream2_get_le16u(gb), 16);
if (cs->step_index > 88u){
av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
channel, cs->step_index);
@@ -1442,7 +1429,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
for (int channel = 0; channel < channels; channel++) {
samples = samples_p[channel] + 256 * subframe;
for (int n = 0; n < 256; n += 2) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_expand_nibble(&c->status[channel], v & 0x0F, 3);
*samples++ = adpcm_ima_expand_nibble(&c->status[channel], v >> 4 , 3);
}
@@ -1453,9 +1440,9 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
for (int channel = 0; channel < channels; channel++) {
ADPCMChannelStatus *cs = &c->status[channel];
samples = samples_p[channel];
- bytestream2_skip(&gb, 4);
+ bytestream2_skip(gb, 4);
for (int n = 0; n < nb_samples; n += 2) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_expand_nibble(cs, v >> 4 , 3);
*samples++ = adpcm_ima_expand_nibble(cs, v & 0x0F, 3);
}
@@ -1463,14 +1450,14 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
) /* End of CASE */
CASE(ADPCM_IMA_APC,
for (int n = nb_samples >> (1 - st); n > 0; n--) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_expand_nibble(&c->status[0], v >> 4 , 3);
*samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3);
}
) /* End of CASE */
CASE(ADPCM_IMA_SSI,
for (int n = nb_samples >> (1 - st); n > 0; n--) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_qt_expand_nibble(&c->status[0], v >> 4 );
*samples++ = adpcm_ima_qt_expand_nibble(&c->status[st], v & 0x0F);
}
@@ -1478,7 +1465,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
CASE(ADPCM_IMA_APM,
for (int n = nb_samples / 2; n > 0; n--) {
for (int channel = 0; channel < channels; channel++) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_qt_expand_nibble(&c->status[channel], v >> 4 );
samples[st] = adpcm_ima_qt_expand_nibble(&c->status[channel], v & 0x0F);
}
@@ -1488,7 +1475,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
CASE(ADPCM_IMA_ALP,
for (int n = nb_samples / 2; n > 0; n--) {
for (int channel = 0; channel < channels; channel++) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_alp_expand_nibble(&c->status[channel], v >> 4 , 2);
samples[st] = adpcm_ima_alp_expand_nibble(&c->status[channel], v & 0x0F, 2);
}
@@ -1499,7 +1486,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
for (int channel = 0; channel < channels; channel++) {
int16_t *smp = samples_p[channel];
for (int n = 0; n < nb_samples / 2; n++) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*smp++ = adpcm_ima_cunning_expand_nibble(&c->status[channel], v & 0x0F);
*smp++ = adpcm_ima_cunning_expand_nibble(&c->status[channel], v >> 4);
}
@@ -1507,7 +1494,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
) /* End of CASE */
CASE(ADPCM_IMA_OKI,
for (int n = nb_samples >> (1 - st); n > 0; n--) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_oki_expand_nibble(&c->status[0], v >> 4 );
*samples++ = adpcm_ima_oki_expand_nibble(&c->status[st], v & 0x0F);
}
@@ -1515,8 +1502,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
CASE(ADPCM_IMA_RAD,
for (int channel = 0; channel < channels; channel++) {
ADPCMChannelStatus *cs = &c->status[channel];
- cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
- cs->predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
+ cs->step_index = sign_extend(bytestream2_get_le16u(gb), 16);
+ cs->predictor = sign_extend(bytestream2_get_le16u(gb), 16);
if (cs->step_index > 88u){
av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
channel, cs->step_index);
@@ -1526,9 +1513,9 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
for (int n = 0; n < nb_samples / 2; n++) {
int byte[2];
- byte[0] = bytestream2_get_byteu(&gb);
+ byte[0] = bytestream2_get_byteu(gb);
if (st)
- byte[1] = bytestream2_get_byteu(&gb);
+ byte[1] = bytestream2_get_byteu(gb);
for (int channel = 0; channel < channels; channel++) {
*samples++ = adpcm_ima_expand_nibble(&c->status[channel], byte[channel] & 0x0F, 3);
}
@@ -1543,7 +1530,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
int16_t *smp = samples_p[channel];
for (int n = nb_samples / 2; n > 0; n--) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*smp++ = adpcm_ima_expand_nibble(&c->status[channel], v & 0x0F, 3);
*smp++ = adpcm_ima_expand_nibble(&c->status[channel], v >> 4 , 3);
}
@@ -1551,32 +1538,32 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
} else {
for (int n = nb_samples / 2; n > 0; n--) {
for (int channel = 0; channel < channels; channel++) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_expand_nibble(&c->status[channel], v & 0x0F, 3);
samples[st] = adpcm_ima_expand_nibble(&c->status[channel], v >> 4 , 3);
}
samples += channels;
}
}
- bytestream2_seek(&gb, 0, SEEK_END);
+ bytestream2_seek(gb, 0, SEEK_END);
) /* End of CASE */
CASE(ADPCM_XMD,
int bytes_remaining, block = 0;
- while (bytestream2_get_bytes_left(&gb) >= 21 * channels) {
+ while (bytestream2_get_bytes_left(gb) >= 21 * channels) {
for (int channel = 0; channel < channels; channel++) {
int16_t *out = samples_p[channel] + block * 32;
int16_t history[2];
uint16_t scale;
- history[1] = sign_extend(bytestream2_get_le16(&gb), 16);
- history[0] = sign_extend(bytestream2_get_le16(&gb), 16);
- scale = bytestream2_get_le16(&gb);
+ history[1] = sign_extend(bytestream2_get_le16(gb), 16);
+ history[0] = sign_extend(bytestream2_get_le16(gb), 16);
+ scale = bytestream2_get_le16(gb);
out[0] = history[1];
out[1] = history[0];
for (int n = 0; n < 15; n++) {
- unsigned byte = bytestream2_get_byte(&gb);
+ unsigned byte = bytestream2_get_byte(gb);
int32_t nibble[2];
nibble[0] = sign_extend(byte & 15, 4);
@@ -1594,9 +1581,9 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
block++;
}
- bytes_remaining = bytestream2_get_bytes_left(&gb);
+ bytes_remaining = bytestream2_get_bytes_left(gb);
if (bytes_remaining > 0) {
- bytestream2_skip(&gb, bytes_remaining);
+ bytestream2_skip(gb, bytes_remaining);
}
) /* End of CASE */
CASE(ADPCM_XA,
@@ -1605,24 +1592,24 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
int samples_per_block = 28 * (3 - channels) * 4;
int sample_offset = 0;
int bytes_remaining;
- while (bytestream2_get_bytes_left(&gb) >= 128) {
- if ((ret = xa_decode(avctx, out0, out1, buf + bytestream2_tell(&gb),
+ while (bytestream2_get_bytes_left(gb) >= 128) {
+ if ((ret = xa_decode(avctx, out0, out1, gb->buffer,
&c->status[0], &c->status[1],
channels, sample_offset)) < 0)
return ret;
- bytestream2_skipu(&gb, 128);
+ bytestream2_skipu(gb, 128);
sample_offset += samples_per_block;
}
/* Less than a full block of data left, e.g. when reading from
* 2324 byte per sector XA; the remainder is padding */
- bytes_remaining = bytestream2_get_bytes_left(&gb);
+ bytes_remaining = bytestream2_get_bytes_left(gb);
if (bytes_remaining > 0) {
- bytestream2_skip(&gb, bytes_remaining);
+ bytestream2_skip(gb, bytes_remaining);
}
) /* End of CASE */
CASE(ADPCM_IMA_EA_EACS,
for (int i = 0; i <= st; i++) {
- c->status[i].step_index = bytestream2_get_le32u(&gb);
+ c->status[i].step_index = bytestream2_get_le32u(gb);
if (c->status[i].step_index > 88u) {
av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
i, c->status[i].step_index);
@@ -1630,20 +1617,20 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
}
for (int i = 0; i <= st; i++) {
- c->status[i].predictor = bytestream2_get_le32u(&gb);
+ c->status[i].predictor = bytestream2_get_le32u(gb);
if (FFABS((int64_t)c->status[i].predictor) > (1<<16))
return AVERROR_INVALIDDATA;
}
for (int n = nb_samples >> (1 - st); n > 0; n--) {
- int byte = bytestream2_get_byteu(&gb);
+ int byte = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_expand_nibble(&c->status[0], byte >> 4, 3);
*samples++ = adpcm_ima_expand_nibble(&c->status[st], byte & 0x0F, 3);
}
) /* End of CASE */
CASE(ADPCM_IMA_EA_SEAD,
for (int n = nb_samples >> (1 - st); n > 0; n--) {
- int byte = bytestream2_get_byteu(&gb);
+ int byte = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_expand_nibble(&c->status[0], byte >> 4, 6);
*samples++ = adpcm_ima_expand_nibble(&c->status[st], byte & 0x0F, 6);
}
@@ -1661,24 +1648,24 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
if (channels != 2)
return AVERROR_INVALIDDATA;
- current_left_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
- previous_left_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
- current_right_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
- previous_right_sample = sign_extend(bytestream2_get_le16u(&gb), 16);
+ current_left_sample = sign_extend(bytestream2_get_le16u(gb), 16);
+ previous_left_sample = sign_extend(bytestream2_get_le16u(gb), 16);
+ current_right_sample = sign_extend(bytestream2_get_le16u(gb), 16);
+ previous_right_sample = sign_extend(bytestream2_get_le16u(gb), 16);
for (int count1 = 0; count1 < nb_samples / 28; count1++) {
- int byte = bytestream2_get_byteu(&gb);
+ int byte = bytestream2_get_byteu(gb);
coeff1l = ea_adpcm_table[ byte >> 4 ];
coeff2l = ea_adpcm_table[(byte >> 4 ) + 4];
coeff1r = ea_adpcm_table[ byte & 0x0F];
coeff2r = ea_adpcm_table[(byte & 0x0F) + 4];
- byte = bytestream2_get_byteu(&gb);
+ byte = bytestream2_get_byteu(gb);
shift_left = 20 - (byte >> 4);
shift_right = 20 - (byte & 0x0F);
for (int count2 = 0; count2 < 28; count2++) {
- byte = bytestream2_get_byteu(&gb);
+ byte = bytestream2_get_byteu(gb);
next_left_sample = sign_extend(byte >> 4, 4) * (1 << shift_left);
next_right_sample = sign_extend(byte, 4) * (1 << shift_right);
@@ -1698,13 +1685,13 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
}
- bytestream2_skip(&gb, 2); // Skip terminating 0x0000
+ bytestream2_skip(gb, 2); // Skip terminating 0x0000
) /* End of CASE */
CASE(ADPCM_EA_MAXIS_XA,
int coeff[2][2], shift[2];
for (int channel = 0; channel < channels; channel++) {
- int byte = bytestream2_get_byteu(&gb);
+ int byte = bytestream2_get_byteu(gb);
for (int i = 0; i < 2; i++)
coeff[channel][i] = ea_adpcm_table[(byte >> 4) + 4*i];
shift[channel] = 20 - (byte & 0x0F);
@@ -1712,8 +1699,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
for (int count1 = 0; count1 < nb_samples / 2; count1++) {
int byte[2];
- byte[0] = bytestream2_get_byteu(&gb);
- if (st) byte[1] = bytestream2_get_byteu(&gb);
+ byte[0] = bytestream2_get_byteu(gb);
+ if (st) byte[1] = bytestream2_get_byteu(gb);
for (int i = 4; i >= 0; i-=4) { /* Pairwise samples LL RR (st) or LL LL (mono) */
for (int channel = 0; channel < channels; channel++) {
int sample = sign_extend(byte[channel] >> i, 4) * (1 << shift[channel]);
@@ -1726,7 +1713,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
}
}
- bytestream2_seek(&gb, 0, SEEK_END);
+ bytestream2_seek(gb, 0, SEEK_END);
) /* End of CASE */
#if CONFIG_ADPCM_EA_R1_DECODER || CONFIG_ADPCM_EA_R2_DECODER || CONFIG_ADPCM_EA_R3_DECODER
case AV_CODEC_ID_ADPCM_EA_R1:
@@ -1745,32 +1732,32 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
int offsets[6];
for (unsigned channel = 0; channel < channels; channel++)
- offsets[channel] = (big_endian ? bytestream2_get_be32(&gb) :
- bytestream2_get_le32(&gb)) +
+ offsets[channel] = (big_endian ? bytestream2_get_be32(gb) :
+ bytestream2_get_le32(gb)) +
(channels + 1) * 4;
for (unsigned channel = 0; channel < channels; channel++) {
int count1;
- bytestream2_seek(&gb, offsets[channel], SEEK_SET);
+ bytestream2_seek(gb, offsets[channel], SEEK_SET);
samplesC = samples_p[channel];
if (avctx->codec->id == AV_CODEC_ID_ADPCM_EA_R1) {
- current_sample = sign_extend(bytestream2_get_le16(&gb), 16);
- previous_sample = sign_extend(bytestream2_get_le16(&gb), 16);
+ current_sample = sign_extend(bytestream2_get_le16(gb), 16);
+ previous_sample = sign_extend(bytestream2_get_le16(gb), 16);
} else {
current_sample = c->status[channel].predictor;
previous_sample = c->status[channel].prev_sample;
}
for (count1 = 0; count1 < nb_samples / 28; count1++) {
- int byte = bytestream2_get_byte(&gb);
+ int byte = bytestream2_get_byte(gb);
if (byte == 0xEE) { /* only seen in R2 and R3 */
- current_sample = sign_extend(bytestream2_get_be16(&gb), 16);
- previous_sample = sign_extend(bytestream2_get_be16(&gb), 16);
+ current_sample = sign_extend(bytestream2_get_be16(gb), 16);
+ previous_sample = sign_extend(bytestream2_get_be16(gb), 16);
for (int count2 = 0; count2 < 28; count2++)
- *samplesC++ = sign_extend(bytestream2_get_be16(&gb), 16);
+ *samplesC++ = sign_extend(bytestream2_get_be16(gb), 16);
} else {
coeff1 = ea_adpcm_table[ byte >> 4 ];
coeff2 = ea_adpcm_table[(byte >> 4) + 4];
@@ -1780,7 +1767,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
if (count2 & 1)
next_sample = (unsigned)sign_extend(byte, 4) << shift;
else {
- byte = bytestream2_get_byte(&gb);
+ byte = bytestream2_get_byte(gb);
next_sample = (unsigned)sign_extend(byte >> 4, 4) << shift;
}
@@ -1807,8 +1794,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
}
- frame->nb_samples = count * 28;
- bytestream2_seek(&gb, 0, SEEK_END);
+ nb_samples = count * 28;
+ bytestream2_seek(gb, 0, SEEK_END);
break;
}
#endif /* CONFIG_ADPCM_EA_Rx_DECODER */
@@ -1817,12 +1804,12 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
int coeff[2][4], shift[4];
int16_t *s = samples_p[channel];
for (int n = 0; n < 4; n++, s += 32) {
- int val = sign_extend(bytestream2_get_le16u(&gb), 16);
+ int val = sign_extend(bytestream2_get_le16u(gb), 16);
for (int i = 0; i < 2; i++)
coeff[i][n] = ea_adpcm_table[(val&0x0F)+4*i];
s[0] = val & ~0x0F;
- val = sign_extend(bytestream2_get_le16u(&gb), 16);
+ val = sign_extend(bytestream2_get_le16u(gb), 16);
shift[n] = 20 - (val & 0x0F);
s[1] = val & ~0x0F;
}
@@ -1831,7 +1818,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
s = &samples_p[channel][m];
for (int n = 0; n < 4; n++, s += 32) {
int level, pred;
- int byte = bytestream2_get_byteu(&gb);
+ int byte = bytestream2_get_byteu(gb);
level = sign_extend(byte >> 4, 4) * (1 << shift[n]);
pred = s[-1] * coeff[0][n] + s[-2] * coeff[1][n];
@@ -1847,8 +1834,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
CASE(ADPCM_IMA_ACORN,
for (int channel = 0; channel < channels; channel++) {
ADPCMChannelStatus *cs = &c->status[channel];
- cs->predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
- cs->step_index = bytestream2_get_le16u(&gb) & 0xFF;
+ cs->predictor = sign_extend(bytestream2_get_le16u(gb), 16);
+ cs->step_index = bytestream2_get_le16u(gb) & 0xFF;
if (cs->step_index > 88u){
av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
channel, cs->step_index);
@@ -1856,7 +1843,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
}
for (int n = nb_samples >> (1 - st); n > 0; n--) {
- int byte = bytestream2_get_byteu(&gb);
+ int byte = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_expand_nibble(&c->status[0], byte & 0x0F, 3);
*samples++ = adpcm_ima_expand_nibble(&c->status[st], byte >> 4, 3);
}
@@ -1874,9 +1861,9 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
* Some implementations have step_index as 16-bits, but others
* only use the lower 8 and store garbage in the upper 8.
*/
- c->status[0].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
- c->status[0].step_index = bytestream2_get_byteu(&gb);
- bytestream2_skipu(&gb, 5);
+ c->status[0].predictor = sign_extend(bytestream2_get_le16u(gb), 16);
+ c->status[0].step_index = bytestream2_get_byteu(gb);
+ bytestream2_skipu(gb, 5);
if (c->status[0].step_index > 88u) {
av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n",
c->status[0].step_index);
@@ -1884,14 +1871,14 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
for (int n = nb_samples >> 1; n > 0; n--) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_expand_nibble(&c->status[0], v >> 4, 3);
*samples++ = adpcm_ima_expand_nibble(&c->status[0], v & 0xf, 3);
}
if (nb_samples & 1) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_expand_nibble(&c->status[0], v >> 4, 3);
if (v & 0x0F) {
@@ -1903,9 +1890,9 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
) /* End of CASE */
CASE(ADPCM_IMA_SMJPEG,
for (int i = 0; i < channels; i++) {
- c->status[i].predictor = sign_extend(bytestream2_get_be16u(&gb), 16);
- c->status[i].step_index = bytestream2_get_byteu(&gb);
- bytestream2_skipu(&gb, 1);
+ c->status[i].predictor = sign_extend(bytestream2_get_be16u(gb), 16);
+ c->status[i].step_index = bytestream2_get_byteu(gb);
+ bytestream2_skipu(gb, 1);
if (c->status[i].step_index > 88u) {
av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n",
c->status[i].step_index);
@@ -1914,7 +1901,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
for (int n = nb_samples >> (1 - st); n > 0; n--) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_qt_expand_nibble(&c->status[0 ], v >> 4 );
*samples++ = adpcm_ima_qt_expand_nibble(&c->status[st], v & 0xf);
@@ -1922,7 +1909,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
) /* End of CASE */
CASE(ADPCM_CT,
for (int n = nb_samples >> (1 - st); n > 0; n--) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_ct_expand_nibble(&c->status[0 ], v >> 4 );
*samples++ = adpcm_ct_expand_nibble(&c->status[st], v & 0x0F);
}
@@ -1934,15 +1921,15 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
case AV_CODEC_ID_ADPCM_SBPRO_2:
if (!c->status[0].step_index) {
/* the first byte is a raw sample */
- *samples++ = 128 * (bytestream2_get_byteu(&gb) - 0x80);
+ *samples++ = 128 * (bytestream2_get_byteu(gb) - 0x80);
if (st)
- *samples++ = 128 * (bytestream2_get_byteu(&gb) - 0x80);
+ *samples++ = 128 * (bytestream2_get_byteu(gb) - 0x80);
c->status[0].step_index = 1;
nb_samples--;
}
if (avctx->codec->id == AV_CODEC_ID_ADPCM_SBPRO_4) {
for (int n = nb_samples >> (1 - st); n > 0; n--) {
- int byte = bytestream2_get_byteu(&gb);
+ int byte = bytestream2_get_byteu(gb);
*samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
byte >> 4, 4, 0);
*samples++ = adpcm_sbpro_expand_nibble(&c->status[st],
@@ -1950,7 +1937,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
} else if (avctx->codec->id == AV_CODEC_ID_ADPCM_SBPRO_3) {
for (int n = (nb_samples<<st) / 3; n > 0; n--) {
- int byte = bytestream2_get_byteu(&gb);
+ int byte = bytestream2_get_byteu(gb);
*samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
byte >> 5 , 3, 0);
*samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
@@ -1960,7 +1947,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
} else {
for (int n = nb_samples >> (2 - st); n > 0; n--) {
- int byte = bytestream2_get_byteu(&gb);
+ int byte = bytestream2_get_byteu(gb);
*samples++ = adpcm_sbpro_expand_nibble(&c->status[0],
byte >> 6 , 2, 2);
*samples++ = adpcm_sbpro_expand_nibble(&c->status[st],
@@ -1974,12 +1961,12 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
break;
#endif /* CONFIG_ADPCM_SBPRO_x_DECODER */
CASE(ADPCM_SWF,
- adpcm_swf_decode(avctx, buf, buf_size, samples);
- bytestream2_seek(&gb, 0, SEEK_END);
+ adpcm_swf_decode(avctx, gb->buffer_start, bytestream2_size(gb), samples);
+ bytestream2_seek(gb, 0, SEEK_END);
) /* End of CASE */
CASE(ADPCM_YAMAHA,
for (int n = nb_samples >> (1 - st); n > 0; n--) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_yamaha_expand_nibble(&c->status[0 ], v & 0x0F);
*samples++ = adpcm_yamaha_expand_nibble(&c->status[st], v >> 4 );
}
@@ -1988,7 +1975,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
for (int channel = 0; channel < channels; channel++) {
samples = samples_p[channel];
for (int n = nb_samples >> 1; n > 0; n--) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_yamaha_expand_nibble(&c->status[channel], v & 0x0F);
*samples++ = adpcm_yamaha_expand_nibble(&c->status[channel], v >> 4 );
}
@@ -2014,7 +2001,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
samples = samples_p[channel] + m * 16;
/* Read in every sample for this channel. */
for (int i = 0; i < samples_per_block; i++) {
- int byte = bytestream2_get_byteu(&gb);
+ int byte = bytestream2_get_byteu(gb);
int scale = 1 << (byte >> 4);
int index = byte & 0xf;
int factor1 = afc_coeffs[0][index];
@@ -2027,7 +2014,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
if (n & 1) {
sampledat = sign_extend(byte, 4);
} else {
- byte = bytestream2_get_byteu(&gb);
+ byte = bytestream2_get_byteu(gb);
sampledat = sign_extend(byte >> 4, 4);
}
@@ -2043,7 +2030,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
c->status[channel].sample2 = prev2;
}
}
- bytestream2_seek(&gb, 0, SEEK_END);
+ bytestream2_seek(gb, 0, SEEK_END);
) /* End of CASE */
#if CONFIG_ADPCM_THP_DECODER || CONFIG_ADPCM_THP_LE_DECODER
case AV_CODEC_ID_ADPCM_THP:
@@ -2054,8 +2041,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
#define THP_GET16(g) \
sign_extend( \
avctx->codec->id == AV_CODEC_ID_ADPCM_THP_LE ? \
- bytestream2_get_le16u(&(g)) : \
- bytestream2_get_be16u(&(g)), 16)
+ bytestream2_get_le16u((g)) : \
+ bytestream2_get_be16u((g)), 16)
if (avctx->extradata) {
GetByteContext tb;
@@ -2067,7 +2054,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
bytestream2_init(&tb, avctx->extradata, avctx->extradata_size);
for (int i = 0; i < channels; i++)
for (int n = 0; n < 16; n++)
- table[i][n] = THP_GET16(tb);
+ table[i][n] = THP_GET16(&tb);
} else {
for (int i = 0; i < channels; i++)
for (int n = 0; n < 16; n++)
@@ -2081,7 +2068,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
c->has_status = 1;
} else {
- bytestream2_skip(&gb, channels * 4);
+ bytestream2_skip(gb, channels * 4);
}
}
@@ -2090,7 +2077,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
/* Read in every sample for this channel. */
for (int i = 0; i < (nb_samples + 13) / 14; i++) {
- int byte = bytestream2_get_byteu(&gb);
+ int byte = bytestream2_get_byteu(gb);
int index = (byte >> 4) & 7;
unsigned int exp = byte & 0x0F;
int64_t factor1 = table[ch][index * 2];
@@ -2103,7 +2090,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
if (n & 1) {
sampledat = sign_extend(byte, 4);
} else {
- byte = bytestream2_get_byteu(&gb);
+ byte = bytestream2_get_byteu(gb);
sampledat = sign_extend(byte >> 4, 4);
}
@@ -2126,9 +2113,9 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
for (int i = 0; i < nb_samples / 28; i++) {
int byte, header;
if (channel)
- bytestream2_skipu(&gb, 1);
- header = bytestream2_get_byteu(&gb);
- bytestream2_skipu(&gb, 3 - channel);
+ bytestream2_skipu(gb, 1);
+ header = bytestream2_get_byteu(gb);
+ bytestream2_skipu(gb, 3 - channel);
/* Decode 28 samples. */
for (int n = 0; n < 28; n++) {
@@ -2150,7 +2137,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
prev = av_clip_intp2((prev + 0x20) >> 6, 21);
- byte = bytestream2_get_byteu(&gb);
+ byte = bytestream2_get_byteu(gb);
if (!channel)
sampledat = sign_extend(byte, 4);
else
@@ -2163,11 +2150,11 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
}
}
if (!channel)
- bytestream2_seek(&gb, 0, SEEK_SET);
+ bytestream2_seek(gb, 0, SEEK_SET);
}
) /* End of CASE */
CASE(ADPCM_PSX,
- for (int block = 0; block < avpkt->size / FFMAX(avctx->block_align, 16 * channels); block++) {
+ for (int block = 0; block < bytestream2_size(gb) / FFMAX(avctx->block_align, 16 * channels); block++) {
int nb_samples_per_block = 28 * FFMAX(avctx->block_align, 16 * channels) / (16 * channels);
for (int channel = 0; channel < channels; channel++) {
samples = samples_p[channel] + block * nb_samples_per_block;
@@ -2177,12 +2164,12 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
for (int i = 0; i < nb_samples_per_block / 28; i++) {
int filter, shift, flag, byte;
- filter = bytestream2_get_byteu(&gb);
+ filter = bytestream2_get_byteu(gb);
shift = filter & 0xf;
filter = filter >> 4;
if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table))
return AVERROR_INVALIDDATA;
- flag = bytestream2_get_byteu(&gb) & 0x7;
+ flag = bytestream2_get_byteu(gb) & 0x7;
/* Decode 28 samples. */
for (int n = 0; n < 28; n++) {
@@ -2191,7 +2178,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
if (n & 1) {
scale = sign_extend(byte >> 4, 4);
} else {
- byte = bytestream2_get_byteu(&gb);
+ byte = bytestream2_get_byteu(gb);
scale = sign_extend(byte, 4);
}
@@ -2225,7 +2212,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
* Each block relies on the previous two samples of each channel.
* They should be 0 initially.
*/
- for (int block = 0; block < avpkt->size / avctx->block_align; block++) {
+ for (int block = 0; block < bytestream2_size(gb) / avctx->block_align; block++) {
for (int channel = 0; channel < avctx->ch_layout.nb_channels; channel++) {
ADPCMChannelStatus *cs = c->status + channel;
int control, shift;
@@ -2233,11 +2220,11 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
samples = samples_p[channel] + block * 32;
/* Get the control byte and decode the samples, 2 at a time. */
- control = bytestream2_get_byteu(&gb);
+ control = bytestream2_get_byteu(gb);
shift = (control >> 4) + 2;
for (int n = 0; n < 16; n++) {
- int sample = bytestream2_get_byteu(&gb);
+ int sample = bytestream2_get_byteu(gb);
*samples++ = ff_adpcm_argo_expand_nibble(cs, sample >> 4, shift, control & 0x04);
*samples++ = ff_adpcm_argo_expand_nibble(cs, sample >> 0, shift, control & 0x04);
}
@@ -2246,14 +2233,14 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
) /* End of CASE */
CASE(ADPCM_ZORK,
for (int n = 0; n < nb_samples * channels; n++) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_zork_expand_nibble(&c->status[n % channels], v);
}
) /* End of CASE */
CASE(ADPCM_IMA_MTF,
for (int n = nb_samples / 2; n > 0; n--) {
for (int channel = 0; channel < channels; channel++) {
- int v = bytestream2_get_byteu(&gb);
+ int v = bytestream2_get_byteu(gb);
*samples++ = adpcm_ima_mtf_expand_nibble(&c->status[channel], v >> 4);
samples[st] = adpcm_ima_mtf_expand_nibble(&c->status[channel], v & 0x0F);
}
@@ -2264,6 +2251,51 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
av_assert0(0); // unsupported codec_id should not happen
}
+ return nb_samples;
+}
+
+static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
+ int *got_frame_ptr, AVPacket *avpkt)
+{
+ const uint8_t *buf = avpkt->data;
+ const int channels = avctx->ch_layout.nb_channels;
+ int nb_samples, coded_samples, approx_nb_samples, ret;
+ int buf_size = avpkt->size;
+ int nb_blocks = avctx->block_align > 0 ? FFMAX(1, buf_size / avctx->block_align) : 1;
+ int16_t *extended_data[14];
+ int frame_nb_samples = 0;
+ GetByteContext gb;
+
+ bytestream2_init(&gb, buf, buf_size);
+
+ nb_samples = get_nb_samples(avctx, &gb, bytestream2_get_bytes_left(&gb), &coded_samples, &approx_nb_samples);
+ if (nb_samples <= 0) {
+ av_log(avctx, AV_LOG_ERROR, "invalid number of samples in packet\n");
+ return AVERROR_INVALIDDATA;
+ }
+
+ /* get output buffer */
+ frame->nb_samples = nb_samples * nb_blocks;
+ if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
+ return ret;
+
+ bytestream2_seek(&gb, 0, SEEK_SET);
+ for (int block = 0; block < nb_blocks; block++) {
+ for (int ch = 0; ch < channels; ch++)
+ extended_data[ch] = ((int16_t *)frame->extended_data[ch]) + frame_nb_samples;
+
+ ret = adpcm_decode_block(avctx, ((int16_t *)frame->data[0]) + frame_nb_samples * channels,
+ extended_data, &gb);
+ if (ret < 0)
+ return ret;
+ frame_nb_samples += ret;
+
+ if (bytestream2_get_bytes_left(&gb) <= 0)
+ break;
+ }
+
+ frame->nb_samples = frame_nb_samples;
+
if (avpkt->size && bytestream2_tell(&gb) == 0) {
av_log(avctx, AV_LOG_ERROR, "Nothing consumed\n");
return AVERROR_INVALIDDATA;
@@ -2271,10 +2303,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
*got_frame_ptr = 1;
- if (avpkt->size < bytestream2_tell(&gb)) {
+ if (avpkt->size < bytestream2_tell(&gb))
av_log(avctx, AV_LOG_ERROR, "Overread of %d < %d\n", avpkt->size, bytestream2_tell(&gb));
- return avpkt->size;
- }
return bytestream2_tell(&gb);
}
diff --git a/tests/ref/fate/adpcm-creative-8-2.6bit b/tests/ref/fate/adpcm-creative-8-2.6bit
index 835760448b..f4619d1c7a 100644
--- a/tests/ref/fate/adpcm-creative-8-2.6bit
+++ b/tests/ref/fate/adpcm-creative-8-2.6bit
@@ -1 +1 @@
-dee4417597abc2db70a175d6809870e7
+1a3fce8740f2d3f7b22ba7df23691a63
diff --git a/tests/ref/fate/adpcm-creative-8-2bit b/tests/ref/fate/adpcm-creative-8-2bit
index 4166846dcb..c747cba5fc 100644
--- a/tests/ref/fate/adpcm-creative-8-2bit
+++ b/tests/ref/fate/adpcm-creative-8-2bit
@@ -1 +1 @@
-832846066fbce28821b7f0717c4d3a90
+d81563d1c4960f060038e9b62037ecbb
diff --git a/tests/ref/fate/adpcm-creative-8-4bit b/tests/ref/fate/adpcm-creative-8-4bit
index 2d579aa91b..f66c59ec5b 100644
--- a/tests/ref/fate/adpcm-creative-8-4bit
+++ b/tests/ref/fate/adpcm-creative-8-4bit
@@ -1 +1 @@
-1813d196cef83f7030bb150399b2903e
+a89b291b8a6a33edf459a56655587da7
diff --git a/tests/ref/fate/adpcm-ms-mono b/tests/ref/fate/adpcm-ms-mono
index 9823ba77b5..10521548ef 100644
--- a/tests/ref/fate/adpcm-ms-mono
+++ b/tests/ref/fate/adpcm-ms-mono
@@ -3,48 +3,18 @@
#codec_id 0: pcm_s16le
#sample_rate 0: 11025
#channel_layout_name 0: mono
-0, 0, 0, 500, 1000, 0x64cd9403
-0, 500, 500, 500, 1000, 0xa4ef8a9d
-0, 1000, 1000, 500, 1000, 0x75c19868
-0, 1500, 1500, 500, 1000, 0x93db6f79
-0, 2000, 2000, 500, 1000, 0x6835625d
-0, 2500, 2500, 500, 1000, 0xb3affa8f
-0, 3000, 3000, 500, 1000, 0x159fdcc8
-0, 3500, 3500, 500, 1000, 0x79f9f7f1
-0, 4000, 4000, 500, 1000, 0xd7d1131e
-0, 4500, 4500, 500, 1000, 0x52a6f797
-0, 5000, 5000, 500, 1000, 0x748202ca
-0, 5500, 5500, 500, 1000, 0x0ef92449
-0, 6000, 6000, 500, 1000, 0x6a3760ab
-0, 6500, 6500, 500, 1000, 0xce5c5abf
-0, 7000, 7000, 500, 1000, 0x23396792
-0, 7500, 7500, 500, 1000, 0xa5276238
-0, 8000, 8000, 500, 1000, 0x288adf1b
-0, 8500, 8500, 500, 1000, 0xe7de6fb2
-0, 9000, 9000, 500, 1000, 0x2c2c707f
-0, 9500, 9500, 500, 1000, 0xd66d6daf
-0, 10000, 10000, 500, 1000, 0xbcea7d64
-0, 10500, 10500, 500, 1000, 0x766feea5
-0, 11000, 11000, 500, 1000, 0xd2e1d63a
-0, 11500, 11500, 500, 1000, 0x2f7ef4ed
-0, 12000, 12000, 500, 1000, 0xb655cba4
-0, 12500, 12500, 500, 1000, 0x4507d37b
-0, 13000, 13000, 500, 1000, 0x0c57f794
-0, 13500, 13500, 500, 1000, 0x0ecbe5cc
-0, 14000, 14000, 500, 1000, 0x9bf6e345
-0, 14500, 14500, 500, 1000, 0xc461443c
-0, 15000, 15000, 500, 1000, 0xad9657bf
-0, 15500, 15500, 500, 1000, 0x466fe91c
-0, 16000, 16000, 500, 1000, 0x9ee377fe
-0, 16500, 16500, 500, 1000, 0x09956428
-0, 17000, 17000, 500, 1000, 0x9b285f0a
-0, 17500, 17500, 500, 1000, 0x0a3e61a6
-0, 18000, 18000, 500, 1000, 0xacc25d6b
-0, 18500, 18500, 500, 1000, 0x377be319
-0, 19000, 19000, 500, 1000, 0xe4890504
-0, 19500, 19500, 500, 1000, 0xe90a6497
-0, 20000, 20000, 500, 1000, 0xd00fe950
-0, 20500, 20500, 500, 1000, 0xf195eb44
-0, 21000, 21000, 500, 1000, 0xa491f3ef
-0, 21500, 21500, 500, 1000, 0x2c036e18
-0, 22000, 22000, 50, 100, 0x0bd81f05
+0, 0, 0, 1500, 3000, 0xafc2b717
+0, 1500, 1500, 1500, 3000, 0x15fecc74
+0, 3000, 3000, 1500, 3000, 0x653ae7e6
+0, 4500, 4500, 1500, 3000, 0x78e71eb9
+0, 6000, 6000, 1500, 3000, 0x4eed230b
+0, 7500, 7500, 1500, 3000, 0xec9fb114
+0, 9000, 9000, 1500, 3000, 0x5ffe5ba1
+0, 10500, 10500, 1500, 3000, 0x52cfb9ea
+0, 12000, 12000, 1500, 3000, 0x9f1996d1
+0, 13500, 13500, 1500, 3000, 0x1bbd0d6b
+0, 15000, 15000, 1500, 3000, 0x0a1ab8e8
+0, 16500, 16500, 1500, 3000, 0xaa2924e7
+0, 18000, 18000, 1500, 3000, 0x153b4597
+0, 19500, 19500, 1500, 3000, 0x4a7a3949
+0, 21000, 21000, 1050, 2100, 0x44bc811b
--
2.39.1
[-- Attachment #5: 0002-avcodec-utils-fix-duration-for-ADPCM_MS.patch --]
[-- Type: text/x-patch, Size: 990 bytes --]
From ff913fa6f91dbe17972f39017cb766d517ecf044 Mon Sep 17 00:00:00 2001
From: Paul B Mahol <onemda@gmail.com>
Date: Tue, 15 Aug 2023 15:51:10 +0200
Subject: [PATCH 2/4] avcodec/utils: fix duration for ADPCM_MS
Signed-off-by: Paul B Mahol <onemda@gmail.com>
---
libavcodec/utils.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index bd4131db62..61e2946c16 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -740,7 +740,7 @@ static int get_audio_frame_duration(enum AVCodecID id, int sr, int ch, int ba,
tmp = blocks * ((ba - 4LL * ch) * 2 / ch);
break;
case AV_CODEC_ID_ADPCM_MS:
- tmp = blocks * (2 + (ba - 7LL * ch) * 2LL / ch);
+ tmp = blocks * ((ba - 6LL * ch) * 2LL / ch);
break;
case AV_CODEC_ID_ADPCM_MTAF:
tmp = blocks * (ba - 16LL) * 2 / ch;
--
2.39.1
[-- Attachment #6: Type: text/plain, Size: 251 bytes --]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [FFmpeg-devel] [PATCH] adpcm fixes and improvements
2023-08-15 14:49 [FFmpeg-devel] [PATCH] adpcm fixes and improvements Paul B Mahol
@ 2023-08-16 16:38 ` Michael Niedermayer
2023-08-16 16:53 ` Paul B Mahol
0 siblings, 1 reply; 13+ messages in thread
From: Michael Niedermayer @ 2023-08-16 16:38 UTC (permalink / raw)
To: FFmpeg development discussions and patches
[-- Attachment #1.1: Type: text/plain, Size: 2381 bytes --]
On Tue, Aug 15, 2023 at 04:49:05PM +0200, Paul B Mahol wrote:
> Attached
[...]
> adpcm.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
> 3305dbe07ca935958fa213f5cadc339ad3cc3592 0003-avcodec-adpcm-use-already-existing-pointer-for-4xm-d.patch
> From c6ad6dc7b8725d897e36399e5c7b8174caeb92e6 Mon Sep 17 00:00:00 2001
> From: Paul B Mahol <onemda@gmail.com>
> Date: Tue, 15 Aug 2023 14:18:47 +0200
> Subject: [PATCH 3/4] avcodec/adpcm: use already existing pointer for 4xm
> decoder
>
> Signed-off-by: Paul B Mahol <onemda@gmail.com>
> ---
> libavcodec/adpcm.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
> index b0c3b91a3b..9993c9e531 100644
> --- a/libavcodec/adpcm.c
> +++ b/libavcodec/adpcm.c
> @@ -1211,7 +1211,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame,
>
> for (int i = 0; i < channels; i++) {
> ADPCMChannelStatus *cs = &c->status[i];
> - samples = (int16_t *)frame->data[i];
> + samples = samples_p[i];
> for (int n = nb_samples >> 1; n > 0; n--) {
> int v = bytestream2_get_byteu(&gb);
> *samples++ = adpcm_ima_expand_nibble(cs, v & 0x0F, 4);
should be ok if tested
> --
> 2.39.1
>
> libavcodec/adpcm.c | 388 +++++++++++++++++----------------
> tests/ref/fate/adpcm-creative-8-2.6bit | 2
> tests/ref/fate/adpcm-creative-8-2bit | 2
> tests/ref/fate/adpcm-creative-8-4bit | 2
> tests/ref/fate/adpcm-ms-mono | 60 +----
> 5 files changed, 227 insertions(+), 227 deletions(-)
> 1760df1de66b4227e71ffe942dedcf7d8a33ad48 0004-avcodec-adpcm-consume-all-input-when-decoding.patch
> From 19789bca53548d672bff30b88a8838edaa876bdb Mon Sep 17 00:00:00 2001
> From: Paul B Mahol <onemda@gmail.com>
> Date: Tue, 15 Aug 2023 15:25:22 +0200
> Subject: [PATCH 4/4] avcodec/adpcm: consume all input when decoding
>
> Stops multiple decoding calls for single packet.
> Also makes decoding faster.
This increases latency, which can be problem if packets are
sufficiently large
thx
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
In a rich man's house there is no place to spit but his face.
-- Diogenes of Sinope
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
[-- Attachment #2: Type: text/plain, Size: 251 bytes --]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [FFmpeg-devel] [PATCH] adpcm fixes and improvements
2023-08-16 16:38 ` Michael Niedermayer
@ 2023-08-16 16:53 ` Paul B Mahol
2023-08-23 16:29 ` Paul B Mahol
2023-08-23 19:02 ` Michael Niedermayer
0 siblings, 2 replies; 13+ messages in thread
From: Paul B Mahol @ 2023-08-16 16:53 UTC (permalink / raw)
To: FFmpeg development discussions and patches
On Wed, Aug 16, 2023 at 6:38 PM Michael Niedermayer <michael@niedermayer.cc>
wrote:
> On Tue, Aug 15, 2023 at 04:49:05PM +0200, Paul B Mahol wrote:
> > Attached
>
> [...]
> > adpcm.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> > 3305dbe07ca935958fa213f5cadc339ad3cc3592
> 0003-avcodec-adpcm-use-already-existing-pointer-for-4xm-d.patch
> > From c6ad6dc7b8725d897e36399e5c7b8174caeb92e6 Mon Sep 17 00:00:00 2001
> > From: Paul B Mahol <onemda@gmail.com>
> > Date: Tue, 15 Aug 2023 14:18:47 +0200
> > Subject: [PATCH 3/4] avcodec/adpcm: use already existing pointer for 4xm
> > decoder
> >
> > Signed-off-by: Paul B Mahol <onemda@gmail.com>
> > ---
> > libavcodec/adpcm.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
> > index b0c3b91a3b..9993c9e531 100644
> > --- a/libavcodec/adpcm.c
> > +++ b/libavcodec/adpcm.c
> > @@ -1211,7 +1211,7 @@ static int adpcm_decode_frame(AVCodecContext
> *avctx, AVFrame *frame,
> >
> > for (int i = 0; i < channels; i++) {
> > ADPCMChannelStatus *cs = &c->status[i];
> > - samples = (int16_t *)frame->data[i];
> > + samples = samples_p[i];
> > for (int n = nb_samples >> 1; n > 0; n--) {
> > int v = bytestream2_get_byteu(&gb);
> > *samples++ = adpcm_ima_expand_nibble(cs, v & 0x0F, 4);
>
> should be ok if tested
>
>
> > --
> > 2.39.1
> >
>
> > libavcodec/adpcm.c | 388
> +++++++++++++++++----------------
> > tests/ref/fate/adpcm-creative-8-2.6bit | 2
> > tests/ref/fate/adpcm-creative-8-2bit | 2
> > tests/ref/fate/adpcm-creative-8-4bit | 2
> > tests/ref/fate/adpcm-ms-mono | 60 +----
> > 5 files changed, 227 insertions(+), 227 deletions(-)
> > 1760df1de66b4227e71ffe942dedcf7d8a33ad48
> 0004-avcodec-adpcm-consume-all-input-when-decoding.patch
> > From 19789bca53548d672bff30b88a8838edaa876bdb Mon Sep 17 00:00:00 2001
> > From: Paul B Mahol <onemda@gmail.com>
> > Date: Tue, 15 Aug 2023 15:25:22 +0200
> > Subject: [PATCH 4/4] avcodec/adpcm: consume all input when decoding
> >
> > Stops multiple decoding calls for single packet.
> > Also makes decoding faster.
>
> This increases latency, which can be problem if packets are
> sufficiently large
>
Then reduce size at demuxer level. there is option for it.
>
> thx
>
>
> [...]
>
> --
> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> In a rich man's house there is no place to spit but his face.
> -- Diogenes of Sinope
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [FFmpeg-devel] [PATCH] adpcm fixes and improvements
2023-08-16 16:53 ` Paul B Mahol
@ 2023-08-23 16:29 ` Paul B Mahol
2023-08-23 19:02 ` Michael Niedermayer
1 sibling, 0 replies; 13+ messages in thread
From: Paul B Mahol @ 2023-08-23 16:29 UTC (permalink / raw)
To: FFmpeg development discussions and patches
Will apply ASAP!
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [FFmpeg-devel] [PATCH] adpcm fixes and improvements
2023-08-16 16:53 ` Paul B Mahol
2023-08-23 16:29 ` Paul B Mahol
@ 2023-08-23 19:02 ` Michael Niedermayer
2023-08-23 19:04 ` Paul B Mahol
1 sibling, 1 reply; 13+ messages in thread
From: Michael Niedermayer @ 2023-08-23 19:02 UTC (permalink / raw)
To: FFmpeg development discussions and patches
[-- Attachment #1.1: Type: text/plain, Size: 2955 bytes --]
On Wed, Aug 16, 2023 at 06:53:42PM +0200, Paul B Mahol wrote:
> On Wed, Aug 16, 2023 at 6:38 PM Michael Niedermayer <michael@niedermayer.cc>
> wrote:
>
> > On Tue, Aug 15, 2023 at 04:49:05PM +0200, Paul B Mahol wrote:
> > > Attached
> >
> > [...]
> > > adpcm.c | 2 +-
> > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > > 3305dbe07ca935958fa213f5cadc339ad3cc3592
> > 0003-avcodec-adpcm-use-already-existing-pointer-for-4xm-d.patch
> > > From c6ad6dc7b8725d897e36399e5c7b8174caeb92e6 Mon Sep 17 00:00:00 2001
> > > From: Paul B Mahol <onemda@gmail.com>
> > > Date: Tue, 15 Aug 2023 14:18:47 +0200
> > > Subject: [PATCH 3/4] avcodec/adpcm: use already existing pointer for 4xm
> > > decoder
> > >
> > > Signed-off-by: Paul B Mahol <onemda@gmail.com>
> > > ---
> > > libavcodec/adpcm.c | 2 +-
> > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > >
> > > diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
> > > index b0c3b91a3b..9993c9e531 100644
> > > --- a/libavcodec/adpcm.c
> > > +++ b/libavcodec/adpcm.c
> > > @@ -1211,7 +1211,7 @@ static int adpcm_decode_frame(AVCodecContext
> > *avctx, AVFrame *frame,
> > >
> > > for (int i = 0; i < channels; i++) {
> > > ADPCMChannelStatus *cs = &c->status[i];
> > > - samples = (int16_t *)frame->data[i];
> > > + samples = samples_p[i];
> > > for (int n = nb_samples >> 1; n > 0; n--) {
> > > int v = bytestream2_get_byteu(&gb);
> > > *samples++ = adpcm_ima_expand_nibble(cs, v & 0x0F, 4);
> >
> > should be ok if tested
> >
> >
> > > --
> > > 2.39.1
> > >
> >
> > > libavcodec/adpcm.c | 388
> > +++++++++++++++++----------------
> > > tests/ref/fate/adpcm-creative-8-2.6bit | 2
> > > tests/ref/fate/adpcm-creative-8-2bit | 2
> > > tests/ref/fate/adpcm-creative-8-4bit | 2
> > > tests/ref/fate/adpcm-ms-mono | 60 +----
> > > 5 files changed, 227 insertions(+), 227 deletions(-)
> > > 1760df1de66b4227e71ffe942dedcf7d8a33ad48
> > 0004-avcodec-adpcm-consume-all-input-when-decoding.patch
> > > From 19789bca53548d672bff30b88a8838edaa876bdb Mon Sep 17 00:00:00 2001
> > > From: Paul B Mahol <onemda@gmail.com>
> > > Date: Tue, 15 Aug 2023 15:25:22 +0200
> > > Subject: [PATCH 4/4] avcodec/adpcm: consume all input when decoding
> > >
> > > Stops multiple decoding calls for single packet.
> > > Also makes decoding faster.
> >
> > This increases latency, which can be problem if packets are
> > sufficiently large
> >
>
> Then reduce size at demuxer level. there is option for it.
if that is so, then please explain exactly which option should be used
in the commit message
thx
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
If you think the mosad wants you dead since a long time then you are either
wrong or dead since a long time.
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
[-- Attachment #2: Type: text/plain, Size: 251 bytes --]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [FFmpeg-devel] [PATCH] adpcm fixes and improvements
2023-08-23 19:02 ` Michael Niedermayer
@ 2023-08-23 19:04 ` Paul B Mahol
2023-08-23 22:36 ` Michael Niedermayer
0 siblings, 1 reply; 13+ messages in thread
From: Paul B Mahol @ 2023-08-23 19:04 UTC (permalink / raw)
To: FFmpeg development discussions and patches
On Wed, Aug 23, 2023 at 9:02 PM Michael Niedermayer <michael@niedermayer.cc>
wrote:
> On Wed, Aug 16, 2023 at 06:53:42PM +0200, Paul B Mahol wrote:
> > On Wed, Aug 16, 2023 at 6:38 PM Michael Niedermayer <
> michael@niedermayer.cc>
> > wrote:
> >
> > > On Tue, Aug 15, 2023 at 04:49:05PM +0200, Paul B Mahol wrote:
> > > > Attached
> > >
> > > [...]
> > > > adpcm.c | 2 +-
> > > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > > > 3305dbe07ca935958fa213f5cadc339ad3cc3592
> > > 0003-avcodec-adpcm-use-already-existing-pointer-for-4xm-d.patch
> > > > From c6ad6dc7b8725d897e36399e5c7b8174caeb92e6 Mon Sep 17 00:00:00
> 2001
> > > > From: Paul B Mahol <onemda@gmail.com>
> > > > Date: Tue, 15 Aug 2023 14:18:47 +0200
> > > > Subject: [PATCH 3/4] avcodec/adpcm: use already existing pointer for
> 4xm
> > > > decoder
> > > >
> > > > Signed-off-by: Paul B Mahol <onemda@gmail.com>
> > > > ---
> > > > libavcodec/adpcm.c | 2 +-
> > > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > > >
> > > > diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
> > > > index b0c3b91a3b..9993c9e531 100644
> > > > --- a/libavcodec/adpcm.c
> > > > +++ b/libavcodec/adpcm.c
> > > > @@ -1211,7 +1211,7 @@ static int adpcm_decode_frame(AVCodecContext
> > > *avctx, AVFrame *frame,
> > > >
> > > > for (int i = 0; i < channels; i++) {
> > > > ADPCMChannelStatus *cs = &c->status[i];
> > > > - samples = (int16_t *)frame->data[i];
> > > > + samples = samples_p[i];
> > > > for (int n = nb_samples >> 1; n > 0; n--) {
> > > > int v = bytestream2_get_byteu(&gb);
> > > > *samples++ = adpcm_ima_expand_nibble(cs, v & 0x0F,
> 4);
> > >
> > > should be ok if tested
> > >
> > >
> > > > --
> > > > 2.39.1
> > > >
> > >
> > > > libavcodec/adpcm.c | 388
> > > +++++++++++++++++----------------
> > > > tests/ref/fate/adpcm-creative-8-2.6bit | 2
> > > > tests/ref/fate/adpcm-creative-8-2bit | 2
> > > > tests/ref/fate/adpcm-creative-8-4bit | 2
> > > > tests/ref/fate/adpcm-ms-mono | 60 +----
> > > > 5 files changed, 227 insertions(+), 227 deletions(-)
> > > > 1760df1de66b4227e71ffe942dedcf7d8a33ad48
> > > 0004-avcodec-adpcm-consume-all-input-when-decoding.patch
> > > > From 19789bca53548d672bff30b88a8838edaa876bdb Mon Sep 17 00:00:00
> 2001
> > > > From: Paul B Mahol <onemda@gmail.com>
> > > > Date: Tue, 15 Aug 2023 15:25:22 +0200
> > > > Subject: [PATCH 4/4] avcodec/adpcm: consume all input when decoding
> > > >
> > > > Stops multiple decoding calls for single packet.
> > > > Also makes decoding faster.
> > >
> > > This increases latency, which can be problem if packets are
> > > sufficiently large
> > >
> >
> > Then reduce size at demuxer level. there is option for it.
>
> if that is so, then please explain exactly which option should be used
> in the commit message
>
>
ffmpeg -h demuxer=wav
> thx
>
> [...]
> --
> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> If you think the mosad wants you dead since a long time then you are either
> wrong or dead since a long time.
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [FFmpeg-devel] [PATCH] adpcm fixes and improvements
2023-08-23 19:04 ` Paul B Mahol
@ 2023-08-23 22:36 ` Michael Niedermayer
2023-08-23 22:51 ` Paul B Mahol
0 siblings, 1 reply; 13+ messages in thread
From: Michael Niedermayer @ 2023-08-23 22:36 UTC (permalink / raw)
To: FFmpeg development discussions and patches
[-- Attachment #1.1: Type: text/plain, Size: 3547 bytes --]
On Wed, Aug 23, 2023 at 09:04:35PM +0200, Paul B Mahol wrote:
> On Wed, Aug 23, 2023 at 9:02 PM Michael Niedermayer <michael@niedermayer.cc>
> wrote:
>
> > On Wed, Aug 16, 2023 at 06:53:42PM +0200, Paul B Mahol wrote:
> > > On Wed, Aug 16, 2023 at 6:38 PM Michael Niedermayer <
> > michael@niedermayer.cc>
> > > wrote:
> > >
> > > > On Tue, Aug 15, 2023 at 04:49:05PM +0200, Paul B Mahol wrote:
> > > > > Attached
> > > >
> > > > [...]
> > > > > adpcm.c | 2 +-
> > > > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > > > > 3305dbe07ca935958fa213f5cadc339ad3cc3592
> > > > 0003-avcodec-adpcm-use-already-existing-pointer-for-4xm-d.patch
> > > > > From c6ad6dc7b8725d897e36399e5c7b8174caeb92e6 Mon Sep 17 00:00:00
> > 2001
> > > > > From: Paul B Mahol <onemda@gmail.com>
> > > > > Date: Tue, 15 Aug 2023 14:18:47 +0200
> > > > > Subject: [PATCH 3/4] avcodec/adpcm: use already existing pointer for
> > 4xm
> > > > > decoder
> > > > >
> > > > > Signed-off-by: Paul B Mahol <onemda@gmail.com>
> > > > > ---
> > > > > libavcodec/adpcm.c | 2 +-
> > > > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > > > >
> > > > > diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
> > > > > index b0c3b91a3b..9993c9e531 100644
> > > > > --- a/libavcodec/adpcm.c
> > > > > +++ b/libavcodec/adpcm.c
> > > > > @@ -1211,7 +1211,7 @@ static int adpcm_decode_frame(AVCodecContext
> > > > *avctx, AVFrame *frame,
> > > > >
> > > > > for (int i = 0; i < channels; i++) {
> > > > > ADPCMChannelStatus *cs = &c->status[i];
> > > > > - samples = (int16_t *)frame->data[i];
> > > > > + samples = samples_p[i];
> > > > > for (int n = nb_samples >> 1; n > 0; n--) {
> > > > > int v = bytestream2_get_byteu(&gb);
> > > > > *samples++ = adpcm_ima_expand_nibble(cs, v & 0x0F,
> > 4);
> > > >
> > > > should be ok if tested
> > > >
> > > >
> > > > > --
> > > > > 2.39.1
> > > > >
> > > >
> > > > > libavcodec/adpcm.c | 388
> > > > +++++++++++++++++----------------
> > > > > tests/ref/fate/adpcm-creative-8-2.6bit | 2
> > > > > tests/ref/fate/adpcm-creative-8-2bit | 2
> > > > > tests/ref/fate/adpcm-creative-8-4bit | 2
> > > > > tests/ref/fate/adpcm-ms-mono | 60 +----
> > > > > 5 files changed, 227 insertions(+), 227 deletions(-)
> > > > > 1760df1de66b4227e71ffe942dedcf7d8a33ad48
> > > > 0004-avcodec-adpcm-consume-all-input-when-decoding.patch
> > > > > From 19789bca53548d672bff30b88a8838edaa876bdb Mon Sep 17 00:00:00
> > 2001
> > > > > From: Paul B Mahol <onemda@gmail.com>
> > > > > Date: Tue, 15 Aug 2023 15:25:22 +0200
> > > > > Subject: [PATCH 4/4] avcodec/adpcm: consume all input when decoding
> > > > >
> > > > > Stops multiple decoding calls for single packet.
> > > > > Also makes decoding faster.
> > > >
> > > > This increases latency, which can be problem if packets are
> > > > sufficiently large
> > > >
> > >
> > > Then reduce size at demuxer level. there is option for it.
> >
> > if that is so, then please explain exactly which option should be used
> > in the commit message
> >
> >
> ffmpeg -h demuxer=wav
what about the demuxers that are not named "wav" ?
git grep -l ADPCM libavformat/*c | wc -l
88
thx
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
It is a danger to trust the dream we wish for rather than
the science we have, -- Dr. Kenneth Brown
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
[-- Attachment #2: Type: text/plain, Size: 251 bytes --]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [FFmpeg-devel] [PATCH] adpcm fixes and improvements
2023-08-23 22:36 ` Michael Niedermayer
@ 2023-08-23 22:51 ` Paul B Mahol
2023-08-24 15:44 ` Michael Niedermayer
0 siblings, 1 reply; 13+ messages in thread
From: Paul B Mahol @ 2023-08-23 22:51 UTC (permalink / raw)
To: FFmpeg development discussions and patches
On Thu, Aug 24, 2023 at 12:36 AM Michael Niedermayer <michael@niedermayer.cc>
wrote:
> On Wed, Aug 23, 2023 at 09:04:35PM +0200, Paul B Mahol wrote:
> > On Wed, Aug 23, 2023 at 9:02 PM Michael Niedermayer <
> michael@niedermayer.cc>
> > wrote:
> >
> > > On Wed, Aug 16, 2023 at 06:53:42PM +0200, Paul B Mahol wrote:
> > > > On Wed, Aug 16, 2023 at 6:38 PM Michael Niedermayer <
> > > michael@niedermayer.cc>
> > > > wrote:
> > > >
> > > > > On Tue, Aug 15, 2023 at 04:49:05PM +0200, Paul B Mahol wrote:
> > > > > > Attached
> > > > >
> > > > > [...]
> > > > > > adpcm.c | 2 +-
> > > > > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > > > > > 3305dbe07ca935958fa213f5cadc339ad3cc3592
> > > > > 0003-avcodec-adpcm-use-already-existing-pointer-for-4xm-d.patch
> > > > > > From c6ad6dc7b8725d897e36399e5c7b8174caeb92e6 Mon Sep 17 00:00:00
> > > 2001
> > > > > > From: Paul B Mahol <onemda@gmail.com>
> > > > > > Date: Tue, 15 Aug 2023 14:18:47 +0200
> > > > > > Subject: [PATCH 3/4] avcodec/adpcm: use already existing pointer
> for
> > > 4xm
> > > > > > decoder
> > > > > >
> > > > > > Signed-off-by: Paul B Mahol <onemda@gmail.com>
> > > > > > ---
> > > > > > libavcodec/adpcm.c | 2 +-
> > > > > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > > > > >
> > > > > > diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
> > > > > > index b0c3b91a3b..9993c9e531 100644
> > > > > > --- a/libavcodec/adpcm.c
> > > > > > +++ b/libavcodec/adpcm.c
> > > > > > @@ -1211,7 +1211,7 @@ static int
> adpcm_decode_frame(AVCodecContext
> > > > > *avctx, AVFrame *frame,
> > > > > >
> > > > > > for (int i = 0; i < channels; i++) {
> > > > > > ADPCMChannelStatus *cs = &c->status[i];
> > > > > > - samples = (int16_t *)frame->data[i];
> > > > > > + samples = samples_p[i];
> > > > > > for (int n = nb_samples >> 1; n > 0; n--) {
> > > > > > int v = bytestream2_get_byteu(&gb);
> > > > > > *samples++ = adpcm_ima_expand_nibble(cs, v &
> 0x0F,
> > > 4);
> > > > >
> > > > > should be ok if tested
> > > > >
> > > > >
> > > > > > --
> > > > > > 2.39.1
> > > > > >
> > > > >
> > > > > > libavcodec/adpcm.c | 388
> > > > > +++++++++++++++++----------------
> > > > > > tests/ref/fate/adpcm-creative-8-2.6bit | 2
> > > > > > tests/ref/fate/adpcm-creative-8-2bit | 2
> > > > > > tests/ref/fate/adpcm-creative-8-4bit | 2
> > > > > > tests/ref/fate/adpcm-ms-mono | 60 +----
> > > > > > 5 files changed, 227 insertions(+), 227 deletions(-)
> > > > > > 1760df1de66b4227e71ffe942dedcf7d8a33ad48
> > > > > 0004-avcodec-adpcm-consume-all-input-when-decoding.patch
> > > > > > From 19789bca53548d672bff30b88a8838edaa876bdb Mon Sep 17 00:00:00
> > > 2001
> > > > > > From: Paul B Mahol <onemda@gmail.com>
> > > > > > Date: Tue, 15 Aug 2023 15:25:22 +0200
> > > > > > Subject: [PATCH 4/4] avcodec/adpcm: consume all input when
> decoding
> > > > > >
> > > > > > Stops multiple decoding calls for single packet.
> > > > > > Also makes decoding faster.
> > > > >
> > > > > This increases latency, which can be problem if packets are
> > > > > sufficiently large
> > > > >
> > > >
> > > > Then reduce size at demuxer level. there is option for it.
> > >
> > > if that is so, then please explain exactly which option should be used
> > > in the commit message
> > >
> > >
> > ffmpeg -h demuxer=wav
>
> what about the demuxers that are not named "wav" ?
>
>
I think you are blocking this just for sake of blocking because you have
nothing more constructive to do.
The delay is always present, unless packet size is exact as block align.
And for ADPCM this is irrelevant.
The ADPCM decoders could be transformed to receive frame API if you really
care.
git grep -l ADPCM libavformat/*c | wc -l
> 88
>
> thx
>
> [...]
> --
> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> It is a danger to trust the dream we wish for rather than
> the science we have, -- Dr. Kenneth Brown
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [FFmpeg-devel] [PATCH] adpcm fixes and improvements
2023-08-23 22:51 ` Paul B Mahol
@ 2023-08-24 15:44 ` Michael Niedermayer
2023-08-24 16:26 ` Andreas Rheinhardt
0 siblings, 1 reply; 13+ messages in thread
From: Michael Niedermayer @ 2023-08-24 15:44 UTC (permalink / raw)
To: FFmpeg development discussions and patches
[-- Attachment #1.1: Type: text/plain, Size: 5972 bytes --]
On Thu, Aug 24, 2023 at 12:51:28AM +0200, Paul B Mahol wrote:
> On Thu, Aug 24, 2023 at 12:36 AM Michael Niedermayer <michael@niedermayer.cc>
> wrote:
>
> > On Wed, Aug 23, 2023 at 09:04:35PM +0200, Paul B Mahol wrote:
> > > On Wed, Aug 23, 2023 at 9:02 PM Michael Niedermayer <
> > michael@niedermayer.cc>
> > > wrote:
> > >
> > > > On Wed, Aug 16, 2023 at 06:53:42PM +0200, Paul B Mahol wrote:
> > > > > On Wed, Aug 16, 2023 at 6:38 PM Michael Niedermayer <
> > > > michael@niedermayer.cc>
> > > > > wrote:
> > > > >
> > > > > > On Tue, Aug 15, 2023 at 04:49:05PM +0200, Paul B Mahol wrote:
> > > > > > > Attached
> > > > > >
> > > > > > [...]
> > > > > > > adpcm.c | 2 +-
> > > > > > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > > > > > > 3305dbe07ca935958fa213f5cadc339ad3cc3592
> > > > > > 0003-avcodec-adpcm-use-already-existing-pointer-for-4xm-d.patch
> > > > > > > From c6ad6dc7b8725d897e36399e5c7b8174caeb92e6 Mon Sep 17 00:00:00
> > > > 2001
> > > > > > > From: Paul B Mahol <onemda@gmail.com>
> > > > > > > Date: Tue, 15 Aug 2023 14:18:47 +0200
> > > > > > > Subject: [PATCH 3/4] avcodec/adpcm: use already existing pointer
> > for
> > > > 4xm
> > > > > > > decoder
> > > > > > >
> > > > > > > Signed-off-by: Paul B Mahol <onemda@gmail.com>
> > > > > > > ---
> > > > > > > libavcodec/adpcm.c | 2 +-
> > > > > > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > > > > > >
> > > > > > > diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
> > > > > > > index b0c3b91a3b..9993c9e531 100644
> > > > > > > --- a/libavcodec/adpcm.c
> > > > > > > +++ b/libavcodec/adpcm.c
> > > > > > > @@ -1211,7 +1211,7 @@ static int
> > adpcm_decode_frame(AVCodecContext
> > > > > > *avctx, AVFrame *frame,
> > > > > > >
> > > > > > > for (int i = 0; i < channels; i++) {
> > > > > > > ADPCMChannelStatus *cs = &c->status[i];
> > > > > > > - samples = (int16_t *)frame->data[i];
> > > > > > > + samples = samples_p[i];
> > > > > > > for (int n = nb_samples >> 1; n > 0; n--) {
> > > > > > > int v = bytestream2_get_byteu(&gb);
> > > > > > > *samples++ = adpcm_ima_expand_nibble(cs, v &
> > 0x0F,
> > > > 4);
> > > > > >
> > > > > > should be ok if tested
> > > > > >
> > > > > >
> > > > > > > --
> > > > > > > 2.39.1
> > > > > > >
> > > > > >
> > > > > > > libavcodec/adpcm.c | 388
> > > > > > +++++++++++++++++----------------
> > > > > > > tests/ref/fate/adpcm-creative-8-2.6bit | 2
> > > > > > > tests/ref/fate/adpcm-creative-8-2bit | 2
> > > > > > > tests/ref/fate/adpcm-creative-8-4bit | 2
> > > > > > > tests/ref/fate/adpcm-ms-mono | 60 +----
> > > > > > > 5 files changed, 227 insertions(+), 227 deletions(-)
> > > > > > > 1760df1de66b4227e71ffe942dedcf7d8a33ad48
> > > > > > 0004-avcodec-adpcm-consume-all-input-when-decoding.patch
> > > > > > > From 19789bca53548d672bff30b88a8838edaa876bdb Mon Sep 17 00:00:00
> > > > 2001
> > > > > > > From: Paul B Mahol <onemda@gmail.com>
> > > > > > > Date: Tue, 15 Aug 2023 15:25:22 +0200
> > > > > > > Subject: [PATCH 4/4] avcodec/adpcm: consume all input when
> > decoding
> > > > > > >
> > > > > > > Stops multiple decoding calls for single packet.
> > > > > > > Also makes decoding faster.
> > > > > >
> > > > > > This increases latency, which can be problem if packets are
> > > > > > sufficiently large
> > > > > >
> > > > >
> > > > > Then reduce size at demuxer level. there is option for it.
> > > >
> > > > if that is so, then please explain exactly which option should be used
> > > > in the commit message
> > > >
> > > >
> > > ffmpeg -h demuxer=wav
> >
> > what about the demuxers that are not named "wav" ?
> >
> >
> I think you are blocking this just for sake of blocking because you have
> nothing more constructive to do.
> The delay is always present, unless packet size is exact as block align.
> And for ADPCM this is irrelevant.
IIUC, before this patch if a 1gb sized ADPCM packet comes from a demuxer
that is decoded in small kb sized pieces and returned at that granularity
to the user.
after this patch (please correct me if iam wrong)
you get a failure as the decoded data is not even addressable with int
but lets assume int is 64bits, you get a 4gb or something like that
audio frame. It maybe faster to decode that in one go but by how much is that
faster from lets say decode it in 10-100kb sized chunks ?
IMHO theres a point where it is too big, and simply returning the data
to the user with some granularity lower than "unlimited" makes sense.
Iam not asking for a new feature, rather your patch removes this
thx
>
> The ADPCM decoders could be transformed to receive frame API if you really
> care.
>
>
> git grep -l ADPCM libavformat/*c | wc -l
> > 88
> >
> > thx
> >
> > [...]
> > --
> > Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
> >
> > It is a danger to trust the dream we wish for rather than
> > the science we have, -- Dr. Kenneth Brown
> > _______________________________________________
> > ffmpeg-devel mailing list
> > ffmpeg-devel@ffmpeg.org
> > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >
> > To unsubscribe, visit link above, or email
> > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
> >
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Homeopathy is like voting while filling the ballot out with transparent ink.
Sometimes the outcome one wanted occurs. Rarely its worse than filling out
a ballot properly.
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
[-- Attachment #2: Type: text/plain, Size: 251 bytes --]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [FFmpeg-devel] [PATCH] adpcm fixes and improvements
2023-08-24 15:44 ` Michael Niedermayer
@ 2023-08-24 16:26 ` Andreas Rheinhardt
2023-08-24 17:39 ` Michael Niedermayer
0 siblings, 1 reply; 13+ messages in thread
From: Andreas Rheinhardt @ 2023-08-24 16:26 UTC (permalink / raw)
To: ffmpeg-devel
Michael Niedermayer:
> On Thu, Aug 24, 2023 at 12:51:28AM +0200, Paul B Mahol wrote:
>> On Thu, Aug 24, 2023 at 12:36 AM Michael Niedermayer <michael@niedermayer.cc>
>> wrote:
>>
>>> On Wed, Aug 23, 2023 at 09:04:35PM +0200, Paul B Mahol wrote:
>>>> On Wed, Aug 23, 2023 at 9:02 PM Michael Niedermayer <
>>> michael@niedermayer.cc>
>>>> wrote:
>>>>
>>>>> On Wed, Aug 16, 2023 at 06:53:42PM +0200, Paul B Mahol wrote:
>>>>>> On Wed, Aug 16, 2023 at 6:38 PM Michael Niedermayer <
>>>>> michael@niedermayer.cc>
>>>>>> wrote:
>>>>>>
>>>>>>> On Tue, Aug 15, 2023 at 04:49:05PM +0200, Paul B Mahol wrote:
>>>>>>>> Attached
>>>>>>>
>>>>>>> [...]
>>>>>>>> adpcm.c | 2 +-
>>>>>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>>> 3305dbe07ca935958fa213f5cadc339ad3cc3592
>>>>>>> 0003-avcodec-adpcm-use-already-existing-pointer-for-4xm-d.patch
>>>>>>>> From c6ad6dc7b8725d897e36399e5c7b8174caeb92e6 Mon Sep 17 00:00:00
>>>>> 2001
>>>>>>>> From: Paul B Mahol <onemda@gmail.com>
>>>>>>>> Date: Tue, 15 Aug 2023 14:18:47 +0200
>>>>>>>> Subject: [PATCH 3/4] avcodec/adpcm: use already existing pointer
>>> for
>>>>> 4xm
>>>>>>>> decoder
>>>>>>>>
>>>>>>>> Signed-off-by: Paul B Mahol <onemda@gmail.com>
>>>>>>>> ---
>>>>>>>> libavcodec/adpcm.c | 2 +-
>>>>>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>>>
>>>>>>>> diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
>>>>>>>> index b0c3b91a3b..9993c9e531 100644
>>>>>>>> --- a/libavcodec/adpcm.c
>>>>>>>> +++ b/libavcodec/adpcm.c
>>>>>>>> @@ -1211,7 +1211,7 @@ static int
>>> adpcm_decode_frame(AVCodecContext
>>>>>>> *avctx, AVFrame *frame,
>>>>>>>>
>>>>>>>> for (int i = 0; i < channels; i++) {
>>>>>>>> ADPCMChannelStatus *cs = &c->status[i];
>>>>>>>> - samples = (int16_t *)frame->data[i];
>>>>>>>> + samples = samples_p[i];
>>>>>>>> for (int n = nb_samples >> 1; n > 0; n--) {
>>>>>>>> int v = bytestream2_get_byteu(&gb);
>>>>>>>> *samples++ = adpcm_ima_expand_nibble(cs, v &
>>> 0x0F,
>>>>> 4);
>>>>>>>
>>>>>>> should be ok if tested
>>>>>>>
>>>>>>>
>>>>>>>> --
>>>>>>>> 2.39.1
>>>>>>>>
>>>>>>>
>>>>>>>> libavcodec/adpcm.c | 388
>>>>>>> +++++++++++++++++----------------
>>>>>>>> tests/ref/fate/adpcm-creative-8-2.6bit | 2
>>>>>>>> tests/ref/fate/adpcm-creative-8-2bit | 2
>>>>>>>> tests/ref/fate/adpcm-creative-8-4bit | 2
>>>>>>>> tests/ref/fate/adpcm-ms-mono | 60 +----
>>>>>>>> 5 files changed, 227 insertions(+), 227 deletions(-)
>>>>>>>> 1760df1de66b4227e71ffe942dedcf7d8a33ad48
>>>>>>> 0004-avcodec-adpcm-consume-all-input-when-decoding.patch
>>>>>>>> From 19789bca53548d672bff30b88a8838edaa876bdb Mon Sep 17 00:00:00
>>>>> 2001
>>>>>>>> From: Paul B Mahol <onemda@gmail.com>
>>>>>>>> Date: Tue, 15 Aug 2023 15:25:22 +0200
>>>>>>>> Subject: [PATCH 4/4] avcodec/adpcm: consume all input when
>>> decoding
>>>>>>>>
>>>>>>>> Stops multiple decoding calls for single packet.
>>>>>>>> Also makes decoding faster.
>>>>>>>
>>>>>>> This increases latency, which can be problem if packets are
>>>>>>> sufficiently large
>>>>>>>
>>>>>>
>>>>>> Then reduce size at demuxer level. there is option for it.
>>>>>
>>>>> if that is so, then please explain exactly which option should be used
>>>>> in the commit message
>>>>>
>>>>>
>>>> ffmpeg -h demuxer=wav
>>>
>>> what about the demuxers that are not named "wav" ?
>>>
>>>
>> I think you are blocking this just for sake of blocking because you have
>> nothing more constructive to do.
>> The delay is always present, unless packet size is exact as block align.
>> And for ADPCM this is irrelevant.
>
> IIUC, before this patch if a 1gb sized ADPCM packet comes from a demuxer
> that is decoded in small kb sized pieces and returned at that granularity
> to the user.
> after this patch (please correct me if iam wrong)
> you get a failure as the decoded data is not even addressable with int
> but lets assume int is 64bits, you get a 4gb or something like that
> audio frame. It maybe faster to decode that in one go but by how much is that
> faster from lets say decode it in 10-100kb sized chunks ?
>
> IMHO theres a point where it is too big, and simply returning the data
> to the user with some granularity lower than "unlimited" makes sense.
> Iam not asking for a new feature, rather your patch removes this
>
If a user wants his audio in small bits, he should not send 1GB packets.
- Andreas
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [FFmpeg-devel] [PATCH] adpcm fixes and improvements
2023-08-24 16:26 ` Andreas Rheinhardt
@ 2023-08-24 17:39 ` Michael Niedermayer
2023-08-24 19:47 ` Paul B Mahol
0 siblings, 1 reply; 13+ messages in thread
From: Michael Niedermayer @ 2023-08-24 17:39 UTC (permalink / raw)
To: FFmpeg development discussions and patches
[-- Attachment #1.1: Type: text/plain, Size: 5849 bytes --]
On Thu, Aug 24, 2023 at 06:26:36PM +0200, Andreas Rheinhardt wrote:
> Michael Niedermayer:
> > On Thu, Aug 24, 2023 at 12:51:28AM +0200, Paul B Mahol wrote:
> >> On Thu, Aug 24, 2023 at 12:36 AM Michael Niedermayer <michael@niedermayer.cc>
> >> wrote:
> >>
> >>> On Wed, Aug 23, 2023 at 09:04:35PM +0200, Paul B Mahol wrote:
> >>>> On Wed, Aug 23, 2023 at 9:02 PM Michael Niedermayer <
> >>> michael@niedermayer.cc>
> >>>> wrote:
> >>>>
> >>>>> On Wed, Aug 16, 2023 at 06:53:42PM +0200, Paul B Mahol wrote:
> >>>>>> On Wed, Aug 16, 2023 at 6:38 PM Michael Niedermayer <
> >>>>> michael@niedermayer.cc>
> >>>>>> wrote:
> >>>>>>
> >>>>>>> On Tue, Aug 15, 2023 at 04:49:05PM +0200, Paul B Mahol wrote:
> >>>>>>>> Attached
> >>>>>>>
> >>>>>>> [...]
> >>>>>>>> adpcm.c | 2 +-
> >>>>>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>>>>>> 3305dbe07ca935958fa213f5cadc339ad3cc3592
> >>>>>>> 0003-avcodec-adpcm-use-already-existing-pointer-for-4xm-d.patch
> >>>>>>>> From c6ad6dc7b8725d897e36399e5c7b8174caeb92e6 Mon Sep 17 00:00:00
> >>>>> 2001
> >>>>>>>> From: Paul B Mahol <onemda@gmail.com>
> >>>>>>>> Date: Tue, 15 Aug 2023 14:18:47 +0200
> >>>>>>>> Subject: [PATCH 3/4] avcodec/adpcm: use already existing pointer
> >>> for
> >>>>> 4xm
> >>>>>>>> decoder
> >>>>>>>>
> >>>>>>>> Signed-off-by: Paul B Mahol <onemda@gmail.com>
> >>>>>>>> ---
> >>>>>>>> libavcodec/adpcm.c | 2 +-
> >>>>>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
> >>>>>>>>
> >>>>>>>> diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
> >>>>>>>> index b0c3b91a3b..9993c9e531 100644
> >>>>>>>> --- a/libavcodec/adpcm.c
> >>>>>>>> +++ b/libavcodec/adpcm.c
> >>>>>>>> @@ -1211,7 +1211,7 @@ static int
> >>> adpcm_decode_frame(AVCodecContext
> >>>>>>> *avctx, AVFrame *frame,
> >>>>>>>>
> >>>>>>>> for (int i = 0; i < channels; i++) {
> >>>>>>>> ADPCMChannelStatus *cs = &c->status[i];
> >>>>>>>> - samples = (int16_t *)frame->data[i];
> >>>>>>>> + samples = samples_p[i];
> >>>>>>>> for (int n = nb_samples >> 1; n > 0; n--) {
> >>>>>>>> int v = bytestream2_get_byteu(&gb);
> >>>>>>>> *samples++ = adpcm_ima_expand_nibble(cs, v &
> >>> 0x0F,
> >>>>> 4);
> >>>>>>>
> >>>>>>> should be ok if tested
> >>>>>>>
> >>>>>>>
> >>>>>>>> --
> >>>>>>>> 2.39.1
> >>>>>>>>
> >>>>>>>
> >>>>>>>> libavcodec/adpcm.c | 388
> >>>>>>> +++++++++++++++++----------------
> >>>>>>>> tests/ref/fate/adpcm-creative-8-2.6bit | 2
> >>>>>>>> tests/ref/fate/adpcm-creative-8-2bit | 2
> >>>>>>>> tests/ref/fate/adpcm-creative-8-4bit | 2
> >>>>>>>> tests/ref/fate/adpcm-ms-mono | 60 +----
> >>>>>>>> 5 files changed, 227 insertions(+), 227 deletions(-)
> >>>>>>>> 1760df1de66b4227e71ffe942dedcf7d8a33ad48
> >>>>>>> 0004-avcodec-adpcm-consume-all-input-when-decoding.patch
> >>>>>>>> From 19789bca53548d672bff30b88a8838edaa876bdb Mon Sep 17 00:00:00
> >>>>> 2001
> >>>>>>>> From: Paul B Mahol <onemda@gmail.com>
> >>>>>>>> Date: Tue, 15 Aug 2023 15:25:22 +0200
> >>>>>>>> Subject: [PATCH 4/4] avcodec/adpcm: consume all input when
> >>> decoding
> >>>>>>>>
> >>>>>>>> Stops multiple decoding calls for single packet.
> >>>>>>>> Also makes decoding faster.
> >>>>>>>
> >>>>>>> This increases latency, which can be problem if packets are
> >>>>>>> sufficiently large
> >>>>>>>
> >>>>>>
> >>>>>> Then reduce size at demuxer level. there is option for it.
> >>>>>
> >>>>> if that is so, then please explain exactly which option should be used
> >>>>> in the commit message
> >>>>>
> >>>>>
> >>>> ffmpeg -h demuxer=wav
> >>>
> >>> what about the demuxers that are not named "wav" ?
> >>>
> >>>
> >> I think you are blocking this just for sake of blocking because you have
> >> nothing more constructive to do.
> >> The delay is always present, unless packet size is exact as block align.
> >> And for ADPCM this is irrelevant.
> >
> > IIUC, before this patch if a 1gb sized ADPCM packet comes from a demuxer
> > that is decoded in small kb sized pieces and returned at that granularity
> > to the user.
> > after this patch (please correct me if iam wrong)
> > you get a failure as the decoded data is not even addressable with int
> > but lets assume int is 64bits, you get a 4gb or something like that
> > audio frame. It maybe faster to decode that in one go but by how much is that
> > faster from lets say decode it in 10-100kb sized chunks ?
> >
> > IMHO theres a point where it is too big, and simply returning the data
> > to the user with some granularity lower than "unlimited" makes sense.
> > Iam not asking for a new feature, rather your patch removes this
> >
>
> If a user wants his audio in small bits, he should not send 1GB packets.
Normally most users get their audio packets from a file or stream
they dont choose whats in that and dont choose the size of packets
the wav demuxer has an option to choose the maximum packet size but thats
wav demuxer specific.
am i missing something ?
the 1gb was an extreem example to show the issue, real files would
likely not be that extreem but still the existence of the wav demuxer
option to choose the maximum packet size shows there was a need for
limiting it.
And if you take packets from the wav demuxer and remux them into
something else then any size you can get out of wav, you will be
able to put in and later get out of any other container.
again am i missing something ?
thx
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Into a blind darkness they enter who follow after the Ignorance,
they as if into a greater darkness enter who devote themselves
to the Knowledge alone. -- Isha Upanishad
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
[-- Attachment #2: Type: text/plain, Size: 251 bytes --]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [FFmpeg-devel] [PATCH] adpcm fixes and improvements
2023-08-24 17:39 ` Michael Niedermayer
@ 2023-08-24 19:47 ` Paul B Mahol
2023-08-26 11:01 ` Paul B Mahol
0 siblings, 1 reply; 13+ messages in thread
From: Paul B Mahol @ 2023-08-24 19:47 UTC (permalink / raw)
To: FFmpeg development discussions and patches
On Thu, Aug 24, 2023 at 7:39 PM Michael Niedermayer <michael@niedermayer.cc>
wrote:
> On Thu, Aug 24, 2023 at 06:26:36PM +0200, Andreas Rheinhardt wrote:
> > Michael Niedermayer:
> > > On Thu, Aug 24, 2023 at 12:51:28AM +0200, Paul B Mahol wrote:
> > >> On Thu, Aug 24, 2023 at 12:36 AM Michael Niedermayer <
> michael@niedermayer.cc>
> > >> wrote:
> > >>
> > >>> On Wed, Aug 23, 2023 at 09:04:35PM +0200, Paul B Mahol wrote:
> > >>>> On Wed, Aug 23, 2023 at 9:02 PM Michael Niedermayer <
> > >>> michael@niedermayer.cc>
> > >>>> wrote:
> > >>>>
> > >>>>> On Wed, Aug 16, 2023 at 06:53:42PM +0200, Paul B Mahol wrote:
> > >>>>>> On Wed, Aug 16, 2023 at 6:38 PM Michael Niedermayer <
> > >>>>> michael@niedermayer.cc>
> > >>>>>> wrote:
> > >>>>>>
> > >>>>>>> On Tue, Aug 15, 2023 at 04:49:05PM +0200, Paul B Mahol wrote:
> > >>>>>>>> Attached
> > >>>>>>>
> > >>>>>>> [...]
> > >>>>>>>> adpcm.c | 2 +-
> > >>>>>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>>>>>> 3305dbe07ca935958fa213f5cadc339ad3cc3592
> > >>>>>>> 0003-avcodec-adpcm-use-already-existing-pointer-for-4xm-d.patch
> > >>>>>>>> From c6ad6dc7b8725d897e36399e5c7b8174caeb92e6 Mon Sep 17
> 00:00:00
> > >>>>> 2001
> > >>>>>>>> From: Paul B Mahol <onemda@gmail.com>
> > >>>>>>>> Date: Tue, 15 Aug 2023 14:18:47 +0200
> > >>>>>>>> Subject: [PATCH 3/4] avcodec/adpcm: use already existing pointer
> > >>> for
> > >>>>> 4xm
> > >>>>>>>> decoder
> > >>>>>>>>
> > >>>>>>>> Signed-off-by: Paul B Mahol <onemda@gmail.com>
> > >>>>>>>> ---
> > >>>>>>>> libavcodec/adpcm.c | 2 +-
> > >>>>>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
> > >>>>>>>>
> > >>>>>>>> diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
> > >>>>>>>> index b0c3b91a3b..9993c9e531 100644
> > >>>>>>>> --- a/libavcodec/adpcm.c
> > >>>>>>>> +++ b/libavcodec/adpcm.c
> > >>>>>>>> @@ -1211,7 +1211,7 @@ static int
> > >>> adpcm_decode_frame(AVCodecContext
> > >>>>>>> *avctx, AVFrame *frame,
> > >>>>>>>>
> > >>>>>>>> for (int i = 0; i < channels; i++) {
> > >>>>>>>> ADPCMChannelStatus *cs = &c->status[i];
> > >>>>>>>> - samples = (int16_t *)frame->data[i];
> > >>>>>>>> + samples = samples_p[i];
> > >>>>>>>> for (int n = nb_samples >> 1; n > 0; n--) {
> > >>>>>>>> int v = bytestream2_get_byteu(&gb);
> > >>>>>>>> *samples++ = adpcm_ima_expand_nibble(cs, v &
> > >>> 0x0F,
> > >>>>> 4);
> > >>>>>>>
> > >>>>>>> should be ok if tested
> > >>>>>>>
> > >>>>>>>
> > >>>>>>>> --
> > >>>>>>>> 2.39.1
> > >>>>>>>>
> > >>>>>>>
> > >>>>>>>> libavcodec/adpcm.c | 388
> > >>>>>>> +++++++++++++++++----------------
> > >>>>>>>> tests/ref/fate/adpcm-creative-8-2.6bit | 2
> > >>>>>>>> tests/ref/fate/adpcm-creative-8-2bit | 2
> > >>>>>>>> tests/ref/fate/adpcm-creative-8-4bit | 2
> > >>>>>>>> tests/ref/fate/adpcm-ms-mono | 60 +----
> > >>>>>>>> 5 files changed, 227 insertions(+), 227 deletions(-)
> > >>>>>>>> 1760df1de66b4227e71ffe942dedcf7d8a33ad48
> > >>>>>>> 0004-avcodec-adpcm-consume-all-input-when-decoding.patch
> > >>>>>>>> From 19789bca53548d672bff30b88a8838edaa876bdb Mon Sep 17
> 00:00:00
> > >>>>> 2001
> > >>>>>>>> From: Paul B Mahol <onemda@gmail.com>
> > >>>>>>>> Date: Tue, 15 Aug 2023 15:25:22 +0200
> > >>>>>>>> Subject: [PATCH 4/4] avcodec/adpcm: consume all input when
> > >>> decoding
> > >>>>>>>>
> > >>>>>>>> Stops multiple decoding calls for single packet.
> > >>>>>>>> Also makes decoding faster.
> > >>>>>>>
> > >>>>>>> This increases latency, which can be problem if packets are
> > >>>>>>> sufficiently large
> > >>>>>>>
> > >>>>>>
> > >>>>>> Then reduce size at demuxer level. there is option for it.
> > >>>>>
> > >>>>> if that is so, then please explain exactly which option should be
> used
> > >>>>> in the commit message
> > >>>>>
> > >>>>>
> > >>>> ffmpeg -h demuxer=wav
> > >>>
> > >>> what about the demuxers that are not named "wav" ?
> > >>>
> > >>>
> > >> I think you are blocking this just for sake of blocking because you
> have
> > >> nothing more constructive to do.
> > >> The delay is always present, unless packet size is exact as block
> align.
> > >> And for ADPCM this is irrelevant.
> > >
> > > IIUC, before this patch if a 1gb sized ADPCM packet comes from a
> demuxer
> > > that is decoded in small kb sized pieces and returned at that
> granularity
> > > to the user.
> > > after this patch (please correct me if iam wrong)
> > > you get a failure as the decoded data is not even addressable with int
> > > but lets assume int is 64bits, you get a 4gb or something like that
> > > audio frame. It maybe faster to decode that in one go but by how much
> is that
> > > faster from lets say decode it in 10-100kb sized chunks ?
> > >
> > > IMHO theres a point where it is too big, and simply returning the data
> > > to the user with some granularity lower than "unlimited" makes sense.
> > > Iam not asking for a new feature, rather your patch removes this
> > >
> >
> > If a user wants his audio in small bits, he should not send 1GB packets.
>
> Normally most users get their audio packets from a file or stream
> they dont choose whats in that and dont choose the size of packets
>
> the wav demuxer has an option to choose the maximum packet size but thats
> wav demuxer specific.
>
> am i missing something ?
> the 1gb was an extreem example to show the issue, real files would
> likely not be that extreem but still the existence of the wav demuxer
> option to choose the maximum packet size shows there was a need for
> limiting it.
>
> And if you take packets from the wav demuxer and remux them into
> something else then any size you can get out of wav, you will be
> able to put in and later get out of any other container.
>
> again am i missing something ?
>
wav demuxer may have set size to higher value than block_align value.
This patch just returns samples in one bigger frame at once if that is
possible.
The delay/latency is not introduced by this patch at all which seems your
only objective.
In fact delay/latency is same as in code without this patch.
>
> thx
>
> [...]
> --
> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Into a blind darkness they enter who follow after the Ignorance,
> they as if into a greater darkness enter who devote themselves
> to the Knowledge alone. -- Isha Upanishad
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2023-08-26 10:53 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-15 14:49 [FFmpeg-devel] [PATCH] adpcm fixes and improvements Paul B Mahol
2023-08-16 16:38 ` Michael Niedermayer
2023-08-16 16:53 ` Paul B Mahol
2023-08-23 16:29 ` Paul B Mahol
2023-08-23 19:02 ` Michael Niedermayer
2023-08-23 19:04 ` Paul B Mahol
2023-08-23 22:36 ` Michael Niedermayer
2023-08-23 22:51 ` Paul B Mahol
2023-08-24 15:44 ` Michael Niedermayer
2023-08-24 16:26 ` Andreas Rheinhardt
2023-08-24 17:39 ` Michael Niedermayer
2023-08-24 19:47 ` Paul B Mahol
2023-08-26 11:01 ` Paul B Mahol
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git