* qatar/master:
ac3enc: ARM optimised ac3_compute_matissa_size
ac3: armv6 optimised bit_alloc_calc_bap
fate: simplify fft test rules
avio: document avio_alloc_context.
lavf: make compute_chapters_end less picky.
sierravmd: fix Indeo3 videos
FFT: simplify fft8()
fate: add fixed-point fft/mdct tests
Fixed-point support in fft-test
ape: check that number of seektable entries is equal to number of frames
Merged-by: Michael Niedermayer <michaelni@gmx.at>
| ... | ... |
@@ -661,7 +661,7 @@ SKIPHEADERS += mpegaudio3.h |
| 661 | 661 |
|
| 662 | 662 |
EXAMPLES = api |
| 663 | 663 |
|
| 664 |
-TESTPROGS = cabac dct eval fft h264 iirfilter rangecoder snow |
|
| 664 |
+TESTPROGS = cabac dct eval fft fft-fixed h264 iirfilter rangecoder snow |
|
| 665 | 665 |
TESTPROGS-$(HAVE_MMX) += motion |
| 666 | 666 |
TESTOBJS = dctref.o |
| 667 | 667 |
|
| ... | ... |
@@ -1,6 +1,10 @@ |
| 1 |
-OBJS-$(CONFIG_AC3DSP) += arm/ac3dsp_init_arm.o |
|
| 1 |
+OBJS-$(CONFIG_AC3DSP) += arm/ac3dsp_init_arm.o \ |
|
| 2 |
+ arm/ac3dsp_arm.o |
|
| 3 |
+ |
|
| 2 | 4 |
OBJS-$(CONFIG_DCA_DECODER) += arm/dcadsp_init_arm.o \ |
| 3 | 5 |
|
| 6 |
+ARMV6-OBJS-$(CONFIG_AC3DSP) += arm/ac3dsp_armv6.o |
|
| 7 |
+ |
|
| 4 | 8 |
OBJS-$(CONFIG_VP5_DECODER) += arm/vp56dsp_init_arm.o |
| 5 | 9 |
OBJS-$(CONFIG_VP6_DECODER) += arm/vp56dsp_init_arm.o |
| 6 | 10 |
OBJS-$(CONFIG_VP8_DECODER) += arm/vp8dsp_init_arm.o |
| 7 | 11 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,52 @@ |
| 0 |
+/* |
|
| 1 |
+ * Copyright (c) 2011 Mans Rullgard <mans@mansr.com> |
|
| 2 |
+ * |
|
| 3 |
+ * This file is part of Libav. |
|
| 4 |
+ * |
|
| 5 |
+ * Libav is free software; you can redistribute it and/or |
|
| 6 |
+ * modify it under the terms of the GNU Lesser General Public |
|
| 7 |
+ * License as published by the Free Software Foundation; either |
|
| 8 |
+ * version 2.1 of the License, or (at your option) any later version. |
|
| 9 |
+ * |
|
| 10 |
+ * Libav is distributed in the hope that it will be useful, |
|
| 11 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 12 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
| 13 |
+ * Lesser General Public License for more details. |
|
| 14 |
+ * |
|
| 15 |
+ * You should have received a copy of the GNU Lesser General Public |
|
| 16 |
+ * License along with Libav; if not, write to the Free Software |
|
| 17 |
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
| 18 |
+ */ |
|
| 19 |
+ |
|
| 20 |
+#include "asm.S" |
|
| 21 |
+ |
|
| 22 |
+function ff_ac3_compute_mantissa_size_arm, export=1 |
|
| 23 |
+ push {r4-r8,lr}
|
|
| 24 |
+ ldm r0, {r4-r8}
|
|
| 25 |
+ mov r3, r0 |
|
| 26 |
+ mov r0, #0 |
|
| 27 |
+1: |
|
| 28 |
+ ldrb lr, [r1], #1 |
|
| 29 |
+ subs r2, r2, #1 |
|
| 30 |
+ blt 2f |
|
| 31 |
+ cmp lr, #4 |
|
| 32 |
+ bgt 3f |
|
| 33 |
+ subs lr, lr, #1 |
|
| 34 |
+ addlt r4, r4, #1 |
|
| 35 |
+ addeq r5, r5, #1 |
|
| 36 |
+ ble 1b |
|
| 37 |
+ subs lr, lr, #2 |
|
| 38 |
+ addlt r6, r6, #1 |
|
| 39 |
+ addeq r7, r7, #1 |
|
| 40 |
+ addgt r8, r8, #1 |
|
| 41 |
+ b 1b |
|
| 42 |
+3: |
|
| 43 |
+ cmp lr, #14 |
|
| 44 |
+ sublt lr, lr, #1 |
|
| 45 |
+ addgt r0, r0, #16 |
|
| 46 |
+ addle r0, r0, lr |
|
| 47 |
+ b 1b |
|
| 48 |
+2: |
|
| 49 |
+ stm r3, {r4-r8}
|
|
| 50 |
+ pop {r4-r8,pc}
|
|
| 51 |
+endfunc |
| 0 | 52 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,83 @@ |
| 0 |
+/* |
|
| 1 |
+ * Copyright (c) 2011 Mans Rullgard <mans@mansr.com> |
|
| 2 |
+ * |
|
| 3 |
+ * This file is part of Libav. |
|
| 4 |
+ * |
|
| 5 |
+ * Libav is free software; you can redistribute it and/or |
|
| 6 |
+ * modify it under the terms of the GNU Lesser General Public |
|
| 7 |
+ * License as published by the Free Software Foundation; either |
|
| 8 |
+ * version 2.1 of the License, or (at your option) any later version. |
|
| 9 |
+ * |
|
| 10 |
+ * Libav is distributed in the hope that it will be useful, |
|
| 11 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 12 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
| 13 |
+ * Lesser General Public License for more details. |
|
| 14 |
+ * |
|
| 15 |
+ * You should have received a copy of the GNU Lesser General Public |
|
| 16 |
+ * License along with Libav; if not, write to the Free Software |
|
| 17 |
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
| 18 |
+ */ |
|
| 19 |
+ |
|
| 20 |
+#include "asm.S" |
|
| 21 |
+ |
|
| 22 |
+function ff_ac3_bit_alloc_calc_bap_armv6, export=1 |
|
| 23 |
+ ldr r12, [sp] |
|
| 24 |
+ cmp r12, #-960 |
|
| 25 |
+ beq 4f |
|
| 26 |
+ push {r4-r11,lr}
|
|
| 27 |
+ add r5, sp, #40 |
|
| 28 |
+ movrel r4, X(ff_ac3_bin_to_band_tab) |
|
| 29 |
+ movrel lr, X(ff_ac3_band_start_tab) |
|
| 30 |
+ ldm r5, {r5-r7}
|
|
| 31 |
+ ldrb r4, [r4, r2] |
|
| 32 |
+ add r1, r1, r2, lsl #1 @ psd + start |
|
| 33 |
+ add r0, r0, r4, lsl #1 @ mask + band |
|
| 34 |
+ add r4, lr, r4 |
|
| 35 |
+ add r7, r7, r2 @ bap + start |
|
| 36 |
+ ldrb r10, [r4], #1 |
|
| 37 |
+1: |
|
| 38 |
+ ldrsh r9, [r0], #2 @ mask[band] |
|
| 39 |
+ movw r8, #0x1fe0 |
|
| 40 |
+ sub r9, r9, r12 @ - snr_offset |
|
| 41 |
+ mov r11, r10 |
|
| 42 |
+ ldrb r10, [r4], #1 @ band_start_tab[band++] |
|
| 43 |
+ subs r9, r9, r5 @ - floor |
|
| 44 |
+ movlt r9, #0 |
|
| 45 |
+ cmp r10, r3 @ - end |
|
| 46 |
+ and r9, r9, r8 @ & 0x1fe0 |
|
| 47 |
+ subgt r8, r3, r11 |
|
| 48 |
+ suble r8, r10, r11 |
|
| 49 |
+ add r9, r9, r5 @ + floor => m |
|
| 50 |
+ tst r8, #1 |
|
| 51 |
+ add r2, r7, r8 |
|
| 52 |
+ bne 3f |
|
| 53 |
+ b 5f |
|
| 54 |
+2: |
|
| 55 |
+ ldrsh r8, [r1], #2 |
|
| 56 |
+ ldrsh lr, [r1], #2 |
|
| 57 |
+ sub r8, r8, r9 |
|
| 58 |
+ sub lr, lr, r9 |
|
| 59 |
+ usat r8, #6, r8, asr #5 @ address |
|
| 60 |
+ usat lr, #6, lr, asr #5 |
|
| 61 |
+ ldrb r8, [r6, r8] @ bap_tab[address] |
|
| 62 |
+ ldrb lr, [r6, lr] |
|
| 63 |
+ strb r8, [r7], #1 @ bap[bin] |
|
| 64 |
+ strb lr, [r7], #1 |
|
| 65 |
+5: cmp r7, r2 |
|
| 66 |
+ blo 2b |
|
| 67 |
+ cmp r3, r11 |
|
| 68 |
+ bgt 1b |
|
| 69 |
+ pop {r4-r11,pc}
|
|
| 70 |
+3: |
|
| 71 |
+ ldrsh r8, [r1], #2 @ psd[bin] |
|
| 72 |
+ sub r8, r8, r9 @ - m |
|
| 73 |
+ usat r8, #6, r8, asr #5 @ address |
|
| 74 |
+ ldrb r8, [r6, r8] @ bap_tab[address] |
|
| 75 |
+ strb r8, [r7], #1 @ bap[bin] |
|
| 76 |
+ b 5b |
|
| 77 |
+4: |
|
| 78 |
+ ldr r0, [sp, #12] |
|
| 79 |
+ mov r1, #0 |
|
| 80 |
+ mov r2, #256 |
|
| 81 |
+ b memset |
|
| 82 |
+endfunc |
| ... | ... |
@@ -29,8 +29,21 @@ void ff_ac3_lshift_int16_neon(int16_t *src, unsigned len, unsigned shift); |
| 29 | 29 |
void ff_ac3_rshift_int32_neon(int32_t *src, unsigned len, unsigned shift); |
| 30 | 30 |
void ff_float_to_fixed24_neon(int32_t *dst, const float *src, unsigned int len); |
| 31 | 31 |
|
| 32 |
+void ff_ac3_bit_alloc_calc_bap_armv6(int16_t *mask, int16_t *psd, |
|
| 33 |
+ int start, int end, |
|
| 34 |
+ int snr_offset, int floor, |
|
| 35 |
+ const uint8_t *bap_tab, uint8_t *bap); |
|
| 36 |
+ |
|
| 37 |
+int ff_ac3_compute_mantissa_size_arm(int cnt[5], uint8_t *bap, int nb_coefs); |
|
| 38 |
+ |
|
| 32 | 39 |
av_cold void ff_ac3dsp_init_arm(AC3DSPContext *c, int bit_exact) |
| 33 | 40 |
{
|
| 41 |
+ c->compute_mantissa_size = ff_ac3_compute_mantissa_size_arm; |
|
| 42 |
+ |
|
| 43 |
+ if (HAVE_ARMV6) {
|
|
| 44 |
+ c->bit_alloc_calc_bap = ff_ac3_bit_alloc_calc_bap_armv6; |
|
| 45 |
+ } |
|
| 46 |
+ |
|
| 34 | 47 |
if (HAVE_NEON) {
|
| 35 | 48 |
c->ac3_exponent_min = ff_ac3_exponent_min_neon; |
| 36 | 49 |
c->ac3_max_msb_abs_int16 = ff_ac3_max_msb_abs_int16_neon; |
| 37 | 50 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,20 @@ |
| 0 |
+/* |
|
| 1 |
+ * This file is part of FFmpeg. |
|
| 2 |
+ * |
|
| 3 |
+ * FFMpeg is free software; you can redistribute it and/or |
|
| 4 |
+ * modify it under the terms of the GNU Lesser General Public |
|
| 5 |
+ * License as published by the Free Software Foundation; either |
|
| 6 |
+ * version 2.1 of the License, or (at your option) any later version. |
|
| 7 |
+ * |
|
| 8 |
+ * FFMpeg is distributed in the hope that it will be useful, |
|
| 9 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 10 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
| 11 |
+ * Lesser General Public License for more details. |
|
| 12 |
+ * |
|
| 13 |
+ * You should have received a copy of the GNU Lesser General Public |
|
| 14 |
+ * License along with FFmpeg; if not, write to the Free Software |
|
| 15 |
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
| 16 |
+ */ |
|
| 17 |
+ |
|
| 18 |
+#define CONFIG_FFT_FLOAT 0 |
|
| 19 |
+#include "fft-test.c" |
| ... | ... |
@@ -27,8 +27,10 @@ |
| 27 | 27 |
#include "libavutil/lfg.h" |
| 28 | 28 |
#include "libavutil/log.h" |
| 29 | 29 |
#include "fft.h" |
| 30 |
+#if CONFIG_FFT_FLOAT |
|
| 30 | 31 |
#include "dct.h" |
| 31 | 32 |
#include "rdft.h" |
| 33 |
+#endif |
|
| 32 | 34 |
#include <math.h> |
| 33 | 35 |
#include <unistd.h> |
| 34 | 36 |
#include <sys/time.h> |
| ... | ... |
@@ -47,7 +49,19 @@ |
| 47 | 47 |
pim += (MUL16(are, bim) + MUL16(bre, aim));\ |
| 48 | 48 |
} |
| 49 | 49 |
|
| 50 |
-FFTComplex *exptab; |
|
| 50 |
+#if CONFIG_FFT_FLOAT |
|
| 51 |
+# define RANGE 1.0 |
|
| 52 |
+# define REF_SCALE(x, bits) (x) |
|
| 53 |
+# define FMT "%10.6f" |
|
| 54 |
+#else |
|
| 55 |
+# define RANGE 16384 |
|
| 56 |
+# define REF_SCALE(x, bits) ((x) / (1<<(bits))) |
|
| 57 |
+# define FMT "%6d" |
|
| 58 |
+#endif |
|
| 59 |
+ |
|
| 60 |
+struct {
|
|
| 61 |
+ float re, im; |
|
| 62 |
+} *exptab; |
|
| 51 | 63 |
|
| 52 | 64 |
static void fft_ref_init(int nbits, int inverse) |
| 53 | 65 |
{
|
| ... | ... |
@@ -55,7 +69,7 @@ static void fft_ref_init(int nbits, int inverse) |
| 55 | 55 |
double c1, s1, alpha; |
| 56 | 56 |
|
| 57 | 57 |
n = 1 << nbits; |
| 58 |
- exptab = av_malloc((n / 2) * sizeof(FFTComplex)); |
|
| 58 |
+ exptab = av_malloc((n / 2) * sizeof(*exptab)); |
|
| 59 | 59 |
|
| 60 | 60 |
for (i = 0; i < (n/2); i++) {
|
| 61 | 61 |
alpha = 2 * M_PI * (float)i / (float)n; |
| ... | ... |
@@ -92,12 +106,12 @@ static void fft_ref(FFTComplex *tabr, FFTComplex *tab, int nbits) |
| 92 | 92 |
CMAC(tmp_re, tmp_im, c, s, q->re, q->im); |
| 93 | 93 |
q++; |
| 94 | 94 |
} |
| 95 |
- tabr[i].re = tmp_re; |
|
| 96 |
- tabr[i].im = tmp_im; |
|
| 95 |
+ tabr[i].re = REF_SCALE(tmp_re, nbits); |
|
| 96 |
+ tabr[i].im = REF_SCALE(tmp_im, nbits); |
|
| 97 | 97 |
} |
| 98 | 98 |
} |
| 99 | 99 |
|
| 100 |
-static void imdct_ref(float *out, float *in, int nbits) |
|
| 100 |
+static void imdct_ref(FFTSample *out, FFTSample *in, int nbits) |
|
| 101 | 101 |
{
|
| 102 | 102 |
int n = 1<<nbits; |
| 103 | 103 |
int k, i, a; |
| ... | ... |
@@ -110,12 +124,12 @@ static void imdct_ref(float *out, float *in, int nbits) |
| 110 | 110 |
f = cos(M_PI * a / (double)(2 * n)); |
| 111 | 111 |
sum += f * in[k]; |
| 112 | 112 |
} |
| 113 |
- out[i] = -sum; |
|
| 113 |
+ out[i] = REF_SCALE(-sum, nbits - 2); |
|
| 114 | 114 |
} |
| 115 | 115 |
} |
| 116 | 116 |
|
| 117 | 117 |
/* NOTE: no normalisation by 1 / N is done */ |
| 118 |
-static void mdct_ref(float *output, float *input, int nbits) |
|
| 118 |
+static void mdct_ref(FFTSample *output, FFTSample *input, int nbits) |
|
| 119 | 119 |
{
|
| 120 | 120 |
int n = 1<<nbits; |
| 121 | 121 |
int k, i; |
| ... | ... |
@@ -128,10 +142,11 @@ static void mdct_ref(float *output, float *input, int nbits) |
| 128 | 128 |
a = (2*M_PI*(2*i+1+n/2)*(2*k+1) / (4 * n)); |
| 129 | 129 |
s += input[i] * cos(a); |
| 130 | 130 |
} |
| 131 |
- output[k] = s; |
|
| 131 |
+ output[k] = REF_SCALE(s, nbits - 1); |
|
| 132 | 132 |
} |
| 133 | 133 |
} |
| 134 | 134 |
|
| 135 |
+#if CONFIG_FFT_FLOAT |
|
| 135 | 136 |
static void idct_ref(float *output, float *input, int nbits) |
| 136 | 137 |
{
|
| 137 | 138 |
int n = 1<<nbits; |
| ... | ... |
@@ -164,11 +179,12 @@ static void dct_ref(float *output, float *input, int nbits) |
| 164 | 164 |
output[k] = s; |
| 165 | 165 |
} |
| 166 | 166 |
} |
| 167 |
+#endif |
|
| 167 | 168 |
|
| 168 | 169 |
|
| 169 |
-static float frandom(AVLFG *prng) |
|
| 170 |
+static FFTSample frandom(AVLFG *prng) |
|
| 170 | 171 |
{
|
| 171 |
- return (int16_t)av_lfg_get(prng) / 32768.0; |
|
| 172 |
+ return (int16_t)av_lfg_get(prng) / 32768.0 * RANGE; |
|
| 172 | 173 |
} |
| 173 | 174 |
|
| 174 | 175 |
static int64_t gettime(void) |
| ... | ... |
@@ -178,7 +194,7 @@ static int64_t gettime(void) |
| 178 | 178 |
return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec; |
| 179 | 179 |
} |
| 180 | 180 |
|
| 181 |
-static int check_diff(float *tab1, float *tab2, int n, double scale) |
|
| 181 |
+static int check_diff(FFTSample *tab1, FFTSample *tab2, int n, double scale) |
|
| 182 | 182 |
{
|
| 183 | 183 |
int i; |
| 184 | 184 |
double max= 0; |
| ... | ... |
@@ -186,9 +202,9 @@ static int check_diff(float *tab1, float *tab2, int n, double scale) |
| 186 | 186 |
int err = 0; |
| 187 | 187 |
|
| 188 | 188 |
for (i = 0; i < n; i++) {
|
| 189 |
- double e= fabsf(tab1[i] - (tab2[i] / scale)); |
|
| 189 |
+ double e = fabsf(tab1[i] - (tab2[i] / scale)) / RANGE; |
|
| 190 | 190 |
if (e >= 1e-3) {
|
| 191 |
- av_log(NULL, AV_LOG_ERROR, "ERROR %5d: %10.6f %10.6f\n", |
|
| 191 |
+ av_log(NULL, AV_LOG_ERROR, "ERROR %5d: "FMT" "FMT"\n", |
|
| 192 | 192 |
i, tab1[i], tab2[i]); |
| 193 | 193 |
err = 1; |
| 194 | 194 |
} |
| ... | ... |
@@ -233,8 +249,10 @@ int main(int argc, char **argv) |
| 233 | 233 |
int do_inverse = 0; |
| 234 | 234 |
FFTContext s1, *s = &s1; |
| 235 | 235 |
FFTContext m1, *m = &m1; |
| 236 |
+#if CONFIG_FFT_FLOAT |
|
| 236 | 237 |
RDFTContext r1, *r = &r1; |
| 237 | 238 |
DCTContext d1, *d = &d1; |
| 239 |
+#endif |
|
| 238 | 240 |
int fft_nbits, fft_size, fft_size_2; |
| 239 | 241 |
double scale = 1.0; |
| 240 | 242 |
AVLFG prng; |
| ... | ... |
@@ -297,6 +315,7 @@ int main(int argc, char **argv) |
| 297 | 297 |
ff_fft_init(s, fft_nbits, do_inverse); |
| 298 | 298 |
fft_ref_init(fft_nbits, do_inverse); |
| 299 | 299 |
break; |
| 300 |
+#if CONFIG_FFT_FLOAT |
|
| 300 | 301 |
case TRANSFORM_RDFT: |
| 301 | 302 |
if (do_inverse) |
| 302 | 303 |
av_log(NULL, AV_LOG_INFO,"IDFT_C2R"); |
| ... | ... |
@@ -312,6 +331,10 @@ int main(int argc, char **argv) |
| 312 | 312 |
av_log(NULL, AV_LOG_INFO,"DCT_II"); |
| 313 | 313 |
ff_dct_init(d, fft_nbits, do_inverse ? DCT_III : DCT_II); |
| 314 | 314 |
break; |
| 315 |
+#endif |
|
| 316 |
+ default: |
|
| 317 |
+ av_log(NULL, AV_LOG_ERROR, "Requested transform not supported\n"); |
|
| 318 |
+ return 1; |
|
| 315 | 319 |
} |
| 316 | 320 |
av_log(NULL, AV_LOG_INFO," %d test\n", fft_size); |
| 317 | 321 |
|
| ... | ... |
@@ -328,15 +351,15 @@ int main(int argc, char **argv) |
| 328 | 328 |
switch (transform) {
|
| 329 | 329 |
case TRANSFORM_MDCT: |
| 330 | 330 |
if (do_inverse) {
|
| 331 |
- imdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); |
|
| 332 |
- m->imdct_calc(m, tab2, (float *)tab1); |
|
| 333 |
- err = check_diff((float *)tab_ref, tab2, fft_size, scale); |
|
| 331 |
+ imdct_ref((FFTSample *)tab_ref, (FFTSample *)tab1, fft_nbits); |
|
| 332 |
+ m->imdct_calc(m, tab2, (FFTSample *)tab1); |
|
| 333 |
+ err = check_diff((FFTSample *)tab_ref, tab2, fft_size, scale); |
|
| 334 | 334 |
} else {
|
| 335 |
- mdct_ref((float *)tab_ref, (float *)tab1, fft_nbits); |
|
| 335 |
+ mdct_ref((FFTSample *)tab_ref, (FFTSample *)tab1, fft_nbits); |
|
| 336 | 336 |
|
| 337 |
- m->mdct_calc(m, tab2, (float *)tab1); |
|
| 337 |
+ m->mdct_calc(m, tab2, (FFTSample *)tab1); |
|
| 338 | 338 |
|
| 339 |
- err = check_diff((float *)tab_ref, tab2, fft_size / 2, scale); |
|
| 339 |
+ err = check_diff((FFTSample *)tab_ref, tab2, fft_size / 2, scale); |
|
| 340 | 340 |
} |
| 341 | 341 |
break; |
| 342 | 342 |
case TRANSFORM_FFT: |
| ... | ... |
@@ -345,8 +368,9 @@ int main(int argc, char **argv) |
| 345 | 345 |
s->fft_calc(s, tab); |
| 346 | 346 |
|
| 347 | 347 |
fft_ref(tab_ref, tab1, fft_nbits); |
| 348 |
- err = check_diff((float *)tab_ref, (float *)tab, fft_size * 2, 1.0); |
|
| 348 |
+ err = check_diff((FFTSample *)tab_ref, (FFTSample *)tab, fft_size * 2, 1.0); |
|
| 349 | 349 |
break; |
| 350 |
+#if CONFIG_FFT_FLOAT |
|
| 350 | 351 |
case TRANSFORM_RDFT: |
| 351 | 352 |
if (do_inverse) {
|
| 352 | 353 |
tab1[ 0].im = 0; |
| ... | ... |
@@ -387,6 +411,7 @@ int main(int argc, char **argv) |
| 387 | 387 |
} |
| 388 | 388 |
err = check_diff((float *)tab_ref, (float *)tab, fft_size, 1.0); |
| 389 | 389 |
break; |
| 390 |
+#endif |
|
| 390 | 391 |
} |
| 391 | 392 |
|
| 392 | 393 |
/* do a speed test */ |
| ... | ... |
@@ -404,15 +429,16 @@ int main(int argc, char **argv) |
| 404 | 404 |
switch (transform) {
|
| 405 | 405 |
case TRANSFORM_MDCT: |
| 406 | 406 |
if (do_inverse) {
|
| 407 |
- m->imdct_calc(m, (float *)tab, (float *)tab1); |
|
| 407 |
+ m->imdct_calc(m, (FFTSample *)tab, (FFTSample *)tab1); |
|
| 408 | 408 |
} else {
|
| 409 |
- m->mdct_calc(m, (float *)tab, (float *)tab1); |
|
| 409 |
+ m->mdct_calc(m, (FFTSample *)tab, (FFTSample *)tab1); |
|
| 410 | 410 |
} |
| 411 | 411 |
break; |
| 412 | 412 |
case TRANSFORM_FFT: |
| 413 | 413 |
memcpy(tab, tab1, fft_size * sizeof(FFTComplex)); |
| 414 | 414 |
s->fft_calc(s, tab); |
| 415 | 415 |
break; |
| 416 |
+#if CONFIG_FFT_FLOAT |
|
| 416 | 417 |
case TRANSFORM_RDFT: |
| 417 | 418 |
memcpy(tab2, tab1, fft_size * sizeof(FFTSample)); |
| 418 | 419 |
r->rdft_calc(r, tab2); |
| ... | ... |
@@ -421,6 +447,7 @@ int main(int argc, char **argv) |
| 421 | 421 |
memcpy(tab2, tab1, fft_size * sizeof(FFTSample)); |
| 422 | 422 |
d->dct_calc(d, tab2); |
| 423 | 423 |
break; |
| 424 |
+#endif |
|
| 424 | 425 |
} |
| 425 | 426 |
} |
| 426 | 427 |
duration = gettime() - time_start; |
| ... | ... |
@@ -441,12 +468,14 @@ int main(int argc, char **argv) |
| 441 | 441 |
case TRANSFORM_FFT: |
| 442 | 442 |
ff_fft_end(s); |
| 443 | 443 |
break; |
| 444 |
+#if CONFIG_FFT_FLOAT |
|
| 444 | 445 |
case TRANSFORM_RDFT: |
| 445 | 446 |
ff_rdft_end(r); |
| 446 | 447 |
break; |
| 447 | 448 |
case TRANSFORM_DCT: |
| 448 | 449 |
ff_dct_end(d); |
| 449 | 450 |
break; |
| 451 |
+#endif |
|
| 450 | 452 |
} |
| 451 | 453 |
|
| 452 | 454 |
av_free(tab); |
| ... | ... |
@@ -246,21 +246,16 @@ static void fft4(FFTComplex *z) |
| 246 | 246 |
|
| 247 | 247 |
static void fft8(FFTComplex *z) |
| 248 | 248 |
{
|
| 249 |
- FFTDouble t1, t2, t3, t4, t5, t6, t7, t8; |
|
| 249 |
+ FFTDouble t1, t2, t3, t4, t5, t6; |
|
| 250 | 250 |
|
| 251 | 251 |
fft4(z); |
| 252 | 252 |
|
| 253 | 253 |
BF(t1, z[5].re, z[4].re, -z[5].re); |
| 254 | 254 |
BF(t2, z[5].im, z[4].im, -z[5].im); |
| 255 |
- BF(t3, z[7].re, z[6].re, -z[7].re); |
|
| 256 |
- BF(t4, z[7].im, z[6].im, -z[7].im); |
|
| 257 |
- BF(t8, t1, t3, t1); |
|
| 258 |
- BF(t7, t2, t2, t4); |
|
| 259 |
- BF(z[4].re, z[0].re, z[0].re, t1); |
|
| 260 |
- BF(z[4].im, z[0].im, z[0].im, t2); |
|
| 261 |
- BF(z[6].re, z[2].re, z[2].re, t7); |
|
| 262 |
- BF(z[6].im, z[2].im, z[2].im, t8); |
|
| 255 |
+ BF(t5, z[7].re, z[6].re, -z[7].re); |
|
| 256 |
+ BF(t6, z[7].im, z[6].im, -z[7].im); |
|
| 263 | 257 |
|
| 258 |
+ BUTTERFLIES(z[0],z[2],z[4],z[6]); |
|
| 264 | 259 |
TRANSFORM(z[1],z[3],z[5],z[7],sqrthalf,sqrthalf); |
| 265 | 260 |
} |
| 266 | 261 |
|
| ... | ... |
@@ -250,6 +250,11 @@ static int ape_read_header(AVFormatContext * s, AVFormatParameters * ap) |
| 250 | 250 |
av_log(s, AV_LOG_ERROR, "Too many frames: %d\n", ape->totalframes); |
| 251 | 251 |
return -1; |
| 252 | 252 |
} |
| 253 |
+ if (ape->seektablelength && (ape->seektablelength / sizeof(*ape->seektable)) < ape->totalframes) {
|
|
| 254 |
+ av_log(s, AV_LOG_ERROR, "Number of seek entries is less than number of frames: %d vs. %d\n", |
|
| 255 |
+ ape->seektablelength / sizeof(*ape->seektable), ape->totalframes); |
|
| 256 |
+ return AVERROR_INVALIDDATA; |
|
| 257 |
+ } |
|
| 253 | 258 |
ape->frames = av_malloc(ape->totalframes * sizeof(APEFrame)); |
| 254 | 259 |
if(!ape->frames) |
| 255 | 260 |
return AVERROR(ENOMEM); |
| ... | ... |
@@ -454,6 +454,22 @@ attribute_deprecated void init_checksum(AVIOContext *s, |
| 454 | 454 |
attribute_deprecated unsigned long get_checksum(AVIOContext *s); |
| 455 | 455 |
#endif |
| 456 | 456 |
|
| 457 |
+/** |
|
| 458 |
+ * Allocate and initialize an AVIOContext for buffered I/O. It must be later |
|
| 459 |
+ * freed with av_free(). |
|
| 460 |
+ * |
|
| 461 |
+ * @param buffer Memory block for input/output operations via AVIOContext. |
|
| 462 |
+ * @param buffer_size The buffer size is very important for performance. |
|
| 463 |
+ * For protocols with fixed blocksize it should be set to this blocksize. |
|
| 464 |
+ * For others a typical size is a cache page, e.g. 4kb. |
|
| 465 |
+ * @param write_flag Set to 1 if the buffer should be writable, 0 otherwise. |
|
| 466 |
+ * @param opaque An opaque pointer to user-specific data. |
|
| 467 |
+ * @param read_packet A function for refilling the buffer, may be NULL. |
|
| 468 |
+ * @param write_packet A function for writing the buffer contents, may be NULL. |
|
| 469 |
+ * @param seek A function for seeking to specified byte position, may be NULL. |
|
| 470 |
+ * |
|
| 471 |
+ * @return Allocated AVIOContext or NULL on failure. |
|
| 472 |
+ */ |
|
| 457 | 473 |
AVIOContext *avio_alloc_context( |
| 458 | 474 |
unsigned char *buffer, |
| 459 | 475 |
int buffer_size, |
| ... | ... |
@@ -99,7 +99,7 @@ static int vmd_read_header(AVFormatContext *s, |
| 99 | 99 |
if (avio_read(pb, vmd->vmd_header, VMD_HEADER_SIZE) != VMD_HEADER_SIZE) |
| 100 | 100 |
return AVERROR(EIO); |
| 101 | 101 |
|
| 102 |
- if(vmd->vmd_header[16] == 'i' && vmd->vmd_header[17] == 'v' && vmd->vmd_header[18] == '3') |
|
| 102 |
+ if(vmd->vmd_header[24] == 'i' && vmd->vmd_header[25] == 'v' && vmd->vmd_header[26] == '3') |
|
| 103 | 103 |
vmd->is_indeo3 = 1; |
| 104 | 104 |
else |
| 105 | 105 |
vmd->is_indeo3 = 0; |
| ... | ... |
@@ -249,7 +249,7 @@ static int vmd_read_packet(AVFormatContext *s, |
| 249 | 249 |
return AVERROR(ENOMEM); |
| 250 | 250 |
pkt->pos= avio_tell(pb); |
| 251 | 251 |
memcpy(pkt->data, frame->frame_record, BYTES_PER_FRAME_RECORD); |
| 252 |
- if(vmd->is_indeo3) |
|
| 252 |
+ if(vmd->is_indeo3 && frame->frame_record[0] == 0x02) |
|
| 253 | 253 |
ret = avio_read(pb, pkt->data, frame->frame_size); |
| 254 | 254 |
else |
| 255 | 255 |
ret = avio_read(pb, pkt->data + BYTES_PER_FRAME_RECORD, |
| ... | ... |
@@ -2168,22 +2168,23 @@ enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag) |
| 2168 | 2168 |
|
| 2169 | 2169 |
static void compute_chapters_end(AVFormatContext *s) |
| 2170 | 2170 |
{
|
| 2171 |
- unsigned int i; |
|
| 2171 |
+ unsigned int i, j; |
|
| 2172 |
+ int64_t max_time = s->duration + (s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time; |
|
| 2172 | 2173 |
|
| 2173 |
- for (i=0; i+1<s->nb_chapters; i++) |
|
| 2174 |
+ for (i = 0; i < s->nb_chapters; i++) |
|
| 2174 | 2175 |
if (s->chapters[i]->end == AV_NOPTS_VALUE) {
|
| 2175 |
- assert(s->chapters[i]->start <= s->chapters[i+1]->start); |
|
| 2176 |
- assert(!av_cmp_q(s->chapters[i]->time_base, s->chapters[i+1]->time_base)); |
|
| 2177 |
- s->chapters[i]->end = s->chapters[i+1]->start; |
|
| 2176 |
+ AVChapter *ch = s->chapters[i]; |
|
| 2177 |
+ int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base) |
|
| 2178 |
+ : INT64_MAX; |
|
| 2179 |
+ |
|
| 2180 |
+ for (j = 0; j < s->nb_chapters; j++) {
|
|
| 2181 |
+ AVChapter *ch1 = s->chapters[j]; |
|
| 2182 |
+ int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base); |
|
| 2183 |
+ if (j != i && next_start > ch->start && next_start < end) |
|
| 2184 |
+ end = next_start; |
|
| 2185 |
+ } |
|
| 2186 |
+ ch->end = (end == INT64_MAX) ? ch->start : end; |
|
| 2178 | 2187 |
} |
| 2179 |
- |
|
| 2180 |
- if (s->nb_chapters && s->chapters[i]->end == AV_NOPTS_VALUE) {
|
|
| 2181 |
- assert(s->start_time != AV_NOPTS_VALUE); |
|
| 2182 |
- assert(s->duration > 0); |
|
| 2183 |
- s->chapters[i]->end = av_rescale_q(s->start_time + s->duration, |
|
| 2184 |
- AV_TIME_BASE_Q, |
|
| 2185 |
- s->chapters[i]->time_base); |
|
| 2186 |
- } |
|
| 2187 | 2188 |
} |
| 2188 | 2189 |
|
| 2189 | 2190 |
static int get_std_framerate(int i){
|
| ... | ... |
@@ -1,35 +1,31 @@ |
| 1 |
-FATE_FFT += fate-fft |
|
| 2 |
-fate-fft: libavcodec/fft-test$(EXESUF) |
|
| 3 |
-fate-fft: CMD = run libavcodec/fft-test |
|
| 4 |
- |
|
| 5 |
-FATE_FFT += fate-ifft |
|
| 6 |
-fate-ifft: libavcodec/fft-test$(EXESUF) |
|
| 7 |
-fate-ifft: CMD = run libavcodec/fft-test -i |
|
| 8 |
- |
|
| 9 |
-FATE_FFT += fate-mdct |
|
| 10 |
-fate-mdct: libavcodec/fft-test$(EXESUF) |
|
| 11 |
-fate-mdct: CMD = run libavcodec/fft-test -m |
|
| 12 |
- |
|
| 13 |
-FATE_FFT += fate-imdct |
|
| 14 |
-fate-imdct: libavcodec/fft-test$(EXESUF) |
|
| 15 |
-fate-imdct: CMD = run libavcodec/fft-test -m -i |
|
| 1 |
+FATE_FFT = fate-fft fate-ifft \ |
|
| 2 |
+ fate-mdct fate-imdct \ |
|
| 3 |
+ fate-rdft fate-irdft \ |
|
| 4 |
+ fate-dct1d fate-idct1d |
|
| 5 |
+ |
|
| 6 |
+fate-fft: CMD = run libavcodec/fft-test |
|
| 7 |
+fate-ifft: CMD = run libavcodec/fft-test -i |
|
| 8 |
+fate-mdct: CMD = run libavcodec/fft-test -m |
|
| 9 |
+fate-imdct: CMD = run libavcodec/fft-test -m -i |
|
| 10 |
+fate-rdft: CMD = run libavcodec/fft-test -r |
|
| 11 |
+fate-irdft: CMD = run libavcodec/fft-test -r -i |
|
| 12 |
+fate-dct1d: CMD = run libavcodec/fft-test -d |
|
| 13 |
+fate-idct1d: CMD = run libavcodec/fft-test -d -i |
|
| 16 | 14 |
|
| 17 |
-FATE_FFT += fate-rdft |
|
| 18 |
-fate-rdft: libavcodec/fft-test$(EXESUF) |
|
| 19 |
-fate-rdft: CMD = run libavcodec/fft-test -r |
|
| 15 |
+fate-fft-test: $(FATE_FFT) |
|
| 16 |
+$(FATE_FFT): libavcodec/fft-test$(EXESUF) |
|
| 17 |
+$(FATE_FFT): REF = /dev/null |
|
| 20 | 18 |
|
| 21 |
-FATE_FFT += fate-irdft |
|
| 22 |
-fate-irdft: libavcodec/fft-test$(EXESUF) |
|
| 23 |
-fate-irdft: CMD = run libavcodec/fft-test -r -i |
|
| 19 |
+FATE_FFT_FIXED = fate-fft-fixed fate-ifft-fixed \ |
|
| 20 |
+ fate-mdct-fixed fate-imdct-fixed |
|
| 24 | 21 |
|
| 25 |
-FATE_FFT += fate-dct1d |
|
| 26 |
-fate-dct1d: libavcodec/fft-test$(EXESUF) |
|
| 27 |
-fate-dct1d: CMD = run libavcodec/fft-test -d |
|
| 22 |
+fate-fft-fixed: CMD = run libavcodec/fft-fixed-test |
|
| 23 |
+fate-ifft-fixed: CMD = run libavcodec/fft-fixed-test -i |
|
| 24 |
+fate-mdct-fixed: CMD = run libavcodec/fft-fixed-test -m |
|
| 25 |
+fate-imdct-fixed: CMD = run libavcodec/fft-fixed-test -m -i |
|
| 28 | 26 |
|
| 29 |
-FATE_FFT += fate-idct1d |
|
| 30 |
-fate-idct1d: libavcodec/fft-test$(EXESUF) |
|
| 31 |
-fate-idct1d: CMD = run libavcodec/fft-test -d -i |
|
| 27 |
+fate-fft-fixed-test: $(FATE_FFT_FIXED) |
|
| 28 |
+$(FATE_FFT_FIXED): libavcodec/fft-fixed-test$(EXESUF) |
|
| 29 |
+$(FATE_FFT_FIXED): REF = /dev/null |
|
| 32 | 30 |
|
| 33 |
-FATE_TESTS += $(FATE_FFT) |
|
| 34 |
-fate-fft-test: $(FATE_FFT) |
|
| 35 |
-$(FATE_FFT): REF = /dev/null |
|
| 31 |
+FATE_TESTS += $(FATE_FFT) $(FATE_FFT_FIXED) |