Merge commit '5655732c77f2df9c1dfbddc30cd4844390a6921f'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 10 Jan 2014 02:36:42 +0000 (03:36 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 10 Jan 2014 02:37:03 +0000 (03:37 +0100)
* commit '5655732c77f2df9c1dfbddc30cd4844390a6921f':
  avfilter: add needs_writable field to the internal AVFilterPad structure

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavfilter/internal.h

diff --combined libavfilter/internal.h
@@@ -1,18 -1,18 +1,18 @@@
  /*
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  
  #include "libavutil/internal.h"
  #include "avfilter.h"
 +#include "avfiltergraph.h"
 +#include "formats.h"
  #include "thread.h"
  #include "version.h"
 +#include "video.h"
 +
 +#define POOL_SIZE 32
 +typedef struct AVFilterPool {
 +    AVFilterBufferRef *pic[POOL_SIZE];
 +    int count;
 +    int refcount;
 +    int draining;
 +} AVFilterPool;
 +
 +typedef struct AVFilterCommand {
 +    double time;                ///< time expressed in seconds
 +    char *command;              ///< command
 +    char *arg;                  ///< optional argument for the command
 +    int flags;
 +    struct AVFilterCommand *next;
 +} AVFilterCommand;
 +
 +/**
 + * Update the position of a link in the age heap.
 + */
 +void ff_avfilter_graph_update_heap(AVFilterGraph *graph, AVFilterLink *link);
  
  #if !FF_API_AVFILTERPAD_PUBLIC
  /**
@@@ -72,7 -48,7 +72,7 @@@ struct AVFilterPad 
  
      /**
       * Callback function to get a video buffer. If NULL, the filter system will
 -     * use avfilter_default_get_video_buffer().
 +     * use ff_default_get_video_buffer().
       *
       * Input video pads only.
       */
@@@ -80,7 -56,7 +80,7 @@@
  
      /**
       * Callback function to get an audio buffer. If NULL, the filter system will
 -     * use avfilter_default_get_audio_buffer().
 +     * use ff_default_get_audio_buffer().
       *
       * Input audio pads only.
       */
       * input pads only.
       */
      int needs_fifo;
+     /**
+      * The filter expects writable frames from its input link,
+      * duplicating data buffers if needed.
+      *
+      * input pads only.
+      */
+     int needs_writable;
  };
  #endif
  
@@@ -161,82 -145,9 +169,82 @@@ void ff_avfilter_default_free_buffer(AV
  /** Tell is a format is contained in the provided list terminated by -1. */
  int ff_fmt_is_in(int fmt, const int *fmts);
  
 -#define FF_DPRINTF_START(ctx, func) av_dlog(NULL, "%-16s: ", #func)
 +/* Functions to parse audio format arguments */
 +
 +/**
 + * Parse a pixel format.
 + *
 + * @param ret pixel format pointer to where the value should be written
 + * @param arg string to parse
 + * @param log_ctx log context
 + * @return >= 0 in case of success, a negative AVERROR code on error
 + */
 +int ff_parse_pixel_format(enum AVPixelFormat *ret, const char *arg, void *log_ctx);
 +
 +/**
 + * Parse a sample rate.
 + *
 + * @param ret unsigned integer pointer to where the value should be written
 + * @param arg string to parse
 + * @param log_ctx log context
 + * @return >= 0 in case of success, a negative AVERROR code on error
 + */
 +int ff_parse_sample_rate(int *ret, const char *arg, void *log_ctx);
 +
 +/**
 + * Parse a time base.
 + *
 + * @param ret unsigned AVRational pointer to where the value should be written
 + * @param arg string to parse
 + * @param log_ctx log context
 + * @return >= 0 in case of success, a negative AVERROR code on error
 + */
 +int ff_parse_time_base(AVRational *ret, const char *arg, void *log_ctx);
 +
 +/**
 + * Parse a sample format name or a corresponding integer representation.
 + *
 + * @param ret integer pointer to where the value should be written
 + * @param arg string to parse
 + * @param log_ctx log context
 + * @return >= 0 in case of success, a negative AVERROR code on error
 + */
 +int ff_parse_sample_format(int *ret, const char *arg, void *log_ctx);
 +
 +/**
 + * Parse a channel layout or a corresponding integer representation.
 + *
 + * @param ret 64bit integer pointer to where the value should be written.
 + * @param nret integer pointer to the number of channels;
 + *             if not NULL, then unknown channel layouts are accepted
 + * @param arg string to parse
 + * @param log_ctx log context
 + * @return >= 0 in case of success, a negative AVERROR code on error
 + */
 +int ff_parse_channel_layout(int64_t *ret, int *nret, const char *arg,
 +                            void *log_ctx);
 +
 +void ff_update_link_current_pts(AVFilterLink *link, int64_t pts);
 +
 +void ff_command_queue_pop(AVFilterContext *filter);
 +
 +/* misc trace functions */
 +
 +/* #define FF_AVFILTER_TRACE */
 +
 +#ifdef FF_AVFILTER_TRACE
 +#    define ff_tlog(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__)
 +#else
 +#    define ff_tlog(pctx, ...) do { if (0) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__); } while (0)
 +#endif
 +
 +#define FF_TPRINTF_START(ctx, func) ff_tlog(NULL, "%-16s: ", #func)
 +
 +char *ff_get_ref_perms_string(char *buf, size_t buf_size, int perms);
  
 -void ff_dlog_link(void *ctx, AVFilterLink *link, int end);
 +void ff_tlog_ref(void *ctx, AVFrame *ref, int end);
 +
 +void ff_tlog_link(void *ctx, AVFilterLink *link, int end);
  
  /**
   * Insert a new pad.
   * @param pads Pointer to the pointer to the beginning of the list of pads
   * @param links Pointer to the pointer to the beginning of the list of links
   * @param newpad The new pad to add. A copy is made when adding.
 + * @return >= 0 in case of success, a negative AVERROR code on error
   */
 -void ff_insert_pad(unsigned idx, unsigned *count, size_t padidx_off,
 +int ff_insert_pad(unsigned idx, unsigned *count, size_t padidx_off,
                     AVFilterPad **pads, AVFilterLink ***links,
                     AVFilterPad *newpad);
  
  /** Insert a new input pad for the filter. */
 -static inline void ff_insert_inpad(AVFilterContext *f, unsigned index,
 +static inline int ff_insert_inpad(AVFilterContext *f, unsigned index,
                                     AVFilterPad *p)
  {
 -    ff_insert_pad(index, &f->nb_inputs, offsetof(AVFilterLink, dstpad),
 +    int ret = ff_insert_pad(index, &f->nb_inputs, offsetof(AVFilterLink, dstpad),
                    &f->input_pads, &f->inputs, p);
  #if FF_API_FOO_COUNT
  FF_DISABLE_DEPRECATION_WARNINGS
      f->input_count = f->nb_inputs;
  FF_ENABLE_DEPRECATION_WARNINGS
  #endif
 +    return ret;
  }
  
  /** Insert a new output pad for the filter. */
 -static inline void ff_insert_outpad(AVFilterContext *f, unsigned index,
 +static inline int ff_insert_outpad(AVFilterContext *f, unsigned index,
                                      AVFilterPad *p)
  {
 -    ff_insert_pad(index, &f->nb_outputs, offsetof(AVFilterLink, srcpad),
 +    int ret = ff_insert_pad(index, &f->nb_outputs, offsetof(AVFilterLink, srcpad),
                    &f->output_pads, &f->outputs, p);
  #if FF_API_FOO_COUNT
  FF_DISABLE_DEPRECATION_WARNINGS
      f->output_count = f->nb_outputs;
  FF_ENABLE_DEPRECATION_WARNINGS
  #endif
 +    return ret;
  }
  
  /**
@@@ -301,29 -209,6 +309,29 @@@ int ff_poll_frame(AVFilterLink *link)
   */
  int ff_request_frame(AVFilterLink *link);
  
 +#define AVFILTER_DEFINE_CLASS(fname)            \
 +    static const AVClass fname##_class = {      \
 +        .class_name = #fname,                   \
 +        .item_name  = av_default_item_name,     \
 +        .option     = fname##_options,          \
 +        .version    = LIBAVUTIL_VERSION_INT,    \
 +        .category   = AV_CLASS_CATEGORY_FILTER, \
 +    }
 +
 +AVFilterBufferRef *ff_copy_buffer_ref(AVFilterLink *outlink,
 +                                      AVFilterBufferRef *ref);
 +
 +/**
 + * Find the index of a link.
 + *
 + * I.e. find i such that link == ctx->(in|out)puts[i]
 + */
 +#define FF_INLINK_IDX(link)  ((int)((link)->dstpad - (link)->dst->input_pads))
 +#define FF_OUTLINK_IDX(link) ((int)((link)->srcpad - (link)->src->output_pads))
 +
 +int ff_buffersink_read_compat(AVFilterContext *ctx, AVFilterBufferRef **buf);
 +int ff_buffersink_read_samples_compat(AVFilterContext *ctx, AVFilterBufferRef **pbuf,
 +                                      int nb_samples);
  /**
   * Send a frame of data to the next filter.
   *
  int ff_filter_frame(AVFilterLink *link, AVFrame *frame);
  
  /**
 + * Flags for AVFilterLink.flags.
 + */
 +enum {
 +
 +    /**
 +     * Frame requests may need to loop in order to be fulfilled.
 +     * A filter must set this flags on an output link if it may return 0 in
 +     * request_frame() without filtering a frame.
 +     */
 +    FF_LINK_FLAG_REQUEST_LOOP = 1,
 +
 +};
 +
 +/**
   * Allocate a new filter context and return it.
   *
   * @param filter what filter to create an instance of