Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
michael@0 | 1 | /* |
michael@0 | 2 | * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
michael@0 | 3 | * |
michael@0 | 4 | * Use of this source code is governed by a BSD-style license |
michael@0 | 5 | * that can be found in the LICENSE file in the root of the source |
michael@0 | 6 | * tree. An additional intellectual property rights grant can be found |
michael@0 | 7 | * in the file PATENTS. All contributing project authors may |
michael@0 | 8 | * be found in the AUTHORS file in the root of the source tree. |
michael@0 | 9 | */ |
michael@0 | 10 | #ifndef VP8CX_H |
michael@0 | 11 | #define VP8CX_H |
michael@0 | 12 | |
michael@0 | 13 | /*!\defgroup vp8_encoder WebM VP8 Encoder |
michael@0 | 14 | * \ingroup vp8 |
michael@0 | 15 | * |
michael@0 | 16 | * @{ |
michael@0 | 17 | */ |
michael@0 | 18 | #include "vp8.h" |
michael@0 | 19 | |
michael@0 | 20 | /*!\file |
michael@0 | 21 | * \brief Provides definitions for using the VP8 encoder algorithm within the |
michael@0 | 22 | * vpx Codec Interface. |
michael@0 | 23 | */ |
michael@0 | 24 | |
michael@0 | 25 | #ifdef __cplusplus |
michael@0 | 26 | extern "C" { |
michael@0 | 27 | #endif |
michael@0 | 28 | |
michael@0 | 29 | /*!\name Algorithm interface for VP8 |
michael@0 | 30 | * |
michael@0 | 31 | * This interface provides the capability to encode raw VP8 streams, as would |
michael@0 | 32 | * be found in AVI files. |
michael@0 | 33 | * @{ |
michael@0 | 34 | */ |
michael@0 | 35 | extern vpx_codec_iface_t vpx_codec_vp8_cx_algo; |
michael@0 | 36 | extern vpx_codec_iface_t *vpx_codec_vp8_cx(void); |
michael@0 | 37 | |
michael@0 | 38 | /* TODO(jkoleszar): These move to VP9 in a later patch set. */ |
michael@0 | 39 | extern vpx_codec_iface_t vpx_codec_vp9_cx_algo; |
michael@0 | 40 | extern vpx_codec_iface_t *vpx_codec_vp9_cx(void); |
michael@0 | 41 | extern vpx_codec_iface_t vpx_codec_vp9x_cx_algo; |
michael@0 | 42 | extern vpx_codec_iface_t *vpx_codec_vp9x_cx(void); |
michael@0 | 43 | |
michael@0 | 44 | /*!@} - end algorithm interface member group*/ |
michael@0 | 45 | |
michael@0 | 46 | |
michael@0 | 47 | /* |
michael@0 | 48 | * Algorithm Flags |
michael@0 | 49 | */ |
michael@0 | 50 | |
michael@0 | 51 | /*!\brief Don't reference the last frame |
michael@0 | 52 | * |
michael@0 | 53 | * When this flag is set, the encoder will not use the last frame as a |
michael@0 | 54 | * predictor. When not set, the encoder will choose whether to use the |
michael@0 | 55 | * last frame or not automatically. |
michael@0 | 56 | */ |
michael@0 | 57 | #define VP8_EFLAG_NO_REF_LAST (1<<16) |
michael@0 | 58 | |
michael@0 | 59 | |
michael@0 | 60 | /*!\brief Don't reference the golden frame |
michael@0 | 61 | * |
michael@0 | 62 | * When this flag is set, the encoder will not use the golden frame as a |
michael@0 | 63 | * predictor. When not set, the encoder will choose whether to use the |
michael@0 | 64 | * golden frame or not automatically. |
michael@0 | 65 | */ |
michael@0 | 66 | #define VP8_EFLAG_NO_REF_GF (1<<17) |
michael@0 | 67 | |
michael@0 | 68 | |
michael@0 | 69 | /*!\brief Don't reference the alternate reference frame |
michael@0 | 70 | * |
michael@0 | 71 | * When this flag is set, the encoder will not use the alt ref frame as a |
michael@0 | 72 | * predictor. When not set, the encoder will choose whether to use the |
michael@0 | 73 | * alt ref frame or not automatically. |
michael@0 | 74 | */ |
michael@0 | 75 | #define VP8_EFLAG_NO_REF_ARF (1<<21) |
michael@0 | 76 | |
michael@0 | 77 | |
michael@0 | 78 | /*!\brief Don't update the last frame |
michael@0 | 79 | * |
michael@0 | 80 | * When this flag is set, the encoder will not update the last frame with |
michael@0 | 81 | * the contents of the current frame. |
michael@0 | 82 | */ |
michael@0 | 83 | #define VP8_EFLAG_NO_UPD_LAST (1<<18) |
michael@0 | 84 | |
michael@0 | 85 | |
michael@0 | 86 | /*!\brief Don't update the golden frame |
michael@0 | 87 | * |
michael@0 | 88 | * When this flag is set, the encoder will not update the golden frame with |
michael@0 | 89 | * the contents of the current frame. |
michael@0 | 90 | */ |
michael@0 | 91 | #define VP8_EFLAG_NO_UPD_GF (1<<22) |
michael@0 | 92 | |
michael@0 | 93 | |
michael@0 | 94 | /*!\brief Don't update the alternate reference frame |
michael@0 | 95 | * |
michael@0 | 96 | * When this flag is set, the encoder will not update the alt ref frame with |
michael@0 | 97 | * the contents of the current frame. |
michael@0 | 98 | */ |
michael@0 | 99 | #define VP8_EFLAG_NO_UPD_ARF (1<<23) |
michael@0 | 100 | |
michael@0 | 101 | |
michael@0 | 102 | /*!\brief Force golden frame update |
michael@0 | 103 | * |
michael@0 | 104 | * When this flag is set, the encoder copy the contents of the current frame |
michael@0 | 105 | * to the golden frame buffer. |
michael@0 | 106 | */ |
michael@0 | 107 | #define VP8_EFLAG_FORCE_GF (1<<19) |
michael@0 | 108 | |
michael@0 | 109 | |
michael@0 | 110 | /*!\brief Force alternate reference frame update |
michael@0 | 111 | * |
michael@0 | 112 | * When this flag is set, the encoder copy the contents of the current frame |
michael@0 | 113 | * to the alternate reference frame buffer. |
michael@0 | 114 | */ |
michael@0 | 115 | #define VP8_EFLAG_FORCE_ARF (1<<24) |
michael@0 | 116 | |
michael@0 | 117 | |
michael@0 | 118 | /*!\brief Disable entropy update |
michael@0 | 119 | * |
michael@0 | 120 | * When this flag is set, the encoder will not update its internal entropy |
michael@0 | 121 | * model based on the entropy of this frame. |
michael@0 | 122 | */ |
michael@0 | 123 | #define VP8_EFLAG_NO_UPD_ENTROPY (1<<20) |
michael@0 | 124 | |
michael@0 | 125 | |
michael@0 | 126 | /*!\brief VP8 encoder control functions |
michael@0 | 127 | * |
michael@0 | 128 | * This set of macros define the control functions available for the VP8 |
michael@0 | 129 | * encoder interface. |
michael@0 | 130 | * |
michael@0 | 131 | * \sa #vpx_codec_control |
michael@0 | 132 | */ |
michael@0 | 133 | enum vp8e_enc_control_id { |
michael@0 | 134 | VP8E_UPD_ENTROPY = 5, /**< control function to set mode of entropy update in encoder */ |
michael@0 | 135 | VP8E_UPD_REFERENCE, /**< control function to set reference update mode in encoder */ |
michael@0 | 136 | VP8E_USE_REFERENCE, /**< control function to set which reference frame encoder can use */ |
michael@0 | 137 | VP8E_SET_ROI_MAP, /**< control function to pass an ROI map to encoder */ |
michael@0 | 138 | VP8E_SET_ACTIVEMAP, /**< control function to pass an Active map to encoder */ |
michael@0 | 139 | VP8E_SET_SCALEMODE = 11, /**< control function to set encoder scaling mode */ |
michael@0 | 140 | /*!\brief control function to set vp8 encoder cpuused |
michael@0 | 141 | * |
michael@0 | 142 | * Changes in this value influences, among others, the encoder's selection |
michael@0 | 143 | * of motion estimation methods. Values greater than 0 will increase encoder |
michael@0 | 144 | * speed at the expense of quality. |
michael@0 | 145 | * The full set of adjustments can be found in |
michael@0 | 146 | * onyx_if.c:vp8_set_speed_features(). |
michael@0 | 147 | * \todo List highlights of the changes at various levels. |
michael@0 | 148 | * |
michael@0 | 149 | * \note Valid range: -16..16 |
michael@0 | 150 | */ |
michael@0 | 151 | VP8E_SET_CPUUSED = 13, |
michael@0 | 152 | VP8E_SET_ENABLEAUTOALTREF, /**< control function to enable vp8 to automatic set and use altref frame */ |
michael@0 | 153 | VP8E_SET_NOISE_SENSITIVITY, /**< control function to set noise sensitivity */ |
michael@0 | 154 | VP8E_SET_SHARPNESS, /**< control function to set sharpness */ |
michael@0 | 155 | VP8E_SET_STATIC_THRESHOLD, /**< control function to set the threshold for macroblocks treated static */ |
michael@0 | 156 | VP8E_SET_TOKEN_PARTITIONS, /**< control function to set the number of token partitions */ |
michael@0 | 157 | VP8E_GET_LAST_QUANTIZER, /**< return the quantizer chosen by the |
michael@0 | 158 | encoder for the last frame using the internal |
michael@0 | 159 | scale */ |
michael@0 | 160 | VP8E_GET_LAST_QUANTIZER_64, /**< return the quantizer chosen by the |
michael@0 | 161 | encoder for the last frame, using the 0..63 |
michael@0 | 162 | scale as used by the rc_*_quantizer config |
michael@0 | 163 | parameters */ |
michael@0 | 164 | VP8E_SET_ARNR_MAXFRAMES, /**< control function to set the max number of frames blurred creating arf*/ |
michael@0 | 165 | VP8E_SET_ARNR_STRENGTH, /**< control function to set the filter strength for the arf */ |
michael@0 | 166 | VP8E_SET_ARNR_TYPE, /**< control function to set the type of filter to use for the arf*/ |
michael@0 | 167 | VP8E_SET_TUNING, /**< control function to set visual tuning */ |
michael@0 | 168 | /*!\brief control function to set constrained quality level |
michael@0 | 169 | * |
michael@0 | 170 | * \attention For this value to be used vpx_codec_enc_cfg_t::g_usage must be |
michael@0 | 171 | * set to #VPX_CQ. |
michael@0 | 172 | * \note Valid range: 0..63 |
michael@0 | 173 | */ |
michael@0 | 174 | VP8E_SET_CQ_LEVEL, |
michael@0 | 175 | |
michael@0 | 176 | /*!\brief Max data rate for Intra frames |
michael@0 | 177 | * |
michael@0 | 178 | * This value controls additional clamping on the maximum size of a |
michael@0 | 179 | * keyframe. It is expressed as a percentage of the average |
michael@0 | 180 | * per-frame bitrate, with the special (and default) value 0 meaning |
michael@0 | 181 | * unlimited, or no additional clamping beyond the codec's built-in |
michael@0 | 182 | * algorithm. |
michael@0 | 183 | * |
michael@0 | 184 | * For example, to allocate no more than 4.5 frames worth of bitrate |
michael@0 | 185 | * to a keyframe, set this to 450. |
michael@0 | 186 | * |
michael@0 | 187 | */ |
michael@0 | 188 | VP8E_SET_MAX_INTRA_BITRATE_PCT, |
michael@0 | 189 | |
michael@0 | 190 | |
michael@0 | 191 | /* TODO(jkoleszar): Move to vp9cx.h */ |
michael@0 | 192 | VP9E_SET_LOSSLESS, |
michael@0 | 193 | VP9E_SET_TILE_COLUMNS, |
michael@0 | 194 | VP9E_SET_TILE_ROWS, |
michael@0 | 195 | VP9E_SET_FRAME_PARALLEL_DECODING, |
michael@0 | 196 | VP9E_SET_AQ_MODE, |
michael@0 | 197 | |
michael@0 | 198 | VP9E_SET_SVC, |
michael@0 | 199 | VP9E_SET_SVC_PARAMETERS |
michael@0 | 200 | }; |
michael@0 | 201 | |
michael@0 | 202 | /*!\brief vpx 1-D scaling mode |
michael@0 | 203 | * |
michael@0 | 204 | * This set of constants define 1-D vpx scaling modes |
michael@0 | 205 | */ |
michael@0 | 206 | typedef enum vpx_scaling_mode_1d { |
michael@0 | 207 | VP8E_NORMAL = 0, |
michael@0 | 208 | VP8E_FOURFIVE = 1, |
michael@0 | 209 | VP8E_THREEFIVE = 2, |
michael@0 | 210 | VP8E_ONETWO = 3 |
michael@0 | 211 | } VPX_SCALING_MODE; |
michael@0 | 212 | |
michael@0 | 213 | |
michael@0 | 214 | /*!\brief vpx region of interest map |
michael@0 | 215 | * |
michael@0 | 216 | * These defines the data structures for the region of interest map |
michael@0 | 217 | * |
michael@0 | 218 | */ |
michael@0 | 219 | |
michael@0 | 220 | typedef struct vpx_roi_map { |
michael@0 | 221 | /*! An id between 0 and 3 for each 16x16 region within a frame. */ |
michael@0 | 222 | unsigned char *roi_map; |
michael@0 | 223 | unsigned int rows; /**< Number of rows. */ |
michael@0 | 224 | unsigned int cols; /**< Number of columns. */ |
michael@0 | 225 | // TODO(paulwilkins): broken for VP9 which has 8 segments |
michael@0 | 226 | // q and loop filter deltas for each segment |
michael@0 | 227 | // (see MAX_MB_SEGMENTS) |
michael@0 | 228 | int delta_q[4]; /**< Quantizer deltas. */ |
michael@0 | 229 | int delta_lf[4]; /**< Loop filter deltas. */ |
michael@0 | 230 | /*! Static breakout threshold for each segment. */ |
michael@0 | 231 | unsigned int static_threshold[4]; |
michael@0 | 232 | } vpx_roi_map_t; |
michael@0 | 233 | |
michael@0 | 234 | /*!\brief vpx active region map |
michael@0 | 235 | * |
michael@0 | 236 | * These defines the data structures for active region map |
michael@0 | 237 | * |
michael@0 | 238 | */ |
michael@0 | 239 | |
michael@0 | 240 | |
michael@0 | 241 | typedef struct vpx_active_map { |
michael@0 | 242 | unsigned char *active_map; /**< specify an on (1) or off (0) each 16x16 region within a frame */ |
michael@0 | 243 | unsigned int rows; /**< number of rows */ |
michael@0 | 244 | unsigned int cols; /**< number of cols */ |
michael@0 | 245 | } vpx_active_map_t; |
michael@0 | 246 | |
michael@0 | 247 | /*!\brief vpx image scaling mode |
michael@0 | 248 | * |
michael@0 | 249 | * This defines the data structure for image scaling mode |
michael@0 | 250 | * |
michael@0 | 251 | */ |
michael@0 | 252 | typedef struct vpx_scaling_mode { |
michael@0 | 253 | VPX_SCALING_MODE h_scaling_mode; /**< horizontal scaling mode */ |
michael@0 | 254 | VPX_SCALING_MODE v_scaling_mode; /**< vertical scaling mode */ |
michael@0 | 255 | } vpx_scaling_mode_t; |
michael@0 | 256 | |
michael@0 | 257 | /*!\brief VP8 token partition mode |
michael@0 | 258 | * |
michael@0 | 259 | * This defines VP8 partitioning mode for compressed data, i.e., the number of |
michael@0 | 260 | * sub-streams in the bitstream. Used for parallelized decoding. |
michael@0 | 261 | * |
michael@0 | 262 | */ |
michael@0 | 263 | |
michael@0 | 264 | typedef enum { |
michael@0 | 265 | VP8_ONE_TOKENPARTITION = 0, |
michael@0 | 266 | VP8_TWO_TOKENPARTITION = 1, |
michael@0 | 267 | VP8_FOUR_TOKENPARTITION = 2, |
michael@0 | 268 | VP8_EIGHT_TOKENPARTITION = 3 |
michael@0 | 269 | } vp8e_token_partitions; |
michael@0 | 270 | |
michael@0 | 271 | |
michael@0 | 272 | /*!\brief VP8 model tuning parameters |
michael@0 | 273 | * |
michael@0 | 274 | * Changes the encoder to tune for certain types of input material. |
michael@0 | 275 | * |
michael@0 | 276 | */ |
michael@0 | 277 | typedef enum { |
michael@0 | 278 | VP8_TUNE_PSNR, |
michael@0 | 279 | VP8_TUNE_SSIM |
michael@0 | 280 | } vp8e_tuning; |
michael@0 | 281 | |
michael@0 | 282 | /*!\brief vp9 svc parameters |
michael@0 | 283 | * |
michael@0 | 284 | * This defines parameters for svc encoding. |
michael@0 | 285 | * |
michael@0 | 286 | */ |
michael@0 | 287 | typedef struct vpx_svc_parameters { |
michael@0 | 288 | unsigned int width; /**< width of current spatial layer */ |
michael@0 | 289 | unsigned int height; /**< height of current spatial layer */ |
michael@0 | 290 | int layer; /**< current layer number - 0 = base */ |
michael@0 | 291 | int flags; /**< encode frame flags */ |
michael@0 | 292 | int max_quantizer; /**< max quantizer for current layer */ |
michael@0 | 293 | int min_quantizer; /**< min quantizer for current layer */ |
michael@0 | 294 | int distance_from_i_frame; /**< frame number within current gop */ |
michael@0 | 295 | int lst_fb_idx; /**< last frame frame buffer index */ |
michael@0 | 296 | int gld_fb_idx; /**< golden frame frame buffer index */ |
michael@0 | 297 | int alt_fb_idx; /**< alt reference frame frame buffer index */ |
michael@0 | 298 | } vpx_svc_parameters_t; |
michael@0 | 299 | |
michael@0 | 300 | /*!\brief VP8 encoder control function parameter type |
michael@0 | 301 | * |
michael@0 | 302 | * Defines the data types that VP8E control functions take. Note that |
michael@0 | 303 | * additional common controls are defined in vp8.h |
michael@0 | 304 | * |
michael@0 | 305 | */ |
michael@0 | 306 | |
michael@0 | 307 | |
michael@0 | 308 | /* These controls have been deprecated in favor of the flags parameter to |
michael@0 | 309 | * vpx_codec_encode(). See the definition of VP8_EFLAG_* above. |
michael@0 | 310 | */ |
michael@0 | 311 | VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_UPD_ENTROPY, int) |
michael@0 | 312 | VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_UPD_REFERENCE, int) |
michael@0 | 313 | VPX_CTRL_USE_TYPE_DEPRECATED(VP8E_USE_REFERENCE, int) |
michael@0 | 314 | |
michael@0 | 315 | VPX_CTRL_USE_TYPE(VP8E_SET_ROI_MAP, vpx_roi_map_t *) |
michael@0 | 316 | VPX_CTRL_USE_TYPE(VP8E_SET_ACTIVEMAP, vpx_active_map_t *) |
michael@0 | 317 | VPX_CTRL_USE_TYPE(VP8E_SET_SCALEMODE, vpx_scaling_mode_t *) |
michael@0 | 318 | |
michael@0 | 319 | VPX_CTRL_USE_TYPE(VP9E_SET_SVC, int) |
michael@0 | 320 | VPX_CTRL_USE_TYPE(VP9E_SET_SVC_PARAMETERS, vpx_svc_parameters_t *) |
michael@0 | 321 | |
michael@0 | 322 | VPX_CTRL_USE_TYPE(VP8E_SET_CPUUSED, int) |
michael@0 | 323 | VPX_CTRL_USE_TYPE(VP8E_SET_ENABLEAUTOALTREF, unsigned int) |
michael@0 | 324 | VPX_CTRL_USE_TYPE(VP8E_SET_NOISE_SENSITIVITY, unsigned int) |
michael@0 | 325 | VPX_CTRL_USE_TYPE(VP8E_SET_SHARPNESS, unsigned int) |
michael@0 | 326 | VPX_CTRL_USE_TYPE(VP8E_SET_STATIC_THRESHOLD, unsigned int) |
michael@0 | 327 | VPX_CTRL_USE_TYPE(VP8E_SET_TOKEN_PARTITIONS, int) /* vp8e_token_partitions */ |
michael@0 | 328 | |
michael@0 | 329 | VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_MAXFRAMES, unsigned int) |
michael@0 | 330 | VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_STRENGTH, unsigned int) |
michael@0 | 331 | VPX_CTRL_USE_TYPE(VP8E_SET_ARNR_TYPE, unsigned int) |
michael@0 | 332 | VPX_CTRL_USE_TYPE(VP8E_SET_TUNING, int) /* vp8e_tuning */ |
michael@0 | 333 | VPX_CTRL_USE_TYPE(VP8E_SET_CQ_LEVEL, unsigned int) |
michael@0 | 334 | |
michael@0 | 335 | VPX_CTRL_USE_TYPE(VP9E_SET_TILE_COLUMNS, int) |
michael@0 | 336 | VPX_CTRL_USE_TYPE(VP9E_SET_TILE_ROWS, int) |
michael@0 | 337 | |
michael@0 | 338 | VPX_CTRL_USE_TYPE(VP8E_GET_LAST_QUANTIZER, int *) |
michael@0 | 339 | VPX_CTRL_USE_TYPE(VP8E_GET_LAST_QUANTIZER_64, int *) |
michael@0 | 340 | |
michael@0 | 341 | VPX_CTRL_USE_TYPE(VP8E_SET_MAX_INTRA_BITRATE_PCT, unsigned int) |
michael@0 | 342 | |
michael@0 | 343 | VPX_CTRL_USE_TYPE(VP9E_SET_LOSSLESS, unsigned int) |
michael@0 | 344 | |
michael@0 | 345 | VPX_CTRL_USE_TYPE(VP9E_SET_FRAME_PARALLEL_DECODING, unsigned int) |
michael@0 | 346 | |
michael@0 | 347 | VPX_CTRL_USE_TYPE(VP9E_SET_AQ_MODE, unsigned int) |
michael@0 | 348 | |
michael@0 | 349 | /*! @} - end defgroup vp8_encoder */ |
michael@0 | 350 | #ifdef __cplusplus |
michael@0 | 351 | } // extern "C" |
michael@0 | 352 | #endif |
michael@0 | 353 | |
michael@0 | 354 | #endif |