Commit 7381d31f authored by Michael Niedermayer's avatar Michael Niedermayer

Merge remote-tracking branch 'qatar/master'

* qatar/master:
  lavfi: allow user-provided execute() callbacks

Conflicts:
	libavfilter/avfilter.h
	libavfilter/version.h
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 945c7e39 0767bfd1
...@@ -15,6 +15,10 @@ libavutil: 2012-10-22 ...@@ -15,6 +15,10 @@ libavutil: 2012-10-22
API changes, most recent first: API changes, most recent first:
2013-08-xx - xxxxxxx - lavfi 3.11.0 - avfilter.h
Add AVFilterGraph.execute and AVFilterGraph.opaque for custom slice threading
implementations.
2013-09-21 - xxxxxxx - lavu 52.16.0 - pixfmt.h 2013-09-21 - xxxxxxx - lavu 52.16.0 - pixfmt.h
Add interleaved 4:2:2 8/10-bit formats AV_PIX_FMT_NV16 and Add interleaved 4:2:2 8/10-bit formats AV_PIX_FMT_NV16 and
AV_PIX_FMT_NV20. AV_PIX_FMT_NV20.
......
...@@ -576,7 +576,7 @@ static const AVClass avfilter_class = { ...@@ -576,7 +576,7 @@ static const AVClass avfilter_class = {
.option = avfilter_options, .option = avfilter_options,
}; };
static int default_execute(AVFilterContext *ctx, action_func *func, void *arg, static int default_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg,
int *ret, int nb_jobs) int *ret, int nb_jobs)
{ {
int i; int i;
......
...@@ -1126,6 +1126,35 @@ const AVClass *avfilter_get_class(void); ...@@ -1126,6 +1126,35 @@ const AVClass *avfilter_get_class(void);
typedef struct AVFilterGraphInternal AVFilterGraphInternal; typedef struct AVFilterGraphInternal AVFilterGraphInternal;
/**
* A function pointer passed to the @ref AVFilterGraph.execute callback to be
* executed multiple times, possibly in parallel.
*
* @param ctx the filter context the job belongs to
* @param arg an opaque parameter passed through from @ref
* AVFilterGraph.execute
* @param jobnr the index of the job being executed
* @param nb_jobs the total number of jobs
*
* @return 0 on success, a negative AVERROR on error
*/
typedef int (avfilter_action_func)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
/**
* A function executing multiple jobs, possibly in parallel.
*
* @param ctx the filter context to which the jobs belong
* @param func the function to be called multiple times
* @param arg the argument to be passed to func
* @param ret a nb_jobs-sized array to be filled with return values from each
* invocation of func
* @param nb_jobs the number of jobs to execute
*
* @return 0 on success, a negative AVERROR on error
*/
typedef int (avfilter_execute_func)(AVFilterContext *ctx, avfilter_action_func *func,
void *arg, int *ret, int nb_jobs);
typedef struct AVFilterGraph { typedef struct AVFilterGraph {
const AVClass *av_class; const AVClass *av_class;
#if FF_API_FOO_COUNT #if FF_API_FOO_COUNT
...@@ -1169,6 +1198,27 @@ typedef struct AVFilterGraph { ...@@ -1169,6 +1198,27 @@ typedef struct AVFilterGraph {
*/ */
AVFilterGraphInternal *internal; AVFilterGraphInternal *internal;
/**
* Opaque user data. May be set by the caller to an arbitrary value, e.g. to
* be used from callbacks like @ref AVFilterGraph.execute.
* Libavfilter will not touch this field in any way.
*/
void *opaque;
/**
* This callback may be set by the caller immediately after allocating the
* graph and before adding any filters to it, to provide a custom
* multithreading implementation.
*
* If set, filters with slice threading capability will call this callback
* to execute multiple jobs in parallel.
*
* If this field is left unset, libavfilter will use its internal
* implementation, which may or may not be multithreaded depending on the
* platform and build options.
*/
avfilter_execute_func *execute;
char *aresample_swr_opts; ///< swr options to use for the auto-inserted aresample filters, Access ONLY through AVOptions char *aresample_swr_opts; ///< swr options to use for the auto-inserted aresample filters, Access ONLY through AVOptions
/** /**
......
...@@ -182,11 +182,15 @@ AVFilterContext *avfilter_graph_alloc_filter(AVFilterGraph *graph, ...@@ -182,11 +182,15 @@ AVFilterContext *avfilter_graph_alloc_filter(AVFilterGraph *graph,
{ {
AVFilterContext **filters, *s; AVFilterContext **filters, *s;
if (graph->thread_type && !graph->internal->thread) { if (graph->thread_type && !graph->internal->thread_execute) {
int ret = ff_graph_thread_init(graph); if (graph->execute) {
if (ret < 0) { graph->internal->thread_execute = graph->execute;
av_log(graph, AV_LOG_ERROR, "Error initializing threading.\n"); } else {
return NULL; int ret = ff_graph_thread_init(graph);
if (ret < 0) {
av_log(graph, AV_LOG_ERROR, "Error initializing threading.\n");
return NULL;
}
} }
} }
......
...@@ -146,13 +146,11 @@ struct AVFilterPad { ...@@ -146,13 +146,11 @@ struct AVFilterPad {
struct AVFilterGraphInternal { struct AVFilterGraphInternal {
void *thread; void *thread;
int (*thread_execute)(AVFilterContext *ctx, action_func *func, void *arg, avfilter_execute_func *thread_execute;
int *ret, int nb_jobs);
}; };
struct AVFilterInternal { struct AVFilterInternal {
int (*execute)(AVFilterContext *ctx, action_func *func, void *arg, avfilter_execute_func *execute;
int *ret, int nb_jobs);
}; };
#if FF_API_AVFILTERBUFFER #if FF_API_AVFILTERBUFFER
......
...@@ -45,7 +45,7 @@ typedef struct ThreadContext { ...@@ -45,7 +45,7 @@ typedef struct ThreadContext {
int nb_threads; int nb_threads;
pthread_t *workers; pthread_t *workers;
action_func *func; avfilter_action_func *func;
/* per-execute perameters */ /* per-execute perameters */
AVFilterContext *ctx; AVFilterContext *ctx;
...@@ -116,7 +116,7 @@ static void slice_thread_park_workers(ThreadContext *c) ...@@ -116,7 +116,7 @@ static void slice_thread_park_workers(ThreadContext *c)
pthread_mutex_unlock(&c->current_job_lock); pthread_mutex_unlock(&c->current_job_lock);
} }
static int thread_execute(AVFilterContext *ctx, action_func *func, static int thread_execute(AVFilterContext *ctx, avfilter_action_func *func,
void *arg, int *ret, int nb_jobs) void *arg, int *ret, int nb_jobs)
{ {
ThreadContext *c = ctx->graph->internal->thread; ThreadContext *c = ctx->graph->internal->thread;
......
...@@ -22,8 +22,6 @@ ...@@ -22,8 +22,6 @@
#include "avfilter.h" #include "avfilter.h"
typedef int (action_func)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
int ff_graph_thread_init(AVFilterGraph *graph); int ff_graph_thread_init(AVFilterGraph *graph);
void ff_graph_thread_free(AVFilterGraph *graph); void ff_graph_thread_free(AVFilterGraph *graph);
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#include "libavutil/avutil.h" #include "libavutil/avutil.h"
#define LIBAVFILTER_VERSION_MAJOR 3 #define LIBAVFILTER_VERSION_MAJOR 3
#define LIBAVFILTER_VERSION_MINOR 87 #define LIBAVFILTER_VERSION_MINOR 88
#define LIBAVFILTER_VERSION_MICRO 100 #define LIBAVFILTER_VERSION_MICRO 100
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment