1 /* 2 * Copyright (c) 2016 The WebM project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file in the root of the source tree. An additional 6 * intellectual property rights grant can be found in the file PATENTS. 7 * All contributing project authors may be found in the AUTHORS file in 8 * the root of the source tree. 9 */ 10 11 /* 12 * \file vp9_alt_ref_aq.h 13 * 14 * This file contains public interface for setting up adaptive segmentation 15 * for altref frames. Go to alt_ref_aq_private.h for implmentation details. 16 */ 17 18 #ifndef VPX_VP9_ENCODER_VP9_ALT_REF_AQ_H_ 19 #define VPX_VP9_ENCODER_VP9_ALT_REF_AQ_H_ 20 21 #include "vpx/vpx_integer.h" 22 23 // Where to disable segmentation 24 #define ALT_REF_AQ_LOW_BITRATE_BOUNDARY 150 25 26 // Last frame always has overall quality = 0, 27 // so it is questionable if I can process it 28 #define ALT_REF_AQ_APPLY_TO_LAST_FRAME 1 29 30 // If I should try to compare gain 31 // against segmentation overhead 32 #define ALT_REF_AQ_PROTECT_GAIN 0 33 34 // Threshold to disable segmentation 35 #define ALT_REF_AQ_PROTECT_GAIN_THRESH 0.5 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif 40 41 // Simple structure for storing images 42 struct MATX_8U { 43 int rows; 44 int cols; 45 int stride; 46 47 uint8_t *data; 48 }; 49 50 struct VP9_COMP; 51 struct ALT_REF_AQ; 52 53 /*!\brief Constructor 54 * 55 * \return Instance of the class 56 */ 57 struct ALT_REF_AQ *vp9_alt_ref_aq_create(void); 58 59 /*!\brief Upload segmentation_map to self object 60 * 61 * \param self Instance of the class 62 * \param segmentation_map Segmentation map to upload 63 */ 64 void vp9_alt_ref_aq_upload_map(struct ALT_REF_AQ *const self, 65 const struct MATX_8U *segmentation_map); 66 67 /*!\brief Return pointer to the altref segmentation map 68 * 69 * \param self Instance of the class 70 * \param segmentation_overhead Segmentation overhead in bytes 71 * \param bandwidth Current frame bandwidth in bytes 72 * 73 * \return Boolean value to disable segmentation 74 */ 75 int vp9_alt_ref_aq_disable_if(const struct ALT_REF_AQ *self, 76 int segmentation_overhead, int bandwidth); 77 78 /*!\brief Set number of segments 79 * 80 * It is used for delta quantizer computations 81 * and thus it can be larger than 82 * maximum value of the segmentation map 83 * 84 * \param self Instance of the class 85 * \param nsegments Maximum number of segments 86 */ 87 void vp9_alt_ref_aq_set_nsegments(struct ALT_REF_AQ *const self, int nsegments); 88 89 /*!\brief Set up LOOKAHEAD_AQ segmentation mode 90 * 91 * Set up segmentation mode to LOOKAHEAD_AQ 92 * (expected future frames prediction 93 * quality refering to the current frame). 94 * 95 * \param self Instance of the class 96 * \param cpi Encoder context 97 */ 98 void vp9_alt_ref_aq_setup_mode(struct ALT_REF_AQ *const self, 99 struct VP9_COMP *const cpi); 100 101 /*!\brief Set up LOOKAHEAD_AQ segmentation map and delta quantizers 102 * 103 * \param self Instance of the class 104 * \param cpi Encoder context 105 */ 106 void vp9_alt_ref_aq_setup_map(struct ALT_REF_AQ *const self, 107 struct VP9_COMP *const cpi); 108 109 /*!\brief Restore main segmentation map mode and reset the class variables 110 * 111 * \param self Instance of the class 112 * \param cpi Encoder context 113 */ 114 void vp9_alt_ref_aq_unset_all(struct ALT_REF_AQ *const self, 115 struct VP9_COMP *const cpi); 116 117 /*!\brief Destructor 118 * 119 * \param self Instance of the class 120 */ 121 void vp9_alt_ref_aq_destroy(struct ALT_REF_AQ *const self); 122 123 #ifdef __cplusplus 124 } // extern "C" 125 #endif 126 127 #endif // VPX_VP9_ENCODER_VP9_ALT_REF_AQ_H_ 128