blob: 22a657e035c9567cab36ed46a1d22fa714aa176e [file] [log] [blame]
/*
* Copyright (c) 2016 The WebM project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file in the root of the source tree. An additional
* intellectual property rights grant can be found in the file PATENTS.
* All contributing project authors may be found in the AUTHORS file in
* the root of the source tree.
*/
/*
* \file vp9_alt_ref_aq.h
*
* This file contains public interface for setting up adaptive segmentation
* for altref frames. Go to alt_ref_aq_private.h for implmentation details.
*/
#ifndef VPX_VP9_ENCODER_VP9_ALT_REF_AQ_H_
#define VPX_VP9_ENCODER_VP9_ALT_REF_AQ_H_
#include "vpx/vpx_integer.h"
// Where to disable segmentation
#define ALT_REF_AQ_LOW_BITRATE_BOUNDARY 150
// Last frame always has overall quality = 0,
// so it is questionable if I can process it
#define ALT_REF_AQ_APPLY_TO_LAST_FRAME 1
// If I should try to compare gain
// against segmentation overhead
#define ALT_REF_AQ_PROTECT_GAIN 0
// Threshold to disable segmentation
#define ALT_REF_AQ_PROTECT_GAIN_THRESH 0.5
#ifdef __cplusplus
extern "C" {
#endif
// Simple structure for storing images
struct MATX_8U {
int rows;
int cols;
int stride;
uint8_t *data;
};
struct VP9_COMP;
struct ALT_REF_AQ;
/*!\brief Constructor
*
* \return Instance of the class
*/
struct ALT_REF_AQ *vp9_alt_ref_aq_create(void);
/*!\brief Upload segmentation_map to self object
*
* \param self Instance of the class
* \param segmentation_map Segmentation map to upload
*/
void vp9_alt_ref_aq_upload_map(struct ALT_REF_AQ *const self,
const struct MATX_8U *segmentation_map);
/*!\brief Return pointer to the altref segmentation map
*
* \param self Instance of the class
* \param segmentation_overhead Segmentation overhead in bytes
* \param bandwidth Current frame bandwidth in bytes
*
* \return Boolean value to disable segmentation
*/
int vp9_alt_ref_aq_disable_if(const struct ALT_REF_AQ *self,
int segmentation_overhead, int bandwidth);
/*!\brief Set number of segments
*
* It is used for delta quantizer computations
* and thus it can be larger than
* maximum value of the segmentation map
*
* \param self Instance of the class
* \param nsegments Maximum number of segments
*/
void vp9_alt_ref_aq_set_nsegments(struct ALT_REF_AQ *const self, int nsegments);
/*!\brief Set up LOOKAHEAD_AQ segmentation mode
*
* Set up segmentation mode to LOOKAHEAD_AQ
* (expected future frames prediction
* quality refering to the current frame).
*
* \param self Instance of the class
* \param cpi Encoder context
*/
void vp9_alt_ref_aq_setup_mode(struct ALT_REF_AQ *const self,
struct VP9_COMP *const cpi);
/*!\brief Set up LOOKAHEAD_AQ segmentation map and delta quantizers
*
* \param self Instance of the class
* \param cpi Encoder context
*/
void vp9_alt_ref_aq_setup_map(struct ALT_REF_AQ *const self,
struct VP9_COMP *const cpi);
/*!\brief Restore main segmentation map mode and reset the class variables
*
* \param self Instance of the class
* \param cpi Encoder context
*/
void vp9_alt_ref_aq_unset_all(struct ALT_REF_AQ *const self,
struct VP9_COMP *const cpi);
/*!\brief Destructor
*
* \param self Instance of the class
*/
void vp9_alt_ref_aq_destroy(struct ALT_REF_AQ *const self);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // VPX_VP9_ENCODER_VP9_ALT_REF_AQ_H_