| 797 | } |
| 798 | |
| 799 | void avfilter_free(AVFilterContext *filter) |
| 800 | { |
| 801 | FFFilterContext *ctxi; |
| 802 | int i; |
| 803 | |
| 804 | if (!filter) |
| 805 | return; |
| 806 | ctxi = fffilterctx(filter); |
| 807 | |
| 808 | if (filter->graph) |
| 809 | ff_filter_graph_remove_filter(filter->graph, filter); |
| 810 | |
| 811 | if (fffilter(filter->filter)->uninit) |
| 812 | fffilter(filter->filter)->uninit(filter); |
| 813 | |
| 814 | for (i = 0; i < filter->nb_inputs; i++) { |
| 815 | free_link(filter->inputs[i]); |
| 816 | if (filter->input_pads[i].flags & AVFILTERPAD_FLAG_FREE_NAME) |
| 817 | av_freep(&filter->input_pads[i].name); |
| 818 | } |
| 819 | for (i = 0; i < filter->nb_outputs; i++) { |
| 820 | free_link(filter->outputs[i]); |
| 821 | if (filter->output_pads[i].flags & AVFILTERPAD_FLAG_FREE_NAME) |
| 822 | av_freep(&filter->output_pads[i].name); |
| 823 | } |
| 824 | |
| 825 | if (filter->filter->priv_class) |
| 826 | av_opt_free(filter->priv); |
| 827 | |
| 828 | av_buffer_unref(&filter->hw_device_ctx); |
| 829 | |
| 830 | av_freep(&filter->name); |
| 831 | av_freep(&filter->input_pads); |
| 832 | av_freep(&filter->output_pads); |
| 833 | av_freep(&filter->inputs); |
| 834 | av_freep(&filter->outputs); |
| 835 | av_freep(&filter->priv); |
| 836 | while (ctxi->command_queue) |
| 837 | command_queue_pop(filter); |
| 838 | av_opt_free(filter); |
| 839 | av_expr_free(ctxi->enable); |
| 840 | ctxi->enable = NULL; |
| 841 | av_freep(&ctxi->var_values); |
| 842 | av_free(filter); |
| 843 | } |
| 844 | |
| 845 | int ff_filter_get_nb_threads(AVFilterContext *ctx) |
| 846 | { |