| 692 | } |
| 693 | |
| 694 | static int verify_expr(AVExpr *e) |
| 695 | { |
| 696 | if (!e) return 0; |
| 697 | switch (e->type) { |
| 698 | case e_value: |
| 699 | case e_const: return 1; |
| 700 | case e_func0: |
| 701 | case e_func1: |
| 702 | case e_squish: |
| 703 | case e_ld: |
| 704 | case e_gauss: |
| 705 | case e_isnan: |
| 706 | case e_isinf: |
| 707 | case e_floor: |
| 708 | case e_ceil: |
| 709 | case e_trunc: |
| 710 | case e_round: |
| 711 | case e_sqrt: |
| 712 | case e_not: |
| 713 | case e_random: |
| 714 | case e_sgn: |
| 715 | return verify_expr(e->param[0]) && !e->param[1]; |
| 716 | case e_print: |
| 717 | return verify_expr(e->param[0]) |
| 718 | && (!e->param[1] || verify_expr(e->param[1])); |
| 719 | case e_if: |
| 720 | case e_ifnot: |
| 721 | case e_taylor: |
| 722 | return verify_expr(e->param[0]) && verify_expr(e->param[1]) |
| 723 | && (!e->param[2] || verify_expr(e->param[2])); |
| 724 | case e_between: |
| 725 | case e_clip: |
| 726 | case e_lerp: |
| 727 | case e_randomi: |
| 728 | return verify_expr(e->param[0]) && |
| 729 | verify_expr(e->param[1]) && |
| 730 | verify_expr(e->param[2]); |
| 731 | default: return verify_expr(e->param[0]) && verify_expr(e->param[1]) && !e->param[2]; |
| 732 | } |
| 733 | } |
| 734 | |
| 735 | int av_expr_parse(AVExpr **expr, const char *s, |
| 736 | const char * const *const_names, |