[FFmpeg-cvslog] r25962 - trunk/libavcodec/ac3enc.c
jbr
subversion
Tue Dec 14 15:51:23 CET 2010
Author: jbr
Date: Tue Dec 14 15:51:23 2010
New Revision: 25962
Log:
cosmetics: rearrange some functions/typedefs/macros
Modified:
trunk/libavcodec/ac3enc.c
Modified: trunk/libavcodec/ac3enc.c
==============================================================================
--- trunk/libavcodec/ac3enc.c Tue Dec 14 15:51:20 2010 (r25961)
+++ trunk/libavcodec/ac3enc.c Tue Dec 14 15:51:23 2010 (r25962)
@@ -33,8 +33,17 @@
#include "ac3.h"
#include "audioconvert.h"
+#define MDCT_NBITS 9
+#define MDCT_SAMPLES (1 << MDCT_NBITS)
+
#define SCALE_FLOAT(a, bits) lrintf((a) * (float)(1 << (bits)))
+#define FIX15(a) av_clip_int16(SCALE_FLOAT(a, 15))
+
+typedef struct IComplex {
+ int16_t re,im;
+} IComplex;
+
typedef struct AC3EncodeContext {
PutBitContext pb; ///< bitstream writer context
@@ -82,15 +91,6 @@ static int16_t sintab[64];
static int16_t xcos1[128];
static int16_t xsin1[128];
-#define MDCT_NBITS 9
-#define MDCT_SAMPLES (1 << MDCT_NBITS)
-
-#define FIX15(a) av_clip_int16(SCALE_FLOAT(a, 15))
-
-typedef struct IComplex {
- int16_t re,im;
-} IComplex;
-
static av_cold void fft_init(int ln)
{
int i, n, n2;
@@ -241,6 +241,32 @@ static void mdct512(int32_t *out, int16_
}
}
+/* compute log2(max(abs(tab[]))) */
+static int log2_tab(int16_t *tab, int n)
+{
+ int i, v;
+
+ v = 0;
+ for (i = 0; i < n; i++)
+ v |= abs(tab[i]);
+
+ return av_log2(v);
+}
+
+static void lshift_tab(int16_t *tab, int n, int lshift)
+{
+ int i;
+
+ if (lshift > 0) {
+ for(i = 0; i < n; i++)
+ tab[i] <<= lshift;
+ } else if (lshift < 0) {
+ lshift = -lshift;
+ for (i = 0; i < n; i++)
+ tab[i] >>= lshift;
+ }
+}
+
static int calc_exp_diff(uint8_t *exp1, uint8_t *exp2, int n)
{
int sum, i;
@@ -571,131 +597,6 @@ static int compute_bit_allocation(AC3Enc
return 0;
}
-static av_cold int set_channel_info(AC3EncodeContext *s, int channels,
- int64_t *channel_layout)
-{
- int ch_layout;
-
- if (channels < 1 || channels > AC3_MAX_CHANNELS)
- return -1;
- if ((uint64_t)*channel_layout > 0x7FF)
- return -1;
- ch_layout = *channel_layout;
- if (!ch_layout)
- ch_layout = avcodec_guess_channel_layout(channels, CODEC_ID_AC3, NULL);
- if (av_get_channel_layout_nb_channels(ch_layout) != channels)
- return -1;
-
- s->lfe_on = !!(ch_layout & AV_CH_LOW_FREQUENCY);
- s->channels = channels;
- s->fbw_channels = channels - s->lfe_on;
- s->lfe_channel = s->lfe_on ? s->fbw_channels : -1;
- if (s->lfe_on)
- ch_layout -= AV_CH_LOW_FREQUENCY;
-
- switch (ch_layout) {
- case AV_CH_LAYOUT_MONO: s->channel_mode = AC3_CHMODE_MONO; break;
- case AV_CH_LAYOUT_STEREO: s->channel_mode = AC3_CHMODE_STEREO; break;
- case AV_CH_LAYOUT_SURROUND: s->channel_mode = AC3_CHMODE_3F; break;
- case AV_CH_LAYOUT_2_1: s->channel_mode = AC3_CHMODE_2F1R; break;
- case AV_CH_LAYOUT_4POINT0: s->channel_mode = AC3_CHMODE_3F1R; break;
- case AV_CH_LAYOUT_QUAD:
- case AV_CH_LAYOUT_2_2: s->channel_mode = AC3_CHMODE_2F2R; break;
- case AV_CH_LAYOUT_5POINT0:
- case AV_CH_LAYOUT_5POINT0_BACK: s->channel_mode = AC3_CHMODE_3F2R; break;
- default:
- return -1;
- }
-
- s->channel_map = ff_ac3_enc_channel_map[s->channel_mode][s->lfe_on];
- *channel_layout = ch_layout;
- if (s->lfe_on)
- *channel_layout |= AV_CH_LOW_FREQUENCY;
-
- return 0;
-}
-
-static av_cold int AC3_encode_init(AVCodecContext *avctx)
-{
- int freq = avctx->sample_rate;
- int bitrate = avctx->bit_rate;
- AC3EncodeContext *s = avctx->priv_data;
- int i, j, ch;
- int bw_code;
-
- avctx->frame_size = AC3_FRAME_SIZE;
-
- ac3_common_init();
-
- if (!avctx->channel_layout) {
- av_log(avctx, AV_LOG_WARNING, "No channel layout specified. The "
- "encoder will guess the layout, but it "
- "might be incorrect.\n");
- }
- if (set_channel_info(s, avctx->channels, &avctx->channel_layout)) {
- av_log(avctx, AV_LOG_ERROR, "invalid channel layout\n");
- return -1;
- }
-
- /* frequency */
- for (i = 0; i < 3; i++) {
- for (j = 0; j < 3; j++)
- if ((ff_ac3_sample_rate_tab[j] >> i) == freq)
- goto found;
- }
- return -1;
- found:
- s->sample_rate = freq;
- s->bit_alloc.sr_shift = i;
- s->bit_alloc.sr_code = j;
- s->bitstream_id = 8 + s->bit_alloc.sr_shift;
- s->bitstream_mode = 0; /* complete main audio service */
-
- /* bitrate & frame size */
- for (i = 0; i < 19; i++) {
- if ((ff_ac3_bitrate_tab[i] >> s->bit_alloc.sr_shift)*1000 == bitrate)
- break;
- }
- if (i == 19)
- return -1;
- s->bit_rate = bitrate;
- s->frame_size_code = i << 1;
- s->frame_size_min = ff_ac3_frame_size_tab[s->frame_size_code][s->bit_alloc.sr_code];
- s->bits_written = 0;
- s->samples_written = 0;
- s->frame_size = s->frame_size_min;
-
- /* set bandwidth */
- if(avctx->cutoff) {
- /* calculate bandwidth based on user-specified cutoff frequency */
- int cutoff = av_clip(avctx->cutoff, 1, s->sample_rate >> 1);
- int fbw_coeffs = cutoff * 2 * AC3_MAX_COEFS / s->sample_rate;
- bw_code = av_clip((fbw_coeffs - 73) / 3, 0, 60);
- } else {
- /* use default bandwidth setting */
- /* XXX: should compute the bandwidth according to the frame
- size, so that we avoid annoying high frequency artifacts */
- bw_code = 50;
- }
- for(ch=0;ch<s->fbw_channels;ch++) {
- /* bandwidth for each channel */
- s->bandwidth_code[ch] = bw_code;
- s->nb_coefs[ch] = bw_code * 3 + 73;
- }
- if (s->lfe_on)
- s->nb_coefs[s->lfe_channel] = 7; /* LFE channel always has 7 coefs */
-
- /* initial snr offset */
- s->coarse_snr_offset = 40;
-
- mdct_init(9);
-
- avctx->coded_frame= avcodec_alloc_frame();
- avctx->coded_frame->key_frame= 1;
-
- return 0;
-}
-
/* output the AC-3 frame header */
static void output_frame_header(AC3EncodeContext *s, unsigned char *frame)
{
@@ -1027,33 +928,6 @@ static unsigned int pow_poly(unsigned in
return r;
}
-
-/* compute log2(max(abs(tab[]))) */
-static int log2_tab(int16_t *tab, int n)
-{
- int i, v;
-
- v = 0;
- for (i = 0; i < n; i++)
- v |= abs(tab[i]);
-
- return av_log2(v);
-}
-
-static void lshift_tab(int16_t *tab, int n, int lshift)
-{
- int i;
-
- if (lshift > 0) {
- for(i = 0; i < n; i++)
- tab[i] <<= lshift;
- } else if (lshift < 0) {
- lshift = -lshift;
- for (i = 0; i < n; i++)
- tab[i] >>= lshift;
- }
-}
-
/* fill the end of the frame and compute the two crcs */
static int output_frame_end(AC3EncodeContext *s)
{
@@ -1209,6 +1083,131 @@ static av_cold int AC3_encode_close(AVCo
return 0;
}
+static av_cold int set_channel_info(AC3EncodeContext *s, int channels,
+ int64_t *channel_layout)
+{
+ int ch_layout;
+
+ if (channels < 1 || channels > AC3_MAX_CHANNELS)
+ return -1;
+ if ((uint64_t)*channel_layout > 0x7FF)
+ return -1;
+ ch_layout = *channel_layout;
+ if (!ch_layout)
+ ch_layout = avcodec_guess_channel_layout(channels, CODEC_ID_AC3, NULL);
+ if (av_get_channel_layout_nb_channels(ch_layout) != channels)
+ return -1;
+
+ s->lfe_on = !!(ch_layout & AV_CH_LOW_FREQUENCY);
+ s->channels = channels;
+ s->fbw_channels = channels - s->lfe_on;
+ s->lfe_channel = s->lfe_on ? s->fbw_channels : -1;
+ if (s->lfe_on)
+ ch_layout -= AV_CH_LOW_FREQUENCY;
+
+ switch (ch_layout) {
+ case AV_CH_LAYOUT_MONO: s->channel_mode = AC3_CHMODE_MONO; break;
+ case AV_CH_LAYOUT_STEREO: s->channel_mode = AC3_CHMODE_STEREO; break;
+ case AV_CH_LAYOUT_SURROUND: s->channel_mode = AC3_CHMODE_3F; break;
+ case AV_CH_LAYOUT_2_1: s->channel_mode = AC3_CHMODE_2F1R; break;
+ case AV_CH_LAYOUT_4POINT0: s->channel_mode = AC3_CHMODE_3F1R; break;
+ case AV_CH_LAYOUT_QUAD:
+ case AV_CH_LAYOUT_2_2: s->channel_mode = AC3_CHMODE_2F2R; break;
+ case AV_CH_LAYOUT_5POINT0:
+ case AV_CH_LAYOUT_5POINT0_BACK: s->channel_mode = AC3_CHMODE_3F2R; break;
+ default:
+ return -1;
+ }
+
+ s->channel_map = ff_ac3_enc_channel_map[s->channel_mode][s->lfe_on];
+ *channel_layout = ch_layout;
+ if (s->lfe_on)
+ *channel_layout |= AV_CH_LOW_FREQUENCY;
+
+ return 0;
+}
+
+static av_cold int AC3_encode_init(AVCodecContext *avctx)
+{
+ int freq = avctx->sample_rate;
+ int bitrate = avctx->bit_rate;
+ AC3EncodeContext *s = avctx->priv_data;
+ int i, j, ch;
+ int bw_code;
+
+ avctx->frame_size = AC3_FRAME_SIZE;
+
+ ac3_common_init();
+
+ if (!avctx->channel_layout) {
+ av_log(avctx, AV_LOG_WARNING, "No channel layout specified. The "
+ "encoder will guess the layout, but it "
+ "might be incorrect.\n");
+ }
+ if (set_channel_info(s, avctx->channels, &avctx->channel_layout)) {
+ av_log(avctx, AV_LOG_ERROR, "invalid channel layout\n");
+ return -1;
+ }
+
+ /* frequency */
+ for (i = 0; i < 3; i++) {
+ for (j = 0; j < 3; j++)
+ if ((ff_ac3_sample_rate_tab[j] >> i) == freq)
+ goto found;
+ }
+ return -1;
+ found:
+ s->sample_rate = freq;
+ s->bit_alloc.sr_shift = i;
+ s->bit_alloc.sr_code = j;
+ s->bitstream_id = 8 + s->bit_alloc.sr_shift;
+ s->bitstream_mode = 0; /* complete main audio service */
+
+ /* bitrate & frame size */
+ for (i = 0; i < 19; i++) {
+ if ((ff_ac3_bitrate_tab[i] >> s->bit_alloc.sr_shift)*1000 == bitrate)
+ break;
+ }
+ if (i == 19)
+ return -1;
+ s->bit_rate = bitrate;
+ s->frame_size_code = i << 1;
+ s->frame_size_min = ff_ac3_frame_size_tab[s->frame_size_code][s->bit_alloc.sr_code];
+ s->bits_written = 0;
+ s->samples_written = 0;
+ s->frame_size = s->frame_size_min;
+
+ /* set bandwidth */
+ if(avctx->cutoff) {
+ /* calculate bandwidth based on user-specified cutoff frequency */
+ int cutoff = av_clip(avctx->cutoff, 1, s->sample_rate >> 1);
+ int fbw_coeffs = cutoff * 2 * AC3_MAX_COEFS / s->sample_rate;
+ bw_code = av_clip((fbw_coeffs - 73) / 3, 0, 60);
+ } else {
+ /* use default bandwidth setting */
+ /* XXX: should compute the bandwidth according to the frame
+ size, so that we avoid annoying high frequency artifacts */
+ bw_code = 50;
+ }
+ for(ch=0;ch<s->fbw_channels;ch++) {
+ /* bandwidth for each channel */
+ s->bandwidth_code[ch] = bw_code;
+ s->nb_coefs[ch] = bw_code * 3 + 73;
+ }
+ if (s->lfe_on)
+ s->nb_coefs[s->lfe_channel] = 7; /* LFE channel always has 7 coefs */
+
+ /* initial snr offset */
+ s->coarse_snr_offset = 40;
+
+ mdct_init(9);
+
+ avctx->coded_frame= avcodec_alloc_frame();
+ avctx->coded_frame->key_frame= 1;
+
+ return 0;
+}
+
#ifdef TEST
/*************************************************************************/
/* TEST */
More information about the ffmpeg-cvslog
mailing list