Commit e0cc66df authored by Justin Ruggles's avatar Justin Ruggles

ac3enc: split templated float vs. fixed functions into a separate file.

Function pointers are used for templated functions instead of needlessly
duplicating many functions.
parent e754dfc0
...@@ -60,8 +60,9 @@ OBJS-$(CONFIG_AAC_ENCODER) += aacenc.o aaccoder.o \ ...@@ -60,8 +60,9 @@ OBJS-$(CONFIG_AAC_ENCODER) += aacenc.o aaccoder.o \
mpeg4audio.o kbdwin.o mpeg4audio.o kbdwin.o
OBJS-$(CONFIG_AASC_DECODER) += aasc.o msrledec.o OBJS-$(CONFIG_AASC_DECODER) += aasc.o msrledec.o
OBJS-$(CONFIG_AC3_DECODER) += ac3dec.o ac3dec_data.o ac3.o kbdwin.o OBJS-$(CONFIG_AC3_DECODER) += ac3dec.o ac3dec_data.o ac3.o kbdwin.o
OBJS-$(CONFIG_AC3_ENCODER) += ac3enc_float.o ac3tab.o ac3.o kbdwin.o OBJS-$(CONFIG_AC3_ENCODER) += ac3enc_float.o ac3enc.o ac3tab.o \
OBJS-$(CONFIG_AC3_FIXED_ENCODER) += ac3enc_fixed.o ac3tab.o ac3.o ac3.o kbdwin.o
OBJS-$(CONFIG_AC3_FIXED_ENCODER) += ac3enc_fixed.o ac3enc.o ac3tab.o ac3.o
OBJS-$(CONFIG_ALAC_DECODER) += alac.o OBJS-$(CONFIG_ALAC_DECODER) += alac.o
OBJS-$(CONFIG_ALAC_ENCODER) += alacenc.o OBJS-$(CONFIG_ALAC_ENCODER) += alacenc.o
OBJS-$(CONFIG_ALS_DECODER) += alsdec.o bgmc.o mpeg4audio.o OBJS-$(CONFIG_ALS_DECODER) += alsdec.o bgmc.o mpeg4audio.o
...@@ -124,8 +125,8 @@ OBJS-$(CONFIG_DVVIDEO_DECODER) += dv.o dvdata.o ...@@ -124,8 +125,8 @@ OBJS-$(CONFIG_DVVIDEO_DECODER) += dv.o dvdata.o
OBJS-$(CONFIG_DVVIDEO_ENCODER) += dv.o dvdata.o OBJS-$(CONFIG_DVVIDEO_ENCODER) += dv.o dvdata.o
OBJS-$(CONFIG_DXA_DECODER) += dxa.o OBJS-$(CONFIG_DXA_DECODER) += dxa.o
OBJS-$(CONFIG_EAC3_DECODER) += eac3dec.o eac3dec_data.o OBJS-$(CONFIG_EAC3_DECODER) += eac3dec.o eac3dec_data.o
OBJS-$(CONFIG_EAC3_ENCODER) += eac3enc.o ac3enc_float.o ac3tab.o \ OBJS-$(CONFIG_EAC3_ENCODER) += eac3enc.o ac3enc.o ac3enc_float.o \
ac3.o kbdwin.o ac3tab.o ac3.o kbdwin.o
OBJS-$(CONFIG_EACMV_DECODER) += eacmv.o OBJS-$(CONFIG_EACMV_DECODER) += eacmv.o
OBJS-$(CONFIG_EAMAD_DECODER) += eamad.o eaidct.o mpeg12.o \ OBJS-$(CONFIG_EAMAD_DECODER) += eamad.o eaidct.o mpeg12.o \
mpeg12data.o mpegvideo.o \ mpeg12data.o mpegvideo.o \
......
This diff is collapsed.
...@@ -40,18 +40,28 @@ ...@@ -40,18 +40,28 @@
#define CONFIG_AC3ENC_FLOAT 0 #define CONFIG_AC3ENC_FLOAT 0
#endif #endif
#define OFFSET(param) offsetof(AC3EncodeContext, options.param)
#define AC3ENC_PARAM (AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
#define AC3ENC_TYPE_AC3_FIXED 0
#define AC3ENC_TYPE_AC3 1
#define AC3ENC_TYPE_EAC3 2
#if CONFIG_AC3ENC_FLOAT #if CONFIG_AC3ENC_FLOAT
#define AC3_NAME(x) ff_ac3_float_ ## x
#define MAC_COEF(d,a,b) ((d)+=(a)*(b)) #define MAC_COEF(d,a,b) ((d)+=(a)*(b))
typedef float SampleType; typedef float SampleType;
typedef float CoefType; typedef float CoefType;
typedef float CoefSumType; typedef float CoefSumType;
#else #else
#define AC3_NAME(x) ff_ac3_fixed_ ## x
#define MAC_COEF(d,a,b) MAC64(d,a,b) #define MAC_COEF(d,a,b) MAC64(d,a,b)
typedef int16_t SampleType; typedef int16_t SampleType;
typedef int32_t CoefType; typedef int32_t CoefType;
typedef int64_t CoefSumType; typedef int64_t CoefSumType;
#endif #endif
typedef struct AC3MDCTContext { typedef struct AC3MDCTContext {
const SampleType *window; ///< MDCT window function const SampleType *window; ///< MDCT window function
FFTContext fft; ///< FFT context for MDCT calculation FFTContext fft; ///< FFT context for MDCT calculation
...@@ -132,6 +142,7 @@ typedef struct AC3EncodeContext { ...@@ -132,6 +142,7 @@ typedef struct AC3EncodeContext {
AC3Block blocks[AC3_MAX_BLOCKS]; ///< per-block info AC3Block blocks[AC3_MAX_BLOCKS]; ///< per-block info
int fixed_point; ///< indicates if fixed-point encoder is being used
int eac3; ///< indicates if this is E-AC-3 vs. AC-3 int eac3; ///< indicates if this is E-AC-3 vs. AC-3
int bitstream_id; ///< bitstream id (bsid) int bitstream_id; ///< bitstream id (bsid)
int bitstream_mode; ///< bitstream mode (bsmod) int bitstream_mode; ///< bitstream mode (bsmod)
...@@ -209,7 +220,75 @@ typedef struct AC3EncodeContext { ...@@ -209,7 +220,75 @@ typedef struct AC3EncodeContext {
uint8_t *ref_bap [AC3_MAX_CHANNELS][AC3_MAX_BLOCKS]; ///< bit allocation pointers (bap) uint8_t *ref_bap [AC3_MAX_CHANNELS][AC3_MAX_BLOCKS]; ///< bit allocation pointers (bap)
int ref_bap_set; ///< indicates if ref_bap pointers have been set int ref_bap_set; ///< indicates if ref_bap pointers have been set
/* fixed vs. float function pointers */
void (*mdct_end)(AC3MDCTContext *mdct);
int (*mdct_init)(AVCodecContext *avctx, AC3MDCTContext *mdct, int nbits);
void (*apply_window)(DSPContext *dsp, SampleType *output,
const SampleType *input, const SampleType *window,
unsigned int len);
int (*normalize_samples)(struct AC3EncodeContext *s);
void (*scale_coefficients)(struct AC3EncodeContext *s);
/* fixed vs. float templated function pointers */
void (*deinterleave_input_samples)(struct AC3EncodeContext *s,
const SampleType *samples);
void (*apply_mdct)(struct AC3EncodeContext *s);
void (*apply_channel_coupling)(struct AC3EncodeContext *s);
void (*compute_rematrixing_strategy)(struct AC3EncodeContext *s);
/* AC-3 vs. E-AC-3 function pointers */
void (*output_frame_header)(struct AC3EncodeContext *s); void (*output_frame_header)(struct AC3EncodeContext *s);
} AC3EncodeContext; } AC3EncodeContext;
extern const int64_t ff_ac3_channel_layouts[19];
int ff_ac3_encode_init(AVCodecContext *avctx);
int ff_ac3_encode_frame(AVCodecContext *avctx, unsigned char *frame,
int buf_size, void *data);
int ff_ac3_encode_close(AVCodecContext *avctx);
/* prototypes for functions in ac3enc_fixed.c and ac3enc_float.c */
void ff_ac3_fixed_mdct_end(AC3MDCTContext *mdct);
void ff_ac3_float_mdct_end(AC3MDCTContext *mdct);
int ff_ac3_fixed_mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct,
int nbits);
int ff_ac3_float_mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct,
int nbits);
void ff_ac3_fixed_apply_window(DSPContext *dsp, SampleType *output,
const SampleType *input,
const SampleType *window, unsigned int len);
void ff_ac3_float_apply_window(DSPContext *dsp, SampleType *output,
const SampleType *input,
const SampleType *window, unsigned int len);
int ff_ac3_fixed_normalize_samples(AC3EncodeContext *s);
int ff_ac3_float_normalize_samples(AC3EncodeContext *s);
void ff_ac3_fixed_scale_coefficients(AC3EncodeContext *s);
void ff_ac3_float_scale_coefficients(AC3EncodeContext *s);
/* prototypes for functions in ac3enc_template.c */
void ff_ac3_fixed_deinterleave_input_samples(AC3EncodeContext *s,
const SampleType *samples);
void ff_ac3_float_deinterleave_input_samples(AC3EncodeContext *s,
const SampleType *samples);
void ff_ac3_fixed_apply_mdct(AC3EncodeContext *s);
void ff_ac3_float_apply_mdct(AC3EncodeContext *s);
void ff_ac3_fixed_apply_channel_coupling(AC3EncodeContext *s);
void ff_ac3_float_apply_channel_coupling(AC3EncodeContext *s);
void ff_ac3_fixed_compute_rematrixing_strategy(AC3EncodeContext *s);
void ff_ac3_float_compute_rematrixing_strategy(AC3EncodeContext *s);
#endif /* AVCODEC_AC3ENC_H */ #endif /* AVCODEC_AC3ENC_H */
...@@ -28,13 +28,20 @@ ...@@ -28,13 +28,20 @@
#define CONFIG_FFT_FLOAT 0 #define CONFIG_FFT_FLOAT 0
#undef CONFIG_AC3ENC_FLOAT #undef CONFIG_AC3ENC_FLOAT
#include "ac3enc.c" #include "ac3enc.h"
#define AC3ENC_TYPE AC3ENC_TYPE_AC3_FIXED
#include "ac3enc_opts_template.c"
static AVClass ac3enc_class = { "Fixed-Point AC-3 Encoder", av_default_item_name,
ac3fixed_options, LIBAVUTIL_VERSION_INT };
#include "ac3enc_template.c"
/** /**
* Finalize MDCT and free allocated memory. * Finalize MDCT and free allocated memory.
*/ */
static av_cold void mdct_end(AC3MDCTContext *mdct) av_cold void AC3_NAME(mdct_end)(AC3MDCTContext *mdct)
{ {
ff_mdct_end(&mdct->fft); ff_mdct_end(&mdct->fft);
} }
...@@ -44,7 +51,7 @@ static av_cold void mdct_end(AC3MDCTContext *mdct) ...@@ -44,7 +51,7 @@ static av_cold void mdct_end(AC3MDCTContext *mdct)
* Initialize MDCT tables. * Initialize MDCT tables.
* @param nbits log2(MDCT size) * @param nbits log2(MDCT size)
*/ */
static av_cold int mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct, av_cold int AC3_NAME(mdct_init)(AVCodecContext *avctx, AC3MDCTContext *mdct,
int nbits) int nbits)
{ {
int ret = ff_mdct_init(&mdct->fft, nbits, 0, -1.0); int ret = ff_mdct_init(&mdct->fft, nbits, 0, -1.0);
...@@ -56,8 +63,9 @@ static av_cold int mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct, ...@@ -56,8 +63,9 @@ static av_cold int mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct,
/** /**
* Apply KBD window to input samples prior to MDCT. * Apply KBD window to input samples prior to MDCT.
*/ */
static void apply_window(DSPContext *dsp, int16_t *output, const int16_t *input, void AC3_NAME(apply_window)(DSPContext *dsp, int16_t *output,
const int16_t *window, unsigned int len) const int16_t *input, const int16_t *window,
unsigned int len)
{ {
dsp->apply_window_int16(output, input, window, len); dsp->apply_window_int16(output, input, window, len);
} }
...@@ -82,7 +90,7 @@ static int log2_tab(AC3EncodeContext *s, int16_t *src, int len) ...@@ -82,7 +90,7 @@ static int log2_tab(AC3EncodeContext *s, int16_t *src, int len)
* *
* @return exponent shift * @return exponent shift
*/ */
static int normalize_samples(AC3EncodeContext *s) int AC3_NAME(normalize_samples)(AC3EncodeContext *s)
{ {
int v = 14 - log2_tab(s, s->windowed_samples, AC3_WINDOW_SIZE); int v = 14 - log2_tab(s, s->windowed_samples, AC3_WINDOW_SIZE);
if (v > 0) if (v > 0)
...@@ -95,7 +103,7 @@ static int normalize_samples(AC3EncodeContext *s) ...@@ -95,7 +103,7 @@ static int normalize_samples(AC3EncodeContext *s)
/** /**
* Scale MDCT coefficients to 25-bit signed fixed-point. * Scale MDCT coefficients to 25-bit signed fixed-point.
*/ */
static void scale_coefficients(AC3EncodeContext *s) void AC3_NAME(scale_coefficients)(AC3EncodeContext *s)
{ {
int blk, ch; int blk, ch;
...@@ -109,17 +117,25 @@ static void scale_coefficients(AC3EncodeContext *s) ...@@ -109,17 +117,25 @@ static void scale_coefficients(AC3EncodeContext *s)
} }
static av_cold int ac3_fixed_encode_init(AVCodecContext *avctx)
{
AC3EncodeContext *s = avctx->priv_data;
s->fixed_point = 1;
return ff_ac3_encode_init(avctx);
}
AVCodec ff_ac3_fixed_encoder = { AVCodec ff_ac3_fixed_encoder = {
"ac3_fixed", "ac3_fixed",
AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_AUDIO,
CODEC_ID_AC3, CODEC_ID_AC3,
sizeof(AC3EncodeContext), sizeof(AC3EncodeContext),
ac3_encode_init, ac3_fixed_encode_init,
ac3_encode_frame, ff_ac3_encode_frame,
ac3_encode_close, ff_ac3_encode_close,
NULL, NULL,
.sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE},
.long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"),
.priv_class = &ac3enc_class, .priv_class = &ac3enc_class,
.channel_layouts = ac3_channel_layouts, .channel_layouts = ff_ac3_channel_layouts,
}; };
...@@ -27,14 +27,25 @@ ...@@ -27,14 +27,25 @@
*/ */
#define CONFIG_AC3ENC_FLOAT 1 #define CONFIG_AC3ENC_FLOAT 1
#include "ac3enc.c" #include "ac3enc.h"
#include "eac3enc.h"
#include "kbdwin.h" #include "kbdwin.h"
#if CONFIG_AC3_ENCODER
#define AC3ENC_TYPE AC3ENC_TYPE_AC3
#include "ac3enc_opts_template.c"
static AVClass ac3enc_class = { "AC-3 Encoder", av_default_item_name,
ac3_options, LIBAVUTIL_VERSION_INT };
#endif
#include "ac3enc_template.c"
/** /**
* Finalize MDCT and free allocated memory. * Finalize MDCT and free allocated memory.
*/ */
static av_cold void mdct_end(AC3MDCTContext *mdct) av_cold void ff_ac3_float_mdct_end(AC3MDCTContext *mdct)
{ {
ff_mdct_end(&mdct->fft); ff_mdct_end(&mdct->fft);
av_freep(&mdct->window); av_freep(&mdct->window);
...@@ -45,7 +56,7 @@ static av_cold void mdct_end(AC3MDCTContext *mdct) ...@@ -45,7 +56,7 @@ static av_cold void mdct_end(AC3MDCTContext *mdct)
* Initialize MDCT tables. * Initialize MDCT tables.
* @param nbits log2(MDCT size) * @param nbits log2(MDCT size)
*/ */
static av_cold int mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct, av_cold int ff_ac3_float_mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct,
int nbits) int nbits)
{ {
float *window; float *window;
...@@ -71,8 +82,9 @@ static av_cold int mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct, ...@@ -71,8 +82,9 @@ static av_cold int mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct,
/** /**
* Apply KBD window to input samples prior to MDCT. * Apply KBD window to input samples prior to MDCT.
*/ */
static void apply_window(DSPContext *dsp, float *output, const float *input, void ff_ac3_float_apply_window(DSPContext *dsp, float *output,
const float *window, unsigned int len) const float *input, const float *window,
unsigned int len)
{ {
dsp->vector_fmul(output, input, window, len); dsp->vector_fmul(output, input, window, len);
} }
...@@ -81,7 +93,7 @@ static void apply_window(DSPContext *dsp, float *output, const float *input, ...@@ -81,7 +93,7 @@ static void apply_window(DSPContext *dsp, float *output, const float *input,
/** /**
* Normalize the input samples to use the maximum available precision. * Normalize the input samples to use the maximum available precision.
*/ */
static int normalize_samples(AC3EncodeContext *s) int ff_ac3_float_normalize_samples(AC3EncodeContext *s)
{ {
/* Normalization is not needed for floating-point samples, so just return 0 */ /* Normalization is not needed for floating-point samples, so just return 0 */
return 0; return 0;
...@@ -91,7 +103,7 @@ static int normalize_samples(AC3EncodeContext *s) ...@@ -91,7 +103,7 @@ static int normalize_samples(AC3EncodeContext *s)
/** /**
* Scale MDCT coefficients from float to 24-bit fixed-point. * Scale MDCT coefficients from float to 24-bit fixed-point.
*/ */
static void scale_coefficients(AC3EncodeContext *s) void ff_ac3_float_scale_coefficients(AC3EncodeContext *s)
{ {
int chan_size = AC3_MAX_COEFS * AC3_MAX_BLOCKS; int chan_size = AC3_MAX_COEFS * AC3_MAX_BLOCKS;
s->ac3dsp.float_to_fixed24(s->fixed_coef_buffer + chan_size, s->ac3dsp.float_to_fixed24(s->fixed_coef_buffer + chan_size,
...@@ -106,29 +118,13 @@ AVCodec ff_ac3_encoder = { ...@@ -106,29 +118,13 @@ AVCodec ff_ac3_encoder = {
AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_AUDIO,
CODEC_ID_AC3, CODEC_ID_AC3,
sizeof(AC3EncodeContext), sizeof(AC3EncodeContext),
ac3_encode_init, ff_ac3_encode_init,
ac3_encode_frame, ff_ac3_encode_frame,
ac3_encode_close, ff_ac3_encode_close,
NULL, NULL,
.sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE}, .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE},
.long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"),
.priv_class = &ac3enc_class, .priv_class = &ac3enc_class,
.channel_layouts = ac3_channel_layouts, .channel_layouts = ff_ac3_channel_layouts,
};
#endif
#if CONFIG_EAC3_ENCODER
AVCodec ff_eac3_encoder = {
.name = "eac3",
.type = AVMEDIA_TYPE_AUDIO,
.id = CODEC_ID_EAC3,
.priv_data_size = sizeof(AC3EncodeContext),
.init = ac3_encode_init,
.encode = ac3_encode_frame,
.close = ac3_encode_close,
.sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE},
.long_name = NULL_IF_CONFIG_SMALL("ATSC A/52 E-AC-3"),
.priv_class = &eac3enc_class,
.channel_layouts = ac3_channel_layouts,
}; };
#endif #endif
...@@ -19,6 +19,9 @@ ...@@ -19,6 +19,9 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include "libavutil/opt.h"
#include "ac3.h"
#if AC3ENC_TYPE == AC3ENC_TYPE_AC3_FIXED #if AC3ENC_TYPE == AC3ENC_TYPE_AC3_FIXED
static const AVOption ac3fixed_options[] = { static const AVOption ac3fixed_options[] = {
#elif AC3ENC_TYPE == AC3ENC_TYPE_AC3 #elif AC3ENC_TYPE == AC3ENC_TYPE_AC3
......
This diff is collapsed.
...@@ -28,6 +28,13 @@ ...@@ -28,6 +28,13 @@
#include "ac3enc.h" #include "ac3enc.h"
#include "eac3enc.h" #include "eac3enc.h"
#define AC3ENC_TYPE AC3ENC_TYPE_EAC3
#include "ac3enc_opts_template.c"
static AVClass eac3enc_class = { "E-AC-3 Encoder", av_default_item_name,
eac3_options, LIBAVUTIL_VERSION_INT };
void ff_eac3_set_cpl_states(AC3EncodeContext *s) void ff_eac3_set_cpl_states(AC3EncodeContext *s)
{ {
int ch, blk; int ch, blk;
...@@ -129,3 +136,20 @@ void ff_eac3_output_frame_header(AC3EncodeContext *s) ...@@ -129,3 +136,20 @@ void ff_eac3_output_frame_header(AC3EncodeContext *s)
/* block start info */ /* block start info */
put_bits(&s->pb, 1, 0); put_bits(&s->pb, 1, 0);
} }
#if CONFIG_EAC3_ENCODER
AVCodec ff_eac3_encoder = {
.name = "eac3",
.type = AVMEDIA_TYPE_AUDIO,
.id = CODEC_ID_EAC3,
.priv_data_size = sizeof(AC3EncodeContext),
.init = ff_ac3_encode_init,
.encode = ff_ac3_encode_frame,
.close = ff_ac3_encode_close,
.sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE},
.long_name = NULL_IF_CONFIG_SMALL("ATSC A/52 E-AC-3"),
.priv_class = &eac3enc_class,
.channel_layouts = ff_ac3_channel_layouts,
};
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment