mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
mpc7/8: decode directly to the user-provided AVFrame
This commit is contained in:
parent
2c785e250a
commit
3a23752c5a
@ -50,7 +50,6 @@ typedef struct Band {
|
||||
}Band;
|
||||
|
||||
typedef struct MPCContext {
|
||||
AVFrame frame;
|
||||
DSPContext dsp;
|
||||
MPADSPContext mpadsp;
|
||||
GetBitContext gb;
|
||||
|
@ -139,9 +139,6 @@ static av_cold int mpc7_decode_init(AVCodecContext * avctx)
|
||||
}
|
||||
vlc_initialized = 1;
|
||||
|
||||
avcodec_get_frame_defaults(&c->frame);
|
||||
avctx->coded_frame = &c->frame;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -201,6 +198,7 @@ static int get_scale_idx(GetBitContext *gb, int ref)
|
||||
static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
|
||||
int *got_frame_ptr, AVPacket *avpkt)
|
||||
{
|
||||
AVFrame *frame = data;
|
||||
const uint8_t *buf = avpkt->data;
|
||||
int buf_size;
|
||||
MPCContext *c = avctx->priv_data;
|
||||
@ -230,8 +228,8 @@ static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
|
||||
buf_size -= 4;
|
||||
|
||||
/* get output buffer */
|
||||
c->frame.nb_samples = last_frame ? c->lastframelen : MPC_FRAME_SIZE;
|
||||
if ((ret = ff_get_buffer(avctx, &c->frame)) < 0) {
|
||||
frame->nb_samples = last_frame ? c->lastframelen : MPC_FRAME_SIZE;
|
||||
if ((ret = ff_get_buffer(avctx, frame)) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
|
||||
return ret;
|
||||
}
|
||||
@ -295,7 +293,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
|
||||
for(ch = 0; ch < 2; ch++)
|
||||
idx_to_quant(c, &gb, bands[i].res[ch], c->Q[ch] + off);
|
||||
|
||||
ff_mpc_dequantize_and_synth(c, mb, (int16_t **)c->frame.extended_data, 2);
|
||||
ff_mpc_dequantize_and_synth(c, mb, (int16_t **)frame->extended_data, 2);
|
||||
|
||||
bits_used = get_bits_count(&gb);
|
||||
bits_avail = buf_size * 8;
|
||||
@ -310,7 +308,6 @@ static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
|
||||
}
|
||||
|
||||
*got_frame_ptr = 1;
|
||||
*(AVFrame *)data = c->frame;
|
||||
|
||||
return avpkt->size;
|
||||
}
|
||||
|
@ -230,15 +230,13 @@ static av_cold int mpc8_decode_init(AVCodecContext * avctx)
|
||||
}
|
||||
vlc_initialized = 1;
|
||||
|
||||
avcodec_get_frame_defaults(&c->frame);
|
||||
avctx->coded_frame = &c->frame;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
|
||||
int *got_frame_ptr, AVPacket *avpkt)
|
||||
{
|
||||
AVFrame *frame = data;
|
||||
const uint8_t *buf = avpkt->data;
|
||||
int buf_size = avpkt->size;
|
||||
MPCContext *c = avctx->priv_data;
|
||||
@ -250,8 +248,8 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
|
||||
int last[2];
|
||||
|
||||
/* get output buffer */
|
||||
c->frame.nb_samples = MPC_FRAME_SIZE;
|
||||
if ((res = ff_get_buffer(avctx, &c->frame)) < 0) {
|
||||
frame->nb_samples = MPC_FRAME_SIZE;
|
||||
if ((res = ff_get_buffer(avctx, frame)) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
|
||||
return res;
|
||||
}
|
||||
@ -407,7 +405,7 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
|
||||
}
|
||||
|
||||
ff_mpc_dequantize_and_synth(c, maxband - 1,
|
||||
(int16_t **)c->frame.extended_data,
|
||||
(int16_t **)frame->extended_data,
|
||||
avctx->channels);
|
||||
|
||||
c->cur_frame++;
|
||||
@ -419,7 +417,6 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
|
||||
c->cur_frame = 0;
|
||||
|
||||
*got_frame_ptr = 1;
|
||||
*(AVFrame *)data = c->frame;
|
||||
|
||||
return c->cur_frame ? c->last_bits_used >> 3 : buf_size;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user