You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
Merge commit '5d1007f74dd496d54b932242004382f44e3b22b4'
* commit '5d1007f74dd496d54b932242004382f44e3b22b4': atrac3: initialize static tables in AVCodec.init_static_data() atrac3: separate window initialization from IMDCT initialization atrac3: move the 'frame_factor' field from ATRAC3Context to where it is used atrac3: remove unused ATRAC3Context field, bit_rate Conflicts: libavcodec/atrac3.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
@@ -91,7 +91,6 @@ typedef struct ATRAC3Context {
|
|||||||
//@{
|
//@{
|
||||||
/** stream data */
|
/** stream data */
|
||||||
int coding_mode;
|
int coding_mode;
|
||||||
int bit_rate;
|
|
||||||
int sample_rate;
|
int sample_rate;
|
||||||
|
|
||||||
ChannelUnit *units;
|
ChannelUnit *units;
|
||||||
@@ -111,7 +110,6 @@ typedef struct ATRAC3Context {
|
|||||||
//@{
|
//@{
|
||||||
/** extradata */
|
/** extradata */
|
||||||
int scrambled_stream;
|
int scrambled_stream;
|
||||||
int frame_factor;
|
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
FFTContext mdct_ctx;
|
FFTContext mdct_ctx;
|
||||||
@@ -120,6 +118,7 @@ typedef struct ATRAC3Context {
|
|||||||
} ATRAC3Context;
|
} ATRAC3Context;
|
||||||
|
|
||||||
static DECLARE_ALIGNED(32, float, mdct_window)[MDCT_SIZE];
|
static DECLARE_ALIGNED(32, float, mdct_window)[MDCT_SIZE];
|
||||||
|
static VLC_TYPE atrac3_vlc_table[4096][2];
|
||||||
static VLC spectral_coeff_tab[7];
|
static VLC spectral_coeff_tab[7];
|
||||||
static float gain_tab1[16];
|
static float gain_tab1[16];
|
||||||
static float gain_tab2[31];
|
static float gain_tab2[31];
|
||||||
@@ -177,7 +176,7 @@ static int decode_bytes(const uint8_t *input, uint8_t *out, int bytes)
|
|||||||
return off;
|
return off;
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_cold int init_atrac3_transforms(ATRAC3Context *q)
|
static av_cold void init_atrac3_window(void)
|
||||||
{
|
{
|
||||||
float enc_window[256];
|
float enc_window[256];
|
||||||
int i;
|
int i;
|
||||||
@@ -187,7 +186,6 @@ static av_cold int init_atrac3_transforms(ATRAC3Context *q)
|
|||||||
for (i = 0; i < 256; i++)
|
for (i = 0; i < 256; i++)
|
||||||
enc_window[i] = (sin(((i + 0.5) / 256.0 - 0.5) * M_PI) + 1.0) * 0.5;
|
enc_window[i] = (sin(((i + 0.5) / 256.0 - 0.5) * M_PI) + 1.0) * 0.5;
|
||||||
|
|
||||||
if (!mdct_window[0]) {
|
|
||||||
for (i = 0; i < 256; i++) {
|
for (i = 0; i < 256; i++) {
|
||||||
mdct_window[i] = enc_window[i] /
|
mdct_window[i] = enc_window[i] /
|
||||||
(enc_window[ i] * enc_window[ i] +
|
(enc_window[ i] * enc_window[ i] +
|
||||||
@@ -196,10 +194,6 @@ static av_cold int init_atrac3_transforms(ATRAC3Context *q)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* initialize the MDCT transform */
|
|
||||||
return ff_mdct_init(&q->mdct_ctx, 9, 1, 1.0 / 32768);
|
|
||||||
}
|
|
||||||
|
|
||||||
static av_cold int atrac3_decode_close(AVCodecContext *avctx)
|
static av_cold int atrac3_decode_close(AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
ATRAC3Context *q = avctx->priv_data;
|
ATRAC3Context *q = avctx->priv_data;
|
||||||
@@ -846,18 +840,40 @@ static int atrac3_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
return avctx->block_align;
|
return avctx->block_align;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void atrac3_init_static_data(AVCodec *codec)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
init_atrac3_window();
|
||||||
|
ff_atrac_generate_tables();
|
||||||
|
|
||||||
|
/* Initialize the VLC tables. */
|
||||||
|
for (i = 0; i < 7; i++) {
|
||||||
|
spectral_coeff_tab[i].table = &atrac3_vlc_table[atrac3_vlc_offs[i]];
|
||||||
|
spectral_coeff_tab[i].table_allocated = atrac3_vlc_offs[i + 1] -
|
||||||
|
atrac3_vlc_offs[i ];
|
||||||
|
init_vlc(&spectral_coeff_tab[i], 9, huff_tab_sizes[i],
|
||||||
|
huff_bits[i], 1, 1,
|
||||||
|
huff_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Generate gain tables */
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
gain_tab1[i] = exp2f (4 - i);
|
||||||
|
|
||||||
|
for (i = -15; i < 16; i++)
|
||||||
|
gain_tab2[i + 15] = exp2f (i * -0.125);
|
||||||
|
}
|
||||||
|
|
||||||
static av_cold int atrac3_decode_init(AVCodecContext *avctx)
|
static av_cold int atrac3_decode_init(AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i, ret;
|
||||||
int version, delay, samples_per_frame;
|
int version, delay, samples_per_frame, frame_factor;
|
||||||
const uint8_t *edata_ptr = avctx->extradata;
|
const uint8_t *edata_ptr = avctx->extradata;
|
||||||
ATRAC3Context *q = avctx->priv_data;
|
ATRAC3Context *q = avctx->priv_data;
|
||||||
static VLC_TYPE atrac3_vlc_table[4096][2];
|
|
||||||
static int vlcs_initialized = 0;
|
|
||||||
|
|
||||||
/* Take data from the AVCodecContext (RM container). */
|
/* Take data from the AVCodecContext (RM container). */
|
||||||
q->sample_rate = avctx->sample_rate;
|
q->sample_rate = avctx->sample_rate;
|
||||||
q->bit_rate = avctx->bit_rate;
|
|
||||||
|
|
||||||
if (avctx->channels <= 0 || avctx->channels > 2) {
|
if (avctx->channels <= 0 || avctx->channels > 2) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Channel configuration error!\n");
|
av_log(avctx, AV_LOG_ERROR, "Channel configuration error!\n");
|
||||||
@@ -873,7 +889,7 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx)
|
|||||||
q->coding_mode = bytestream_get_le16(&edata_ptr);
|
q->coding_mode = bytestream_get_le16(&edata_ptr);
|
||||||
av_log(avctx, AV_LOG_DEBUG,"[8-9] %d\n",
|
av_log(avctx, AV_LOG_DEBUG,"[8-9] %d\n",
|
||||||
bytestream_get_le16(&edata_ptr)); //Dupe of coding mode
|
bytestream_get_le16(&edata_ptr)); //Dupe of coding mode
|
||||||
q->frame_factor = bytestream_get_le16(&edata_ptr); // Unknown always 1
|
frame_factor = bytestream_get_le16(&edata_ptr); // Unknown always 1
|
||||||
av_log(avctx, AV_LOG_DEBUG,"[12-13] %d\n",
|
av_log(avctx, AV_LOG_DEBUG,"[12-13] %d\n",
|
||||||
bytestream_get_le16(&edata_ptr)); // Unknown always 0
|
bytestream_get_le16(&edata_ptr)); // Unknown always 0
|
||||||
|
|
||||||
@@ -884,12 +900,12 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx)
|
|||||||
q->coding_mode = q->coding_mode ? JOINT_STEREO : STEREO;
|
q->coding_mode = q->coding_mode ? JOINT_STEREO : STEREO;
|
||||||
q->scrambled_stream = 0;
|
q->scrambled_stream = 0;
|
||||||
|
|
||||||
if (avctx->block_align != 96 * avctx->channels * q->frame_factor &&
|
if (avctx->block_align != 96 * avctx->channels * frame_factor &&
|
||||||
avctx->block_align != 152 * avctx->channels * q->frame_factor &&
|
avctx->block_align != 152 * avctx->channels * frame_factor &&
|
||||||
avctx->block_align != 192 * avctx->channels * q->frame_factor) {
|
avctx->block_align != 192 * avctx->channels * frame_factor) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Unknown frame/channel/frame_factor "
|
av_log(avctx, AV_LOG_ERROR, "Unknown frame/channel/frame_factor "
|
||||||
"configuration %d/%d/%d\n", avctx->block_align,
|
"configuration %d/%d/%d\n", avctx->block_align,
|
||||||
avctx->channels, q->frame_factor);
|
avctx->channels, frame_factor);
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
} else if (avctx->extradata_size == 10) {
|
} else if (avctx->extradata_size == 10) {
|
||||||
@@ -944,37 +960,15 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx)
|
|||||||
if (q->decoded_bytes_buffer == NULL)
|
if (q->decoded_bytes_buffer == NULL)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
|
|
||||||
/* Initialize the VLC tables. */
|
|
||||||
if (!vlcs_initialized) {
|
|
||||||
for (i = 0; i < 7; i++) {
|
|
||||||
spectral_coeff_tab[i].table = &atrac3_vlc_table[atrac3_vlc_offs[i]];
|
|
||||||
spectral_coeff_tab[i].table_allocated = atrac3_vlc_offs[i + 1] -
|
|
||||||
atrac3_vlc_offs[i ];
|
|
||||||
init_vlc(&spectral_coeff_tab[i], 9, huff_tab_sizes[i],
|
|
||||||
huff_bits[i], 1, 1,
|
|
||||||
huff_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
|
|
||||||
}
|
|
||||||
vlcs_initialized = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
|
avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
|
||||||
|
|
||||||
if ((ret = init_atrac3_transforms(q))) {
|
/* initialize the MDCT transform */
|
||||||
|
if ((ret = ff_mdct_init(&q->mdct_ctx, 9, 1, 1.0 / 32768)) < 0) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Error initializing MDCT\n");
|
av_log(avctx, AV_LOG_ERROR, "Error initializing MDCT\n");
|
||||||
av_freep(&q->decoded_bytes_buffer);
|
av_freep(&q->decoded_bytes_buffer);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ff_atrac_generate_tables();
|
|
||||||
|
|
||||||
/* Generate gain tables */
|
|
||||||
for (i = 0; i < 16; i++)
|
|
||||||
gain_tab1[i] = exp2f (4 - i);
|
|
||||||
|
|
||||||
for (i = -15; i < 16; i++)
|
|
||||||
gain_tab2[i + 15] = exp2f (i * -0.125);
|
|
||||||
|
|
||||||
/* init the joint-stereo decoding data */
|
/* init the joint-stereo decoding data */
|
||||||
q->weighting_delay[0] = 0;
|
q->weighting_delay[0] = 0;
|
||||||
q->weighting_delay[1] = 7;
|
q->weighting_delay[1] = 7;
|
||||||
@@ -1010,6 +1004,7 @@ AVCodec ff_atrac3_decoder = {
|
|||||||
.id = AV_CODEC_ID_ATRAC3,
|
.id = AV_CODEC_ID_ATRAC3,
|
||||||
.priv_data_size = sizeof(ATRAC3Context),
|
.priv_data_size = sizeof(ATRAC3Context),
|
||||||
.init = atrac3_decode_init,
|
.init = atrac3_decode_init,
|
||||||
|
.init_static_data = atrac3_init_static_data,
|
||||||
.close = atrac3_decode_close,
|
.close = atrac3_decode_close,
|
||||||
.decode = atrac3_decode_frame,
|
.decode = atrac3_decode_frame,
|
||||||
.capabilities = CODEC_CAP_SUBFRAMES | CODEC_CAP_DR1,
|
.capabilities = CODEC_CAP_SUBFRAMES | CODEC_CAP_DR1,
|
||||||
|
Reference in New Issue
Block a user