• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 Intel Corporation. All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef VBP_LOADER_H
18 #define VBP_LOADER_H
19 
20 #include <va/va.h>
21 
22 #ifdef USE_HW_VP8
23 #include <va/va_dec_vp8.h>
24 #endif
25 
26 #ifndef TRUE
27 #define TRUE 1
28 #endif
29 
30 #ifndef FALSE
31 #define FALSE 0
32 #endif
33 
34 
35 #ifndef uint8
36 typedef unsigned char uint8;
37 #endif
38 #ifndef uint16
39 typedef unsigned short uint16;
40 #endif
41 #ifndef uint32
42 typedef unsigned int uint32;
43 #endif
44 #ifndef int16
45 typedef short int16;
46 #endif
47 
48 typedef void *Handle;
49 
50 /*
51  * MPEG-4 Part 2 data structure
52  */
53 
54 typedef struct _vbp_codec_data_mp42
55 {
56     uint8  profile_and_level_indication;
57     uint32 video_object_layer_width;
58     uint32 video_object_layer_height;
59 
60     // 0 for unspecified, PAL/NTSC/SECAM
61     uint8  video_format;
62 
63     // 0 short range, 1 full range
64     uint8  video_range;
65 
66     // default 2 (unspecified), 1 for BT709.
67     uint8  matrix_coefficients;
68 
69     uint8  short_video_header;
70 
71     // always exist for mpeg-4,
72     uint8   aspect_ratio_info;
73     uint8   par_width;
74     uint8   par_height;
75 
76     // bit rate
77     int bit_rate;
78 } vbp_codec_data_mp42;
79 
80 typedef struct _vbp_slice_data_mp42
81 {
82     uint8* buffer_addr;
83     uint32 slice_offset;
84     uint32 slice_size;
85     VASliceParameterBufferMPEG4 slice_param;
86 } vbp_slice_data_mp42;
87 
88 typedef struct _vbp_picture_data_mp42 vbp_picture_data_mp42;
89 
90 struct _vbp_picture_data_mp42
91 {
92     uint8 vop_coded;
93     uint16 vop_time_increment;
94     /* indicates if current buffer contains parameter for the first slice of the picture */
95     uint8 new_picture_flag;
96     VAPictureParameterBufferMPEG4 picture_param;
97     vbp_slice_data_mp42 slice_data;
98 
99     vbp_picture_data_mp42* next_picture_data;
100 };
101 
102 typedef struct _vbp_data_mp42
103 {
104     vbp_codec_data_mp42 codec_data;
105     VAIQMatrixBufferMPEG4 iq_matrix_buffer;
106 
107     uint32 number_picture_data;
108     uint32 number_pictures;
109 
110     vbp_picture_data_mp42 *picture_data;
111 
112 } vbp_data_mp42;
113 
114 /*
115  * H.264 data structure
116  */
117 
118 typedef struct _vbp_codec_data_h264
119 {
120     uint8 pic_parameter_set_id;
121     uint8 seq_parameter_set_id;
122 
123     uint8 profile_idc;
124     uint8 level_idc;
125     /*constraint flag sets (h.264 Spec v2009)*/
126     uint8 constraint_set0_flag;
127     uint8 constraint_set1_flag;
128     uint8 constraint_set2_flag;
129     uint8 constraint_set3_flag;
130     uint8 constraint_set4_flag;
131 
132     uint8 num_ref_frames;
133     uint8 gaps_in_frame_num_value_allowed_flag;
134 
135     uint8 frame_mbs_only_flag;
136     uint8 mb_adaptive_frame_field_flag;
137 
138     int frame_width;
139     int frame_height;
140 
141     uint8 vui_parameters_present_flag;
142 
143     /* aspect ratio */
144     uint8 aspect_ratio_idc;
145     uint16 sar_width;
146     uint16 sar_height;
147 
148     /* cropping information */
149     int crop_top;
150     int crop_bottom;
151     int crop_left;
152     int crop_right;
153 
154     /* video fromat */
155 
156     // default 5 unspecified
157     uint8 video_format;
158     uint8 video_full_range_flag;
159 
160     // default 2 unspecified
161     uint8 matrix_coefficients;
162 
163     uint8 pic_order_cnt_type;
164     int log2_max_pic_order_cnt_lsb_minus4;
165 
166     int bit_rate;
167 
168     int has_slice;
169 } vbp_codec_data_h264;
170 
171 typedef struct _vbp_slice_data_h264
172 {
173     uint8* buffer_addr;
174 
175     uint32 slice_offset; /* slice data offset */
176 
177     uint32 slice_size; /* slice data size */
178 
179     uint8 nal_unit_type;
180 
181     VASliceParameterBufferH264 slc_parms;
182 
183 } vbp_slice_data_h264;
184 
185 
186 typedef struct _vbp_picture_data_h264
187 {
188     VAPictureParameterBufferH264* pic_parms;
189 
190     uint32 num_slices;
191 
192     vbp_slice_data_h264* slc_data;
193 
194 } vbp_picture_data_h264;
195 
196 
197 typedef struct _vbp_data_h264
198 {
199     /* rolling counter of buffers sent by vbp_parse */
200     uint32 buf_number;
201 
202     uint32 num_pictures;
203 
204     /* if SPS has been received */
205     uint8  has_sps;
206 
207     /* if PPS has been received */
208     uint8  has_pps;
209 
210     uint8  new_sps;
211 
212     uint8  new_pps;
213 
214     vbp_picture_data_h264* pic_data;
215 
216     /**
217         * do we need to send matrix to VA for each picture? If not, we need
218         * a flag indicating whether it is updated.
219         */
220     VAIQMatrixBufferH264* IQ_matrix_buf;
221 
222     vbp_codec_data_h264* codec_data;
223 
224 #ifdef USE_SLICE_HEADER_PARSING
225     VAParsePictureParameterBuffer* pic_parse_buffer;
226 #endif
227 
228 } vbp_data_h264;
229 
230 /*
231  * vc1 data structure
232  */
233 typedef struct _vbp_codec_data_vc1
234 {
235     /* Sequence layer. */
236     uint8  PROFILE;
237     uint8  LEVEL;
238     uint8  POSTPROCFLAG;
239     uint8  PULLDOWN;
240     uint8  INTERLACE;
241     uint8  TFCNTRFLAG;
242     uint8  FINTERPFLAG;
243     uint8  PSF;
244 
245     // default 2: unspecified
246     uint8  MATRIX_COEF;
247 
248     /* Entry point layer. */
249     uint8  BROKEN_LINK;
250     uint8  CLOSED_ENTRY;
251     uint8  PANSCAN_FLAG;
252     uint8  REFDIST_FLAG;
253     uint8  LOOPFILTER;
254     uint8  FASTUVMC;
255     uint8  EXTENDED_MV;
256     uint8  DQUANT;
257     uint8  VSTRANSFORM;
258     uint8  OVERLAP;
259     uint8  QUANTIZER;
260     uint16 CODED_WIDTH;
261     uint16 CODED_HEIGHT;
262     uint8  EXTENDED_DMV;
263     uint8  RANGE_MAPY_FLAG;
264     uint8  RANGE_MAPY;
265     uint8  RANGE_MAPUV_FLAG;
266     uint8  RANGE_MAPUV;
267 
268     /* Others. */
269     uint8  RANGERED;
270     uint8  MAXBFRAMES;
271     uint8  MULTIRES;
272     uint8  SYNCMARKER;
273     uint8  RNDCTRL;
274     uint8  REFDIST;
275     uint16 widthMB;
276     uint16 heightMB;
277 
278     uint8  INTCOMPFIELD;
279     uint8  LUMSCALE2;
280     uint8  LUMSHIFT2;
281 
282     // aspect ratio
283 
284     // default unspecified
285     uint8 ASPECT_RATIO;
286 
287     uint8 ASPECT_HORIZ_SIZE;
288     uint8 ASPECT_VERT_SIZE;
289     // bit rate
290     int bit_rate;
291 } vbp_codec_data_vc1;
292 
293 typedef struct _vbp_slice_data_vc1
294 {
295     uint8 *buffer_addr;
296     uint32 slice_offset;
297     uint32 slice_size;
298     VASliceParameterBufferVC1 slc_parms;     /* pointer to slice parms */
299 } vbp_slice_data_vc1;
300 
301 
302 typedef struct _vbp_picture_data_vc1
303 {
304     uint32 picture_is_skipped;                /* VC1_PTYPE_SKIPPED is PTYPE is skipped. */
305     VAPictureParameterBufferVC1 *pic_parms;   /* current parsed picture header */
306     uint32 size_bitplanes;                    /* based on number of MBs */
307     uint8 *packed_bitplanes;                  /* contains up to three bitplanes packed for libVA */
308     uint32 num_slices;                        /* number of slices.  always at least one */
309     vbp_slice_data_vc1 *slc_data;             /* pointer to array of slice data */
310 } vbp_picture_data_vc1;
311 
312 typedef struct _vbp_data_vc1
313 {
314     uint32 buf_number;                        /* rolling counter of buffers sent by vbp_parse */
315     vbp_codec_data_vc1 *se_data;              /* parsed SH/EPs */
316 
317     uint32 num_pictures;
318 
319     vbp_picture_data_vc1* pic_data;
320 } vbp_data_vc1;
321 
322 #ifdef USE_HW_VP8
323 typedef struct _vbp_codec_data_vp8
324 {
325     uint8 frame_type;
326     uint8 version_num;
327     int show_frame;
328 
329     uint32 frame_width;
330     uint32 frame_height;
331 
332     int refresh_alt_frame;
333     int refresh_golden_frame;
334     int refresh_last_frame;
335 
336     /* cropping information */
337     int crop_top;
338     int crop_bottom;
339     int crop_left;
340     int crop_right;
341 
342     int golden_copied;
343     int altref_copied;
344 } vbp_codec_data_vp8;
345 
346 typedef struct _vbp_slice_data_vp8
347 {
348     uint8 *buffer_addr;
349     uint32 slice_offset;
350     uint32 slice_size;
351     VASliceParameterBufferVP8 slc_parms;     /* pointer to slice parms */
352 } vbp_slice_data_vp8;
353 
354 typedef struct _vbp_picture_data_vp8
355 {
356     VAPictureParameterBufferVP8* pic_parms;   /* current parsed picture header */
357 
358     uint32 num_slices;                        /* number of slices.  always one for VP8 */
359     vbp_slice_data_vp8 *slc_data;             /* pointer to array of slice data */
360 } vbp_picture_data_vp8;
361 
362 typedef struct _vbp_data_vp8
363 {
364     uint32 buf_number;                        /* rolling counter of buffers sent by vbp_parse */
365     vbp_codec_data_vp8 *codec_data;
366 
367     uint32 num_pictures;
368 
369     vbp_picture_data_vp8* pic_data;
370 
371     VAProbabilityDataBufferVP8* prob_data;
372     VAIQMatrixBufferVP8* IQ_matrix_buf;
373 } vbp_data_vp8;
374 #endif
375 
376 enum _picture_type
377 {
378     VC1_PTYPE_I,
379     VC1_PTYPE_P,
380     VC1_PTYPE_B,
381     VC1_PTYPE_BI,
382     VC1_PTYPE_SKIPPED
383 };
384 
385 enum _vbp_parser_error
386 {
387     VBP_OK,
388     VBP_TYPE,
389     VBP_LOAD,
390     VBP_INIT,
391     VBP_DATA,
392     VBP_DONE,
393     VBP_MEM,
394     VBP_PARM,
395     VBP_PARTIAL,
396     VBP_MULTI,
397     VBP_ERROR
398 };
399 
400 enum _vbp_parser_type
401 {
402     VBP_VC1,
403     VBP_MPEG2,
404     VBP_MPEG4,
405     VBP_H264,
406 #ifdef USE_HW_VP8
407     VBP_VP8,
408 #endif
409 #if (defined USE_AVC_SHORT_FORMAT || defined USE_SLICE_HEADER_PARSING)
410     VBP_H264SECURE,
411 #endif
412 };
413 
414 
415 /*
416  * open video bitstream parser to parse a specific media type.
417  * @param  parser_type: one of the types defined in #vbp_parser_type
418  * @param  hcontext: pointer to hold returned VBP context handle.
419  * @return VBP_OK on success, anything else on failure.
420  *
421  */
422 uint32 vbp_open(uint32 parser_type, Handle *hcontext);
423 
424 /*
425  * close video bitstream parser.
426  * @param hcontext: VBP context handle.
427  * @returns VBP_OK on success, anything else on failure.
428  *
429  */
430 uint32 vbp_close(Handle hcontext);
431 
432 /*
433  * parse bitstream.
434  * @param hcontext: handle to VBP context.
435  * @param data: pointer to bitstream buffer.
436  * @param size: size of bitstream buffer.
437  * @param init_flag: 1 if buffer contains bitstream configuration data, 0 otherwise.
438  * @return VBP_OK on success, anything else on failure.
439  *
440  */
441 uint32 vbp_parse(Handle hcontext, uint8 *data, uint32 size, uint8 init_data_flag);
442 
443 /*
444  * query parsing result.
445  * @param hcontext: handle to VBP context.
446  * @param data: pointer to hold a data blob that contains parsing result.
447  * Structure of data blob is determined by the media type.
448  * @return VBP_OK on success, anything else on failure.
449  *
450  */
451 uint32 vbp_query(Handle hcontext, void **data);
452 
453 
454 /*
455  * flush any un-parsed bitstream.
456  * @param hcontext: handle to VBP context.
457  * @returns VBP_OK on success, anything else on failure.
458  *
459  */
460 uint32 vbp_flush(Handle hcontent);
461 
462 #if (defined USE_AVC_SHORT_FORMAT || defined USE_SLICE_HEADER_PARSING)
463 /*
464  * update the the vbp context using the new data
465  * @param hcontext: handle to VBP context.
466  * @param data: pointer to the new data buffer.
467  * @param size: size of new data buffer.
468  * @param data: pointer to hold a data blob that contains parsing result.
469  * @returns VBP_OK on success, anything else on failure.
470  *
471 */
472 uint32 vbp_update(Handle hcontext, void *newdata, uint32 size, void **data);
473 #endif
474 
475 #endif /* VBP_LOADER_H */
476