This is required for letting applications to create and destroy AVFilterInOut structs in a convenient way. Signed-off-by: Anton Khirnov <anton@khirnov.net>tags/n0.11
@@ -592,8 +592,8 @@ static int configure_video_filters(InputStream *ist, OutputStream *ost) | |||||
ost->graph->scale_sws_opts = av_strdup(args); | ost->graph->scale_sws_opts = av_strdup(args); | ||||
if (ost->avfilter) { | if (ost->avfilter) { | ||||
AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut)); | |||||
AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut)); | |||||
AVFilterInOut *outputs = avfilter_inout_alloc(); | |||||
AVFilterInOut *inputs = avfilter_inout_alloc(); | |||||
outputs->name = av_strdup("in"); | outputs->name = av_strdup("in"); | ||||
outputs->filter_ctx = last_filter; | outputs->filter_ctx = last_filter; | ||||
@@ -1716,8 +1716,8 @@ static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const c | |||||
return ret; | return ret; | ||||
if (vfilters) { | if (vfilters) { | ||||
AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut)); | |||||
AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut)); | |||||
AVFilterInOut *outputs = avfilter_inout_alloc(); | |||||
AVFilterInOut *inputs = avfilter_inout_alloc(); | |||||
outputs->name = av_strdup("in"); | outputs->name = av_strdup("in"); | ||||
outputs->filter_ctx = filt_src; | outputs->filter_ctx = filt_src; | ||||
@@ -12,6 +12,10 @@ libavutil: 2011-04-18 | |||||
API changes, most recent first: | API changes, most recent first: | ||||
2012-xx-xx - xxxxxxx - lavfi 2.16.0 - avfiltergraph.h | |||||
Add avfilter_graph_parse2(), avfilter_inout_alloc() and | |||||
avfilter_inout_free() functions. | |||||
2012-xx-xx - xxxxxxx - lavu 51.27.0 - samplefmt.h | 2012-xx-xx - xxxxxxx - lavu 51.27.0 - samplefmt.h | ||||
Add av_get_packed_sample_fmt() and av_get_planar_sample_fmt() | Add av_get_packed_sample_fmt() and av_get_planar_sample_fmt() | ||||
@@ -111,6 +111,19 @@ typedef struct AVFilterInOut { | |||||
struct AVFilterInOut *next; | struct AVFilterInOut *next; | ||||
} AVFilterInOut; | } AVFilterInOut; | ||||
/** | |||||
* Allocate a single AVFilterInOut entry. | |||||
* Must be freed with avfilter_inout_free(). | |||||
* @return allocated AVFilterInOut on success, NULL on failure. | |||||
*/ | |||||
AVFilterInOut *avfilter_inout_alloc(void); | |||||
/** | |||||
* Free the supplied list of AVFilterInOut and set *inout to NULL. | |||||
* If *inout is NULL, do nothing. | |||||
*/ | |||||
void avfilter_inout_free(AVFilterInOut **inout); | |||||
/** | /** | ||||
* Add a graph described by a string to a graph. | * Add a graph described by a string to a graph. | ||||
* | * | ||||
@@ -170,13 +170,18 @@ static int parse_filter(AVFilterContext **filt_ctx, const char **buf, AVFilterGr | |||||
return ret; | return ret; | ||||
} | } | ||||
static void free_inout(AVFilterInOut *head) | |||||
AVFilterInOut *avfilter_inout_alloc(void) | |||||
{ | { | ||||
while (head) { | |||||
AVFilterInOut *next = head->next; | |||||
av_free(head->name); | |||||
av_free(head); | |||||
head = next; | |||||
return av_mallocz(sizeof(AVFilterInOut)); | |||||
} | |||||
void avfilter_inout_free(AVFilterInOut **inout) | |||||
{ | |||||
while (*inout) { | |||||
AVFilterInOut *next = (*inout)->next; | |||||
av_freep(&(*inout)->name); | |||||
av_freep(inout); | |||||
*inout = next; | |||||
} | } | ||||
} | } | ||||
@@ -431,9 +436,9 @@ int avfilter_graph_parse2(AVFilterGraph *graph, const char *filters, | |||||
for (; graph->filter_count > 0; graph->filter_count--) | for (; graph->filter_count > 0; graph->filter_count--) | ||||
avfilter_free(graph->filters[graph->filter_count - 1]); | avfilter_free(graph->filters[graph->filter_count - 1]); | ||||
av_freep(&graph->filters); | av_freep(&graph->filters); | ||||
free_inout(open_inputs); | |||||
free_inout(open_outputs); | |||||
free_inout(curr_inputs); | |||||
avfilter_inout_free(&open_inputs); | |||||
avfilter_inout_free(&open_outputs); | |||||
avfilter_inout_free(&curr_inputs); | |||||
*inputs = NULL; | *inputs = NULL; | ||||
*outputs = NULL; | *outputs = NULL; | ||||
@@ -467,7 +472,7 @@ int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, | |||||
continue; | continue; | ||||
ret = avfilter_link(match->filter_ctx, match->pad_idx, | ret = avfilter_link(match->filter_ctx, match->pad_idx, | ||||
cur->filter_ctx, cur->pad_idx); | cur->filter_ctx, cur->pad_idx); | ||||
free_inout(match); | |||||
avfilter_inout_free(&match); | |||||
if (ret < 0) | if (ret < 0) | ||||
goto fail; | goto fail; | ||||
} | } | ||||
@@ -487,7 +492,7 @@ int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, | |||||
continue; | continue; | ||||
ret = avfilter_link(cur->filter_ctx, cur->pad_idx, | ret = avfilter_link(cur->filter_ctx, cur->pad_idx, | ||||
match->filter_ctx, match->pad_idx); | match->filter_ctx, match->pad_idx); | ||||
free_inout(match); | |||||
avfilter_inout_free(&match); | |||||
if (ret < 0) | if (ret < 0) | ||||
goto fail; | goto fail; | ||||
} | } | ||||
@@ -498,9 +503,9 @@ int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, | |||||
avfilter_free(graph->filters[graph->filter_count - 1]); | avfilter_free(graph->filters[graph->filter_count - 1]); | ||||
av_freep(&graph->filters); | av_freep(&graph->filters); | ||||
} | } | ||||
free_inout(inputs); | |||||
free_inout(outputs); | |||||
free_inout(open_inputs); | |||||
free_inout(open_outputs); | |||||
avfilter_inout_free(&inputs); | |||||
avfilter_inout_free(&outputs); | |||||
avfilter_inout_free(&open_inputs); | |||||
avfilter_inout_free(&open_outputs); | |||||
return ret; | return ret; | ||||
} | } |
@@ -29,7 +29,7 @@ | |||||
#include "libavutil/avutil.h" | #include "libavutil/avutil.h" | ||||
#define LIBAVFILTER_VERSION_MAJOR 2 | #define LIBAVFILTER_VERSION_MAJOR 2 | ||||
#define LIBAVFILTER_VERSION_MINOR 15 | |||||
#define LIBAVFILTER_VERSION_MINOR 16 | |||||
#define LIBAVFILTER_VERSION_MICRO 0 | #define LIBAVFILTER_VERSION_MICRO 0 | ||||
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ | #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ | ||||