Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
| ... | ... |
@@ -26,6 +26,7 @@ |
| 26 | 26 |
#include "libavutil/audioconvert.h" |
| 27 | 27 |
#include "libavutil/imgutils.h" |
| 28 | 28 |
#include "libavutil/avassert.h" |
| 29 |
+#include "libavutil/avstring.h" |
|
| 29 | 30 |
#include "avfilter.h" |
| 30 | 31 |
#include "internal.h" |
| 31 | 32 |
|
| ... | ... |
@@ -616,6 +617,17 @@ void avfilter_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) |
| 616 | 616 |
draw_slice(link, y, h, slice_dir); |
| 617 | 617 |
} |
| 618 | 618 |
|
| 619 |
+int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags) |
|
| 620 |
+{
|
|
| 621 |
+ if(!strcmp(cmd, "ping")){
|
|
| 622 |
+ av_strlcatf(res, res_len, "pong from:%s %s\n", filter->filter->name, filter->name); |
|
| 623 |
+ return 0; |
|
| 624 |
+ }else if(filter->filter->process_command) {
|
|
| 625 |
+ return filter->filter->process_command(filter, cmd, arg, res, res_len, flags); |
|
| 626 |
+ } |
|
| 627 |
+ return AVERROR(ENOSYS); |
|
| 628 |
+} |
|
| 629 |
+ |
|
| 619 | 630 |
void avfilter_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref) |
| 620 | 631 |
{
|
| 621 | 632 |
void (*filter_samples)(AVFilterLink *, AVFilterBufferRef *); |
| ... | ... |
@@ -29,7 +29,7 @@ |
| 29 | 29 |
#include "libavutil/rational.h" |
| 30 | 30 |
|
| 31 | 31 |
#define LIBAVFILTER_VERSION_MAJOR 2 |
| 32 |
-#define LIBAVFILTER_VERSION_MINOR 35 |
|
| 32 |
+#define LIBAVFILTER_VERSION_MINOR 36 |
|
| 33 | 33 |
#define LIBAVFILTER_VERSION_MICRO 0 |
| 34 | 34 |
|
| 35 | 35 |
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ |
| ... | ... |
@@ -552,6 +552,20 @@ typedef struct AVFilter {
|
| 552 | 552 |
* NULL_IF_CONFIG_SMALL() macro to define it. |
| 553 | 553 |
*/ |
| 554 | 554 |
const char *description; |
| 555 |
+ |
|
| 556 |
+ /** |
|
| 557 |
+ * Make the filter instance process a command. |
|
| 558 |
+ * |
|
| 559 |
+ * @param cmd the command to process, for handling simplicity all commands must be alphanumeric only |
|
| 560 |
+ * @param arg the argument for the command |
|
| 561 |
+ * @param res a buffer with size res_size where the filter(s) can return a response. This must not change when the command is not supported. |
|
| 562 |
+ * @param flags if AVFILTER_CMD_FLAG_FAST is set and the command would be |
|
| 563 |
+ * timeconsuming then a filter should treat it like an unsupported command |
|
| 564 |
+ * |
|
| 565 |
+ * @returns >=0 on success otherwise an error code. |
|
| 566 |
+ * AVERROR(ENOSYS) on unsupported commands |
|
| 567 |
+ */ |
|
| 568 |
+ int (*process_command)(AVFilterContext *, const char *cmd, const char *arg, char *res, int res_len, int flags); |
|
| 555 | 569 |
} AVFilter; |
| 556 | 570 |
|
| 557 | 571 |
/** An instance of a filter */ |
| ... | ... |
@@ -791,6 +805,15 @@ void avfilter_end_frame(AVFilterLink *link); |
| 791 | 791 |
*/ |
| 792 | 792 |
void avfilter_draw_slice(AVFilterLink *link, int y, int h, int slice_dir); |
| 793 | 793 |
|
| 794 |
+#define AVFILTER_CMD_FLAG_ONE 1 ///< Stop once a filter understood the command (for target=all for example), fast filters are favored automatically |
|
| 795 |
+#define AVFILTER_CMD_FLAG_FAST 2 ///< Only execute command when its fast (like a video out that supports contrast adjustment in hw) |
|
| 796 |
+ |
|
| 797 |
+/** |
|
| 798 |
+ * Make the filter instance process a command. |
|
| 799 |
+ * It is recommanded to use avfilter_graph_send_command(). |
|
| 800 |
+ */ |
|
| 801 |
+int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags); |
|
| 802 |
+ |
|
| 794 | 803 |
/** |
| 795 | 804 |
* Send a buffer of audio samples to the next filter. |
| 796 | 805 |
* |
| ... | ... |
@@ -253,3 +253,33 @@ int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx) |
| 253 | 253 |
|
| 254 | 254 |
return 0; |
| 255 | 255 |
} |
| 256 |
+ |
|
| 257 |
+int avfilter_graph_send_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, char *res, int res_len, int flags) |
|
| 258 |
+{
|
|
| 259 |
+ int i, r = AVERROR(ENOSYS); |
|
| 260 |
+ |
|
| 261 |
+ if(!graph) |
|
| 262 |
+ return r; |
|
| 263 |
+ |
|
| 264 |
+ if((flags & AVFILTER_CMD_FLAG_ONE) && !(flags & AVFILTER_CMD_FLAG_FAST)) {
|
|
| 265 |
+ r=avfilter_graph_send_command(graph, target, cmd, arg, res, res_len, flags | AVFILTER_CMD_FLAG_FAST); |
|
| 266 |
+ if(r != AVERROR(ENOSYS)) |
|
| 267 |
+ return r; |
|
| 268 |
+ } |
|
| 269 |
+ |
|
| 270 |
+ if(res_len && res) |
|
| 271 |
+ res[0]= 0; |
|
| 272 |
+ |
|
| 273 |
+ for (i = 0; i < graph->filter_count; i++) {
|
|
| 274 |
+ AVFilterContext *filter = graph->filters[i]; |
|
| 275 |
+ if(!strcmp(target, "all") || !strcmp(target, filter->name) || !strcmp(target, filter->filter->name)){
|
|
| 276 |
+ r = avfilter_process_command(filter, cmd, arg, res, res_len, flags); |
|
| 277 |
+ if(r != AVERROR(ENOSYS)) {
|
|
| 278 |
+ if((flags & AVFILTER_CMD_FLAG_ONE) || r<0) |
|
| 279 |
+ return r; |
|
| 280 |
+ } |
|
| 281 |
+ } |
|
| 282 |
+ } |
|
| 283 |
+ |
|
| 284 |
+ return r; |
|
| 285 |
+} |
| ... | ... |
@@ -136,4 +136,21 @@ int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, |
| 136 | 136 |
AVFilterInOut **inputs, AVFilterInOut **outputs, |
| 137 | 137 |
void *log_ctx); |
| 138 | 138 |
|
| 139 |
+/** |
|
| 140 |
+ * Send a command to one or more filter instances. |
|
| 141 |
+ * |
|
| 142 |
+ * @param graph the filter graph |
|
| 143 |
+ * @param target the filter(s) to which the command should be sent |
|
| 144 |
+ * "all" sends to all filters |
|
| 145 |
+ * otherwise it can be a filter or filter instance name |
|
| 146 |
+ * which will send the command to all matching filters. |
|
| 147 |
+ * @param cmd the command to sent, for handling simplicity all commands must be alphanumeric only |
|
| 148 |
+ * @param arg the argument for the command |
|
| 149 |
+ * @param res a buffer with size res_size where the filter(s) can return a response. |
|
| 150 |
+ * |
|
| 151 |
+ * @returns >=0 on success otherwise an error code. |
|
| 152 |
+ * AVERROR(ENOSYS) on unsupported commands |
|
| 153 |
+ */ |
|
| 154 |
+int avfilter_graph_send_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, char *res, int res_len, int flags); |
|
| 155 |
+ |
|
| 139 | 156 |
#endif /* AVFILTER_AVFILTERGRAPH_H */ |