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 * Zhao Yakui <yakui.zhao@intel.com> 26 * 27 */ 28 #ifndef __INTEL_HOSTVLD_VP9_H__ 29 #define __INTEL_HOSTVLD_VP9_H__ 30 31 #include "pthread.h" 32 #include "media_drv_driver.h" 33 #include "intel_hybrid_common_vp9.h" 34 35 typedef enum _INTEL_HOSTVLD_VP9_YUV_PLANE 36 { 37 INTEL_HOSTVLD_VP9_YUV_PLANE_Y = 0, 38 INTEL_HOSTVLD_VP9_YUV_PLANE_UV, // UV interleaved 39 INTEL_HOSTVLD_VP9_YUV_PLANE_NUMBER, 40 INTEL_HOSTVLD_VP9_YUV_PLANE_U = INTEL_HOSTVLD_VP9_YUV_PLANE_UV, // separate U & V planes 41 INTEL_HOSTVLD_VP9_YUV_PLANE_V 42 } INTEL_HOSTVLD_VP9_YUV_PLANE; 43 44 typedef void *INTEL_HOSTVLD_VP9_HANDLE, **PINTEL_HOSTVLD_VP9_HANDLE; 45 46 // 1D buffer type 47 typedef struct _INTEL_HOSTVLD_VP9_1D_BUFFER 48 { 49 union 50 { 51 void *pBuffer; 52 uint8_t *pu8Buffer; 53 uint16_t *pu16Buffer; 54 uint32_t *pu32Buffer; 55 }; 56 uint32_t dwSize; // size in bytes or words 57 } INTEL_HOSTVLD_VP9_1D_BUFFER, *PINTEL_HOSTVLD_VP9_1D_BUFFER; 58 59 // 2D buffer type 60 typedef struct _INTEL_HOSTVLD_VP9_2D_BUFFER 61 { 62 union 63 { 64 uint8_t *pu8Buffer; 65 uint16_t *pu16Buffer; 66 }; 67 uint32_t dwWidth; // width in bytes or words depending on the buffer data 68 uint32_t dwHeight; 69 uint32_t dwPitch; 70 uint32_t dwSize; 71 } INTEL_HOSTVLD_VP9_2D_BUFFER, *PINTEL_HOSTVLD_VP9_2D_BUFFER; 72 73 // video buffer structure used as HostVLD input 74 typedef struct _INTEL_HOSTVLD_VP9_VIDEO_BUFFER 75 { 76 PINTEL_VP9_PIC_PARAMS pVp9PicParams; 77 PINTEL_VP9_SEGMENT_PARAMS pVp9SegmentData; 78 79 uint8_t *pbBitsData; // bitstream buffer 80 uint32_t dwBitsSize; // bitstream size 81 82 BOOL bResolutionChanged; 83 84 /* Added by Zhao Yakui */ 85 dri_bo *slice_data_bo; 86 87 INTEL_HOSTVLD_VP9_1D_BUFFER PrevReferenceFrame; 88 INTEL_HOSTVLD_VP9_1D_BUFFER PrevMotionVector; 89 90 struct object_surface *pRenderTarget; 91 } INTEL_HOSTVLD_VP9_VIDEO_BUFFER, *PINTEL_HOSTVLD_VP9_VIDEO_BUFFER; 92 93 // data planes used as HostVLD output 94 typedef struct _INTEL_HOSTVLD_VP9_OUTPUT_BUFFER 95 { 96 INTEL_HOSTVLD_VP9_1D_BUFFER TransformCoeff[INTEL_HOSTVLD_VP9_YUV_PLANE_NUMBER + 1]; 97 INTEL_HOSTVLD_VP9_1D_BUFFER TransformSize[INTEL_HOSTVLD_VP9_YUV_PLANE_NUMBER]; 98 INTEL_HOSTVLD_VP9_1D_BUFFER CoeffStatus[INTEL_HOSTVLD_VP9_YUV_PLANE_NUMBER]; 99 INTEL_HOSTVLD_VP9_1D_BUFFER PredictionMode[INTEL_HOSTVLD_VP9_YUV_PLANE_NUMBER]; 100 INTEL_HOSTVLD_VP9_1D_BUFFER QP[INTEL_HOSTVLD_VP9_YUV_PLANE_NUMBER]; 101 INTEL_HOSTVLD_VP9_2D_BUFFER VerticalEdgeMask[INTEL_HOSTVLD_VP9_YUV_PLANE_NUMBER]; 102 INTEL_HOSTVLD_VP9_2D_BUFFER HorizontalEdgeMask[INTEL_HOSTVLD_VP9_YUV_PLANE_NUMBER]; 103 INTEL_HOSTVLD_VP9_1D_BUFFER TransformType; // For Luma only; Chroma should always use DCT_DCT transform 104 INTEL_HOSTVLD_VP9_1D_BUFFER TileIndex; // Y, U and V share the same tile index 105 INTEL_HOSTVLD_VP9_1D_BUFFER BlockSize; // Y, U and V share the same block size 106 INTEL_HOSTVLD_VP9_1D_BUFFER ReferenceFrame; // Y, U and V share the same reference frame buffer 107 INTEL_HOSTVLD_VP9_1D_BUFFER FilterType; // Y, U and V share the same interpolation filter type 108 INTEL_HOSTVLD_VP9_1D_BUFFER MotionVector; // Y, U and V share the same motion vector buffer 109 INTEL_HOSTVLD_VP9_2D_BUFFER FilterLevel; // Y, U and V share the same filter levels 110 INTEL_HOSTVLD_VP9_2D_BUFFER Threshold; // Y, U and V share the same thresholds 111 } INTEL_HOSTVLD_VP9_OUTPUT_BUFFER, *PINTEL_HOSTVLD_VP9_OUTPUT_BUFFER; 112 113 // Callback functions 114 typedef VAStatus (* PFNINTEL_HOSTVLD_VP9_DEBLOCKCB) ( 115 void *pvStandardState, 116 uint32_t uiCurrIndex); 117 118 typedef VAStatus (* PFNINTEL_HOSTVLD_VP9_RENDERCB) ( 119 void *pvStandardState, 120 uint32_t uiCurrIndex, 121 uint32_t uiPrevIndex); 122 123 typedef VAStatus (* PFNINTEL_HOSTVLD_VP9_SYNCCB) ( 124 void *pvStandardState, 125 PINTEL_HOSTVLD_VP9_VIDEO_BUFFER pHostVldVideoBuf, 126 uint32_t uiCurrIndex, 127 uint32_t uiPrevIndex); 128 129 typedef struct _INTEL_HOSTVLD_VP9_CALLBACKS 130 { 131 PFNINTEL_HOSTVLD_VP9_RENDERCB pfnHostVldRenderCb; 132 PFNINTEL_HOSTVLD_VP9_SYNCCB pfnHostVldSyncCb; 133 void *pvStandardState; 134 } INTEL_HOSTVLD_VP9_CALLBACKS, *PINTEL_HOSTVLD_VP9_CALLBACKS; 135 136 // function interface 137 // 138 VAStatus Intel_HostvldVp9_Create ( 139 PINTEL_HOSTVLD_VP9_HANDLE hHostVld, 140 PINTEL_HOSTVLD_VP9_CALLBACKS pCallbacks); 141 142 VAStatus Intel_HostvldVp9_QueryBufferSize ( 143 INTEL_HOSTVLD_VP9_HANDLE hHostVld, 144 uint32_t *pdwBufferSize); 145 146 VAStatus Intel_HostvldVp9_SetOutputBuffer ( 147 INTEL_HOSTVLD_VP9_HANDLE hHostVld, 148 PINTEL_HOSTVLD_VP9_OUTPUT_BUFFER pOutputBuffer); 149 150 VAStatus Intel_HostvldVp9_Initialize ( 151 INTEL_HOSTVLD_VP9_HANDLE hHostVld, 152 PINTEL_HOSTVLD_VP9_VIDEO_BUFFER pVideoBuffer); 153 154 VAStatus Intel_HostvldVp9_Execute ( 155 INTEL_HOSTVLD_VP9_HANDLE hHostVld); 156 157 VAStatus Intel_HostvldVp9_Destroy ( 158 INTEL_HOSTVLD_VP9_HANDLE hHostVld); 159 160 #endif // __INTEL_HOSTVLD_VP9_H__ 161