Browse Source

dcadec: set channel layout in a separate function

Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
tags/n3.0
Alexandra Hájková Luca Barbato 10 years ago
parent
commit
7778859835
1 changed files with 69 additions and 57 deletions
  1. +69
    -57
      libavcodec/dcadec.c

+ 69
- 57
libavcodec/dcadec.c View File

@@ -1244,65 +1244,10 @@ static int scan_for_extensions(AVCodecContext *avctx)
return ret;
}

/**
* Main frame decoding function
* FIXME add arguments
*/
static int dca_decode_frame(AVCodecContext *avctx, void *data,
int *got_frame_ptr, AVPacket *avpkt)
static int set_channel_layout(AVCodecContext *avctx, int channels, int num_core_channels)
{
AVFrame *frame = data;
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;

int lfe_samples;
int num_core_channels = 0;
int i, ret;
float **samples_flt;
DCAContext *s = avctx->priv_data;
int channels, full_channels;
int upsample = 0;

s->exss_ext_mask = 0;
s->xch_present = 0;

s->dca_buffer_size = ff_dca_convert_bitstream(buf, buf_size, s->dca_buffer,
DCA_MAX_FRAME_SIZE + DCA_MAX_EXSS_HEADER_SIZE);
if (s->dca_buffer_size == AVERROR_INVALIDDATA) {
av_log(avctx, AV_LOG_ERROR, "Not a valid DCA frame\n");
return AVERROR_INVALIDDATA;
}

if ((ret = dca_parse_frame_header(s)) < 0) {
// seems like the frame is corrupt, try with the next one
return ret;
}
// set AVCodec values with parsed data
avctx->sample_rate = s->sample_rate;
avctx->bit_rate = s->bit_rate;

s->profile = FF_PROFILE_DTS;

for (i = 0; i < (s->sample_blocks / 8); i++) {
if ((ret = dca_decode_block(s, 0, i))) {
av_log(avctx, AV_LOG_ERROR, "error decoding block\n");
return ret;
}
}

/* record number of core channels incase less than max channels are requested */
num_core_channels = s->prim_channels;

if (s->ext_coding)
s->core_ext_mask = dca_ext_audio_descr_mask[s->ext_descr];
else
s->core_ext_mask = 0;

ret = scan_for_extensions(avctx);

avctx->profile = s->profile;

full_channels = channels = s->prim_channels + !!s->lfe;
int i;

if (s->amode < 16) {
avctx->channel_layout = dca_core_channel_layout[s->amode];
@@ -1389,6 +1334,73 @@ static int dca_decode_frame(AVCodecContext *avctx, void *data,
av_log(avctx, AV_LOG_ERROR, "Non standard configuration %d !\n", s->amode);
return AVERROR_INVALIDDATA;
}

return 0;
}

/**
* Main frame decoding function
* FIXME add arguments
*/
static int dca_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;

int lfe_samples;
int num_core_channels = 0;
int i, ret;
float **samples_flt;
DCAContext *s = avctx->priv_data;
int channels, full_channels;
int upsample = 0;

s->exss_ext_mask = 0;
s->xch_present = 0;

s->dca_buffer_size = ff_dca_convert_bitstream(buf, buf_size, s->dca_buffer,
DCA_MAX_FRAME_SIZE + DCA_MAX_EXSS_HEADER_SIZE);
if (s->dca_buffer_size == AVERROR_INVALIDDATA) {
av_log(avctx, AV_LOG_ERROR, "Not a valid DCA frame\n");
return AVERROR_INVALIDDATA;
}

if ((ret = dca_parse_frame_header(s)) < 0) {
// seems like the frame is corrupt, try with the next one
return ret;
}
// set AVCodec values with parsed data
avctx->sample_rate = s->sample_rate;
avctx->bit_rate = s->bit_rate;

s->profile = FF_PROFILE_DTS;

for (i = 0; i < (s->sample_blocks / 8); i++) {
if ((ret = dca_decode_block(s, 0, i))) {
av_log(avctx, AV_LOG_ERROR, "error decoding block\n");
return ret;
}
}

/* record number of core channels incase less than max channels are requested */
num_core_channels = s->prim_channels;

if (s->ext_coding)
s->core_ext_mask = dca_ext_audio_descr_mask[s->ext_descr];
else
s->core_ext_mask = 0;

ret = scan_for_extensions(avctx);

avctx->profile = s->profile;

full_channels = channels = s->prim_channels + !!s->lfe;

ret = set_channel_layout(avctx, channels, num_core_channels);
if (ret < 0)
return ret;
avctx->channels = channels;

/* get output buffer */


Loading…
Cancel
Save