1/*
2 * Copyright (c) 2007-2012 Intel Corporation. All Rights Reserved.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sub license, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
14 * of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19 * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR
20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25/**
26 * \file va_enc_vp8.h
27 * \brief VP8 encoding API
28 *
29 * This file contains the \ref api_enc_vp8 "VP8 encoding API".
30 */
31
32#ifndef VA_ENC_VP8_H
33#define VA_ENC_VP8_H
34
35#ifdef __cplusplus
36extern "C" {
37#endif
38
39/**
40 * \defgroup api_enc_vp8 VP8 encoding API
41 *
42 * @{
43 */
44
45/**
46 * \brief VP8 Encoding Sequence Parameter Buffer Structure
47 *
48 * This structure conveys sequence level parameters.
49 *
50 */
51typedef struct  _VAEncSequenceParameterBufferVP8
52{
53    /* frame width in pixels */
54    unsigned int frame_width;
55    /* frame height in pixels */
56    unsigned int frame_height;
57    /* horizontal scale */
58    unsigned int frame_width_scale;
59    /* vertical scale */
60    unsigned int frame_height_scale;
61
62    /* whether to enable error resilience features */
63    unsigned int error_resilient;
64    /* auto keyframe placement, non-zero means enable auto keyframe placement */
65    unsigned int kf_auto;
66    /* keyframe minimum interval */
67    unsigned int kf_min_dist;
68    /* keyframe maximum interval */
69    unsigned int kf_max_dist;
70
71
72    /* RC related fields. RC modes are set with VAConfigAttribRateControl */
73    /* For VP8, CBR implies HRD conformance and VBR implies no HRD conformance */
74
75    /**
76     * Initial bitrate set for this sequence in CBR or VBR modes.
77     *
78     * This field represents the initial bitrate value for this
79     * sequence if CBR or VBR mode is used, i.e. if the encoder
80     * pipeline was created with a #VAConfigAttribRateControl
81     * attribute set to either \ref VA_RC_CBR or \ref VA_RC_VBR.
82     *
83     * The bitrate can be modified later on through
84     * #VAEncMiscParameterRateControl buffers.
85     */
86    unsigned int bits_per_second;
87    /* Period between I frames. */
88    unsigned int intra_period;
89
90    /* reference and reconstructed frame buffers
91     * Used for driver auto reference management when configured through
92     * VAConfigAttribEncAutoReference.
93     */
94    VASurfaceID reference_frames[4];
95
96} VAEncSequenceParameterBufferVP8;
97
98
99/**
100 * \brief VP8 Encoding Picture Parameter Buffer Structure
101 *
102 * This structure conveys picture level parameters.
103 *
104 */
105typedef struct  _VAEncPictureParameterBufferVP8
106{
107    /* surface to store reconstructed frame  */
108    VASurfaceID reconstructed_frame;
109
110    /*
111     * surfaces to store reference frames in non auto reference mode
112     * VA_INVALID_SURFACE can be used to denote an invalid reference frame.
113     */
114    VASurfaceID ref_last_frame;
115    VASurfaceID ref_gf_frame;
116    VASurfaceID ref_arf_frame;
117
118    /* buffer to store coded data */
119    VABufferID coded_buf;
120
121    union {
122        struct {
123            /* force this frame to be a keyframe */
124            unsigned int force_kf                       : 1;
125            /* don't reference the last frame */
126            unsigned int no_ref_last                    : 1;
127            /* don't reference the golden frame */
128            unsigned int no_ref_gf                      : 1;
129            /* don't reference the alternate reference frame */
130            unsigned int no_ref_arf                     : 1;
131            /* The temporal id the frame belongs to. */
132            unsigned int temporal_id                    : 8;
133            unsigned int reserved                       : 20;
134        } bits;
135        unsigned int value;
136    } ref_flags;
137
138    union {
139        struct {
140            /* version */
141            unsigned int frame_type                     : 1;
142            unsigned int version                        : 3;
143            /* show_frame */
144            unsigned int show_frame                     : 1;
145            /* color_space */
146            unsigned int color_space                    : 1;
147            /*  0: bicubic, 1: bilinear, other: none */
148            unsigned int recon_filter_type              : 2;
149            /*  0: no loop fitler, 1: simple loop filter */
150            unsigned int loop_filter_type               : 2;
151            /* 0: disabled, 1: normal, 2: simple */
152            unsigned int auto_partitions                : 1;
153            /* number of token partitions */
154            unsigned int num_token_partitions           : 2;
155
156            /**
157             * The following fields correspond to the same VP8 syntax elements
158             * in the frame header.
159             */
160	    /**
161             * 0: clamping of reconstruction pixels is disabled,
162             * 1: clamping enabled.
163             */
164            unsigned int clamping_type                  : 1;
165            /* indicate segmentation is enabled for the current frame. */
166            unsigned int segmentation_enabled           : 1;
167            /**
168             * Determines if the MB segmentation map is updated in the current
169             * frame.
170             */
171            unsigned int update_mb_segmentation_map     : 1;
172            /**
173             * Indicates if the segment feature data is updated in the current
174             * frame.
175             */
176            unsigned int update_segment_feature_data    : 1;
177            /**
178             * indicates if the MB level loop filter adjustment is enabled for
179             * the current frame (0 off, 1 on).
180             */
181	    unsigned int loop_filter_adj_enable         : 1;
182            /**
183             * Determines whether updated token probabilities are used only for
184             * this frame or until further update.
185             * It may be used by application to enable error resilient mode.
186             * In this mode probability updates are allowed only at Key Frames.
187             */
188            unsigned int refresh_entropy_probs          : 1;
189            /**
190             * Determines if the current decoded frame refreshes the golden frame.
191             */
192            unsigned int refresh_golden_frame           : 1;
193            /**
194             * Determines if the current decoded frame refreshes the alternate
195             * reference frame.
196             */
197            unsigned int refresh_alternate_frame        : 1;
198            /**
199             * Determines if the current decoded frame refreshes the last frame
200             * reference buffer.
201             */
202            unsigned int refresh_last                   : 1;
203            /**
204             * Determines if the golden reference is replaced by another reference.
205             */
206            unsigned int copy_buffer_to_golden          : 2;
207            /**
208             * Determines if the alternate reference is replaced by another reference.
209             */
210            unsigned int copy_buffer_to_alternate       : 2;
211            /**
212             * Controls the sign of motion vectors when the golden frame is referenced.
213             */
214            unsigned int sign_bias_golden               : 1;
215            /**
216             * Controls the sign of motion vectors when the alternate frame is
217             * referenced.
218             */
219	    unsigned int sign_bias_alternate            : 1;
220            /**
221             * Enables or disables the skipping of macroblocks containing no
222             * non-zero coefficients.
223             */
224	    unsigned int mb_no_coeff_skip               : 1;
225            /**
226             * Enforces unconditional per-MB loop filter delta update setting frame
227             * header flags mode_ref_lf_delta_update, all mb_mode_delta_update_flag[4],
228             * and all ref_frame_delta_update_flag[4] to 1.
229	     * Since loop filter deltas are not automatically refreshed to default
230             * values at key frames, dropped frame with delta update may prevent
231             * correct decoding from the next key frame.
232	     * Encoder application is advised to set this flag to 1 at key frames.
233	     */
234            unsigned int forced_lf_adjustment           : 1;
235            unsigned int reserved                       : 2;
236        } bits;
237        unsigned int value;
238    } pic_flags;
239
240    /**
241     * Contains a list of 4 loop filter level values (updated value if applicable)
242     * controlling the deblocking filter strength. Each entry represents a segment.
243     * When segmentation is disabled, use entry 0.
244     * When loop_filter_level is 0, loop filter shall be disabled.
245     */
246    char loop_filter_level[4];
247
248    /**
249     * Contains a list of 4 delta values for reference frame based MB-level
250     * loop filter adjustment.
251     * If no update, then set to 0.
252     */
253    char ref_lf_delta[4];
254
255    /**
256     * Contains a list of 4 delta values for coding mode based MB-level loop
257     * filter adjustment.
258     * If no update, then set to 0.
259     */
260    char mode_lf_delta[4];
261
262    /**
263     * Controls the deblocking filter sensitivity.
264     * Corresponds to the same VP8 syntax element in frame header.
265     */
266    unsigned char sharpness_level;
267
268    /**
269     * Application supplied maximum clamp value for Qindex used in quantization.
270     * Qindex will not be allowed to exceed this value.
271     * It has a valid range [0..127] inclusive.
272     */
273    unsigned char clamp_qindex_high;
274
275    /**
276     * Application supplied minimum clamp value for Qindex used in quantization.
277     * Qindex will not be allowed to be lower than this value.
278     * It has a valid range [0..127] inclusive.
279     * Condition clamp_qindex_low <= clamp_qindex_high must be guaranteed,
280     * otherwise they are ignored.
281     */
282    unsigned char clamp_qindex_low;
283
284} VAEncPictureParameterBufferVP8;
285
286/**
287 * \brief VP8 Quantization Matrix Buffer Structure
288 *
289 * Contains quantization index for yac(0-3) for each segment and quantization
290 * index deltas, ydc(0), y2dc(1), y2ac(2), uvdc(3), uvac(4) that are applied
291 * to all segments.  When segmentation is disabled, only quantization_index[0]
292 * will be used. This structure is sent once per frame.
293 */
294typedef struct _VAQMatrixBufferVP8
295{
296    unsigned short quantization_index[4];
297    short quantization_index_delta[5];
298} VAQMatrixBufferVP8;
299
300/**
301 * \brief VP8 MB Segmentation ID Buffer
302 *
303 * The application provides a buffer of VAEncMacroblockMapBufferType containing
304 * the initial segmentation id for each MB, one byte each, in raster scan order.
305 * Rate control may reassign it.  For example, a 640x480 video, the buffer has 1200 entries.
306 * The value of each entry should be in the range [0..3], inclusive.
307 * If segmentation is not enabled, the application does not need to provide it.
308 */
309
310
311/**@}*/
312
313#ifdef __cplusplus
314}
315#endif
316
317#endif /* VA_ENC_VP8_H */
318