1 /******************************************************************************
2  *
3  * Copyright (C) 2018 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 ihevce_plugin_priv.h
23 *
24 * \brief
25 *    This file contains sample application definations and structures
26 *
27 * \date
28 *    15/04/2014
29 *
30 * \author
31 *    Ittiam
32 *
33 *
34 * List of Functions
35 *
36 *
37 ******************************************************************************
38 */
39 #ifndef _IHEVCE_PLUGIN_PRIV_H_
40 #define _IHEVCE_PLUGIN_PRIV_H_
41 
42 /*****************************************************************************/
43 /* File Includes                                                             */
44 /*****************************************************************************/
45 
46 /*****************************************************************************/
47 /* Constant Macros                                                           */
48 /*****************************************************************************/
49 
50 #define XTRA_INP_DATA_BUFS 0
51 #define MAX_NUM_INP_DATA_BUFS MAX_SUB_GOP_SIZE + NUM_LAP2_LOOK_AHEAD
52 #define MAX_NUM_INP_CTRL_SYNC_BUFS MAX_NUM_INP_DATA_BUFS
53 #define MAX_NUM_INP_CTRL_ASYNC_BUFS 5
54 
55 #define XTRA_OUT_DATA_BUFS 0
56 #define MAX_NUM_OUT_DATA_BUFS (16 + XTRA_OUT_DATA_BUFS)
57 #define MAX_NUM_OUT_CTRL_ASYNC_BUFS 16
58 
59 #define MAX_NUM_RECON_DATA_BUFS 64
60 
61 /** Queue from Master to Slave for MBR/MRES cases **/
62 #define MBR_M2S_QUEUE 200
63 
64 /*****************************************************************************/
65 /* Function Macros                                                           */
66 /*****************************************************************************/
67 #define SET_CTB_ALIGN(x, y) ((((x) & ((y)-1)) == 0) ? 0 : (y) - ((x) & ((y)-1)))
68 
69 /*****************************************************************************/
70 /* Typedefs                                                                  */
71 /*****************************************************************************/
72 
73 /*****************************************************************************/
74 /* Enums                                                                     */
75 /*****************************************************************************/
76 
77 /*****************************************************************************/
78 /* Structure                                                                 */
79 /*****************************************************************************/
80 
81 /**
82 *  @brief  Store output buffer parameters
83 */
84 typedef struct
85 {
86     UWORD8 *pu1_bs_buffer;
87     WORD32 i4_bytes_generated;
88     WORD32 i4_is_key_frame;
89     ULWORD64 u8_pts;
90     LWORD64 i8_dts;
91 } bitstream_buf_t;
92 
93 /**
94 *  @brief  Store buffer queue parameters
95 */
96 typedef struct
97 {
98     /******* Buffer q indexes *******/
99     WORD32 i4_q_rd_idx;
100     WORD32 i4_q_wr_idx;
101     WORD32 i4_quit;
102     WORD32 i4_q_size;
103 
104     /******* Semaphore Handles ******/
105     void *pv_q_deq_sem_handle;
106     void *pv_rel_free_sem_handle;
107 } queue_t;
108 
109 /**
110 *  @brief  Datatype of global pointer used for data sharing
111 *          across encoder nodes.
112 */
113 
114 typedef struct
115 {
116     queue_t s_queue_params;
117     bitstream_buf_t bs_buf_nodes[MBR_M2S_QUEUE];
118     WORD32 i4_slave_inst_done;
119 
120 } ihevce_mbr_mres_handle_t;
121 
122 typedef struct
123 {
124     WORD32 i4_idx;
125 
126     UWORD8 *pu1_buf;
127 
128     WORD32 i4_is_free;
129 
130     WORD32 i4_is_prod;
131 
132     WORD32 i4_timestamp_low;
133 
134     WORD32 i4_timestamp_high;
135 
136     WORD32 i4_bytes_gen;
137 
138     WORD32 i4_is_key_frame;
139 
140     WORD32 i4_buf_size;
141 
142     WORD32 i4_end_flag;
143 
144 } out_buf_ctxt_t;
145 
146 typedef struct
147 {
148     ULWORD64 u8_total_bits;
149 
150     UWORD32 u4_num_frms_enc;
151 
152     /* mutex controlling the out strm buf b/w appln and encoder */
153     void *pv_app_out_strm_buf_mutex_hdl;
154 
155     void *pv_app_out_strm_buf_cond_var_hdl;
156 
157 } out_strm_prms_t;
158 
159 typedef struct
160 {
161     void *pv_mem_mngr_handle; /*!< memory manager handle */
162 
163     WORD32 ai4_out_strm_end_flag[IHEVCE_MAX_NUM_RESOLUTIONS]
164                                 [IHEVCE_MAX_NUM_BITRATES]; /*!< end of strm processing */
165 
166     out_strm_prms_t as_out_strm_prms[IHEVCE_MAX_NUM_RESOLUTIONS]
167                                     [IHEVCE_MAX_NUM_BITRATES]; /*!< to store out strm related prms */
168 
169 } app_ctxt_t;
170 
171 typedef struct
172 {
173     /*!< Static paramters same memory pointer will be passed to
174          processing interface layer */
175     ihevce_static_cfg_params_t *ps_static_cfg_prms;
176 
177     /*!< Osal Handle */
178     void *pv_osal_handle;
179 
180     /*!< Call back API for freeing */
181     void (*ihevce_mem_free)(void *pv_handle, void *pv_mem);
182 
183     /*!< Call back API to be called during allocation */
184     void *(*ihevce_mem_alloc)(void *pv_handle, UWORD32 u4_size);
185 
186     /** App context memory */
187     app_ctxt_t s_app_ctxt;
188 
189     /** semaphore handle for Input data proc thread */
190     void *pv_app_inp_ctrl_sem_hdl;
191 
192     /** semaphore handle for Output data proc thread */
193     void *pv_app_out_sts_sem_hdl;
194 
195     /** Pointer to HLE interface ctxt */
196     void *pv_hle_interface_ctxt;
197 
198     /** Memtab of input buffers */
199     iv_mem_rec_t s_memtab_inp_data_buf;
200 
201     /** Memtab of input command buffers */
202     iv_mem_rec_t s_memtab_inp_sync_ctrl_buf;
203 
204     /** Array of memtabs of outptu buffers */
205     iv_mem_rec_t as_memtab_out_data_buf[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES];
206 
207     /* pointer to async command input buffer */
208     UWORD8 *pu1_inp_async_ctrl_buf;
209 
210     /* pointer to async command output buffer*/
211     UWORD8 *pu1_out_ctrl_buf;
212 
213     /* HLE thread handle */
214     void *pv_hle_thread_hdl;
215 
216     /* flag to indicate that flush mode is ON */
217     WORD32 i4_flush_mode_on;
218 
219     /* field id for interlaced case */
220     WORD32 i4_field_id;
221 
222     /* frame stride of input buffers */
223     WORD32 i4_frm_stride;
224 
225     /* flag to indicate Output end status */
226     WORD32 ai4_out_end_flag[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES];
227 
228     /* output buffer context */
229     out_buf_ctxt_t aaas_out_bufs[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES]
230                                 [MAX_NUM_OUT_DATA_BUFS + 1];
231 
232     /* Num Output buffers */
233     WORD32 i4_num_out_bufs;
234 
235     /* Free outbuf idx */
236     WORD32 ai4_free_out_buf_idx[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES];
237 
238     /* Out produced idx */
239     WORD32 i4_prod_out_buf_idx;
240 
241     /* DTS for output population */
242     LWORD64 i8_dts;
243 
244     /* Flag used for flushing in case of EVAL version */
245     WORD32 i4_internal_flush;
246 
247     ULWORD64 u8_num_frames_encoded;
248 
249     /* Count no of frames queued */
250     ULWORD64 u8_num_frames_queued;
251 
252     /** Structure which contains params to be shared across different FFMPEG instances **/
253     ihevce_mbr_mres_handle_t
254         *ps_mbr_mres_handle[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES];
255 
256     /* Dynamic change in bitrate detecting mechnaism related vaiables */
257     WORD32 ai4_old_bitrate[IHEVCE_MAX_NUM_RESOLUTIONS][IHEVCE_MAX_NUM_BITRATES];
258 
259 } plugin_ctxt_t;
260 
261 /*****************************************************************************/
262 /* Extern Variable Declarations                                              */
263 /*****************************************************************************/
264 
265 /*****************************************************************************/
266 /* Extern Function Declarations                                              */
267 /*****************************************************************************/
268 
269 #endif /* _IHEVCE_PLUGIN_PRIV_H_ */
270