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