1 /*
2  * Copyright ©  2014 Intel Corporation
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 PRECISION INSIGHT 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  * Authors:
25  *     Midhunchandra Kodiyath <midhunchandra.kodiyath@intel.com>
26  *
27  */
28 
29 #ifndef _MEDIA__DRIVER_ENCODER_H
30 #define _MEDIA__DRIVER_ENCODER_H
31 #include "media_drv_init.h"
32 #include "media_drv_gpe_utils.h"
33 #include "media_drv_util.h"
34 #include "media_drv_hw.h"
35 //#define WIDTH_IN_MACROBLOCKS(width)      (((width) + (16 - 1)) / 16)
36 //#define HEIGHT_IN_MACROBLOCKS(height)    (((height) + (16 - 1)) / 16)
37 
38 #define HB_BRC_NONE	0
39 #define HB_BRC_CBR	1
40 #define HB_BRC_VBR	2
41 #define HB_BRC_CQP	3
42 
43 typedef struct _scaling_kernel_params
44 {
45   bool scaling_16x_en;
46   bool scaling_32x_en;
47 } SCALING_KERNEL_PARAMS;
48 
49 typedef struct _mbpak_context
50 {
51   MEDIA_GPE_CTX gpe_context;
52   MEDIA_GPE_CTX gpe_context2;
53   MEDIA_RESOURCE row_buffer_y;
54   MEDIA_RESOURCE row_buffer_uv;
55   MEDIA_RESOURCE column_buffer_y;
56   MEDIA_RESOURCE column_buffer_uv;
57   MEDIA_RESOURCE kernel_dump_buffer;
58   SURFACE_STATE_BINDING_TABLE surface_state_binding_table_mbpak_p1;
59   SURFACE_STATE_BINDING_TABLE surface_state_binding_table_mbpak_p2;
60 } MBPAK_CONTEXT;
61 
62 typedef struct _mbenc_context
63 {
64   MEDIA_GPE_CTX gpe_context;
65   MEDIA_RESOURCE mb_mode_cost_luma_buffer;
66   MEDIA_RESOURCE block_mode_cost_buffer;
67   MEDIA_RESOURCE chroma_reconst_buffer;
68   MEDIA_RESOURCE histogram_buffer;
69   MEDIA_RESOURCE kernel_dump_buffer;
70   MEDIA_RESOURCE ref_frm_count_surface;
71   MEDIA_RESOURCE pred_mv_data_surface;
72   MEDIA_RESOURCE mode_cost_update_surface;
73   MEDIA_RESOURCE pred_mb_quant_data_surface;
74   SURFACE_STATE_BINDING_TABLE surface_state_binding_table_mbenc_p1;
75   SURFACE_STATE_BINDING_TABLE surface_state_binding_table_mbenc_p2;
76   SURFACE_STATE_BINDING_TABLE surface_state_binding_table_mbenc_iframe_dist;
77 } MBENC_CONTEXT;
78 
79 typedef struct _me_context
80 {
81   MEDIA_GPE_CTX gpe_context;
82   MEDIA_RESOURCE mv_distortion_surface_4x_me;
83   MEDIA_RESOURCE mv_data_surface_16x_me;
84   MEDIA_RESOURCE mv_data_surface_4x_me;
85   SURFACE_STATE_BINDING_TABLE surface_state_binding_table_4x_me;
86   SURFACE_STATE_BINDING_TABLE surface_state_binding_table_16x_me;
87 } ME_CONTEXT;
88 
89 typedef struct _scaling_context
90 {
91   MEDIA_GPE_CTX gpe_context;
92   MEDIA_RESOURCE scaled_32x_surface;
93   MEDIA_RESOURCE scaled_16x_surface;
94   MEDIA_RESOURCE scaled_4x_surface;
95   SURFACE_STATE_BINDING_TABLE surface_state_binding_table_scaling;
96   SURFACE_STATE_BINDING_TABLE surface_state_binding_table_scaling_16x;
97 } SCALING_CONTEXT;
98 typedef struct _brc_init_reset_context
99 {
100   MEDIA_GPE_CTX gpe_context;
101   MEDIA_RESOURCE brc_distortion;
102   MEDIA_RESOURCE brc_history;
103   MEDIA_RESOURCE brc_pak_qp_input_table;
104   MEDIA_RESOURCE brc_constant_data;
105   MEDIA_RESOURCE brc_constant_buffer[NUM_BRC_CONSTANT_DATA_BUFFERS];
106   SURFACE_STATE_BINDING_TABLE surface_state_binding_table_brc_init_reset;
107 } BRC_INIT_RESET_CONTEXT;
108 
109 typedef struct _brc_update_context
110 {
111   MEDIA_GPE_CTX gpe_context;
112   SURFACE_STATE_BINDING_TABLE surface_state_binding_table_brc_update;
113 } BRC_UPDATE_CONTEXT;
114 
115 typedef struct media_encoder_ctx
116 {
117   struct hw_context base;
118   int codec;
119   VASurfaceID input_yuv_surface;
120   int is_tmp_id;
121   unsigned int rate_control_mode;
122   unsigned int internal_rate_mode;
123   ME_CONTEXT me_context;
124   MBENC_CONTEXT mbenc_context;
125   MBPAK_CONTEXT mbpak_context;
126   SCALING_CONTEXT scaling_context;
127   BRC_INIT_RESET_CONTEXT brc_init_reset_context;
128   BRC_UPDATE_CONTEXT brc_update_context;
129   int num_of_kernels;
130   unsigned int walker_mode;
131   unsigned int kernel_mode;
132   bool use_hw_scoreboard;
133   int frame_width;
134   int frame_height;
135   int picture_width;
136   int picture_height;
137   int picture_width_in_mbs;
138   int picture_height_in_mbs;
139   int down_scaled_width_mb4x;
140   int down_scaled_height_mb4x;
141   int down_scaled_width_mb16x;
142   int down_scaled_height_mb16x;
143   int down_scaled_width_mb32x;
144   int down_scaled_height_mb32x;
145 
146   int down_scaled_frame_field_height_mb4x;
147   int down_scaled_frame_field_width_mb4x;
148   int down_scaled_frame_field_height_mb16x;
149   int down_scaled_frame_field_width_mb16x;
150   int down_scaled_frame_field_height_mb32x;
151   int down_scaled_frame_field_width_mb32x;
152   unsigned int ref_frame_ctrl;
153   unsigned int pic_coding_type;
154   bool hme_supported;
155   bool scaling_enabled;
156   bool me_16x_supported;
157   bool brc_enabled;
158   bool brc_mb_enabled;
159   bool brc_initted;
160   bool brc_need_reset;
161   bool brc_distortion_buffer_supported;
162   bool brc_constant_buffer_supported;
163   bool init_brc_distortion_buffer;
164 
165   //bool hme_enabled;
166   //bool me_16x_enabled;
167   //bool hme_done;
168   //bool me_16x_done;
169   bool kernel_dump_enable;
170   bool mbenc_chroma_kernel;
171   bool mbenc_curbe_set_brc_update;
172   bool mbpak_curbe_set_brc_update;
173   bool disable_multi_ref;
174   unsigned int mv_offset;
175   unsigned int mv_in_bytes;
176   unsigned int mb_data_offset;
177   unsigned int mb_data_in_bytes;
178   unsigned int frame_num;
179   UINT frame_rate;
180   UINT16 avbr_accuracy; /* ignore ??? */
181   UINT16 avbr_convergence; /* ignore ??? */
182   DOUBLE brc_init_current_target_buf_full_in_bits;
183   DOUBLE brc_init_reset_input_bits_per_frame;
184   UINT brc_init_reset_buf_size_in_bits;
185   UINT target_bit_rate;
186   UINT prev_target_bit_rate;
187   UINT max_bit_rate;
188   UINT min_bit_rate;
189   UINT gop_pic_size;
190   ULONG init_vbv_buffer_fullness_in_bit;
191   ULONG vbv_buffer_size_in_bit;
192   MEDIA_FRAME_UPDATE frame_update;
193 
194   void (*set_curbe_i_vp8_mbenc) (struct encode_state * encode_state,
195 				 MEDIA_MBENC_CURBE_PARAMS_VP8 * params);
196   void (*set_curbe_p_vp8_mbenc) (struct encode_state * encode_state,
197 				 MEDIA_MBENC_CURBE_PARAMS_VP8 * params);
198   void (*surface_state_vp8_mbenc) (struct media_encoder_ctx * encoder_context,
199 				   struct encode_state * encode_state,
200 				   MBENC_SURFACE_PARAMS_VP8 *
201 				   mbenc_sutface_params);
202   void (*surface_state_vp8_mbpak) (struct media_encoder_ctx * encoder_context,
203 				   struct encode_state * encode_state,
204 				   MBPAK_SURFACE_PARAMS_VP8 *
205 				   mbpak_sutface_params);
206   void (*set_curbe_vp8_mbpak) (struct encode_state * encode_state,
207 			       MEDIA_MBPAK_CURBE_PARAMS_VP8 * params);
208   void (*set_curbe_vp8_brc_init_reset) (struct encode_state *encode_state,
209 					MEDIA_BRC_INIT_RESET_PARAMS_VP8 * params);
210   void (*surface_state_vp8_brc_init_reset) (struct media_encoder_ctx * encoder_context,
211 					    struct encode_state *encode_state,
212 					    BRC_INIT_RESET_SURFACE_PARAMS_VP8 *surface_params);
213   void (*set_curbe_vp8_brc_update) (struct encode_state *encode_state,
214 					  MEDIA_BRC_UPDATE_PARAMS_VP8 * params);
215   void (*surface_state_vp8_brc_update) (struct media_encoder_ctx * encoder_context,
216 					struct encode_state *encode_state,
217 					BRC_UPDATE_SURFACE_PARAMS_VP8 *surface_params);
218   void (*init_brc_update_constant_data_vp8)(BRC_UPDATE_CONSTANT_DATA_PARAMS_VP8 *params);
219   void (*media_add_surface_state) (SURFACE_SET_PARAMS * params);
220   void (*media_add_binding_table) (MEDIA_GPE_CTX * gpe_ctx);
221   void (*media_object_walker_pak_init)(UINT pak_phase_type,struct media_encoder_ctx * encoder_context,MEDIA_OBJ_WALKER_PARAMS *media_obj_walker_params);
222   void (*media_object_walker_mbenc_init)(BOOL mbenc_i_frame_dist_in_use,BOOL mbenc_phase_2,struct media_encoder_ctx * encoder_context,MEDIA_OBJ_WALKER_PARAMS *media_obj_walker_params);
223   void (*gpe_context_vfe_scoreboardinit_pak_p1) (struct media_encoder_ctx * encoder_context,MEDIA_GPE_CTX * gpe_context);
224   void (*gpe_context_vfe_scoreboardinit_pak_p2) (struct media_encoder_ctx * encoder_context,MEDIA_GPE_CTX * gpe_context);
225   STATUS (*mediadrv_gen_state_base_address_cmd) (MEDIA_BATCH_BUFFER * batch,STATE_BASE_ADDR_PARAMS * params);
226   STATUS (*mediadrv_gen_media_vfe_state_cmd) (MEDIA_BATCH_BUFFER * batch,VFE_STATE_PARAMS * params);
227    STATUS (*media_object_walker_cmd) (MEDIA_BATCH_BUFFER * batch,MEDIA_OBJ_WALKER_PARAMS * params);
228   STATUS (*set_curbe_scaling) (MEDIA_GPE_CTX * gpe_context, SCALING_CURBE_PARAMS * params);
229   void (*surface_state_scaling) (struct media_encoder_ctx * encoder_context, SCALING_SURFACE_PARAMS * scaling_sutface_params);
230   void (*set_curbe_vp8_me) (VP8_ME_CURBE_PARAMS * params);
231   void (*surface_state_vp8_me) (struct media_encoder_ctx * encoder_context,
232 				struct encode_state *encode_state,
233 				ME_SURFACE_PARAMS_VP8 * me_sutface_params);
234   void (*initialize_brc_distortion_buffer) (struct media_encoder_ctx * encoder_context);
235 
236 } MEDIA_ENCODER_CTX;
237 
238 typedef struct media_encoder_vp8_surface
239 {
240   VADriverContextP ctx;
241   VASurfaceID scaled_4x_surface_id;
242   struct object_surface *scaled_4x_surface_obj;
243   VASurfaceID scaled_16x_surface_id;
244   struct object_surface *scaled_16x_surface_obj;
245   unsigned int qp_index;
246 } MEDIA_ENCODER_VP8_SURFACE;
247 
248 void
249 media_alloc_resource_scaling (VADriverContextP ctx,
250 			      MEDIA_ENCODER_CTX * encoder_context);
251 VOID
252 media_alloc_resource_me (VADriverContextP ctx,
253 			 MEDIA_ENCODER_CTX * encoder_context);
254 
255 void
256 media_encode_mb_layout_vp8 (MEDIA_ENCODER_CTX * encoder_context, void *data,
257 			    UINT * data_size);
258 struct hw_context *media_enc_context_init (VADriverContextP ctx,
259 					   struct object_config *obj_config,
260 					   int picture_width,
261 					   int picture_height);
262 VAStatus
263 media_encoder_picture (VADriverContextP ctx,
264 		       VAProfile profile,
265 		       union codec_state *codec_state,
266 		       struct hw_context *hw_context);
267 void
268 gpe_context_vfe_scoreboardinit_pak_p1 (MEDIA_ENCODER_CTX * encoder_context,MEDIA_GPE_CTX * gpe_context);
269 void
270 gpe_context_vfe_scoreboardinit_pak_p2 (MEDIA_ENCODER_CTX * encoder_context,MEDIA_GPE_CTX * gpe_context);
271 #endif
272