79#define OFFSET(x) offsetof(FSPPContext, x)
80#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
96#define REORDER(a,b,c,d,e,f,g,h) c, g, a, e, f, d, b, h
97 REORDER( 71, 296, 295, 237, 71, 40, 38, 19),
98 REORDER(245, 193, 185, 121, 102, 73, 53, 27),
99 REORDER(158, 129, 141, 107, 97, 73, 50, 26),
100 REORDER(102, 116, 109, 98, 82, 66, 45, 23),
101 REORDER( 71, 94, 95, 81, 70, 56, 38, 20),
102 REORDER( 56, 77, 74, 66, 56, 44, 30, 15),
103 REORDER( 38, 53, 50, 45, 38, 30, 21, 11),
104 REORDER( 20, 27, 26, 23, 20, 15, 11, 5)
108 int dst_stride,
int src_stride,
110 uint8_t *qp_store,
int qp_stride,
int is_luma)
112 int x, x0, y, es, qy, t;
114 const int stride = is_luma ? p->temp_stride : (
width + 16);
115 const int step = 6 - p->log2_count;
116 const int qpsh = 4 - p->hsub * !is_luma;
117 const int qpsv = 4 - p->vsub * !is_luma;
120 int16_t *
block = block_align;
121 int16_t *block3 = block_align + 8 * 8 *
BLOCKSZ;
123 memset(block3, 0, 4 * 8 *
BLOCKSZ);
127 for (y = 0; y <
height; y++) {
130 for (x = 0; x < 8; x++) {
136 for (y = 0; y < 8; y++) {
142 for (y = 8; y < 24; y++)
143 memset(p->temp + 8 + y *
stride, 0,
width *
sizeof(int16_t));
145 for (y = step; y <
height + 8; y += step) {
146 const int y1 = y - 8 + step;
152 qy = (qy >> qpsv) * qp_stride;
159 p->dsp.column_fidct(p->threshold_mtx,
block + 0 * 8, block3 + 0 * 8, 8 * (
BLOCKSZ - 1));
161 for (x = 0; x < 8 * (
BLOCKSZ - 1); x += 8) {
166 t = qp_store[qy + (t >> qpsh)];
169 if (t != p->prev_q) {
171 p->dsp.mul_thrmat(p->threshold_mtx_noq, p->threshold_mtx, t);
173 p->dsp.column_fidct(p->threshold_mtx,
block + x * 8, block3 + x * 8, 8);
175 p->dsp.row_idct(block3 + 0 * 8, p->temp + (y & 15) *
stride + x0 + 2 - (y & 1),
stride, 2 * (
BLOCKSZ - 1));
177 memmove(block3, block3 + (
BLOCKSZ - 1) * 64, 6 * 8 *
sizeof(int16_t));
182 p->dsp.row_fdct(
block + 8 * 8, p->src + y *
stride + 8 + x0 + 2 - (y & 1),
stride, (es - 4) >> 2);
184 p->dsp.column_fidct(p->threshold_mtx,
block, block3, es&(~1));
186 p->dsp.row_idct(block3 + 0 * 8, p->temp + (y & 15) *
stride + x0 + 2 - (y & 1),
stride, es >> 2);
188 if (!(y1 & 7) && y1) {
190 p->dsp.store_slice(
dst + (y1 - 8) * dst_stride, p->temp + 8 + 8 *
stride,
193 p->dsp.store_slice2(
dst + (y1 - 8) * dst_stride, p->temp + 8 + 0 *
stride,
200 p->dsp.store_slice(
dst + ((y - 8) & ~7) * dst_stride, p->temp + 8 + 8 *
stride,
201 dst_stride,
stride,
width, y&7, 5 - p->log2_count);
203 p->dsp.store_slice2(
dst + ((y - 8) & ~7) * dst_stride, p->temp + 8 + 0 *
stride,
204 dst_stride,
stride,
width, y&7, 5 - p->log2_count);
222 const int h =
FFALIGN(inlink->
h + 16, 16);
248 int8_t *qp_table =
NULL;
284 if (qp_table || fspp->
qp) {
291 const int aligned_w =
FFALIGN(inlink->
w, 8);
292 const int aligned_h =
FFALIGN(inlink->
h, 8);
306 inlink->
w, inlink->
h, qp_table, qp_stride, 1);
308 cw, ch, qp_table, qp_stride, 0);
310 cw, ch, qp_table, qp_stride, 0);
319 inlink->
w, inlink->
h);
349 .p.priv_class = &fspp_class,
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static int config_input(AVFilterLink *inlink)
const FFFilter ff_vf_fspp
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Main libavfilter public API header.
#define i(width, name, range_min, range_max)
#define AV_CEIL_RSHIFT(a, b)
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
#define AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL
Same as AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, except that the filter will have its filter_frame() c...
int av_frame_is_writable(AVFrame *frame)
Check if the frame data is writable.
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.
void av_image_copy_plane(uint8_t *dst, int dst_linesize, const uint8_t *src, int src_linesize, int bytewidth, int height)
Copy image plane from src to dst.
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
static av_cold void uninit(AVBitStreamFilterContext *ctx)
#define FILTER_INPUTS(array)
#define FILTER_OUTPUTS(array)
#define FILTER_PIXFMTS_ARRAY(array)
#define AVFILTER_DEFINE_CLASS(fname)
static const AVOption fspp_options[]
#define REORDER(a, b, c, d, e, f, g, h)
static int config_input(AVFilterLink *inlink)
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
static av_cold void uninit(AVFilterContext *ctx)
static const short custom_threshold[64]
static const AVFilterPad fspp_inputs[]
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static enum AVPixelFormat pix_fmts[]
Memory handling functions.
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
@ AV_PIX_FMT_YUVJ440P
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
int ff_qp_table_extract(AVFrame *frame, int8_t **table, int *table_w, int *table_h, enum AVVideoEncParamsType *qscale_type)
Extract a libpostproc-compatible QP table - an 8-bit QP value per 16x16 macroblock,...
static int ff_norm_qscale(int qscale, enum AVVideoEncParamsType type)
Normalize the qscale factor FIXME Add support for other values of enum AVVideoEncParamsType besides A...
Describe the class of an AVClass context structure.
A link between two filters.
int w
agreed upon image width
int h
agreed upon image height
AVFilterContext * dst
dest filter
int format
agreed upon media format
A filter pad used for either input or output.
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
enum AVPictureType pict_type
Picture type of the frame.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
int16_t threshold_mtx_noq[8 *8]
enum AVVideoEncParamsType qscale_type
int16_t threshold_mtx[8 *8]
void(* mul_thrmat)(const int16_t *restrict thr_adr_noq, int16_t *restrict thr_adr, int q)
#define av_malloc_array(a, b)
void(* filter)(uint8_t *src, ptrdiff_t stride, int qscale)
static AVFormatContext * ctx
static FF_VISIBILITY_POP_HIDDEN void ff_fsppdsp_init(FSPPDSPContext *fspp)
const AVFilterPad ff_video_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_VIDEO.
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
static int bias(int x, int c)