Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * This file is part of FFmpeg.
  3.  *
  4.  * FFmpeg is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Lesser General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2.1 of the License, or (at your option) any later version.
  8.  *
  9.  * FFmpeg is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.  * Lesser General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with FFmpeg; if not, write to the Free Software
  16.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17.  */
  18.  
  19. #ifndef AVFILTER_INTERNAL_H
  20. #define AVFILTER_INTERNAL_H
  21.  
  22. /**
  23.  * @file
  24.  * internal API functions
  25.  */
  26.  
  27. #include "libavutil/internal.h"
  28. #include "avfilter.h"
  29. #include "avfiltergraph.h"
  30. #include "formats.h"
  31. #include "thread.h"
  32. #include "version.h"
  33. #include "video.h"
  34. #include "libavcodec/avcodec.h"
  35.  
  36. #if FF_API_AVFILTERBUFFER
  37. #define POOL_SIZE 32
  38. typedef struct AVFilterPool {
  39.     AVFilterBufferRef *pic[POOL_SIZE];
  40.     int count;
  41.     int refcount;
  42.     int draining;
  43. } AVFilterPool;
  44. #endif
  45.  
  46. typedef struct AVFilterCommand {
  47.     double time;                ///< time expressed in seconds
  48.     char *command;              ///< command
  49.     char *arg;                  ///< optional argument for the command
  50.     int flags;
  51.     struct AVFilterCommand *next;
  52. } AVFilterCommand;
  53.  
  54. /**
  55.  * Update the position of a link in the age heap.
  56.  */
  57. void ff_avfilter_graph_update_heap(AVFilterGraph *graph, AVFilterLink *link);
  58.  
  59. #if !FF_API_AVFILTERPAD_PUBLIC
  60. /**
  61.  * A filter pad used for either input or output.
  62.  */
  63. struct AVFilterPad {
  64.     /**
  65.      * Pad name. The name is unique among inputs and among outputs, but an
  66.      * input may have the same name as an output. This may be NULL if this
  67.      * pad has no need to ever be referenced by name.
  68.      */
  69.     const char *name;
  70.  
  71.     /**
  72.      * AVFilterPad type.
  73.      */
  74.     enum AVMediaType type;
  75.  
  76.     /**
  77.      * Callback function to get a video buffer. If NULL, the filter system will
  78.      * use ff_default_get_video_buffer().
  79.      *
  80.      * Input video pads only.
  81.      */
  82.     AVFrame *(*get_video_buffer)(AVFilterLink *link, int w, int h);
  83.  
  84.     /**
  85.      * Callback function to get an audio buffer. If NULL, the filter system will
  86.      * use ff_default_get_audio_buffer().
  87.      *
  88.      * Input audio pads only.
  89.      */
  90.     AVFrame *(*get_audio_buffer)(AVFilterLink *link, int nb_samples);
  91.  
  92.     /**
  93.      * Filtering callback. This is where a filter receives a frame with
  94.      * audio/video data and should do its processing.
  95.      *
  96.      * Input pads only.
  97.      *
  98.      * @return >= 0 on success, a negative AVERROR on error. This function
  99.      * must ensure that samplesref is properly unreferenced on error if it
  100.      * hasn't been passed on to another filter.
  101.      */
  102.     int (*filter_frame)(AVFilterLink *link, AVFrame *frame);
  103.  
  104.     /**
  105.      * Frame poll callback. This returns the number of immediately available
  106.      * samples. It should return a positive value if the next request_frame()
  107.      * is guaranteed to return one frame (with no delay).
  108.      *
  109.      * Defaults to just calling the source poll_frame() method.
  110.      *
  111.      * Output pads only.
  112.      */
  113.     int (*poll_frame)(AVFilterLink *link);
  114.  
  115.     /**
  116.      * Frame request callback. A call to this should result in at least one
  117.      * frame being output over the given link. This should return zero on
  118.      * success, and another value on error.
  119.      *
  120.      * Output pads only.
  121.      */
  122.     int (*request_frame)(AVFilterLink *link);
  123.  
  124.     /**
  125.      * Link configuration callback.
  126.      *
  127.      * For output pads, this should set the link properties such as
  128.      * width/height. This should NOT set the format property - that is
  129.      * negotiated between filters by the filter system using the
  130.      * query_formats() callback before this function is called.
  131.      *
  132.      * For input pads, this should check the properties of the link, and update
  133.      * the filter's internal state as necessary.
  134.      *
  135.      * For both input and output filters, this should return zero on success,
  136.      * and another value on error.
  137.      */
  138.     int (*config_props)(AVFilterLink *link);
  139.  
  140.     /**
  141.      * The filter expects a fifo to be inserted on its input link,
  142.      * typically because it has a delay.
  143.      *
  144.      * input pads only.
  145.      */
  146.     int needs_fifo;
  147.  
  148.     /**
  149.      * The filter expects writable frames from its input link,
  150.      * duplicating data buffers if needed.
  151.      *
  152.      * input pads only.
  153.      */
  154.     int needs_writable;
  155. };
  156. #endif
  157.  
  158. struct AVFilterGraphInternal {
  159.     void *thread;
  160.     avfilter_execute_func *thread_execute;
  161. };
  162.  
  163. struct AVFilterInternal {
  164.     avfilter_execute_func *execute;
  165. };
  166.  
  167. #if FF_API_AVFILTERBUFFER
  168. /** default handler for freeing audio/video buffer when there are no references left */
  169. void ff_avfilter_default_free_buffer(AVFilterBuffer *buf);
  170. #endif
  171.  
  172. /** Tell is a format is contained in the provided list terminated by -1. */
  173. int ff_fmt_is_in(int fmt, const int *fmts);
  174.  
  175. /* Functions to parse audio format arguments */
  176.  
  177. /**
  178.  * Parse a pixel format.
  179.  *
  180.  * @param ret pixel format pointer to where the value should be written
  181.  * @param arg string to parse
  182.  * @param log_ctx log context
  183.  * @return >= 0 in case of success, a negative AVERROR code on error
  184.  */
  185. int ff_parse_pixel_format(enum AVPixelFormat *ret, const char *arg, void *log_ctx);
  186.  
  187. /**
  188.  * Parse a sample rate.
  189.  *
  190.  * @param ret unsigned integer pointer to where the value should be written
  191.  * @param arg string to parse
  192.  * @param log_ctx log context
  193.  * @return >= 0 in case of success, a negative AVERROR code on error
  194.  */
  195. int ff_parse_sample_rate(int *ret, const char *arg, void *log_ctx);
  196.  
  197. /**
  198.  * Parse a time base.
  199.  *
  200.  * @param ret unsigned AVRational pointer to where the value should be written
  201.  * @param arg string to parse
  202.  * @param log_ctx log context
  203.  * @return >= 0 in case of success, a negative AVERROR code on error
  204.  */
  205. int ff_parse_time_base(AVRational *ret, const char *arg, void *log_ctx);
  206.  
  207. /**
  208.  * Parse a sample format name or a corresponding integer representation.
  209.  *
  210.  * @param ret integer pointer to where the value should be written
  211.  * @param arg string to parse
  212.  * @param log_ctx log context
  213.  * @return >= 0 in case of success, a negative AVERROR code on error
  214.  */
  215. int ff_parse_sample_format(int *ret, const char *arg, void *log_ctx);
  216.  
  217. /**
  218.  * Parse a channel layout or a corresponding integer representation.
  219.  *
  220.  * @param ret 64bit integer pointer to where the value should be written.
  221.  * @param nret integer pointer to the number of channels;
  222.  *             if not NULL, then unknown channel layouts are accepted
  223.  * @param arg string to parse
  224.  * @param log_ctx log context
  225.  * @return >= 0 in case of success, a negative AVERROR code on error
  226.  */
  227. int ff_parse_channel_layout(int64_t *ret, int *nret, const char *arg,
  228.                             void *log_ctx);
  229.  
  230. void ff_update_link_current_pts(AVFilterLink *link, int64_t pts);
  231.  
  232. void ff_command_queue_pop(AVFilterContext *filter);
  233.  
  234. /* misc trace functions */
  235.  
  236. /* #define FF_AVFILTER_TRACE */
  237.  
  238. #ifdef FF_AVFILTER_TRACE
  239. #    define ff_tlog(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__)
  240. #else
  241. #    define ff_tlog(pctx, ...) do { if (0) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__); } while (0)
  242. #endif
  243.  
  244. #define FF_TPRINTF_START(ctx, func) ff_tlog(NULL, "%-16s: ", #func)
  245.  
  246. char *ff_get_ref_perms_string(char *buf, size_t buf_size, int perms);
  247.  
  248. void ff_tlog_ref(void *ctx, AVFrame *ref, int end);
  249.  
  250. void ff_tlog_link(void *ctx, AVFilterLink *link, int end);
  251.  
  252. /**
  253.  * Insert a new pad.
  254.  *
  255.  * @param idx Insertion point. Pad is inserted at the end if this point
  256.  *            is beyond the end of the list of pads.
  257.  * @param count Pointer to the number of pads in the list
  258.  * @param padidx_off Offset within an AVFilterLink structure to the element
  259.  *                   to increment when inserting a new pad causes link
  260.  *                   numbering to change
  261.  * @param pads Pointer to the pointer to the beginning of the list of pads
  262.  * @param links Pointer to the pointer to the beginning of the list of links
  263.  * @param newpad The new pad to add. A copy is made when adding.
  264.  * @return >= 0 in case of success, a negative AVERROR code on error
  265.  */
  266. int ff_insert_pad(unsigned idx, unsigned *count, size_t padidx_off,
  267.                    AVFilterPad **pads, AVFilterLink ***links,
  268.                    AVFilterPad *newpad);
  269.  
  270. /** Insert a new input pad for the filter. */
  271. static inline int ff_insert_inpad(AVFilterContext *f, unsigned index,
  272.                                    AVFilterPad *p)
  273. {
  274.     int ret = ff_insert_pad(index, &f->nb_inputs, offsetof(AVFilterLink, dstpad),
  275.                   &f->input_pads, &f->inputs, p);
  276. #if FF_API_FOO_COUNT
  277. FF_DISABLE_DEPRECATION_WARNINGS
  278.     f->input_count = f->nb_inputs;
  279. FF_ENABLE_DEPRECATION_WARNINGS
  280. #endif
  281.     return ret;
  282. }
  283.  
  284. /** Insert a new output pad for the filter. */
  285. static inline int ff_insert_outpad(AVFilterContext *f, unsigned index,
  286.                                     AVFilterPad *p)
  287. {
  288.     int ret = ff_insert_pad(index, &f->nb_outputs, offsetof(AVFilterLink, srcpad),
  289.                   &f->output_pads, &f->outputs, p);
  290. #if FF_API_FOO_COUNT
  291. FF_DISABLE_DEPRECATION_WARNINGS
  292.     f->output_count = f->nb_outputs;
  293. FF_ENABLE_DEPRECATION_WARNINGS
  294. #endif
  295.     return ret;
  296. }
  297.  
  298. /**
  299.  * Poll a frame from the filter chain.
  300.  *
  301.  * @param  link the input link
  302.  * @return the number of immediately available frames, a negative
  303.  * number in case of error
  304.  */
  305. int ff_poll_frame(AVFilterLink *link);
  306.  
  307. /**
  308.  * Request an input frame from the filter at the other end of the link.
  309.  *
  310.  * The input filter may pass the request on to its inputs, fulfill the
  311.  * request from an internal buffer or any other means specific to its function.
  312.  *
  313.  * When the end of a stream is reached AVERROR_EOF is returned and no further
  314.  * frames are returned after that.
  315.  *
  316.  * When a filter is unable to output a frame for example due to its sources
  317.  * being unable to do so or because it depends on external means pushing data
  318.  * into it then AVERROR(EAGAIN) is returned.
  319.  * It is important that a AVERROR(EAGAIN) return is returned all the way to the
  320.  * caller (generally eventually a user application) as this step may (but does
  321.  * not have to be) necessary to provide the input with the next frame.
  322.  *
  323.  * If a request is successful then the filter_frame() function will be called
  324.  * at least once before ff_request_frame() returns
  325.  *
  326.  * @param link the input link
  327.  * @return     zero on success
  328.  *             AVERROR_EOF on end of file
  329.  *             AVERROR(EAGAIN) if the previous filter cannot output a frame
  330.  *             currently and can neither guarantee that EOF has been reached.
  331.  */
  332. int ff_request_frame(AVFilterLink *link);
  333.  
  334. #define AVFILTER_DEFINE_CLASS(fname)            \
  335.     static const AVClass fname##_class = {      \
  336.         .class_name = #fname,                   \
  337.         .item_name  = av_default_item_name,     \
  338.         .option     = fname##_options,          \
  339.         .version    = LIBAVUTIL_VERSION_INT,    \
  340.         .category   = AV_CLASS_CATEGORY_FILTER, \
  341.     }
  342.  
  343. /**
  344.  * Find the index of a link.
  345.  *
  346.  * I.e. find i such that link == ctx->(in|out)puts[i]
  347.  */
  348. #define FF_INLINK_IDX(link)  ((int)((link)->dstpad - (link)->dst->input_pads))
  349. #define FF_OUTLINK_IDX(link) ((int)((link)->srcpad - (link)->src->output_pads))
  350.  
  351. /**
  352.  * Send a frame of data to the next filter.
  353.  *
  354.  * @param link   the output link over which the data is being sent
  355.  * @param frame a reference to the buffer of data being sent. The
  356.  *              receiving filter will free this reference when it no longer
  357.  *              needs it or pass it on to the next filter.
  358.  *
  359.  * @return >= 0 on success, a negative AVERROR on error. The receiving filter
  360.  * is responsible for unreferencing frame in case of error.
  361.  */
  362. int ff_filter_frame(AVFilterLink *link, AVFrame *frame);
  363.  
  364. /**
  365.  * Flags for AVFilterLink.flags.
  366.  */
  367. enum {
  368.  
  369.     /**
  370.      * Frame requests may need to loop in order to be fulfilled.
  371.      * A filter must set this flags on an output link if it may return 0 in
  372.      * request_frame() without filtering a frame.
  373.      */
  374.     FF_LINK_FLAG_REQUEST_LOOP = 1,
  375.  
  376. };
  377.  
  378. /**
  379.  * Allocate a new filter context and return it.
  380.  *
  381.  * @param filter what filter to create an instance of
  382.  * @param inst_name name to give to the new filter context
  383.  *
  384.  * @return newly created filter context or NULL on failure
  385.  */
  386. AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name);
  387.  
  388. /**
  389.  * Remove a filter from a graph;
  390.  */
  391. void ff_filter_graph_remove_filter(AVFilterGraph *graph, AVFilterContext *filter);
  392.  
  393. /**
  394.  * Normalize the qscale factor
  395.  * FIXME the H264 qscale is a log based scale, mpeg1/2 is not, the code below
  396.  *       cannot be optimal
  397.  */
  398. static inline int ff_norm_qscale(int qscale, int type)
  399. {
  400.     switch (type) {
  401.     case FF_QSCALE_TYPE_MPEG1: return qscale;
  402.     case FF_QSCALE_TYPE_MPEG2: return qscale >> 1;
  403.     case FF_QSCALE_TYPE_H264:  return qscale >> 2;
  404.     case FF_QSCALE_TYPE_VP56:  return (63 - qscale + 2) >> 2;
  405.     }
  406.     return qscale;
  407. }
  408.  
  409. #endif /* AVFILTER_INTERNAL_H */
  410.