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_BUFFERSINK_H 20 #define AVFILTER_BUFFERSINK_H 21 22 /** 23 * @file 24 * @ingroup lavfi_buffersink 25 * memory buffer sink API for audio and video 26 */ 27 28 #include "avfilter.h" 29 30 /** 31 * @defgroup lavfi_buffersink Buffer sink API 32 * @ingroup lavfi 33 * @{ 34 */ 35 36 /** 37 * Get a frame with filtered data from sink and put it in frame. 38 * 39 * @param ctx pointer to a buffersink or abuffersink filter context. 40 * @param frame pointer to an allocated frame that will be filled with data. 41 * The data must be freed using av_frame_unref() / av_frame_free() 42 * @param flags a combination of AV_BUFFERSINK_FLAG_* flags 43 * 44 * @return >= 0 in for success, a negative AVERROR code for failure. 45 */ 46 int av_buffersink_get_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flags); 47 48 /** 49 * Tell av_buffersink_get_buffer_ref() to read video/samples buffer 50 * reference, but not remove it from the buffer. This is useful if you 51 * need only to read a video/samples buffer, without to fetch it. 52 */ 53 #define AV_BUFFERSINK_FLAG_PEEK 1 54 55 /** 56 * Tell av_buffersink_get_buffer_ref() not to request a frame from its input. 57 * If a frame is already buffered, it is read (and removed from the buffer), 58 * but if no frame is present, return AVERROR(EAGAIN). 59 */ 60 #define AV_BUFFERSINK_FLAG_NO_REQUEST 2 61 62 #if FF_API_NEXT 63 /** 64 * Struct to use for initializing a buffersink context. 65 */ 66 typedef struct AVBufferSinkParams { 67 const enum AVPixelFormat *pixel_fmts; ///< list of allowed pixel formats, terminated by AV_PIX_FMT_NONE 68 } AVBufferSinkParams; 69 70 /** 71 * Create an AVBufferSinkParams structure. 72 * 73 * Must be freed with av_free(). 74 */ 75 attribute_deprecated 76 AVBufferSinkParams *av_buffersink_params_alloc(void); 77 78 /** 79 * Struct to use for initializing an abuffersink context. 80 */ 81 typedef struct AVABufferSinkParams { 82 const enum AVSampleFormat *sample_fmts; ///< list of allowed sample formats, terminated by AV_SAMPLE_FMT_NONE 83 const int64_t *channel_layouts; ///< list of allowed channel layouts, terminated by -1 84 const int *channel_counts; ///< list of allowed channel counts, terminated by -1 85 int all_channel_counts; ///< if not 0, accept any channel count or layout 86 int *sample_rates; ///< list of allowed sample rates, terminated by -1 87 } AVABufferSinkParams; 88 89 /** 90 * Create an AVABufferSinkParams structure. 91 * 92 * Must be freed with av_free(). 93 */ 94 attribute_deprecated 95 AVABufferSinkParams *av_abuffersink_params_alloc(void); 96 #endif 97 98 /** 99 * Set the frame size for an audio buffer sink. 100 * 101 * All calls to av_buffersink_get_buffer_ref will return a buffer with 102 * exactly the specified number of samples, or AVERROR(EAGAIN) if there is 103 * not enough. The last buffer at EOF will be padded with 0. 104 */ 105 void av_buffersink_set_frame_size(AVFilterContext *ctx, unsigned frame_size); 106 107 /** 108 * @defgroup lavfi_buffersink_accessors Buffer sink accessors 109 * Get the properties of the stream 110 * @{ 111 */ 112 113 enum AVMediaType av_buffersink_get_type (const AVFilterContext *ctx); 114 AVRational av_buffersink_get_time_base (const AVFilterContext *ctx); 115 int av_buffersink_get_format (const AVFilterContext *ctx); 116 117 AVRational av_buffersink_get_frame_rate (const AVFilterContext *ctx); 118 int av_buffersink_get_w (const AVFilterContext *ctx); 119 int av_buffersink_get_h (const AVFilterContext *ctx); 120 AVRational av_buffersink_get_sample_aspect_ratio (const AVFilterContext *ctx); 121 122 int av_buffersink_get_channels (const AVFilterContext *ctx); 123 uint64_t av_buffersink_get_channel_layout (const AVFilterContext *ctx); 124 int av_buffersink_get_sample_rate (const AVFilterContext *ctx); 125 126 AVBufferRef * av_buffersink_get_hw_frames_ctx (const AVFilterContext *ctx); 127 128 /** @} */ 129 130 /** 131 * Get a frame with filtered data from sink and put it in frame. 132 * 133 * @param ctx pointer to a context of a buffersink or abuffersink AVFilter. 134 * @param frame pointer to an allocated frame that will be filled with data. 135 * The data must be freed using av_frame_unref() / av_frame_free() 136 * 137 * @return 138 * - >= 0 if a frame was successfully returned. 139 * - AVERROR(EAGAIN) if no frames are available at this point; more 140 * input frames must be added to the filtergraph to get more output. 141 * - AVERROR_EOF if there will be no more output frames on this sink. 142 * - A different negative AVERROR code in other failure cases. 143 */ 144 int av_buffersink_get_frame(AVFilterContext *ctx, AVFrame *frame); 145 146 /** 147 * Same as av_buffersink_get_frame(), but with the ability to specify the number 148 * of samples read. This function is less efficient than 149 * av_buffersink_get_frame(), because it copies the data around. 150 * 151 * @param ctx pointer to a context of the abuffersink AVFilter. 152 * @param frame pointer to an allocated frame that will be filled with data. 153 * The data must be freed using av_frame_unref() / av_frame_free() 154 * frame will contain exactly nb_samples audio samples, except at 155 * the end of stream, when it can contain less than nb_samples. 156 * 157 * @return The return codes have the same meaning as for 158 * av_buffersink_get_frame(). 159 * 160 * @warning do not mix this function with av_buffersink_get_frame(). Use only one or 161 * the other with a single sink, not both. 162 */ 163 int av_buffersink_get_samples(AVFilterContext *ctx, AVFrame *frame, int nb_samples); 164 165 /** 166 * @} 167 */ 168 169 #endif /* AVFILTER_BUFFERSINK_H */ 170