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