8svx: decode directly to the user-provided AVFrame
This commit is contained in:
parent
fd1abf4269
commit
a3de4010c2
@ -34,7 +34,6 @@
|
|||||||
|
|
||||||
/** decoder context */
|
/** decoder context */
|
||||||
typedef struct EightSvxContext {
|
typedef struct EightSvxContext {
|
||||||
AVFrame frame;
|
|
||||||
uint8_t fib_acc[2];
|
uint8_t fib_acc[2];
|
||||||
const int8_t *table;
|
const int8_t *table;
|
||||||
|
|
||||||
@ -85,6 +84,7 @@ static int eightsvx_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
int *got_frame_ptr, AVPacket *avpkt)
|
int *got_frame_ptr, AVPacket *avpkt)
|
||||||
{
|
{
|
||||||
EightSvxContext *esc = avctx->priv_data;
|
EightSvxContext *esc = avctx->priv_data;
|
||||||
|
AVFrame *frame = data;
|
||||||
int buf_size;
|
int buf_size;
|
||||||
int ch, ret;
|
int ch, ret;
|
||||||
int is_compr = (avctx->codec_id != AV_CODEC_ID_PCM_S8_PLANAR);
|
int is_compr = (avctx->codec_id != AV_CODEC_ID_PCM_S8_PLANAR);
|
||||||
@ -136,18 +136,18 @@ static int eightsvx_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* get output buffer */
|
/* get output buffer */
|
||||||
esc->frame.nb_samples = buf_size * (is_compr + 1);
|
frame->nb_samples = buf_size * (is_compr + 1);
|
||||||
if ((ret = ff_get_buffer(avctx, &esc->frame)) < 0) {
|
if ((ret = ff_get_buffer(avctx, frame)) < 0) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
|
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ch = 0; ch < avctx->channels; ch++) {
|
for (ch = 0; ch < avctx->channels; ch++) {
|
||||||
if (is_compr) {
|
if (is_compr) {
|
||||||
delta_decode(esc->frame.data[ch], &esc->data[ch][esc->data_idx],
|
delta_decode(frame->data[ch], &esc->data[ch][esc->data_idx],
|
||||||
buf_size, &esc->fib_acc[ch], esc->table);
|
buf_size, &esc->fib_acc[ch], esc->table);
|
||||||
} else {
|
} else {
|
||||||
raw_decode(esc->frame.data[ch], &esc->data[ch][esc->data_idx],
|
raw_decode(frame->data[ch], &esc->data[ch][esc->data_idx],
|
||||||
buf_size);
|
buf_size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -155,7 +155,6 @@ static int eightsvx_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
esc->data_idx += buf_size;
|
esc->data_idx += buf_size;
|
||||||
|
|
||||||
*got_frame_ptr = 1;
|
*got_frame_ptr = 1;
|
||||||
*(AVFrame *)data = esc->frame;
|
|
||||||
|
|
||||||
return avpkt->size;
|
return avpkt->size;
|
||||||
}
|
}
|
||||||
@ -184,9 +183,6 @@ static av_cold int eightsvx_decode_init(AVCodecContext *avctx)
|
|||||||
}
|
}
|
||||||
avctx->sample_fmt = AV_SAMPLE_FMT_U8P;
|
avctx->sample_fmt = AV_SAMPLE_FMT_U8P;
|
||||||
|
|
||||||
avcodec_get_frame_defaults(&esc->frame);
|
|
||||||
avctx->coded_frame = &esc->frame;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user