• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef __IMPEG2D_STRUCTS_H__
21 #define __IMPEG2D_STRUCTS_H__
22 
23 /* Decoder needs at least 4 reference buffers in order to support format conversion in a thread and
24 to support B pictures. Because of format conversion in a thread, codec delay is now 2 frames instead of 1.
25 To reduce this delay, format conversion has to wait for MB status before converting for B pictures.
26 To avoid this check the delay is increased to 2 and hence number of reference frames minimum is 4.
27 Because of temporal dependency in deinterlacer one additional buffer is also needed */
28 #define NUM_INT_FRAME_BUFFERS                     5
29 
30 
31 #define MAX_WIDTH               4096
32 #define MAX_HEIGHT              2160
33 
34 #define MIN_WIDTH               16
35 #define MIN_HEIGHT              16
36 
37 
38 #define MAX_FRM_SIZE            (MAX_WIDTH * MAX_HEIGHT * 2)  /* Supports only 420P and 422ILE */
39 
40 #define DEC_ORDER               0
41 
42 #define MAX_BITSTREAM_BUFFER_SIZE       2000 * 1024
43 #define MIN_BUFFER_BYTES_AT_EOS 8
44 
45 /* Flag to signal that buffer is held by deinterlacing */
46 #define MPEG2_BUF_MGR_DEINT (BUF_MGR_DISP << 1)
47 
48 typedef enum
49 {
50     CMD_PROCESS,
51     CMD_FMTCONV,
52 }e_jobq_cmd_t;
53 
54 /**
55  * Structure to represent a processing job entry
56  */
57 typedef struct
58 {
59     /**
60      * Command
61      * Currently: PROCESS, FMTCONV are the only two jobs
62      */
63     WORD32 i4_cmd;
64 
65     /**
66      * MB y of the starting MB
67      */
68     WORD16 i2_start_mb_y;
69 
70     /**
71      * MB y of the last MB
72      */
73 
74     WORD16 i2_end_mb_y;
75 
76     /**
77      * Bitstream offset for the current job
78      */
79     WORD32 i4_bistream_ofst;
80 
81 }job_t;
82 
83 typedef struct
84 {
85     /* Params of the reference buffer used as input to MC */
86     UWORD32 u4_src_wd;
87     UWORD32 u4_src_offset;
88 
89     /* Params of the buffer where MC output will be written */
90     UWORD32 u4_dst_wd_res_buf;
91     UWORD32 u4_dst_wd_cur_frm;
92     UWORD32 u4_dst_offset_res_buf;
93     UWORD32 u4_dst_offset_cur_frm;
94 
95     /* Operation Parameters */
96     UWORD32 u4_rows;
97     UWORD32 u4_cols;
98     UWORD32 u4_mode;
99 }comp_mc_params_t;
100 
101 typedef struct
102 {
103     yuv_buf_t        s_ref;
104     comp_mc_params_t s_luma;
105     comp_mc_params_t s_chroma;
106 }mb_mc_params_t;
107 
108 struct _dec_mb_params_t;
109 
110 typedef WORD32 pf_inv_quant_t (WORD16 *blk,
111                                 UWORD8 *weighting_matrix,
112                                 UWORD8 quant_scale,
113                                 WORD32 intra_flag,
114                                 WORD32 i4_num_coeffs,
115                                 WORD16 *pi2_coeffs,
116                                 UWORD8 *pu1_pos,
117                                 const UWORD8   *scan,
118                                 UWORD16 *u2_def_dc_pred,
119                                 UWORD16 u2_intra_dc_precision);
120 
121 typedef IMPEG2D_ERROR_CODES_T  pf_vld_inv_quant_t  (void  *dec,
122                              WORD16       *out_addr,
123                              const UWORD8 *scan,
124                              UWORD16      intra_flag,
125                              UWORD16      colr_comp,
126                              UWORD16      d_picture);
127 
128 typedef void  pf_mc_t(void *, UWORD8 *, UWORD32 , UWORD8 *, UWORD32 ,
129                  UWORD32 , UWORD32  );
130 
131 typedef struct dec_state_struct_t
132 {
133     WORD16          ai2_vld_buf[NUM_PELS_IN_BLOCK];
134     WORD16          ai2_idct_stg1[NUM_PELS_IN_BLOCK];
135 
136 
137     UWORD8          au1_intra_quant_matrix[NUM_PELS_IN_BLOCK];
138     UWORD8          au1_inter_quant_matrix[NUM_PELS_IN_BLOCK];
139 
140     IMPEG2D_ERROR_CODES_T (*pf_decode_slice)(struct dec_state_struct_t *);
141 
142     pf_vld_inv_quant_t *pf_vld_inv_quant;
143 
144     pf_idct_recon_t *pf_idct_recon[4];
145 
146     pf_mc_t         *pf_mc[4];
147     pf_interpred_t  *pf_fullx_halfy_8x8;
148     pf_interpred_t  *pf_halfx_fully_8x8;
149     pf_interpred_t  *pf_halfx_halfy_8x8;
150     pf_interpred_t  *pf_fullx_fully_8x8;
151 
152 
153     pf_interpolate_t *pf_interpolate;
154     pf_copy_mb_t     *pf_copy_mb;
155 
156     pf_memset0_one_16bit_buf_t *pf_memset_16bit_8x8_linear_block;
157     pf_memset_8bit_t    *pf_memset_8bit_8x8_block;
158     pf_copy_yuv420p_buf_t *pf_copy_yuv420p_buf;
159     pf_fmt_conv_yuv420p_to_yuv422ile_t *pf_fmt_conv_yuv420p_to_yuv422ile;
160     pf_fmt_conv_yuv420p_to_yuv420sp_t  *pf_fmt_conv_yuv420p_to_yuv420sp_uv;
161     pf_fmt_conv_yuv420p_to_yuv420sp_t  *pf_fmt_conv_yuv420p_to_yuv420sp_vu;
162 
163     stream_t         s_bit_stream;
164 /* @ */
165 
166     UWORD16         u2_is_mpeg2; /* 0 if stream is MPEG1 1 otherwise */
167     UWORD16         u2_frame_width;  /* Width of the frame */
168     UWORD16         u2_frame_height; /* Height of the frame */
169     UWORD16         u2_picture_width;
170     UWORD16         u2_horizontal_size;
171     UWORD16         u2_vertical_size;
172     UWORD16         u2_create_max_width;
173     UWORD16         u2_create_max_height;
174     UWORD16         u2_reinit_max_width;
175     UWORD16         u2_reinit_max_height;
176     UWORD16         u2_header_done;
177     UWORD16         u2_decode_header;
178 
179     UWORD16         u2_mb_x;
180     UWORD16         u2_mb_y;
181     UWORD16         u2_num_horiz_mb;
182     UWORD16         u2_num_vert_mb;
183     UWORD16         u2_num_flds_decoded;
184     void            *pv_pic_buf_mg;
185 
186     UWORD32         u4_frm_buf_stride; /* for display Buffer */
187 
188     UWORD16         u2_field_dct;
189     UWORD16         u2_read_dct_type;
190 
191     UWORD16         u2_read_motion_type;
192     UWORD16         u2_motion_type;
193 
194     const UWORD16   *pu2_mb_type;
195     UWORD16         u2_fld_pic;
196     UWORD16         u2_frm_pic;
197 
198     yuv_buf_t       s_cur_frm_buf;
199 
200     UWORD16         u2_fld_parity;
201     UWORD16         u2_def_dc_pred[MAX_COLR_COMPS];
202 
203     /* Variables related to Motion Vector predictors */
204 
205     WORD16          ai2_pred_mv[2][2][2];
206     e_pred_direction_t   e_mb_pred;
207     UWORD16         au2_fcode_data[2];
208 
209     /* Variables related to reference pictures */
210     yuv_buf_t       as_recent_fld[2][2];
211 
212     UWORD8          u1_quant_scale;
213     UWORD16         u2_num_mbs_left;
214     UWORD16         u2_first_mb;
215     UWORD16         u2_num_skipped_mbs;
216 
217     UWORD8          *pu1_inv_scan_matrix;
218 
219     UWORD16         u2_progressive_sequence;
220     e_pic_type_t         e_pic_type;
221 
222     UWORD16         u2_full_pel_forw_vector;
223     UWORD16         u2_forw_f_code;
224     UWORD16         u2_full_pel_back_vector;
225     UWORD16         u2_back_f_code;
226 
227     WORD16          ai2_mv[2][2][2]; /* Motion vectors */
228 
229     /* Bitstream code present in Picture coding extension */
230     UWORD16         au2_f_code[2][2];
231     UWORD16         u2_intra_dc_precision;
232     UWORD16         u2_picture_structure;
233     UWORD16         u2_top_field_first;
234     UWORD16         u2_frame_pred_frame_dct;
235     UWORD16         u2_concealment_motion_vectors;
236     UWORD16         u2_q_scale_type;
237     UWORD16         u2_intra_vlc_format;
238     UWORD16         u2_alternate_scan;
239     UWORD16         u2_repeat_first_field;
240     UWORD16         u2_progressive_frame;
241 
242 
243     /* Bitstream code related to frame rate of the bitstream */
244     UWORD16         u2_frame_rate_code;
245     UWORD16         u2_frame_rate_extension_n;
246     UWORD16         u2_frame_rate_extension_d;
247     UWORD16         u2_framePeriod;   /* Frame period in milli seconds */
248 
249     /* Members related to display dimensions of bitstream */
250     /* The size values may not be returned right now. But they are read */
251     /* and can be returned if there is a requirement.                   */
252     UWORD8          u1_video_format;
253     UWORD8          u1_colour_description;
254     UWORD8          u1_colour_primaries;
255     UWORD8          u1_transfer_characteristics;
256     UWORD8          u1_matrix_coefficients;
257     UWORD16         u2_display_horizontal_size;
258     UWORD16         u2_display_vertical_size;
259     UWORD16         u2_aspect_ratio_info;
260 
261     /* Members related to motion compensation */
262     yuv_buf_t       s_mc_fw_buf;
263     yuv_buf_t       s_mc_bk_buf;
264     yuv_buf_t       s_mc_buf;
265     mb_mc_params_t  as_mb_mc_params[2][2];
266     yuv_buf_t       as_ref_buf[2][2];
267     e_mb_type_t       s_mb_type;
268 
269     yuv_buf_t       s_dest_buf;
270 
271     /* Variable to handle intra MB */
272     UWORD16         u2_prev_intra_mb;
273     UWORD16         u2_coded_mb;
274 
275     /* Bidirect function pointers */
276     const struct _dec_mb_params_t *ps_func_bi_direct;
277 
278     /* Forw or Back function pointers */
279     const struct _dec_mb_params_t *ps_func_forw_or_back;
280 
281 
282     /* CBP of the current MB        */
283     UWORD16         u2_cbp;
284     void            *pv_video_scratch;
285 
286 
287     /* For global error handling */
288     void            *pv_stack_cntxt;
289 
290 /* @ */
291     WORD32          i4_chromaFormat;
292     UWORD32         u4_xdmBufID;
293     UWORD32         u4_num_mem_records;
294     /* For holding memRecords */
295     void            *pv_memTab;
296 
297     UWORD8          u1_flushfrm;
298     UWORD8          u1_flushcnt;
299     iv_yuv_buf_t    as_frame_buf[MAX_FRAME_BUFFER];
300     iv_yuv_buf_t    ps_yuv_buf;
301 
302     ivd_get_display_frame_op_t  s_disp_op;
303 
304 
305     UWORD32         u4_non_zero_cols;
306     UWORD32         u4_non_zero_rows;
307 
308     UWORD32         u4_num_frames_decoded;
309 
310     /* Adding error code variable to signal benign errors. */
311     UWORD32         u4_error_code;
312 
313     WORD32          i4_num_cores;
314 
315     UWORD8          u1_first_frame_done;
316 
317     void            *pv_codec_thread_handle;
318     void            *ps_dec_state_multi_core;
319 #ifdef KEEP_THREADS_ACTIVE
320     UWORD32         currThreadId;
321     /**
322      * Condition variable to signal process start
323      */
324     void *pv_proc_start_condition;
325 
326     /**
327      * Mutex used to keep the functions thread-safe
328      */
329     void *pv_proc_start_mutex;
330 
331     /**
332      * Condition variable to signal process done
333      */
334     void *pv_proc_done_condition;
335 
336     /**
337      * Mutex used to keep the functions thread-safe
338      */
339     void *pv_proc_done_mutex;
340 
341     /**
342      * Process state start- One for each thread
343      */
344     WORD32 ai4_process_start;
345 
346     /**
347      * Process state end- One for each thread
348      */
349     WORD32 ai4_process_done;
350 #endif
351     UWORD32         u4_inp_ts;
352     pic_buf_t       *ps_cur_pic;
353     pic_buf_t       *ps_disp_pic;
354     pic_buf_t       *aps_ref_pics[2];
355 
356     WORD32          i4_disp_buf_id;
357     WORD32          i4_cur_buf_id;
358     iv_yuv_buf_t    *ps_disp_frm_buf;
359 
360     UWORD32         u4_share_disp_buf;
361     void            *pv_pic_buf_base;
362 
363     disp_mgr_t      s_disp_mgr;
364     UWORD8          *pu1_chroma_ref_buf[BUF_MGR_MAX_CNT];
365     ivd_out_bufdesc_t as_disp_buffers[BUF_MGR_MAX_CNT];
366 
367     /* Count the number of pictures decoded after init/reset */
368     WORD32          i4_pic_count;
369 
370     /* Flag to signal last coeff in a 8x8 block is one
371     after mismatch contol */
372     WORD32          i4_last_value_one;
373 
374     WORD32          i4_start_mb_y;
375     WORD32          i4_end_mb_y;
376 
377     /* Buffer to store the input stream */
378     UWORD8 *pu1_input_buffer;
379 
380     /**
381      * Job queue buffer base
382      */
383     void            *pv_jobq_buf;
384 
385     /**
386      * Job Queue mem tab size
387      */
388     WORD32          i4_jobq_buf_size;
389 
390     /**
391      * Job Queue context
392      */
393     void            *pv_jobq;
394 
395     /* Pointer to input bitstream */
396     UWORD8          *pu1_inp_bits_buf;
397 
398     /* Number of bytes in the input bitstream */
399     UWORD32         u4_num_inp_bytes;
400 
401     ivd_out_bufdesc_t *ps_out_buf;
402 
403     /* Bytes consumed */
404     WORD32          i4_bytes_consumed;
405 
406     IVD_ARCH_T      e_processor_arch;
407 
408     IVD_SOC_T       e_processor_soc;
409 
410     WORD32          i4_frame_decoded;
411 
412     /** Flag to enable deinterlace */
413     UWORD32          u4_deinterlace;
414 
415     /** Deinterlacer context */
416     void            *pv_deinterlacer_ctxt;
417 
418     /** Picture buffer held by deinterlacer */
419     pic_buf_t       *ps_deint_pic;
420 
421     /** Buffer used after deinterlacer for format conversion */
422     UWORD8          *pu1_deint_fmt_buf;
423 
424     /** Flag to indicate if Seq Display Extn is present */
425     UWORD8          u1_seq_disp_extn_present;
426 }dec_state_t;
427 
428 
429 
430 
431 typedef void (*func_decmb_params)(dec_state_t *);
432 typedef void  (*mc_funcs)(dec_state_t *);
433 typedef struct _dec_mb_params_t
434 {
435     func_decmb_params    pf_func_mb_params;
436     e_mb_type_t            s_mb_type;
437     mc_funcs             pf_mc;
438 }dec_mb_params_t;
439 
440 
441 
442 #define MAX_THREADS     4
443 
444 
445 #define MAX_MB_ROWS     (MAX_HEIGHT / 16) // number of rows for 1080p
446 
447 typedef struct _dec_state_multi_core
448 {
449     // contains the decoder state of decoder for each of the max (MAX_THREADS-1) threads
450     // ps_dec_state[0] and au4_thread_launched[0] are used for main thread
451     dec_state_t *ps_dec_state[MAX_THREADS];
452     UWORD32     au4_thread_launched[MAX_THREADS];
453     // number of rows: first thread will populate the row offsets and update
454     // row_offset_cnt. Other threads should pick up offset from this thread
455     // and start decoding
456     UWORD32     au4_row_offset[MAX_MB_ROWS];
457     volatile    UWORD32 u4_row_offset_cnt;
458 #ifdef KEEP_THREADS_ACTIVE
459     /**
460      * Flag to signal processing thread to exit
461      */
462     WORD32 i4_break_threads;
463 #endif
464 }dec_state_multi_core_t;
465 
466 
467 
468 #endif /* #ifndef __IMPEG2D_STRUCTS_H__ */
469