mirror of https://git.ffmpeg.org/ffmpeg.git
aacdec: refactor the actual aac decoding code into its own function
aac_decode_frame() remains as AVPacket handling a wrapper. The actual decoding function takes a GetBitContext as input and will be used be the AAC LATM decoder to avoid copying the unaligned AAC bitstream. Originally committed as revision 25640 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
be63b4ba22
commit
66a71d989f
|
@ -1921,24 +1921,17 @@ static int parse_adts_frame_header(AACContext *ac, GetBitContext *gb)
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int aac_decode_frame(AVCodecContext *avctx, void *data,
|
static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
|
||||||
int *data_size, AVPacket *avpkt)
|
int *data_size, GetBitContext *gb)
|
||||||
{
|
{
|
||||||
const uint8_t *buf = avpkt->data;
|
|
||||||
int buf_size = avpkt->size;
|
|
||||||
AACContext *ac = avctx->priv_data;
|
AACContext *ac = avctx->priv_data;
|
||||||
ChannelElement *che = NULL, *che_prev = NULL;
|
ChannelElement *che = NULL, *che_prev = NULL;
|
||||||
GetBitContext gb;
|
|
||||||
enum RawDataBlockType elem_type, elem_type_prev = TYPE_END;
|
enum RawDataBlockType elem_type, elem_type_prev = TYPE_END;
|
||||||
int err, elem_id, data_size_tmp;
|
int err, elem_id, data_size_tmp;
|
||||||
int buf_consumed;
|
|
||||||
int samples = 0, multiplier;
|
int samples = 0, multiplier;
|
||||||
int buf_offset;
|
|
||||||
|
|
||||||
init_get_bits(&gb, buf, buf_size * 8);
|
if (show_bits(gb, 12) == 0xfff) {
|
||||||
|
if (parse_adts_frame_header(ac, gb) < 0) {
|
||||||
if (show_bits(&gb, 12) == 0xfff) {
|
|
||||||
if (parse_adts_frame_header(ac, &gb) < 0) {
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "Error decoding AAC frame header.\n");
|
av_log(avctx, AV_LOG_ERROR, "Error decoding AAC frame header.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1950,8 +1943,8 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
|
||||||
|
|
||||||
ac->tags_mapped = 0;
|
ac->tags_mapped = 0;
|
||||||
// parse
|
// parse
|
||||||
while ((elem_type = get_bits(&gb, 3)) != TYPE_END) {
|
while ((elem_type = get_bits(gb, 3)) != TYPE_END) {
|
||||||
elem_id = get_bits(&gb, 4);
|
elem_id = get_bits(gb, 4);
|
||||||
|
|
||||||
if (elem_type < TYPE_DSE) {
|
if (elem_type < TYPE_DSE) {
|
||||||
if (!(che=get_che(ac, elem_type, elem_id))) {
|
if (!(che=get_che(ac, elem_type, elem_id))) {
|
||||||
|
@ -1965,29 +1958,29 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
|
||||||
switch (elem_type) {
|
switch (elem_type) {
|
||||||
|
|
||||||
case TYPE_SCE:
|
case TYPE_SCE:
|
||||||
err = decode_ics(ac, &che->ch[0], &gb, 0, 0);
|
err = decode_ics(ac, &che->ch[0], gb, 0, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_CPE:
|
case TYPE_CPE:
|
||||||
err = decode_cpe(ac, &gb, che);
|
err = decode_cpe(ac, gb, che);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_CCE:
|
case TYPE_CCE:
|
||||||
err = decode_cce(ac, &gb, che);
|
err = decode_cce(ac, gb, che);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_LFE:
|
case TYPE_LFE:
|
||||||
err = decode_ics(ac, &che->ch[0], &gb, 0, 0);
|
err = decode_ics(ac, &che->ch[0], gb, 0, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_DSE:
|
case TYPE_DSE:
|
||||||
err = skip_data_stream_element(ac, &gb);
|
err = skip_data_stream_element(ac, gb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_PCE: {
|
case TYPE_PCE: {
|
||||||
enum ChannelPosition new_che_pos[4][MAX_ELEM_ID];
|
enum ChannelPosition new_che_pos[4][MAX_ELEM_ID];
|
||||||
memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0]));
|
memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0]));
|
||||||
if ((err = decode_pce(ac, new_che_pos, &gb)))
|
if ((err = decode_pce(ac, new_che_pos, gb)))
|
||||||
break;
|
break;
|
||||||
if (ac->output_configured > OC_TRIAL_PCE)
|
if (ac->output_configured > OC_TRIAL_PCE)
|
||||||
av_log(avctx, AV_LOG_ERROR,
|
av_log(avctx, AV_LOG_ERROR,
|
||||||
|
@ -1999,13 +1992,13 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
|
||||||
|
|
||||||
case TYPE_FIL:
|
case TYPE_FIL:
|
||||||
if (elem_id == 15)
|
if (elem_id == 15)
|
||||||
elem_id += get_bits(&gb, 8) - 1;
|
elem_id += get_bits(gb, 8) - 1;
|
||||||
if (get_bits_left(&gb) < 8 * elem_id) {
|
if (get_bits_left(gb) < 8 * elem_id) {
|
||||||
av_log(avctx, AV_LOG_ERROR, overread_err);
|
av_log(avctx, AV_LOG_ERROR, overread_err);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
while (elem_id > 0)
|
while (elem_id > 0)
|
||||||
elem_id -= decode_extension_payload(ac, &gb, elem_id, che_prev, elem_type_prev);
|
elem_id -= decode_extension_payload(ac, gb, elem_id, che_prev, elem_type_prev);
|
||||||
err = 0; /* FIXME */
|
err = 0; /* FIXME */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2020,7 +2013,7 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (get_bits_left(&gb) < 3) {
|
if (get_bits_left(gb) < 3) {
|
||||||
av_log(avctx, AV_LOG_ERROR, overread_err);
|
av_log(avctx, AV_LOG_ERROR, overread_err);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -2050,6 +2043,24 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
|
||||||
if (ac->output_configured)
|
if (ac->output_configured)
|
||||||
ac->output_configured = OC_LOCKED;
|
ac->output_configured = OC_LOCKED;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int aac_decode_frame(AVCodecContext *avctx, void *data,
|
||||||
|
int *data_size, AVPacket *avpkt)
|
||||||
|
{
|
||||||
|
const uint8_t *buf = avpkt->data;
|
||||||
|
int buf_size = avpkt->size;
|
||||||
|
GetBitContext gb;
|
||||||
|
int buf_consumed;
|
||||||
|
int buf_offset;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
init_get_bits(&gb, buf, buf_size * 8);
|
||||||
|
|
||||||
|
if ((err = aac_decode_frame_int(avctx, data, data_size, &gb)) < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
buf_consumed = (get_bits_count(&gb) + 7) >> 3;
|
buf_consumed = (get_bits_count(&gb) + 7) >> 3;
|
||||||
for (buf_offset = buf_consumed; buf_offset < buf_size; buf_offset++)
|
for (buf_offset = buf_consumed; buf_offset < buf_size; buf_offset++)
|
||||||
if (buf[buf_offset])
|
if (buf[buf_offset])
|
||||||
|
|
Loading…
Reference in New Issue