Commit acc0490f authored by Stefano Sabatini's avatar Stefano Sabatini

Make AVFilterLink store the pointers to the source and destination

pads, rather than their index.

Originally committed as revision 25227 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent b3dd5e59
...@@ -42,10 +42,6 @@ const char *avfilter_license(void) ...@@ -42,10 +42,6 @@ const char *avfilter_license(void)
return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1; return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
} }
/** helper macros to get the in/out pad on the dst/src filter */
#define link_dpad(link) link->dst-> input_pads[link->dstpad]
#define link_spad(link) link->src->output_pads[link->srcpad]
AVFilterBufferRef *avfilter_ref_buffer(AVFilterBufferRef *ref, int pmask) AVFilterBufferRef *avfilter_ref_buffer(AVFilterBufferRef *ref, int pmask)
{ {
AVFilterBufferRef *ret = av_malloc(sizeof(AVFilterBufferRef)); AVFilterBufferRef *ret = av_malloc(sizeof(AVFilterBufferRef));
...@@ -116,8 +112,8 @@ int avfilter_link(AVFilterContext *src, unsigned srcpad, ...@@ -116,8 +112,8 @@ int avfilter_link(AVFilterContext *src, unsigned srcpad,
link->src = src; link->src = src;
link->dst = dst; link->dst = dst;
link->srcpad = srcpad; link->srcpad = &src->output_pads[srcpad];
link->dstpad = dstpad; link->dstpad = &dst->input_pads[dstpad];
link->type = src->output_pads[srcpad].type; link->type = src->output_pads[srcpad].type;
assert(PIX_FMT_NONE == -1 && SAMPLE_FMT_NONE == -1); assert(PIX_FMT_NONE == -1 && SAMPLE_FMT_NONE == -1);
link->format = -1; link->format = -1;
...@@ -128,20 +124,22 @@ int avfilter_link(AVFilterContext *src, unsigned srcpad, ...@@ -128,20 +124,22 @@ int avfilter_link(AVFilterContext *src, unsigned srcpad,
int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt, int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt,
unsigned in, unsigned out) unsigned in, unsigned out)
{ {
unsigned dstpad_idx = link->dstpad - link->dst->input_pads;
av_log(link->dst, AV_LOG_INFO, "auto-inserting filter '%s' " av_log(link->dst, AV_LOG_INFO, "auto-inserting filter '%s' "
"between the filter '%s' and the filter '%s'\n", "between the filter '%s' and the filter '%s'\n",
filt->name, link->src->name, link->dst->name); filt->name, link->src->name, link->dst->name);
link->dst->inputs[link->dstpad] = NULL; link->dst->inputs[dstpad_idx] = NULL;
if (avfilter_link(filt, out, link->dst, link->dstpad)) { if (avfilter_link(filt, out, link->dst, dstpad_idx)) {
/* failed to link output filter to new filter */ /* failed to link output filter to new filter */
link->dst->inputs[link->dstpad] = link; link->dst->inputs[dstpad_idx] = link;
return -1; return -1;
} }
/* re-hookup the link to the new destination filter we inserted */ /* re-hookup the link to the new destination filter we inserted */
link->dst = filt; link->dst = filt;
link->dstpad = in; link->dstpad = &filt->input_pads[in];
filt->inputs[in] = link; filt->inputs[in] = link;
/* if any information on supported media formats already exists on the /* if any information on supported media formats already exists on the
...@@ -175,12 +173,12 @@ int avfilter_config_links(AVFilterContext *filter) ...@@ -175,12 +173,12 @@ int avfilter_config_links(AVFilterContext *filter)
if (avfilter_config_links(link->src)) if (avfilter_config_links(link->src))
return -1; return -1;
if (!(config_link = link_spad(link).config_props)) if (!(config_link = link->srcpad->config_props))
config_link = avfilter_default_config_output_link; config_link = avfilter_default_config_output_link;
if (config_link(link)) if (config_link(link))
return -1; return -1;
if ((config_link = link_dpad(link).config_props)) if ((config_link = link->dstpad->config_props))
if (config_link(link)) if (config_link(link))
return -1; return -1;
...@@ -249,8 +247,8 @@ AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int ...@@ -249,8 +247,8 @@ AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int
FF_DPRINTF_START(NULL, get_video_buffer); ff_dprintf_link(NULL, link, 0); FF_DPRINTF_START(NULL, get_video_buffer); ff_dprintf_link(NULL, link, 0);
dprintf(NULL, " perms:%s w:%d h:%d\n", ff_get_ref_perms_string(buf, sizeof(buf), perms), w, h); dprintf(NULL, " perms:%s w:%d h:%d\n", ff_get_ref_perms_string(buf, sizeof(buf), perms), w, h);
if (link_dpad(link).get_video_buffer) if (link->dstpad->get_video_buffer)
ret = link_dpad(link).get_video_buffer(link, perms, w, h); ret = link->dstpad->get_video_buffer(link, perms, w, h);
if (!ret) if (!ret)
ret = avfilter_default_get_video_buffer(link, perms, w, h); ret = avfilter_default_get_video_buffer(link, perms, w, h);
...@@ -269,8 +267,8 @@ AVFilterBufferRef *avfilter_get_audio_buffer(AVFilterLink *link, int perms, ...@@ -269,8 +267,8 @@ AVFilterBufferRef *avfilter_get_audio_buffer(AVFilterLink *link, int perms,
{ {
AVFilterBufferRef *ret = NULL; AVFilterBufferRef *ret = NULL;
if (link_dpad(link).get_audio_buffer) if (link->dstpad->get_audio_buffer)
ret = link_dpad(link).get_audio_buffer(link, perms, sample_fmt, size, channel_layout, planar); ret = link->dstpad->get_audio_buffer(link, perms, sample_fmt, size, channel_layout, planar);
if (!ret) if (!ret)
ret = avfilter_default_get_audio_buffer(link, perms, sample_fmt, size, channel_layout, planar); ret = avfilter_default_get_audio_buffer(link, perms, sample_fmt, size, channel_layout, planar);
...@@ -285,8 +283,8 @@ int avfilter_request_frame(AVFilterLink *link) ...@@ -285,8 +283,8 @@ int avfilter_request_frame(AVFilterLink *link)
{ {
FF_DPRINTF_START(NULL, request_frame); ff_dprintf_link(NULL, link, 1); FF_DPRINTF_START(NULL, request_frame); ff_dprintf_link(NULL, link, 1);
if (link_spad(link).request_frame) if (link->srcpad->request_frame)
return link_spad(link).request_frame(link); return link->srcpad->request_frame(link);
else if (link->src->inputs[0]) else if (link->src->inputs[0])
return avfilter_request_frame(link->src->inputs[0]); return avfilter_request_frame(link->src->inputs[0]);
else return -1; else return -1;
...@@ -296,8 +294,8 @@ int avfilter_poll_frame(AVFilterLink *link) ...@@ -296,8 +294,8 @@ int avfilter_poll_frame(AVFilterLink *link)
{ {
int i, min = INT_MAX; int i, min = INT_MAX;
if (link_spad(link).poll_frame) if (link->srcpad->poll_frame)
return link_spad(link).poll_frame(link); return link->srcpad->poll_frame(link);
for (i = 0; i < link->src->input_count; i++) { for (i = 0; i < link->src->input_count; i++) {
int val; int val;
...@@ -315,7 +313,7 @@ int avfilter_poll_frame(AVFilterLink *link) ...@@ -315,7 +313,7 @@ int avfilter_poll_frame(AVFilterLink *link)
void avfilter_start_frame(AVFilterLink *link, AVFilterBufferRef *picref) void avfilter_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
{ {
void (*start_frame)(AVFilterLink *, AVFilterBufferRef *); void (*start_frame)(AVFilterLink *, AVFilterBufferRef *);
AVFilterPad *dst = &link_dpad(link); AVFilterPad *dst = link->dstpad;
FF_DPRINTF_START(NULL, start_frame); ff_dprintf_link(NULL, link, 0); dprintf(NULL, " "); ff_dprintf_ref(NULL, picref, 1); FF_DPRINTF_START(NULL, start_frame); ff_dprintf_link(NULL, link, 0); dprintf(NULL, " "); ff_dprintf_ref(NULL, picref, 1);
...@@ -328,7 +326,7 @@ void avfilter_start_frame(AVFilterLink *link, AVFilterBufferRef *picref) ...@@ -328,7 +326,7 @@ void avfilter_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
av_log(link->dst, AV_LOG_DEBUG, av_log(link->dst, AV_LOG_DEBUG,
"frame copy needed (have perms %x, need %x, reject %x)\n", "frame copy needed (have perms %x, need %x, reject %x)\n",
picref->perms, picref->perms,
link_dpad(link).min_perms, link_dpad(link).rej_perms); link->dstpad->min_perms, link->dstpad->rej_perms);
link->cur_buf = avfilter_get_video_buffer(link, dst->min_perms, link->w, link->h); link->cur_buf = avfilter_get_video_buffer(link, dst->min_perms, link->w, link->h);
link->src_buf = picref; link->src_buf = picref;
...@@ -344,7 +342,7 @@ void avfilter_end_frame(AVFilterLink *link) ...@@ -344,7 +342,7 @@ void avfilter_end_frame(AVFilterLink *link)
{ {
void (*end_frame)(AVFilterLink *); void (*end_frame)(AVFilterLink *);
if (!(end_frame = link_dpad(link).end_frame)) if (!(end_frame = link->dstpad->end_frame))
end_frame = avfilter_default_end_frame; end_frame = avfilter_default_end_frame;
end_frame(link); end_frame(link);
...@@ -393,7 +391,7 @@ void avfilter_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) ...@@ -393,7 +391,7 @@ void avfilter_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
} }
} }
if (!(draw_slice = link_dpad(link).draw_slice)) if (!(draw_slice = link->dstpad->draw_slice))
draw_slice = avfilter_default_draw_slice; draw_slice = avfilter_default_draw_slice;
draw_slice(link, y, h, slice_dir); draw_slice(link, y, h, slice_dir);
} }
...@@ -401,7 +399,7 @@ void avfilter_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) ...@@ -401,7 +399,7 @@ void avfilter_draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
void avfilter_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref) void avfilter_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref)
{ {
void (*filter_samples)(AVFilterLink *, AVFilterBufferRef *); void (*filter_samples)(AVFilterLink *, AVFilterBufferRef *);
AVFilterPad *dst = &link_dpad(link); AVFilterPad *dst = link->dstpad;
if (!(filter_samples = dst->filter_samples)) if (!(filter_samples = dst->filter_samples))
filter_samples = avfilter_default_filter_samples; filter_samples = avfilter_default_filter_samples;
...@@ -412,7 +410,7 @@ void avfilter_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref) ...@@ -412,7 +410,7 @@ void avfilter_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref)
av_log(link->dst, AV_LOG_DEBUG, av_log(link->dst, AV_LOG_DEBUG,
"Copying audio data in avfilter (have perms %x, need %x, reject %x)\n", "Copying audio data in avfilter (have perms %x, need %x, reject %x)\n",
samplesref->perms, link_dpad(link).min_perms, link_dpad(link).rej_perms); samplesref->perms, link->dstpad->min_perms, link->dstpad->rej_perms);
link->cur_buf = avfilter_default_get_audio_buffer(link, dst->min_perms, link->cur_buf = avfilter_default_get_audio_buffer(link, dst->min_perms,
samplesref->format, samplesref->format,
...@@ -534,7 +532,7 @@ void avfilter_destroy(AVFilterContext *filter) ...@@ -534,7 +532,7 @@ void avfilter_destroy(AVFilterContext *filter)
for (i = 0; i < filter->input_count; i++) { for (i = 0; i < filter->input_count; i++) {
if ((link = filter->inputs[i])) { if ((link = filter->inputs[i])) {
if (link->src) if (link->src)
link->src->outputs[link->srcpad] = NULL; link->src->outputs[link->srcpad - link->src->output_pads] = NULL;
avfilter_formats_unref(&link->in_formats); avfilter_formats_unref(&link->in_formats);
avfilter_formats_unref(&link->out_formats); avfilter_formats_unref(&link->out_formats);
} }
...@@ -543,7 +541,7 @@ void avfilter_destroy(AVFilterContext *filter) ...@@ -543,7 +541,7 @@ void avfilter_destroy(AVFilterContext *filter)
for (i = 0; i < filter->output_count; i++) { for (i = 0; i < filter->output_count; i++) {
if ((link = filter->outputs[i])) { if ((link = filter->outputs[i])) {
if (link->dst) if (link->dst)
link->dst->inputs[link->dstpad] = NULL; link->dst->inputs[link->dstpad - link->dst->input_pads] = NULL;
avfilter_formats_unref(&link->in_formats); avfilter_formats_unref(&link->in_formats);
avfilter_formats_unref(&link->out_formats); avfilter_formats_unref(&link->out_formats);
} }
......
...@@ -25,8 +25,8 @@ ...@@ -25,8 +25,8 @@
#include "libavutil/avutil.h" #include "libavutil/avutil.h"
#define LIBAVFILTER_VERSION_MAJOR 1 #define LIBAVFILTER_VERSION_MAJOR 1
#define LIBAVFILTER_VERSION_MINOR 46 #define LIBAVFILTER_VERSION_MINOR 47
#define LIBAVFILTER_VERSION_MICRO 1 #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, \
LIBAVFILTER_VERSION_MINOR, \ LIBAVFILTER_VERSION_MINOR, \
...@@ -556,10 +556,10 @@ struct AVFilterContext { ...@@ -556,10 +556,10 @@ struct AVFilterContext {
*/ */
struct AVFilterLink { struct AVFilterLink {
AVFilterContext *src; ///< source filter AVFilterContext *src; ///< source filter
unsigned int srcpad; ///< index of the output pad on the source filter AVFilterPad *srcpad; ///< output pad on the source filter
AVFilterContext *dst; ///< dest filter AVFilterContext *dst; ///< dest filter
unsigned int dstpad; ///< index of the input pad on the dest filter AVFilterPad *dstpad; ///< input pad on the dest filter
/** stage of the initialization of the link properties (dimensions, etc) */ /** stage of the initialization of the link properties (dimensions, etc) */
enum { enum {
......
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