* commit '9d5c62ba5b586c80af508b5914934b1c439f6652':
lavu/opt: do not filter out the initial sign character except for flags
eval: treat dB as decibels instead of decibytes
float_dsp: add vector_dmul_scalar() to multiply a vector of doubles
Conflicts:
libavutil/eval.c
tests/ref/fate/eval
Merged-by: Michael Niedermayer <michaelni@gmx.at>
... | ... |
@@ -94,7 +94,11 @@ double av_strtod(const char *numstr, char **tail) |
94 | 94 |
d = strtod(numstr, &next); |
95 | 95 |
/* if parsing succeeded, check for and interpret postfixes */ |
96 | 96 |
if (next!=numstr) { |
97 |
- if (*next >= 'E' && *next <= 'z') { |
|
97 |
+ if (next[0] == 'd' && next[1] == 'B') { |
|
98 |
+ /* treat dB as decibels instead of decibytes */ |
|
99 |
+ d = pow(10, d / 20); |
|
100 |
+ next += 2; |
|
101 |
+ } else if (*next >= 'E' && *next <= 'z') { |
|
98 | 102 |
int e= si_prefixes[*next - 'E']; |
99 | 103 |
if (e) { |
100 | 104 |
if (next[1] == 'i') { |
... | ... |
@@ -448,16 +452,31 @@ static int parse_pow(AVExpr **e, Parser *p, int *sign) |
448 | 448 |
return parse_primary(e, p); |
449 | 449 |
} |
450 | 450 |
|
451 |
+static int parse_dB(AVExpr **e, Parser *p, int *sign) |
|
452 |
+{ |
|
453 |
+ /* do not filter out the negative sign when parsing a dB value. |
|
454 |
+ for example, -3dB is not the same as -(3dB) */ |
|
455 |
+ if (*p->s == '-') { |
|
456 |
+ char *next; |
|
457 |
+ strtod(p->s, &next); |
|
458 |
+ if (next != p->s && next[0] == 'd' && next[1] == 'B') { |
|
459 |
+ *sign = 0; |
|
460 |
+ return parse_primary(e, p); |
|
461 |
+ } |
|
462 |
+ } |
|
463 |
+ return parse_pow(e, p, sign); |
|
464 |
+} |
|
465 |
+ |
|
451 | 466 |
static int parse_factor(AVExpr **e, Parser *p) |
452 | 467 |
{ |
453 | 468 |
int sign, sign2, ret; |
454 | 469 |
AVExpr *e0, *e1, *e2; |
455 |
- if ((ret = parse_pow(&e0, p, &sign)) < 0) |
|
470 |
+ if ((ret = parse_dB(&e0, p, &sign)) < 0) |
|
456 | 471 |
return ret; |
457 | 472 |
while(p->s[0]=='^'){ |
458 | 473 |
e1 = e0; |
459 | 474 |
p->s++; |
460 |
- if ((ret = parse_pow(&e2, p, &sign2)) < 0) { |
|
475 |
+ if ((ret = parse_dB(&e2, p, &sign2)) < 0) { |
|
461 | 476 |
av_expr_free(e1); |
462 | 477 |
return ret; |
463 | 478 |
} |
... | ... |
@@ -744,6 +763,8 @@ int main(int argc, char **argv) |
744 | 744 |
"not(1)", |
745 | 745 |
"not(NAN)", |
746 | 746 |
"not(0)", |
747 |
+ "6.0206dB", |
|
748 |
+ "-3.0103dB", |
|
747 | 749 |
"pow(0,1.23)", |
748 | 750 |
"pow(PI,1.23)", |
749 | 751 |
"PI^1.23", |
... | ... |
@@ -47,11 +47,20 @@ static void vector_fmul_scalar_c(float *dst, const float *src, float mul, |
47 | 47 |
dst[i] = src[i] * mul; |
48 | 48 |
} |
49 | 49 |
|
50 |
+static void vector_dmul_scalar_c(double *dst, const double *src, double mul, |
|
51 |
+ int len) |
|
52 |
+{ |
|
53 |
+ int i; |
|
54 |
+ for (i = 0; i < len; i++) |
|
55 |
+ dst[i] = src[i] * mul; |
|
56 |
+} |
|
57 |
+ |
|
50 | 58 |
void avpriv_float_dsp_init(AVFloatDSPContext *fdsp, int bit_exact) |
51 | 59 |
{ |
52 | 60 |
fdsp->vector_fmul = vector_fmul_c; |
53 | 61 |
fdsp->vector_fmac_scalar = vector_fmac_scalar_c; |
54 | 62 |
fdsp->vector_fmul_scalar = vector_fmul_scalar_c; |
63 |
+ fdsp->vector_dmul_scalar = vector_dmul_scalar_c; |
|
55 | 64 |
|
56 | 65 |
#if ARCH_ARM |
57 | 66 |
ff_float_dsp_init_arm(fdsp); |
... | ... |
@@ -66,6 +66,21 @@ typedef struct AVFloatDSPContext { |
66 | 66 |
*/ |
67 | 67 |
void (*vector_fmul_scalar)(float *dst, const float *src, float mul, |
68 | 68 |
int len); |
69 |
+ |
|
70 |
+ /** |
|
71 |
+ * Multiply a vector of double by a scalar double. Source and |
|
72 |
+ * destination vectors must overlap exactly or not at all. |
|
73 |
+ * |
|
74 |
+ * @param dst result vector |
|
75 |
+ * constraints: 32-byte aligned |
|
76 |
+ * @param src input vector |
|
77 |
+ * constraints: 32-byte aligned |
|
78 |
+ * @param mul scalar value |
|
79 |
+ * @param len length of vector |
|
80 |
+ * constraints: multiple of 8 |
|
81 |
+ */ |
|
82 |
+ void (*vector_dmul_scalar)(double *dst, const double *src, double mul, |
|
83 |
+ int len); |
|
69 | 84 |
} AVFloatDSPContext; |
70 | 85 |
|
71 | 86 |
/** |
... | ... |
@@ -184,10 +184,15 @@ static int set_string_number(void *obj, const AVOption *o, const char *val, void |
184 | 184 |
double d, num = 1; |
185 | 185 |
int64_t intnum = 1; |
186 | 186 |
|
187 |
- if (*val == '+' || *val == '-') |
|
188 |
- cmd = *(val++); |
|
187 |
+ i = 0; |
|
188 |
+ if (*val == '+' || *val == '-') { |
|
189 |
+ if (o->type == AV_OPT_TYPE_FLAGS) |
|
190 |
+ cmd = *(val++); |
|
191 |
+ else if (!notfirst) |
|
192 |
+ buf[i++] = *val; |
|
193 |
+ } |
|
189 | 194 |
|
190 |
- for (i = 0; i < sizeof(buf) - 1 && val[i] && val[i] != '+' && val[i] != '-'; i++) |
|
195 |
+ for (; i < sizeof(buf) - 1 && val[i] && val[i] != '+' && val[i] != '-'; i++) |
|
191 | 196 |
buf[i] = val[i]; |
192 | 197 |
buf[i] = 0; |
193 | 198 |
|
... | ... |
@@ -120,3 +120,48 @@ cglobal vector_fmul_scalar, 4,4,3, dst, src, mul, len |
120 | 120 |
|
121 | 121 |
INIT_XMM sse |
122 | 122 |
VECTOR_FMUL_SCALAR |
123 |
+ |
|
124 |
+;------------------------------------------------------------------------------ |
|
125 |
+; void ff_vector_dmul_scalar(double *dst, const double *src, double mul, |
|
126 |
+; int len) |
|
127 |
+;------------------------------------------------------------------------------ |
|
128 |
+ |
|
129 |
+%macro VECTOR_DMUL_SCALAR 0 |
|
130 |
+%if UNIX64 |
|
131 |
+cglobal vector_dmul_scalar, 3,3,3, dst, src, len |
|
132 |
+%else |
|
133 |
+cglobal vector_dmul_scalar, 4,4,3, dst, src, mul, len |
|
134 |
+%endif |
|
135 |
+%if ARCH_X86_32 |
|
136 |
+ VBROADCASTSD m0, mulm |
|
137 |
+%else |
|
138 |
+%if WIN64 |
|
139 |
+ movlhps xmm2, xmm2 |
|
140 |
+%if cpuflag(avx) |
|
141 |
+ vinsertf128 ymm2, ymm2, xmm2, 1 |
|
142 |
+%endif |
|
143 |
+ SWAP 0, 2 |
|
144 |
+%else |
|
145 |
+ movlhps xmm0, xmm0 |
|
146 |
+%if cpuflag(avx) |
|
147 |
+ vinsertf128 ymm0, ymm0, xmm0, 1 |
|
148 |
+%endif |
|
149 |
+%endif |
|
150 |
+%endif |
|
151 |
+ lea lenq, [lend*8-2*mmsize] |
|
152 |
+.loop: |
|
153 |
+ mulpd m1, m0, [srcq+lenq ] |
|
154 |
+ mulpd m2, m0, [srcq+lenq+mmsize] |
|
155 |
+ mova [dstq+lenq ], m1 |
|
156 |
+ mova [dstq+lenq+mmsize], m2 |
|
157 |
+ sub lenq, 2*mmsize |
|
158 |
+ jge .loop |
|
159 |
+ REP_RET |
|
160 |
+%endmacro |
|
161 |
+ |
|
162 |
+INIT_XMM sse2 |
|
163 |
+VECTOR_DMUL_SCALAR |
|
164 |
+%if HAVE_AVX_EXTERNAL |
|
165 |
+INIT_YMM avx |
|
166 |
+VECTOR_DMUL_SCALAR |
|
167 |
+%endif |
... | ... |
@@ -35,6 +35,11 @@ extern void ff_vector_fmac_scalar_avx(float *dst, const float *src, float mul, |
35 | 35 |
extern void ff_vector_fmul_scalar_sse(float *dst, const float *src, float mul, |
36 | 36 |
int len); |
37 | 37 |
|
38 |
+extern void ff_vector_dmul_scalar_sse2(double *dst, const double *src, |
|
39 |
+ double mul, int len); |
|
40 |
+extern void ff_vector_dmul_scalar_avx(double *dst, const double *src, |
|
41 |
+ double mul, int len); |
|
42 |
+ |
|
38 | 43 |
void ff_float_dsp_init_x86(AVFloatDSPContext *fdsp) |
39 | 44 |
{ |
40 | 45 |
int mm_flags = av_get_cpu_flags(); |
... | ... |
@@ -44,8 +49,12 @@ void ff_float_dsp_init_x86(AVFloatDSPContext *fdsp) |
44 | 44 |
fdsp->vector_fmac_scalar = ff_vector_fmac_scalar_sse; |
45 | 45 |
fdsp->vector_fmul_scalar = ff_vector_fmul_scalar_sse; |
46 | 46 |
} |
47 |
+ if (EXTERNAL_SSE2(mm_flags)) { |
|
48 |
+ fdsp->vector_dmul_scalar = ff_vector_dmul_scalar_sse2; |
|
49 |
+ } |
|
47 | 50 |
if (EXTERNAL_AVX(mm_flags)) { |
48 | 51 |
fdsp->vector_fmul = ff_vector_fmul_avx; |
49 | 52 |
fdsp->vector_fmac_scalar = ff_vector_fmac_scalar_avx; |
53 |
+ fdsp->vector_dmul_scalar = ff_vector_dmul_scalar_avx; |
|
50 | 54 |
} |
51 | 55 |
} |
... | ... |
@@ -631,6 +631,17 @@ |
631 | 631 |
%endif |
632 | 632 |
%endmacro |
633 | 633 |
|
634 |
+%macro VBROADCASTSD 2 ; dst xmm/ymm, src m64 |
|
635 |
+%if cpuflag(avx) && mmsize == 32 |
|
636 |
+ vbroadcastsd %1, %2 |
|
637 |
+%elif cpuflag(sse3) |
|
638 |
+ movddup %1, %2 |
|
639 |
+%else ; sse2 |
|
640 |
+ movsd %1, %2 |
|
641 |
+ movlhps %1, %1 |
|
642 |
+%endif |
|
643 |
+%endmacro |
|
644 |
+ |
|
634 | 645 |
%macro SHUFFLE_MASK_W 8 |
635 | 646 |
%rep 8 |
636 | 647 |
%if %1>=0x80 |
... | ... |
@@ -184,6 +184,12 @@ Evaluating 'not(NAN)' |
184 | 184 |
Evaluating 'not(0)' |
185 | 185 |
'not(0)' -> 1.000000 |
186 | 186 |
|
187 |
+Evaluating '6.0206dB' |
|
188 |
+'6.0206dB' -> 2.000000 |
|
189 |
+ |
|
190 |
+Evaluating '-3.0103dB' |
|
191 |
+'-3.0103dB' -> 0.707107 |
|
192 |
+ |
|
187 | 193 |
Evaluating 'pow(0,1.23)' |
188 | 194 |
'pow(0,1.23)' -> 0.000000 |
189 | 195 |
|