*/
/**
- * @file libavcodec/mpegaudio.c
+ * @file
* The simplest mpeg audio layer 2 encoder.
*/
#include "avcodec.h"
+#include "internal.h"
#include "put_bits.h"
-#undef CONFIG_MPEGAUDIO_HP
-#define CONFIG_MPEGAUDIO_HP 0
+#define FRAC_BITS 15 /* fractional bits for sb_samples and dct */
+#define WFRAC_BITS 14 /* fractional bits for window */
+
#include "mpegaudio.h"
/* currently, cannot change these constants (need to modify
typedef struct MpegAudioContext {
PutBitContext pb;
int nb_channels;
- int freq, bit_rate;
int lsf; /* 1 if mpeg2 low bitrate selected */
int bitrate_index; /* bit rate */
int freq_index;
int frame_size; /* frame size, in bits, without padding */
- int64_t nb_samples; /* total number of samples encoded */
/* padding computation */
int frame_frac, frame_frac_incr, do_padding;
short samples_buf[MPA_MAX_CHANNELS][SAMPLES_BUF_SIZE]; /* buffer for filter */
} MpegAudioContext;
/* define it to use floats in quantization (I don't like floats !) */
-//#define USE_FLOATS
+#define USE_FLOATS
#include "mpegaudiodata.h"
#include "mpegaudiotab.h"
}
bitrate = bitrate / 1000;
s->nb_channels = channels;
- s->freq = freq;
- s->bit_rate = bitrate * 1000;
avctx->frame_size = MPA_FRAME_SIZE;
/* encoding freq */
s->sblimit = ff_mpa_sblimit_table[table];
s->alloc_table = ff_mpa_alloc_tables[table];
-#ifdef DEBUG
- av_log(avctx, AV_LOG_DEBUG, "%d kb/s, %d Hz, frame_size=%d bits, table=%d, padincr=%x\n",
- bitrate, freq, s->frame_size, table, s->frame_frac_incr);
-#endif
+ av_dlog(avctx, "%d kb/s, %d Hz, frame_size=%d bits, table=%d, padincr=%x\n",
+ bitrate, freq, s->frame_size, table, s->frame_frac_incr);
for(i=0;i<s->nb_channels;i++)
s->samples_offset[i] = 0;
#define WSHIFT (WFRAC_BITS + 15 - FRAC_BITS)
-static void filter(MpegAudioContext *s, int ch, short *samples, int incr)
+static void filter(MpegAudioContext *s, int ch, const short *samples, int incr)
{
short *p, *q;
int sum, offset, i, j;
int tmp1[32];
int *out;
- // print_pow1(samples, 1152);
-
offset = s->samples_offset[ch];
out = &s->sb_samples[ch][0][0][0];
for(j=0;j<36;j++) {
}
}
s->samples_offset[ch] = offset;
-
- // print_pow(s->sb_samples, 1152);
}
static void compute_scale_factors(unsigned char scale_code[SBLIMIT],
}
}
}
-#if 0
- printf("current=%d max=%d max_sb=%d alloc=%d\n",
- current_frame_size, max_frame_size, max_sb,
- bit_alloc[max_sb]);
-#endif
if (max_sb < 0)
break;
+ av_dlog(NULL, "current=%d max=%d max_sb=%d max_ch=%d alloc=%d\n",
+ current_frame_size, max_frame_size, max_sb, max_ch,
+ bit_alloc[max_ch][max_sb]);
/* find alloc table entry (XXX: not optimal, should use
pointer table) */
}
*padding = max_frame_size - current_frame_size;
assert(*padding >= 0);
-
-#if 0
- for(i=0;i<s->sblimit;i++) {
- printf("%d ", bit_alloc[i]);
- }
- printf("\n");
-#endif
}
/*
/* group the 3 values to save bits */
put_bits(p, -bits,
q[0] + steps * (q[1] + steps * q[2]));
-#if 0
- printf("%d: gr1 %d\n",
- i, q[0] + steps * (q[1] + steps * q[2]));
-#endif
} else {
-#if 0
- printf("%d: gr3 %d %d %d\n",
- i, q[0], q[1], q[2]);
-#endif
put_bits(p, bits, q[0]);
put_bits(p, bits, q[1]);
put_bits(p, bits, q[2]);
unsigned char *frame, int buf_size, void *data)
{
MpegAudioContext *s = avctx->priv_data;
- short *samples = data;
+ const short *samples = data;
short smr[MPA_MAX_CHANNELS][SBLIMIT];
unsigned char bit_alloc[MPA_MAX_CHANNELS][SBLIMIT];
int padding, i;
encode_frame(s, bit_alloc, padding);
- s->nb_samples += MPA_FRAME_SIZE;
- return pbBufPtr(&s->pb) - s->pb.buf;
+ return put_bits_ptr(&s->pb) - s->pb.buf;
}
static av_cold int MPA_encode_close(AVCodecContext *avctx)
return 0;
}
-AVCodec mp2_encoder = {
- "mp2",
- CODEC_TYPE_AUDIO,
- CODEC_ID_MP2,
- sizeof(MpegAudioContext),
- MPA_encode_init,
- MPA_encode_frame,
- MPA_encode_close,
- NULL,
- .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE},
- .long_name = NULL_IF_CONFIG_SMALL("MP2 (MPEG audio layer 2)"),
+static const AVCodecDefault mp2_defaults[] = {
+ { "b", "128k" },
+ { NULL },
};
-#undef FIX
+AVCodec ff_mp2_encoder = {
+ .name = "mp2",
+ .type = AVMEDIA_TYPE_AUDIO,
+ .id = CODEC_ID_MP2,
+ .priv_data_size = sizeof(MpegAudioContext),
+ .init = MPA_encode_init,
+ .encode = MPA_encode_frame,
+ .close = MPA_encode_close,
+ .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE},
+ .supported_samplerates= (const int[]){44100, 48000, 32000, 22050, 24000, 16000, 0},
+ .long_name = NULL_IF_CONFIG_SMALL("MP2 (MPEG audio layer 2)"),
+ .defaults = mp2_defaults,
+};