1 /* 2 * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 3 * Copyright (c) Imagination Technologies Limited, UK 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sub license, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the 14 * next paragraph) shall be included in all copies or substantial portions 15 * of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 21 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 * 25 * Authors: 26 * Zeng Li <zeng.li (at) intel.com> 27 * Shengquan Yuan <shengquan.yuan (at) intel.com> 28 * Binglin Chen <binglin.chen (at) intel.com> 29 * 30 */ 31 32 33 #include "img_types.h" 34 #include "psb_drv_video.h" 35 #include "psb_surface.h" 36 #include "lnc_cmdbuf.h" 37 38 #define MAX_SLICES_PER_PICTURE 72 39 40 #define CODED_BUFFER_EOSEQ_FLAG (0x1u<<0) 41 #define CODED_BUFFER_EOSTREAM_FLAG (0x1u<<1) 42 43 /* commands for topaz,shared with user space driver */ 44 enum drm_lnc_topaz_cmd { 45 MTX_CMDID_NULL = 0, 46 MTX_CMDID_DO_HEADER = 1, 47 MTX_CMDID_ENCODE_SLICE = 2, 48 MTX_CMDID_WRITEREG = 3, 49 MTX_CMDID_START_PIC = 4, 50 MTX_CMDID_END_PIC = 5, 51 MTX_CMDID_SYNC = 6, 52 MTX_CMDID_ENCODE_ONE_ROW = 7, 53 MTX_CMDID_FLUSH = 8, 54 MTX_CMDID_SW_LEAVE_LOWPOWER = 0x7c, 55 MTX_CMDID_SW_ENTER_LOWPOWER = 0x7e, 56 MTX_CMDID_SW_NEW_CODEC = 0x7f 57 }; 58 59 /* codecs topaz supports,shared with user space driver */ 60 enum drm_lnc_topaz_codec { 61 IMG_CODEC_JPEG = 0, 62 IMG_CODEC_H264_NO_RC, 63 IMG_CODEC_H264_VBR, 64 IMG_CODEC_H264_CBR, 65 IMG_CODEC_H264_VCM, 66 IMG_CODEC_H263_NO_RC, 67 IMG_CODEC_H263_VBR, 68 IMG_CODEC_H263_CBR, 69 IMG_CODEC_MPEG4_NO_RC, 70 IMG_CODEC_MPEG4_VBR, 71 IMG_CODEC_MPEG4_CBR, 72 IMG_CODEC_NUM 73 }; 74 75 typedef enum _img_format_ { 76 IMG_CODEC_IYUV, /* IYUV */ 77 IMG_CODEC_IMC2, /* IMC2 */ 78 IMG_CODEC_PL8, 79 IMG_CODEC_PL12, 80 IMG_CODEC_NV12, 81 } IMG_FORMAT; 82 83 84 typedef struct _RC_PARAMS_ { 85 IMG_UINT32 BitsPerSecond; 86 IMG_UINT32 InitialQp; 87 IMG_UINT32 BUSize; 88 IMG_UINT32 FrameRate; 89 IMG_UINT32 BufferSize; 90 IMG_UINT32 BitsConsumed; 91 IMG_UINT32 IntraFreq; 92 IMG_UINT16 IDRFreq; 93 94 IMG_UINT16 MinQP; 95 IMG_BOOL RCEnable; 96 IMG_BOOL FrameSkip; 97 98 IMG_UINT8 Slices; 99 IMG_UINT8 VCMBitrateMargin; 100 IMG_UINT32 InitialLevel; 101 IMG_UINT32 InitialDelay; 102 } IMG_RC_PARAMS; 103 104 /*! 105 ***************************************************************************** 106 * 107 * @Description Struct describing rate control input parameters 108 * 109 * @Brief Rate control input parameters 110 * 111 ****************************************************************************/ 112 typedef struct { 113 IMG_UINT8 SeInitQP; //!< Initial QP for Sequence 114 IMG_UINT8 MinQPVal; //!< Minimum QP value to use 115 IMG_UINT8 MaxQPVal; //!< Maximum QP value to use 116 117 IMG_UINT8 MBPerRow; /* Number of MBs Per Row */ 118 IMG_UINT16 MBPerFrm; /* Number of MBs Per Frame */ 119 IMG_UINT16 MBPerBU; /* Number of MBs Per BU */ 120 IMG_UINT16 BUPerFrm; /* Number of BUs Per Frame */ 121 122 IMG_UINT16 IntraPeriod; /* Intra frame frequency */ 123 124 IMG_INT32 BitsPerFrm; /* Bits Per Frame */ 125 IMG_INT32 BitsPerBU; /* Bits Per BU */ 126 IMG_INT32 BitsPerMB; /* Bits Per MB */ 127 128 IMG_INT32 BitRate; /* Bit Rate (bps) */ 129 IMG_INT32 BufferSize; /* Size of Buffer */ 130 IMG_UINT32 InitialLevel; /* Initial Level of Buffer */ 131 IMG_INT32 InitialDelay; /* Initial Delay of Buffer */ 132 133 IMG_UINT8 ScaleFactor; /* Scale Factor (H264 only) */ 134 IMG_UINT8 VCMBitrateMargin; /* Bitrate that should be 135 targetted as a fraction of 136 128 relative to maximum bitrate 137 i32BitRate (VCM mode only) */ 138 IMG_UINT8 HalfFrameRate; /* Half Frame Rate (MP4 only) */ 139 IMG_UINT8 FCode; /* F Code (MP4 only) */ 140 141 /* TO BE DELETED -- ONCE MP4 RC CODE IS OPTIMISED */ 142 IMG_INT32 BitsPerGOP; /* Bits Per GOP (MP4 only) */ 143 IMG_UINT16 AvQPVal; /* Average QP in Current Picture */ 144 IMG_UINT16 MyInitQP; /* Initial Quantizer */ 145 146 IMG_INT32 ForceSkipMargin; /* The number of bits of margin 147 to leave before forcing skipped 148 macroblocks (VCM mode only) */ 149 IMG_UINT32 RCScaleFactor; /* A constant used in rate control = (GopSize/(BufferSize-InitialLevel))*256 */ 150 } IN_RC_PARAMS; 151 152 struct coded_buf_aux_info { 153 object_buffer_p buf; 154 uint32_t aux_flag; /*Indicate which operation should be applied when map coded buffer.*/ 155 struct coded_buf_aux_info *next; 156 }; 157 158 struct context_ENC_s { 159 object_context_p obj_context; /* back reference */ 160 161 IMG_UINT32 Width; 162 IMG_UINT32 Height; 163 IMG_UINT16 RawWidth; 164 IMG_UINT16 RawHeight; 165 IMG_UINT16 Slices; 166 enum drm_lnc_topaz_codec eCodec; 167 IMG_FORMAT eFormat; 168 unsigned int FCode; 169 IMG_RC_PARAMS sRCParams; 170 171 IMG_INT16 HeightMinus16MinusLRBTopOffset; 172 IMG_INT16 HeightMinus32MinusLRBTopOffset; 173 IMG_INT16 HeightMinusLRB_TopAndBottom_OffsetsPlus16; 174 IMG_INT16 HeightMinusLRBSearchHeight; 175 IMG_UINT32 IPEControl; 176 177 object_surface_p src_surface; 178 object_surface_p ref_surface; 179 object_surface_p dest_surface;/* reconstructed surface */ 180 object_buffer_p coded_buf; 181 182 /* save previous settings */ 183 object_surface_p previous_src_surface; 184 object_surface_p previous_ref_surface; 185 object_surface_p previous_dest_surface; /* reconstructed surface */ 186 object_buffer_p previous_coded_buf; 187 object_buffer_p pprevious_coded_buf; 188 189 /* point to the place in cmdbuf following START_PIC, the initial_qp will fill into it later */ 190 uint32_t *initial_qp_in_cmdbuf; 191 192 193 /* global topaz_params buffer shared by every cmdbuffer 194 * it is because filling InParams for every MB is very time-consuming 195 * and in most cases, we can reuse previous frames buffer 196 */ 197 /* 0 and 1 are for in_parms, 2 is for bellow and above params*/ 198 struct psb_buffer_s topaz_in_params_I; 199 struct psb_buffer_s topaz_in_params_P; 200 struct psb_buffer_s topaz_above_bellow_params; 201 uint32_t topaz_buffer_size; 202 uint32_t in_params_size; 203 uint32_t bellow_params_size; 204 uint32_t above_params_size; 205 206 /* offset in topaz_param buffer */ 207 uint32_t in_params_ofs; 208 uint32_t bellow_params_ofs; 209 uint32_t above_params_ofs; 210 211 uint32_t pic_params_size; 212 213 uint32_t header_buffer_size; 214 215 uint32_t seq_header_ofs; 216 uint32_t pic_header_ofs; 217 uint32_t eoseq_header_ofs; 218 uint32_t eostream_header_ofs; 219 uint32_t slice_header_ofs; 220 221 uint32_t sliceparam_buffer_size; 222 223 IN_RC_PARAMS in_params_cache; /* following frames reuse the first frame's IN_RC_PARAMS, cache it */ 224 225 VAEncSliceParameterBuffer *slice_param_cache; 226 uint16_t slice_param_num; 227 228 IMG_UINT16 MPEG4_vop_time_increment_resolution; 229 230 /* saved information for FrameSkip redo */ 231 uint32_t MPEG4_vop_time_increment_frameskip; 232 uint32_t MPEG4_picture_type_frameskip; 233 uint8_t profile_idc; 234 uint8_t force_idr_h264; 235 uint32_t update_rc_control; 236 uint8_t OptionalCustomPCF; 237 uint32_t max_slice_size; 238 uint16_t num_air_mbs; 239 uint16_t air_threshold; 240 uint32_t autotune_air_flag; 241 uint32_t delta_change; 242 243 struct coded_buf_aux_info *p_coded_buf_info; 244 unsigned char *save_seq_header_p; 245 246 /*For H264 only.*/ 247 uint16_t idr_pic_id; 248 }; 249 250 typedef struct context_ENC_s *context_ENC_p; 251 252 /*#define BELOW_PARAMS_SIZE 8*/ 253 254 #define HEADER_SIZE 128 255 256 #define BELOW_PARAMS_SIZE 16 257 #define REGION_TYPE_2D 1 258 #define REGION_TYPE_LINEAR 0 259 #define REGION_TYPE_2DREF 3 260 261 262 #define MAX_RESIDUAL_PER_MB_H264 1260 263 #define ISINTER_FLAGS 0x1 264 #define ISH264_FLAGS 0x2 265 #define ISMPEG4_FLAGS 0x4 266 #define ISH263_FLAGS 0x8 267 #define DEBLOCK_FRAME 0x10 268 #define ISRC_FLAGS 0x20 269 #define ISCBR_FLAGS 0x40 270 #define ISVBR_FLAGS 0x80 271 #define ISRC_I16BIAS 0x100 272 #define INTERLEAVE_TARGET 0x200 273 #define ISVCM_FLAGS 0x400 274 #define AUTOTUNE_AIR 0x800 275 276 277 #define SPE_EDGE_LEFT 1 /* ->bMinXRealEdge*/ 278 #define SPE_EDGE_RIGHT 2 /* ->bMaxXRealEdge*/ 279 #define SPE_EDGE_TOP 4 /* ->bMinYRealEdge*/ 280 #define SPE_EDGE_BOTTOM 8 /* ->bMaxYRealEdge*/ 281 282 typedef struct { 283 /* Transferred into the input params area of the macroblock parameter structure*/ 284 IMG_BYTE CurBlockAddr; 285 IMG_BYTE IPEMin[2]; 286 IMG_BYTE IPEMax[2]; 287 IMG_BYTE RealEdge; /*bMinXRealEdge, bMaxXRealEdge, bMinXRealEdge and bMinYRealEdge*/ 288 /* Surrounding block availability */ 289 IMG_BYTE MVValid; 290 IMG_BYTE ParamsValid; 291 IMG_BYTE bySliceQP; 292 IMG_BYTE bySliceQPC; 293 294 IMG_BYTE Reserved[6]; /* This is padding to make the transfers 16 bytes aligned*/ 295 /* Transferred into the SW communication section of the macroblock 296 * parameter structure We shall EDMA the whole lot of this into eiob 297 * in one go, and then use two TDMA's to put it into seperate locations 298 * within the macroblock structure 299 */ 300 IMG_UINT32 IPEControl; 301 IMG_UINT32 SPEControl; 302 IMG_UINT32 JMCompControl; 303 IMG_UINT32 VLCControl; 304 } MTX_CURRENT_IN_PARAMS; 305 306 typedef struct { /* corresponding bytes inside the MB_IN structure: */ 307 IMG_BYTE BlockSizes; /****************/ 308 IMG_BYTE IntraMode; /* */ 309 IMG_BYTE Intra4x4ModesBottom[2]; /* */ 310 IMG_BYTE CodeType; /* [64 : 71] */ 311 IMG_BYTE Reserved2; /* */ 312 /*IMG_BYTE SAD;*/ 313 IMG_BYTE QPy; /* */ 314 IMG_BYTE QPc; /****************/ 315 316 IMG_BYTE Reserved3[8]; /* This is padding to make the transfers 16 byte aligned*/ 317 318 IMG_UINT16 LumaSubBlockCoded; /****************/ 319 IMG_BYTE ChromaSubBlockCoded; /* */ 320 IMG_BYTE LumaChromaDCCoded; /* */ 321 /* [129 : 143] */ 322 IMG_BYTE Lambda; /* */ 323 IMG_BYTE Reserved[3]; /* */ 324 /* */ 325 IMG_BYTE Intra4x4ModeDeltas[8]; /****************/ 326 327 /* Motion vectors */ 328 IMG_UINT16 IntegerMV[16][2]; /* [207 : 144] */ 329 /* input region from host */ 330 } MTX_CURRENT_OUT_PARAMS; 331 332 333 334 typedef enum _TH_SKIP_SCALE_ { 335 TH_SKIP_0 = 0, 336 TH_SKIP_12 = 1, 337 TH_SKIP_24 = 2 338 } TH_SKIP_SCALE; 339 340 typedef struct _PIC_PARAMS_ { 341 IMG_UINT32 SrcYBase; 342 IMG_UINT32 SrcUBase; 343 IMG_UINT32 SrcVBase; 344 IMG_UINT32 DstYBase; 345 IMG_UINT32 DstUVBase; 346 347 IMG_UINT16 SrcYStride; 348 IMG_UINT16 SrcUVStride; 349 IMG_UINT16 SrcYRowStride; 350 IMG_UINT16 SrcUVRowStride; 351 352 IMG_UINT16 DstYStride; 353 IMG_UINT16 DstUVStride; 354 IMG_UINT16 DstYRowStride; 355 IMG_UINT16 DstUVRowStride; 356 357 IMG_UINT32 InParamsBase; 358 IMG_UINT32 InParamsRowStride; 359 360 IMG_UINT32 OutParamsBase; 361 IMG_UINT32 CodedBase; 362 363 IMG_UINT32 BelowParamsBase; 364 IMG_UINT32 BelowParamRowStride; 365 366 IMG_UINT32 AboveParamsBase; 367 IMG_UINT32 AboveParamRowStride; 368 IMG_UINT16 Width; 369 IMG_UINT16 Height; 370 IMG_UINT16 Flags; 371 372 IN_RC_PARAMS sInParams; 373 TH_SKIP_SCALE THSkip; 374 375 IMG_UINT16 NumSlices; //!< Number of slices in the picture 376 } PIC_PARAMS; 377 378 379 /* This holds the data that is needed at the start of a slice 380 */ 381 typedef struct _SLICE_PARAMS_ { 382 383 IMG_UINT16 SliceStartRowNum; 384 IMG_UINT16 SliceHeight; 385 386 IMG_UINT32 RefYBase; 387 IMG_UINT32 RefUVBase; 388 IMG_UINT16 RefYStride; 389 IMG_UINT16 RefUVStride; 390 IMG_UINT16 RefYRowStride; 391 IMG_UINT16 RefUVRowStride; 392 393 IMG_UINT32 CodedData; 394 IMG_UINT32 Flags; 395 IMG_UINT32 CodedDataPos; 396 IMG_UINT32 TotalCoded; 397 IMG_UINT32 FCode; 398 399 IMG_UINT32 MaxSliceSize; 400 IMG_INT16 NumAirMBs; //!< Maximum number of Adaptive intra refresh macroblocks for this slice 401 IMG_INT16 AirThreshold; //!< Theshold value used in Adaptive intra refresh calculation. 402 403 } SLICE_PARAMS; 404 405 406 typedef struct _ROW_PARAMS_ { 407 IMG_UINT32 TargetYBase; 408 IMG_UINT32 TargetYStride; 409 IMG_UINT32 TargetUBase; 410 IMG_UINT32 TargetVBase; 411 IMG_UINT32 TargetUVStride; 412 413 IMG_UINT32 ReferenceYBase; 414 IMG_UINT32 ReferenceYStride; 415 IMG_UINT32 ReferenceUVBase; 416 IMG_UINT32 ReferenceUVStride; 417 418 IMG_UINT32 ReconstructedYBase; 419 IMG_UINT32 ReconstructedYStride; 420 IMG_UINT32 ReconstructedUVBase; 421 IMG_UINT32 ReconstructedUVStride; 422 423 IMG_UINT32 AboveParamsBase; 424 IMG_UINT32 OutAboveParamsBase; 425 IMG_UINT32 MacroblockInParamsBase; 426 IMG_UINT32 MacroblockOutParamsBase; 427 IMG_UINT32 BelowParamsBase; 428 IMG_UINT32 OutBelowParamsBase; 429 IMG_UINT32 CodedData; 430 431 IMG_UINT32 Flags; 432 IMG_UINT32 BlockWidth; 433 IMG_UINT32 BlockHeight; 434 IMG_UINT32 YPos; 435 IMG_UINT32 FrameNum; 436 437 IMG_INT BelowParamsOffset; 438 IMG_UINT32 CodedDataPos; 439 IMG_UINT32 BaseResidual; 440 IMG_UINT32 TotalCoded; 441 442 IMG_UINT32 PADDING[5]; 443 444 IMG_UINT32 IPESkipVecBias; 445 IMG_UINT32 SPESkipVecBias; 446 IMG_INT32 InterMBBias; 447 IMG_INT32 Intra16Bias; 448 IMG_UINT32 SpeZeroThld; 449 IMG_UINT32 SpeZeroThreshold; 450 451 } ROW_PARAMS; 452 453 #define ROW_PARAMS_TDMA_DIMENSIONS 16,16,sizeof(ROW_PARAMS) 454 455 typedef struct _ENCODER_VARIABLES_ { 456 IMG_UINT32 ActionFlags; 457 458 IMG_UINT32 SrcYCurrent; 459 IMG_UINT32 SrcUCurrent; 460 IMG_UINT32 SrcVCurrent; 461 462 IMG_UINT32 DstYCurrent; 463 IMG_UINT32 DstUCurrent; 464 IMG_UINT32 DstVCurrent; 465 466 IMG_INT BelowParamsOffset; 467 IMG_UINT32 BaseResidual; 468 IMG_UINT32 CodedDataPos; 469 IMG_UINT32 TotalCoded; 470 471 IMG_UINT32 SrcYOffset; 472 IMG_UINT32 SrcUOffset; 473 IMG_UINT32 SrcVOffset; 474 475 IMG_UINT32 PADDING[2]; 476 } ENCODER_VARIABLES; 477 478 #define SLICE_FLAGS_ISINTER 0x00000001 479 #define SLICE_FLAGS_DEBLOCK 0x00000002 480 481 #define SLICE_FLAGS_ISINTER 0x00000001 482 #define SLICE_FLAGS_DEBLOCK 0x00000002 483 484 #define RC_STATUS_FRAME_AVE_QP_MASK 0x0ff /* the average Qp used in this frame */ 485 #define RC_STATUS_FLAG_LARGE_SLICE 0x100 /* At least one slice in this frame was large enough for the firmware to try to reduce it by increasing Qp or skipping MBs */ 486 #define RC_STATUS_FLAG_SLICE_OVERFLOW 0x200 /* At least one slice in this frame was larger than the slice limit */ 487 488 enum { 489 CBR = 0, 490 VBR, 491 VCM 492 } eRCMode; 493 494 enum { 495 EH263 = 0, 496 EMpeg4 = 1, 497 EH264 = 2, 498 EHJpeg = 3 499 } eEncodingFormat; 500 501 #define VAEncSliceParameter_Equal(src, dst) \ 502 (((src)->start_row_number == (dst)->start_row_number) \ 503 && ((src)->slice_height == (dst)->slice_height) \ 504 && ((src)->slice_flags.bits.is_intra == (dst)->slice_flags.bits.is_intra) \ 505 && ((src)->slice_flags.bits.disable_deblocking_filter_idc == (dst)->slice_flags.bits.disable_deblocking_filter_idc)) 506 507 #define VAEncSliceParameter_LightEqual(src, dst) \ 508 (((src)->start_row_number == (dst)->start_row_number) \ 509 && ((src)->slice_height == (dst)->slice_height) \ 510 && ((src)->slice_flags.bits.disable_deblocking_filter_idc == (dst)->slice_flags.bits.disable_deblocking_filter_idc)) 511 512 513 514 #define SURFACE_INFO_SKIP_FLAG_SETTLED 0X80000000 515 #define GET_SURFACE_INFO_skipped_flag(psb_surface) ((int) (psb_surface->extra_info[5])) 516 #define SET_SURFACE_INFO_skipped_flag(psb_surface, value) psb_surface->extra_info[5] = (SURFACE_INFO_SKIP_FLAG_SETTLED | value) 517 #define CLEAR_SURFACE_INFO_skipped_flag(psb_surface) psb_surface->extra_info[5] = 0 518 519 VAStatus lnc_CreateContext(object_context_p obj_context, 520 object_config_p obj_config); 521 522 523 void lnc__setup_rcdata(context_ENC_p ctx, PIC_PARAMS *psPicParams, IMG_RC_PARAMS *rc_params); 524 void lnc__update_rcdata(context_ENC_p ctx, PIC_PARAMS *psPicParams, IMG_RC_PARAMS *rc_params); 525 526 void lnc_DestroyContext( 527 object_context_p obj_context 528 ); 529 530 VAStatus lnc_BeginPicture(context_ENC_p ctx); 531 VAStatus lnc_EndPicture(context_ENC_p ctx); 532 533 void lnc_setup_slice_params( 534 context_ENC_p ctx, IMG_UINT16 YSliceStartPos, 535 IMG_UINT16 SliceHeight, IMG_BOOL IsIntra, 536 IMG_BOOL VectorsValid, int bySliceQP); 537 538 IMG_UINT32 lnc__send_encode_slice_params( 539 context_ENC_p ctx, 540 IMG_BOOL IsIntra, 541 IMG_UINT16 CurrentRow, 542 IMG_BOOL DeblockSlice, 543 IMG_UINT32 FrameNum, 544 IMG_UINT16 SliceHeight, 545 IMG_UINT16 CurrentSlice, 546 IMG_UINT32 MaxSliceSize); 547 548 VAStatus lnc_RenderPictureParameter(context_ENC_p ctx); 549 550 551 void lnc_reset_encoder_params(context_ENC_p ctx); 552 unsigned int lnc__get_ipe_control(enum drm_lnc_topaz_codec eEncodingFormat); 553 554 555 556 557 558