Merge remote-tracking branch 'qatar/master'
* qatar/master: lavfi: allow user-provided execute() callbacks Conflicts: libavfilter/avfilter.h libavfilter/version.h Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
7381d31f22
@ -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 = {
|
|||||||
.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);
|
|||||||
|
|
||||||
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 {
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
{
|
{
|
||||||
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 {
|
|||||||
|
|
||||||
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 {
|
|||||||
|
|
||||||
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)
|
|||||||
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 @@
|
|||||||
|
|
||||||
#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 @@
|
|||||||
#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, \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user