1/******************************************************************************
2 *
3 * Copyright (C) 2015 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*/
20/*****************************************************************************/
21/*                                                                           */
22/*  File Name         : impeg2d.h                                        */
23/*                                                                           */
24/*  Description       : This file contains all the necessary structure and   */
25/*                      enumeration definitions needed for the Application   */
26/*                      Program Interface(API) of the Ittiam MPEG2 ASP       */
27/*                      Decoder on Cortex A8 - Neon platform                 */
28/*                                                                           */
29/*  List of Functions : impeg2d_api_function                             */
30/*                                                                           */
31/*  Issues / Problems : None                                                 */
32/*                                                                           */
33/*  Revision History  :                                                      */
34/*                                                                           */
35/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
36/*         26 08 2010   100239(RCY)     Draft                                */
37/*                                                                           */
38/*****************************************************************************/
39
40#ifndef __IMPEG2D_H__
41#define __IMPEG2D_H__
42
43#include "iv.h"
44#include "ivd.h"
45#ifdef __cplusplus
46extern "C"
47{
48#endif
49
50/*****************************************************************************/
51/* Constant Macros                                                           */
52/*****************************************************************************/
53#define EXPORT_MPEG2DEC_FULLCODEC_MEM_RECORDS   22
54
55/*****************************************************************************/
56/* Function Macros                                                           */
57/*****************************************************************************/
58#define IS_IVD_CONCEALMENT_APPLIED(x)           (x & (1 << IVD_APPLIEDCONCEALMENT))
59#define IS_IVD_INSUFFICIENTDATA_ERROR(x)        (x & (1 << IVD_INSUFFICIENTDATA))
60#define IS_IVD_CORRUPTEDDATA_ERROR(x)           (x & (1 << IVD_CORRUPTEDDATA))
61#define IS_IVD_CORRUPTEDHEADER_ERROR(x)         (x & (1 << IVD_CORRUPTEDHEADER))
62#define IS_IVD_UNSUPPORTEDINPUT_ERROR(x)        (x & (1 << IVD_UNSUPPORTEDINPUT))
63#define IS_IVD_UNSUPPORTEDPARAM_ERROR(x)        (x & (1 << IVD_UNSUPPORTEDPARAM))
64#define IS_IVD_FATAL_ERROR(x)                   (x & (1 << IVD_FATALERROR))
65#define IS_IVD_INVALID_BITSTREAM_ERROR(x)       (x & (1 << IVD_INVALID_BITSTREAM))
66#define IS_IVD_INCOMPLETE_BITSTREAM_ERROR(x)    (x & (1 << IVD_INCOMPLETE_BITSTREAM))
67
68#define SET_IVD_CONCEALMENT_APPLIED(x)          ((x) |= (x) | (1 << IVD_APPLIEDCONCEALMENT))
69#define SET_IVD_INSUFFICIENTDATA_ERROR(x)       ((x) |= (x) | (1 << IVD_INSUFFICIENTDATA))
70#define SET_IVD_CORRUPTEDDATA_ERROR(x)          ((x) |= (x) | (1 << IVD_CORRUPTEDDATA))
71#define SET_IVD_CORRUPTEDHEADER_ERROR(x)        ((x) |= (x) | (1 << IVD_CORRUPTEDHEADER))
72#define SET_IVD_UNSUPPORTEDINPUT_ERROR(x)       ((x) |= (x) | (1 << IVD_UNSUPPORTEDINPUT))
73#define SET_IVD_UNSUPPORTEDPARAM_ERROR(x)       ((x) |= (x) | (1 << IVD_UNSUPPORTEDPARAM))
74#define SET_IVD_FATAL_ERROR(x)                  ((x) |= (x) | (1 << IVD_FATALERROR))
75#define SET_IVD_INVALID_BITSTREAM_ERROR(x)      ((x) |= (x) | (1 << IVD_INVALID_BITSTREAM))
76#define SET_IVD_INCOMPLETE_BITSTREAM_ERROR(x)   ((x) |= (x) | (1 << IVD_INCOMPLETE_BITSTREAM))
77
78/*****************************************************************************/
79/* API Function Prototype                                                    */
80/*****************************************************************************/
81IV_API_CALL_STATUS_T impeg2d_api_function(iv_obj_t *ps_handle,
82                                          void *pv_api_ip,
83                                          void *pv_api_op);
84
85/*****************************************************************************/
86/* Enums                                                                     */
87/*****************************************************************************/
88/* Codec Error codes for MPEG2 ASP Decoder                                   */
89
90typedef enum
91{
92
93    IMPEG2D_UNKNOWN_ERROR = IVD_DUMMY_ELEMENT_FOR_CODEC_EXTENSIONS + 1,
94    /* API calls without init call */
95    IMPEG2D_INIT_NOT_DONE,
96    /* Query number of Memory Records API */
97    IMPEG2D_QUERY_NUM_MEM_REC_FAIL,
98
99    /* Fill Memory Records API */
100    IMPEG2D_FILL_NUM_MEM_REC_NOT_SUFFICIENT,
101
102    /* Initialize Decoder API */
103    IMPEG2D_INIT_DEC_SCR_MEM_INSUFFICIENT,
104    IMPEG2D_INIT_DEC_PER_MEM_INSUFFICIENT,
105    IMPEG2D_INIT_NUM_MEM_REC_NOT_SUFFICIENT,
106    IMPEG2D_INIT_CHROMA_FORMAT_HEIGHT_ERROR,
107
108    /* Decode Sequence Header API */
109    IMPEG2D_FRM_HDR_START_CODE_NOT_FOUND,
110    IMPEG2D_FRM_HDR_MARKER_BIT_NOT_FOUND,
111    IMPEG2D_PROF_LEVEL_NOT_SUPPORTED,
112    IMPEG2D_FMT_NOT_SUPPORTED,
113    IMPEG2D_SCALABILITIY_NOT_SUPPORTED,
114    IMPEG2D_PIC_SIZE_NOT_SUPPORTED,
115
116    /* Search for start code API */
117    //IMPEG2D_SEARCH_START_CODE_FAIL         ,
118    /* Decode Video Frame API    */
119    IMPEG2D_START_CODE_NOT_FOUND,
120    IMPEG2D_MARKER_BIT_NOT_FOUND,
121    IMPEG2D_INVALID_STUFFING,
122    IMPEG2D_PROFILE_LEVEL_NOT_SUP,
123    IMPEG2D_CHROMA_FMT_NOT_SUP,
124    IMPEG2D_SCALABLITY_NOT_SUP,
125    IMPEG2D_FRM_HDR_DECODE_ERR,
126    IMPEG2D_MB_HDR_DECODE_ERR,
127    IMPEG2D_MB_TEX_DECODE_ERR,
128    IMPEG2D_INCORRECT_QUANT_MATRIX,
129    IMPEG2D_INVALID_SKIP_MB,
130    IMPEG2D_NOT_SUPPORTED_ERR,
131    IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR,
132    IMPEG2D_INVALID_PIC_TYPE,
133    IMPEG2D_INVALID_HUFFMAN_CODE,
134    IMPEG2D_NO_FREE_BUF_ERR,
135
136    /* slice header errors */
137    IMPEG2D_INVALID_VERT_SIZE,
138    IMPEG2D_MB_DATA_DECODE_ERR,
139
140    /* Get Display Frame API */
141    IMPEG2D_GET_DISP_FRM_FAIL,
142
143    /* Sample Version limitation */
144    IMPEG2D_SAMPLE_VERSION_LIMIT_ERR,
145    /**
146     * Width/height greater than max width and max height
147     */
148    IMPEG2D_UNSUPPORTED_DIMENSIONS,
149
150    /* Unknown API Command */
151    IMPEG2D_UNKNOWN_API_COMMAND
152
153} IMPEG2D_ERROR_CODES_T;
154
155/*****************************************************************************/
156/* Extended Structures                                                       */
157/*****************************************************************************/
158typedef enum
159{
160    /** Set number of cores/threads to be used */
161    IMPEG2D_CMD_CTL_SET_NUM_CORES = IVD_CMD_CTL_CODEC_SUBCMD_START,
162
163    /** Set processor details */
164    IMPEG2D_CMD_CTL_SET_PROCESSOR = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x001,
165
166    /** Get display buffer dimensions */
167    IMPEG2D_CMD_CTL_GET_BUFFER_DIMENSIONS = IVD_CMD_CTL_CODEC_SUBCMD_START
168                    + 0x100,
169
170    /** Get Seq header/seq header extension info */
171    IMPEG2D_CMD_CTL_GET_SEQ_INFO     = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x101,
172
173} IMPEG2D_CMD_CTL_SUB_CMDS;
174
175/*****************************************************************************/
176/*  Get Number of Memory Records                                             */
177/*****************************************************************************/
178
179typedef struct
180{
181    iv_num_mem_rec_ip_t s_ivd_num_mem_rec_ip_t;
182} impeg2d_num_mem_rec_ip_t;
183
184typedef struct
185{
186    iv_num_mem_rec_op_t s_ivd_num_mem_rec_op_t;
187} impeg2d_num_mem_rec_op_t;
188
189/*****************************************************************************/
190/*  Fill Memory Records                                                      */
191/*****************************************************************************/
192
193typedef struct
194{
195    iv_fill_mem_rec_ip_t s_ivd_fill_mem_rec_ip_t;
196    /* Flag to enable sharing of reference buffers between decoder
197     and application */
198
199    UWORD32 u4_share_disp_buf;
200
201    /* format in which codec has to give out frame data for display */
202    IV_COLOR_FORMAT_T e_output_format;
203
204    /**
205     * Flag to enable/disable deinterlacing
206     */
207    UWORD32 u4_deinterlace;
208
209} impeg2d_fill_mem_rec_ip_t;
210
211typedef struct
212{
213    iv_fill_mem_rec_op_t s_ivd_fill_mem_rec_op_t;
214} impeg2d_fill_mem_rec_op_t;
215
216/*****************************************************************************/
217/*  Retrieve Memory Records                                                  */
218/*****************************************************************************/
219
220typedef struct
221{
222    iv_retrieve_mem_rec_ip_t s_ivd_retrieve_mem_rec_ip_t;
223} impeg2d_retrieve_mem_rec_ip_t;
224
225typedef struct
226{
227    iv_retrieve_mem_rec_op_t s_ivd_retrieve_mem_rec_op_t;
228} impeg2d_retrieve_mem_rec_op_t;
229
230/*****************************************************************************/
231/*   Initialize decoder                                                      */
232/*****************************************************************************/
233
234typedef struct
235{
236    ivd_init_ip_t s_ivd_init_ip_t;
237    /* Flag to enable sharing of reference buffers between decoder
238     and application */
239    UWORD32 u4_share_disp_buf;
240
241    /**
242     * Flag to enable/disable deinterlacing
243     */
244    UWORD32 u4_deinterlace;
245
246} impeg2d_init_ip_t;
247
248typedef struct
249{
250    ivd_init_op_t s_ivd_init_op_t;
251} impeg2d_init_op_t;
252
253/*****************************************************************************/
254/*   Video Decode                                                            */
255/*****************************************************************************/
256
257typedef struct
258{
259    ivd_video_decode_ip_t s_ivd_video_decode_ip_t;
260} impeg2d_video_decode_ip_t;
261
262typedef struct
263{
264    ivd_video_decode_op_t s_ivd_video_decode_op_t;
265} impeg2d_video_decode_op_t;
266
267/*****************************************************************************/
268/*   Get Display Frame                                                       */
269/*****************************************************************************/
270
271typedef struct
272{
273    ivd_get_display_frame_ip_t s_ivd_get_display_frame_ip_t;
274} impeg2d_get_display_frame_ip_t;
275
276typedef struct
277{
278    ivd_get_display_frame_op_t s_ivd_get_display_frame_op_t;
279} impeg2d_get_display_frame_op_t;
280
281/*****************************************************************************/
282/*   Set Display Frame                                                       */
283/*****************************************************************************/
284typedef struct
285{
286    ivd_set_display_frame_ip_t s_ivd_set_display_frame_ip_t;
287} impeg2d_set_display_frame_ip_t;
288
289typedef struct
290{
291    ivd_set_display_frame_op_t s_ivd_set_display_frame_op_t;
292} impeg2d_set_display_frame_op_t;
293
294/*****************************************************************************/
295/*   Release Display Buffers                                                 */
296/*****************************************************************************/
297
298typedef struct
299{
300    ivd_rel_display_frame_ip_t s_ivd_rel_display_frame_ip_t;
301} impeg2d_rel_display_frame_ip_t;
302
303typedef struct
304{
305    ivd_rel_display_frame_op_t s_ivd_rel_display_frame_op_t;
306} impeg2d_rel_display_frame_op_t;
307
308/*****************************************************************************/
309/*   Video control  Flush                                                    */
310/*****************************************************************************/
311
312typedef struct
313{
314    ivd_ctl_flush_ip_t s_ivd_ctl_flush_ip_t;
315} impeg2d_ctl_flush_ip_t;
316
317typedef struct
318{
319    ivd_ctl_flush_op_t s_ivd_ctl_flush_op_t;
320} impeg2d_ctl_flush_op_t;
321
322/*****************************************************************************/
323/*   Video control reset                                                     */
324/*****************************************************************************/
325
326typedef struct
327{
328    ivd_ctl_reset_ip_t s_ivd_ctl_reset_ip_t;
329} impeg2d_ctl_reset_ip_t;
330
331typedef struct
332{
333    ivd_ctl_reset_op_t s_ivd_ctl_reset_op_t;
334} impeg2d_ctl_reset_op_t;
335
336/*****************************************************************************/
337/*   Video control  Set Params                                               */
338/*****************************************************************************/
339
340typedef struct
341{
342    ivd_ctl_set_config_ip_t s_ivd_ctl_set_config_ip_t;
343} impeg2d_ctl_set_config_ip_t;
344
345typedef struct
346{
347    ivd_ctl_set_config_op_t s_ivd_ctl_set_config_op_t;
348} impeg2d_ctl_set_config_op_t;
349
350/*****************************************************************************/
351/*   Video control:Get Buf Info                                              */
352/*****************************************************************************/
353
354typedef struct
355{
356    ivd_ctl_getbufinfo_ip_t s_ivd_ctl_getbufinfo_ip_t;
357} impeg2d_ctl_getbufinfo_ip_t;
358
359typedef struct
360{
361    ivd_ctl_getbufinfo_op_t s_ivd_ctl_getbufinfo_op_t;
362} impeg2d_ctl_getbufinfo_op_t;
363
364/*****************************************************************************/
365/*   Video control:Getstatus Call                                            */
366/*****************************************************************************/
367
368typedef struct
369{
370    ivd_ctl_getstatus_ip_t s_ivd_ctl_getstatus_ip_t;
371} impeg2d_ctl_getstatus_ip_t;
372
373typedef struct
374{
375    ivd_ctl_getstatus_op_t s_ivd_ctl_getstatus_op_t;
376} impeg2d_ctl_getstatus_op_t;
377
378/*****************************************************************************/
379/*   Video control:Get Version Info                                          */
380/*****************************************************************************/
381
382typedef struct
383{
384    ivd_ctl_getversioninfo_ip_t s_ivd_ctl_getversioninfo_ip_t;
385} impeg2d_ctl_getversioninfo_ip_t;
386
387typedef struct
388{
389    ivd_ctl_getversioninfo_op_t s_ivd_ctl_getversioninfo_op_t;
390} impeg2d_ctl_getversioninfo_op_t;
391
392/*****************************************************************************/
393/*   Video control:Disable Qpel                                              */
394/*****************************************************************************/
395
396typedef struct
397{
398    UWORD32 u4_size;
399    IVD_API_COMMAND_TYPE_T e_cmd;
400    IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
401    UWORD32 u4_num_cores;
402} impeg2d_ctl_set_num_cores_ip_t;
403
404typedef struct
405{
406    UWORD32 u4_size;
407    UWORD32 u4_error_code;
408} impeg2d_ctl_set_num_cores_op_t;
409
410typedef struct
411{
412    /**
413     * size
414     */
415    UWORD32 u4_size;
416    /**
417     * cmd
418     */
419    IVD_API_COMMAND_TYPE_T e_cmd;
420    /**
421     * sub cmd
422     */
423    IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
424    /**
425     * Processor type
426     */
427    UWORD32 u4_arch;
428    /**
429     * SOC type
430     */
431    UWORD32 u4_soc;
432
433    /**
434     * num_cores
435     */
436    UWORD32 u4_num_cores;
437
438} impeg2d_ctl_set_processor_ip_t;
439
440typedef struct
441{
442    /**
443     * size
444     */
445    UWORD32 u4_size;
446    /**
447     * error_code
448     */
449    UWORD32 u4_error_code;
450} impeg2d_ctl_set_processor_op_t;
451
452typedef struct
453{
454
455    /**
456     * size
457     */
458    UWORD32 u4_size;
459
460    /**
461     * cmd
462     */
463    IVD_API_COMMAND_TYPE_T e_cmd;
464
465    /**
466     * sub cmd
467     */
468    IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
469} impeg2d_ctl_get_frame_dimensions_ip_t;
470
471typedef struct
472{
473
474    /**
475     * size
476     */
477    UWORD32 u4_size;
478
479    /**
480     * error_code
481     */
482    UWORD32 u4_error_code;
483
484    /**
485     * x_offset[3]
486     */
487    UWORD32 u4_x_offset[3];
488
489    /**
490     * y_offset[3]
491     */
492    UWORD32 u4_y_offset[3];
493
494    /**
495     * disp_wd[3]
496     */
497    UWORD32 u4_disp_wd[3];
498
499    /**
500     * disp_ht[3]
501     */
502    UWORD32 u4_disp_ht[3];
503
504    /**
505     * buffer_wd[3]
506     */
507    UWORD32 u4_buffer_wd[3];
508
509    /**
510     * buffer_ht[3]
511     */
512    UWORD32 u4_buffer_ht[3];
513} impeg2d_ctl_get_frame_dimensions_op_t;
514
515typedef struct
516{
517    /**
518     * size
519     */
520    UWORD32 u4_size;
521
522    /**
523     * cmd
524     */
525    IVD_API_COMMAND_TYPE_T e_cmd;
526
527    /**
528     * sub cmd
529     */
530    IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
531} impeg2d_ctl_get_seq_info_ip_t;
532
533typedef struct
534{
535    /**
536     * size
537     */
538    UWORD32 u4_size;
539
540    /**
541     * error_code
542     */
543    UWORD32 u4_error_code;
544
545    /**
546     * aspect_ratio_information
547     */
548    UWORD8 u1_aspect_ratio_information;
549
550    /**
551     * frame_rate_code
552     */
553    UWORD8 u1_frame_rate_code;
554
555    /**
556     * frame_rate_extension_n
557     */
558    UWORD8 u1_frame_rate_extension_n;
559
560    /**
561     * frame_rate_extension_d
562     */
563    UWORD8 u1_frame_rate_extension_d;
564
565    /**
566     * video_format
567     */
568    UWORD8 u1_video_format;
569
570    /**
571     * colour_primaries
572     */
573    UWORD8 u1_colour_primaries;
574
575    /**
576     * transfer_characteristics
577     */
578    UWORD8 u1_transfer_characteristics;
579
580    /**
581     * matrix_coefficients
582     */
583    UWORD8 u1_matrix_coefficients;
584
585    /**
586     * display_horizontal_size
587     */
588    UWORD16 u2_display_horizontal_size;
589
590    /**
591     * display_vertical_size
592     */
593    UWORD16 u2_display_vertical_size;
594
595} impeg2d_ctl_get_seq_info_op_t;
596#ifdef __cplusplus
597} /* closing brace for extern "C" */
598#endif
599
600#endif /* __IMPEG2D_H__ */
601