mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Merge remote-tracking branch 'qatar/master'
* qatar/master: qdm2: Use floating point synthesis filter. h264: correct border check. h264: fix loopfilter with threading at slice boundaries. Fix ff_mpa_synth_filter_fixed() prototype Rename costablegen.c ---> cos_tablegen.c. Collapse tableprint.c into tableprint.h. Simplify trig table rules Remove potentially unstable filenames from comments in generated files. Ignore generated tables and generated table generator programs. Simplify CLEANFILES make variable by using wildcards. Remove silly insults from avformat_version() Doxygen documentation. mpegaudiodsp: fix x86 and ppc makefiles configure: Adjust AVX assembler check. mpegaudio: remove unused version of SAME_HEADER_MASK mpegaudio: remove useless #undef at end of file asfdec: add missing #include for av_bswap32() mpegaudio: merge two #if CONFIG_FLOAT blocks mpegaudio: move some struct definitions from mpegaudio.h Move some mpegaudio functions to new mpegaudiodsp subsystem Conflicts: libavcodec/h264.c libavcodec/x86/Makefile Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
80d156d7fd
3
.gitignore
vendored
3
.gitignore
vendored
@ -16,6 +16,9 @@ ffmpeg
|
|||||||
ffplay
|
ffplay
|
||||||
ffprobe
|
ffprobe
|
||||||
ffserver
|
ffserver
|
||||||
|
libavcodec/*_tablegen
|
||||||
|
libavcodec/*_tables.c
|
||||||
|
libavcodec/*_tables.h
|
||||||
libavcodec/libavcodec*
|
libavcodec/libavcodec*
|
||||||
libavcore/libavcore*
|
libavcore/libavcore*
|
||||||
libavdevice/libavdevice*
|
libavdevice/libavdevice*
|
||||||
|
21
configure
vendored
21
configure
vendored
@ -956,6 +956,7 @@ CONFIG_LIST="
|
|||||||
mdct
|
mdct
|
||||||
memalign_hack
|
memalign_hack
|
||||||
mlib
|
mlib
|
||||||
|
mpegaudiodsp
|
||||||
network
|
network
|
||||||
nonfree
|
nonfree
|
||||||
pic
|
pic
|
||||||
@ -1244,6 +1245,7 @@ symver_if_any="symver_asm_label symver_gnu_asm"
|
|||||||
dct_select="rdft"
|
dct_select="rdft"
|
||||||
mdct_select="fft"
|
mdct_select="fft"
|
||||||
rdft_select="fft"
|
rdft_select="fft"
|
||||||
|
mpegaudiodsp_select="dct"
|
||||||
|
|
||||||
# decoders / encoders / hardware accelerators
|
# decoders / encoders / hardware accelerators
|
||||||
aac_decoder_select="mdct sinewin"
|
aac_decoder_select="mdct sinewin"
|
||||||
@ -1297,11 +1299,16 @@ ljpeg_encoder_select="aandct"
|
|||||||
loco_decoder_select="golomb"
|
loco_decoder_select="golomb"
|
||||||
mjpeg_encoder_select="aandct"
|
mjpeg_encoder_select="aandct"
|
||||||
mlp_decoder_select="mlp_parser"
|
mlp_decoder_select="mlp_parser"
|
||||||
mp1float_decoder_select="dct"
|
mp1_decoder_select="mpegaudiodsp"
|
||||||
mp2float_decoder_select="dct"
|
mp2_decoder_select="mpegaudiodsp"
|
||||||
mp3adufloat_decoder_select="dct"
|
mp3adu_decoder_select="mpegaudiodsp"
|
||||||
mp3float_decoder_select="dct"
|
mp3_decoder_select="mpegaudiodsp"
|
||||||
mp3on4float_decoder_select="dct"
|
mp3on4_decoder_select="mpegaudiodsp"
|
||||||
|
mp1float_decoder_select="mpegaudiodsp"
|
||||||
|
mp2float_decoder_select="mpegaudiodsp"
|
||||||
|
mp3adufloat_decoder_select="mpegaudiodsp"
|
||||||
|
mp3float_decoder_select="mpegaudiodsp"
|
||||||
|
mp3on4float_decoder_select="mpegaudiodsp"
|
||||||
mpeg1video_encoder_select="aandct"
|
mpeg1video_encoder_select="aandct"
|
||||||
mpeg2video_encoder_select="aandct"
|
mpeg2video_encoder_select="aandct"
|
||||||
mpeg4_decoder_select="h263_decoder mpeg4video_parser"
|
mpeg4_decoder_select="h263_decoder mpeg4video_parser"
|
||||||
@ -1331,7 +1338,7 @@ nellymoser_encoder_select="mdct sinewin"
|
|||||||
png_decoder_select="zlib"
|
png_decoder_select="zlib"
|
||||||
png_encoder_select="zlib"
|
png_encoder_select="zlib"
|
||||||
qcelp_decoder_select="lsp"
|
qcelp_decoder_select="lsp"
|
||||||
qdm2_decoder_select="mdct rdft"
|
qdm2_decoder_select="mdct rdft mpegaudiodsp"
|
||||||
ra_144_encoder_select="lpc"
|
ra_144_encoder_select="lpc"
|
||||||
rv10_decoder_select="h263_decoder"
|
rv10_decoder_select="h263_decoder"
|
||||||
rv10_encoder_select="h263_encoder"
|
rv10_encoder_select="h263_encoder"
|
||||||
@ -2753,7 +2760,7 @@ EOF
|
|||||||
|
|
||||||
check_yasm "pextrd [eax], xmm0, 1" && enable yasm ||
|
check_yasm "pextrd [eax], xmm0, 1" && enable yasm ||
|
||||||
die "yasm not found, use --disable-yasm for a crippled build"
|
die "yasm not found, use --disable-yasm for a crippled build"
|
||||||
check_yasm "vpaddw xmm0, xmm0, xmm0" || disable avx
|
check_yasm "vextractf128 xmm0, ymm0, 0" || disable avx
|
||||||
fi
|
fi
|
||||||
|
|
||||||
case "$cpu" in
|
case "$cpu" in
|
||||||
|
@ -41,6 +41,9 @@ OBJS-$(CONFIG_HUFFMAN) += huffman.o
|
|||||||
OBJS-$(CONFIG_LPC) += lpc.o
|
OBJS-$(CONFIG_LPC) += lpc.o
|
||||||
OBJS-$(CONFIG_LSP) += lsp.o
|
OBJS-$(CONFIG_LSP) += lsp.o
|
||||||
OBJS-$(CONFIG_MDCT) += mdct_fixed.o mdct_float.o
|
OBJS-$(CONFIG_MDCT) += mdct_fixed.o mdct_float.o
|
||||||
|
OBJS-$(CONFIG_MPEGAUDIODSP) += mpegaudiodsp.o \
|
||||||
|
mpegaudiodsp_fixed.o \
|
||||||
|
mpegaudiodsp_float.o
|
||||||
RDFT-OBJS-$(CONFIG_HARDCODED_TABLES) += sin_tables.o
|
RDFT-OBJS-$(CONFIG_HARDCODED_TABLES) += sin_tables.o
|
||||||
OBJS-$(CONFIG_RDFT) += rdft.o $(RDFT-OBJS-yes)
|
OBJS-$(CONFIG_RDFT) += rdft.o $(RDFT-OBJS-yes)
|
||||||
OBJS-$(CONFIG_SINEWIN) += sinewin.o
|
OBJS-$(CONFIG_SINEWIN) += sinewin.o
|
||||||
@ -676,24 +679,23 @@ TESTPROGS = cabac dct eval fft fft-fixed h264 iirfilter rangecoder snow
|
|||||||
TESTPROGS-$(HAVE_MMX) += motion
|
TESTPROGS-$(HAVE_MMX) += motion
|
||||||
TESTOBJS = dctref.o
|
TESTOBJS = dctref.o
|
||||||
|
|
||||||
HOSTPROGS = costablegen
|
HOSTPROGS = aac_tablegen aacps_tablegen cbrt_tablegen cos_tablegen \
|
||||||
|
dv_tablegen motionpixels_tablegen mpegaudio_tablegen \
|
||||||
|
pcm_tablegen qdm2_tablegen sinewin_tablegen
|
||||||
|
|
||||||
DIRS = alpha arm bfin mlib ppc ps2 sh4 sparc x86
|
DIRS = alpha arm bfin mlib ppc ps2 sh4 sparc x86
|
||||||
|
|
||||||
CLEANFILES = sin_tables.c cos_tables.c *_tables.h *_tablegen$(HOSTEXESUF)
|
CLEANFILES = *_tables.c *_tables.h *_tablegen$(HOSTEXESUF)
|
||||||
|
|
||||||
include $(SUBDIR)../subdir.mak
|
include $(SUBDIR)../subdir.mak
|
||||||
|
|
||||||
$(SUBDIR)dct-test$(EXESUF): $(SUBDIR)dctref.o
|
$(SUBDIR)dct-test$(EXESUF): $(SUBDIR)dctref.o
|
||||||
|
|
||||||
$(SUBDIR)cos_tables.c: $(SUBDIR)costablegen$(HOSTEXESUF)
|
TRIG_TABLES = cos cos_fixed sin
|
||||||
$(M)./$< > $@
|
TRIG_TABLES := $(TRIG_TABLES:%=$(SUBDIR)%_tables.c)
|
||||||
|
|
||||||
$(SUBDIR)cos_fixed_tables.c: $(SUBDIR)costablegen$(HOSTEXESUF)
|
$(TRIG_TABLES): $(SUBDIR)%_tables.c: $(SUBDIR)cos_tablegen$(HOSTEXESUF)
|
||||||
$(M)./$< cos fixed > $@
|
$(M)./$< $* > $@
|
||||||
|
|
||||||
$(SUBDIR)sin_tables.c: $(SUBDIR)costablegen$(HOSTEXESUF)
|
|
||||||
$(M)./$< sin > $@
|
|
||||||
|
|
||||||
ifdef CONFIG_SMALL
|
ifdef CONFIG_SMALL
|
||||||
$(SUBDIR)%_tablegen$(HOSTEXESUF): HOSTCFLAGS += -DCONFIG_SMALL=1
|
$(SUBDIR)%_tablegen$(HOSTEXESUF): HOSTCFLAGS += -DCONFIG_SMALL=1
|
||||||
@ -701,9 +703,6 @@ else
|
|||||||
$(SUBDIR)%_tablegen$(HOSTEXESUF): HOSTCFLAGS += -DCONFIG_SMALL=0
|
$(SUBDIR)%_tablegen$(HOSTEXESUF): HOSTCFLAGS += -DCONFIG_SMALL=0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(SUBDIR)%_tablegen$(HOSTEXESUF): $(SUBDIR)%_tablegen.c $(SUBDIR)%_tablegen.h $(SUBDIR)tableprint.c
|
|
||||||
$(HOSTCC) $(HOSTCFLAGS) $(HOSTLDFLAGS) -o $@ $(filter %.c,$^) $(HOSTLIBS)
|
|
||||||
|
|
||||||
GEN_HEADERS = cbrt_tables.h aacps_tables.h aac_tables.h dv_tables.h \
|
GEN_HEADERS = cbrt_tables.h aacps_tables.h aac_tables.h dv_tables.h \
|
||||||
sinewin_tables.h mpegaudio_tables.h motionpixels_tables.h \
|
sinewin_tables.h mpegaudio_tables.h motionpixels_tables.h \
|
||||||
pcm_tables.h qdm2_tables.h
|
pcm_tables.h qdm2_tables.h
|
||||||
|
@ -51,10 +51,10 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
int do_sin = argc > 1 && !strcmp(argv[1], "sin");
|
int do_sin = argc > 1 && !strcmp(argv[1], "sin");
|
||||||
int fixed = argc > 2 && !strcmp(argv[2], "fixed");
|
int fixed = argc > 1 && strstr(argv[1], "fixed");
|
||||||
double (*func)(double) = do_sin ? sin : cos;
|
double (*func)(double) = do_sin ? sin : cos;
|
||||||
|
|
||||||
printf("/* This file was generated by libavcodec/costablegen */\n");
|
printf("/* This file was automatically generated. */\n");
|
||||||
printf("#define CONFIG_FFT_FLOAT %d\n", !fixed);
|
printf("#define CONFIG_FFT_FLOAT %d\n", !fixed);
|
||||||
printf("#include \"libavcodec/%s\"\n", do_sin ? "rdft.h" : "fft.h");
|
printf("#include \"libavcodec/%s\"\n", do_sin ? "rdft.h" : "fft.h");
|
||||||
for (i = 4; i <= BITS; i++) {
|
for (i = 4; i <= BITS; i++) {
|
@ -1002,7 +1002,7 @@ static inline void xchg_mb_border(H264Context *h, uint8_t *src_y,
|
|||||||
int linesize, int uvlinesize,
|
int linesize, int uvlinesize,
|
||||||
int xchg, int simple, int pixel_shift){
|
int xchg, int simple, int pixel_shift){
|
||||||
MpegEncContext * const s = &h->s;
|
MpegEncContext * const s = &h->s;
|
||||||
int deblock_left;
|
int deblock_topleft;
|
||||||
int deblock_top;
|
int deblock_top;
|
||||||
int top_idx = 1;
|
int top_idx = 1;
|
||||||
uint8_t *top_border_m1;
|
uint8_t *top_border_m1;
|
||||||
@ -1018,11 +1018,11 @@ static inline void xchg_mb_border(H264Context *h, uint8_t *src_y,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(h->deblocking_filter == 2) {
|
if(h->deblocking_filter == 2) {
|
||||||
deblock_left = h->left_type[0];
|
deblock_topleft = h->slice_table[h->mb_xy - 1 - s->mb_stride] == h->slice_num;
|
||||||
deblock_top = h->top_type;
|
deblock_top = h->top_type;
|
||||||
} else {
|
} else {
|
||||||
deblock_left = (s->mb_x > 0);
|
deblock_topleft = (s->mb_x > 0);
|
||||||
deblock_top = (s->mb_y > !!MB_FIELD);
|
deblock_top = (s->mb_y > !!MB_FIELD);
|
||||||
}
|
}
|
||||||
|
|
||||||
src_y -= linesize + 1 + pixel_shift;
|
src_y -= linesize + 1 + pixel_shift;
|
||||||
@ -1045,7 +1045,7 @@ if (xchg) AV_SWAP64(b,a);\
|
|||||||
else AV_COPY64(b,a);
|
else AV_COPY64(b,a);
|
||||||
|
|
||||||
if(deblock_top){
|
if(deblock_top){
|
||||||
if(deblock_left){
|
if(deblock_topleft){
|
||||||
XCHG(top_border_m1 + (8 << pixel_shift), src_y - (7 << pixel_shift), 1);
|
XCHG(top_border_m1 + (8 << pixel_shift), src_y - (7 << pixel_shift), 1);
|
||||||
}
|
}
|
||||||
XCHG(top_border + (0 << pixel_shift), src_y + (1 << pixel_shift), xchg);
|
XCHG(top_border + (0 << pixel_shift), src_y + (1 << pixel_shift), xchg);
|
||||||
@ -1056,7 +1056,7 @@ else AV_COPY64(b,a);
|
|||||||
}
|
}
|
||||||
if(simple || !CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
|
if(simple || !CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
|
||||||
if(deblock_top){
|
if(deblock_top){
|
||||||
if(deblock_left){
|
if(deblock_topleft){
|
||||||
XCHG(top_border_m1 + (16 << pixel_shift), src_cb - (7 << pixel_shift), 1);
|
XCHG(top_border_m1 + (16 << pixel_shift), src_cb - (7 << pixel_shift), 1);
|
||||||
XCHG(top_border_m1 + (24 << pixel_shift), src_cr - (7 << pixel_shift), 1);
|
XCHG(top_border_m1 + (24 << pixel_shift), src_cr - (7 << pixel_shift), 1);
|
||||||
}
|
}
|
||||||
@ -2561,18 +2561,16 @@ static int fill_filter_caches(H264Context *h, int mb_type){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void loop_filter(H264Context *h){
|
static void loop_filter(H264Context *h, int start_x, int end_x){
|
||||||
MpegEncContext * const s = &h->s;
|
MpegEncContext * const s = &h->s;
|
||||||
uint8_t *dest_y, *dest_cb, *dest_cr;
|
uint8_t *dest_y, *dest_cb, *dest_cr;
|
||||||
int linesize, uvlinesize, mb_x, mb_y;
|
int linesize, uvlinesize, mb_x, mb_y;
|
||||||
const int end_mb_y= s->mb_y + FRAME_MBAFF;
|
const int end_mb_y= s->mb_y + FRAME_MBAFF;
|
||||||
const int old_slice_type= h->slice_type;
|
const int old_slice_type= h->slice_type;
|
||||||
const int end_mb_x = s->mb_x;
|
|
||||||
const int pixel_shift = h->pixel_shift;
|
const int pixel_shift = h->pixel_shift;
|
||||||
|
|
||||||
if(h->deblocking_filter) {
|
if(h->deblocking_filter) {
|
||||||
int start_x= s->resync_mb_y == s->mb_y ? s->resync_mb_x : 0;
|
for(mb_x= start_x; mb_x<end_x; mb_x++){
|
||||||
for(mb_x= start_x; mb_x<end_mb_x; mb_x++){
|
|
||||||
for(mb_y=end_mb_y - FRAME_MBAFF; mb_y<= end_mb_y; mb_y++){
|
for(mb_y=end_mb_y - FRAME_MBAFF; mb_y<= end_mb_y; mb_y++){
|
||||||
int mb_xy, mb_type;
|
int mb_xy, mb_type;
|
||||||
mb_xy = h->mb_xy = mb_x + mb_y*s->mb_stride;
|
mb_xy = h->mb_xy = mb_x + mb_y*s->mb_stride;
|
||||||
@ -2617,7 +2615,7 @@ static void loop_filter(H264Context *h){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
h->slice_type= old_slice_type;
|
h->slice_type= old_slice_type;
|
||||||
s->mb_x= end_mb_x;
|
s->mb_x= end_x;
|
||||||
s->mb_y= end_mb_y - FRAME_MBAFF;
|
s->mb_y= end_mb_y - FRAME_MBAFF;
|
||||||
h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale);
|
h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale);
|
||||||
h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale);
|
h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale);
|
||||||
@ -2672,6 +2670,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){
|
|||||||
H264Context *h = *(void**)arg;
|
H264Context *h = *(void**)arg;
|
||||||
MpegEncContext * const s = &h->s;
|
MpegEncContext * const s = &h->s;
|
||||||
const int part_mask= s->partitioned_frame ? (AC_END|AC_ERROR) : 0x7F;
|
const int part_mask= s->partitioned_frame ? (AC_END|AC_ERROR) : 0x7F;
|
||||||
|
int lf_x_start = s->mb_x;
|
||||||
|
|
||||||
s->mb_skip_run= -1;
|
s->mb_skip_run= -1;
|
||||||
|
|
||||||
@ -2710,6 +2709,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){
|
|||||||
|
|
||||||
if((s->workaround_bugs & FF_BUG_TRUNCATED) && h->cabac.bytestream > h->cabac.bytestream_end + 2){
|
if((s->workaround_bugs & FF_BUG_TRUNCATED) && h->cabac.bytestream > h->cabac.bytestream_end + 2){
|
||||||
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
|
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
|
||||||
|
if (s->mb_x >= lf_x_start) loop_filter(h, lf_x_start, s->mb_x + 1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if( ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 2) {
|
if( ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 2) {
|
||||||
@ -2719,8 +2719,8 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( ++s->mb_x >= s->mb_width ) {
|
if( ++s->mb_x >= s->mb_width ) {
|
||||||
loop_filter(h);
|
loop_filter(h, lf_x_start, s->mb_x);
|
||||||
s->mb_x = 0;
|
s->mb_x = lf_x_start = 0;
|
||||||
decode_finish_row(h);
|
decode_finish_row(h);
|
||||||
++s->mb_y;
|
++s->mb_y;
|
||||||
if(FIELD_OR_MBAFF_PICTURE) {
|
if(FIELD_OR_MBAFF_PICTURE) {
|
||||||
@ -2731,10 +2731,9 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( eos || s->mb_y >= s->mb_height ) {
|
if( eos || s->mb_y >= s->mb_height ) {
|
||||||
if(s->mb_x)
|
|
||||||
loop_filter(h);
|
|
||||||
tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits);
|
tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits);
|
||||||
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
|
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
|
||||||
|
if (s->mb_x > lf_x_start) loop_filter(h, lf_x_start, s->mb_x);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2756,13 +2755,12 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){
|
|||||||
if(ret<0){
|
if(ret<0){
|
||||||
av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
|
av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
|
||||||
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask);
|
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(++s->mb_x >= s->mb_width){
|
if(++s->mb_x >= s->mb_width){
|
||||||
loop_filter(h);
|
loop_filter(h, lf_x_start, s->mb_x);
|
||||||
s->mb_x=0;
|
s->mb_x = lf_x_start = 0;
|
||||||
decode_finish_row(h);
|
decode_finish_row(h);
|
||||||
++s->mb_y;
|
++s->mb_y;
|
||||||
if(FIELD_OR_MBAFF_PICTURE) {
|
if(FIELD_OR_MBAFF_PICTURE) {
|
||||||
@ -2789,9 +2787,8 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){
|
|||||||
if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->mb_skip_run<=0){
|
if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->mb_skip_run<=0){
|
||||||
tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits);
|
tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits);
|
||||||
if(get_bits_count(&s->gb) == s->gb.size_in_bits ){
|
if(get_bits_count(&s->gb) == s->gb.size_in_bits ){
|
||||||
if(s->mb_x)
|
|
||||||
loop_filter(h);
|
|
||||||
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
|
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
|
||||||
|
if (s->mb_x > lf_x_start) loop_filter(h, lf_x_start, s->mb_x);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}else{
|
}else{
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include "avcodec.h"
|
#include "avcodec.h"
|
||||||
#include "get_bits.h"
|
#include "get_bits.h"
|
||||||
#include "dsputil.h"
|
#include "dsputil.h"
|
||||||
|
#include "mpegaudiodsp.h"
|
||||||
#include "mpegaudio.h"
|
#include "mpegaudio.h"
|
||||||
|
|
||||||
#include "mpc.h"
|
#include "mpc.h"
|
||||||
@ -51,7 +52,8 @@ static void mpc_synth(MPCContext *c, int16_t *out, int channels)
|
|||||||
for(ch = 0; ch < channels; ch++){
|
for(ch = 0; ch < channels; ch++){
|
||||||
samples_ptr = samples + ch;
|
samples_ptr = samples + ch;
|
||||||
for(i = 0; i < SAMPLES_PER_BAND; i++) {
|
for(i = 0; i < SAMPLES_PER_BAND; i++) {
|
||||||
ff_mpa_synth_filter_fixed(c->synth_buf[ch], &(c->synth_buf_offset[ch]),
|
ff_mpa_synth_filter_fixed(&c->mpadsp,
|
||||||
|
c->synth_buf[ch], &(c->synth_buf_offset[ch]),
|
||||||
ff_mpa_synth_window_fixed, &dither_state,
|
ff_mpa_synth_window_fixed, &dither_state,
|
||||||
samples_ptr, channels,
|
samples_ptr, channels,
|
||||||
c->sb_samples[ch][i]);
|
c->sb_samples[ch][i]);
|
||||||
|
@ -52,6 +52,7 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
DSPContext dsp;
|
DSPContext dsp;
|
||||||
|
MPADSPContext mpadsp;
|
||||||
GetBitContext gb;
|
GetBitContext gb;
|
||||||
int IS, MSS, gapless;
|
int IS, MSS, gapless;
|
||||||
int lastframelen;
|
int lastframelen;
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
#include "avcodec.h"
|
#include "avcodec.h"
|
||||||
#include "get_bits.h"
|
#include "get_bits.h"
|
||||||
#include "dsputil.h"
|
#include "dsputil.h"
|
||||||
#include "mpegaudio.h"
|
#include "mpegaudiodsp.h"
|
||||||
#include "libavutil/audioconvert.h"
|
#include "libavutil/audioconvert.h"
|
||||||
|
|
||||||
#include "mpc.h"
|
#include "mpc.h"
|
||||||
@ -68,6 +68,7 @@ static av_cold int mpc7_decode_init(AVCodecContext * avctx)
|
|||||||
memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
|
memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
|
||||||
av_lfg_init(&c->rnd, 0xDEADBEEF);
|
av_lfg_init(&c->rnd, 0xDEADBEEF);
|
||||||
dsputil_init(&c->dsp, avctx);
|
dsputil_init(&c->dsp, avctx);
|
||||||
|
ff_mpadsp_init(&c->mpadsp);
|
||||||
c->dsp.bswap_buf((uint32_t*)buf, (const uint32_t*)avctx->extradata, 4);
|
c->dsp.bswap_buf((uint32_t*)buf, (const uint32_t*)avctx->extradata, 4);
|
||||||
ff_mpc_init();
|
ff_mpc_init();
|
||||||
init_get_bits(&gb, buf, 128);
|
init_get_bits(&gb, buf, 128);
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
#include "avcodec.h"
|
#include "avcodec.h"
|
||||||
#include "get_bits.h"
|
#include "get_bits.h"
|
||||||
#include "dsputil.h"
|
#include "dsputil.h"
|
||||||
#include "mpegaudio.h"
|
#include "mpegaudiodsp.h"
|
||||||
#include "libavutil/audioconvert.h"
|
#include "libavutil/audioconvert.h"
|
||||||
|
|
||||||
#include "mpc.h"
|
#include "mpc.h"
|
||||||
@ -120,6 +120,7 @@ static av_cold int mpc8_decode_init(AVCodecContext * avctx)
|
|||||||
memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
|
memset(c->oldDSCF, 0, sizeof(c->oldDSCF));
|
||||||
av_lfg_init(&c->rnd, 0xDEADBEEF);
|
av_lfg_init(&c->rnd, 0xDEADBEEF);
|
||||||
dsputil_init(&c->dsp, avctx);
|
dsputil_init(&c->dsp, avctx);
|
||||||
|
ff_mpadsp_init(&c->mpadsp);
|
||||||
|
|
||||||
ff_mpc_init();
|
ff_mpc_init();
|
||||||
|
|
||||||
|
@ -31,9 +31,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "avcodec.h"
|
#include "avcodec.h"
|
||||||
#include "get_bits.h"
|
|
||||||
#include "dsputil.h"
|
|
||||||
#include "dct.h"
|
|
||||||
|
|
||||||
/* max frame size, in samples */
|
/* max frame size, in samples */
|
||||||
#define MPA_FRAME_SIZE 1152
|
#define MPA_FRAME_SIZE 1152
|
||||||
@ -50,10 +47,6 @@
|
|||||||
#define MPA_DUAL 2
|
#define MPA_DUAL 2
|
||||||
#define MPA_MONO 3
|
#define MPA_MONO 3
|
||||||
|
|
||||||
/* header + layer + bitrate + freq + lsf/mpeg25 */
|
|
||||||
#define SAME_HEADER_MASK \
|
|
||||||
(0xffe00000 | (3 << 17) | (0xf << 12) | (3 << 10) | (3 << 19))
|
|
||||||
|
|
||||||
#define MP3_MASK 0xFFFE0CCF
|
#define MP3_MASK 0xFFFE0CCF
|
||||||
|
|
||||||
#ifndef FRAC_BITS
|
#ifndef FRAC_BITS
|
||||||
@ -65,47 +58,20 @@
|
|||||||
|
|
||||||
#define FIX(a) ((int)((a) * FRAC_ONE))
|
#define FIX(a) ((int)((a) * FRAC_ONE))
|
||||||
|
|
||||||
#if CONFIG_FLOAT
|
|
||||||
typedef float OUT_INT;
|
|
||||||
#else
|
|
||||||
typedef int16_t OUT_INT;
|
|
||||||
#define OUT_SHIFT (WFRAC_BITS + FRAC_BITS - 15)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if CONFIG_FLOAT
|
#if CONFIG_FLOAT
|
||||||
# define INTFLOAT float
|
# define INTFLOAT float
|
||||||
typedef float MPA_INT;
|
typedef float MPA_INT;
|
||||||
|
typedef float OUT_INT;
|
||||||
#elif FRAC_BITS <= 15
|
#elif FRAC_BITS <= 15
|
||||||
# define INTFLOAT int
|
# define INTFLOAT int
|
||||||
typedef int16_t MPA_INT;
|
typedef int16_t MPA_INT;
|
||||||
|
typedef int16_t OUT_INT;
|
||||||
#else
|
#else
|
||||||
# define INTFLOAT int
|
# define INTFLOAT int
|
||||||
typedef int32_t MPA_INT;
|
typedef int32_t MPA_INT;
|
||||||
|
typedef int16_t OUT_INT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define BACKSTEP_SIZE 512
|
|
||||||
#define EXTRABYTES 24
|
|
||||||
|
|
||||||
/* layer 3 "granule" */
|
|
||||||
typedef struct GranuleDef {
|
|
||||||
uint8_t scfsi;
|
|
||||||
int part2_3_length;
|
|
||||||
int big_values;
|
|
||||||
int global_gain;
|
|
||||||
int scalefac_compress;
|
|
||||||
uint8_t block_type;
|
|
||||||
uint8_t switch_point;
|
|
||||||
int table_select[3];
|
|
||||||
int subblock_gain[3];
|
|
||||||
uint8_t scalefac_scale;
|
|
||||||
uint8_t count1table_select;
|
|
||||||
int region_size[3]; /* number of huffman codes in each region */
|
|
||||||
int preflag;
|
|
||||||
int short_start, long_end; /* long/short band indexes */
|
|
||||||
uint8_t scale_factors[40];
|
|
||||||
INTFLOAT sb_hybrid[SBLIMIT * 18]; /* 576 samples */
|
|
||||||
} GranuleDef;
|
|
||||||
|
|
||||||
#define MPA_DECODE_HEADER \
|
#define MPA_DECODE_HEADER \
|
||||||
int frame_size; \
|
int frame_size; \
|
||||||
int error_protection; \
|
int error_protection; \
|
||||||
@ -122,58 +88,8 @@ typedef struct MPADecodeHeader {
|
|||||||
MPA_DECODE_HEADER
|
MPA_DECODE_HEADER
|
||||||
} MPADecodeHeader;
|
} MPADecodeHeader;
|
||||||
|
|
||||||
typedef struct MPADecodeContext {
|
|
||||||
MPA_DECODE_HEADER
|
|
||||||
uint8_t last_buf[2*BACKSTEP_SIZE + EXTRABYTES];
|
|
||||||
int last_buf_size;
|
|
||||||
/* next header (used in free format parsing) */
|
|
||||||
uint32_t free_format_next_header;
|
|
||||||
GetBitContext gb;
|
|
||||||
GetBitContext in_gb;
|
|
||||||
DECLARE_ALIGNED(16, MPA_INT, synth_buf)[MPA_MAX_CHANNELS][512 * 2];
|
|
||||||
int synth_buf_offset[MPA_MAX_CHANNELS];
|
|
||||||
DECLARE_ALIGNED(16, INTFLOAT, sb_samples)[MPA_MAX_CHANNELS][36][SBLIMIT];
|
|
||||||
INTFLOAT mdct_buf[MPA_MAX_CHANNELS][SBLIMIT * 18]; /* previous samples, for layer 3 MDCT */
|
|
||||||
GranuleDef granules[2][2]; /* Used in Layer 3 */
|
|
||||||
#ifdef DEBUG
|
|
||||||
int frame_count;
|
|
||||||
#endif
|
|
||||||
int adu_mode; ///< 0 for standard mp3, 1 for adu formatted mp3
|
|
||||||
int dither_state;
|
|
||||||
int error_recognition;
|
|
||||||
AVCodecContext* avctx;
|
|
||||||
#if CONFIG_FLOAT
|
|
||||||
DCTContext dct;
|
|
||||||
#endif
|
|
||||||
void (*apply_window_mp3)(MPA_INT *synth_buf, MPA_INT *window,
|
|
||||||
int *dither_state, OUT_INT *samples, int incr);
|
|
||||||
} MPADecodeContext;
|
|
||||||
|
|
||||||
/* layer 3 huffman tables */
|
|
||||||
typedef struct HuffTable {
|
|
||||||
int xsize;
|
|
||||||
const uint8_t *bits;
|
|
||||||
const uint16_t *codes;
|
|
||||||
} HuffTable;
|
|
||||||
|
|
||||||
int ff_mpa_l2_select_table(int bitrate, int nb_channels, int freq, int lsf);
|
int ff_mpa_l2_select_table(int bitrate, int nb_channels, int freq, int lsf);
|
||||||
int ff_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bitrate);
|
int ff_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bitrate);
|
||||||
extern MPA_INT ff_mpa_synth_window_fixed[];
|
|
||||||
void ff_mpa_synth_init_fixed(MPA_INT *window);
|
|
||||||
void ff_mpa_synth_filter_fixed(MPA_INT *synth_buf_ptr, int *synth_buf_offset,
|
|
||||||
MPA_INT *window, int *dither_state,
|
|
||||||
OUT_INT *samples, int incr,
|
|
||||||
INTFLOAT sb_samples[SBLIMIT]);
|
|
||||||
|
|
||||||
void ff_mpa_synth_init_float(MPA_INT *window);
|
|
||||||
void ff_mpa_synth_filter_float(MPADecodeContext *s,
|
|
||||||
MPA_INT *synth_buf_ptr, int *synth_buf_offset,
|
|
||||||
MPA_INT *window, int *dither_state,
|
|
||||||
OUT_INT *samples, int incr,
|
|
||||||
INTFLOAT sb_samples[SBLIMIT]);
|
|
||||||
|
|
||||||
void ff_mpegaudiodec_init_mmx(MPADecodeContext *s);
|
|
||||||
void ff_mpegaudiodec_init_altivec(MPADecodeContext *s);
|
|
||||||
|
|
||||||
/* fast header check for resync */
|
/* fast header check for resync */
|
||||||
static inline int ff_mpa_check_header(uint32_t header){
|
static inline int ff_mpa_check_header(uint32_t header){
|
||||||
|
@ -35,7 +35,6 @@ typedef struct MpegAudioParseContext {
|
|||||||
#define MPA_HEADER_SIZE 4
|
#define MPA_HEADER_SIZE 4
|
||||||
|
|
||||||
/* header + layer + bitrate + freq + lsf/mpeg25 */
|
/* header + layer + bitrate + freq + lsf/mpeg25 */
|
||||||
#undef SAME_HEADER_MASK /* mpegaudio.h defines different version */
|
|
||||||
#define SAME_HEADER_MASK \
|
#define SAME_HEADER_MASK \
|
||||||
(0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
|
(0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
#include "get_bits.h"
|
#include "get_bits.h"
|
||||||
#include "dsputil.h"
|
#include "dsputil.h"
|
||||||
#include "mathops.h"
|
#include "mathops.h"
|
||||||
#include "dct32.h"
|
#include "mpegaudiodsp.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO:
|
* TODO:
|
||||||
@ -39,6 +39,52 @@
|
|||||||
#include "mpegaudio.h"
|
#include "mpegaudio.h"
|
||||||
#include "mpegaudiodecheader.h"
|
#include "mpegaudiodecheader.h"
|
||||||
|
|
||||||
|
#define BACKSTEP_SIZE 512
|
||||||
|
#define EXTRABYTES 24
|
||||||
|
|
||||||
|
/* layer 3 "granule" */
|
||||||
|
typedef struct GranuleDef {
|
||||||
|
uint8_t scfsi;
|
||||||
|
int part2_3_length;
|
||||||
|
int big_values;
|
||||||
|
int global_gain;
|
||||||
|
int scalefac_compress;
|
||||||
|
uint8_t block_type;
|
||||||
|
uint8_t switch_point;
|
||||||
|
int table_select[3];
|
||||||
|
int subblock_gain[3];
|
||||||
|
uint8_t scalefac_scale;
|
||||||
|
uint8_t count1table_select;
|
||||||
|
int region_size[3]; /* number of huffman codes in each region */
|
||||||
|
int preflag;
|
||||||
|
int short_start, long_end; /* long/short band indexes */
|
||||||
|
uint8_t scale_factors[40];
|
||||||
|
INTFLOAT sb_hybrid[SBLIMIT * 18]; /* 576 samples */
|
||||||
|
} GranuleDef;
|
||||||
|
|
||||||
|
typedef struct MPADecodeContext {
|
||||||
|
MPA_DECODE_HEADER
|
||||||
|
uint8_t last_buf[2*BACKSTEP_SIZE + EXTRABYTES];
|
||||||
|
int last_buf_size;
|
||||||
|
/* next header (used in free format parsing) */
|
||||||
|
uint32_t free_format_next_header;
|
||||||
|
GetBitContext gb;
|
||||||
|
GetBitContext in_gb;
|
||||||
|
DECLARE_ALIGNED(16, MPA_INT, synth_buf)[MPA_MAX_CHANNELS][512 * 2];
|
||||||
|
int synth_buf_offset[MPA_MAX_CHANNELS];
|
||||||
|
DECLARE_ALIGNED(16, INTFLOAT, sb_samples)[MPA_MAX_CHANNELS][36][SBLIMIT];
|
||||||
|
INTFLOAT mdct_buf[MPA_MAX_CHANNELS][SBLIMIT * 18]; /* previous samples, for layer 3 MDCT */
|
||||||
|
GranuleDef granules[2][2]; /* Used in Layer 3 */
|
||||||
|
#ifdef DEBUG
|
||||||
|
int frame_count;
|
||||||
|
#endif
|
||||||
|
int adu_mode; ///< 0 for standard mp3, 1 for adu formatted mp3
|
||||||
|
int dither_state;
|
||||||
|
int error_recognition;
|
||||||
|
AVCodecContext* avctx;
|
||||||
|
MPADSPContext mpadsp;
|
||||||
|
} MPADecodeContext;
|
||||||
|
|
||||||
#if CONFIG_FLOAT
|
#if CONFIG_FLOAT
|
||||||
# define SHR(a,b) ((a)*(1.0f/(1<<(b))))
|
# define SHR(a,b) ((a)*(1.0f/(1<<(b))))
|
||||||
# define FIXR_OLD(a) ((int)((a) * FRAC_ONE + 0.5))
|
# define FIXR_OLD(a) ((int)((a) * FRAC_ONE + 0.5))
|
||||||
@ -68,8 +114,6 @@
|
|||||||
#include "mpegaudiodectab.h"
|
#include "mpegaudiodectab.h"
|
||||||
|
|
||||||
static void RENAME(compute_antialias)(MPADecodeContext *s, GranuleDef *g);
|
static void RENAME(compute_antialias)(MPADecodeContext *s, GranuleDef *g);
|
||||||
static void apply_window_mp3_c(MPA_INT *synth_buf, MPA_INT *window,
|
|
||||||
int *dither_state, OUT_INT *samples, int incr);
|
|
||||||
|
|
||||||
/* vlc structure for decoding layer 3 huffman tables */
|
/* vlc structure for decoding layer 3 huffman tables */
|
||||||
static VLC huff_vlc[16];
|
static VLC huff_vlc[16];
|
||||||
@ -119,8 +163,6 @@ static const int32_t scale_factor_mult2[3][3] = {
|
|||||||
SCALE_GEN(4.0 / 9.0), /* 9 steps */
|
SCALE_GEN(4.0 / 9.0), /* 9 steps */
|
||||||
};
|
};
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, MPA_INT, RENAME(ff_mpa_synth_window))[512+256];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert region offsets to region sizes and truncate
|
* Convert region offsets to region sizes and truncate
|
||||||
* size to big_values.
|
* size to big_values.
|
||||||
@ -259,14 +301,8 @@ static av_cold int decode_init(AVCodecContext * avctx)
|
|||||||
int i, j, k;
|
int i, j, k;
|
||||||
|
|
||||||
s->avctx = avctx;
|
s->avctx = avctx;
|
||||||
s->apply_window_mp3 = apply_window_mp3_c;
|
|
||||||
#if HAVE_MMX && CONFIG_FLOAT
|
ff_mpadsp_init(&s->mpadsp);
|
||||||
ff_mpegaudiodec_init_mmx(s);
|
|
||||||
#endif
|
|
||||||
#if CONFIG_FLOAT
|
|
||||||
ff_dct_init(&s->dct, 5, DCT_II);
|
|
||||||
#endif
|
|
||||||
if (HAVE_ALTIVEC && CONFIG_FLOAT) ff_mpegaudiodec_init_altivec(s);
|
|
||||||
|
|
||||||
avctx->sample_fmt= OUT_FMT;
|
avctx->sample_fmt= OUT_FMT;
|
||||||
s->error_recognition= avctx->error_recognition;
|
s->error_recognition= avctx->error_recognition;
|
||||||
@ -461,183 +497,6 @@ static av_cold int decode_init(AVCodecContext * avctx)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if CONFIG_FLOAT
|
|
||||||
static inline float round_sample(float *sum)
|
|
||||||
{
|
|
||||||
float sum1=*sum;
|
|
||||||
*sum = 0;
|
|
||||||
return sum1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* signed 16x16 -> 32 multiply add accumulate */
|
|
||||||
#define MACS(rt, ra, rb) rt+=(ra)*(rb)
|
|
||||||
|
|
||||||
/* signed 16x16 -> 32 multiply */
|
|
||||||
#define MULS(ra, rb) ((ra)*(rb))
|
|
||||||
|
|
||||||
#define MLSS(rt, ra, rb) rt-=(ra)*(rb)
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
static inline int round_sample(int64_t *sum)
|
|
||||||
{
|
|
||||||
int sum1;
|
|
||||||
sum1 = (int)((*sum) >> OUT_SHIFT);
|
|
||||||
*sum &= (1<<OUT_SHIFT)-1;
|
|
||||||
return av_clip_int16(sum1);
|
|
||||||
}
|
|
||||||
|
|
||||||
# define MULS(ra, rb) MUL64(ra, rb)
|
|
||||||
# define MACS(rt, ra, rb) MAC64(rt, ra, rb)
|
|
||||||
# define MLSS(rt, ra, rb) MLS64(rt, ra, rb)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SUM8(op, sum, w, p) \
|
|
||||||
{ \
|
|
||||||
op(sum, (w)[0 * 64], (p)[0 * 64]); \
|
|
||||||
op(sum, (w)[1 * 64], (p)[1 * 64]); \
|
|
||||||
op(sum, (w)[2 * 64], (p)[2 * 64]); \
|
|
||||||
op(sum, (w)[3 * 64], (p)[3 * 64]); \
|
|
||||||
op(sum, (w)[4 * 64], (p)[4 * 64]); \
|
|
||||||
op(sum, (w)[5 * 64], (p)[5 * 64]); \
|
|
||||||
op(sum, (w)[6 * 64], (p)[6 * 64]); \
|
|
||||||
op(sum, (w)[7 * 64], (p)[7 * 64]); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define SUM8P2(sum1, op1, sum2, op2, w1, w2, p) \
|
|
||||||
{ \
|
|
||||||
INTFLOAT tmp;\
|
|
||||||
tmp = p[0 * 64];\
|
|
||||||
op1(sum1, (w1)[0 * 64], tmp);\
|
|
||||||
op2(sum2, (w2)[0 * 64], tmp);\
|
|
||||||
tmp = p[1 * 64];\
|
|
||||||
op1(sum1, (w1)[1 * 64], tmp);\
|
|
||||||
op2(sum2, (w2)[1 * 64], tmp);\
|
|
||||||
tmp = p[2 * 64];\
|
|
||||||
op1(sum1, (w1)[2 * 64], tmp);\
|
|
||||||
op2(sum2, (w2)[2 * 64], tmp);\
|
|
||||||
tmp = p[3 * 64];\
|
|
||||||
op1(sum1, (w1)[3 * 64], tmp);\
|
|
||||||
op2(sum2, (w2)[3 * 64], tmp);\
|
|
||||||
tmp = p[4 * 64];\
|
|
||||||
op1(sum1, (w1)[4 * 64], tmp);\
|
|
||||||
op2(sum2, (w2)[4 * 64], tmp);\
|
|
||||||
tmp = p[5 * 64];\
|
|
||||||
op1(sum1, (w1)[5 * 64], tmp);\
|
|
||||||
op2(sum2, (w2)[5 * 64], tmp);\
|
|
||||||
tmp = p[6 * 64];\
|
|
||||||
op1(sum1, (w1)[6 * 64], tmp);\
|
|
||||||
op2(sum2, (w2)[6 * 64], tmp);\
|
|
||||||
tmp = p[7 * 64];\
|
|
||||||
op1(sum1, (w1)[7 * 64], tmp);\
|
|
||||||
op2(sum2, (w2)[7 * 64], tmp);\
|
|
||||||
}
|
|
||||||
|
|
||||||
void av_cold RENAME(ff_mpa_synth_init)(MPA_INT *window)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
/* max = 18760, max sum over all 16 coefs : 44736 */
|
|
||||||
for(i=0;i<257;i++) {
|
|
||||||
INTFLOAT v;
|
|
||||||
v = ff_mpa_enwindow[i];
|
|
||||||
#if CONFIG_FLOAT
|
|
||||||
v *= 1.0 / (1LL<<(16 + FRAC_BITS));
|
|
||||||
#endif
|
|
||||||
window[i] = v;
|
|
||||||
if ((i & 63) != 0)
|
|
||||||
v = -v;
|
|
||||||
if (i != 0)
|
|
||||||
window[512 - i] = v;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Needed for avoiding shuffles in ASM implementations
|
|
||||||
for(i=0; i < 8; i++)
|
|
||||||
for(j=0; j < 16; j++)
|
|
||||||
window[512+16*i+j] = window[64*i+32-j];
|
|
||||||
|
|
||||||
for(i=0; i < 8; i++)
|
|
||||||
for(j=0; j < 16; j++)
|
|
||||||
window[512+128+16*i+j] = window[64*i+48-j];
|
|
||||||
}
|
|
||||||
|
|
||||||
static void apply_window_mp3_c(MPA_INT *synth_buf, MPA_INT *window,
|
|
||||||
int *dither_state, OUT_INT *samples, int incr)
|
|
||||||
{
|
|
||||||
register const MPA_INT *w, *w2, *p;
|
|
||||||
int j;
|
|
||||||
OUT_INT *samples2;
|
|
||||||
#if CONFIG_FLOAT
|
|
||||||
float sum, sum2;
|
|
||||||
#else
|
|
||||||
int64_t sum, sum2;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* copy to avoid wrap */
|
|
||||||
memcpy(synth_buf + 512, synth_buf, 32 * sizeof(*synth_buf));
|
|
||||||
|
|
||||||
samples2 = samples + 31 * incr;
|
|
||||||
w = window;
|
|
||||||
w2 = window + 31;
|
|
||||||
|
|
||||||
sum = *dither_state;
|
|
||||||
p = synth_buf + 16;
|
|
||||||
SUM8(MACS, sum, w, p);
|
|
||||||
p = synth_buf + 48;
|
|
||||||
SUM8(MLSS, sum, w + 32, p);
|
|
||||||
*samples = round_sample(&sum);
|
|
||||||
samples += incr;
|
|
||||||
w++;
|
|
||||||
|
|
||||||
/* we calculate two samples at the same time to avoid one memory
|
|
||||||
access per two sample */
|
|
||||||
for(j=1;j<16;j++) {
|
|
||||||
sum2 = 0;
|
|
||||||
p = synth_buf + 16 + j;
|
|
||||||
SUM8P2(sum, MACS, sum2, MLSS, w, w2, p);
|
|
||||||
p = synth_buf + 48 - j;
|
|
||||||
SUM8P2(sum, MLSS, sum2, MLSS, w + 32, w2 + 32, p);
|
|
||||||
|
|
||||||
*samples = round_sample(&sum);
|
|
||||||
samples += incr;
|
|
||||||
sum += sum2;
|
|
||||||
*samples2 = round_sample(&sum);
|
|
||||||
samples2 -= incr;
|
|
||||||
w++;
|
|
||||||
w2--;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = synth_buf + 32;
|
|
||||||
SUM8(MLSS, sum, w + 32, p);
|
|
||||||
*samples = round_sample(&sum);
|
|
||||||
*dither_state= sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* 32 sub band synthesis filter. Input: 32 sub band samples, Output:
|
|
||||||
32 samples. */
|
|
||||||
/* XXX: optimize by avoiding ring buffer usage */
|
|
||||||
#if !CONFIG_FLOAT
|
|
||||||
void ff_mpa_synth_filter_fixed(MPA_INT *synth_buf_ptr, int *synth_buf_offset,
|
|
||||||
MPA_INT *window, int *dither_state,
|
|
||||||
OUT_INT *samples, int incr,
|
|
||||||
INTFLOAT sb_samples[SBLIMIT])
|
|
||||||
{
|
|
||||||
register MPA_INT *synth_buf;
|
|
||||||
int offset;
|
|
||||||
|
|
||||||
offset = *synth_buf_offset;
|
|
||||||
synth_buf = synth_buf_ptr + offset;
|
|
||||||
|
|
||||||
ff_dct32_fixed(synth_buf, sb_samples);
|
|
||||||
apply_window_mp3_c(synth_buf, window, dither_state, samples, incr);
|
|
||||||
|
|
||||||
offset = (offset - 32) & 511;
|
|
||||||
*synth_buf_offset = offset;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define C3 FIXHR(0.86602540378443864676/2)
|
#define C3 FIXHR(0.86602540378443864676/2)
|
||||||
|
|
||||||
/* 0.5 / cos(pi*(2*i+1)/36) */
|
/* 0.5 / cos(pi*(2*i+1)/36) */
|
||||||
@ -1914,9 +1773,7 @@ static int mp_decode_frame(MPADecodeContext *s,
|
|||||||
samples_ptr = samples + ch;
|
samples_ptr = samples + ch;
|
||||||
for(i=0;i<nb_frames;i++) {
|
for(i=0;i<nb_frames;i++) {
|
||||||
RENAME(ff_mpa_synth_filter)(
|
RENAME(ff_mpa_synth_filter)(
|
||||||
#if CONFIG_FLOAT
|
&s->mpadsp,
|
||||||
s,
|
|
||||||
#endif
|
|
||||||
s->synth_buf[ch], &(s->synth_buf_offset[ch]),
|
s->synth_buf[ch], &(s->synth_buf_offset[ch]),
|
||||||
RENAME(ff_mpa_synth_window), &s->dither_state,
|
RENAME(ff_mpa_synth_window), &s->dither_state,
|
||||||
samples_ptr, s->nb_channels,
|
samples_ptr, s->nb_channels,
|
||||||
|
@ -22,25 +22,6 @@
|
|||||||
#define CONFIG_FLOAT 1
|
#define CONFIG_FLOAT 1
|
||||||
#include "mpegaudiodec.c"
|
#include "mpegaudiodec.c"
|
||||||
|
|
||||||
void ff_mpa_synth_filter_float(MPADecodeContext *s, float *synth_buf_ptr,
|
|
||||||
int *synth_buf_offset,
|
|
||||||
float *window, int *dither_state,
|
|
||||||
float *samples, int incr,
|
|
||||||
float sb_samples[SBLIMIT])
|
|
||||||
{
|
|
||||||
float *synth_buf;
|
|
||||||
int offset;
|
|
||||||
|
|
||||||
offset = *synth_buf_offset;
|
|
||||||
synth_buf = synth_buf_ptr + offset;
|
|
||||||
|
|
||||||
s->dct.dct32(synth_buf, sb_samples);
|
|
||||||
s->apply_window_mp3(synth_buf, window, dither_state, samples, incr);
|
|
||||||
|
|
||||||
offset = (offset - 32) & 511;
|
|
||||||
*synth_buf_offset = offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void compute_antialias_float(MPADecodeContext *s,
|
static void compute_antialias_float(MPADecodeContext *s,
|
||||||
GranuleDef *g)
|
GranuleDef *g)
|
||||||
{
|
{
|
||||||
|
@ -33,6 +33,13 @@
|
|||||||
/*******************************************************/
|
/*******************************************************/
|
||||||
/* layer 3 tables */
|
/* layer 3 tables */
|
||||||
|
|
||||||
|
/* layer 3 huffman tables */
|
||||||
|
typedef struct HuffTable {
|
||||||
|
int xsize;
|
||||||
|
const uint8_t *bits;
|
||||||
|
const uint16_t *codes;
|
||||||
|
} HuffTable;
|
||||||
|
|
||||||
/* layer3 scale factor size */
|
/* layer3 scale factor size */
|
||||||
static const uint8_t slen_table[2][16] = {
|
static const uint8_t slen_table[2][16] = {
|
||||||
{ 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 },
|
{ 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 },
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Generate a file for hardcoded tables
|
* Copyright (c) 2011 Mans Rullgard
|
||||||
*
|
|
||||||
* Copyright (c) 2009 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
|
|
||||||
*
|
*
|
||||||
* This file is part of FFmpeg.
|
* This file is part of FFmpeg.
|
||||||
*
|
*
|
||||||
@ -20,22 +18,23 @@
|
|||||||
* 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 <stdio.h>
|
#include "config.h"
|
||||||
#include <inttypes.h>
|
#include "mpegaudiodsp.h"
|
||||||
#include "tableprint.h"
|
#include "dct.h"
|
||||||
|
#include "dct32.h"
|
||||||
|
|
||||||
WRITE_1D_FUNC(int8_t, "%3"PRIi8, 15)
|
void ff_mpadsp_init(MPADSPContext *s)
|
||||||
WRITE_1D_FUNC(uint8_t, "0x%02"PRIx8, 15)
|
{
|
||||||
WRITE_1D_FUNC(uint16_t, "0x%08"PRIx16, 7)
|
DCTContext dct;
|
||||||
WRITE_1D_FUNC(uint32_t, "0x%08"PRIx32, 7)
|
|
||||||
WRITE_1D_FUNC(float, "%.18e", 3)
|
|
||||||
|
|
||||||
WRITE_2D_FUNC(int8_t)
|
ff_dct_init(&dct, 5, DCT_II);
|
||||||
WRITE_2D_FUNC(uint8_t)
|
|
||||||
WRITE_2D_FUNC(uint32_t)
|
|
||||||
WRITE_2D_FUNC(float)
|
|
||||||
|
|
||||||
void write_fileheader(void) {
|
s->apply_window_float = ff_mpadsp_apply_window_float;
|
||||||
printf("/* This file was generated by libavcodec/tableprint */\n");
|
s->apply_window_fixed = ff_mpadsp_apply_window_fixed;
|
||||||
printf("#include <stdint.h>\n");
|
|
||||||
|
s->dct32_float = dct.dct32;
|
||||||
|
s->dct32_fixed = ff_dct32_fixed;
|
||||||
|
|
||||||
|
if (HAVE_MMX) ff_mpadsp_init_mmx(s);
|
||||||
|
if (HAVE_ALTIVEC) ff_mpadsp_init_altivec(s);
|
||||||
}
|
}
|
63
libavcodec/mpegaudiodsp.h
Normal file
63
libavcodec/mpegaudiodsp.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Libav.
|
||||||
|
*
|
||||||
|
* Libav is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Libav is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with Libav; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AVCODEC_MPEGAUDIODSP_H
|
||||||
|
#define AVCODEC_MPEGAUDIODSP_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef struct MPADSPContext {
|
||||||
|
void (*apply_window_float)(float *synth_buf, float *window,
|
||||||
|
int *dither_state, float *samples, int incr);
|
||||||
|
void (*apply_window_fixed)(int32_t *synth_buf, int32_t *window,
|
||||||
|
int *dither_state, int16_t *samples, int incr);
|
||||||
|
void (*dct32_float)(float *dst, const float *src);
|
||||||
|
void (*dct32_fixed)(int *dst, const int *src);
|
||||||
|
} MPADSPContext;
|
||||||
|
|
||||||
|
void ff_mpadsp_init(MPADSPContext *s);
|
||||||
|
|
||||||
|
extern int32_t ff_mpa_synth_window_fixed[];
|
||||||
|
extern float ff_mpa_synth_window_float[];
|
||||||
|
|
||||||
|
void ff_mpa_synth_filter_fixed(MPADSPContext *s,
|
||||||
|
int32_t *synth_buf_ptr, int *synth_buf_offset,
|
||||||
|
int32_t *window, int *dither_state,
|
||||||
|
int16_t *samples, int incr,
|
||||||
|
int32_t *sb_samples);
|
||||||
|
|
||||||
|
void ff_mpa_synth_filter_float(MPADSPContext *s,
|
||||||
|
float *synth_buf_ptr, int *synth_buf_offset,
|
||||||
|
float *window, int *dither_state,
|
||||||
|
float *samples, int incr,
|
||||||
|
float *sb_samples);
|
||||||
|
|
||||||
|
void ff_mpadsp_init_mmx(MPADSPContext *s);
|
||||||
|
void ff_mpadsp_init_altivec(MPADSPContext *s);
|
||||||
|
|
||||||
|
void ff_mpa_synth_init_float(float *window);
|
||||||
|
void ff_mpa_synth_init_fixed(int32_t *window);
|
||||||
|
|
||||||
|
void ff_mpadsp_apply_window_float(float *synth_buf, float *window,
|
||||||
|
int *dither_state, float *samples,
|
||||||
|
int incr);
|
||||||
|
void ff_mpadsp_apply_window_fixed(int32_t *synth_buf, int32_t *window,
|
||||||
|
int *dither_state, int16_t *samples,
|
||||||
|
int incr);
|
||||||
|
|
||||||
|
#endif
|
20
libavcodec/mpegaudiodsp_fixed.c
Normal file
20
libavcodec/mpegaudiodsp_fixed.c
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Libav.
|
||||||
|
*
|
||||||
|
* Libav is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Libav is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with Libav; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define CONFIG_FLOAT 0
|
||||||
|
#include "mpegaudiodsp_template.c"
|
20
libavcodec/mpegaudiodsp_float.c
Normal file
20
libavcodec/mpegaudiodsp_float.c
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of Libav.
|
||||||
|
*
|
||||||
|
* Libav is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Libav is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with Libav; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define CONFIG_FLOAT 1
|
||||||
|
#include "mpegaudiodsp_template.c"
|
205
libavcodec/mpegaudiodsp_template.c
Normal file
205
libavcodec/mpegaudiodsp_template.c
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001, 2002 Fabrice Bellard
|
||||||
|
*
|
||||||
|
* This file is part of Libav.
|
||||||
|
*
|
||||||
|
* Libav is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Libav is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with Libav; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "libavutil/mem.h"
|
||||||
|
#include "dct32.h"
|
||||||
|
#include "mathops.h"
|
||||||
|
#include "mpegaudiodsp.h"
|
||||||
|
#include "mpegaudio.h"
|
||||||
|
#include "mpegaudiodata.h"
|
||||||
|
|
||||||
|
#if CONFIG_FLOAT
|
||||||
|
#define RENAME(n) n##_float
|
||||||
|
|
||||||
|
static inline float round_sample(float *sum)
|
||||||
|
{
|
||||||
|
float sum1=*sum;
|
||||||
|
*sum = 0;
|
||||||
|
return sum1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MACS(rt, ra, rb) rt+=(ra)*(rb)
|
||||||
|
#define MULS(ra, rb) ((ra)*(rb))
|
||||||
|
#define MLSS(rt, ra, rb) rt-=(ra)*(rb)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define RENAME(n) n##_fixed
|
||||||
|
#define OUT_SHIFT (WFRAC_BITS + FRAC_BITS - 15)
|
||||||
|
|
||||||
|
static inline int round_sample(int64_t *sum)
|
||||||
|
{
|
||||||
|
int sum1;
|
||||||
|
sum1 = (int)((*sum) >> OUT_SHIFT);
|
||||||
|
*sum &= (1<<OUT_SHIFT)-1;
|
||||||
|
return av_clip_int16(sum1);
|
||||||
|
}
|
||||||
|
|
||||||
|
# define MULS(ra, rb) MUL64(ra, rb)
|
||||||
|
# define MACS(rt, ra, rb) MAC64(rt, ra, rb)
|
||||||
|
# define MLSS(rt, ra, rb) MLS64(rt, ra, rb)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
DECLARE_ALIGNED(16, MPA_INT, RENAME(ff_mpa_synth_window))[512+256];
|
||||||
|
|
||||||
|
#define SUM8(op, sum, w, p) \
|
||||||
|
{ \
|
||||||
|
op(sum, (w)[0 * 64], (p)[0 * 64]); \
|
||||||
|
op(sum, (w)[1 * 64], (p)[1 * 64]); \
|
||||||
|
op(sum, (w)[2 * 64], (p)[2 * 64]); \
|
||||||
|
op(sum, (w)[3 * 64], (p)[3 * 64]); \
|
||||||
|
op(sum, (w)[4 * 64], (p)[4 * 64]); \
|
||||||
|
op(sum, (w)[5 * 64], (p)[5 * 64]); \
|
||||||
|
op(sum, (w)[6 * 64], (p)[6 * 64]); \
|
||||||
|
op(sum, (w)[7 * 64], (p)[7 * 64]); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SUM8P2(sum1, op1, sum2, op2, w1, w2, p) \
|
||||||
|
{ \
|
||||||
|
INTFLOAT tmp;\
|
||||||
|
tmp = p[0 * 64];\
|
||||||
|
op1(sum1, (w1)[0 * 64], tmp);\
|
||||||
|
op2(sum2, (w2)[0 * 64], tmp);\
|
||||||
|
tmp = p[1 * 64];\
|
||||||
|
op1(sum1, (w1)[1 * 64], tmp);\
|
||||||
|
op2(sum2, (w2)[1 * 64], tmp);\
|
||||||
|
tmp = p[2 * 64];\
|
||||||
|
op1(sum1, (w1)[2 * 64], tmp);\
|
||||||
|
op2(sum2, (w2)[2 * 64], tmp);\
|
||||||
|
tmp = p[3 * 64];\
|
||||||
|
op1(sum1, (w1)[3 * 64], tmp);\
|
||||||
|
op2(sum2, (w2)[3 * 64], tmp);\
|
||||||
|
tmp = p[4 * 64];\
|
||||||
|
op1(sum1, (w1)[4 * 64], tmp);\
|
||||||
|
op2(sum2, (w2)[4 * 64], tmp);\
|
||||||
|
tmp = p[5 * 64];\
|
||||||
|
op1(sum1, (w1)[5 * 64], tmp);\
|
||||||
|
op2(sum2, (w2)[5 * 64], tmp);\
|
||||||
|
tmp = p[6 * 64];\
|
||||||
|
op1(sum1, (w1)[6 * 64], tmp);\
|
||||||
|
op2(sum2, (w2)[6 * 64], tmp);\
|
||||||
|
tmp = p[7 * 64];\
|
||||||
|
op1(sum1, (w1)[7 * 64], tmp);\
|
||||||
|
op2(sum2, (w2)[7 * 64], tmp);\
|
||||||
|
}
|
||||||
|
|
||||||
|
void RENAME(ff_mpadsp_apply_window)(MPA_INT *synth_buf, MPA_INT *window,
|
||||||
|
int *dither_state, OUT_INT *samples,
|
||||||
|
int incr)
|
||||||
|
{
|
||||||
|
register const MPA_INT *w, *w2, *p;
|
||||||
|
int j;
|
||||||
|
OUT_INT *samples2;
|
||||||
|
#if CONFIG_FLOAT
|
||||||
|
float sum, sum2;
|
||||||
|
#else
|
||||||
|
int64_t sum, sum2;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* copy to avoid wrap */
|
||||||
|
memcpy(synth_buf + 512, synth_buf, 32 * sizeof(*synth_buf));
|
||||||
|
|
||||||
|
samples2 = samples + 31 * incr;
|
||||||
|
w = window;
|
||||||
|
w2 = window + 31;
|
||||||
|
|
||||||
|
sum = *dither_state;
|
||||||
|
p = synth_buf + 16;
|
||||||
|
SUM8(MACS, sum, w, p);
|
||||||
|
p = synth_buf + 48;
|
||||||
|
SUM8(MLSS, sum, w + 32, p);
|
||||||
|
*samples = round_sample(&sum);
|
||||||
|
samples += incr;
|
||||||
|
w++;
|
||||||
|
|
||||||
|
/* we calculate two samples at the same time to avoid one memory
|
||||||
|
access per two sample */
|
||||||
|
for(j=1;j<16;j++) {
|
||||||
|
sum2 = 0;
|
||||||
|
p = synth_buf + 16 + j;
|
||||||
|
SUM8P2(sum, MACS, sum2, MLSS, w, w2, p);
|
||||||
|
p = synth_buf + 48 - j;
|
||||||
|
SUM8P2(sum, MLSS, sum2, MLSS, w + 32, w2 + 32, p);
|
||||||
|
|
||||||
|
*samples = round_sample(&sum);
|
||||||
|
samples += incr;
|
||||||
|
sum += sum2;
|
||||||
|
*samples2 = round_sample(&sum);
|
||||||
|
samples2 -= incr;
|
||||||
|
w++;
|
||||||
|
w2--;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = synth_buf + 32;
|
||||||
|
SUM8(MLSS, sum, w + 32, p);
|
||||||
|
*samples = round_sample(&sum);
|
||||||
|
*dither_state= sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 32 sub band synthesis filter. Input: 32 sub band samples, Output:
|
||||||
|
32 samples. */
|
||||||
|
void RENAME(ff_mpa_synth_filter)(MPADSPContext *s, MPA_INT *synth_buf_ptr,
|
||||||
|
int *synth_buf_offset,
|
||||||
|
MPA_INT *window, int *dither_state,
|
||||||
|
OUT_INT *samples, int incr,
|
||||||
|
MPA_INT *sb_samples)
|
||||||
|
{
|
||||||
|
MPA_INT *synth_buf;
|
||||||
|
int offset;
|
||||||
|
|
||||||
|
offset = *synth_buf_offset;
|
||||||
|
synth_buf = synth_buf_ptr + offset;
|
||||||
|
|
||||||
|
s->RENAME(dct32)(synth_buf, sb_samples);
|
||||||
|
s->RENAME(apply_window)(synth_buf, window, dither_state, samples, incr);
|
||||||
|
|
||||||
|
offset = (offset - 32) & 511;
|
||||||
|
*synth_buf_offset = offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
void av_cold RENAME(ff_mpa_synth_init)(MPA_INT *window)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
/* max = 18760, max sum over all 16 coefs : 44736 */
|
||||||
|
for(i=0;i<257;i++) {
|
||||||
|
INTFLOAT v;
|
||||||
|
v = ff_mpa_enwindow[i];
|
||||||
|
#if CONFIG_FLOAT
|
||||||
|
v *= 1.0 / (1LL<<(16 + FRAC_BITS));
|
||||||
|
#endif
|
||||||
|
window[i] = v;
|
||||||
|
if ((i & 63) != 0)
|
||||||
|
v = -v;
|
||||||
|
if (i != 0)
|
||||||
|
window[512 - i] = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Needed for avoiding shuffles in ASM implementations
|
||||||
|
for(i=0; i < 8; i++)
|
||||||
|
for(j=0; j < 16; j++)
|
||||||
|
window[512+16*i+j] = window[64*i+32-j];
|
||||||
|
|
||||||
|
for(i=0; i < 8; i++)
|
||||||
|
for(j=0; j < 16; j++)
|
||||||
|
window[512+128+16*i+j] = window[64*i+48-j];
|
||||||
|
}
|
@ -782,5 +782,3 @@ AVCodec ff_mp2_encoder = {
|
|||||||
.supported_samplerates= (const int[]){44100, 48000, 32000, 22050, 24000, 16000, 0},
|
.supported_samplerates= (const int[]){44100, 48000, 32000, 22050, 24000, 16000, 0},
|
||||||
.long_name = NULL_IF_CONFIG_SMALL("MP2 (MPEG audio layer 2)"),
|
.long_name = NULL_IF_CONFIG_SMALL("MP2 (MPEG audio layer 2)"),
|
||||||
};
|
};
|
||||||
|
|
||||||
#undef FIX
|
|
||||||
|
@ -7,11 +7,7 @@ ALTIVEC-OBJS-$(CONFIG_VP5_DECODER) += ppc/vp3dsp_altivec.o
|
|||||||
ALTIVEC-OBJS-$(CONFIG_VP6_DECODER) += ppc/vp3dsp_altivec.o
|
ALTIVEC-OBJS-$(CONFIG_VP6_DECODER) += ppc/vp3dsp_altivec.o
|
||||||
ALTIVEC-OBJS-$(CONFIG_VP8_DECODER) += ppc/vp8dsp_altivec.o
|
ALTIVEC-OBJS-$(CONFIG_VP8_DECODER) += ppc/vp8dsp_altivec.o
|
||||||
|
|
||||||
ALTIVEC-OBJS-$(CONFIG_MP1FLOAT_DECODER) += ppc/mpegaudiodec_altivec.o
|
ALTIVEC-OBJS-$(CONFIG_MPEGAUDIODSP) += ppc/mpegaudiodec_altivec.o
|
||||||
ALTIVEC-OBJS-$(CONFIG_MP2FLOAT_DECODER) += ppc/mpegaudiodec_altivec.o
|
|
||||||
ALTIVEC-OBJS-$(CONFIG_MP3FLOAT_DECODER) += ppc/mpegaudiodec_altivec.o
|
|
||||||
ALTIVEC-OBJS-$(CONFIG_MP3ON4FLOAT_DECODER) += ppc/mpegaudiodec_altivec.o
|
|
||||||
ALTIVEC-OBJS-$(CONFIG_MP3ADUFLOAT_DECODER) += ppc/mpegaudiodec_altivec.o
|
|
||||||
|
|
||||||
FFT-OBJS-$(HAVE_GNU_AS) += ppc/fft_altivec_s.o \
|
FFT-OBJS-$(HAVE_GNU_AS) += ppc/fft_altivec_s.o \
|
||||||
|
|
||||||
|
@ -21,9 +21,8 @@
|
|||||||
|
|
||||||
#include "dsputil_altivec.h"
|
#include "dsputil_altivec.h"
|
||||||
#include "util_altivec.h"
|
#include "util_altivec.h"
|
||||||
|
#include "libavcodec/dsputil.h"
|
||||||
#define CONFIG_FLOAT 1
|
#include "libavcodec/mpegaudiodsp.h"
|
||||||
#include "libavcodec/mpegaudio.h"
|
|
||||||
|
|
||||||
#define MACS(rt, ra, rb) rt+=(ra)*(rb)
|
#define MACS(rt, ra, rb) rt+=(ra)*(rb)
|
||||||
#define MLSS(rt, ra, rb) rt-=(ra)*(rb)
|
#define MLSS(rt, ra, rb) rt-=(ra)*(rb)
|
||||||
@ -124,7 +123,7 @@ static void apply_window_mp3(float *in, float *win, int *unused, float *out,
|
|||||||
*out = sum;
|
*out = sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ff_mpegaudiodec_init_altivec(MPADecodeContext *s)
|
void ff_mpadsp_init_altivec(MPADSPContext *s)
|
||||||
{
|
{
|
||||||
s->apply_window_mp3 = apply_window_mp3;
|
s->apply_window_float = apply_window_mp3;
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include "get_bits.h"
|
#include "get_bits.h"
|
||||||
#include "dsputil.h"
|
#include "dsputil.h"
|
||||||
#include "rdft.h"
|
#include "rdft.h"
|
||||||
|
#include "mpegaudiodsp.h"
|
||||||
#include "mpegaudio.h"
|
#include "mpegaudio.h"
|
||||||
|
|
||||||
#include "qdm2data.h"
|
#include "qdm2data.h"
|
||||||
@ -170,9 +171,10 @@ typedef struct {
|
|||||||
float output_buffer[1024];
|
float output_buffer[1024];
|
||||||
|
|
||||||
/// Synthesis filter
|
/// Synthesis filter
|
||||||
DECLARE_ALIGNED(16, MPA_INT, synth_buf)[MPA_MAX_CHANNELS][512*2];
|
MPADSPContext mpadsp;
|
||||||
|
DECLARE_ALIGNED(32, float, synth_buf)[MPA_MAX_CHANNELS][512*2];
|
||||||
int synth_buf_offset[MPA_MAX_CHANNELS];
|
int synth_buf_offset[MPA_MAX_CHANNELS];
|
||||||
DECLARE_ALIGNED(16, int32_t, sb_samples)[MPA_MAX_CHANNELS][128][SBLIMIT];
|
DECLARE_ALIGNED(32, float, sb_samples)[MPA_MAX_CHANNELS][128][SBLIMIT];
|
||||||
|
|
||||||
/// Mixed temporary data used in decoding
|
/// Mixed temporary data used in decoding
|
||||||
float tone_level[MPA_MAX_CHANNELS][30][64];
|
float tone_level[MPA_MAX_CHANNELS][30][64];
|
||||||
@ -329,11 +331,6 @@ static av_cold void qdm2_init_vlc(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* for floating point to fixed point conversion */
|
|
||||||
static const float f2i_scale = (float) (1 << (FRAC_BITS - 15));
|
|
||||||
|
|
||||||
|
|
||||||
static int qdm2_get_vlc (GetBitContext *gb, VLC *vlc, int flag, int depth)
|
static int qdm2_get_vlc (GetBitContext *gb, VLC *vlc, int flag, int depth)
|
||||||
{
|
{
|
||||||
int value;
|
int value;
|
||||||
@ -482,8 +479,8 @@ static void build_sb_samples_from_noise (QDM2Context *q, int sb)
|
|||||||
|
|
||||||
for (ch = 0; ch < q->nb_channels; ch++)
|
for (ch = 0; ch < q->nb_channels; ch++)
|
||||||
for (j = 0; j < 64; j++) {
|
for (j = 0; j < 64; j++) {
|
||||||
q->sb_samples[ch][j * 2][sb] = (int32_t)(f2i_scale * SB_DITHERING_NOISE(sb,q->noise_idx) * q->tone_level[ch][sb][j] + .5);
|
q->sb_samples[ch][j * 2][sb] = SB_DITHERING_NOISE(sb,q->noise_idx) * q->tone_level[ch][sb][j];
|
||||||
q->sb_samples[ch][j * 2 + 1][sb] = (int32_t)(f2i_scale * SB_DITHERING_NOISE(sb,q->noise_idx) * q->tone_level[ch][sb][j] + .5);
|
q->sb_samples[ch][j * 2 + 1][sb] = SB_DITHERING_NOISE(sb,q->noise_idx) * q->tone_level[ch][sb][j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -923,11 +920,11 @@ static void synthfilt_build_sb_samples (QDM2Context *q, GetBitContext *gb, int l
|
|||||||
for (chs = 0; chs < q->nb_channels; chs++)
|
for (chs = 0; chs < q->nb_channels; chs++)
|
||||||
for (k = 0; k < run; k++)
|
for (k = 0; k < run; k++)
|
||||||
if ((j + k) < 128)
|
if ((j + k) < 128)
|
||||||
q->sb_samples[chs][j + k][sb] = (int32_t)(f2i_scale * q->tone_level[chs][sb][((j + k)/2)] * tmp[k][chs] + .5);
|
q->sb_samples[chs][j + k][sb] = q->tone_level[chs][sb][((j + k)/2)] * tmp[k][chs];
|
||||||
} else {
|
} else {
|
||||||
for (k = 0; k < run; k++)
|
for (k = 0; k < run; k++)
|
||||||
if ((j + k) < 128)
|
if ((j + k) < 128)
|
||||||
q->sb_samples[ch][j + k][sb] = (int32_t)(f2i_scale * q->tone_level[ch][sb][(j + k)/2] * samples[k] + .5);
|
q->sb_samples[ch][j + k][sb] = q->tone_level[ch][sb][(j + k)/2] * samples[k];
|
||||||
}
|
}
|
||||||
|
|
||||||
j += run;
|
j += run;
|
||||||
@ -1601,7 +1598,7 @@ static void qdm2_calculate_fft (QDM2Context *q, int channel, int sub_packet)
|
|||||||
*/
|
*/
|
||||||
static void qdm2_synthesis_filter (QDM2Context *q, int index)
|
static void qdm2_synthesis_filter (QDM2Context *q, int index)
|
||||||
{
|
{
|
||||||
OUT_INT samples[MPA_MAX_CHANNELS * MPA_FRAME_SIZE];
|
float samples[MPA_MAX_CHANNELS * MPA_FRAME_SIZE];
|
||||||
int i, k, ch, sb_used, sub_sampling, dither_state = 0;
|
int i, k, ch, sb_used, sub_sampling, dither_state = 0;
|
||||||
|
|
||||||
/* copy sb_samples */
|
/* copy sb_samples */
|
||||||
@ -1613,11 +1610,12 @@ static void qdm2_synthesis_filter (QDM2Context *q, int index)
|
|||||||
q->sb_samples[ch][(8 * index) + i][k] = 0;
|
q->sb_samples[ch][(8 * index) + i][k] = 0;
|
||||||
|
|
||||||
for (ch = 0; ch < q->nb_channels; ch++) {
|
for (ch = 0; ch < q->nb_channels; ch++) {
|
||||||
OUT_INT *samples_ptr = samples + ch;
|
float *samples_ptr = samples + ch;
|
||||||
|
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
ff_mpa_synth_filter_fixed(q->synth_buf[ch], &(q->synth_buf_offset[ch]),
|
ff_mpa_synth_filter_float(&q->mpadsp,
|
||||||
ff_mpa_synth_window_fixed, &dither_state,
|
q->synth_buf[ch], &(q->synth_buf_offset[ch]),
|
||||||
|
ff_mpa_synth_window_float, &dither_state,
|
||||||
samples_ptr, q->nb_channels,
|
samples_ptr, q->nb_channels,
|
||||||
q->sb_samples[ch][(8 * index) + i]);
|
q->sb_samples[ch][(8 * index) + i]);
|
||||||
samples_ptr += 32 * q->nb_channels;
|
samples_ptr += 32 * q->nb_channels;
|
||||||
@ -1629,7 +1627,7 @@ static void qdm2_synthesis_filter (QDM2Context *q, int index)
|
|||||||
|
|
||||||
for (ch = 0; ch < q->channels; ch++)
|
for (ch = 0; ch < q->channels; ch++)
|
||||||
for (i = 0; i < q->frame_size; i++)
|
for (i = 0; i < q->frame_size; i++)
|
||||||
q->output_buffer[q->channels * i + ch] += (float)(samples[q->nb_channels * sub_sampling * i + ch] >> (sizeof(OUT_INT)*8-16));
|
q->output_buffer[q->channels * i + ch] += (1 << 23) * samples[q->nb_channels * sub_sampling * i + ch];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1646,7 +1644,7 @@ static av_cold void qdm2_init(QDM2Context *q) {
|
|||||||
initialized = 1;
|
initialized = 1;
|
||||||
|
|
||||||
qdm2_init_vlc();
|
qdm2_init_vlc();
|
||||||
ff_mpa_synth_init_fixed(ff_mpa_synth_window_fixed);
|
ff_mpa_synth_init_float(ff_mpa_synth_window_float);
|
||||||
softclip_table_init();
|
softclip_table_init();
|
||||||
rnd_table_init();
|
rnd_table_init();
|
||||||
init_noise_samples();
|
init_noise_samples();
|
||||||
@ -1863,6 +1861,7 @@ static av_cold int qdm2_decode_init(AVCodecContext *avctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ff_rdft_init(&s->rdft_ctx, s->fft_order, IDFT_C2R);
|
ff_rdft_init(&s->rdft_ctx, s->fft_order, IDFT_C2R);
|
||||||
|
ff_mpadsp_init(&s->mpadsp);
|
||||||
|
|
||||||
qdm2_init(s);
|
qdm2_init(s);
|
||||||
|
|
||||||
|
@ -23,8 +23,9 @@
|
|||||||
#ifndef AVCODEC_TABLEPRINT_H
|
#ifndef AVCODEC_TABLEPRINT_H
|
||||||
#define AVCODEC_TABLEPRINT_H
|
#define AVCODEC_TABLEPRINT_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <inttypes.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "libavutil/common.h"
|
#include "libavutil/common.h"
|
||||||
|
|
||||||
#define WRITE_1D_FUNC_ARGV(type, linebrk, fmtstr, ...)\
|
#define WRITE_1D_FUNC_ARGV(type, linebrk, fmtstr, ...)\
|
||||||
@ -70,9 +71,6 @@ void write_uint32_t_2d_array(const void *, int, int);
|
|||||||
void write_float_2d_array (const void *, int, int);
|
void write_float_2d_array (const void *, int, int);
|
||||||
/** \} */ // end of printfuncs group
|
/** \} */ // end of printfuncs group
|
||||||
|
|
||||||
/** Write a standard file header */
|
|
||||||
void write_fileheader(void);
|
|
||||||
|
|
||||||
#define WRITE_ARRAY(prefix, type, name) \
|
#define WRITE_ARRAY(prefix, type, name) \
|
||||||
do { \
|
do { \
|
||||||
const size_t array_size = FF_ARRAY_ELEMS(name); \
|
const size_t array_size = FF_ARRAY_ELEMS(name); \
|
||||||
@ -92,4 +90,22 @@ void write_fileheader(void);
|
|||||||
printf("};\n"); \
|
printf("};\n"); \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
WRITE_1D_FUNC(int8_t, "%3"PRIi8, 15)
|
||||||
|
WRITE_1D_FUNC(uint8_t, "0x%02"PRIx8, 15)
|
||||||
|
WRITE_1D_FUNC(uint16_t, "0x%08"PRIx16, 7)
|
||||||
|
WRITE_1D_FUNC(uint32_t, "0x%08"PRIx32, 7)
|
||||||
|
WRITE_1D_FUNC(float, "%.18e", 3)
|
||||||
|
|
||||||
|
WRITE_2D_FUNC(int8_t)
|
||||||
|
WRITE_2D_FUNC(uint8_t)
|
||||||
|
WRITE_2D_FUNC(uint32_t)
|
||||||
|
WRITE_2D_FUNC(float)
|
||||||
|
|
||||||
|
static inline void write_fileheader(void)
|
||||||
|
{
|
||||||
|
printf("/* This file was automatically generated. */\n");
|
||||||
|
printf("#include <stdint.h>\n");
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* AVCODEC_TABLEPRINT_H */
|
#endif /* AVCODEC_TABLEPRINT_H */
|
||||||
|
@ -21,11 +21,7 @@ YASM-OBJS-$(CONFIG_VC1_DECODER) += x86/vc1dsp_yasm.o
|
|||||||
MMX-OBJS-$(CONFIG_AC3DSP) += x86/ac3dsp_mmx.o
|
MMX-OBJS-$(CONFIG_AC3DSP) += x86/ac3dsp_mmx.o
|
||||||
YASM-OBJS-$(CONFIG_AC3DSP) += x86/ac3dsp.o
|
YASM-OBJS-$(CONFIG_AC3DSP) += x86/ac3dsp.o
|
||||||
MMX-OBJS-$(CONFIG_CAVS_DECODER) += x86/cavsdsp_mmx.o
|
MMX-OBJS-$(CONFIG_CAVS_DECODER) += x86/cavsdsp_mmx.o
|
||||||
MMX-OBJS-$(CONFIG_MP1FLOAT_DECODER) += x86/mpegaudiodec_mmx.o
|
MMX-OBJS-$(CONFIG_MPEGAUDIODSP) += x86/mpegaudiodec_mmx.o
|
||||||
MMX-OBJS-$(CONFIG_MP2FLOAT_DECODER) += x86/mpegaudiodec_mmx.o
|
|
||||||
MMX-OBJS-$(CONFIG_MP3FLOAT_DECODER) += x86/mpegaudiodec_mmx.o
|
|
||||||
MMX-OBJS-$(CONFIG_MP3ON4FLOAT_DECODER) += x86/mpegaudiodec_mmx.o
|
|
||||||
MMX-OBJS-$(CONFIG_MP3ADUFLOAT_DECODER) += x86/mpegaudiodec_mmx.o
|
|
||||||
MMX-OBJS-$(CONFIG_PNG_DECODER) += x86/png_mmx.o
|
MMX-OBJS-$(CONFIG_PNG_DECODER) += x86/png_mmx.o
|
||||||
MMX-OBJS-$(CONFIG_ENCODERS) += x86/dsputilenc_mmx.o
|
MMX-OBJS-$(CONFIG_ENCODERS) += x86/dsputilenc_mmx.o
|
||||||
YASM-OBJS-$(CONFIG_ENCODERS) += x86/dsputilenc_yasm.o
|
YASM-OBJS-$(CONFIG_ENCODERS) += x86/dsputilenc_yasm.o
|
||||||
|
@ -21,9 +21,8 @@
|
|||||||
|
|
||||||
#include "libavutil/cpu.h"
|
#include "libavutil/cpu.h"
|
||||||
#include "libavutil/x86_cpu.h"
|
#include "libavutil/x86_cpu.h"
|
||||||
|
#include "libavcodec/dsputil.h"
|
||||||
#define CONFIG_FLOAT 1
|
#include "libavcodec/mpegaudiodsp.h"
|
||||||
#include "libavcodec/mpegaudio.h"
|
|
||||||
|
|
||||||
#define MACS(rt, ra, rb) rt+=(ra)*(rb)
|
#define MACS(rt, ra, rb) rt+=(ra)*(rb)
|
||||||
#define MLSS(rt, ra, rb) rt-=(ra)*(rb)
|
#define MLSS(rt, ra, rb) rt-=(ra)*(rb)
|
||||||
@ -148,11 +147,11 @@ static void apply_window_mp3(float *in, float *win, int *unused, float *out,
|
|||||||
*out = sum;
|
*out = sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ff_mpegaudiodec_init_mmx(MPADecodeContext *s)
|
void ff_mpadsp_init_mmx(MPADSPContext *s)
|
||||||
{
|
{
|
||||||
int mm_flags = av_get_cpu_flags();
|
int mm_flags = av_get_cpu_flags();
|
||||||
|
|
||||||
if (mm_flags & AV_CPU_FLAG_SSE2) {
|
if (mm_flags & AV_CPU_FLAG_SSE2) {
|
||||||
s->apply_window_mp3 = apply_window_mp3;
|
s->apply_window_float = apply_window_mp3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
//#define DEBUG
|
//#define DEBUG
|
||||||
|
|
||||||
|
#include "libavutil/bswap.h"
|
||||||
#include "libavutil/common.h"
|
#include "libavutil/common.h"
|
||||||
#include "libavutil/avstring.h"
|
#include "libavutil/avstring.h"
|
||||||
#include "libavcodec/mpegaudio.h"
|
#include "libavcodec/mpegaudio.h"
|
||||||
|
@ -23,8 +23,7 @@
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* I return the LIBAVFORMAT_VERSION_INT constant. You got
|
* Return the LIBAVFORMAT_VERSION_INT constant.
|
||||||
* a fucking problem with that, douchebag?
|
|
||||||
*/
|
*/
|
||||||
unsigned avformat_version(void);
|
unsigned avformat_version(void);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user