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;
|
}Band;
|
||||||
|
|
||||||
typedef struct MPCContext {
|
typedef struct MPCContext {
|
||||||
AVFrame frame;
|
|
||||||
DSPContext dsp;
|
DSPContext dsp;
|
||||||
MPADSPContext mpadsp;
|
MPADSPContext mpadsp;
|
||||||
GetBitContext gb;
|
GetBitContext gb;
|
||||||
|
@ -139,9 +139,6 @@ static av_cold int mpc7_decode_init(AVCodecContext * avctx)
|
|||||||
}
|
}
|
||||||
vlc_initialized = 1;
|
vlc_initialized = 1;
|
||||||
|
|
||||||
avcodec_get_frame_defaults(&c->frame);
|
|
||||||
avctx->coded_frame = &c->frame;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,6 +198,7 @@ static int get_scale_idx(GetBitContext *gb, int ref)
|
|||||||
static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
|
static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
|
||||||
int *got_frame_ptr, AVPacket *avpkt)
|
int *got_frame_ptr, AVPacket *avpkt)
|
||||||
{
|
{
|
||||||
|
AVFrame *frame = data;
|
||||||
const uint8_t *buf = avpkt->data;
|
const uint8_t *buf = avpkt->data;
|
||||||
int buf_size;
|
int buf_size;
|
||||||
MPCContext *c = avctx->priv_data;
|
MPCContext *c = avctx->priv_data;
|
||||||
@ -230,8 +228,8 @@ static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
|
|||||||
buf_size -= 4;
|
buf_size -= 4;
|
||||||
|
|
||||||
/* get output buffer */
|
/* get output buffer */
|
||||||
c->frame.nb_samples = last_frame ? c->lastframelen : MPC_FRAME_SIZE;
|
frame->nb_samples = last_frame ? c->lastframelen : MPC_FRAME_SIZE;
|
||||||
if ((ret = ff_get_buffer(avctx, &c->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;
|
||||||
}
|
}
|
||||||
@ -295,7 +293,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
|
|||||||
for(ch = 0; ch < 2; ch++)
|
for(ch = 0; ch < 2; ch++)
|
||||||
idx_to_quant(c, &gb, bands[i].res[ch], c->Q[ch] + off);
|
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_used = get_bits_count(&gb);
|
||||||
bits_avail = buf_size * 8;
|
bits_avail = buf_size * 8;
|
||||||
@ -310,7 +308,6 @@ static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
*got_frame_ptr = 1;
|
*got_frame_ptr = 1;
|
||||||
*(AVFrame *)data = c->frame;
|
|
||||||
|
|
||||||
return avpkt->size;
|
return avpkt->size;
|
||||||
}
|
}
|
||||||
|
@ -230,15 +230,13 @@ static av_cold int mpc8_decode_init(AVCodecContext * avctx)
|
|||||||
}
|
}
|
||||||
vlc_initialized = 1;
|
vlc_initialized = 1;
|
||||||
|
|
||||||
avcodec_get_frame_defaults(&c->frame);
|
|
||||||
avctx->coded_frame = &c->frame;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
|
static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
|
||||||
int *got_frame_ptr, AVPacket *avpkt)
|
int *got_frame_ptr, AVPacket *avpkt)
|
||||||
{
|
{
|
||||||
|
AVFrame *frame = data;
|
||||||
const uint8_t *buf = avpkt->data;
|
const uint8_t *buf = avpkt->data;
|
||||||
int buf_size = avpkt->size;
|
int buf_size = avpkt->size;
|
||||||
MPCContext *c = avctx->priv_data;
|
MPCContext *c = avctx->priv_data;
|
||||||
@ -250,8 +248,8 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
|
|||||||
int last[2];
|
int last[2];
|
||||||
|
|
||||||
/* get output buffer */
|
/* get output buffer */
|
||||||
c->frame.nb_samples = MPC_FRAME_SIZE;
|
frame->nb_samples = MPC_FRAME_SIZE;
|
||||||
if ((res = ff_get_buffer(avctx, &c->frame)) < 0) {
|
if ((res = 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 res;
|
return res;
|
||||||
}
|
}
|
||||||
@ -407,7 +405,7 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ff_mpc_dequantize_and_synth(c, maxband - 1,
|
ff_mpc_dequantize_and_synth(c, maxband - 1,
|
||||||
(int16_t **)c->frame.extended_data,
|
(int16_t **)frame->extended_data,
|
||||||
avctx->channels);
|
avctx->channels);
|
||||||
|
|
||||||
c->cur_frame++;
|
c->cur_frame++;
|
||||||
@ -419,7 +417,6 @@ static int mpc8_decode_frame(AVCodecContext * avctx, void *data,
|
|||||||
c->cur_frame = 0;
|
c->cur_frame = 0;
|
||||||
|
|
||||||
*got_frame_ptr = 1;
|
*got_frame_ptr = 1;
|
||||||
*(AVFrame *)data = c->frame;
|
|
||||||
|
|
||||||
return c->cur_frame ? c->last_bits_used >> 3 : buf_size;
|
return c->cur_frame ? c->last_bits_used >> 3 : buf_size;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user