vf_unsharp.c
Go to the documentation of this file.
1 /*
2  * Original copyright (c) 2002 Remi Guyomarch <rguyom@pobox.com>
3  * Port copyright (c) 2010 Daniel G. Taylor <dan@programmer-art.org>
4  * Relicensed to the LGPL with permission from Remi Guyomarch.
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 /**
24  * @file
25  * blur / sharpen filter, ported to FFmpeg from MPlayer
26  * libmpcodecs/unsharp.c.
27  *
28  * This code is based on:
29  *
30  * An Efficient algorithm for Gaussian blur using finite-state machines
31  * Frederick M. Waltz and John W. V. Miller
32  *
33  * SPIE Conf. on Machine Vision Systems for Inspection and Metrology VII
34  * Originally published Boston, Nov 98
35  *
36  * http://www.engin.umd.umich.edu/~jwvm/ece581/21_GBlur.pdf
37  */
38 
39 #include <float.h> /* DBL_MAX */
40 
41 #include "avfilter.h"
42 #include "formats.h"
43 #include "internal.h"
44 #include "video.h"
45 #include "libavutil/common.h"
46 #include "libavutil/mem.h"
47 #include "libavutil/opt.h"
48 #include "libavutil/pixdesc.h"
49 
50 #define MIN_MATRIX_SIZE 3
51 #define MAX_MATRIX_SIZE 63
52 
53 /* right-shift and round-up */
54 #define SHIFTUP(x,shift) (-((-(x))>>(shift)))
55 
56 typedef struct FilterParam {
57  int msize_x; ///< matrix width
58  int msize_y; ///< matrix height
59  int amount; ///< effect amount
60  int steps_x; ///< horizontal step count
61  int steps_y; ///< vertical step count
62  int scalebits; ///< bits to shift pixel
63  int32_t halfscale; ///< amount to add to pixel
64  uint32_t *sc[MAX_MATRIX_SIZE - 1]; ///< finite state machine storage
65 } FilterParam;
66 
67 typedef struct {
68  const AVClass *class;
69  int lmsize_x, lmsize_y, cmsize_x, cmsize_y;
70  float lamount, camount;
71  FilterParam luma; ///< luma parameters (width, height, amount)
72  FilterParam chroma; ///< chroma parameters (width, height, amount)
73  int hsub, vsub;
75 
76 static void apply_unsharp( uint8_t *dst, int dst_stride,
77  const uint8_t *src, int src_stride,
78  int width, int height, FilterParam *fp)
79 {
80  uint32_t **sc = fp->sc;
81  uint32_t sr[MAX_MATRIX_SIZE - 1], tmp1, tmp2;
82 
83  int32_t res;
84  int x, y, z;
85  const uint8_t *src2 = NULL; //silence a warning
86  const int amount = fp->amount;
87  const int steps_x = fp->steps_x;
88  const int steps_y = fp->steps_y;
89  const int scalebits = fp->scalebits;
90  const int32_t halfscale = fp->halfscale;
91 
92  if (!amount) {
93  if (dst_stride == src_stride)
94  memcpy(dst, src, src_stride * height);
95  else
96  for (y = 0; y < height; y++, dst += dst_stride, src += src_stride)
97  memcpy(dst, src, width);
98  return;
99  }
100 
101  for (y = 0; y < 2 * steps_y; y++)
102  memset(sc[y], 0, sizeof(sc[y][0]) * (width + 2 * steps_x));
103 
104  for (y = -steps_y; y < height + steps_y; y++) {
105  if (y < height)
106  src2 = src;
107 
108  memset(sr, 0, sizeof(sr[0]) * (2 * steps_x - 1));
109  for (x = -steps_x; x < width + steps_x; x++) {
110  tmp1 = x <= 0 ? src2[0] : x >= width ? src2[width-1] : src2[x];
111  for (z = 0; z < steps_x * 2; z += 2) {
112  tmp2 = sr[z + 0] + tmp1; sr[z + 0] = tmp1;
113  tmp1 = sr[z + 1] + tmp2; sr[z + 1] = tmp2;
114  }
115  for (z = 0; z < steps_y * 2; z += 2) {
116  tmp2 = sc[z + 0][x + steps_x] + tmp1; sc[z + 0][x + steps_x] = tmp1;
117  tmp1 = sc[z + 1][x + steps_x] + tmp2; sc[z + 1][x + steps_x] = tmp2;
118  }
119  if (x >= steps_x && y >= steps_y) {
120  const uint8_t *srx = src - steps_y * src_stride + x - steps_x;
121  uint8_t *dsx = dst - steps_y * dst_stride + x - steps_x;
122 
123  res = (int32_t)*srx + ((((int32_t) * srx - (int32_t)((tmp1 + halfscale) >> scalebits)) * amount) >> 16);
124  *dsx = av_clip_uint8(res);
125  }
126  }
127  if (y >= 0) {
128  dst += dst_stride;
129  src += src_stride;
130  }
131  }
132 }
133 
134 static void set_filter_param(FilterParam *fp, int msize_x, int msize_y, float amount)
135 {
136  fp->msize_x = msize_x;
137  fp->msize_y = msize_y;
138  fp->amount = amount * 65536.0;
139 
140  fp->steps_x = msize_x / 2;
141  fp->steps_y = msize_y / 2;
142  fp->scalebits = (fp->steps_x + fp->steps_y) * 2;
143  fp->halfscale = 1 << (fp->scalebits - 1);
144 }
145 
146 static av_cold int init(AVFilterContext *ctx)
147 {
148  UnsharpContext *unsharp = ctx->priv;
149 
150 
151  set_filter_param(&unsharp->luma, unsharp->lmsize_x, unsharp->lmsize_y, unsharp->lamount);
152  set_filter_param(&unsharp->chroma, unsharp->cmsize_x, unsharp->cmsize_y, unsharp->camount);
153 
154  return 0;
155 }
156 
158 {
159  static const enum AVPixelFormat pix_fmts[] = {
163  };
164 
166 
167  return 0;
168 }
169 
170 static int init_filter_param(AVFilterContext *ctx, FilterParam *fp, const char *effect_type, int width)
171 {
172  int z;
173  const char *effect = fp->amount == 0 ? "none" : fp->amount < 0 ? "blur" : "sharpen";
174 
175  if (!(fp->msize_x & fp->msize_y & 1)) {
176  av_log(ctx, AV_LOG_ERROR,
177  "Invalid even size for %s matrix size %dx%d\n",
178  effect_type, fp->msize_x, fp->msize_y);
179  return AVERROR(EINVAL);
180  }
181 
182  av_log(ctx, AV_LOG_VERBOSE, "effect:%s type:%s msize_x:%d msize_y:%d amount:%0.2f\n",
183  effect, effect_type, fp->msize_x, fp->msize_y, fp->amount / 65535.0);
184 
185  for (z = 0; z < 2 * fp->steps_y; z++)
186  if (!(fp->sc[z] = av_malloc(sizeof(*(fp->sc[z])) * (width + 2 * fp->steps_x))))
187  return AVERROR(ENOMEM);
188 
189  return 0;
190 }
191 
193 {
194  UnsharpContext *unsharp = link->dst->priv;
195  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format);
196  int ret;
197 
198  unsharp->hsub = desc->log2_chroma_w;
199  unsharp->vsub = desc->log2_chroma_h;
200 
201  ret = init_filter_param(link->dst, &unsharp->luma, "luma", link->w);
202  if (ret < 0)
203  return ret;
204  ret = init_filter_param(link->dst, &unsharp->chroma, "chroma", SHIFTUP(link->w, unsharp->hsub));
205  if (ret < 0)
206  return ret;
207 
208  return 0;
209 }
210 
212 {
213  int z;
214 
215  for (z = 0; z < 2 * fp->steps_y; z++)
216  av_free(fp->sc[z]);
217 }
218 
219 static av_cold void uninit(AVFilterContext *ctx)
220 {
221  UnsharpContext *unsharp = ctx->priv;
222 
223  free_filter_param(&unsharp->luma);
224  free_filter_param(&unsharp->chroma);
225 }
226 
228 {
229  UnsharpContext *unsharp = link->dst->priv;
230  AVFilterLink *outlink = link->dst->outputs[0];
231  AVFrame *out;
232  int cw = SHIFTUP(link->w, unsharp->hsub);
233  int ch = SHIFTUP(link->h, unsharp->vsub);
234 
235  out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
236  if (!out) {
237  av_frame_free(&in);
238  return AVERROR(ENOMEM);
239  }
240  av_frame_copy_props(out, in);
241 
242  apply_unsharp(out->data[0], out->linesize[0], in->data[0], in->linesize[0], link->w, link->h, &unsharp->luma);
243  apply_unsharp(out->data[1], out->linesize[1], in->data[1], in->linesize[1], cw, ch, &unsharp->chroma);
244  apply_unsharp(out->data[2], out->linesize[2], in->data[2], in->linesize[2], cw, ch, &unsharp->chroma);
245 
246  av_frame_free(&in);
247  return ff_filter_frame(outlink, out);
248 }
249 
250 #define OFFSET(x) offsetof(UnsharpContext, x)
251 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
252 #define MIN_SIZE 3
253 #define MAX_SIZE 63
254 static const AVOption unsharp_options[] = {
255  { "luma_msize_x", "luma matrix horizontal size", OFFSET(lmsize_x), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
256  { "lx", "luma matrix horizontal size", OFFSET(lmsize_x), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
257  { "luma_msize_y", "luma matrix vertical size", OFFSET(lmsize_y), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
258  { "ly", "luma matrix vertical size", OFFSET(lmsize_y), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
259  { "luma_amount", "luma effect strength", OFFSET(lamount), AV_OPT_TYPE_FLOAT, { .dbl = 1 }, -2, 5, FLAGS },
260  { "la", "luma effect strength", OFFSET(lamount), AV_OPT_TYPE_FLOAT, { .dbl = 1 }, -2, 5, FLAGS },
261  { "chroma_msize_x", "chroma matrix horizontal size", OFFSET(cmsize_x), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
262  { "cx", "chroma matrix horizontal size", OFFSET(cmsize_x), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
263  { "chroma_msize_y", "chroma matrix vertical size", OFFSET(cmsize_y), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
264  { "cy", "chroma matrix vertical size", OFFSET(cmsize_y), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS },
265  { "chroma_amount", "chroma effect strength", OFFSET(camount), AV_OPT_TYPE_FLOAT, { .dbl = 0 }, -2, 5, FLAGS },
266  { "ca", "chroma effect strength", OFFSET(camount), AV_OPT_TYPE_FLOAT, { .dbl = 0 }, -2, 5, FLAGS },
267  { NULL },
268 };
269 
270 AVFILTER_DEFINE_CLASS(unsharp);
271 
273  {
274  .name = "default",
275  .type = AVMEDIA_TYPE_VIDEO,
276  .filter_frame = filter_frame,
277  .config_props = config_props,
278  },
279  { NULL }
280 };
281 
283  {
284  .name = "default",
285  .type = AVMEDIA_TYPE_VIDEO,
286  },
287  { NULL }
288 };
289 
291  .name = "unsharp",
292  .description = NULL_IF_CONFIG_SMALL("Sharpen or blur the input video."),
293 
294  .priv_size = sizeof(UnsharpContext),
295  .priv_class = &unsharp_class,
296 
297  .init = init,
298  .uninit = uninit,
300 
301  .inputs = avfilter_vf_unsharp_inputs,
302 
303  .outputs = avfilter_vf_unsharp_outputs,
304 };
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition: frame.c:424
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:1778
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
static const AVFilterPad avfilter_vf_unsharp_inputs[]
Definition: vf_unsharp.c:272
AVOption.
Definition: opt.h:251
AVFilter avfilter_vf_unsharp
Definition: vf_unsharp.c:290
#define FLAGS
Definition: vf_unsharp.c:251
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:73
static const AVFilterPad outputs[]
Definition: af_ashowinfo.c:117
external API header
memory handling functions
static av_cold int init(AVFilterContext *ctx)
Definition: vf_unsharp.c:146
About Git write you should know how to use GIT properly Luckily Git comes with excellent documentation git help man git shows you the available git< command > help man git< command > shows information about the subcommand< command > The most comprehensive manual is the website Git Reference visit they are quite exhaustive You do not need a special username or password All you need is to provide a ssh public key to the Git server admin What follows now is a basic introduction to Git and some FFmpeg specific guidelines Read it at least if you are granted commit privileges to the FFmpeg project you are expected to be familiar with these rules I if not You can get git from etc no matter how small Every one of them has been saved from looking like a fool by this many times It s very easy for stray debug output or cosmetic modifications to slip in
Definition: git-howto.txt:5
uint32_t * sc[MAX_MATRIX_SIZE-1]
finite state machine storage
Definition: vf_unsharp.c:64
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
Definition: video.c:143
#define MAX_SIZE
Definition: vf_unsharp.c:253
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition: pixdesc.h:66
AVFilterFormats * ff_make_format_list(const int *fmts)
Create a list of supported formats.
Definition: formats.c:308
static void apply_unsharp(uint8_t *dst, int dst_stride, const uint8_t *src, int src_stride, int width, int height, FilterParam *fp)
Definition: vf_unsharp.c:76
const char * name
Pad name.
static void set_filter_param(FilterParam *fp, int msize_x, int msize_y, float amount)
Definition: vf_unsharp.c:134
uint8_t
it can be given away to ff_start_frame *A reference passed to ff_filter_frame(or the deprecated ff_start_frame) is given away and must no longer be used.*A reference created with avfilter_ref_buffer belongs to the code that created it.*A reference obtained with ff_get_video_buffer or ff_get_audio_buffer belongs to the code that requested it.*A reference given as return value by the get_video_buffer or get_audio_buffer method is given away and must no longer be used.Link reference fields---------------------The AVFilterLink structure has a few AVFilterBufferRef fields.The cur_buf and out_buf were used with the deprecated start_frame/draw_slice/end_frame API and should no longer be used.src_buf
#define av_cold
Definition: attributes.h:78
AVOptions.
struct FilterParam FilterParam
#define OFFSET(x)
Definition: vf_unsharp.c:250
static const AVFilterPad avfilter_vf_unsharp_outputs[]
Definition: vf_unsharp.c:282
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of PIX_FMT_YUV440P and setting color_range ...
Definition: pixfmt.h:104
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV422P and setting color_...
Definition: pixfmt.h:81
void ff_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats)
A helper for query_formats() which sets all links to the same list of formats.
Definition: formats.c:545
FilterParam luma
luma parameters (width, height, amount)
Definition: vf_unsharp.c:71
A filter pad used for either input or output.
Discrete Time axis x
#define SHIFTUP(x, shift)
Definition: vf_unsharp.c:54
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition: pixdesc.h:75
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define MIN_SIZE
Definition: vf_unsharp.c:252
void * priv
private data for use by the filter
Definition: avfilter.h:545
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a link
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:72
#define AV_LOG_VERBOSE
Definition: log.h:157
int msize_x
matrix width
Definition: vf_unsharp.c:57
int scalebits
bits to shift pixel
Definition: vf_unsharp.c:62
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV420P and setting color_...
Definition: pixfmt.h:80
ret
Definition: avfilter.c:821
static av_cold void uninit(AVFilterContext *ctx)
Definition: vf_unsharp.c:219
int32_t
static void free_filter_param(FilterParam *fp)
Definition: vf_unsharp.c:211
static int filter_frame(AVFilterLink *link, AVFrame *in)
Definition: vf_unsharp.c:227
static const AVOption unsharp_options[]
Definition: vf_unsharp.c:254
AVFILTER_DEFINE_CLASS(unsharp)
static int config_props(AVFilterLink *link)
Definition: vf_unsharp.c:192
int steps_x
horizontal step count
Definition: vf_unsharp.c:60
int amount
effect amount
Definition: vf_unsharp.c:59
NULL
Definition: eval.c:55
static int width
Definition: tests/utils.c:158
AVS_Value src
Definition: avisynth_c.h:523
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:55
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
#define fp
Definition: regdef.h:44
BYTE int const BYTE int int int height
Definition: avisynth_c.h:713
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:74
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
Describe the class of an AVClass context structure.
Definition: log.h:50
Filter definition.
Definition: avfilter.h:436
int32_t halfscale
amount to add to pixel
Definition: vf_unsharp.c:63
static int query_formats(AVFilterContext *ctx)
Definition: vf_unsharp.c:157
const char * name
filter name
Definition: avfilter.h:437
#define MAX_MATRIX_SIZE
Definition: vf_unsharp.c:51
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
AVFilterLink ** outputs
array of pointers to output links
Definition: avfilter.h:539
int steps_y
vertical step count
Definition: vf_unsharp.c:61
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
int msize_y
matrix height
Definition: vf_unsharp.c:58
static int init_filter_param(AVFilterContext *ctx, FilterParam *fp, const char *effect_type, int width)
Definition: vf_unsharp.c:170
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:68
common internal and external API header
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:108
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV444P and setting color_...
Definition: pixfmt.h:82
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition: pixfmt.h:75
function y
Definition: D.m:1
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
An instance of a filter.
Definition: avfilter.h:524
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition: pixfmt.h:103
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
internal API functions
AVPixelFormat
Pixel format.
Definition: pixfmt.h:66
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several inputs
FilterParam chroma
chroma parameters (width, height, amount)
Definition: vf_unsharp.c:72