54 #define GET_RESULT(A, B, C, D) ((A != C || A != D) - (B != C || B != D))
56 #define INTERPOLATE(A, B) (((A & hi_pixel_mask) >> 1) + ((B & hi_pixel_mask) >> 1) + (A & B & lo_pixel_mask))
58 #define Q_INTERPOLATE(A, B, C, D) ((A & q_hi_pixel_mask) >> 2) + ((B & q_hi_pixel_mask) >> 2) + ((C & q_hi_pixel_mask) >> 2) + ((D & q_hi_pixel_mask) >> 2) \
59 + ((((A & q_lo_pixel_mask) + (B & q_lo_pixel_mask) + (C & q_lo_pixel_mask) + (D & q_lo_pixel_mask)) >> 2) & q_lo_pixel_mask)
69 const int src_linesize =
in->linesize[0];
70 const int dst_linesize =
out->linesize[0];
76 const int bpp =
s->bpp;
77 const uint32_t hi_pixel_mask =
s->hi_pixel_mask;
78 const uint32_t lo_pixel_mask =
s->lo_pixel_mask;
79 const uint32_t q_hi_pixel_mask =
s->q_hi_pixel_mask;
80 const uint32_t q_lo_pixel_mask =
s->q_lo_pixel_mask;
85 src_line[0] =
src + src_linesize*
FFMAX(slice_start - 1, 0);
86 src_line[1] =
src + src_linesize*slice_start;
90 #define READ_COLOR4(dst, src_line, off) dst = *((const uint32_t *)src_line + off)
91 #define READ_COLOR3(dst, src_line, off) dst = AV_RL24 (src_line + 3*off)
92 #define READ_COLOR2(dst, src_line, off) dst = s->is_be ? AV_RB16(src_line + 2 * off) : AV_RL16(src_line + 2 * off)
94 for (y = slice_start; y <
slice_end; y++) {
97 dst_line[0] = dst + dst_linesize*2*y;
98 dst_line[1] = dst + dst_linesize*(2*y+1);
120 for (x = 0; x <
width; x++) {
121 uint32_t product1a, product1b, product2a, product2b;
129 product2b =
color[2][1];
130 product1b = product2b;
132 product2b =
color[1][1];
133 product1b = product2b;
143 product1b =
color[1][2];
145 product1b =
color[1][1];
149 product2b = product1b;
171 product2a =
color[2][1];
178 product1a =
color[1][1];
183 AV_WN32A(dst_line[0] + x * 8, product1a);
184 AV_WN32A(dst_line[0] + x * 8 + 4, product1b);
185 AV_WN32A(dst_line[1] + x * 8, product2a);
186 AV_WN32A(dst_line[1] + x * 8 + 4, product2b);
189 AV_WL24(dst_line[0] + x * 6, product1a);
190 AV_WL24(dst_line[0] + x * 6 + 3, product1b);
191 AV_WL24(dst_line[1] + x * 6, product2a);
192 AV_WL24(dst_line[1] + x * 6 + 3, product2b);
196 AV_WB32(dst_line[0] + x * 4, product1a | (product1b << 16));
197 AV_WB32(dst_line[1] + x * 4, product2a | (product2b << 16));
199 AV_WL32(dst_line[0] + x * 4, product1a | (product1b << 16));
200 AV_WL32(dst_line[1] + x * 4, product2a | (product2b << 16));
236 src_line[0] = src_line[1];
237 src_line[1] = src_line[2];
238 src_line[2] = src_line[3];
241 src_line[3] = src_line[2];
243 src_line[3] += src_linesize;
269 s->hi_pixel_mask = 0xFEFEFEFE;
270 s->lo_pixel_mask = 0x01010101;
271 s->q_hi_pixel_mask = 0xFCFCFCFC;
272 s->q_lo_pixel_mask = 0x03030303;
286 s->hi_pixel_mask = 0xF7DEF7DE;
287 s->lo_pixel_mask = 0x08210821;
288 s->q_hi_pixel_mask = 0xE79CE79C;
289 s->q_lo_pixel_mask = 0x18631863;
298 s->hi_pixel_mask = 0x7BDE7BDE;
299 s->lo_pixel_mask = 0x04210421;
300 s->q_hi_pixel_mask = 0x739C739C;
301 s->q_lo_pixel_mask = 0x0C630C63;
313 outlink->
w = inlink->
w*2;
314 outlink->
h = inlink->
h*2;
318 inlink->
w, inlink->
h, outlink->
w, outlink->
h);
334 out->width = outlink->
w;
335 out->height = outlink->
h;
364 .
name =
"super2xsai",
365 .description =
NULL_IF_CONFIG_SMALL(
"Scale the input by 2x using the Super2xSaI pixel art algorithm."),
static const AVFilterPad inputs[]
static const AVFilterPad outputs[]
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=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);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_AARCH64) ff_audio_convert_init_aarch64(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_log(ac->avr, AV_LOG_TRACE, "%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-> in
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Main libavfilter public API header.
#define flags(name, subs,...)
static int ff_slice_pos(int total, int jobnr, int nb_jobs)
Compute the boundary index for a slice when work of size total is split into nb_jobs slices.
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
#define AV_LOG_VERBOSE
Detailed information.
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static enum AVPixelFormat pix_fmts[]
static int slice_end(AVCodecContext *avctx, AVFrame *pict)
Handle slice ends.
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
@ AV_PIX_FMT_BGR565BE
packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), big-endian
@ AV_PIX_FMT_ARGB
packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
@ AV_PIX_FMT_RGB555BE
packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian , X=unused/undefined
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
@ AV_PIX_FMT_RGB565LE
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), little-endian
@ AV_PIX_FMT_RGB555LE
packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined
@ AV_PIX_FMT_BGR555BE
packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian , X=unused/undefined
@ AV_PIX_FMT_RGB565BE
packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), big-endian
@ AV_PIX_FMT_BGR555LE
packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
@ AV_PIX_FMT_BGR565LE
packed BGR 5:6:5, 16bpp, (msb) 5B 6G 5R(lsb), little-endian
AVFilterLink ** inputs
array of pointers to input links
void * priv
private data for use by the filter
A link between two filters.
int w
agreed upon image width
int h
agreed upon image height
AVFilterContext * src
source filter
AVFilterContext * dst
dest filter
int format
agreed upon media format
A filter pad used for either input or output.
const char * name
Pad name.
const char * name
Filter name.
AVFormatInternal * internal
An opaque field for libavformat internal usage.
This structure describes decoded (raw) audio or video data.
int bpp
bytes per pixel, pixel stride for each (packed) pixel
Used for passing data between threads.
#define READ_COLOR2(dst, src_line, off)
static int query_formats(AVFilterContext *ctx)
static int config_input(AVFilterLink *inlink)
AVFilter ff_vf_super2xsai
static const AVFilterPad super2xsai_outputs[]
#define Q_INTERPOLATE(A, B, C, D)
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
#define READ_COLOR3(dst, src_line, off)
static int super2xsai(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
#define GET_RESULT(A, B, C, D)
static int config_output(AVFilterLink *outlink)
#define READ_COLOR4(dst, src_line, off)
#define INTERPOLATE(A, B)
static const AVFilterPad super2xsai_inputs[]
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.