1 | /* |
2 | * Copyright (c) 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_mpeg2.h |
27 | * \brief The MPEG-2 encoding API |
28 | * |
29 | * This file contains the \ref api_enc_mpeg2 "MPEG-2 encoding API". |
30 | */ |
31 | |
32 | #ifndef _VA_ENC_MPEG2_H_ |
33 | #define _VA_ENC_MPEG2_H_ |
34 | |
35 | #ifdef __cplusplus |
36 | extern "C" { |
37 | #endif |
38 | |
39 | /** |
40 | * \defgroup api_enc_mpeg2 MPEG-2 encoding API |
41 | * |
42 | * @{ |
43 | */ |
44 | |
45 | /** |
46 | * \brief MPEG-2 Quantization Matrix Buffer |
47 | * |
48 | */ |
49 | typedef VAIQMatrixBufferMPEG2 VAQMatrixBufferMPEG2; |
50 | |
51 | /** |
52 | * \brief Packed header types specific to MPEG-2 encoding. |
53 | * |
54 | * Types of packed headers generally used for MPEG-2 encoding. |
55 | */ |
56 | typedef enum { |
57 | /** |
58 | * \brief Packed Sequence Parameter Set (SPS). |
59 | * |
60 | */ |
61 | = VAEncPackedHeaderSequence, |
62 | /** |
63 | * \brief Packed Picture Parameter Set (PPS). |
64 | * |
65 | */ |
66 | = VAEncPackedHeaderPicture, |
67 | /** |
68 | * \brief Packed slice header. |
69 | * |
70 | */ |
71 | = VAEncPackedHeaderSlice, |
72 | } ; |
73 | |
74 | /** |
75 | * \brief Sequence parameter for MPEG-2 encoding |
76 | * |
77 | * This structure holds information for \c sequence_header() and |
78 | * sequence_extension(). |
79 | * |
80 | * If packed sequence headers mode is used, i.e. if the encoding |
81 | * pipeline was configured with the #VA_ENC_PACKED_HEADER_SEQUENCE |
82 | * flag, then the driver expects two more buffers to be provided to |
83 | * the same \c vaRenderPicture() as this buffer: |
84 | * - a #VAEncPackedHeaderParameterBuffer with type set to |
85 | * VAEncPackedHeaderType::VAEncPackedHeaderSequence ; |
86 | * - a #VAEncPackedHeaderDataBuffer which holds the actual packed |
87 | * header data. |
88 | * |
89 | */ |
90 | typedef struct _VAEncSequenceParameterBufferMPEG2 { |
91 | /** \brief Period between I frames. */ |
92 | uint32_t intra_period; |
93 | /** \brief Period between I/P frames. */ |
94 | uint32_t ip_period; |
95 | /** \brief Picture width. |
96 | * |
97 | * A 14bits unsigned inter, the lower 12bits |
98 | * is horizontal_size_value, and the upper |
99 | * 2bits is \c horizontal_size_extension |
100 | * |
101 | */ |
102 | uint16_t picture_width; |
103 | /** \brief Picture height. |
104 | * |
105 | * A 14bits unsigned inter, the lower 12bits |
106 | * is vertical_size_value, and the upper 2bits is |
107 | * vertical_size_size_extension |
108 | * |
109 | */ |
110 | uint16_t picture_height; |
111 | /** |
112 | * \brief Initial bitrate set for this sequence in CBR or VBR modes. |
113 | * |
114 | * This field represents the initial bitrate value for this |
115 | * sequence if CBR or VBR mode is used, i.e. if the encoder |
116 | * pipeline was created with a #VAConfigAttribRateControl |
117 | * attribute set to either \ref VA_RC_CBR or \ref VA_RC_VBR. |
118 | * |
119 | * bits_per_second may be derived from bit_rate. |
120 | * |
121 | */ |
122 | uint32_t bits_per_second; |
123 | /** |
124 | * \brief Frame rate |
125 | * |
126 | * Derived from frame_rate_value, frame_rate_extension_n and |
127 | * frame_rate_extension_d |
128 | * |
129 | */ |
130 | float frame_rate; |
131 | /** \brief Same as the element in sequence_header() */ |
132 | uint16_t aspect_ratio_information; |
133 | /** \brief Define the size of VBV */ |
134 | uint32_t vbv_buffer_size; |
135 | |
136 | union { |
137 | struct { |
138 | /** \brief Same as the element in Sequence extension() */ |
139 | uint32_t profile_and_level_indication : 8; |
140 | /** \brief Same as the element in Sequence extension() */ |
141 | uint32_t progressive_sequence : 1; |
142 | /** \brief Same as the element in Sequence extension() */ |
143 | uint32_t chroma_format : 2; |
144 | /** \brief Same as the element in Sequence extension() */ |
145 | uint32_t low_delay : 1; |
146 | /** \brief Same as the element in Sequence extension() */ |
147 | uint32_t frame_rate_extension_n : 2; |
148 | /** \brief Same as the element in Sequence extension() */ |
149 | uint32_t frame_rate_extension_d : 5; |
150 | } bits; |
151 | uint32_t value; |
152 | } sequence_extension; |
153 | |
154 | /** \brief Flag to indicate the following GOP header are being updated */ |
155 | uint32_t ; |
156 | |
157 | union { |
158 | struct { |
159 | /** \brief Time code */ |
160 | uint32_t time_code : 25; |
161 | /** \brief Same as the element in GOP header */ |
162 | uint32_t closed_gop : 1; |
163 | /** \brief SAme as the element in GOP header */ |
164 | uint32_t broken_link : 1; |
165 | } bits; |
166 | uint32_t value; |
167 | } ; |
168 | |
169 | /** \brief Reserved bytes for future use, must be zero */ |
170 | uint32_t va_reserved[VA_PADDING_LOW]; |
171 | } VAEncSequenceParameterBufferMPEG2; |
172 | |
173 | /** |
174 | * \brief Picture parameter for MPEG-2 encoding |
175 | * |
176 | * This structure holds information for picture_header() and |
177 | * picture_coding_extension() |
178 | * |
179 | * If packed picture headers mode is used, i.e. if the encoding |
180 | * pipeline was configured with the #VA_ENC_PACKED_HEADER_PICTURE |
181 | * flag, then the driver expects two more buffers to be provided to |
182 | * the same \c vaRenderPicture() as this buffer: |
183 | * - a #VAEncPackedHeaderParameterBuffer with type set to |
184 | * VAEncPackedHeaderType::VAEncPackedHeaderPicture ; |
185 | * - a #VAEncPackedHeaderDataBuffer which holds the actual packed |
186 | * header data. |
187 | * |
188 | */ |
189 | typedef struct _VAEncPictureParameterBufferMPEG2 { |
190 | /** \brief Forward reference picture */ |
191 | VASurfaceID forward_reference_picture; |
192 | /** \brief Backward reference picture */ |
193 | VASurfaceID backward_reference_picture; |
194 | /** \brief Reconstructed(decoded) picture */ |
195 | VASurfaceID reconstructed_picture; |
196 | /** |
197 | * \brief Output encoded bitstream. |
198 | * |
199 | * \ref coded_buf has type #VAEncCodedBufferType. It should be |
200 | * large enough to hold the compressed NAL slice and possibly SPS |
201 | * and PPS NAL units. |
202 | */ |
203 | VABufferID coded_buf; |
204 | /** |
205 | * \brief Flag to indicate the picture is the last one or not. |
206 | * |
207 | * This fields holds 0 if the picture to be encoded is not |
208 | * the last one in the stream. Otherwise, it |
209 | * is \ref MPEG2_LAST_PICTURE_EOSTREAM. |
210 | */ |
211 | uint8_t last_picture; |
212 | /** \brief Picture type */ |
213 | VAEncPictureType picture_type; |
214 | /** \brief Same as the element in picture_header() */ |
215 | uint32_t temporal_reference; |
216 | /** \brief Same as the element in picture_header() */ |
217 | uint32_t vbv_delay; |
218 | /** \brief Same as the element in Picture coding extension */ |
219 | uint8_t f_code[2][2]; |
220 | union { |
221 | struct { |
222 | /** \brief Same as the element in Picture coding extension */ |
223 | uint32_t intra_dc_precision : 2; |
224 | /** \brief Same as the element in Picture coding extension */ |
225 | uint32_t picture_structure : 2; |
226 | /** \brief Same as the element in Picture coding extension */ |
227 | uint32_t top_field_first : 1; |
228 | /** \brief Same as the element in Picture coding extension */ |
229 | uint32_t frame_pred_frame_dct : 1; |
230 | /** \brief Same as the element in Picture coding extension */ |
231 | uint32_t concealment_motion_vectors : 1; |
232 | /** \brief Same as the element in Picture coding extension */ |
233 | uint32_t q_scale_type : 1; |
234 | /** \brief Same as the element in Picture coding extension */ |
235 | uint32_t intra_vlc_format : 1; |
236 | /** \brief Same as the element in Picture coding extension */ |
237 | uint32_t alternate_scan : 1; |
238 | /** \brief Same as the element in Picture coding extension */ |
239 | uint32_t repeat_first_field : 1; |
240 | /** \brief Same as the element in Picture coding extension */ |
241 | uint32_t progressive_frame : 1; |
242 | /** \brief Same as the element in Picture coding extension */ |
243 | uint32_t composite_display_flag : 1; |
244 | } bits; |
245 | uint32_t value; |
246 | } picture_coding_extension; |
247 | |
248 | /* \brief Parameters for composite display |
249 | * |
250 | * Valid only when omposite_display_flag is 1 |
251 | */ |
252 | union { |
253 | struct { |
254 | /** \brief Same as the element in Picture coding extension */ |
255 | uint32_t v_axis : 1; |
256 | /** \brief Same as the element in Picture coding extension */ |
257 | uint32_t field_sequence : 3; |
258 | /** \brief Same as the element in Picture coding extension */ |
259 | uint32_t sub_carrier : 1; |
260 | /** \brief Same as the element in Picture coding extension */ |
261 | uint32_t burst_amplitude : 7; |
262 | /** \brief Same as the element in Picture coding extension */ |
263 | uint32_t sub_carrier_phase : 8; |
264 | } bits; |
265 | uint32_t value; |
266 | } composite_display; |
267 | |
268 | /** \brief Reserved bytes for future use, must be zero */ |
269 | uint32_t va_reserved[VA_PADDING_LOW]; |
270 | } VAEncPictureParameterBufferMPEG2; |
271 | |
272 | /** |
273 | * \brief Slice parameter for MPEG-2 encoding |
274 | * |
275 | */ |
276 | typedef struct _VAEncSliceParameterBufferMPEG2 { |
277 | /** \brief Starting MB address for this slice. */ |
278 | uint32_t macroblock_address; |
279 | /** \brief Number of macroblocks in this slice. */ |
280 | uint32_t num_macroblocks; |
281 | /** \brief Same as the element in slice() */ |
282 | int32_t quantiser_scale_code; |
283 | /** \brief Flag to indicate intra slice */ |
284 | int32_t is_intra_slice; |
285 | |
286 | /** \brief Reserved bytes for future use, must be zero */ |
287 | uint32_t va_reserved[VA_PADDING_LOW]; |
288 | } VAEncSliceParameterBufferMPEG2; |
289 | |
290 | typedef struct _VAEncMiscParameterExtensionDataSeqDisplayMPEG2 { |
291 | /** should always be 0x02 to identify it is Sequence Display Extension ISO-13818 */ |
292 | uint8_t extension_start_code_identifier; |
293 | /** these field should follow ISO-13818 6.3.6 */ |
294 | uint8_t video_format; |
295 | uint8_t colour_description; |
296 | uint8_t colour_primaries; |
297 | uint8_t transfer_characteristics; |
298 | uint8_t matrix_coefficients; |
299 | uint16_t display_horizontal_size; |
300 | uint16_t display_vertical_size; |
301 | } VAEncMiscParameterExtensionDataSeqDisplayMPEG2; |
302 | /**@}*/ |
303 | |
304 | #ifdef __cplusplus |
305 | } |
306 | #endif |
307 | |
308 | #endif /* _VA_ENC_MPEG2_H_ */ |
309 | |