blob: 5a6bde25940cf56fba8e5362972e86fae105d35c [file] [log] [blame]
/*
* Copyright (c) 2016, Alliance for Open Media. All rights reserved
*
* This source code is subject to the terms of the BSD 2 Clause License and
* the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
* was not distributed with this source code in the LICENSE file, you can
* obtain it at www.aomedia.org/license/software. If the Alliance for Open
* Media Patent License 1.0 was not distributed with this source code in the
* PATENTS file, you can obtain it at www.aomedia.org/license/patent.
*/
#ifndef AOM_AV1_ENCODER_TEMPORAL_FILTER_H_
#define AOM_AV1_ENCODER_TEMPORAL_FILTER_H_
#ifdef __cplusplus
extern "C" {
#endif
// TODO(any): These two variables are only used in avx2, sse2, sse4
// implementations, where the block size is still hard coded. This should be
// fixed to align with the c implementation.
#define BH 32
#define BW 32
// Block size used in temporal filtering.
#define TF_BLOCK_SIZE BLOCK_32X32
// Window size for YUV temporal filtering.
// This is particually used for function `av1_apply_temporal_filter_yuv()`.
#define TF_YUV_FILTER_WINDOW_LENGTH 3
// A scale factor used in YUV temporal filtering for weight adjustment.
#define TF_YUV_FILTER_WEIGHT_SCALE 3
#define TF_ENABLE_PLANEWISE_STRATEGY 1
// Window size for plane-wise temporal filtering.
// This is particually used for function `av1_apply_temporal_filter_planewise()`
#define TF_PLANEWISE_FILTER_WINDOW_LENGTH 5
// A scale factor used in plane-wise temporal filtering to raise the filter
// weight from `double` with range [0, 1] to `int` with range [0, 1000].
#define TF_PLANEWISE_FILTER_WEIGHT_SCALE 1000
#define NOISE_ESTIMATION_EDGE_THRESHOLD 50
// Estimates noise level from a given frame using a single plane (Y, U, or V).
// This is an adaptation of the mehtod in the following paper:
// Shen-Chuan Tai, Shih-Ming Yang, "A fast method for image noise
// estimation using Laplacian operator and adaptive edge detection",
// Proc. 3rd International Symposium on Communications, Control and
// Signal Processing, 2008, St Julians, Malta.
// Inputs:
// frame: Pointer to the frame to estimate noise level from.
// plane: Index of the plane used for noise estimation. Commonly, 0 for
// Y-plane, 1 for U-plane, and 2 for V-plane.
// bit_depth: Actual bit-depth instead of the encoding bit-depth of the frame.
// Returns:
// The estimated noise, or -1.0 if there are too few smooth pixels.
double av1_estimate_noise_from_single_plane(const YV12_BUFFER_CONFIG *frame,
const int plane,
const int bit_depth);
#define TF_QINDEX 128 // Q-index used in temporal filtering.
#define TF_NUM_FILTERING_FRAMES_FOR_KEY_FRAME 7
// Performs temporal filtering if needed.
// NOTE: In this function, the lookahead index is different from the 0-based
// real index. For example, if we want to filter the first frame in the
// pre-fetched buffer `cpi->lookahead`, the lookahead index will be -1 instead
// of 0. More concretely, 0 indicates the first LOOKAHEAD frame, which is the
// second frame in the pre-fetched buffer. Another example: if we want to filter
// the 17-th frame, which is an ARF, the lookahead index is 15 instead of 16.
// Futhermore, negative number is used for key frame in one-pass mode, where key
// frame is filtered with the frames before it instead of after it. For example,
// -15 means to filter the 17-th frame, which is a key frame in one-pass mode.
// Inputs:
// cpi: Pointer to the composed information of input video.
// filter_frame_lookahead_idx: The index of the to-filter frame in the
// lookahead buffer `cpi->lookahead`.
// show_existing_arf: Whether to show existing ARF. This field will be updated
// in this function.
// Returns:
// Whether temporal filtering is successfully done.
int av1_temporal_filter(AV1_COMP *cpi, const int filter_frame_lookahead_idx,
int *show_existing_arf);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // AOM_AV1_ENCODER_TEMPORAL_FILTER_H_