]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/eval.c
Make sure the EC code does not attempt to use inter based concealment if there
[ffmpeg] / libavcodec / eval.c
index 8d79a3341a4f80ac7de37936cc4688b5e5136cf1..134c43f08b441672ef83d6656765a084ff6a22b1 100644 (file)
  * see http://joe.hotchkiss.com/programming/eval/eval.html
  */
 
-#include "avcodec.h"
-#include "eval.h"
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
 
-#ifndef NAN
-  #define NAN 0.0/0.0
-#endif
-
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
+#include "libavutil/mathematics.h"
+#include "avcodec.h"
+#include "eval.h"
 
 typedef struct Parser{
     int stack_index;
@@ -82,11 +75,7 @@ static const int8_t si_prefixes['z' - 'E' + 1]={
     ['Y'-'E']=  24,
 };
 
-/** strtod() function extended with 'k', 'M', 'G', 'ki', 'Mi', 'Gi' and 'B'
- * postfixes.  This allows using f.e. kB, MiB, G and B as a postfix. This
- * function assumes that the unit of numbers is bits not bytes.
- */
-static double av_strtod(const char *numstr, char **tail) {
+double av_strtod(const char *numstr, char **tail) {
     double d;
     char *next;
     d = strtod(numstr, &next);
@@ -196,6 +185,9 @@ static AVEvalExpr * parse_primary(Parser *p) {
     char *next= p->s;
     int i;
 
+    if (!d)
+        return NULL;
+
     /* number */
     d->value = av_strtod(p->s, &next);
     if(next != p->s){
@@ -299,6 +291,8 @@ static AVEvalExpr * parse_primary(Parser *p) {
 
 static AVEvalExpr * new_eval_expr(int type, int value, AVEvalExpr *p0, AVEvalExpr *p1){
     AVEvalExpr * e = av_mallocz(sizeof(AVEvalExpr));
+    if (!e)
+        return NULL;
     e->type     =type   ;
     e->value    =value  ;
     e->param[0] =p0     ;
@@ -318,6 +312,8 @@ static AVEvalExpr * parse_factor(Parser *p){
     while(p->s[0]=='^'){
         p->s++;
         e= new_eval_expr(e_pow, 1, e, parse_pow(p, &sign2));
+        if (!e)
+            return NULL;
         if (e->param[1]) e->param[1]->value *= (sign2|1);
     }
     if (e) e->value *= (sign|1);
@@ -329,6 +325,8 @@ static AVEvalExpr * parse_term(Parser *p){
     while(p->s[0]=='*' || p->s[0]=='/'){
         int c= *p->s++;
         e= new_eval_expr(c == '*' ? e_mul : e_div, 1, e, parse_factor(p));
+        if (!e)
+            return NULL;
     }
     return e;
 }
@@ -337,6 +335,8 @@ static AVEvalExpr * parse_subexpr(Parser *p) {
     AVEvalExpr * e = parse_term(p);
     while(*p->s == '+' || *p->s == '-') {
         e= new_eval_expr(e_add, 1, e, parse_term(p));
+        if (!e)
+            return NULL;
     };
 
     return e;
@@ -354,6 +354,8 @@ static AVEvalExpr * parse_expr(Parser *p) {
     while(*p->s == ';') {
         p->s++;
         e= new_eval_expr(e_last, 1, e, parse_subexpr(p));
+        if (!e)
+            return NULL;
     };
 
     p->stack_index++;
@@ -380,8 +382,12 @@ AVEvalExpr * ff_parse(const char *s, const char * const *const_name,
                double (**func2)(void *, double, double), const char **func2_name,
                const char **error){
     Parser p;
-    AVEvalExpr * e;
-    char w[strlen(s) + 1], * wp = w;
+    AVEvalExpr *e = NULL;
+    char *w = av_malloc(strlen(s) + 1);
+    char *wp = w;
+
+    if (!w)
+        goto end;
 
     while (*s)
         if (!isspace(*s++)) *wp++ = s[-1];
@@ -399,8 +405,10 @@ AVEvalExpr * ff_parse(const char *s, const char * const *const_name,
     e = parse_expr(&p);
     if (!verify_expr(e)) {
         ff_eval_free(e);
-        return NULL;
+        e = NULL;
     }
+end:
+    av_free(w);
     return e;
 }