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