[FFmpeg-devel] [PATCH 05/12] vf_fspp: drop the option to use frame-attached QP tables
Anton Khirnov
anton at khirnov.net
Mon Feb 24 14:37:32 EET 2020
This API has been deprecated for five years.
---
doc/filters.texi | 6 --
libavfilter/vf_fspp.c | 129 ++++++++++--------------------------------
libavfilter/vf_fspp.h | 3 -
3 files changed, 30 insertions(+), 108 deletions(-)
diff --git a/doc/filters.texi b/doc/filters.texi
index 43e52f930a..59571a7022 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -11382,18 +11382,12 @@ an integer in the range 4-5. Default value is @code{4}.
@item qp
Force a constant quantization parameter. It accepts an integer in range 0-63.
-If not set, the filter will use the QP from the video stream (if available).
@item strength
Set filter strength. It accepts an integer in range -15 to 32. Lower values mean
more details but also more artifacts, while higher values make the image smoother
but also blurrier. Default value is @code{0} − PSNR optimal.
- at item use_bframe_qp
-Enable the use of the QP from the B-Frames if set to @code{1}. Using this
-option may cause flicker since the B-Frames have often larger QP. Default is
- at code{0} (not enabled).
-
@end table
@section gblur
diff --git a/libavfilter/vf_fspp.c b/libavfilter/vf_fspp.c
index c6989046c4..b53ae337c9 100644
--- a/libavfilter/vf_fspp.c
+++ b/libavfilter/vf_fspp.c
@@ -48,7 +48,6 @@ static const AVOption fspp_options[] = {
{ "quality", "set quality", OFFSET(log2_count), AV_OPT_TYPE_INT, {.i64 = 4}, 4, MAX_LEVEL, FLAGS },
{ "qp", "force a constant quantizer parameter", OFFSET(qp), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 64, FLAGS },
{ "strength", "set filter strength", OFFSET(strength), AV_OPT_TYPE_INT, {.i64 = 0}, -15, 32, FLAGS },
- { "use_bframe_qp", "use B-frames' QP", OFFSET(use_bframe_qp), AV_OPT_TYPE_BOOL,{.i64 = 0}, 0, 1, FLAGS },
{ NULL }
};
@@ -148,15 +147,12 @@ static void mul_thrmat_c(int16_t *thr_adr_noq, int16_t *thr_adr, int q)
static void filter(FSPPContext *p, uint8_t *dst, uint8_t *src,
int dst_stride, int src_stride,
- int width, int height,
- uint8_t *qp_store, int qp_stride, int is_luma)
+ int width, int height, int is_luma)
{
- int x, x0, y, es, qy, t;
+ int x, x0, y, es;
const int stride = is_luma ? p->temp_stride : (width + 16);
const int step = 6 - p->log2_count;
- const int qpsh = 4 - p->hsub * !is_luma;
- const int qpsv = 4 - p->vsub * !is_luma;
DECLARE_ALIGNED(32, int32_t, block_align)[4 * 8 * BLOCKSZ + 4 * 8 * BLOCKSZ];
int16_t *block = (int16_t *)block_align;
@@ -186,31 +182,14 @@ static void filter(FSPPContext *p, uint8_t *dst, uint8_t *src,
for (y = step; y < height + 8; y += step) { //step= 1,2
const int y1 = y - 8 + step; //l5-7 l4-6;
- qy = y - 4;
- if (qy > height - 1) qy = height - 1;
- if (qy < 0) qy = 0;
-
- qy = (qy >> qpsv) * qp_stride;
p->row_fdct(block, p->src + y * stride + 2 - (y&1), stride, 2);
for (x0 = 0; x0 < width + 8 - 8 * (BLOCKSZ - 1); x0 += 8 * (BLOCKSZ - 1)) {
p->row_fdct(block + 8 * 8, p->src + y * stride + 8 + x0 + 2 - (y&1), stride, 2 * (BLOCKSZ - 1));
- if (p->qp)
- p->column_fidct((int16_t *)(&p->threshold_mtx[0]), block + 0 * 8, block3 + 0 * 8, 8 * (BLOCKSZ - 1)); //yes, this is a HOTSPOT
- else
- for (x = 0; x < 8 * (BLOCKSZ - 1); x += 8) {
- t = x + x0 - 2; //correct t=x+x0-2-(y&1), but its the same
-
- if (t < 0) t = 0; //t always < width-2
-
- t = qp_store[qy + (t >> qpsh)];
- t = ff_norm_qscale(t, p->qscale_type);
+ p->column_fidct((int16_t *)(&p->threshold_mtx[0]), block + 0 * 8, block3 + 0 * 8, 8 * (BLOCKSZ - 1)); //yes, this is a HOTSPOT
- if (t != p->prev_q) p->prev_q = t, p->mul_thrmat((int16_t *)(&p->threshold_mtx_noq[0]), (int16_t *)(&p->threshold_mtx[0]), t);
- p->column_fidct((int16_t *)(&p->threshold_mtx[0]), block + x * 8, block3 + x * 8, 8); //yes, this is a HOTSPOT
- }
p->row_idct(block3 + 0 * 8, p->temp + (y & 15) * stride + x0 + 2 - (y & 1), stride, 2 * (BLOCKSZ - 1));
memmove(block, block + (BLOCKSZ - 1) * 64, 8 * 8 * sizeof(int16_t)); //cycling
memmove(block3, block3 + (BLOCKSZ - 1) * 64, 6 * 8 * sizeof(int16_t));
@@ -525,13 +504,6 @@ static int config_input(AVFilterLink *inlink)
if (!fspp->temp || !fspp->src)
return AVERROR(ENOMEM);
- if (!fspp->use_bframe_qp && !fspp->qp) {
- fspp->non_b_qp_alloc_size = AV_CEIL_RSHIFT(inlink->w, 4) * AV_CEIL_RSHIFT(inlink->h, 4);
- fspp->non_b_qp_table = av_calloc(fspp->non_b_qp_alloc_size, sizeof(*fspp->non_b_qp_table));
- if (!fspp->non_b_qp_table)
- return AVERROR(ENOMEM);
- }
-
fspp->store_slice = store_slice_c;
fspp->store_slice2 = store_slice2_c;
fspp->mul_thrmat = mul_thrmat_c;
@@ -552,8 +524,6 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
AVFilterLink *outlink = ctx->outputs[0];
AVFrame *out = in;
- int qp_stride = 0;
- uint8_t *qp_table = NULL;
int i, bias;
int custom_threshold_m[64];
@@ -574,75 +544,37 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
|(((uint64_t)custom_threshold_m[i * 8 + 7]) << 48);
}
- if (fspp->qp)
- fspp->prev_q = fspp->qp, fspp->mul_thrmat((int16_t *)(&fspp->threshold_mtx_noq[0]), (int16_t *)(&fspp->threshold_mtx[0]), fspp->qp);
-
- /* if we are not in a constant user quantizer mode and we don't want to use
- * the quantizers from the B-frames (B-frames often have a higher QP), we
- * need to save the qp table from the last non B-frame; this is what the
- * following code block does */
- if (!fspp->qp) {
- qp_table = av_frame_get_qp_table(in, &qp_stride, &fspp->qscale_type);
-
- if (qp_table && !fspp->use_bframe_qp && in->pict_type != AV_PICTURE_TYPE_B) {
- int w, h;
-
- /* if the qp stride is not set, it means the QP are only defined on
- * a line basis */
- if (!qp_stride) {
- w = AV_CEIL_RSHIFT(inlink->w, 4);
- h = 1;
- } else {
- w = qp_stride;
- h = AV_CEIL_RSHIFT(inlink->h, 4);
- }
- if (w * h > fspp->non_b_qp_alloc_size) {
- int ret = av_reallocp_array(&fspp->non_b_qp_table, w, h);
- if (ret < 0) {
- fspp->non_b_qp_alloc_size = 0;
- return ret;
- }
- fspp->non_b_qp_alloc_size = w * h;
- }
-
- av_assert0(w * h <= fspp->non_b_qp_alloc_size);
- memcpy(fspp->non_b_qp_table, qp_table, w * h);
- }
- }
+ fspp->prev_q = fspp->qp;
+ fspp->mul_thrmat((int16_t *)(&fspp->threshold_mtx_noq[0]), (int16_t *)(&fspp->threshold_mtx[0]), fspp->qp);
if (fspp->log2_count && !ctx->is_disabled) {
- if (!fspp->use_bframe_qp && fspp->non_b_qp_table)
- qp_table = fspp->non_b_qp_table;
-
- if (qp_table || fspp->qp) {
- const int cw = AV_CEIL_RSHIFT(inlink->w, fspp->hsub);
- const int ch = AV_CEIL_RSHIFT(inlink->h, fspp->vsub);
-
- /* get a new frame if in-place is not possible or if the dimensions
- * are not multiple of 8 */
- if (!av_frame_is_writable(in) || (inlink->w & 7) || (inlink->h & 7)) {
- const int aligned_w = FFALIGN(inlink->w, 8);
- const int aligned_h = FFALIGN(inlink->h, 8);
-
- out = ff_get_video_buffer(outlink, aligned_w, aligned_h);
- if (!out) {
- av_frame_free(&in);
- return AVERROR(ENOMEM);
- }
- av_frame_copy_props(out, in);
- out->width = in->width;
- out->height = in->height;
+ const int cw = AV_CEIL_RSHIFT(inlink->w, fspp->hsub);
+ const int ch = AV_CEIL_RSHIFT(inlink->h, fspp->vsub);
+
+ /* get a new frame if in-place is not possible or if the dimensions
+ * are not multiple of 8 */
+ if (!av_frame_is_writable(in) || (inlink->w & 7) || (inlink->h & 7)) {
+ const int aligned_w = FFALIGN(inlink->w, 8);
+ const int aligned_h = FFALIGN(inlink->h, 8);
+
+ out = ff_get_video_buffer(outlink, aligned_w, aligned_h);
+ if (!out) {
+ av_frame_free(&in);
+ return AVERROR(ENOMEM);
}
-
- filter(fspp, out->data[0], in->data[0], out->linesize[0], in->linesize[0],
- inlink->w, inlink->h, qp_table, qp_stride, 1);
- filter(fspp, out->data[1], in->data[1], out->linesize[1], in->linesize[1],
- cw, ch, qp_table, qp_stride, 0);
- filter(fspp, out->data[2], in->data[2], out->linesize[2], in->linesize[2],
- cw, ch, qp_table, qp_stride, 0);
- emms_c();
+ av_frame_copy_props(out, in);
+ out->width = in->width;
+ out->height = in->height;
}
- }
+
+ filter(fspp, out->data[0], in->data[0], out->linesize[0], in->linesize[0],
+ inlink->w, inlink->h, 1);
+ filter(fspp, out->data[1], in->data[1], out->linesize[1], in->linesize[1],
+ cw, ch, 0);
+ filter(fspp, out->data[2], in->data[2], out->linesize[2], in->linesize[2],
+ cw, ch, 0);
+ emms_c();
+}
if (in != out) {
if (in->data[3])
@@ -659,7 +591,6 @@ static av_cold void uninit(AVFilterContext *ctx)
FSPPContext *fspp = ctx->priv;
av_freep(&fspp->temp);
av_freep(&fspp->src);
- av_freep(&fspp->non_b_qp_table);
}
static const AVFilterPad fspp_inputs[] = {
diff --git a/libavfilter/vf_fspp.h b/libavfilter/vf_fspp.h
index 73d8c7c771..c2595d1a6b 100644
--- a/libavfilter/vf_fspp.h
+++ b/libavfilter/vf_fspp.h
@@ -65,9 +65,6 @@ typedef struct FSPPContext {
int prev_q;
uint8_t *src;
int16_t *temp;
- uint8_t *non_b_qp_table;
- int non_b_qp_alloc_size;
- int use_bframe_qp;
void (*store_slice)(uint8_t *dst, int16_t *src,
ptrdiff_t dst_stride, ptrdiff_t src_stride,
--
2.24.1
More information about the ffmpeg-devel
mailing list