* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-/* #define DEBUG */
-
#include "libavutil/pixdesc.h"
#include "libavutil/rational.h"
#include "libavutil/audioconvert.h"
#include "formats.h"
#include "internal.h"
+char *ff_get_ref_perms_string(char *buf, size_t buf_size, int perms)
+{
+ snprintf(buf, buf_size, "%s%s%s%s%s%s",
+ perms & AV_PERM_READ ? "r" : "",
+ perms & AV_PERM_WRITE ? "w" : "",
+ perms & AV_PERM_PRESERVE ? "p" : "",
+ perms & AV_PERM_REUSE ? "u" : "",
+ perms & AV_PERM_REUSE2 ? "U" : "",
+ perms & AV_PERM_NEG_LINESIZES ? "n" : "");
+ return buf;
+}
+
+void ff_tlog_ref(void *ctx, AVFilterBufferRef *ref, int end)
+{
+ av_unused char buf[16];
+ ff_tlog(ctx,
+ "ref[%p buf:%p refcount:%d perms:%s data:%p linesize[%d, %d, %d, %d] pts:%"PRId64" pos:%"PRId64,
+ ref, ref->buf, ref->buf->refcount, ff_get_ref_perms_string(buf, sizeof(buf), ref->perms), ref->data[0],
+ ref->linesize[0], ref->linesize[1], ref->linesize[2], ref->linesize[3],
+ ref->pts, ref->pos);
+
+ if (ref->video) {
+ ff_tlog(ctx, " a:%d/%d s:%dx%d i:%c iskey:%d type:%c",
+ ref->video->sample_aspect_ratio.num, ref->video->sample_aspect_ratio.den,
+ ref->video->w, ref->video->h,
+ !ref->video->interlaced ? 'P' : /* Progressive */
+ ref->video->top_field_first ? 'T' : 'B', /* Top / Bottom */
+ ref->video->key_frame,
+ av_get_picture_type_char(ref->video->pict_type));
+ }
+ if (ref->audio) {
+ ff_tlog(ctx, " cl:%"PRId64"d n:%d r:%d",
+ ref->audio->channel_layout,
+ ref->audio->nb_samples,
+ ref->audio->sample_rate);
+ }
+
+ ff_tlog(ctx, "]%s", end ? "\n" : "");
+}
+
unsigned avfilter_version(void) {
av_assert0(LIBAVFILTER_VERSION_MICRO >= 100);
return LIBAVFILTER_VERSION_INT;
av_free(c);
}
-void avfilter_insert_pad(unsigned idx, unsigned *count, size_t padidx_off,
- AVFilterPad **pads, AVFilterLink ***links,
- AVFilterPad *newpad)
+void ff_insert_pad(unsigned idx, unsigned *count, size_t padidx_off,
+ AVFilterPad **pads, AVFilterLink ***links,
+ AVFilterPad *newpad)
{
unsigned i;
{
AVFilterLink *link;
- if (src->output_count <= srcpad || dst->input_count <= dstpad ||
- src->outputs[srcpad] || dst->inputs[dstpad])
+ if (src->nb_outputs <= srcpad || dst->nb_inputs <= dstpad ||
+ src->outputs[srcpad] || dst->inputs[dstpad])
return -1;
if (src->output_pads[srcpad].type != dst->input_pads[dstpad].type) {
/* if any information on supported media formats already exists on the
* link, we need to preserve that */
if (link->out_formats)
- avfilter_formats_changeref(&link->out_formats,
+ ff_formats_changeref(&link->out_formats,
&filt->outputs[filt_dstpad_idx]->out_formats);
+
+ if (link->out_samplerates)
+ ff_formats_changeref(&link->out_samplerates,
+ &filt->outputs[filt_dstpad_idx]->out_samplerates);
if (link->out_channel_layouts)
ff_channel_layouts_changeref(&link->out_channel_layouts,
&filt->outputs[filt_dstpad_idx]->out_channel_layouts);
- if (link->out_samplerates)
- avfilter_formats_changeref(&link->out_samplerates,
- &filt->outputs[filt_dstpad_idx]->out_samplerates);
return 0;
}
unsigned i;
int ret;
- for (i = 0; i < filter->input_count; i ++) {
+ for (i = 0; i < filter->nb_inputs; i ++) {
AVFilterLink *link = filter->inputs[i];
- AVFilterLink *inlink = link->src->input_count ?
+ AVFilterLink *inlink = link->src->nb_inputs ?
link->src->inputs[0] : NULL;
if (!link) continue;
return ret;
if (!(config_link = link->srcpad->config_props)) {
- if (link->src->input_count != 1) {
+ if (link->src->nb_inputs != 1) {
av_log(link->src, AV_LOG_ERROR, "Source filters and filters "
"with more than one input "
"must set config_props() "
"callbacks on all outputs\n");
return AVERROR(EINVAL);
}
- } else if ((ret = config_link(link)) < 0)
+ } else if ((ret = config_link(link)) < 0) {
+ av_log(link->src, AV_LOG_ERROR,
+ "Failed to configure output pad on %s\n",
+ link->src->name);
return ret;
+ }
switch (link->type) {
case AVMEDIA_TYPE_VIDEO:
link->sample_aspect_ratio = inlink ?
inlink->sample_aspect_ratio : (AVRational){1,1};
-#if 1
+ if (inlink && !link->frame_rate.num && !link->frame_rate.den)
+ link->frame_rate = inlink->frame_rate;
+
if (inlink) {
if (!link->w)
link->w = inlink->w;
link->time_base = (AVRational) {1, link->sample_rate};
}
-#endif
if ((config_link = link->dstpad->config_props))
- if ((ret = config_link(link)) < 0)
+ if ((ret = config_link(link)) < 0) {
+ av_log(link->src, AV_LOG_ERROR,
+ "Failed to configure input pad on %s\n",
+ link->dst->name);
return ret;
+ }
link->init_state = AVLINK_INIT;
}
return 0;
}
-void ff_dlog_link(void *ctx, AVFilterLink *link, int end)
+void ff_tlog_link(void *ctx, AVFilterLink *link, int end)
{
if (link->type == AVMEDIA_TYPE_VIDEO) {
- av_dlog(ctx,
+ ff_tlog(ctx,
"link[%p s:%dx%d fmt:%s %s->%s]%s",
link, link->w, link->h,
av_pix_fmt_descriptors[link->format].name,
char buf[128];
av_get_channel_layout_string(buf, sizeof(buf), -1, link->channel_layout);
- av_dlog(ctx,
+ ff_tlog(ctx,
"link[%p r:%d cl:%s fmt:%s %s->%s]%s",
link, (int)link->sample_rate, buf,
av_get_sample_fmt_name(link->format),
}
}
-int avfilter_request_frame(AVFilterLink *link)
+int ff_request_frame(AVFilterLink *link)
{
- FF_DPRINTF_START(NULL, request_frame); ff_dlog_link(NULL, link, 1);
+ FF_TPRINTF_START(NULL, request_frame); ff_tlog_link(NULL, link, 1);
if (link->srcpad->request_frame)
return link->srcpad->request_frame(link);
else if (link->src->inputs[0])
- return avfilter_request_frame(link->src->inputs[0]);
+ return ff_request_frame(link->src->inputs[0]);
else return -1;
}
-int avfilter_poll_frame(AVFilterLink *link)
+int ff_poll_frame(AVFilterLink *link)
{
int i, min = INT_MAX;
if (link->srcpad->poll_frame)
return link->srcpad->poll_frame(link);
- for (i = 0; i < link->src->input_count; i++) {
+ for (i = 0; i < link->src->nb_inputs; i++) {
int val;
if (!link->src->inputs[i])
return -1;
- val = avfilter_poll_frame(link->src->inputs[i]);
+ val = ff_poll_frame(link->src->inputs[i]);
min = FFMIN(min, val);
}
return count;
}
-static const char *filter_name(void *p)
+static const char *default_filter_name(void *filter_ctx)
{
- AVFilterContext *filter = p;
- return filter->filter->name;
+ AVFilterContext *ctx = filter_ctx;
+ return ctx->name ? ctx->name : ctx->filter->name;
}
static const AVClass avfilter_class = {
- "AVFilter",
- filter_name,
- NULL,
- LIBAVUTIL_VERSION_INT,
+ .class_name = "AVFilter",
+ .item_name = default_filter_name,
+ .version = LIBAVUTIL_VERSION_INT,
+ .category = AV_CLASS_CATEGORY_FILTER,
};
int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name)
goto err;
}
- ret->input_count = pad_count(filter->inputs);
- if (ret->input_count) {
- ret->input_pads = av_malloc(sizeof(AVFilterPad) * ret->input_count);
+ ret->nb_inputs = pad_count(filter->inputs);
+ if (ret->nb_inputs ) {
+ ret->input_pads = av_malloc(sizeof(AVFilterPad) * ret->nb_inputs);
if (!ret->input_pads)
goto err;
- memcpy(ret->input_pads, filter->inputs, sizeof(AVFilterPad) * ret->input_count);
- ret->inputs = av_mallocz(sizeof(AVFilterLink*) * ret->input_count);
+ memcpy(ret->input_pads, filter->inputs, sizeof(AVFilterPad) * ret->nb_inputs);
+ ret->inputs = av_mallocz(sizeof(AVFilterLink*) * ret->nb_inputs);
if (!ret->inputs)
goto err;
}
- ret->output_count = pad_count(filter->outputs);
- if (ret->output_count) {
- ret->output_pads = av_malloc(sizeof(AVFilterPad) * ret->output_count);
+ ret->nb_outputs = pad_count(filter->outputs);
+ if (ret->nb_outputs) {
+ ret->output_pads = av_malloc(sizeof(AVFilterPad) * ret->nb_outputs);
if (!ret->output_pads)
goto err;
- memcpy(ret->output_pads, filter->outputs, sizeof(AVFilterPad) * ret->output_count);
- ret->outputs = av_mallocz(sizeof(AVFilterLink*) * ret->output_count);
+ memcpy(ret->output_pads, filter->outputs, sizeof(AVFilterPad) * ret->nb_outputs);
+ ret->outputs = av_mallocz(sizeof(AVFilterLink*) * ret->nb_outputs);
if (!ret->outputs)
goto err;
}
+#if FF_API_FOO_COUNT
+ ret->output_count = ret->nb_outputs;
+ ret->input_count = ret->nb_inputs;
+#endif
*filter_ctx = ret;
return 0;
err:
av_freep(&ret->inputs);
av_freep(&ret->input_pads);
- ret->input_count = 0;
+ ret->nb_inputs = 0;
av_freep(&ret->outputs);
av_freep(&ret->output_pads);
- ret->output_count = 0;
+ ret->nb_outputs = 0;
av_freep(&ret->priv);
av_free(ret);
return AVERROR(ENOMEM);
if (filter->filter->uninit)
filter->filter->uninit(filter);
- for (i = 0; i < filter->input_count; i++) {
+ for (i = 0; i < filter->nb_inputs; i++) {
if ((link = filter->inputs[i])) {
if (link->src)
link->src->outputs[link->srcpad - link->src->output_pads] = NULL;
- avfilter_formats_unref(&link->in_formats);
- avfilter_formats_unref(&link->out_formats);
- avfilter_formats_unref(&link->in_samplerates);
- avfilter_formats_unref(&link->out_samplerates);
+ ff_formats_unref(&link->in_formats);
+ ff_formats_unref(&link->out_formats);
+ ff_formats_unref(&link->in_samplerates);
+ ff_formats_unref(&link->out_samplerates);
ff_channel_layouts_unref(&link->in_channel_layouts);
ff_channel_layouts_unref(&link->out_channel_layouts);
}
avfilter_link_free(&link);
}
- for (i = 0; i < filter->output_count; i++) {
+ for (i = 0; i < filter->nb_outputs; i++) {
if ((link = filter->outputs[i])) {
if (link->dst)
link->dst->inputs[link->dstpad - link->dst->input_pads] = NULL;
- avfilter_formats_unref(&link->in_formats);
- avfilter_formats_unref(&link->out_formats);
- avfilter_formats_unref(&link->in_samplerates);
- avfilter_formats_unref(&link->out_samplerates);
+ ff_formats_unref(&link->in_formats);
+ ff_formats_unref(&link->out_formats);
+ ff_formats_unref(&link->in_samplerates);
+ ff_formats_unref(&link->out_samplerates);
ff_channel_layouts_unref(&link->in_channel_layouts);
ff_channel_layouts_unref(&link->out_channel_layouts);
}
ret = filter->filter->init(filter, args, opaque);
return ret;
}
+
+const char *avfilter_pad_get_name(AVFilterPad *pads, int pad_idx)
+{
+ return pads[pad_idx].name;
+}
+
+enum AVMediaType avfilter_pad_get_type(AVFilterPad *pads, int pad_idx)
+{
+ return pads[pad_idx].type;
+}
+
+#if FF_API_DEFAULT_CONFIG_OUTPUT_LINK
+void avfilter_insert_pad(unsigned idx, unsigned *count, size_t padidx_off,
+ AVFilterPad **pads, AVFilterLink ***links,
+ AVFilterPad *newpad)
+{
+ ff_insert_pad(idx, count, padidx_off, pads, links, newpad);
+}
+void avfilter_insert_inpad(AVFilterContext *f, unsigned index,
+ AVFilterPad *p)
+{
+ ff_insert_pad(index, &f->nb_inputs, offsetof(AVFilterLink, dstpad),
+ &f->input_pads, &f->inputs, p);
+#if FF_API_FOO_COUNT
+ f->input_count = f->nb_inputs;
+#endif
+}
+void avfilter_insert_outpad(AVFilterContext *f, unsigned index,
+ AVFilterPad *p)
+{
+ ff_insert_pad(index, &f->nb_outputs, offsetof(AVFilterLink, srcpad),
+ &f->output_pads, &f->outputs, p);
+#if FF_API_FOO_COUNT
+ f->output_count = f->nb_outputs;
+#endif
+}
+int avfilter_poll_frame(AVFilterLink *link)
+{
+ return ff_poll_frame(link);
+}
+int avfilter_request_frame(AVFilterLink *link)
+{
+ return ff_request_frame(link);
+}
+#endif