Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
| ... | ... |
@@ -55,8 +55,10 @@ OBJS-$(CONFIG_AAC_ENCODER) += aacenc.o aaccoder.o \ |
| 55 | 55 |
mpeg4audio.o |
| 56 | 56 |
OBJS-$(CONFIG_AASC_DECODER) += aasc.o msrledec.o |
| 57 | 57 |
OBJS-$(CONFIG_AC3_DECODER) += ac3dec.o ac3dec_data.o ac3.o |
| 58 |
-OBJS-$(CONFIG_AC3_ENCODER) += ac3enc_float.o ac3tab.o ac3.o |
|
| 59 |
-OBJS-$(CONFIG_AC3_FIXED_ENCODER) += ac3enc_fixed.o ac3tab.o ac3.o |
|
| 58 |
+OBJS-$(CONFIG_AC3_ENCODER) += ac3enc_float.o ac3tab.o ac3.o \ |
|
| 59 |
+ ac3dsp.o |
|
| 60 |
+OBJS-$(CONFIG_AC3_FIXED_ENCODER) += ac3enc_fixed.o ac3tab.o ac3.o \ |
|
| 61 |
+ ac3dsp.o |
|
| 60 | 62 |
OBJS-$(CONFIG_ALAC_DECODER) += alac.o |
| 61 | 63 |
OBJS-$(CONFIG_ALAC_ENCODER) += alacenc.o |
| 62 | 64 |
OBJS-$(CONFIG_ALS_DECODER) += alsdec.o bgmc.o mpeg4audio.o |
| 63 | 65 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,51 @@ |
| 0 |
+/* |
|
| 1 |
+ * AC-3 DSP utils |
|
| 2 |
+ * Copyright (c) 2011 Justin Ruggles |
|
| 3 |
+ * |
|
| 4 |
+ * This file is part of FFmpeg. |
|
| 5 |
+ * |
|
| 6 |
+ * FFmpeg is free software; you can redistribute it and/or |
|
| 7 |
+ * modify it under the terms of the GNU Lesser General Public |
|
| 8 |
+ * License as published by the Free Software Foundation; either |
|
| 9 |
+ * version 2.1 of the License, or (at your option) any later version. |
|
| 10 |
+ * |
|
| 11 |
+ * FFmpeg is distributed in the hope that it will be useful, |
|
| 12 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 13 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
| 14 |
+ * Lesser General Public License for more details. |
|
| 15 |
+ * |
|
| 16 |
+ * You should have received a copy of the GNU Lesser General Public |
|
| 17 |
+ * License along with FFmpeg; if not, write to the Free Software |
|
| 18 |
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
| 19 |
+ */ |
|
| 20 |
+ |
|
| 21 |
+#include "avcodec.h" |
|
| 22 |
+#include "ac3dsp.h" |
|
| 23 |
+ |
|
| 24 |
+static void ac3_exponent_min_c(uint8_t *exp, int num_reuse_blocks, int nb_coefs) |
|
| 25 |
+{
|
|
| 26 |
+ int blk, i; |
|
| 27 |
+ |
|
| 28 |
+ if (!num_reuse_blocks) |
|
| 29 |
+ return; |
|
| 30 |
+ |
|
| 31 |
+ for (i = 0; i < nb_coefs; i++) {
|
|
| 32 |
+ uint8_t min_exp = *exp; |
|
| 33 |
+ uint8_t *exp1 = exp + 256; |
|
| 34 |
+ for (blk = 0; blk < num_reuse_blocks; blk++) {
|
|
| 35 |
+ uint8_t next_exp = *exp1; |
|
| 36 |
+ if (next_exp < min_exp) |
|
| 37 |
+ min_exp = next_exp; |
|
| 38 |
+ exp1 += 256; |
|
| 39 |
+ } |
|
| 40 |
+ *exp++ = min_exp; |
|
| 41 |
+ } |
|
| 42 |
+} |
|
| 43 |
+ |
|
| 44 |
+av_cold void ff_ac3dsp_init(AC3DSPContext *c) |
|
| 45 |
+{
|
|
| 46 |
+ c->ac3_exponent_min = ac3_exponent_min_c; |
|
| 47 |
+ |
|
| 48 |
+ if (HAVE_MMX) |
|
| 49 |
+ ff_ac3dsp_init_x86(c); |
|
| 50 |
+} |
| 0 | 51 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,43 @@ |
| 0 |
+/* |
|
| 1 |
+ * AC-3 DSP utils |
|
| 2 |
+ * Copyright (c) 2011 Justin Ruggles |
|
| 3 |
+ * |
|
| 4 |
+ * This file is part of FFmpeg. |
|
| 5 |
+ * |
|
| 6 |
+ * FFmpeg is free software; you can redistribute it and/or |
|
| 7 |
+ * modify it under the terms of the GNU Lesser General Public |
|
| 8 |
+ * License as published by the Free Software Foundation; either |
|
| 9 |
+ * version 2.1 of the License, or (at your option) any later version. |
|
| 10 |
+ * |
|
| 11 |
+ * FFmpeg is distributed in the hope that it will be useful, |
|
| 12 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 13 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
| 14 |
+ * Lesser General Public License for more details. |
|
| 15 |
+ * |
|
| 16 |
+ * You should have received a copy of the GNU Lesser General Public |
|
| 17 |
+ * License along with FFmpeg; if not, write to the Free Software |
|
| 18 |
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
| 19 |
+ */ |
|
| 20 |
+ |
|
| 21 |
+#ifndef AVCODEC_AC3DSP_H |
|
| 22 |
+#define AVCODEC_AC3DSP_H |
|
| 23 |
+ |
|
| 24 |
+#include <stdint.h> |
|
| 25 |
+ |
|
| 26 |
+typedef struct AC3DSPContext {
|
|
| 27 |
+ /** |
|
| 28 |
+ * Set each encoded exponent in a block to the minimum of itself and the |
|
| 29 |
+ * exponents in the same frequency bin of up to 5 following blocks. |
|
| 30 |
+ * @param exp pointer to the start of the current block of exponents. |
|
| 31 |
+ * constraints: align 16 |
|
| 32 |
+ * @param num_reuse_blocks number of blocks that will reuse exponents from the current block. |
|
| 33 |
+ * constraints: range 0 to 5 |
|
| 34 |
+ * @param nb_coefs number of frequency coefficients. |
|
| 35 |
+ */ |
|
| 36 |
+ void (*ac3_exponent_min)(uint8_t *exp, int num_reuse_blocks, int nb_coefs); |
|
| 37 |
+} AC3DSPContext; |
|
| 38 |
+ |
|
| 39 |
+void ff_ac3dsp_init (AC3DSPContext *c); |
|
| 40 |
+void ff_ac3dsp_init_x86(AC3DSPContext *c); |
|
| 41 |
+ |
|
| 42 |
+#endif /* AVCODEC_AC3DSP_H */ |
| ... | ... |
@@ -33,6 +33,7 @@ |
| 33 | 33 |
#include "avcodec.h" |
| 34 | 34 |
#include "put_bits.h" |
| 35 | 35 |
#include "dsputil.h" |
| 36 |
+#include "ac3dsp.h" |
|
| 36 | 37 |
#include "ac3.h" |
| 37 | 38 |
#include "audioconvert.h" |
| 38 | 39 |
|
| ... | ... |
@@ -86,6 +87,7 @@ typedef struct AC3Block {
|
| 86 | 86 |
typedef struct AC3EncodeContext {
|
| 87 | 87 |
PutBitContext pb; ///< bitstream writer context |
| 88 | 88 |
DSPContext dsp; |
| 89 |
+ AC3DSPContext ac3dsp; ///< AC-3 optimized functions |
|
| 89 | 90 |
AC3MDCTContext mdct; ///< MDCT context |
| 90 | 91 |
|
| 91 | 92 |
AC3Block blocks[AC3_MAX_BLOCKS]; ///< per-block info |
| ... | ... |
@@ -458,7 +460,6 @@ static void compute_exp_strategy_ch(AC3EncodeContext *s, uint8_t *exp_strategy, |
| 458 | 458 |
exp_strategy[blk] = EXP_REUSE; |
| 459 | 459 |
exp += AC3_MAX_COEFS; |
| 460 | 460 |
} |
| 461 |
- emms_c(); |
|
| 462 | 461 |
|
| 463 | 462 |
/* now select the encoding strategy type : if exponents are often |
| 464 | 463 |
recoded, we use a coarse encoding */ |
| ... | ... |
@@ -499,31 +500,6 @@ static void compute_exp_strategy(AC3EncodeContext *s) |
| 499 | 499 |
|
| 500 | 500 |
|
| 501 | 501 |
/** |
| 502 |
- * Set each encoded exponent in a block to the minimum of itself and the |
|
| 503 |
- * exponents in the same frequency bin of up to 5 following blocks. |
|
| 504 |
- */ |
|
| 505 |
-static void exponent_min(uint8_t *exp, int num_reuse_blocks, int nb_coefs) |
|
| 506 |
-{
|
|
| 507 |
- int blk, i; |
|
| 508 |
- |
|
| 509 |
- if (!num_reuse_blocks) |
|
| 510 |
- return; |
|
| 511 |
- |
|
| 512 |
- for (i = 0; i < nb_coefs; i++) {
|
|
| 513 |
- uint8_t min_exp = *exp; |
|
| 514 |
- uint8_t *exp1 = exp + AC3_MAX_COEFS; |
|
| 515 |
- for (blk = 0; blk < num_reuse_blocks; blk++) {
|
|
| 516 |
- uint8_t next_exp = *exp1; |
|
| 517 |
- if (next_exp < min_exp) |
|
| 518 |
- min_exp = next_exp; |
|
| 519 |
- exp1 += AC3_MAX_COEFS; |
|
| 520 |
- } |
|
| 521 |
- *exp++ = min_exp; |
|
| 522 |
- } |
|
| 523 |
-} |
|
| 524 |
- |
|
| 525 |
- |
|
| 526 |
-/** |
|
| 527 | 502 |
* Update the exponents so that they are the ones the decoder will decode. |
| 528 | 503 |
*/ |
| 529 | 504 |
static void encode_exponents_blk_ch(uint8_t *exp, int nb_exps, int exp_strategy) |
| ... | ... |
@@ -616,7 +592,7 @@ static void encode_exponents(AC3EncodeContext *s) |
| 616 | 616 |
num_reuse_blocks = blk1 - blk - 1; |
| 617 | 617 |
|
| 618 | 618 |
/* for the EXP_REUSE case we select the min of the exponents */ |
| 619 |
- exponent_min(exp, num_reuse_blocks, nb_coefs); |
|
| 619 |
+ s->ac3dsp.ac3_exponent_min(exp, num_reuse_blocks, nb_coefs); |
|
| 620 | 620 |
|
| 621 | 621 |
encode_exponents_blk_ch(exp, nb_coefs, exp_strategy[blk]); |
| 622 | 622 |
|
| ... | ... |
@@ -704,6 +680,8 @@ static void process_exponents(AC3EncodeContext *s) |
| 704 | 704 |
encode_exponents(s); |
| 705 | 705 |
|
| 706 | 706 |
group_exponents(s); |
| 707 |
+ |
|
| 708 |
+ emms_c(); |
|
| 707 | 709 |
} |
| 708 | 710 |
|
| 709 | 711 |
|
| ... | ... |
@@ -1856,6 +1834,7 @@ static av_cold int ac3_encode_init(AVCodecContext *avctx) |
| 1856 | 1856 |
avctx->coded_frame= avcodec_alloc_frame(); |
| 1857 | 1857 |
|
| 1858 | 1858 |
dsputil_init(&s->dsp, avctx); |
| 1859 |
+ ff_ac3dsp_init(&s->ac3dsp); |
|
| 1859 | 1860 |
|
| 1860 | 1861 |
return 0; |
| 1861 | 1862 |
init_fail: |
| ... | ... |
@@ -17,6 +17,10 @@ MMX-OBJS-$(CONFIG_H264PRED) += x86/h264_intrapred_init.o |
| 17 | 17 |
|
| 18 | 18 |
YASM-OBJS-$(CONFIG_VC1_DECODER) += x86/vc1dsp_yasm.o |
| 19 | 19 |
|
| 20 |
+MMX-OBJS-$(CONFIG_AC3_ENCODER) += x86/ac3dsp_mmx.o |
|
| 21 |
+MMX-OBJS-$(CONFIG_AC3_FIXED_ENCODER) += x86/ac3dsp_mmx.o |
|
| 22 |
+YASM-OBJS-$(CONFIG_AC3_ENCODER) += x86/ac3dsp.o |
|
| 23 |
+YASM-OBJS-$(CONFIG_AC3_FIXED_ENCODER) += x86/ac3dsp.o |
|
| 20 | 24 |
MMX-OBJS-$(CONFIG_CAVS_DECODER) += x86/cavsdsp_mmx.o |
| 21 | 25 |
MMX-OBJS-$(CONFIG_MP1FLOAT_DECODER) += x86/mpegaudiodec_mmx.o |
| 22 | 26 |
MMX-OBJS-$(CONFIG_MP2FLOAT_DECODER) += x86/mpegaudiodec_mmx.o |
| 23 | 27 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,67 @@ |
| 0 |
+;***************************************************************************** |
|
| 1 |
+;* x86-optimized AC-3 DSP utils |
|
| 2 |
+;* Copyright (c) 2011 Justin Ruggles |
|
| 3 |
+;* |
|
| 4 |
+;* This file is part of FFmpeg. |
|
| 5 |
+;* |
|
| 6 |
+;* FFmpeg is free software; you can redistribute it and/or |
|
| 7 |
+;* modify it under the terms of the GNU Lesser General Public |
|
| 8 |
+;* License as published by the Free Software Foundation; either |
|
| 9 |
+;* version 2.1 of the License, or (at your option) any later version. |
|
| 10 |
+;* |
|
| 11 |
+;* FFmpeg is distributed in the hope that it will be useful, |
|
| 12 |
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 13 |
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
| 14 |
+;* Lesser General Public License for more details. |
|
| 15 |
+;* |
|
| 16 |
+;* You should have received a copy of the GNU Lesser General Public |
|
| 17 |
+;* License along with FFmpeg; if not, write to the Free Software |
|
| 18 |
+;* 51, Inc., Foundation Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
| 19 |
+;****************************************************************************** |
|
| 20 |
+ |
|
| 21 |
+%include "x86inc.asm" |
|
| 22 |
+%include "x86util.asm" |
|
| 23 |
+ |
|
| 24 |
+SECTION .text |
|
| 25 |
+ |
|
| 26 |
+;----------------------------------------------------------------------------- |
|
| 27 |
+; void ff_ac3_exponent_min(uint8_t *exp, int num_reuse_blocks, int nb_coefs) |
|
| 28 |
+;----------------------------------------------------------------------------- |
|
| 29 |
+ |
|
| 30 |
+%macro AC3_EXPONENT_MIN 1 |
|
| 31 |
+cglobal ac3_exponent_min_%1, 3,4,2, exp, reuse_blks, expn, offset |
|
| 32 |
+ shl reuse_blksq, 8 |
|
| 33 |
+ jz .end |
|
| 34 |
+ LOOP_ALIGN |
|
| 35 |
+.nextexp: |
|
| 36 |
+ mov offsetq, reuse_blksq |
|
| 37 |
+ mova m0, [expq+offsetq] |
|
| 38 |
+ sub offsetq, 256 |
|
| 39 |
+ LOOP_ALIGN |
|
| 40 |
+.nextblk: |
|
| 41 |
+ PMINUB m0, [expq+offsetq], m1 |
|
| 42 |
+ sub offsetq, 256 |
|
| 43 |
+ jae .nextblk |
|
| 44 |
+ mova [expq], m0 |
|
| 45 |
+ add expq, mmsize |
|
| 46 |
+ sub expnq, mmsize |
|
| 47 |
+ jg .nextexp |
|
| 48 |
+.end: |
|
| 49 |
+ REP_RET |
|
| 50 |
+%endmacro |
|
| 51 |
+ |
|
| 52 |
+%define PMINUB PMINUB_MMX |
|
| 53 |
+%define LOOP_ALIGN |
|
| 54 |
+INIT_MMX |
|
| 55 |
+AC3_EXPONENT_MIN mmx |
|
| 56 |
+%ifdef HAVE_MMX2 |
|
| 57 |
+%define PMINUB PMINUB_MMXEXT |
|
| 58 |
+%define LOOP_ALIGN ALIGN 16 |
|
| 59 |
+AC3_EXPONENT_MIN mmxext |
|
| 60 |
+%endif |
|
| 61 |
+%ifdef HAVE_SSE |
|
| 62 |
+INIT_XMM |
|
| 63 |
+AC3_EXPONENT_MIN sse2 |
|
| 64 |
+%endif |
|
| 65 |
+%undef PMINUB |
|
| 66 |
+%undef LOOP_ALIGN |
| 0 | 67 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,45 @@ |
| 0 |
+/* |
|
| 1 |
+ * x86-optimized AC-3 DSP utils |
|
| 2 |
+ * Copyright (c) 2011 Justin Ruggles |
|
| 3 |
+ * |
|
| 4 |
+ * This file is part of FFmpeg. |
|
| 5 |
+ * |
|
| 6 |
+ * FFmpeg is free software; you can redistribute it and/or |
|
| 7 |
+ * modify it under the terms of the GNU Lesser General Public |
|
| 8 |
+ * License as published by the Free Software Foundation; either |
|
| 9 |
+ * version 2.1 of the License, or (at your option) any later version. |
|
| 10 |
+ * |
|
| 11 |
+ * FFmpeg is distributed in the hope that it will be useful, |
|
| 12 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 13 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
| 14 |
+ * Lesser General Public License for more details. |
|
| 15 |
+ * |
|
| 16 |
+ * You should have received a copy of the GNU Lesser General Public |
|
| 17 |
+ * License along with FFmpeg; if not, write to the Free Software |
|
| 18 |
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
| 19 |
+ */ |
|
| 20 |
+ |
|
| 21 |
+#include "libavutil/x86_cpu.h" |
|
| 22 |
+#include "dsputil_mmx.h" |
|
| 23 |
+#include "libavcodec/ac3dsp.h" |
|
| 24 |
+ |
|
| 25 |
+extern void ff_ac3_exponent_min_mmx (uint8_t *exp, int num_reuse_blocks, int nb_coefs); |
|
| 26 |
+extern void ff_ac3_exponent_min_mmxext(uint8_t *exp, int num_reuse_blocks, int nb_coefs); |
|
| 27 |
+extern void ff_ac3_exponent_min_sse2 (uint8_t *exp, int num_reuse_blocks, int nb_coefs); |
|
| 28 |
+ |
|
| 29 |
+av_cold void ff_ac3dsp_init_x86(AC3DSPContext *c) |
|
| 30 |
+{
|
|
| 31 |
+ int mm_flags = av_get_cpu_flags(); |
|
| 32 |
+ |
|
| 33 |
+#if HAVE_YASM |
|
| 34 |
+ if (mm_flags & AV_CPU_FLAG_MMX) {
|
|
| 35 |
+ c->ac3_exponent_min = ff_ac3_exponent_min_mmx; |
|
| 36 |
+ } |
|
| 37 |
+ if (mm_flags & AV_CPU_FLAG_MMX2 && HAVE_MMX2) {
|
|
| 38 |
+ c->ac3_exponent_min = ff_ac3_exponent_min_mmxext; |
|
| 39 |
+ } |
|
| 40 |
+ if (mm_flags & AV_CPU_FLAG_SSE2 && HAVE_SSE) {
|
|
| 41 |
+ c->ac3_exponent_min = ff_ac3_exponent_min_sse2; |
|
| 42 |
+ } |
|
| 43 |
+#endif |
|
| 44 |
+} |
| ... | ... |
@@ -434,3 +434,13 @@ |
| 434 | 434 |
movh [%7], %3 |
| 435 | 435 |
movh [%7+%8], %4 |
| 436 | 436 |
%endmacro |
| 437 |
+ |
|
| 438 |
+%macro PMINUB_MMX 3 ; dst, src, tmp |
|
| 439 |
+ mova %3, %1 |
|
| 440 |
+ psubusb %3, %2 |
|
| 441 |
+ psubb %1, %3 |
|
| 442 |
+%endmacro |
|
| 443 |
+ |
|
| 444 |
+%macro PMINUB_MMXEXT 3 ; dst, src, ignored |
|
| 445 |
+ pminub %1, %2 |
|
| 446 |
+%endmacro |