1*bbecb9d1SAndroid Build Coastguard Worker /**************************************************************************
2*bbecb9d1SAndroid Build Coastguard Worker *
3*bbecb9d1SAndroid Build Coastguard Worker * Copyright (C) 2022 Kylin Software Co., Ltd.
4*bbecb9d1SAndroid Build Coastguard Worker *
5*bbecb9d1SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
6*bbecb9d1SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
7*bbecb9d1SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
8*bbecb9d1SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*bbecb9d1SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
10*bbecb9d1SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
11*bbecb9d1SAndroid Build Coastguard Worker *
12*bbecb9d1SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
13*bbecb9d1SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
14*bbecb9d1SAndroid Build Coastguard Worker *
15*bbecb9d1SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16*bbecb9d1SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*bbecb9d1SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*bbecb9d1SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19*bbecb9d1SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20*bbecb9d1SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21*bbecb9d1SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE.
22*bbecb9d1SAndroid Build Coastguard Worker *
23*bbecb9d1SAndroid Build Coastguard Worker **************************************************************************/
24*bbecb9d1SAndroid Build Coastguard Worker
25*bbecb9d1SAndroid Build Coastguard Worker /**
26*bbecb9d1SAndroid Build Coastguard Worker * @file
27*bbecb9d1SAndroid Build Coastguard Worker * Implementation of general video codec interface.
28*bbecb9d1SAndroid Build Coastguard Worker *
29*bbecb9d1SAndroid Build Coastguard Worker * This implementation is currently based on VA-API, and other interfaces,
30*bbecb9d1SAndroid Build Coastguard Worker * such as VDPAU and proprietary interfaces, can also be considered in the
31*bbecb9d1SAndroid Build Coastguard Worker * future.
32*bbecb9d1SAndroid Build Coastguard Worker *
33*bbecb9d1SAndroid Build Coastguard Worker * Two objects are implemented here:
34*bbecb9d1SAndroid Build Coastguard Worker * virgl_video_buffer:
35*bbecb9d1SAndroid Build Coastguard Worker * Buffer for storing raw YUV formatted data. Currently, it is a wrapper
36*bbecb9d1SAndroid Build Coastguard Worker * for VASurface.
37*bbecb9d1SAndroid Build Coastguard Worker * virgl_video_codec:
38*bbecb9d1SAndroid Build Coastguard Worker * Represents a video encoder or decoder. It's a wrapper of VAContext and
39*bbecb9d1SAndroid Build Coastguard Worker * mainly provides the following methods:
40*bbecb9d1SAndroid Build Coastguard Worker * - virgl_video_begin_frame()
41*bbecb9d1SAndroid Build Coastguard Worker * It calls vaBeginPicture() to prepare for encoding and decoding. For
42*bbecb9d1SAndroid Build Coastguard Worker * encoding, it also needs to upload the raw picture data from the guest
43*bbecb9d1SAndroid Build Coastguard Worker * side into the local VASurface.
44*bbecb9d1SAndroid Build Coastguard Worker * - virgl_video_decode_bitstream()
45*bbecb9d1SAndroid Build Coastguard Worker * It constructs the decoding-related VABuffers according to the picture
46*bbecb9d1SAndroid Build Coastguard Worker * description information, and then calls vaRenderPicture() for decoding.
47*bbecb9d1SAndroid Build Coastguard Worker * - virgl_video_encode_bitstream()
48*bbecb9d1SAndroid Build Coastguard Worker * It constructs the encoding-related VABuffers according to the picture
49*bbecb9d1SAndroid Build Coastguard Worker * description information, and then calls vaRenderPicture() for encoding.
50*bbecb9d1SAndroid Build Coastguard Worker * - virgl_video_end_frame()
51*bbecb9d1SAndroid Build Coastguard Worker * It calls vaEndPicture() to end encoding and decoding. After decoding,
52*bbecb9d1SAndroid Build Coastguard Worker * it transmits the raw picture data from VASurface to the guest side,
53*bbecb9d1SAndroid Build Coastguard Worker * and after encoding, it transmits the result and the coded data in
54*bbecb9d1SAndroid Build Coastguard Worker * VACodedBuffer to the guest side.
55*bbecb9d1SAndroid Build Coastguard Worker *
56*bbecb9d1SAndroid Build Coastguard Worker * @author Feng Jiang <[email protected]>
57*bbecb9d1SAndroid Build Coastguard Worker */
58*bbecb9d1SAndroid Build Coastguard Worker
59*bbecb9d1SAndroid Build Coastguard Worker
60*bbecb9d1SAndroid Build Coastguard Worker #include <stdio.h>
61*bbecb9d1SAndroid Build Coastguard Worker #include <stdint.h>
62*bbecb9d1SAndroid Build Coastguard Worker #include <stdbool.h>
63*bbecb9d1SAndroid Build Coastguard Worker #include <stdlib.h>
64*bbecb9d1SAndroid Build Coastguard Worker #include <string.h>
65*bbecb9d1SAndroid Build Coastguard Worker #include <unistd.h>
66*bbecb9d1SAndroid Build Coastguard Worker #include <epoxy/gl.h>
67*bbecb9d1SAndroid Build Coastguard Worker #include <epoxy/egl.h>
68*bbecb9d1SAndroid Build Coastguard Worker #include <va/va.h>
69*bbecb9d1SAndroid Build Coastguard Worker #include <va/va_drm.h>
70*bbecb9d1SAndroid Build Coastguard Worker #include <va/va_drmcommon.h>
71*bbecb9d1SAndroid Build Coastguard Worker #include <drm_fourcc.h>
72*bbecb9d1SAndroid Build Coastguard Worker
73*bbecb9d1SAndroid Build Coastguard Worker #include "pipe/p_video_state.h"
74*bbecb9d1SAndroid Build Coastguard Worker #include "util/u_memory.h"
75*bbecb9d1SAndroid Build Coastguard Worker #include "virgl_hw.h"
76*bbecb9d1SAndroid Build Coastguard Worker #include "virgl_video_hw.h"
77*bbecb9d1SAndroid Build Coastguard Worker #include "virgl_util.h"
78*bbecb9d1SAndroid Build Coastguard Worker #include "virgl_video.h"
79*bbecb9d1SAndroid Build Coastguard Worker
80*bbecb9d1SAndroid Build Coastguard Worker /*
81*bbecb9d1SAndroid Build Coastguard Worker * The max size of codec buffer is approximately:
82*bbecb9d1SAndroid Build Coastguard Worker * num_of_macroblocks * max_size_of_per_macroblock + size_of_some_headers
83*bbecb9d1SAndroid Build Coastguard Worker * Now, we only support YUV420 formats, this means that we have a limit of
84*bbecb9d1SAndroid Build Coastguard Worker * 3200 bits(400 Bytes) per macroblock. To simplify the calculation, we
85*bbecb9d1SAndroid Build Coastguard Worker * directly use 512 instead of 400.
86*bbecb9d1SAndroid Build Coastguard Worker */
87*bbecb9d1SAndroid Build Coastguard Worker #define CODED_BUF_DEFAULT_SIZE(width, height) \
88*bbecb9d1SAndroid Build Coastguard Worker ((width) * (height) / (16 * 16) * 512)
89*bbecb9d1SAndroid Build Coastguard Worker
90*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer {
91*bbecb9d1SAndroid Build Coastguard Worker enum pipe_format format;
92*bbecb9d1SAndroid Build Coastguard Worker uint32_t width;
93*bbecb9d1SAndroid Build Coastguard Worker uint32_t height;
94*bbecb9d1SAndroid Build Coastguard Worker bool interlanced;
95*bbecb9d1SAndroid Build Coastguard Worker VASurfaceID va_sfc;
96*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_dma_buf *dmabuf;
97*bbecb9d1SAndroid Build Coastguard Worker void *opaque; /* User opaque data */
98*bbecb9d1SAndroid Build Coastguard Worker };
99*bbecb9d1SAndroid Build Coastguard Worker
100*bbecb9d1SAndroid Build Coastguard Worker
101*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec {
102*bbecb9d1SAndroid Build Coastguard Worker enum pipe_video_profile profile;
103*bbecb9d1SAndroid Build Coastguard Worker uint32_t level;
104*bbecb9d1SAndroid Build Coastguard Worker enum pipe_video_entrypoint entrypoint;
105*bbecb9d1SAndroid Build Coastguard Worker enum pipe_video_chroma_format chroma_format;
106*bbecb9d1SAndroid Build Coastguard Worker uint32_t width;
107*bbecb9d1SAndroid Build Coastguard Worker uint32_t height;
108*bbecb9d1SAndroid Build Coastguard Worker uint32_t max_references;
109*bbecb9d1SAndroid Build Coastguard Worker VAContextID va_ctx;
110*bbecb9d1SAndroid Build Coastguard Worker VAConfigID va_cfg;
111*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *buffer;
112*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *ref_pic_list[32]; /* Enc: reference pictures */
113*bbecb9d1SAndroid Build Coastguard Worker VABufferID va_coded_buf; /* Enc: VACodedBuffer */
114*bbecb9d1SAndroid Build Coastguard Worker void *opaque; /* User opaque data */
115*bbecb9d1SAndroid Build Coastguard Worker };
116*bbecb9d1SAndroid Build Coastguard Worker
117*bbecb9d1SAndroid Build Coastguard Worker
118*bbecb9d1SAndroid Build Coastguard Worker static VADisplay va_dpy;
119*bbecb9d1SAndroid Build Coastguard Worker
120*bbecb9d1SAndroid Build Coastguard Worker static struct virgl_video_callbacks *callbacks = NULL;
121*bbecb9d1SAndroid Build Coastguard Worker
pipe_profile_from_va(VAProfile profile)122*bbecb9d1SAndroid Build Coastguard Worker static enum pipe_video_profile pipe_profile_from_va(VAProfile profile)
123*bbecb9d1SAndroid Build Coastguard Worker {
124*bbecb9d1SAndroid Build Coastguard Worker switch (profile) {
125*bbecb9d1SAndroid Build Coastguard Worker case VAProfileMPEG2Simple:
126*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_MPEG2_SIMPLE;
127*bbecb9d1SAndroid Build Coastguard Worker case VAProfileMPEG2Main:
128*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_MPEG2_MAIN;
129*bbecb9d1SAndroid Build Coastguard Worker case VAProfileMPEG4Simple:
130*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_MPEG4_SIMPLE;
131*bbecb9d1SAndroid Build Coastguard Worker case VAProfileMPEG4AdvancedSimple:
132*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE;
133*bbecb9d1SAndroid Build Coastguard Worker case VAProfileVC1Simple:
134*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_VC1_SIMPLE;
135*bbecb9d1SAndroid Build Coastguard Worker case VAProfileVC1Main:
136*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_VC1_MAIN;
137*bbecb9d1SAndroid Build Coastguard Worker case VAProfileVC1Advanced:
138*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_VC1_ADVANCED;
139*bbecb9d1SAndroid Build Coastguard Worker case VAProfileH264ConstrainedBaseline:
140*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE;
141*bbecb9d1SAndroid Build Coastguard Worker case VAProfileH264Main:
142*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN;
143*bbecb9d1SAndroid Build Coastguard Worker case VAProfileH264High:
144*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH;
145*bbecb9d1SAndroid Build Coastguard Worker case VAProfileHEVCMain:
146*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_HEVC_MAIN;
147*bbecb9d1SAndroid Build Coastguard Worker case VAProfileHEVCMain10:
148*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_HEVC_MAIN_10;
149*bbecb9d1SAndroid Build Coastguard Worker case VAProfileJPEGBaseline:
150*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_JPEG_BASELINE;
151*bbecb9d1SAndroid Build Coastguard Worker case VAProfileVP9Profile0:
152*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_VP9_PROFILE0;
153*bbecb9d1SAndroid Build Coastguard Worker case VAProfileVP9Profile2:
154*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_VP9_PROFILE2;
155*bbecb9d1SAndroid Build Coastguard Worker case VAProfileAV1Profile0:
156*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_AV1_MAIN;
157*bbecb9d1SAndroid Build Coastguard Worker case VAProfileNone:
158*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_UNKNOWN;
159*bbecb9d1SAndroid Build Coastguard Worker default:
160*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_PROFILE_UNKNOWN;
161*bbecb9d1SAndroid Build Coastguard Worker }
162*bbecb9d1SAndroid Build Coastguard Worker }
163*bbecb9d1SAndroid Build Coastguard Worker
164*bbecb9d1SAndroid Build Coastguard Worker /* NOTE: mesa va frontend only supports VLD and EncSlice */
pipe_entrypoint_from_va(VAEntrypoint entrypoint)165*bbecb9d1SAndroid Build Coastguard Worker static enum pipe_video_entrypoint pipe_entrypoint_from_va(
166*bbecb9d1SAndroid Build Coastguard Worker VAEntrypoint entrypoint)
167*bbecb9d1SAndroid Build Coastguard Worker {
168*bbecb9d1SAndroid Build Coastguard Worker switch (entrypoint) {
169*bbecb9d1SAndroid Build Coastguard Worker case VAEntrypointVLD:
170*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_ENTRYPOINT_BITSTREAM;
171*bbecb9d1SAndroid Build Coastguard Worker case VAEntrypointIDCT:
172*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_ENTRYPOINT_IDCT;
173*bbecb9d1SAndroid Build Coastguard Worker case VAEntrypointMoComp:
174*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_ENTRYPOINT_MC;
175*bbecb9d1SAndroid Build Coastguard Worker case VAEntrypointEncSlice: /* fall through */
176*bbecb9d1SAndroid Build Coastguard Worker case VAEntrypointEncSliceLP:
177*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_ENTRYPOINT_ENCODE;
178*bbecb9d1SAndroid Build Coastguard Worker default:
179*bbecb9d1SAndroid Build Coastguard Worker return PIPE_VIDEO_ENTRYPOINT_UNKNOWN;
180*bbecb9d1SAndroid Build Coastguard Worker }
181*bbecb9d1SAndroid Build Coastguard Worker }
182*bbecb9d1SAndroid Build Coastguard Worker
pipe_format_from_va_fourcc(unsigned format)183*bbecb9d1SAndroid Build Coastguard Worker static enum pipe_format pipe_format_from_va_fourcc(unsigned format)
184*bbecb9d1SAndroid Build Coastguard Worker {
185*bbecb9d1SAndroid Build Coastguard Worker switch(format) {
186*bbecb9d1SAndroid Build Coastguard Worker case VA_FOURCC('N','V','1','2'):
187*bbecb9d1SAndroid Build Coastguard Worker return PIPE_FORMAT_NV12;
188*bbecb9d1SAndroid Build Coastguard Worker /* TODO: These are already defined in mesa, but not yet in virglrenderer
189*bbecb9d1SAndroid Build Coastguard Worker case VA_FOURCC('P','0','1','0'):
190*bbecb9d1SAndroid Build Coastguard Worker return PIPE_FORMAT_P010;
191*bbecb9d1SAndroid Build Coastguard Worker case VA_FOURCC('P','0','1','6'):
192*bbecb9d1SAndroid Build Coastguard Worker return PIPE_FORMAT_P016;
193*bbecb9d1SAndroid Build Coastguard Worker */
194*bbecb9d1SAndroid Build Coastguard Worker case VA_FOURCC('I','4','2','0'):
195*bbecb9d1SAndroid Build Coastguard Worker return PIPE_FORMAT_IYUV;
196*bbecb9d1SAndroid Build Coastguard Worker case VA_FOURCC('Y','V','1','2'):
197*bbecb9d1SAndroid Build Coastguard Worker return PIPE_FORMAT_YV12;
198*bbecb9d1SAndroid Build Coastguard Worker case VA_FOURCC('Y','U','Y','V'):
199*bbecb9d1SAndroid Build Coastguard Worker case VA_FOURCC('Y','U','Y','2'):
200*bbecb9d1SAndroid Build Coastguard Worker return PIPE_FORMAT_YUYV;
201*bbecb9d1SAndroid Build Coastguard Worker case VA_FOURCC('U','Y','V','Y'):
202*bbecb9d1SAndroid Build Coastguard Worker return PIPE_FORMAT_UYVY;
203*bbecb9d1SAndroid Build Coastguard Worker case VA_FOURCC('B','G','R','A'):
204*bbecb9d1SAndroid Build Coastguard Worker return PIPE_FORMAT_B8G8R8A8_UNORM;
205*bbecb9d1SAndroid Build Coastguard Worker case VA_FOURCC('R','G','B','A'):
206*bbecb9d1SAndroid Build Coastguard Worker return PIPE_FORMAT_R8G8B8A8_UNORM;
207*bbecb9d1SAndroid Build Coastguard Worker case VA_FOURCC('B','G','R','X'):
208*bbecb9d1SAndroid Build Coastguard Worker return PIPE_FORMAT_B8G8R8X8_UNORM;
209*bbecb9d1SAndroid Build Coastguard Worker case VA_FOURCC('R','G','B','X'):
210*bbecb9d1SAndroid Build Coastguard Worker return PIPE_FORMAT_R8G8B8X8_UNORM;
211*bbecb9d1SAndroid Build Coastguard Worker default:
212*bbecb9d1SAndroid Build Coastguard Worker return PIPE_FORMAT_NONE;
213*bbecb9d1SAndroid Build Coastguard Worker }
214*bbecb9d1SAndroid Build Coastguard Worker }
215*bbecb9d1SAndroid Build Coastguard Worker
216*bbecb9d1SAndroid Build Coastguard Worker
va_profile_from_pipe(enum pipe_video_profile profile)217*bbecb9d1SAndroid Build Coastguard Worker static VAProfile va_profile_from_pipe(enum pipe_video_profile profile)
218*bbecb9d1SAndroid Build Coastguard Worker {
219*bbecb9d1SAndroid Build Coastguard Worker switch (profile) {
220*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE:
221*bbecb9d1SAndroid Build Coastguard Worker return VAProfileMPEG2Simple;
222*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG2_MAIN:
223*bbecb9d1SAndroid Build Coastguard Worker return VAProfileMPEG2Main;
224*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_SIMPLE:
225*bbecb9d1SAndroid Build Coastguard Worker return VAProfileMPEG4Simple;
226*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE:
227*bbecb9d1SAndroid Build Coastguard Worker return VAProfileMPEG4AdvancedSimple;
228*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_VC1_SIMPLE:
229*bbecb9d1SAndroid Build Coastguard Worker return VAProfileVC1Simple;
230*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_VC1_MAIN:
231*bbecb9d1SAndroid Build Coastguard Worker return VAProfileVC1Main;
232*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_VC1_ADVANCED:
233*bbecb9d1SAndroid Build Coastguard Worker return VAProfileVC1Advanced;
234*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE:
235*bbecb9d1SAndroid Build Coastguard Worker return VAProfileH264ConstrainedBaseline;
236*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:
237*bbecb9d1SAndroid Build Coastguard Worker return VAProfileH264Main;
238*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
239*bbecb9d1SAndroid Build Coastguard Worker return VAProfileH264High;
240*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_HEVC_MAIN:
241*bbecb9d1SAndroid Build Coastguard Worker return VAProfileHEVCMain;
242*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_HEVC_MAIN_10:
243*bbecb9d1SAndroid Build Coastguard Worker return VAProfileHEVCMain10;
244*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_JPEG_BASELINE:
245*bbecb9d1SAndroid Build Coastguard Worker return VAProfileJPEGBaseline;
246*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_VP9_PROFILE0:
247*bbecb9d1SAndroid Build Coastguard Worker return VAProfileVP9Profile0;
248*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_VP9_PROFILE2:
249*bbecb9d1SAndroid Build Coastguard Worker return VAProfileVP9Profile2;
250*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_AV1_MAIN:
251*bbecb9d1SAndroid Build Coastguard Worker return VAProfileAV1Profile0;
252*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_EXTENDED:
253*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10:
254*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH422:
255*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH444:
256*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE:
257*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_HEVC_MAIN_12:
258*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_HEVC_MAIN_STILL:
259*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_HEVC_MAIN_444:
260*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_UNKNOWN:
261*bbecb9d1SAndroid Build Coastguard Worker return VAProfileNone;
262*bbecb9d1SAndroid Build Coastguard Worker default:
263*bbecb9d1SAndroid Build Coastguard Worker return -1;
264*bbecb9d1SAndroid Build Coastguard Worker }
265*bbecb9d1SAndroid Build Coastguard Worker }
266*bbecb9d1SAndroid Build Coastguard Worker
267*bbecb9d1SAndroid Build Coastguard Worker /*
268*bbecb9d1SAndroid Build Coastguard Worker * There is no invalid entrypoint defined in libva,
269*bbecb9d1SAndroid Build Coastguard Worker * so add this definition to make the code clear
270*bbecb9d1SAndroid Build Coastguard Worker */
271*bbecb9d1SAndroid Build Coastguard Worker #define VAEntrypointNone 0
va_entrypoint_from_pipe(enum pipe_video_entrypoint entrypoint)272*bbecb9d1SAndroid Build Coastguard Worker static int va_entrypoint_from_pipe(enum pipe_video_entrypoint entrypoint)
273*bbecb9d1SAndroid Build Coastguard Worker {
274*bbecb9d1SAndroid Build Coastguard Worker switch (entrypoint) {
275*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_ENTRYPOINT_BITSTREAM:
276*bbecb9d1SAndroid Build Coastguard Worker return VAEntrypointVLD;
277*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_ENTRYPOINT_IDCT:
278*bbecb9d1SAndroid Build Coastguard Worker return VAEntrypointIDCT;
279*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_ENTRYPOINT_MC:
280*bbecb9d1SAndroid Build Coastguard Worker return VAEntrypointMoComp;
281*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_ENTRYPOINT_ENCODE:
282*bbecb9d1SAndroid Build Coastguard Worker return VAEntrypointEncSlice;
283*bbecb9d1SAndroid Build Coastguard Worker default:
284*bbecb9d1SAndroid Build Coastguard Worker return VAEntrypointNone;
285*bbecb9d1SAndroid Build Coastguard Worker }
286*bbecb9d1SAndroid Build Coastguard Worker }
287*bbecb9d1SAndroid Build Coastguard Worker
va_format_from_pipe_chroma(enum pipe_video_chroma_format chroma_format)288*bbecb9d1SAndroid Build Coastguard Worker static uint32_t va_format_from_pipe_chroma(
289*bbecb9d1SAndroid Build Coastguard Worker enum pipe_video_chroma_format chroma_format)
290*bbecb9d1SAndroid Build Coastguard Worker {
291*bbecb9d1SAndroid Build Coastguard Worker switch (chroma_format) {
292*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_CHROMA_FORMAT_400:
293*bbecb9d1SAndroid Build Coastguard Worker return VA_RT_FORMAT_YUV400;
294*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_CHROMA_FORMAT_420:
295*bbecb9d1SAndroid Build Coastguard Worker return VA_RT_FORMAT_YUV420;
296*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_CHROMA_FORMAT_422:
297*bbecb9d1SAndroid Build Coastguard Worker return VA_RT_FORMAT_YUV422;
298*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_CHROMA_FORMAT_444:
299*bbecb9d1SAndroid Build Coastguard Worker return VA_RT_FORMAT_YUV444;
300*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_CHROMA_FORMAT_NONE:
301*bbecb9d1SAndroid Build Coastguard Worker default:
302*bbecb9d1SAndroid Build Coastguard Worker return 0;
303*bbecb9d1SAndroid Build Coastguard Worker }
304*bbecb9d1SAndroid Build Coastguard Worker }
305*bbecb9d1SAndroid Build Coastguard Worker
drm_format_from_va_fourcc(uint32_t va_fourcc)306*bbecb9d1SAndroid Build Coastguard Worker static uint32_t drm_format_from_va_fourcc(uint32_t va_fourcc)
307*bbecb9d1SAndroid Build Coastguard Worker {
308*bbecb9d1SAndroid Build Coastguard Worker switch (va_fourcc) {
309*bbecb9d1SAndroid Build Coastguard Worker case VA_FOURCC_NV12:
310*bbecb9d1SAndroid Build Coastguard Worker return DRM_FORMAT_NV12;
311*bbecb9d1SAndroid Build Coastguard Worker case VA_FOURCC_NV21:
312*bbecb9d1SAndroid Build Coastguard Worker return DRM_FORMAT_NV21;
313*bbecb9d1SAndroid Build Coastguard Worker default:
314*bbecb9d1SAndroid Build Coastguard Worker return DRM_FORMAT_INVALID;
315*bbecb9d1SAndroid Build Coastguard Worker }
316*bbecb9d1SAndroid Build Coastguard Worker }
317*bbecb9d1SAndroid Build Coastguard Worker
fill_video_dma_buf(struct virgl_video_dma_buf * dmabuf,const VADRMPRIMESurfaceDescriptor * desc)318*bbecb9d1SAndroid Build Coastguard Worker static void fill_video_dma_buf(struct virgl_video_dma_buf *dmabuf,
319*bbecb9d1SAndroid Build Coastguard Worker const VADRMPRIMESurfaceDescriptor *desc)
320*bbecb9d1SAndroid Build Coastguard Worker {
321*bbecb9d1SAndroid Build Coastguard Worker unsigned i, j, obj_idx;
322*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_dma_buf_plane *plane;
323*bbecb9d1SAndroid Build Coastguard Worker
324*bbecb9d1SAndroid Build Coastguard Worker /*
325*bbecb9d1SAndroid Build Coastguard Worker virgl_log("surface: fourcc=0x%08x, size=%ux%u, num_objects=%u,
326*bbecb9d1SAndroid Build Coastguard Worker num_layers=%u\n", desc->fourcc, desc->width, desc->height,
327*bbecb9d1SAndroid Build Coastguard Worker desc->num_objects, desc->num_layers);
328*bbecb9d1SAndroid Build Coastguard Worker
329*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < desc->num_objects; i++)
330*bbecb9d1SAndroid Build Coastguard Worker virgl_log(" objects[%u]: fd=%d, size=%u, modifier=0x%lx\n",
331*bbecb9d1SAndroid Build Coastguard Worker i, desc->objects[i].fd, desc->objects[i].size,
332*bbecb9d1SAndroid Build Coastguard Worker desc->objects[i].drm_format_modifier);
333*bbecb9d1SAndroid Build Coastguard Worker
334*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < desc->num_layers; i++)
335*bbecb9d1SAndroid Build Coastguard Worker virgl_log(" layers[%u] : format=0x%08x, num_planes=%u, "
336*bbecb9d1SAndroid Build Coastguard Worker "obj=%u,%u,%u,%u, offset=%u,%u,%u,%u, pitch=%u,%u,%u,%u\n",
337*bbecb9d1SAndroid Build Coastguard Worker i, desc->layers[i].drm_format, desc->layers[i].num_planes,
338*bbecb9d1SAndroid Build Coastguard Worker desc->layers[i].object_index[0],
339*bbecb9d1SAndroid Build Coastguard Worker desc->layers[i].object_index[1],
340*bbecb9d1SAndroid Build Coastguard Worker desc->layers[i].object_index[2],
341*bbecb9d1SAndroid Build Coastguard Worker desc->layers[i].object_index[3],
342*bbecb9d1SAndroid Build Coastguard Worker desc->layers[i].offset[0],
343*bbecb9d1SAndroid Build Coastguard Worker desc->layers[i].offset[1],
344*bbecb9d1SAndroid Build Coastguard Worker desc->layers[i].offset[2],
345*bbecb9d1SAndroid Build Coastguard Worker desc->layers[i].offset[3],
346*bbecb9d1SAndroid Build Coastguard Worker desc->layers[i].pitch[0],
347*bbecb9d1SAndroid Build Coastguard Worker desc->layers[i].pitch[1],
348*bbecb9d1SAndroid Build Coastguard Worker desc->layers[i].pitch[2],
349*bbecb9d1SAndroid Build Coastguard Worker desc->layers[i].pitch[3]);
350*bbecb9d1SAndroid Build Coastguard Worker */
351*bbecb9d1SAndroid Build Coastguard Worker
352*bbecb9d1SAndroid Build Coastguard Worker dmabuf->drm_format = drm_format_from_va_fourcc(desc->fourcc);
353*bbecb9d1SAndroid Build Coastguard Worker dmabuf->width = desc->width;
354*bbecb9d1SAndroid Build Coastguard Worker dmabuf->height = desc->height;
355*bbecb9d1SAndroid Build Coastguard Worker
356*bbecb9d1SAndroid Build Coastguard Worker for (i = 0, dmabuf->num_planes = 0; i < desc->num_layers; i++) {
357*bbecb9d1SAndroid Build Coastguard Worker for (j = 0; j < desc->layers[i].num_planes &&
358*bbecb9d1SAndroid Build Coastguard Worker dmabuf->num_planes < ARRAY_SIZE(dmabuf->planes); j++) {
359*bbecb9d1SAndroid Build Coastguard Worker
360*bbecb9d1SAndroid Build Coastguard Worker obj_idx = desc->layers[i].object_index[j];
361*bbecb9d1SAndroid Build Coastguard Worker plane = &dmabuf->planes[dmabuf->num_planes++];
362*bbecb9d1SAndroid Build Coastguard Worker plane->drm_format = desc->layers[i].drm_format;
363*bbecb9d1SAndroid Build Coastguard Worker plane->offset = desc->layers[i].offset[j];
364*bbecb9d1SAndroid Build Coastguard Worker plane->pitch = desc->layers[i].pitch[j];
365*bbecb9d1SAndroid Build Coastguard Worker plane->fd = desc->objects[obj_idx].fd;
366*bbecb9d1SAndroid Build Coastguard Worker plane->size = desc->objects[obj_idx].size;
367*bbecb9d1SAndroid Build Coastguard Worker plane->modifier = desc->objects[obj_idx].drm_format_modifier;
368*bbecb9d1SAndroid Build Coastguard Worker }
369*bbecb9d1SAndroid Build Coastguard Worker }
370*bbecb9d1SAndroid Build Coastguard Worker }
371*bbecb9d1SAndroid Build Coastguard Worker
export_video_dma_buf(struct virgl_video_buffer * buffer,unsigned flags)372*bbecb9d1SAndroid Build Coastguard Worker static struct virgl_video_dma_buf *export_video_dma_buf(
373*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *buffer,
374*bbecb9d1SAndroid Build Coastguard Worker unsigned flags)
375*bbecb9d1SAndroid Build Coastguard Worker {
376*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_dma_buf *dmabuf;
377*bbecb9d1SAndroid Build Coastguard Worker uint32_t exp_flags;
378*bbecb9d1SAndroid Build Coastguard Worker VAStatus va_stat;
379*bbecb9d1SAndroid Build Coastguard Worker VADRMPRIMESurfaceDescriptor desc;
380*bbecb9d1SAndroid Build Coastguard Worker
381*bbecb9d1SAndroid Build Coastguard Worker exp_flags = VA_EXPORT_SURFACE_SEPARATE_LAYERS;
382*bbecb9d1SAndroid Build Coastguard Worker
383*bbecb9d1SAndroid Build Coastguard Worker if (flags & VIRGL_VIDEO_DMABUF_READ_ONLY)
384*bbecb9d1SAndroid Build Coastguard Worker exp_flags |= VA_EXPORT_SURFACE_READ_ONLY;
385*bbecb9d1SAndroid Build Coastguard Worker
386*bbecb9d1SAndroid Build Coastguard Worker if (flags & VIRGL_VIDEO_DMABUF_WRITE_ONLY)
387*bbecb9d1SAndroid Build Coastguard Worker exp_flags |= VA_EXPORT_SURFACE_WRITE_ONLY;
388*bbecb9d1SAndroid Build Coastguard Worker
389*bbecb9d1SAndroid Build Coastguard Worker dmabuf = calloc(1, sizeof(*dmabuf));
390*bbecb9d1SAndroid Build Coastguard Worker if (!dmabuf)
391*bbecb9d1SAndroid Build Coastguard Worker return NULL;
392*bbecb9d1SAndroid Build Coastguard Worker
393*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaExportSurfaceHandle(va_dpy, buffer->va_sfc,
394*bbecb9d1SAndroid Build Coastguard Worker VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2, exp_flags, &desc);
395*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
396*bbecb9d1SAndroid Build Coastguard Worker virgl_log("export surface failed, err = 0x%X\n", va_stat);
397*bbecb9d1SAndroid Build Coastguard Worker goto free_dmabuf;
398*bbecb9d1SAndroid Build Coastguard Worker }
399*bbecb9d1SAndroid Build Coastguard Worker
400*bbecb9d1SAndroid Build Coastguard Worker fill_video_dma_buf(dmabuf, &desc);
401*bbecb9d1SAndroid Build Coastguard Worker dmabuf->flags = flags;
402*bbecb9d1SAndroid Build Coastguard Worker dmabuf->buf = buffer;
403*bbecb9d1SAndroid Build Coastguard Worker
404*bbecb9d1SAndroid Build Coastguard Worker return dmabuf;
405*bbecb9d1SAndroid Build Coastguard Worker
406*bbecb9d1SAndroid Build Coastguard Worker free_dmabuf:
407*bbecb9d1SAndroid Build Coastguard Worker free(dmabuf);
408*bbecb9d1SAndroid Build Coastguard Worker return NULL;
409*bbecb9d1SAndroid Build Coastguard Worker }
410*bbecb9d1SAndroid Build Coastguard Worker
destroy_video_dma_buf(struct virgl_video_dma_buf * dmabuf)411*bbecb9d1SAndroid Build Coastguard Worker static void destroy_video_dma_buf(struct virgl_video_dma_buf *dmabuf)
412*bbecb9d1SAndroid Build Coastguard Worker {
413*bbecb9d1SAndroid Build Coastguard Worker unsigned i;
414*bbecb9d1SAndroid Build Coastguard Worker
415*bbecb9d1SAndroid Build Coastguard Worker if (dmabuf) {
416*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < dmabuf->num_planes; i++)
417*bbecb9d1SAndroid Build Coastguard Worker close(dmabuf->planes[i].fd);
418*bbecb9d1SAndroid Build Coastguard Worker
419*bbecb9d1SAndroid Build Coastguard Worker free(dmabuf);
420*bbecb9d1SAndroid Build Coastguard Worker }
421*bbecb9d1SAndroid Build Coastguard Worker }
422*bbecb9d1SAndroid Build Coastguard Worker
encode_upload_picture(struct virgl_video_codec * codec,struct virgl_video_buffer * buffer)423*bbecb9d1SAndroid Build Coastguard Worker static void encode_upload_picture(struct virgl_video_codec *codec,
424*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *buffer)
425*bbecb9d1SAndroid Build Coastguard Worker {
426*bbecb9d1SAndroid Build Coastguard Worker VAStatus va_stat;
427*bbecb9d1SAndroid Build Coastguard Worker
428*bbecb9d1SAndroid Build Coastguard Worker if (!callbacks || !callbacks->encode_upload_picture)
429*bbecb9d1SAndroid Build Coastguard Worker return;
430*bbecb9d1SAndroid Build Coastguard Worker
431*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaSyncSurface(va_dpy, buffer->va_sfc);
432*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
433*bbecb9d1SAndroid Build Coastguard Worker virgl_log("sync surface failed, err = 0x%x\n", va_stat);
434*bbecb9d1SAndroid Build Coastguard Worker return;
435*bbecb9d1SAndroid Build Coastguard Worker }
436*bbecb9d1SAndroid Build Coastguard Worker
437*bbecb9d1SAndroid Build Coastguard Worker if (!buffer->dmabuf)
438*bbecb9d1SAndroid Build Coastguard Worker buffer->dmabuf = export_video_dma_buf(buffer, VIRGL_VIDEO_DMABUF_WRITE_ONLY);
439*bbecb9d1SAndroid Build Coastguard Worker
440*bbecb9d1SAndroid Build Coastguard Worker if (buffer->dmabuf)
441*bbecb9d1SAndroid Build Coastguard Worker callbacks->encode_upload_picture(codec, buffer->dmabuf);
442*bbecb9d1SAndroid Build Coastguard Worker }
443*bbecb9d1SAndroid Build Coastguard Worker
encode_completed(struct virgl_video_codec * codec,struct virgl_video_buffer * buffer)444*bbecb9d1SAndroid Build Coastguard Worker static void encode_completed(struct virgl_video_codec *codec,
445*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *buffer)
446*bbecb9d1SAndroid Build Coastguard Worker {
447*bbecb9d1SAndroid Build Coastguard Worker VAStatus va_stat;
448*bbecb9d1SAndroid Build Coastguard Worker VACodedBufferSegment *buf, *buf_list;
449*bbecb9d1SAndroid Build Coastguard Worker void **coded_bufs = NULL;
450*bbecb9d1SAndroid Build Coastguard Worker unsigned *coded_sizes = NULL;
451*bbecb9d1SAndroid Build Coastguard Worker unsigned i, num_coded_bufs = 0;
452*bbecb9d1SAndroid Build Coastguard Worker
453*bbecb9d1SAndroid Build Coastguard Worker if (!callbacks || !callbacks->encode_completed)
454*bbecb9d1SAndroid Build Coastguard Worker return;
455*bbecb9d1SAndroid Build Coastguard Worker
456*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaMapBuffer(va_dpy, codec->va_coded_buf, (void **)(&buf_list));
457*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
458*bbecb9d1SAndroid Build Coastguard Worker virgl_log("map coded buffer failed, err = 0x%x\n", va_stat);
459*bbecb9d1SAndroid Build Coastguard Worker return;
460*bbecb9d1SAndroid Build Coastguard Worker }
461*bbecb9d1SAndroid Build Coastguard Worker
462*bbecb9d1SAndroid Build Coastguard Worker for (buf = buf_list; buf; buf = (VACodedBufferSegment *)buf->next)
463*bbecb9d1SAndroid Build Coastguard Worker num_coded_bufs++;
464*bbecb9d1SAndroid Build Coastguard Worker
465*bbecb9d1SAndroid Build Coastguard Worker coded_bufs = calloc(num_coded_bufs, sizeof(void *));
466*bbecb9d1SAndroid Build Coastguard Worker coded_sizes = calloc(num_coded_bufs, sizeof(unsigned));
467*bbecb9d1SAndroid Build Coastguard Worker if (!coded_bufs || !coded_sizes) {
468*bbecb9d1SAndroid Build Coastguard Worker virgl_log("alloc memory failed, num_coded_bufs %u\n", num_coded_bufs);
469*bbecb9d1SAndroid Build Coastguard Worker goto fail_unmap_buffer;
470*bbecb9d1SAndroid Build Coastguard Worker }
471*bbecb9d1SAndroid Build Coastguard Worker
472*bbecb9d1SAndroid Build Coastguard Worker for (buf = buf_list, i = 0; buf; buf = (VACodedBufferSegment *)buf->next) {
473*bbecb9d1SAndroid Build Coastguard Worker coded_bufs[i] = buf->buf;
474*bbecb9d1SAndroid Build Coastguard Worker coded_sizes[i++] = buf->size;
475*bbecb9d1SAndroid Build Coastguard Worker }
476*bbecb9d1SAndroid Build Coastguard Worker
477*bbecb9d1SAndroid Build Coastguard Worker callbacks->encode_completed(codec, buffer->dmabuf, NULL, num_coded_bufs,
478*bbecb9d1SAndroid Build Coastguard Worker (const void * const*)coded_bufs, coded_sizes);
479*bbecb9d1SAndroid Build Coastguard Worker
480*bbecb9d1SAndroid Build Coastguard Worker fail_unmap_buffer:
481*bbecb9d1SAndroid Build Coastguard Worker vaUnmapBuffer(va_dpy, codec->va_coded_buf);
482*bbecb9d1SAndroid Build Coastguard Worker free(coded_bufs);
483*bbecb9d1SAndroid Build Coastguard Worker free(coded_sizes);
484*bbecb9d1SAndroid Build Coastguard Worker }
485*bbecb9d1SAndroid Build Coastguard Worker
decode_completed(struct virgl_video_codec * codec,struct virgl_video_buffer * buffer)486*bbecb9d1SAndroid Build Coastguard Worker static void decode_completed(struct virgl_video_codec *codec,
487*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *buffer)
488*bbecb9d1SAndroid Build Coastguard Worker {
489*bbecb9d1SAndroid Build Coastguard Worker if (!callbacks || !callbacks->decode_completed)
490*bbecb9d1SAndroid Build Coastguard Worker return;
491*bbecb9d1SAndroid Build Coastguard Worker
492*bbecb9d1SAndroid Build Coastguard Worker if (!buffer->dmabuf)
493*bbecb9d1SAndroid Build Coastguard Worker buffer->dmabuf = export_video_dma_buf(buffer, VIRGL_VIDEO_DMABUF_READ_ONLY);
494*bbecb9d1SAndroid Build Coastguard Worker
495*bbecb9d1SAndroid Build Coastguard Worker if (buffer->dmabuf)
496*bbecb9d1SAndroid Build Coastguard Worker callbacks->decode_completed(codec, buffer->dmabuf);
497*bbecb9d1SAndroid Build Coastguard Worker }
498*bbecb9d1SAndroid Build Coastguard Worker
get_enc_ref_pic(struct virgl_video_codec * codec,uint32_t frame_num)499*bbecb9d1SAndroid Build Coastguard Worker static VASurfaceID get_enc_ref_pic(struct virgl_video_codec *codec,
500*bbecb9d1SAndroid Build Coastguard Worker uint32_t frame_num)
501*bbecb9d1SAndroid Build Coastguard Worker {
502*bbecb9d1SAndroid Build Coastguard Worker uint32_t idx;
503*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_create_buffer_args args;
504*bbecb9d1SAndroid Build Coastguard Worker
505*bbecb9d1SAndroid Build Coastguard Worker if (frame_num == VA_INVALID_ID)
506*bbecb9d1SAndroid Build Coastguard Worker return VA_INVALID_ID;
507*bbecb9d1SAndroid Build Coastguard Worker
508*bbecb9d1SAndroid Build Coastguard Worker idx = frame_num % ARRAY_SIZE(codec->ref_pic_list);
509*bbecb9d1SAndroid Build Coastguard Worker
510*bbecb9d1SAndroid Build Coastguard Worker if (!codec->ref_pic_list[idx]) {
511*bbecb9d1SAndroid Build Coastguard Worker args.format = PIPE_FORMAT_NV21;
512*bbecb9d1SAndroid Build Coastguard Worker args.width = codec->width;
513*bbecb9d1SAndroid Build Coastguard Worker args.height = codec->height;
514*bbecb9d1SAndroid Build Coastguard Worker args.interlaced = 0;
515*bbecb9d1SAndroid Build Coastguard Worker args.opaque = NULL;
516*bbecb9d1SAndroid Build Coastguard Worker codec->ref_pic_list[idx] = virgl_video_create_buffer(&args);
517*bbecb9d1SAndroid Build Coastguard Worker if (!codec->ref_pic_list[idx]) {
518*bbecb9d1SAndroid Build Coastguard Worker virgl_log("create ref pic for frame_num %u failed\n", frame_num);
519*bbecb9d1SAndroid Build Coastguard Worker return VA_INVALID_ID;
520*bbecb9d1SAndroid Build Coastguard Worker }
521*bbecb9d1SAndroid Build Coastguard Worker }
522*bbecb9d1SAndroid Build Coastguard Worker
523*bbecb9d1SAndroid Build Coastguard Worker return codec->ref_pic_list[idx]->va_sfc;
524*bbecb9d1SAndroid Build Coastguard Worker }
525*bbecb9d1SAndroid Build Coastguard Worker
virgl_video_init(int drm_fd,struct virgl_video_callbacks * cbs,unsigned int flags)526*bbecb9d1SAndroid Build Coastguard Worker int virgl_video_init(int drm_fd,
527*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_callbacks *cbs, unsigned int flags)
528*bbecb9d1SAndroid Build Coastguard Worker {
529*bbecb9d1SAndroid Build Coastguard Worker VAStatus va_stat;
530*bbecb9d1SAndroid Build Coastguard Worker int major_ver, minor_ver;
531*bbecb9d1SAndroid Build Coastguard Worker const char *driver;
532*bbecb9d1SAndroid Build Coastguard Worker
533*bbecb9d1SAndroid Build Coastguard Worker (void)flags;
534*bbecb9d1SAndroid Build Coastguard Worker
535*bbecb9d1SAndroid Build Coastguard Worker if (drm_fd < 0) {
536*bbecb9d1SAndroid Build Coastguard Worker virgl_log("invalid drm fd: %d\n", drm_fd);
537*bbecb9d1SAndroid Build Coastguard Worker return -1;
538*bbecb9d1SAndroid Build Coastguard Worker }
539*bbecb9d1SAndroid Build Coastguard Worker
540*bbecb9d1SAndroid Build Coastguard Worker va_dpy = vaGetDisplayDRM(drm_fd);
541*bbecb9d1SAndroid Build Coastguard Worker if (!va_dpy) {
542*bbecb9d1SAndroid Build Coastguard Worker virgl_log("get va display failed\n");
543*bbecb9d1SAndroid Build Coastguard Worker return -1;
544*bbecb9d1SAndroid Build Coastguard Worker }
545*bbecb9d1SAndroid Build Coastguard Worker
546*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaInitialize(va_dpy, &major_ver, &minor_ver);
547*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
548*bbecb9d1SAndroid Build Coastguard Worker virgl_log("init va library failed\n");
549*bbecb9d1SAndroid Build Coastguard Worker virgl_video_destroy();
550*bbecb9d1SAndroid Build Coastguard Worker return -1;
551*bbecb9d1SAndroid Build Coastguard Worker }
552*bbecb9d1SAndroid Build Coastguard Worker
553*bbecb9d1SAndroid Build Coastguard Worker virgl_log("VA-API version: %d.%d\n", major_ver, minor_ver);
554*bbecb9d1SAndroid Build Coastguard Worker
555*bbecb9d1SAndroid Build Coastguard Worker driver = vaQueryVendorString(va_dpy);
556*bbecb9d1SAndroid Build Coastguard Worker virgl_log("Driver version: %s\n", driver ? driver : "<unknown>");
557*bbecb9d1SAndroid Build Coastguard Worker
558*bbecb9d1SAndroid Build Coastguard Worker if (!driver || !strstr(driver, "Mesa Gallium")) {
559*bbecb9d1SAndroid Build Coastguard Worker virgl_log("only supports mesa va drivers now\n");
560*bbecb9d1SAndroid Build Coastguard Worker virgl_video_destroy();
561*bbecb9d1SAndroid Build Coastguard Worker return -1;
562*bbecb9d1SAndroid Build Coastguard Worker }
563*bbecb9d1SAndroid Build Coastguard Worker
564*bbecb9d1SAndroid Build Coastguard Worker callbacks = cbs;
565*bbecb9d1SAndroid Build Coastguard Worker
566*bbecb9d1SAndroid Build Coastguard Worker return 0;
567*bbecb9d1SAndroid Build Coastguard Worker }
568*bbecb9d1SAndroid Build Coastguard Worker
virgl_video_destroy(void)569*bbecb9d1SAndroid Build Coastguard Worker void virgl_video_destroy(void)
570*bbecb9d1SAndroid Build Coastguard Worker {
571*bbecb9d1SAndroid Build Coastguard Worker if (va_dpy) {
572*bbecb9d1SAndroid Build Coastguard Worker vaTerminate(va_dpy);
573*bbecb9d1SAndroid Build Coastguard Worker va_dpy = NULL;
574*bbecb9d1SAndroid Build Coastguard Worker }
575*bbecb9d1SAndroid Build Coastguard Worker
576*bbecb9d1SAndroid Build Coastguard Worker callbacks = NULL;
577*bbecb9d1SAndroid Build Coastguard Worker }
578*bbecb9d1SAndroid Build Coastguard Worker
fill_vcaps_entry(VAProfile profile,VAEntrypoint entrypoint,struct virgl_video_caps * vcaps)579*bbecb9d1SAndroid Build Coastguard Worker static int fill_vcaps_entry(VAProfile profile, VAEntrypoint entrypoint,
580*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_caps *vcaps)
581*bbecb9d1SAndroid Build Coastguard Worker {
582*bbecb9d1SAndroid Build Coastguard Worker VAConfigID cfg;
583*bbecb9d1SAndroid Build Coastguard Worker VASurfaceAttrib *attrs;
584*bbecb9d1SAndroid Build Coastguard Worker unsigned i, num_attrs;
585*bbecb9d1SAndroid Build Coastguard Worker
586*bbecb9d1SAndroid Build Coastguard Worker /* FIXME: default values */
587*bbecb9d1SAndroid Build Coastguard Worker vcaps->profile = pipe_profile_from_va(profile);
588*bbecb9d1SAndroid Build Coastguard Worker vcaps->entrypoint = pipe_entrypoint_from_va(entrypoint);
589*bbecb9d1SAndroid Build Coastguard Worker vcaps->max_level = 0;
590*bbecb9d1SAndroid Build Coastguard Worker vcaps->stacked_frames = 0;
591*bbecb9d1SAndroid Build Coastguard Worker vcaps->max_width = 0;
592*bbecb9d1SAndroid Build Coastguard Worker vcaps->max_height = 0;
593*bbecb9d1SAndroid Build Coastguard Worker vcaps->prefered_format = PIPE_FORMAT_NONE;
594*bbecb9d1SAndroid Build Coastguard Worker vcaps->max_macroblocks = 1;
595*bbecb9d1SAndroid Build Coastguard Worker vcaps->npot_texture = 1;
596*bbecb9d1SAndroid Build Coastguard Worker vcaps->supports_progressive = 1;
597*bbecb9d1SAndroid Build Coastguard Worker vcaps->supports_interlaced = 0;
598*bbecb9d1SAndroid Build Coastguard Worker vcaps->prefers_interlaced = 0;
599*bbecb9d1SAndroid Build Coastguard Worker vcaps->max_temporal_layers = 0;
600*bbecb9d1SAndroid Build Coastguard Worker
601*bbecb9d1SAndroid Build Coastguard Worker vaCreateConfig(va_dpy, profile, entrypoint, NULL, 0, &cfg);
602*bbecb9d1SAndroid Build Coastguard Worker
603*bbecb9d1SAndroid Build Coastguard Worker vaQuerySurfaceAttributes(va_dpy, cfg, NULL, &num_attrs);
604*bbecb9d1SAndroid Build Coastguard Worker attrs = calloc(num_attrs, sizeof(VASurfaceAttrib));
605*bbecb9d1SAndroid Build Coastguard Worker if (!attrs)
606*bbecb9d1SAndroid Build Coastguard Worker return -1;
607*bbecb9d1SAndroid Build Coastguard Worker
608*bbecb9d1SAndroid Build Coastguard Worker vaQuerySurfaceAttributes(va_dpy, cfg, attrs, &num_attrs);
609*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < num_attrs; i++) {
610*bbecb9d1SAndroid Build Coastguard Worker switch (attrs[i].type) {
611*bbecb9d1SAndroid Build Coastguard Worker case VASurfaceAttribMaxHeight:
612*bbecb9d1SAndroid Build Coastguard Worker vcaps->max_height = attrs[i].value.value.i;
613*bbecb9d1SAndroid Build Coastguard Worker break;
614*bbecb9d1SAndroid Build Coastguard Worker case VASurfaceAttribMaxWidth:
615*bbecb9d1SAndroid Build Coastguard Worker vcaps->max_width = attrs[i].value.value.i;
616*bbecb9d1SAndroid Build Coastguard Worker break;
617*bbecb9d1SAndroid Build Coastguard Worker case VASurfaceAttribPixelFormat:
618*bbecb9d1SAndroid Build Coastguard Worker if (PIPE_FORMAT_NONE == vcaps->prefered_format)
619*bbecb9d1SAndroid Build Coastguard Worker vcaps->prefered_format = \
620*bbecb9d1SAndroid Build Coastguard Worker pipe_format_from_va_fourcc(attrs[i].value.value.i);
621*bbecb9d1SAndroid Build Coastguard Worker break;
622*bbecb9d1SAndroid Build Coastguard Worker default:
623*bbecb9d1SAndroid Build Coastguard Worker break;
624*bbecb9d1SAndroid Build Coastguard Worker }
625*bbecb9d1SAndroid Build Coastguard Worker }
626*bbecb9d1SAndroid Build Coastguard Worker
627*bbecb9d1SAndroid Build Coastguard Worker free(attrs);
628*bbecb9d1SAndroid Build Coastguard Worker
629*bbecb9d1SAndroid Build Coastguard Worker vaDestroyConfig(va_dpy, cfg);
630*bbecb9d1SAndroid Build Coastguard Worker
631*bbecb9d1SAndroid Build Coastguard Worker return 0;
632*bbecb9d1SAndroid Build Coastguard Worker }
633*bbecb9d1SAndroid Build Coastguard Worker
virgl_video_fill_caps(union virgl_caps * caps)634*bbecb9d1SAndroid Build Coastguard Worker int virgl_video_fill_caps(union virgl_caps *caps)
635*bbecb9d1SAndroid Build Coastguard Worker {
636*bbecb9d1SAndroid Build Coastguard Worker int i, j;
637*bbecb9d1SAndroid Build Coastguard Worker int num_profiles, num_entrypoints;
638*bbecb9d1SAndroid Build Coastguard Worker VAProfile *profiles = NULL;
639*bbecb9d1SAndroid Build Coastguard Worker VAEntrypoint *entrypoints = NULL;
640*bbecb9d1SAndroid Build Coastguard Worker
641*bbecb9d1SAndroid Build Coastguard Worker if (!va_dpy || !caps)
642*bbecb9d1SAndroid Build Coastguard Worker return -1;
643*bbecb9d1SAndroid Build Coastguard Worker
644*bbecb9d1SAndroid Build Coastguard Worker num_entrypoints = vaMaxNumEntrypoints(va_dpy);
645*bbecb9d1SAndroid Build Coastguard Worker entrypoints = calloc(num_entrypoints, sizeof(VAEntrypoint));
646*bbecb9d1SAndroid Build Coastguard Worker if (!entrypoints)
647*bbecb9d1SAndroid Build Coastguard Worker return -1;
648*bbecb9d1SAndroid Build Coastguard Worker
649*bbecb9d1SAndroid Build Coastguard Worker num_profiles = vaMaxNumProfiles(va_dpy);
650*bbecb9d1SAndroid Build Coastguard Worker profiles = calloc(num_profiles, sizeof(VAProfile));
651*bbecb9d1SAndroid Build Coastguard Worker if (!profiles) {
652*bbecb9d1SAndroid Build Coastguard Worker free(entrypoints);
653*bbecb9d1SAndroid Build Coastguard Worker return -1;
654*bbecb9d1SAndroid Build Coastguard Worker }
655*bbecb9d1SAndroid Build Coastguard Worker
656*bbecb9d1SAndroid Build Coastguard Worker vaQueryConfigProfiles(va_dpy, profiles, &num_profiles);
657*bbecb9d1SAndroid Build Coastguard Worker for (i = 0, caps->v2.num_video_caps = 0; i < num_profiles; i++) {
658*bbecb9d1SAndroid Build Coastguard Worker /* only support H.264 and H.265 now */
659*bbecb9d1SAndroid Build Coastguard Worker if (profiles[i] != VAProfileH264Main &&
660*bbecb9d1SAndroid Build Coastguard Worker profiles[i] != VAProfileH264High &&
661*bbecb9d1SAndroid Build Coastguard Worker profiles[i] != VAProfileH264ConstrainedBaseline &&
662*bbecb9d1SAndroid Build Coastguard Worker profiles[i] != VAProfileHEVCMain)
663*bbecb9d1SAndroid Build Coastguard Worker continue;
664*bbecb9d1SAndroid Build Coastguard Worker
665*bbecb9d1SAndroid Build Coastguard Worker vaQueryConfigEntrypoints(va_dpy, profiles[i],
666*bbecb9d1SAndroid Build Coastguard Worker entrypoints, &num_entrypoints);
667*bbecb9d1SAndroid Build Coastguard Worker for (j = 0; j < num_entrypoints &&
668*bbecb9d1SAndroid Build Coastguard Worker caps->v2.num_video_caps < ARRAY_SIZE(caps->v2.video_caps); j++) {
669*bbecb9d1SAndroid Build Coastguard Worker /* support encoding and decoding */
670*bbecb9d1SAndroid Build Coastguard Worker if (VAEntrypointVLD != entrypoints[j] &&
671*bbecb9d1SAndroid Build Coastguard Worker VAEntrypointEncSlice != entrypoints[j])
672*bbecb9d1SAndroid Build Coastguard Worker continue;
673*bbecb9d1SAndroid Build Coastguard Worker
674*bbecb9d1SAndroid Build Coastguard Worker fill_vcaps_entry(profiles[i], entrypoints[j],
675*bbecb9d1SAndroid Build Coastguard Worker &caps->v2.video_caps[caps->v2.num_video_caps++]);
676*bbecb9d1SAndroid Build Coastguard Worker }
677*bbecb9d1SAndroid Build Coastguard Worker }
678*bbecb9d1SAndroid Build Coastguard Worker
679*bbecb9d1SAndroid Build Coastguard Worker free(profiles);
680*bbecb9d1SAndroid Build Coastguard Worker free(entrypoints);
681*bbecb9d1SAndroid Build Coastguard Worker
682*bbecb9d1SAndroid Build Coastguard Worker return 0;
683*bbecb9d1SAndroid Build Coastguard Worker }
684*bbecb9d1SAndroid Build Coastguard Worker
virgl_video_create_codec(const struct virgl_video_create_codec_args * args)685*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *virgl_video_create_codec(
686*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_video_create_codec_args *args)
687*bbecb9d1SAndroid Build Coastguard Worker {
688*bbecb9d1SAndroid Build Coastguard Worker VAStatus va_stat;
689*bbecb9d1SAndroid Build Coastguard Worker VAConfigID cfg;
690*bbecb9d1SAndroid Build Coastguard Worker VAContextID ctx;
691*bbecb9d1SAndroid Build Coastguard Worker VAConfigAttrib attr;
692*bbecb9d1SAndroid Build Coastguard Worker VAProfile profile;
693*bbecb9d1SAndroid Build Coastguard Worker VAEntrypoint entrypoint;
694*bbecb9d1SAndroid Build Coastguard Worker uint32_t format;
695*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec;
696*bbecb9d1SAndroid Build Coastguard Worker
697*bbecb9d1SAndroid Build Coastguard Worker if (!va_dpy || !args)
698*bbecb9d1SAndroid Build Coastguard Worker return NULL;
699*bbecb9d1SAndroid Build Coastguard Worker
700*bbecb9d1SAndroid Build Coastguard Worker profile = va_profile_from_pipe(args->profile);
701*bbecb9d1SAndroid Build Coastguard Worker entrypoint = va_entrypoint_from_pipe(args->entrypoint);
702*bbecb9d1SAndroid Build Coastguard Worker format = va_format_from_pipe_chroma(args->chroma_format);
703*bbecb9d1SAndroid Build Coastguard Worker if (VAProfileNone == profile || VAEntrypointNone == entrypoint)
704*bbecb9d1SAndroid Build Coastguard Worker return NULL;
705*bbecb9d1SAndroid Build Coastguard Worker
706*bbecb9d1SAndroid Build Coastguard Worker codec = (struct virgl_video_codec *)calloc(1, sizeof(*codec));
707*bbecb9d1SAndroid Build Coastguard Worker if (!codec)
708*bbecb9d1SAndroid Build Coastguard Worker return NULL;
709*bbecb9d1SAndroid Build Coastguard Worker
710*bbecb9d1SAndroid Build Coastguard Worker attr.type = VAConfigAttribRTFormat;
711*bbecb9d1SAndroid Build Coastguard Worker vaGetConfigAttributes(va_dpy, profile, entrypoint, &attr, 1);
712*bbecb9d1SAndroid Build Coastguard Worker if (!(attr.value & format)) {
713*bbecb9d1SAndroid Build Coastguard Worker virgl_log("format 0x%x not supported, supported formats: 0x%x\n",
714*bbecb9d1SAndroid Build Coastguard Worker format, attr.value);
715*bbecb9d1SAndroid Build Coastguard Worker goto err;
716*bbecb9d1SAndroid Build Coastguard Worker }
717*bbecb9d1SAndroid Build Coastguard Worker
718*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaCreateConfig(va_dpy, profile, entrypoint, &attr, 1, &cfg);
719*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
720*bbecb9d1SAndroid Build Coastguard Worker virgl_log("create config failed, err = 0x%x\n", va_stat);
721*bbecb9d1SAndroid Build Coastguard Worker goto err;
722*bbecb9d1SAndroid Build Coastguard Worker }
723*bbecb9d1SAndroid Build Coastguard Worker codec->va_cfg = cfg;
724*bbecb9d1SAndroid Build Coastguard Worker
725*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaCreateContext(va_dpy, cfg, args->width, args->height,
726*bbecb9d1SAndroid Build Coastguard Worker VA_PROGRESSIVE, NULL, 0, &ctx);
727*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
728*bbecb9d1SAndroid Build Coastguard Worker virgl_log("create context failed, err = 0x%x\n", va_stat);
729*bbecb9d1SAndroid Build Coastguard Worker goto err;
730*bbecb9d1SAndroid Build Coastguard Worker }
731*bbecb9d1SAndroid Build Coastguard Worker codec->va_ctx = ctx;
732*bbecb9d1SAndroid Build Coastguard Worker
733*bbecb9d1SAndroid Build Coastguard Worker codec->profile = args->profile;
734*bbecb9d1SAndroid Build Coastguard Worker codec->level = args->level;
735*bbecb9d1SAndroid Build Coastguard Worker codec->entrypoint = args->entrypoint;
736*bbecb9d1SAndroid Build Coastguard Worker codec->chroma_format = args->chroma_format;
737*bbecb9d1SAndroid Build Coastguard Worker codec->width = args->width;
738*bbecb9d1SAndroid Build Coastguard Worker codec->height = args->height;
739*bbecb9d1SAndroid Build Coastguard Worker codec->max_references = args->max_references;
740*bbecb9d1SAndroid Build Coastguard Worker codec->opaque = args->opaque;
741*bbecb9d1SAndroid Build Coastguard Worker
742*bbecb9d1SAndroid Build Coastguard Worker if (entrypoint == VAEntrypointEncSlice) {
743*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VAEncCodedBufferType,
744*bbecb9d1SAndroid Build Coastguard Worker CODED_BUF_DEFAULT_SIZE(codec->width, codec->height),
745*bbecb9d1SAndroid Build Coastguard Worker 1, NULL, &codec->va_coded_buf);
746*bbecb9d1SAndroid Build Coastguard Worker }
747*bbecb9d1SAndroid Build Coastguard Worker
748*bbecb9d1SAndroid Build Coastguard Worker return codec;
749*bbecb9d1SAndroid Build Coastguard Worker
750*bbecb9d1SAndroid Build Coastguard Worker err:
751*bbecb9d1SAndroid Build Coastguard Worker virgl_video_destroy_codec(codec);
752*bbecb9d1SAndroid Build Coastguard Worker
753*bbecb9d1SAndroid Build Coastguard Worker return NULL;
754*bbecb9d1SAndroid Build Coastguard Worker }
755*bbecb9d1SAndroid Build Coastguard Worker
virgl_video_destroy_codec(struct virgl_video_codec * codec)756*bbecb9d1SAndroid Build Coastguard Worker void virgl_video_destroy_codec(struct virgl_video_codec *codec)
757*bbecb9d1SAndroid Build Coastguard Worker {
758*bbecb9d1SAndroid Build Coastguard Worker unsigned i;
759*bbecb9d1SAndroid Build Coastguard Worker
760*bbecb9d1SAndroid Build Coastguard Worker if (!va_dpy || !codec)
761*bbecb9d1SAndroid Build Coastguard Worker return;
762*bbecb9d1SAndroid Build Coastguard Worker
763*bbecb9d1SAndroid Build Coastguard Worker if (codec->va_ctx)
764*bbecb9d1SAndroid Build Coastguard Worker vaDestroyContext(va_dpy, codec->va_ctx);
765*bbecb9d1SAndroid Build Coastguard Worker
766*bbecb9d1SAndroid Build Coastguard Worker if (codec->va_cfg)
767*bbecb9d1SAndroid Build Coastguard Worker vaDestroyConfig(va_dpy, codec->va_cfg);
768*bbecb9d1SAndroid Build Coastguard Worker
769*bbecb9d1SAndroid Build Coastguard Worker if (codec->va_coded_buf)
770*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, codec->va_coded_buf);
771*bbecb9d1SAndroid Build Coastguard Worker
772*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(codec->ref_pic_list); i++) {
773*bbecb9d1SAndroid Build Coastguard Worker if (codec->ref_pic_list[i])
774*bbecb9d1SAndroid Build Coastguard Worker free(codec->ref_pic_list[i]);
775*bbecb9d1SAndroid Build Coastguard Worker }
776*bbecb9d1SAndroid Build Coastguard Worker
777*bbecb9d1SAndroid Build Coastguard Worker free(codec);
778*bbecb9d1SAndroid Build Coastguard Worker }
779*bbecb9d1SAndroid Build Coastguard Worker
virgl_video_create_buffer(const struct virgl_video_create_buffer_args * args)780*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *virgl_video_create_buffer(
781*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_video_create_buffer_args *args)
782*bbecb9d1SAndroid Build Coastguard Worker {
783*bbecb9d1SAndroid Build Coastguard Worker VAStatus va_stat;
784*bbecb9d1SAndroid Build Coastguard Worker VASurfaceID sfc;
785*bbecb9d1SAndroid Build Coastguard Worker uint32_t format;
786*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *buffer;
787*bbecb9d1SAndroid Build Coastguard Worker
788*bbecb9d1SAndroid Build Coastguard Worker if (!va_dpy || !args)
789*bbecb9d1SAndroid Build Coastguard Worker return NULL;
790*bbecb9d1SAndroid Build Coastguard Worker
791*bbecb9d1SAndroid Build Coastguard Worker /*
792*bbecb9d1SAndroid Build Coastguard Worker * FIXME: always use YUV420 now,
793*bbecb9d1SAndroid Build Coastguard Worker * may be use va_format_from_pipe(args->format)
794*bbecb9d1SAndroid Build Coastguard Worker */
795*bbecb9d1SAndroid Build Coastguard Worker format = VA_RT_FORMAT_YUV420;
796*bbecb9d1SAndroid Build Coastguard Worker if (!format) {
797*bbecb9d1SAndroid Build Coastguard Worker virgl_log("pipe format %d not supported\n", args->format);
798*bbecb9d1SAndroid Build Coastguard Worker return NULL;
799*bbecb9d1SAndroid Build Coastguard Worker }
800*bbecb9d1SAndroid Build Coastguard Worker
801*bbecb9d1SAndroid Build Coastguard Worker buffer = (struct virgl_video_buffer *)calloc(1, sizeof(*buffer));
802*bbecb9d1SAndroid Build Coastguard Worker if (!buffer)
803*bbecb9d1SAndroid Build Coastguard Worker return NULL;
804*bbecb9d1SAndroid Build Coastguard Worker
805*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaCreateSurfaces(va_dpy, format,
806*bbecb9d1SAndroid Build Coastguard Worker args->width, args->height, &sfc, 1, NULL, 0);
807*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
808*bbecb9d1SAndroid Build Coastguard Worker free(buffer);
809*bbecb9d1SAndroid Build Coastguard Worker return NULL;
810*bbecb9d1SAndroid Build Coastguard Worker }
811*bbecb9d1SAndroid Build Coastguard Worker
812*bbecb9d1SAndroid Build Coastguard Worker buffer->va_sfc = sfc;
813*bbecb9d1SAndroid Build Coastguard Worker buffer->format = args->format;
814*bbecb9d1SAndroid Build Coastguard Worker buffer->width = args->width;
815*bbecb9d1SAndroid Build Coastguard Worker buffer->height = args->height;
816*bbecb9d1SAndroid Build Coastguard Worker buffer->opaque = args->opaque;
817*bbecb9d1SAndroid Build Coastguard Worker
818*bbecb9d1SAndroid Build Coastguard Worker return buffer;
819*bbecb9d1SAndroid Build Coastguard Worker }
820*bbecb9d1SAndroid Build Coastguard Worker
virgl_video_destroy_buffer(struct virgl_video_buffer * buffer)821*bbecb9d1SAndroid Build Coastguard Worker void virgl_video_destroy_buffer(struct virgl_video_buffer *buffer)
822*bbecb9d1SAndroid Build Coastguard Worker {
823*bbecb9d1SAndroid Build Coastguard Worker if (!va_dpy || !buffer)
824*bbecb9d1SAndroid Build Coastguard Worker return;
825*bbecb9d1SAndroid Build Coastguard Worker
826*bbecb9d1SAndroid Build Coastguard Worker if (buffer->dmabuf)
827*bbecb9d1SAndroid Build Coastguard Worker destroy_video_dma_buf(buffer->dmabuf);
828*bbecb9d1SAndroid Build Coastguard Worker
829*bbecb9d1SAndroid Build Coastguard Worker if (buffer->va_sfc)
830*bbecb9d1SAndroid Build Coastguard Worker vaDestroySurfaces(va_dpy, &buffer->va_sfc, 1);
831*bbecb9d1SAndroid Build Coastguard Worker
832*bbecb9d1SAndroid Build Coastguard Worker free(buffer);
833*bbecb9d1SAndroid Build Coastguard Worker }
834*bbecb9d1SAndroid Build Coastguard Worker
virgl_video_codec_opaque_data(struct virgl_video_codec * codec)835*bbecb9d1SAndroid Build Coastguard Worker void *virgl_video_codec_opaque_data(struct virgl_video_codec *codec)
836*bbecb9d1SAndroid Build Coastguard Worker {
837*bbecb9d1SAndroid Build Coastguard Worker return codec ? codec->opaque : NULL;
838*bbecb9d1SAndroid Build Coastguard Worker }
839*bbecb9d1SAndroid Build Coastguard Worker
virgl_video_codec_profile(const struct virgl_video_codec * codec)840*bbecb9d1SAndroid Build Coastguard Worker enum pipe_video_profile virgl_video_codec_profile(
841*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_video_codec *codec)
842*bbecb9d1SAndroid Build Coastguard Worker {
843*bbecb9d1SAndroid Build Coastguard Worker return codec ? codec->profile : PIPE_VIDEO_PROFILE_UNKNOWN;
844*bbecb9d1SAndroid Build Coastguard Worker }
845*bbecb9d1SAndroid Build Coastguard Worker
virgl_video_buffer_id(const struct virgl_video_buffer * buffer)846*bbecb9d1SAndroid Build Coastguard Worker uint32_t virgl_video_buffer_id(const struct virgl_video_buffer *buffer)
847*bbecb9d1SAndroid Build Coastguard Worker {
848*bbecb9d1SAndroid Build Coastguard Worker return (uint32_t)(buffer ? buffer->va_sfc : VA_INVALID_SURFACE);
849*bbecb9d1SAndroid Build Coastguard Worker }
850*bbecb9d1SAndroid Build Coastguard Worker
virgl_video_buffer_opaque_data(struct virgl_video_buffer * buffer)851*bbecb9d1SAndroid Build Coastguard Worker void *virgl_video_buffer_opaque_data(struct virgl_video_buffer *buffer)
852*bbecb9d1SAndroid Build Coastguard Worker {
853*bbecb9d1SAndroid Build Coastguard Worker return buffer ? buffer->opaque : NULL;
854*bbecb9d1SAndroid Build Coastguard Worker }
855*bbecb9d1SAndroid Build Coastguard Worker
virgl_video_begin_frame(struct virgl_video_codec * codec,struct virgl_video_buffer * target)856*bbecb9d1SAndroid Build Coastguard Worker int virgl_video_begin_frame(struct virgl_video_codec *codec,
857*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *target)
858*bbecb9d1SAndroid Build Coastguard Worker {
859*bbecb9d1SAndroid Build Coastguard Worker VAStatus va_stat;
860*bbecb9d1SAndroid Build Coastguard Worker
861*bbecb9d1SAndroid Build Coastguard Worker if (!va_dpy || !codec || !target)
862*bbecb9d1SAndroid Build Coastguard Worker return -1;
863*bbecb9d1SAndroid Build Coastguard Worker
864*bbecb9d1SAndroid Build Coastguard Worker if (codec->entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE)
865*bbecb9d1SAndroid Build Coastguard Worker encode_upload_picture(codec, target);
866*bbecb9d1SAndroid Build Coastguard Worker
867*bbecb9d1SAndroid Build Coastguard Worker codec->buffer = target;
868*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaBeginPicture(va_dpy, codec->va_ctx, target->va_sfc);
869*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
870*bbecb9d1SAndroid Build Coastguard Worker virgl_log("begin picture failed, err = 0x%x\n", va_stat);
871*bbecb9d1SAndroid Build Coastguard Worker return -1;
872*bbecb9d1SAndroid Build Coastguard Worker }
873*bbecb9d1SAndroid Build Coastguard Worker
874*bbecb9d1SAndroid Build Coastguard Worker return 0;
875*bbecb9d1SAndroid Build Coastguard Worker }
876*bbecb9d1SAndroid Build Coastguard Worker
877*bbecb9d1SAndroid Build Coastguard Worker
878*bbecb9d1SAndroid Build Coastguard Worker #define ITEM_SET(dest, src, member) \
879*bbecb9d1SAndroid Build Coastguard Worker (dest)->member = (src)->member
880*bbecb9d1SAndroid Build Coastguard Worker
881*bbecb9d1SAndroid Build Coastguard Worker #define ITEM_CPY(dest, src, member) \
882*bbecb9d1SAndroid Build Coastguard Worker memcpy(&(dest)->member, &(src)->member, sizeof((dest)->member))
883*bbecb9d1SAndroid Build Coastguard Worker
884*bbecb9d1SAndroid Build Coastguard Worker
h264_init_picture(VAPictureH264 * pic)885*bbecb9d1SAndroid Build Coastguard Worker static void h264_init_picture(VAPictureH264 *pic)
886*bbecb9d1SAndroid Build Coastguard Worker {
887*bbecb9d1SAndroid Build Coastguard Worker pic->picture_id = VA_INVALID_SURFACE;
888*bbecb9d1SAndroid Build Coastguard Worker pic->frame_idx = 0;
889*bbecb9d1SAndroid Build Coastguard Worker pic->flags = VA_PICTURE_H264_INVALID;
890*bbecb9d1SAndroid Build Coastguard Worker pic->TopFieldOrderCnt = 0;
891*bbecb9d1SAndroid Build Coastguard Worker pic->BottomFieldOrderCnt = 0;
892*bbecb9d1SAndroid Build Coastguard Worker }
893*bbecb9d1SAndroid Build Coastguard Worker
894*bbecb9d1SAndroid Build Coastguard Worker /*
895*bbecb9d1SAndroid Build Coastguard Worker * Refer to vlVaHandlePictureParameterBufferH264() in mesa,
896*bbecb9d1SAndroid Build Coastguard Worker * and comment out some unused parameters.
897*bbecb9d1SAndroid Build Coastguard Worker */
h264_fill_picture_param(struct virgl_video_codec * codec,struct virgl_video_buffer * target,const struct virgl_h264_picture_desc * desc,VAPictureParameterBufferH264 * vapp)898*bbecb9d1SAndroid Build Coastguard Worker static void h264_fill_picture_param(struct virgl_video_codec *codec,
899*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *target,
900*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h264_picture_desc *desc,
901*bbecb9d1SAndroid Build Coastguard Worker VAPictureParameterBufferH264 *vapp)
902*bbecb9d1SAndroid Build Coastguard Worker {
903*bbecb9d1SAndroid Build Coastguard Worker unsigned i;
904*bbecb9d1SAndroid Build Coastguard Worker VAPictureH264 *pic;
905*bbecb9d1SAndroid Build Coastguard Worker
906*bbecb9d1SAndroid Build Coastguard Worker (void)codec;
907*bbecb9d1SAndroid Build Coastguard Worker
908*bbecb9d1SAndroid Build Coastguard Worker /* CurrPic */
909*bbecb9d1SAndroid Build Coastguard Worker pic = &vapp->CurrPic;
910*bbecb9d1SAndroid Build Coastguard Worker pic->picture_id = target->va_sfc;
911*bbecb9d1SAndroid Build Coastguard Worker pic->frame_idx = desc->frame_num;
912*bbecb9d1SAndroid Build Coastguard Worker pic->flags = desc->is_reference ? VA_PICTURE_H264_SHORT_TERM_REFERENCE : 0;
913*bbecb9d1SAndroid Build Coastguard Worker if (desc->field_pic_flag)
914*bbecb9d1SAndroid Build Coastguard Worker pic->flags |= (desc->bottom_field_flag ? VA_PICTURE_H264_BOTTOM_FIELD
915*bbecb9d1SAndroid Build Coastguard Worker : VA_PICTURE_H264_TOP_FIELD);
916*bbecb9d1SAndroid Build Coastguard Worker pic->TopFieldOrderCnt = desc->field_order_cnt[0];
917*bbecb9d1SAndroid Build Coastguard Worker pic->BottomFieldOrderCnt = desc->field_order_cnt[1];
918*bbecb9d1SAndroid Build Coastguard Worker
919*bbecb9d1SAndroid Build Coastguard Worker
920*bbecb9d1SAndroid Build Coastguard Worker /* ReferenceFrames */
921*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(vapp->ReferenceFrames); i++)
922*bbecb9d1SAndroid Build Coastguard Worker h264_init_picture(&vapp->ReferenceFrames[i]);
923*bbecb9d1SAndroid Build Coastguard Worker
924*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < desc->num_ref_frames; i++) {
925*bbecb9d1SAndroid Build Coastguard Worker pic = &vapp->ReferenceFrames[i];
926*bbecb9d1SAndroid Build Coastguard Worker
927*bbecb9d1SAndroid Build Coastguard Worker pic->picture_id = desc->buffer_id[i];
928*bbecb9d1SAndroid Build Coastguard Worker pic->frame_idx = desc->frame_num_list[i];
929*bbecb9d1SAndroid Build Coastguard Worker pic->flags = (desc->is_long_term[i]
930*bbecb9d1SAndroid Build Coastguard Worker ? VA_PICTURE_H264_LONG_TERM_REFERENCE
931*bbecb9d1SAndroid Build Coastguard Worker : VA_PICTURE_H264_SHORT_TERM_REFERENCE);
932*bbecb9d1SAndroid Build Coastguard Worker if (desc->top_is_reference[i] && desc->bottom_is_reference[i]) {
933*bbecb9d1SAndroid Build Coastguard Worker // Full frame. This block intentionally left blank. No flags set.
934*bbecb9d1SAndroid Build Coastguard Worker } else {
935*bbecb9d1SAndroid Build Coastguard Worker if (desc->top_is_reference[i])
936*bbecb9d1SAndroid Build Coastguard Worker pic->flags |= VA_PICTURE_H264_TOP_FIELD;
937*bbecb9d1SAndroid Build Coastguard Worker else
938*bbecb9d1SAndroid Build Coastguard Worker pic->flags |= VA_PICTURE_H264_BOTTOM_FIELD;
939*bbecb9d1SAndroid Build Coastguard Worker }
940*bbecb9d1SAndroid Build Coastguard Worker pic->TopFieldOrderCnt = desc->field_order_cnt_list[i][0];
941*bbecb9d1SAndroid Build Coastguard Worker pic->BottomFieldOrderCnt = desc->field_order_cnt_list[i][1];
942*bbecb9d1SAndroid Build Coastguard Worker }
943*bbecb9d1SAndroid Build Coastguard Worker
944*bbecb9d1SAndroid Build Coastguard Worker //vapp->picture_width_in_mbs_minus1 = (codec->width - 1) / 16;
945*bbecb9d1SAndroid Build Coastguard Worker //vapp->picture_height_in_mbs_minus1 = (codec->height - 1) / 16;
946*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, bit_depth_luma_minus8);
947*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, bit_depth_chroma_minus8);
948*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, desc, num_ref_frames);
949*bbecb9d1SAndroid Build Coastguard Worker
950*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->seq_fields.bits, &desc->pps.sps, chroma_format_idc);
951*bbecb9d1SAndroid Build Coastguard Worker //vapp->seq_fields.bits.residual_colour_transform_flag = 0;
952*bbecb9d1SAndroid Build Coastguard Worker //vapp->seq_fields.bits.gaps_in_frame_num_value_allowed_flag = 0;
953*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->seq_fields.bits, &desc->pps.sps, frame_mbs_only_flag);
954*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->seq_fields.bits,
955*bbecb9d1SAndroid Build Coastguard Worker &desc->pps.sps, mb_adaptive_frame_field_flag);
956*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->seq_fields.bits, &desc->pps.sps, direct_8x8_inference_flag);
957*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->seq_fields.bits, &desc->pps.sps, MinLumaBiPredSize8x8);
958*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->seq_fields.bits, &desc->pps.sps, log2_max_frame_num_minus4);
959*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->seq_fields.bits, &desc->pps.sps, pic_order_cnt_type);
960*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->seq_fields.bits,
961*bbecb9d1SAndroid Build Coastguard Worker &desc->pps.sps, log2_max_pic_order_cnt_lsb_minus4);
962*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->seq_fields.bits,
963*bbecb9d1SAndroid Build Coastguard Worker &desc->pps.sps, delta_pic_order_always_zero_flag);
964*bbecb9d1SAndroid Build Coastguard Worker
965*bbecb9d1SAndroid Build Coastguard Worker //ITEM_SET(vapp, &desc->pps, num_slice_groups_minus1);
966*bbecb9d1SAndroid Build Coastguard Worker //ITEM_SET(vapp, &desc->pps, slice_group_map_type);
967*bbecb9d1SAndroid Build Coastguard Worker //ITEM_SET(vapp, &desc->pps, slice_group_change_rate_minus1);
968*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, pic_init_qp_minus26);
969*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, pic_init_qs_minus26);
970*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, chroma_qp_index_offset);
971*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, second_chroma_qp_index_offset);
972*bbecb9d1SAndroid Build Coastguard Worker
973*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits, &desc->pps, entropy_coding_mode_flag);
974*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits, &desc->pps, weighted_pred_flag);
975*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits, &desc->pps, weighted_bipred_idc);
976*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits, &desc->pps, transform_8x8_mode_flag);
977*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits, desc, field_pic_flag);
978*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits, &desc->pps, constrained_intra_pred_flag);
979*bbecb9d1SAndroid Build Coastguard Worker vapp->pic_fields.bits.pic_order_present_flag =
980*bbecb9d1SAndroid Build Coastguard Worker desc->pps.bottom_field_pic_order_in_frame_present_flag;
981*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits,
982*bbecb9d1SAndroid Build Coastguard Worker &desc->pps, deblocking_filter_control_present_flag);
983*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits,
984*bbecb9d1SAndroid Build Coastguard Worker &desc->pps, redundant_pic_cnt_present_flag);
985*bbecb9d1SAndroid Build Coastguard Worker vapp->pic_fields.bits.reference_pic_flag = desc->is_reference;
986*bbecb9d1SAndroid Build Coastguard Worker
987*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, desc, frame_num);
988*bbecb9d1SAndroid Build Coastguard Worker }
989*bbecb9d1SAndroid Build Coastguard Worker
990*bbecb9d1SAndroid Build Coastguard Worker
991*bbecb9d1SAndroid Build Coastguard Worker /* Refer to vlVaHandleIQMatrixBufferH264() in mesa */
h264_fill_iq_matrix(const struct virgl_h264_picture_desc * desc,VAIQMatrixBufferH264 * vaiqm)992*bbecb9d1SAndroid Build Coastguard Worker static void h264_fill_iq_matrix(const struct virgl_h264_picture_desc *desc,
993*bbecb9d1SAndroid Build Coastguard Worker VAIQMatrixBufferH264 *vaiqm)
994*bbecb9d1SAndroid Build Coastguard Worker {
995*bbecb9d1SAndroid Build Coastguard Worker ITEM_CPY(vaiqm, &desc->pps, ScalingList4x4);
996*bbecb9d1SAndroid Build Coastguard Worker ITEM_CPY(vaiqm, &desc->pps, ScalingList8x8);
997*bbecb9d1SAndroid Build Coastguard Worker }
998*bbecb9d1SAndroid Build Coastguard Worker
999*bbecb9d1SAndroid Build Coastguard Worker /*
1000*bbecb9d1SAndroid Build Coastguard Worker * Refer to vlVaHandleSliceParameterBufferH264() in mesa,
1001*bbecb9d1SAndroid Build Coastguard Worker * and comment out some unused parameters.
1002*bbecb9d1SAndroid Build Coastguard Worker */
h264_fill_slice_param(const struct virgl_h264_picture_desc * desc,VASliceParameterBufferH264 * vasp)1003*bbecb9d1SAndroid Build Coastguard Worker static void h264_fill_slice_param(const struct virgl_h264_picture_desc *desc,
1004*bbecb9d1SAndroid Build Coastguard Worker VASliceParameterBufferH264 *vasp)
1005*bbecb9d1SAndroid Build Coastguard Worker {
1006*bbecb9d1SAndroid Build Coastguard Worker //vasp->slice_data_size;
1007*bbecb9d1SAndroid Build Coastguard Worker //vasp->slice_data_offset;
1008*bbecb9d1SAndroid Build Coastguard Worker //vasp->slice_data_flag;
1009*bbecb9d1SAndroid Build Coastguard Worker //vasp->slice_data_bit_offset;
1010*bbecb9d1SAndroid Build Coastguard Worker //vasp->first_mb_in_slice;
1011*bbecb9d1SAndroid Build Coastguard Worker //vasp->slice_type;
1012*bbecb9d1SAndroid Build Coastguard Worker //vasp->direct_spatial_mv_pred_flag;
1013*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vasp, desc, num_ref_idx_l0_active_minus1);
1014*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vasp, desc, num_ref_idx_l1_active_minus1);
1015*bbecb9d1SAndroid Build Coastguard Worker //vasp->cabac_init_idc;
1016*bbecb9d1SAndroid Build Coastguard Worker //vasp->slice_qp_delta;
1017*bbecb9d1SAndroid Build Coastguard Worker //vasp->disable_deblocking_filter_idc;
1018*bbecb9d1SAndroid Build Coastguard Worker //vasp->slice_alpha_c0_offset_div2;
1019*bbecb9d1SAndroid Build Coastguard Worker //vasp->slice_beta_offset_div2;
1020*bbecb9d1SAndroid Build Coastguard Worker //vasp->RefPicList0[32];
1021*bbecb9d1SAndroid Build Coastguard Worker //vasp->RefPicList1[32];
1022*bbecb9d1SAndroid Build Coastguard Worker
1023*bbecb9d1SAndroid Build Coastguard Worker /* see pred_weight_table */
1024*bbecb9d1SAndroid Build Coastguard Worker //vasp->luma_log2_weight_denom;
1025*bbecb9d1SAndroid Build Coastguard Worker //vasp->chroma_log2_weight_denom;
1026*bbecb9d1SAndroid Build Coastguard Worker //vasp->luma_weight_l0_flag;
1027*bbecb9d1SAndroid Build Coastguard Worker //vasp->luma_weight_l0[32];
1028*bbecb9d1SAndroid Build Coastguard Worker //vasp->luma_offset_l0[32];
1029*bbecb9d1SAndroid Build Coastguard Worker //vasp->chroma_weight_l0_flag;
1030*bbecb9d1SAndroid Build Coastguard Worker //vasp->chroma_weight_l0[32][2];
1031*bbecb9d1SAndroid Build Coastguard Worker //vasp->chroma_offset_l0[32][2];
1032*bbecb9d1SAndroid Build Coastguard Worker //vasp->luma_weight_l1_flag;
1033*bbecb9d1SAndroid Build Coastguard Worker //vasp->luma_weight_l1[32];
1034*bbecb9d1SAndroid Build Coastguard Worker //vasp->luma_offset_l1[32];
1035*bbecb9d1SAndroid Build Coastguard Worker //vasp->chroma_weight_l1_flag;
1036*bbecb9d1SAndroid Build Coastguard Worker //vasp->chroma_weight_l1[32][2];
1037*bbecb9d1SAndroid Build Coastguard Worker //vasp->chroma_offset_l1[32][2];
1038*bbecb9d1SAndroid Build Coastguard Worker }
1039*bbecb9d1SAndroid Build Coastguard Worker
1040*bbecb9d1SAndroid Build Coastguard Worker /*
1041*bbecb9d1SAndroid Build Coastguard Worker * Refer to vlVaHandleVAEncPictureParameterBufferTypeH264() in mesa,
1042*bbecb9d1SAndroid Build Coastguard Worker * and comment out some unused parameters.
1043*bbecb9d1SAndroid Build Coastguard Worker */
h264_fill_enc_picture_param(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h264_enc_picture_desc * desc,VAEncPictureParameterBufferH264 * param)1044*bbecb9d1SAndroid Build Coastguard Worker static void h264_fill_enc_picture_param(
1045*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
1046*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
1047*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h264_enc_picture_desc *desc,
1048*bbecb9d1SAndroid Build Coastguard Worker VAEncPictureParameterBufferH264 *param)
1049*bbecb9d1SAndroid Build Coastguard Worker {
1050*bbecb9d1SAndroid Build Coastguard Worker unsigned i;
1051*bbecb9d1SAndroid Build Coastguard Worker
1052*bbecb9d1SAndroid Build Coastguard Worker (void)codec;
1053*bbecb9d1SAndroid Build Coastguard Worker (void)source;
1054*bbecb9d1SAndroid Build Coastguard Worker
1055*bbecb9d1SAndroid Build Coastguard Worker /* CurrPic */
1056*bbecb9d1SAndroid Build Coastguard Worker param->CurrPic.picture_id = get_enc_ref_pic(codec, desc->frame_num);
1057*bbecb9d1SAndroid Build Coastguard Worker //CurrPic.frame_idx;
1058*bbecb9d1SAndroid Build Coastguard Worker //CurrPic.flags;
1059*bbecb9d1SAndroid Build Coastguard Worker param->CurrPic.TopFieldOrderCnt = desc->pic_order_cnt;
1060*bbecb9d1SAndroid Build Coastguard Worker //CurrPic.BottomFieldOrderCnt;
1061*bbecb9d1SAndroid Build Coastguard Worker
1062*bbecb9d1SAndroid Build Coastguard Worker /* ReferenceFrames */
1063*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(param->ReferenceFrames); i++)
1064*bbecb9d1SAndroid Build Coastguard Worker h264_init_picture(¶m->ReferenceFrames[i]);
1065*bbecb9d1SAndroid Build Coastguard Worker
1066*bbecb9d1SAndroid Build Coastguard Worker /* coded_buf */
1067*bbecb9d1SAndroid Build Coastguard Worker param->coded_buf = codec->va_coded_buf;
1068*bbecb9d1SAndroid Build Coastguard Worker
1069*bbecb9d1SAndroid Build Coastguard Worker //pic_parameter_set_id;
1070*bbecb9d1SAndroid Build Coastguard Worker //seq_parameter_set_id;
1071*bbecb9d1SAndroid Build Coastguard Worker //last_picture;
1072*bbecb9d1SAndroid Build Coastguard Worker //frame_num
1073*bbecb9d1SAndroid Build Coastguard Worker param->pic_init_qp = desc->quant_i_frames;
1074*bbecb9d1SAndroid Build Coastguard Worker param->num_ref_idx_l0_active_minus1 = desc->num_ref_idx_l0_active_minus1;
1075*bbecb9d1SAndroid Build Coastguard Worker param->num_ref_idx_l1_active_minus1 = desc->num_ref_idx_l1_active_minus1;
1076*bbecb9d1SAndroid Build Coastguard Worker //chroma_qp_index_offset;
1077*bbecb9d1SAndroid Build Coastguard Worker //second_chroma_qp_index_offset;
1078*bbecb9d1SAndroid Build Coastguard Worker
1079*bbecb9d1SAndroid Build Coastguard Worker /* pic_fields */
1080*bbecb9d1SAndroid Build Coastguard Worker param->pic_fields.bits.idr_pic_flag =
1081*bbecb9d1SAndroid Build Coastguard Worker (desc->picture_type == PIPE_H2645_ENC_PICTURE_TYPE_IDR);
1082*bbecb9d1SAndroid Build Coastguard Worker param->pic_fields.bits.reference_pic_flag = !desc->not_referenced;
1083*bbecb9d1SAndroid Build Coastguard Worker param->pic_fields.bits.entropy_coding_mode_flag = desc->pic_ctrl.enc_cabac_enable;
1084*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.weighted_pred_flag
1085*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.weighted_bipred_idc
1086*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.constrained_intra_pred_flag
1087*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.transform_8x8_mode_flag
1088*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.deblocking_filter_control_present_flag
1089*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.redundant_pic_cnt_present_flag
1090*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.pic_order_present_flag
1091*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.pic_scaling_matrix_present_flag
1092*bbecb9d1SAndroid Build Coastguard Worker
1093*bbecb9d1SAndroid Build Coastguard Worker }
1094*bbecb9d1SAndroid Build Coastguard Worker
1095*bbecb9d1SAndroid Build Coastguard Worker /*
1096*bbecb9d1SAndroid Build Coastguard Worker * Refer to vlVaHandleVAEncSliceParameterBufferTypeH264() in mesa,
1097*bbecb9d1SAndroid Build Coastguard Worker * and comment out some unused parameters.
1098*bbecb9d1SAndroid Build Coastguard Worker */
h264_fill_enc_slice_param(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h264_enc_picture_desc * desc,VAEncSliceParameterBufferH264 * param)1099*bbecb9d1SAndroid Build Coastguard Worker static void h264_fill_enc_slice_param(
1100*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
1101*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
1102*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h264_enc_picture_desc *desc,
1103*bbecb9d1SAndroid Build Coastguard Worker VAEncSliceParameterBufferH264 *param)
1104*bbecb9d1SAndroid Build Coastguard Worker {
1105*bbecb9d1SAndroid Build Coastguard Worker unsigned i;
1106*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h264_slice_descriptor *sd;
1107*bbecb9d1SAndroid Build Coastguard Worker
1108*bbecb9d1SAndroid Build Coastguard Worker (void)codec;
1109*bbecb9d1SAndroid Build Coastguard Worker (void)source;
1110*bbecb9d1SAndroid Build Coastguard Worker
1111*bbecb9d1SAndroid Build Coastguard Worker /* Get the lastest slice descriptor */
1112*bbecb9d1SAndroid Build Coastguard Worker if (desc->num_slice_descriptors &&
1113*bbecb9d1SAndroid Build Coastguard Worker desc->num_slice_descriptors <= ARRAY_SIZE(desc->slices_descriptors)) {
1114*bbecb9d1SAndroid Build Coastguard Worker sd = &desc->slices_descriptors[desc->num_slice_descriptors - 1];
1115*bbecb9d1SAndroid Build Coastguard Worker param->macroblock_address = sd->macroblock_address;
1116*bbecb9d1SAndroid Build Coastguard Worker param->num_macroblocks = sd->num_macroblocks;
1117*bbecb9d1SAndroid Build Coastguard Worker //macroblock_info;
1118*bbecb9d1SAndroid Build Coastguard Worker }
1119*bbecb9d1SAndroid Build Coastguard Worker
1120*bbecb9d1SAndroid Build Coastguard Worker switch (desc->picture_type) {
1121*bbecb9d1SAndroid Build Coastguard Worker case PIPE_H2645_ENC_PICTURE_TYPE_P:
1122*bbecb9d1SAndroid Build Coastguard Worker param->slice_type = 0;
1123*bbecb9d1SAndroid Build Coastguard Worker break;
1124*bbecb9d1SAndroid Build Coastguard Worker case PIPE_H2645_ENC_PICTURE_TYPE_B:
1125*bbecb9d1SAndroid Build Coastguard Worker param->slice_type = 1;
1126*bbecb9d1SAndroid Build Coastguard Worker break;
1127*bbecb9d1SAndroid Build Coastguard Worker case PIPE_H2645_ENC_PICTURE_TYPE_I:
1128*bbecb9d1SAndroid Build Coastguard Worker case PIPE_H2645_ENC_PICTURE_TYPE_IDR: /* fall through */
1129*bbecb9d1SAndroid Build Coastguard Worker param->slice_type = 2;
1130*bbecb9d1SAndroid Build Coastguard Worker break;
1131*bbecb9d1SAndroid Build Coastguard Worker case PIPE_H2645_ENC_PICTURE_TYPE_SKIP:
1132*bbecb9d1SAndroid Build Coastguard Worker default:
1133*bbecb9d1SAndroid Build Coastguard Worker break;
1134*bbecb9d1SAndroid Build Coastguard Worker }
1135*bbecb9d1SAndroid Build Coastguard Worker
1136*bbecb9d1SAndroid Build Coastguard Worker //pic_parameter_set_id;
1137*bbecb9d1SAndroid Build Coastguard Worker //idr_pic_id;
1138*bbecb9d1SAndroid Build Coastguard Worker //pic_order_cnt_lsb;
1139*bbecb9d1SAndroid Build Coastguard Worker //delta_pic_order_cnt_bottom;
1140*bbecb9d1SAndroid Build Coastguard Worker //delta_pic_order_cnt[2];
1141*bbecb9d1SAndroid Build Coastguard Worker //direct_spatial_mv_pred_flag;
1142*bbecb9d1SAndroid Build Coastguard Worker
1143*bbecb9d1SAndroid Build Coastguard Worker /*
1144*bbecb9d1SAndroid Build Coastguard Worker * Sine num_ref_idx_l0_active_minus1 and num_ref_idx_l1_active_minus1
1145*bbecb9d1SAndroid Build Coastguard Worker * have been passed by VAEncPictureParameterBufferH264,
1146*bbecb9d1SAndroid Build Coastguard Worker * num_ref_idx_active_override_flag is always set to 0.
1147*bbecb9d1SAndroid Build Coastguard Worker */
1148*bbecb9d1SAndroid Build Coastguard Worker param->num_ref_idx_active_override_flag = 0;
1149*bbecb9d1SAndroid Build Coastguard Worker //num_ref_idx_l0_active_minus1
1150*bbecb9d1SAndroid Build Coastguard Worker //num_ref_idx_l1_active_minus1
1151*bbecb9d1SAndroid Build Coastguard Worker
1152*bbecb9d1SAndroid Build Coastguard Worker /* Reference List */
1153*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < 32; i++) {
1154*bbecb9d1SAndroid Build Coastguard Worker h264_init_picture(¶m->RefPicList0[i]);
1155*bbecb9d1SAndroid Build Coastguard Worker h264_init_picture(¶m->RefPicList1[i]);
1156*bbecb9d1SAndroid Build Coastguard Worker
1157*bbecb9d1SAndroid Build Coastguard Worker param->RefPicList0[i].picture_id =
1158*bbecb9d1SAndroid Build Coastguard Worker get_enc_ref_pic(codec, desc->ref_idx_l0_list[i]);
1159*bbecb9d1SAndroid Build Coastguard Worker param->RefPicList1[i].picture_id =
1160*bbecb9d1SAndroid Build Coastguard Worker get_enc_ref_pic(codec, desc->ref_idx_l1_list[i]);
1161*bbecb9d1SAndroid Build Coastguard Worker
1162*bbecb9d1SAndroid Build Coastguard Worker if (param->RefPicList0[i].picture_id != VA_INVALID_ID)
1163*bbecb9d1SAndroid Build Coastguard Worker param->RefPicList0[i].flags = VA_PICTURE_H264_SHORT_TERM_REFERENCE;
1164*bbecb9d1SAndroid Build Coastguard Worker
1165*bbecb9d1SAndroid Build Coastguard Worker if (param->RefPicList1[i].picture_id != VA_INVALID_ID)
1166*bbecb9d1SAndroid Build Coastguard Worker param->RefPicList1[i].flags = VA_PICTURE_H264_SHORT_TERM_REFERENCE;
1167*bbecb9d1SAndroid Build Coastguard Worker }
1168*bbecb9d1SAndroid Build Coastguard Worker
1169*bbecb9d1SAndroid Build Coastguard Worker //luma_log2_weight_denom;
1170*bbecb9d1SAndroid Build Coastguard Worker //chroma_log2_weight_denom;
1171*bbecb9d1SAndroid Build Coastguard Worker //luma_weight_l0_flag;
1172*bbecb9d1SAndroid Build Coastguard Worker //luma_weight_l0[32];
1173*bbecb9d1SAndroid Build Coastguard Worker //luma_offset_l0[32];
1174*bbecb9d1SAndroid Build Coastguard Worker //chroma_weight_l0_flag;
1175*bbecb9d1SAndroid Build Coastguard Worker //chroma_weight_l0[32][2];
1176*bbecb9d1SAndroid Build Coastguard Worker //chroma_offset_l0[32][2];
1177*bbecb9d1SAndroid Build Coastguard Worker //luma_weight_l1_flag;
1178*bbecb9d1SAndroid Build Coastguard Worker //luma_weight_l1[32];
1179*bbecb9d1SAndroid Build Coastguard Worker //luma_offset_l1[32];
1180*bbecb9d1SAndroid Build Coastguard Worker //chroma_weight_l1_flag;
1181*bbecb9d1SAndroid Build Coastguard Worker //chroma_weight_l1[32][2];
1182*bbecb9d1SAndroid Build Coastguard Worker //chroma_offset_l1[32][2];
1183*bbecb9d1SAndroid Build Coastguard Worker param->cabac_init_idc = desc->pic_ctrl.enc_cabac_init_idc;
1184*bbecb9d1SAndroid Build Coastguard Worker //slice_qp_delta;
1185*bbecb9d1SAndroid Build Coastguard Worker //disable_deblocking_filter_idc;
1186*bbecb9d1SAndroid Build Coastguard Worker //slice_alpha_c0_offset_div2;
1187*bbecb9d1SAndroid Build Coastguard Worker //slice_beta_offset_div2;
1188*bbecb9d1SAndroid Build Coastguard Worker
1189*bbecb9d1SAndroid Build Coastguard Worker }
1190*bbecb9d1SAndroid Build Coastguard Worker
1191*bbecb9d1SAndroid Build Coastguard Worker /*
1192*bbecb9d1SAndroid Build Coastguard Worker * Refer to vlVaHandleVAEncSequenceParameterBufferTypeH264() in mesa,
1193*bbecb9d1SAndroid Build Coastguard Worker * and comment out some unused parameters.
1194*bbecb9d1SAndroid Build Coastguard Worker */
h264_fill_enc_seq_param(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h264_enc_picture_desc * desc,VAEncSequenceParameterBufferH264 * param)1195*bbecb9d1SAndroid Build Coastguard Worker static void h264_fill_enc_seq_param(
1196*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
1197*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
1198*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h264_enc_picture_desc *desc,
1199*bbecb9d1SAndroid Build Coastguard Worker VAEncSequenceParameterBufferH264 *param)
1200*bbecb9d1SAndroid Build Coastguard Worker {
1201*bbecb9d1SAndroid Build Coastguard Worker (void)codec;
1202*bbecb9d1SAndroid Build Coastguard Worker (void)source;
1203*bbecb9d1SAndroid Build Coastguard Worker
1204*bbecb9d1SAndroid Build Coastguard Worker //seq_parameter_set_id;
1205*bbecb9d1SAndroid Build Coastguard Worker param->level_idc = codec->level;
1206*bbecb9d1SAndroid Build Coastguard Worker //intra_period;
1207*bbecb9d1SAndroid Build Coastguard Worker param->intra_idr_period = desc->intra_idr_period;
1208*bbecb9d1SAndroid Build Coastguard Worker //ip_period;
1209*bbecb9d1SAndroid Build Coastguard Worker //bits_per_second;
1210*bbecb9d1SAndroid Build Coastguard Worker param->max_num_ref_frames = codec->max_references;
1211*bbecb9d1SAndroid Build Coastguard Worker //picture_width_in_mbs;
1212*bbecb9d1SAndroid Build Coastguard Worker //picture_height_in_mbs;
1213*bbecb9d1SAndroid Build Coastguard Worker
1214*bbecb9d1SAndroid Build Coastguard Worker /* seq_fields.bits */
1215*bbecb9d1SAndroid Build Coastguard Worker //seq_fields.bits.chroma_format_idc
1216*bbecb9d1SAndroid Build Coastguard Worker //seq_fields.bits.frame_mbs_only_flag
1217*bbecb9d1SAndroid Build Coastguard Worker //seq_fields.bits.mb_adaptive_frame_field_flag
1218*bbecb9d1SAndroid Build Coastguard Worker //seq_fields.bits.seq_scaling_matrix_present_flag
1219*bbecb9d1SAndroid Build Coastguard Worker //seq_fields.bits.direct_8x8_inference_flag
1220*bbecb9d1SAndroid Build Coastguard Worker //seq_fields.bits.log2_max_frame_num_minus4
1221*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->seq_fields.bits, &desc->seq, pic_order_cnt_type);
1222*bbecb9d1SAndroid Build Coastguard Worker //seq_fields.bit.log2_max_pic_order_cnt_lsb_minus4
1223*bbecb9d1SAndroid Build Coastguard Worker //seq_fields.bit.delta_pic_order_always_zero_flag
1224*bbecb9d1SAndroid Build Coastguard Worker
1225*bbecb9d1SAndroid Build Coastguard Worker //bit_depth_luma_minus8;
1226*bbecb9d1SAndroid Build Coastguard Worker //bit_depth_chroma_minus8;
1227*bbecb9d1SAndroid Build Coastguard Worker
1228*bbecb9d1SAndroid Build Coastguard Worker //num_ref_frames_in_pic_order_cnt_cycle;
1229*bbecb9d1SAndroid Build Coastguard Worker //offset_for_non_ref_pic;
1230*bbecb9d1SAndroid Build Coastguard Worker //offset_for_top_to_bottom_field;
1231*bbecb9d1SAndroid Build Coastguard Worker //offset_for_ref_frame[256];
1232*bbecb9d1SAndroid Build Coastguard Worker if (desc->seq.enc_frame_cropping_flag) {
1233*bbecb9d1SAndroid Build Coastguard Worker param->frame_cropping_flag = desc->seq.enc_frame_cropping_flag;
1234*bbecb9d1SAndroid Build Coastguard Worker param->frame_crop_left_offset = desc->seq.enc_frame_crop_left_offset;
1235*bbecb9d1SAndroid Build Coastguard Worker param->frame_crop_right_offset = desc->seq.enc_frame_crop_right_offset;
1236*bbecb9d1SAndroid Build Coastguard Worker param->frame_crop_top_offset = desc->seq.enc_frame_crop_top_offset;
1237*bbecb9d1SAndroid Build Coastguard Worker param->frame_crop_bottom_offset = desc->seq.enc_frame_crop_bottom_offset;
1238*bbecb9d1SAndroid Build Coastguard Worker }
1239*bbecb9d1SAndroid Build Coastguard Worker
1240*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, vui_parameters_present_flag);
1241*bbecb9d1SAndroid Build Coastguard Worker
1242*bbecb9d1SAndroid Build Coastguard Worker // vui_fields.bits
1243*bbecb9d1SAndroid Build Coastguard Worker if (desc->seq.vui_parameters_present_flag) {
1244*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->vui_fields.bits, &desc->seq.vui_flags,
1245*bbecb9d1SAndroid Build Coastguard Worker aspect_ratio_info_present_flag);
1246*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->vui_fields.bits, &desc->seq.vui_flags,
1247*bbecb9d1SAndroid Build Coastguard Worker timing_info_present_flag);
1248*bbecb9d1SAndroid Build Coastguard Worker }
1249*bbecb9d1SAndroid Build Coastguard Worker //vui_fields.bits.bitstream_restriction_flag
1250*bbecb9d1SAndroid Build Coastguard Worker //vui_fields.bits.log2_max_mv_length_horizontal
1251*bbecb9d1SAndroid Build Coastguard Worker //vui_fields.bits.log2_max_mv_length_vertical
1252*bbecb9d1SAndroid Build Coastguard Worker //vui_fields.bits.fixed_frame_rate_flag
1253*bbecb9d1SAndroid Build Coastguard Worker //vui_fields.bits.low_delay_hrd_flag
1254*bbecb9d1SAndroid Build Coastguard Worker //vui_fields.bits.motion_vectors_over_pic_boundaries_flag
1255*bbecb9d1SAndroid Build Coastguard Worker
1256*bbecb9d1SAndroid Build Coastguard Worker if (desc->seq.vui_parameters_present_flag) {
1257*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, aspect_ratio_idc);
1258*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, sar_width);
1259*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, sar_height);
1260*bbecb9d1SAndroid Build Coastguard Worker }
1261*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, num_units_in_tick);
1262*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, time_scale);
1263*bbecb9d1SAndroid Build Coastguard Worker }
1264*bbecb9d1SAndroid Build Coastguard Worker
1265*bbecb9d1SAndroid Build Coastguard Worker /*
1266*bbecb9d1SAndroid Build Coastguard Worker * Refer to vlVaHandleVAEncMiscParameterTypeRateControlH264() in mesa,
1267*bbecb9d1SAndroid Build Coastguard Worker * and comment out some unused parameters.
1268*bbecb9d1SAndroid Build Coastguard Worker */
h264_fill_enc_misc_param_rate_ctrl(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h264_enc_picture_desc * desc,VAEncMiscParameterRateControl * param)1269*bbecb9d1SAndroid Build Coastguard Worker static void h264_fill_enc_misc_param_rate_ctrl(
1270*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
1271*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
1272*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h264_enc_picture_desc *desc,
1273*bbecb9d1SAndroid Build Coastguard Worker VAEncMiscParameterRateControl *param)
1274*bbecb9d1SAndroid Build Coastguard Worker {
1275*bbecb9d1SAndroid Build Coastguard Worker unsigned temporal_id = 0; /* always 0 now */
1276*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h264_enc_rate_control *rc = &desc->rate_ctrl[temporal_id];
1277*bbecb9d1SAndroid Build Coastguard Worker
1278*bbecb9d1SAndroid Build Coastguard Worker (void)codec;
1279*bbecb9d1SAndroid Build Coastguard Worker (void)source;
1280*bbecb9d1SAndroid Build Coastguard Worker
1281*bbecb9d1SAndroid Build Coastguard Worker param->bits_per_second = rc->peak_bitrate;
1282*bbecb9d1SAndroid Build Coastguard Worker if (desc->rate_ctrl[0].rate_ctrl_method !=
1283*bbecb9d1SAndroid Build Coastguard Worker PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT) {
1284*bbecb9d1SAndroid Build Coastguard Worker param->target_percentage = rc->target_bitrate *
1285*bbecb9d1SAndroid Build Coastguard Worker param->bits_per_second / 100.0;
1286*bbecb9d1SAndroid Build Coastguard Worker }
1287*bbecb9d1SAndroid Build Coastguard Worker //window_size;
1288*bbecb9d1SAndroid Build Coastguard Worker //initial_qp;
1289*bbecb9d1SAndroid Build Coastguard Worker param->min_qp = rc->min_qp;
1290*bbecb9d1SAndroid Build Coastguard Worker //basic_unit_size;
1291*bbecb9d1SAndroid Build Coastguard Worker
1292*bbecb9d1SAndroid Build Coastguard Worker /* rc_flags */
1293*bbecb9d1SAndroid Build Coastguard Worker //rc_flags.bits.reset
1294*bbecb9d1SAndroid Build Coastguard Worker param->rc_flags.bits.disable_frame_skip = !rc->skip_frame_enable;
1295*bbecb9d1SAndroid Build Coastguard Worker param->rc_flags.bits.disable_bit_stuffing = !rc->fill_data_enable;
1296*bbecb9d1SAndroid Build Coastguard Worker //rc_flags.bits.mb_rate_control
1297*bbecb9d1SAndroid Build Coastguard Worker param->rc_flags.bits.temporal_id = temporal_id;
1298*bbecb9d1SAndroid Build Coastguard Worker //rc_flags.bits.cfs_I_frames
1299*bbecb9d1SAndroid Build Coastguard Worker //rc_flags.bits.enable_parallel_brc
1300*bbecb9d1SAndroid Build Coastguard Worker //rc_flags.bits.enable_dynamic_scaling
1301*bbecb9d1SAndroid Build Coastguard Worker //rc_flags.bits.frame_tolerance_mode
1302*bbecb9d1SAndroid Build Coastguard Worker
1303*bbecb9d1SAndroid Build Coastguard Worker //ICQ_quality_factor;
1304*bbecb9d1SAndroid Build Coastguard Worker param->max_qp = rc->max_qp;
1305*bbecb9d1SAndroid Build Coastguard Worker //quality_factor;
1306*bbecb9d1SAndroid Build Coastguard Worker //target_frame_size;
1307*bbecb9d1SAndroid Build Coastguard Worker }
1308*bbecb9d1SAndroid Build Coastguard Worker
1309*bbecb9d1SAndroid Build Coastguard Worker /*
1310*bbecb9d1SAndroid Build Coastguard Worker * Refer to vlVaHandleVAEncMiscParameterTypeFrameRateH264() in mesa,
1311*bbecb9d1SAndroid Build Coastguard Worker * and comment out some unused parameters.
1312*bbecb9d1SAndroid Build Coastguard Worker */
h264_fill_enc_misc_param_frame_rate(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h264_enc_picture_desc * desc,VAEncMiscParameterFrameRate * param)1313*bbecb9d1SAndroid Build Coastguard Worker static void h264_fill_enc_misc_param_frame_rate(
1314*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
1315*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
1316*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h264_enc_picture_desc *desc,
1317*bbecb9d1SAndroid Build Coastguard Worker VAEncMiscParameterFrameRate *param)
1318*bbecb9d1SAndroid Build Coastguard Worker {
1319*bbecb9d1SAndroid Build Coastguard Worker unsigned temporal_id = 0; /* always 0 now */
1320*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h264_enc_rate_control *rc = &desc->rate_ctrl[temporal_id];
1321*bbecb9d1SAndroid Build Coastguard Worker
1322*bbecb9d1SAndroid Build Coastguard Worker (void)codec;
1323*bbecb9d1SAndroid Build Coastguard Worker (void)source;
1324*bbecb9d1SAndroid Build Coastguard Worker
1325*bbecb9d1SAndroid Build Coastguard Worker param->framerate = rc->frame_rate_num | (rc->frame_rate_den << 16);
1326*bbecb9d1SAndroid Build Coastguard Worker param->framerate_flags.bits.temporal_id = temporal_id;
1327*bbecb9d1SAndroid Build Coastguard Worker }
1328*bbecb9d1SAndroid Build Coastguard Worker
h264_decode_bitstream(struct virgl_video_codec * codec,struct virgl_video_buffer * target,const struct virgl_h264_picture_desc * desc,unsigned num_buffers,const void * const * buffers,const unsigned * sizes)1329*bbecb9d1SAndroid Build Coastguard Worker static int h264_decode_bitstream(struct virgl_video_codec *codec,
1330*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *target,
1331*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h264_picture_desc *desc,
1332*bbecb9d1SAndroid Build Coastguard Worker unsigned num_buffers,
1333*bbecb9d1SAndroid Build Coastguard Worker const void * const *buffers,
1334*bbecb9d1SAndroid Build Coastguard Worker const unsigned *sizes)
1335*bbecb9d1SAndroid Build Coastguard Worker {
1336*bbecb9d1SAndroid Build Coastguard Worker unsigned i;
1337*bbecb9d1SAndroid Build Coastguard Worker int err = 0;
1338*bbecb9d1SAndroid Build Coastguard Worker VAStatus va_stat;
1339*bbecb9d1SAndroid Build Coastguard Worker VABufferID *slice_data_buf, pic_param_buf, iq_matrix_buf, slice_param_buf;
1340*bbecb9d1SAndroid Build Coastguard Worker VAPictureParameterBufferH264 pic_param;
1341*bbecb9d1SAndroid Build Coastguard Worker VAIQMatrixBufferH264 iq_matrix;
1342*bbecb9d1SAndroid Build Coastguard Worker VASliceParameterBufferH264 slice_param;
1343*bbecb9d1SAndroid Build Coastguard Worker
1344*bbecb9d1SAndroid Build Coastguard Worker slice_data_buf = calloc(num_buffers, sizeof(VABufferID));
1345*bbecb9d1SAndroid Build Coastguard Worker if (!slice_data_buf) {
1346*bbecb9d1SAndroid Build Coastguard Worker virgl_log("alloc slice data buffer id failed\n");
1347*bbecb9d1SAndroid Build Coastguard Worker return -1;
1348*bbecb9d1SAndroid Build Coastguard Worker }
1349*bbecb9d1SAndroid Build Coastguard Worker
1350*bbecb9d1SAndroid Build Coastguard Worker h264_fill_picture_param(codec, target, desc, &pic_param);
1351*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VAPictureParameterBufferType,
1352*bbecb9d1SAndroid Build Coastguard Worker sizeof(pic_param), 1, &pic_param, &pic_param_buf);
1353*bbecb9d1SAndroid Build Coastguard Worker
1354*bbecb9d1SAndroid Build Coastguard Worker h264_fill_iq_matrix(desc, &iq_matrix);
1355*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VAIQMatrixBufferType,
1356*bbecb9d1SAndroid Build Coastguard Worker sizeof(iq_matrix), 1, &iq_matrix, &iq_matrix_buf);
1357*bbecb9d1SAndroid Build Coastguard Worker
1358*bbecb9d1SAndroid Build Coastguard Worker h264_fill_slice_param(desc, &slice_param);
1359*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VASliceParameterBufferType,
1360*bbecb9d1SAndroid Build Coastguard Worker sizeof(slice_param), 1, &slice_param, &slice_param_buf);
1361*bbecb9d1SAndroid Build Coastguard Worker
1362*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < num_buffers; i++) {
1363*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VASliceDataBufferType,
1364*bbecb9d1SAndroid Build Coastguard Worker sizes[i], 1, (void *)(buffers[i]), &slice_data_buf[i]);
1365*bbecb9d1SAndroid Build Coastguard Worker }
1366*bbecb9d1SAndroid Build Coastguard Worker
1367*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &pic_param_buf, 1);
1368*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
1369*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render picture param failed, err = 0x%x\n", va_stat);
1370*bbecb9d1SAndroid Build Coastguard Worker err = -1;
1371*bbecb9d1SAndroid Build Coastguard Worker goto err;
1372*bbecb9d1SAndroid Build Coastguard Worker }
1373*bbecb9d1SAndroid Build Coastguard Worker
1374*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &iq_matrix_buf, 1);
1375*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
1376*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render iq matrix failed, err = 0x%x\n", va_stat);
1377*bbecb9d1SAndroid Build Coastguard Worker err = -1;
1378*bbecb9d1SAndroid Build Coastguard Worker goto err;
1379*bbecb9d1SAndroid Build Coastguard Worker }
1380*bbecb9d1SAndroid Build Coastguard Worker
1381*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &slice_param_buf, 1);
1382*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
1383*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render slice param failed, err = 0x%x\n", va_stat);
1384*bbecb9d1SAndroid Build Coastguard Worker err = -1;
1385*bbecb9d1SAndroid Build Coastguard Worker goto err;
1386*bbecb9d1SAndroid Build Coastguard Worker }
1387*bbecb9d1SAndroid Build Coastguard Worker
1388*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < num_buffers; i++) {
1389*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &slice_data_buf[i], 1);
1390*bbecb9d1SAndroid Build Coastguard Worker
1391*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
1392*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render slice data failed, err = 0x%x\n", va_stat);
1393*bbecb9d1SAndroid Build Coastguard Worker err = -1;
1394*bbecb9d1SAndroid Build Coastguard Worker }
1395*bbecb9d1SAndroid Build Coastguard Worker }
1396*bbecb9d1SAndroid Build Coastguard Worker
1397*bbecb9d1SAndroid Build Coastguard Worker err:
1398*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, pic_param_buf);
1399*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, iq_matrix_buf);
1400*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, slice_param_buf);
1401*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < num_buffers; i++)
1402*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, slice_data_buf[i]);
1403*bbecb9d1SAndroid Build Coastguard Worker free(slice_data_buf);
1404*bbecb9d1SAndroid Build Coastguard Worker
1405*bbecb9d1SAndroid Build Coastguard Worker return err;
1406*bbecb9d1SAndroid Build Coastguard Worker }
1407*bbecb9d1SAndroid Build Coastguard Worker
h264_encode_render_sequence(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h264_enc_picture_desc * desc)1408*bbecb9d1SAndroid Build Coastguard Worker static int h264_encode_render_sequence(
1409*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
1410*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
1411*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h264_enc_picture_desc *desc)
1412*bbecb9d1SAndroid Build Coastguard Worker {
1413*bbecb9d1SAndroid Build Coastguard Worker int err = 0;
1414*bbecb9d1SAndroid Build Coastguard Worker VAStatus va_stat;
1415*bbecb9d1SAndroid Build Coastguard Worker VAEncSequenceParameterBufferH264 seq_param;
1416*bbecb9d1SAndroid Build Coastguard Worker VAEncMiscParameterBuffer *misc_param;
1417*bbecb9d1SAndroid Build Coastguard Worker VABufferID seq_param_buf, rc_param_buf, fr_param_buf;
1418*bbecb9d1SAndroid Build Coastguard Worker
1419*bbecb9d1SAndroid Build Coastguard Worker memset(&seq_param, 0, sizeof(seq_param));
1420*bbecb9d1SAndroid Build Coastguard Worker h264_fill_enc_seq_param(codec, source, desc, &seq_param);
1421*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VAEncSequenceParameterBufferType,
1422*bbecb9d1SAndroid Build Coastguard Worker sizeof(seq_param), 1, &seq_param, &seq_param_buf);
1423*bbecb9d1SAndroid Build Coastguard Worker
1424*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VAEncMiscParameterBufferType,
1425*bbecb9d1SAndroid Build Coastguard Worker sizeof(VAEncMiscParameterBuffer) +
1426*bbecb9d1SAndroid Build Coastguard Worker sizeof(VAEncMiscParameterRateControl), 1, NULL, &rc_param_buf);
1427*bbecb9d1SAndroid Build Coastguard Worker vaMapBuffer(va_dpy, rc_param_buf, (void **)&misc_param);
1428*bbecb9d1SAndroid Build Coastguard Worker misc_param->type = VAEncMiscParameterTypeRateControl;
1429*bbecb9d1SAndroid Build Coastguard Worker h264_fill_enc_misc_param_rate_ctrl(codec, source, desc,
1430*bbecb9d1SAndroid Build Coastguard Worker (VAEncMiscParameterRateControl *)misc_param->data);
1431*bbecb9d1SAndroid Build Coastguard Worker vaUnmapBuffer(va_dpy, rc_param_buf);
1432*bbecb9d1SAndroid Build Coastguard Worker
1433*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VAEncMiscParameterBufferType,
1434*bbecb9d1SAndroid Build Coastguard Worker sizeof(VAEncMiscParameterBuffer) +
1435*bbecb9d1SAndroid Build Coastguard Worker sizeof(VAEncMiscParameterFrameRate), 1, NULL, &fr_param_buf);
1436*bbecb9d1SAndroid Build Coastguard Worker vaMapBuffer(va_dpy, fr_param_buf, (void **)&misc_param);
1437*bbecb9d1SAndroid Build Coastguard Worker misc_param->type = VAEncMiscParameterTypeFrameRate;
1438*bbecb9d1SAndroid Build Coastguard Worker h264_fill_enc_misc_param_frame_rate(codec, source, desc,
1439*bbecb9d1SAndroid Build Coastguard Worker (VAEncMiscParameterFrameRate *)misc_param->data);
1440*bbecb9d1SAndroid Build Coastguard Worker vaUnmapBuffer(va_dpy, fr_param_buf);
1441*bbecb9d1SAndroid Build Coastguard Worker
1442*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &seq_param_buf, 1);
1443*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
1444*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render h264 sequence param failed, err = 0x%x\n", va_stat);
1445*bbecb9d1SAndroid Build Coastguard Worker err = -1;
1446*bbecb9d1SAndroid Build Coastguard Worker goto error;
1447*bbecb9d1SAndroid Build Coastguard Worker }
1448*bbecb9d1SAndroid Build Coastguard Worker
1449*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &rc_param_buf, 1);
1450*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
1451*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render h264 rate control param failed, err = 0x%x\n", va_stat);
1452*bbecb9d1SAndroid Build Coastguard Worker err = -1;
1453*bbecb9d1SAndroid Build Coastguard Worker goto error;
1454*bbecb9d1SAndroid Build Coastguard Worker }
1455*bbecb9d1SAndroid Build Coastguard Worker
1456*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &fr_param_buf, 1);
1457*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
1458*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render h264 frame rate param failed, err = 0x%x\n", va_stat);
1459*bbecb9d1SAndroid Build Coastguard Worker err = -1;
1460*bbecb9d1SAndroid Build Coastguard Worker goto error;
1461*bbecb9d1SAndroid Build Coastguard Worker }
1462*bbecb9d1SAndroid Build Coastguard Worker
1463*bbecb9d1SAndroid Build Coastguard Worker error:
1464*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, seq_param_buf);
1465*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, rc_param_buf);
1466*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, fr_param_buf);
1467*bbecb9d1SAndroid Build Coastguard Worker
1468*bbecb9d1SAndroid Build Coastguard Worker return err;
1469*bbecb9d1SAndroid Build Coastguard Worker }
1470*bbecb9d1SAndroid Build Coastguard Worker
h264_encode_render_picture(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h264_enc_picture_desc * desc)1471*bbecb9d1SAndroid Build Coastguard Worker static int h264_encode_render_picture(
1472*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
1473*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
1474*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h264_enc_picture_desc *desc)
1475*bbecb9d1SAndroid Build Coastguard Worker {
1476*bbecb9d1SAndroid Build Coastguard Worker VAStatus va_stat;
1477*bbecb9d1SAndroid Build Coastguard Worker VABufferID pic_param_buf;
1478*bbecb9d1SAndroid Build Coastguard Worker VAEncPictureParameterBufferH264 pic_param;
1479*bbecb9d1SAndroid Build Coastguard Worker
1480*bbecb9d1SAndroid Build Coastguard Worker memset(&pic_param, 0, sizeof(pic_param));
1481*bbecb9d1SAndroid Build Coastguard Worker h264_fill_enc_picture_param(codec, source, desc, &pic_param);
1482*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VAEncPictureParameterBufferType,
1483*bbecb9d1SAndroid Build Coastguard Worker sizeof(pic_param), 1, &pic_param, &pic_param_buf);
1484*bbecb9d1SAndroid Build Coastguard Worker
1485*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &pic_param_buf, 1);
1486*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, pic_param_buf);
1487*bbecb9d1SAndroid Build Coastguard Worker
1488*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
1489*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render h264 picture param failed, err = 0x%x\n", va_stat);
1490*bbecb9d1SAndroid Build Coastguard Worker return -1;
1491*bbecb9d1SAndroid Build Coastguard Worker }
1492*bbecb9d1SAndroid Build Coastguard Worker
1493*bbecb9d1SAndroid Build Coastguard Worker return 0;
1494*bbecb9d1SAndroid Build Coastguard Worker }
1495*bbecb9d1SAndroid Build Coastguard Worker
h264_encode_render_slice(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h264_enc_picture_desc * desc)1496*bbecb9d1SAndroid Build Coastguard Worker static int h264_encode_render_slice(
1497*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
1498*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
1499*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h264_enc_picture_desc *desc)
1500*bbecb9d1SAndroid Build Coastguard Worker {
1501*bbecb9d1SAndroid Build Coastguard Worker VAStatus va_stat;
1502*bbecb9d1SAndroid Build Coastguard Worker VABufferID slice_param_buf;
1503*bbecb9d1SAndroid Build Coastguard Worker VAEncSliceParameterBufferH264 slice_param;
1504*bbecb9d1SAndroid Build Coastguard Worker
1505*bbecb9d1SAndroid Build Coastguard Worker memset(&slice_param, 0, sizeof(slice_param));
1506*bbecb9d1SAndroid Build Coastguard Worker h264_fill_enc_slice_param(codec, source, desc, &slice_param);
1507*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VAEncSliceParameterBufferType,
1508*bbecb9d1SAndroid Build Coastguard Worker sizeof(slice_param), 1, &slice_param, &slice_param_buf);
1509*bbecb9d1SAndroid Build Coastguard Worker
1510*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &slice_param_buf, 1);
1511*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, slice_param_buf);
1512*bbecb9d1SAndroid Build Coastguard Worker
1513*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
1514*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render h264 slice param failed, err = 0x%x\n", va_stat);
1515*bbecb9d1SAndroid Build Coastguard Worker return -1;
1516*bbecb9d1SAndroid Build Coastguard Worker }
1517*bbecb9d1SAndroid Build Coastguard Worker
1518*bbecb9d1SAndroid Build Coastguard Worker return 0;
1519*bbecb9d1SAndroid Build Coastguard Worker }
1520*bbecb9d1SAndroid Build Coastguard Worker
h264_encode_bitstream(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h264_enc_picture_desc * desc)1521*bbecb9d1SAndroid Build Coastguard Worker static int h264_encode_bitstream(
1522*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
1523*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
1524*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h264_enc_picture_desc *desc)
1525*bbecb9d1SAndroid Build Coastguard Worker {
1526*bbecb9d1SAndroid Build Coastguard Worker if (desc->picture_type == PIPE_H2645_ENC_PICTURE_TYPE_IDR) {
1527*bbecb9d1SAndroid Build Coastguard Worker h264_encode_render_sequence(codec, source, desc);
1528*bbecb9d1SAndroid Build Coastguard Worker }
1529*bbecb9d1SAndroid Build Coastguard Worker
1530*bbecb9d1SAndroid Build Coastguard Worker h264_encode_render_picture(codec, source, desc);
1531*bbecb9d1SAndroid Build Coastguard Worker h264_encode_render_slice(codec, source, desc);
1532*bbecb9d1SAndroid Build Coastguard Worker
1533*bbecb9d1SAndroid Build Coastguard Worker return 0;
1534*bbecb9d1SAndroid Build Coastguard Worker }
1535*bbecb9d1SAndroid Build Coastguard Worker
h265_init_picture(VAPictureHEVC * pic)1536*bbecb9d1SAndroid Build Coastguard Worker static void h265_init_picture(VAPictureHEVC *pic)
1537*bbecb9d1SAndroid Build Coastguard Worker {
1538*bbecb9d1SAndroid Build Coastguard Worker pic->picture_id = VA_INVALID_SURFACE;
1539*bbecb9d1SAndroid Build Coastguard Worker pic->pic_order_cnt = 0;
1540*bbecb9d1SAndroid Build Coastguard Worker pic->flags = VA_PICTURE_HEVC_INVALID;
1541*bbecb9d1SAndroid Build Coastguard Worker }
1542*bbecb9d1SAndroid Build Coastguard Worker
1543*bbecb9d1SAndroid Build Coastguard Worker /*
1544*bbecb9d1SAndroid Build Coastguard Worker * Refer to vlVaHandlePictureParameterBufferHEVC() in mesa,
1545*bbecb9d1SAndroid Build Coastguard Worker * and comment out some unused parameters.
1546*bbecb9d1SAndroid Build Coastguard Worker */
h265_fill_picture_param(struct virgl_video_codec * codec,struct virgl_video_buffer * target,const struct virgl_h265_picture_desc * desc,VAPictureParameterBufferHEVC * vapp)1547*bbecb9d1SAndroid Build Coastguard Worker static void h265_fill_picture_param(struct virgl_video_codec *codec,
1548*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *target,
1549*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h265_picture_desc *desc,
1550*bbecb9d1SAndroid Build Coastguard Worker VAPictureParameterBufferHEVC *vapp)
1551*bbecb9d1SAndroid Build Coastguard Worker {
1552*bbecb9d1SAndroid Build Coastguard Worker unsigned i;
1553*bbecb9d1SAndroid Build Coastguard Worker
1554*bbecb9d1SAndroid Build Coastguard Worker (void)codec;
1555*bbecb9d1SAndroid Build Coastguard Worker (void)target;
1556*bbecb9d1SAndroid Build Coastguard Worker
1557*bbecb9d1SAndroid Build Coastguard Worker //vapp->CurrPic.picture_id
1558*bbecb9d1SAndroid Build Coastguard Worker vapp->CurrPic.pic_order_cnt = desc->CurrPicOrderCntVal;
1559*bbecb9d1SAndroid Build Coastguard Worker //vapp->CurrPic.flags
1560*bbecb9d1SAndroid Build Coastguard Worker
1561*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < 15; i++) {
1562*bbecb9d1SAndroid Build Coastguard Worker vapp->ReferenceFrames[i].pic_order_cnt = desc->PicOrderCntVal[i];
1563*bbecb9d1SAndroid Build Coastguard Worker vapp->ReferenceFrames[i].picture_id = desc->ref[i];
1564*bbecb9d1SAndroid Build Coastguard Worker vapp->ReferenceFrames[i].flags = VA_INVALID_SURFACE == desc->ref[i]
1565*bbecb9d1SAndroid Build Coastguard Worker ? VA_PICTURE_HEVC_INVALID : 0;
1566*bbecb9d1SAndroid Build Coastguard Worker }
1567*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < desc->NumPocStCurrBefore; i++)
1568*bbecb9d1SAndroid Build Coastguard Worker vapp->ReferenceFrames[desc->RefPicSetStCurrBefore[i]].flags |= \
1569*bbecb9d1SAndroid Build Coastguard Worker VA_PICTURE_HEVC_RPS_ST_CURR_BEFORE;
1570*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < desc->NumPocStCurrAfter; i++)
1571*bbecb9d1SAndroid Build Coastguard Worker vapp->ReferenceFrames[desc->RefPicSetStCurrAfter[i]].flags |= \
1572*bbecb9d1SAndroid Build Coastguard Worker VA_PICTURE_HEVC_RPS_ST_CURR_AFTER;
1573*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < desc->NumPocLtCurr; i++)
1574*bbecb9d1SAndroid Build Coastguard Worker vapp->ReferenceFrames[desc->RefPicSetLtCurr[i]].flags |= \
1575*bbecb9d1SAndroid Build Coastguard Worker VA_PICTURE_HEVC_RPS_LT_CURR;
1576*bbecb9d1SAndroid Build Coastguard Worker
1577*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, pic_width_in_luma_samples);
1578*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, pic_height_in_luma_samples);
1579*bbecb9d1SAndroid Build Coastguard Worker
1580*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits, &desc->pps.sps, chroma_format_idc);
1581*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits,
1582*bbecb9d1SAndroid Build Coastguard Worker &desc->pps.sps, separate_colour_plane_flag);
1583*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits, &desc->pps.sps, pcm_enabled_flag);
1584*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits,
1585*bbecb9d1SAndroid Build Coastguard Worker &desc->pps.sps, scaling_list_enabled_flag);
1586*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits,
1587*bbecb9d1SAndroid Build Coastguard Worker &desc->pps, transform_skip_enabled_flag);
1588*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits, &desc->pps.sps, amp_enabled_flag);
1589*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits,
1590*bbecb9d1SAndroid Build Coastguard Worker &desc->pps.sps, strong_intra_smoothing_enabled_flag);
1591*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits, &desc->pps, sign_data_hiding_enabled_flag);
1592*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits, &desc->pps, constrained_intra_pred_flag);
1593*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits, &desc->pps, cu_qp_delta_enabled_flag);
1594*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits, &desc->pps, weighted_pred_flag);
1595*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits, &desc->pps, weighted_bipred_flag);
1596*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits,
1597*bbecb9d1SAndroid Build Coastguard Worker &desc->pps, transquant_bypass_enabled_flag);
1598*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits, &desc->pps, tiles_enabled_flag);
1599*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits,
1600*bbecb9d1SAndroid Build Coastguard Worker &desc->pps, entropy_coding_sync_enabled_flag);
1601*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits, &desc->pps,
1602*bbecb9d1SAndroid Build Coastguard Worker pps_loop_filter_across_slices_enabled_flag);
1603*bbecb9d1SAndroid Build Coastguard Worker if (desc->pps.tiles_enabled_flag)
1604*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits,
1605*bbecb9d1SAndroid Build Coastguard Worker &desc->pps, loop_filter_across_tiles_enabled_flag);
1606*bbecb9d1SAndroid Build Coastguard Worker if (desc->pps.sps.pcm_enabled_flag)
1607*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->pic_fields.bits,
1608*bbecb9d1SAndroid Build Coastguard Worker &desc->pps.sps, pcm_loop_filter_disabled_flag);
1609*bbecb9d1SAndroid Build Coastguard Worker //ITEM_SET(vapp->pic_fields.bits, desc->pps.sps, NoPicReorderingFlag);
1610*bbecb9d1SAndroid Build Coastguard Worker //ITEM_SET(vapp->pic_fields.bits, desc->pps.sps, NoBiPredFlag);
1611*bbecb9d1SAndroid Build Coastguard Worker
1612*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, sps_max_dec_pic_buffering_minus1);
1613*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, bit_depth_luma_minus8);
1614*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, bit_depth_chroma_minus8);
1615*bbecb9d1SAndroid Build Coastguard Worker if (desc->pps.sps.pcm_enabled_flag) {
1616*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, pcm_sample_bit_depth_luma_minus1);
1617*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, pcm_sample_bit_depth_chroma_minus1);
1618*bbecb9d1SAndroid Build Coastguard Worker }
1619*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, log2_min_luma_coding_block_size_minus3);
1620*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, log2_diff_max_min_luma_coding_block_size);
1621*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, log2_min_transform_block_size_minus2);
1622*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, log2_diff_max_min_transform_block_size);
1623*bbecb9d1SAndroid Build Coastguard Worker if (desc->pps.sps.pcm_enabled_flag) {
1624*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps,
1625*bbecb9d1SAndroid Build Coastguard Worker log2_min_pcm_luma_coding_block_size_minus3);
1626*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps,
1627*bbecb9d1SAndroid Build Coastguard Worker log2_diff_max_min_pcm_luma_coding_block_size);
1628*bbecb9d1SAndroid Build Coastguard Worker }
1629*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, max_transform_hierarchy_depth_intra);
1630*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, max_transform_hierarchy_depth_inter);
1631*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, init_qp_minus26);
1632*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, diff_cu_qp_delta_depth);
1633*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, pps_cb_qp_offset);
1634*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, pps_cr_qp_offset);
1635*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, log2_parallel_merge_level_minus2);
1636*bbecb9d1SAndroid Build Coastguard Worker if (desc->pps.tiles_enabled_flag) {
1637*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, num_tile_columns_minus1);
1638*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, num_tile_rows_minus1);
1639*bbecb9d1SAndroid Build Coastguard Worker ITEM_CPY(vapp, &desc->pps, column_width_minus1);
1640*bbecb9d1SAndroid Build Coastguard Worker ITEM_CPY(vapp, &desc->pps, row_height_minus1);
1641*bbecb9d1SAndroid Build Coastguard Worker }
1642*bbecb9d1SAndroid Build Coastguard Worker
1643*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->slice_parsing_fields.bits,
1644*bbecb9d1SAndroid Build Coastguard Worker &desc->pps, lists_modification_present_flag);
1645*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->slice_parsing_fields.bits,
1646*bbecb9d1SAndroid Build Coastguard Worker &desc->pps.sps, long_term_ref_pics_present_flag);
1647*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->slice_parsing_fields.bits,
1648*bbecb9d1SAndroid Build Coastguard Worker &desc->pps.sps, sps_temporal_mvp_enabled_flag);
1649*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->slice_parsing_fields.bits,
1650*bbecb9d1SAndroid Build Coastguard Worker &desc->pps, cabac_init_present_flag);
1651*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->slice_parsing_fields.bits,
1652*bbecb9d1SAndroid Build Coastguard Worker &desc->pps, output_flag_present_flag);
1653*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->slice_parsing_fields.bits,
1654*bbecb9d1SAndroid Build Coastguard Worker &desc->pps, dependent_slice_segments_enabled_flag);
1655*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->slice_parsing_fields.bits,
1656*bbecb9d1SAndroid Build Coastguard Worker &desc->pps, pps_slice_chroma_qp_offsets_present_flag);
1657*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->slice_parsing_fields.bits,
1658*bbecb9d1SAndroid Build Coastguard Worker &desc->pps.sps, sample_adaptive_offset_enabled_flag);
1659*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->slice_parsing_fields.bits,
1660*bbecb9d1SAndroid Build Coastguard Worker &desc->pps, deblocking_filter_override_enabled_flag);
1661*bbecb9d1SAndroid Build Coastguard Worker vapp->slice_parsing_fields.bits.pps_disable_deblocking_filter_flag = \
1662*bbecb9d1SAndroid Build Coastguard Worker desc->pps.pps_deblocking_filter_disabled_flag;
1663*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(&vapp->slice_parsing_fields.bits,
1664*bbecb9d1SAndroid Build Coastguard Worker &desc->pps, slice_segment_header_extension_present_flag);
1665*bbecb9d1SAndroid Build Coastguard Worker vapp->slice_parsing_fields.bits.RapPicFlag = desc->RAPPicFlag;
1666*bbecb9d1SAndroid Build Coastguard Worker vapp->slice_parsing_fields.bits.IdrPicFlag = desc->IDRPicFlag;
1667*bbecb9d1SAndroid Build Coastguard Worker //vapp->slice_parsing_fields.bits.IntraPicFlag
1668*bbecb9d1SAndroid Build Coastguard Worker
1669*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, log2_max_pic_order_cnt_lsb_minus4);
1670*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps.sps, num_short_term_ref_pic_sets);
1671*bbecb9d1SAndroid Build Coastguard Worker vapp->num_long_term_ref_pic_sps = desc->pps.sps.num_long_term_ref_pics_sps;
1672*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, num_ref_idx_l0_default_active_minus1);
1673*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, num_ref_idx_l1_default_active_minus1);
1674*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, pps_beta_offset_div2);
1675*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, pps_tc_offset_div2);
1676*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, num_extra_slice_header_bits);
1677*bbecb9d1SAndroid Build Coastguard Worker
1678*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(vapp, &desc->pps, st_rps_bits);
1679*bbecb9d1SAndroid Build Coastguard Worker }
1680*bbecb9d1SAndroid Build Coastguard Worker
1681*bbecb9d1SAndroid Build Coastguard Worker /*
1682*bbecb9d1SAndroid Build Coastguard Worker * Refer to vlVaHandleSliceParameterBufferHEVC() in mesa,
1683*bbecb9d1SAndroid Build Coastguard Worker * and comment out some unused parameters.
1684*bbecb9d1SAndroid Build Coastguard Worker */
h265_fill_slice_param(const struct virgl_h265_picture_desc * desc,VASliceParameterBufferHEVC * vapp)1685*bbecb9d1SAndroid Build Coastguard Worker static void h265_fill_slice_param(const struct virgl_h265_picture_desc *desc,
1686*bbecb9d1SAndroid Build Coastguard Worker VASliceParameterBufferHEVC *vapp)
1687*bbecb9d1SAndroid Build Coastguard Worker {
1688*bbecb9d1SAndroid Build Coastguard Worker unsigned i, j;
1689*bbecb9d1SAndroid Build Coastguard Worker
1690*bbecb9d1SAndroid Build Coastguard Worker //slice_data_size;
1691*bbecb9d1SAndroid Build Coastguard Worker //slice_data_offset;
1692*bbecb9d1SAndroid Build Coastguard Worker //slice_data_flag;
1693*bbecb9d1SAndroid Build Coastguard Worker //slice_data_byte_offset;
1694*bbecb9d1SAndroid Build Coastguard Worker //slice_segment_address;
1695*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < 2; i++) {
1696*bbecb9d1SAndroid Build Coastguard Worker for (j = 0; j < 15; j++)
1697*bbecb9d1SAndroid Build Coastguard Worker vapp->RefPicList[i][j] = desc->RefPicList[i][j];
1698*bbecb9d1SAndroid Build Coastguard Worker }
1699*bbecb9d1SAndroid Build Coastguard Worker //LongSliceFlags;
1700*bbecb9d1SAndroid Build Coastguard Worker //collocated_ref_idx;
1701*bbecb9d1SAndroid Build Coastguard Worker //num_ref_idx_l0_active_minus1;
1702*bbecb9d1SAndroid Build Coastguard Worker //num_ref_idx_l1_active_minus1;
1703*bbecb9d1SAndroid Build Coastguard Worker //slice_qp_delta;
1704*bbecb9d1SAndroid Build Coastguard Worker //slice_cb_qp_offset;
1705*bbecb9d1SAndroid Build Coastguard Worker //slice_cr_qp_offset;
1706*bbecb9d1SAndroid Build Coastguard Worker //slice_beta_offset_div2;
1707*bbecb9d1SAndroid Build Coastguard Worker //slice_tc_offset_div2;
1708*bbecb9d1SAndroid Build Coastguard Worker //luma_log2_weight_denom;
1709*bbecb9d1SAndroid Build Coastguard Worker //delta_chroma_log2_weight_denom;
1710*bbecb9d1SAndroid Build Coastguard Worker //delta_luma_weight_l0[15];
1711*bbecb9d1SAndroid Build Coastguard Worker //luma_offset_l0[15];
1712*bbecb9d1SAndroid Build Coastguard Worker //delta_chroma_weight_l0[15][2];
1713*bbecb9d1SAndroid Build Coastguard Worker //ChromaOffsetL0[15][2];
1714*bbecb9d1SAndroid Build Coastguard Worker //delta_luma_weight_l1[15];
1715*bbecb9d1SAndroid Build Coastguard Worker //luma_offset_l1[15];
1716*bbecb9d1SAndroid Build Coastguard Worker //delta_chroma_weight_l1[15][2];
1717*bbecb9d1SAndroid Build Coastguard Worker //ChromaOffsetL1[15][2];
1718*bbecb9d1SAndroid Build Coastguard Worker //five_minus_max_num_merge_cand;
1719*bbecb9d1SAndroid Build Coastguard Worker //num_entry_point_offsets;
1720*bbecb9d1SAndroid Build Coastguard Worker //entry_offset_to_subset_array;
1721*bbecb9d1SAndroid Build Coastguard Worker //slice_data_num_emu_prevn_bytes;
1722*bbecb9d1SAndroid Build Coastguard Worker //va_reserved[VA_PADDING_LOW - 2];
1723*bbecb9d1SAndroid Build Coastguard Worker }
1724*bbecb9d1SAndroid Build Coastguard Worker
1725*bbecb9d1SAndroid Build Coastguard Worker /*
1726*bbecb9d1SAndroid Build Coastguard Worker * Refer to vlVaHandleVAEncSequenceParameterBufferTypeHEVC() in mesa,
1727*bbecb9d1SAndroid Build Coastguard Worker * and comment out some unused parameters.
1728*bbecb9d1SAndroid Build Coastguard Worker */
h265_fill_enc_seq_param(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h265_enc_picture_desc * desc,VAEncSequenceParameterBufferHEVC * param)1729*bbecb9d1SAndroid Build Coastguard Worker static void h265_fill_enc_seq_param(
1730*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
1731*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
1732*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h265_enc_picture_desc *desc,
1733*bbecb9d1SAndroid Build Coastguard Worker VAEncSequenceParameterBufferHEVC *param)
1734*bbecb9d1SAndroid Build Coastguard Worker {
1735*bbecb9d1SAndroid Build Coastguard Worker (void)codec;
1736*bbecb9d1SAndroid Build Coastguard Worker (void)source;
1737*bbecb9d1SAndroid Build Coastguard Worker
1738*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, general_profile_idc);
1739*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, general_level_idc);
1740*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, general_tier_flag);
1741*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, intra_period);
1742*bbecb9d1SAndroid Build Coastguard Worker //intra_idr_period
1743*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, ip_period);
1744*bbecb9d1SAndroid Build Coastguard Worker //bits_per_second
1745*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, pic_width_in_luma_samples);
1746*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, pic_height_in_luma_samples);
1747*bbecb9d1SAndroid Build Coastguard Worker
1748*bbecb9d1SAndroid Build Coastguard Worker /* seq_fields.bits */
1749*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->seq_fields.bits, &desc->seq, chroma_format_idc);
1750*bbecb9d1SAndroid Build Coastguard Worker //seq_fields.bits.separate_colour_plane_flag
1751*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->seq_fields.bits, &desc->seq, bit_depth_luma_minus8);
1752*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->seq_fields.bits, &desc->seq, bit_depth_chroma_minus8);
1753*bbecb9d1SAndroid Build Coastguard Worker //seq_fields.bits.scaling_list_enabled_flag
1754*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->seq_fields.bits, &desc->seq, strong_intra_smoothing_enabled_flag);
1755*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->seq_fields.bits, &desc->seq, amp_enabled_flag);
1756*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->seq_fields.bits, &desc->seq, sample_adaptive_offset_enabled_flag);
1757*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->seq_fields.bits, &desc->seq, pcm_enabled_flag);
1758*bbecb9d1SAndroid Build Coastguard Worker //seq_fields.bits.pcm_loop_filter_disabled_flag
1759*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->seq_fields.bits, &desc->seq, sps_temporal_mvp_enabled_flag);
1760*bbecb9d1SAndroid Build Coastguard Worker //seq_fields.bits.low_delay_seq
1761*bbecb9d1SAndroid Build Coastguard Worker //seq_fields.bits.hierachical_flag
1762*bbecb9d1SAndroid Build Coastguard Worker //seq_fields.bits.reserved_bits
1763*bbecb9d1SAndroid Build Coastguard Worker
1764*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, log2_min_luma_coding_block_size_minus3);
1765*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, log2_diff_max_min_luma_coding_block_size);
1766*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, log2_min_transform_block_size_minus2);
1767*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, log2_diff_max_min_transform_block_size);
1768*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, max_transform_hierarchy_depth_inter);
1769*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, max_transform_hierarchy_depth_intra);
1770*bbecb9d1SAndroid Build Coastguard Worker //pcm_sample_bit_depth_luma_minus1
1771*bbecb9d1SAndroid Build Coastguard Worker //pcm_sample_bit_depth_chroma_minus1
1772*bbecb9d1SAndroid Build Coastguard Worker //log2_min_pcm_luma_coding_block_size_minus3
1773*bbecb9d1SAndroid Build Coastguard Worker //log2_max_pcm_luma_coding_block_size_minus3
1774*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, vui_parameters_present_flag);
1775*bbecb9d1SAndroid Build Coastguard Worker
1776*bbecb9d1SAndroid Build Coastguard Worker /* vui_fields.bits */
1777*bbecb9d1SAndroid Build Coastguard Worker if (desc->seq.vui_parameters_present_flag) {
1778*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->vui_fields.bits, &desc->seq.vui_flags,
1779*bbecb9d1SAndroid Build Coastguard Worker aspect_ratio_info_present_flag);
1780*bbecb9d1SAndroid Build Coastguard Worker }
1781*bbecb9d1SAndroid Build Coastguard Worker //vui_fields.bits.neutral_chroma_indication_flag
1782*bbecb9d1SAndroid Build Coastguard Worker //vui_fields.bits.field_seq_flag
1783*bbecb9d1SAndroid Build Coastguard Worker if (desc->seq.vui_parameters_present_flag) {
1784*bbecb9d1SAndroid Build Coastguard Worker param->vui_fields.bits.vui_timing_info_present_flag =
1785*bbecb9d1SAndroid Build Coastguard Worker desc->seq.vui_flags.timing_info_present_flag;
1786*bbecb9d1SAndroid Build Coastguard Worker }
1787*bbecb9d1SAndroid Build Coastguard Worker //vui_fields.bits.bitstream_restriction_flag
1788*bbecb9d1SAndroid Build Coastguard Worker //vui_fields.bits.tiles_fixed_structure_flag
1789*bbecb9d1SAndroid Build Coastguard Worker //vui_fields.bits.motion_vectors_over_pic_boundaries_flag
1790*bbecb9d1SAndroid Build Coastguard Worker //vui_fields.bits.restricted_ref_pic_lists_flag
1791*bbecb9d1SAndroid Build Coastguard Worker //vui_fields.bits.log2_max_mv_length_horizontal
1792*bbecb9d1SAndroid Build Coastguard Worker //vui_fields.bits.log2_max_mv_length_vertical
1793*bbecb9d1SAndroid Build Coastguard Worker
1794*bbecb9d1SAndroid Build Coastguard Worker if (desc->seq.vui_parameters_present_flag) {
1795*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, aspect_ratio_idc);
1796*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, sar_width);
1797*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->seq, sar_height);
1798*bbecb9d1SAndroid Build Coastguard Worker }
1799*bbecb9d1SAndroid Build Coastguard Worker param->vui_num_units_in_tick = desc->seq.num_units_in_tick;
1800*bbecb9d1SAndroid Build Coastguard Worker param->vui_time_scale = desc->seq.time_scale;
1801*bbecb9d1SAndroid Build Coastguard Worker //min_spatial_segmentation_idc
1802*bbecb9d1SAndroid Build Coastguard Worker //max_bytes_per_pic_denom
1803*bbecb9d1SAndroid Build Coastguard Worker //max_bits_per_min_cu_denom
1804*bbecb9d1SAndroid Build Coastguard Worker
1805*bbecb9d1SAndroid Build Coastguard Worker //scc_fields.bits.palette_mode_enabled_flag
1806*bbecb9d1SAndroid Build Coastguard Worker }
1807*bbecb9d1SAndroid Build Coastguard Worker
1808*bbecb9d1SAndroid Build Coastguard Worker /*
1809*bbecb9d1SAndroid Build Coastguard Worker * Refer to vlVaHandleVAEncPictureParameterBufferTypeHEVC() in mesa,
1810*bbecb9d1SAndroid Build Coastguard Worker * and comment out some unused parameters.
1811*bbecb9d1SAndroid Build Coastguard Worker */
h265_fill_enc_picture_param(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h265_enc_picture_desc * desc,VAEncPictureParameterBufferHEVC * param)1812*bbecb9d1SAndroid Build Coastguard Worker static void h265_fill_enc_picture_param(
1813*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
1814*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
1815*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h265_enc_picture_desc *desc,
1816*bbecb9d1SAndroid Build Coastguard Worker VAEncPictureParameterBufferHEVC *param)
1817*bbecb9d1SAndroid Build Coastguard Worker {
1818*bbecb9d1SAndroid Build Coastguard Worker unsigned i;
1819*bbecb9d1SAndroid Build Coastguard Worker
1820*bbecb9d1SAndroid Build Coastguard Worker (void)source;
1821*bbecb9d1SAndroid Build Coastguard Worker
1822*bbecb9d1SAndroid Build Coastguard Worker param->decoded_curr_pic.picture_id = get_enc_ref_pic(codec, desc->frame_num);
1823*bbecb9d1SAndroid Build Coastguard Worker param->decoded_curr_pic.pic_order_cnt = desc->pic_order_cnt;
1824*bbecb9d1SAndroid Build Coastguard Worker
1825*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < 15; i++) {
1826*bbecb9d1SAndroid Build Coastguard Worker h265_init_picture(¶m->reference_frames[i]);
1827*bbecb9d1SAndroid Build Coastguard Worker }
1828*bbecb9d1SAndroid Build Coastguard Worker
1829*bbecb9d1SAndroid Build Coastguard Worker param->coded_buf = codec->va_coded_buf;
1830*bbecb9d1SAndroid Build Coastguard Worker //collocated_ref_pic_index
1831*bbecb9d1SAndroid Build Coastguard Worker //last_picture
1832*bbecb9d1SAndroid Build Coastguard Worker param->pic_init_qp = desc->rc.quant_i_frames;
1833*bbecb9d1SAndroid Build Coastguard Worker //diff_cu_qp_delta_depth
1834*bbecb9d1SAndroid Build Coastguard Worker //pps_cb_qp_offset
1835*bbecb9d1SAndroid Build Coastguard Worker //pps_cr_qp_offset
1836*bbecb9d1SAndroid Build Coastguard Worker //num_tile_columns_minus1
1837*bbecb9d1SAndroid Build Coastguard Worker //num_tile_rows_minus1
1838*bbecb9d1SAndroid Build Coastguard Worker //column_width_minus1[19]
1839*bbecb9d1SAndroid Build Coastguard Worker //row_height_minus1[21]
1840*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->pic, log2_parallel_merge_level_minus2);
1841*bbecb9d1SAndroid Build Coastguard Worker //ctu_max_bitsize_allowed
1842*bbecb9d1SAndroid Build Coastguard Worker param->num_ref_idx_l0_default_active_minus1 = desc->num_ref_idx_l0_active_minus1;
1843*bbecb9d1SAndroid Build Coastguard Worker param->num_ref_idx_l1_default_active_minus1 = desc->num_ref_idx_l1_active_minus1;
1844*bbecb9d1SAndroid Build Coastguard Worker //slice_pic_parameter_set_id
1845*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->pic, nal_unit_type);
1846*bbecb9d1SAndroid Build Coastguard Worker
1847*bbecb9d1SAndroid Build Coastguard Worker param->pic_fields.bits.idr_pic_flag =
1848*bbecb9d1SAndroid Build Coastguard Worker (desc->picture_type == PIPE_H2645_ENC_PICTURE_TYPE_IDR);
1849*bbecb9d1SAndroid Build Coastguard Worker switch (desc->picture_type) {
1850*bbecb9d1SAndroid Build Coastguard Worker case PIPE_H2645_ENC_PICTURE_TYPE_IDR: /* fallthrough */
1851*bbecb9d1SAndroid Build Coastguard Worker case PIPE_H2645_ENC_PICTURE_TYPE_I:
1852*bbecb9d1SAndroid Build Coastguard Worker param->pic_fields.bits.coding_type = 1;
1853*bbecb9d1SAndroid Build Coastguard Worker break;
1854*bbecb9d1SAndroid Build Coastguard Worker case PIPE_H2645_ENC_PICTURE_TYPE_P:
1855*bbecb9d1SAndroid Build Coastguard Worker param->pic_fields.bits.coding_type = 2;
1856*bbecb9d1SAndroid Build Coastguard Worker break;
1857*bbecb9d1SAndroid Build Coastguard Worker case PIPE_H2645_ENC_PICTURE_TYPE_B:
1858*bbecb9d1SAndroid Build Coastguard Worker param->pic_fields.bits.coding_type = 3;
1859*bbecb9d1SAndroid Build Coastguard Worker break;
1860*bbecb9d1SAndroid Build Coastguard Worker default:
1861*bbecb9d1SAndroid Build Coastguard Worker break;
1862*bbecb9d1SAndroid Build Coastguard Worker }
1863*bbecb9d1SAndroid Build Coastguard Worker
1864*bbecb9d1SAndroid Build Coastguard Worker param->pic_fields.bits.reference_pic_flag = !desc->not_referenced;
1865*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.dependent_slice_segments_enabled_flag
1866*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.sign_data_hiding_enabled_flag
1867*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->pic_fields.bits, &desc->pic, constrained_intra_pred_flag);
1868*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->pic_fields.bits, &desc->pic, transform_skip_enabled_flag);
1869*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.cu_qp_delta_enabled_flag
1870*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.weighted_pred_flag
1871*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.weighted_bipred_flag
1872*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.transquant_bypass_enabled_flag
1873*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.tiles_enabled_flag
1874*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.entropy_coding_sync_enabled_flag
1875*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.loop_filter_across_tiles_enabled_flag
1876*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->pic_fields.bits, &desc->pic,
1877*bbecb9d1SAndroid Build Coastguard Worker pps_loop_filter_across_slices_enabled_flag);
1878*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.scaling_list_data_present_flag
1879*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.screen_content_flag
1880*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.enable_gpu_weighted_prediction
1881*bbecb9d1SAndroid Build Coastguard Worker //pic_fields.bits.no_output_of_prior_pics_flag
1882*bbecb9d1SAndroid Build Coastguard Worker
1883*bbecb9d1SAndroid Build Coastguard Worker //hierarchical_level_plus1
1884*bbecb9d1SAndroid Build Coastguard Worker //scc_fields.bits.pps_curr_pic_ref_enabled_flag
1885*bbecb9d1SAndroid Build Coastguard Worker }
1886*bbecb9d1SAndroid Build Coastguard Worker
1887*bbecb9d1SAndroid Build Coastguard Worker /*
1888*bbecb9d1SAndroid Build Coastguard Worker * Refer to vlVaHandleVAEncSliceParameterBufferTypeHEVC() in mesa,
1889*bbecb9d1SAndroid Build Coastguard Worker * and comment out some unused parameters.
1890*bbecb9d1SAndroid Build Coastguard Worker */
h265_fill_enc_slice_param(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h265_enc_picture_desc * desc,VAEncSliceParameterBufferHEVC * param)1891*bbecb9d1SAndroid Build Coastguard Worker static void h265_fill_enc_slice_param(
1892*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
1893*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
1894*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h265_enc_picture_desc *desc,
1895*bbecb9d1SAndroid Build Coastguard Worker VAEncSliceParameterBufferHEVC *param)
1896*bbecb9d1SAndroid Build Coastguard Worker {
1897*bbecb9d1SAndroid Build Coastguard Worker unsigned i;
1898*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h265_slice_descriptor *sd;
1899*bbecb9d1SAndroid Build Coastguard Worker
1900*bbecb9d1SAndroid Build Coastguard Worker (void)source;
1901*bbecb9d1SAndroid Build Coastguard Worker
1902*bbecb9d1SAndroid Build Coastguard Worker /* Get the lastest slice descriptor */
1903*bbecb9d1SAndroid Build Coastguard Worker if (desc->num_slice_descriptors &&
1904*bbecb9d1SAndroid Build Coastguard Worker desc->num_slice_descriptors <= ARRAY_SIZE(desc->slices_descriptors)) {
1905*bbecb9d1SAndroid Build Coastguard Worker sd = &desc->slices_descriptors[desc->num_slice_descriptors - 1];
1906*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, sd, slice_segment_address);
1907*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, sd, num_ctu_in_slice);
1908*bbecb9d1SAndroid Build Coastguard Worker }
1909*bbecb9d1SAndroid Build Coastguard Worker
1910*bbecb9d1SAndroid Build Coastguard Worker switch (desc->picture_type) {
1911*bbecb9d1SAndroid Build Coastguard Worker case PIPE_H2645_ENC_PICTURE_TYPE_P:
1912*bbecb9d1SAndroid Build Coastguard Worker param->slice_type = 0;
1913*bbecb9d1SAndroid Build Coastguard Worker break;
1914*bbecb9d1SAndroid Build Coastguard Worker case PIPE_H2645_ENC_PICTURE_TYPE_B:
1915*bbecb9d1SAndroid Build Coastguard Worker param->slice_type = 1;
1916*bbecb9d1SAndroid Build Coastguard Worker break;
1917*bbecb9d1SAndroid Build Coastguard Worker case PIPE_H2645_ENC_PICTURE_TYPE_I:
1918*bbecb9d1SAndroid Build Coastguard Worker case PIPE_H2645_ENC_PICTURE_TYPE_IDR: /* fall through */
1919*bbecb9d1SAndroid Build Coastguard Worker param->slice_type = 2;
1920*bbecb9d1SAndroid Build Coastguard Worker break;
1921*bbecb9d1SAndroid Build Coastguard Worker case PIPE_H2645_ENC_PICTURE_TYPE_SKIP:
1922*bbecb9d1SAndroid Build Coastguard Worker default:
1923*bbecb9d1SAndroid Build Coastguard Worker break;
1924*bbecb9d1SAndroid Build Coastguard Worker }
1925*bbecb9d1SAndroid Build Coastguard Worker
1926*bbecb9d1SAndroid Build Coastguard Worker //slice_pic_parameter_set_id
1927*bbecb9d1SAndroid Build Coastguard Worker
1928*bbecb9d1SAndroid Build Coastguard Worker //num_ref_idx_l0_active_minus1
1929*bbecb9d1SAndroid Build Coastguard Worker //num_ref_idx_l1_active_minus1
1930*bbecb9d1SAndroid Build Coastguard Worker
1931*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < 15; i++) {
1932*bbecb9d1SAndroid Build Coastguard Worker h265_init_picture(¶m->ref_pic_list0[i]);
1933*bbecb9d1SAndroid Build Coastguard Worker h265_init_picture(¶m->ref_pic_list1[i]);
1934*bbecb9d1SAndroid Build Coastguard Worker
1935*bbecb9d1SAndroid Build Coastguard Worker param->ref_pic_list0[i].picture_id =
1936*bbecb9d1SAndroid Build Coastguard Worker get_enc_ref_pic(codec, desc->ref_idx_l0_list[i]);
1937*bbecb9d1SAndroid Build Coastguard Worker param->ref_pic_list1[i].picture_id =
1938*bbecb9d1SAndroid Build Coastguard Worker get_enc_ref_pic(codec, desc->ref_idx_l1_list[i]);
1939*bbecb9d1SAndroid Build Coastguard Worker
1940*bbecb9d1SAndroid Build Coastguard Worker if (param->ref_pic_list0[i].picture_id != VA_INVALID_ID)
1941*bbecb9d1SAndroid Build Coastguard Worker param->ref_pic_list0[i].flags = VA_PICTURE_HEVC_RPS_ST_CURR_BEFORE;
1942*bbecb9d1SAndroid Build Coastguard Worker
1943*bbecb9d1SAndroid Build Coastguard Worker if (param->ref_pic_list1[i].picture_id != VA_INVALID_ID)
1944*bbecb9d1SAndroid Build Coastguard Worker param->ref_pic_list1[i].flags = VA_PICTURE_HEVC_RPS_ST_CURR_BEFORE;
1945*bbecb9d1SAndroid Build Coastguard Worker }
1946*bbecb9d1SAndroid Build Coastguard Worker
1947*bbecb9d1SAndroid Build Coastguard Worker //luma_log2_weight_denom
1948*bbecb9d1SAndroid Build Coastguard Worker //delta_chroma_log2_weight_denom
1949*bbecb9d1SAndroid Build Coastguard Worker //delta_luma_weight_l0[15]
1950*bbecb9d1SAndroid Build Coastguard Worker //luma_offset_l0[15]
1951*bbecb9d1SAndroid Build Coastguard Worker //delta_chroma_weight_l0[15][2]
1952*bbecb9d1SAndroid Build Coastguard Worker //chroma_offset_l0[15][2]
1953*bbecb9d1SAndroid Build Coastguard Worker //delta_luma_weight_l1[15]
1954*bbecb9d1SAndroid Build Coastguard Worker //luma_offset_l1[15]
1955*bbecb9d1SAndroid Build Coastguard Worker //delta_chroma_weight_l1[15][2]
1956*bbecb9d1SAndroid Build Coastguard Worker //chroma_offset_l1[15][2]
1957*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->slice, max_num_merge_cand);
1958*bbecb9d1SAndroid Build Coastguard Worker //slice_qp_delta
1959*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->slice, slice_cb_qp_offset);
1960*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->slice, slice_cr_qp_offset);
1961*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->slice, slice_beta_offset_div2);
1962*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(param, &desc->slice, slice_tc_offset_div2);
1963*bbecb9d1SAndroid Build Coastguard Worker
1964*bbecb9d1SAndroid Build Coastguard Worker //slice_fields.bits.last_slice_of_pic_flag
1965*bbecb9d1SAndroid Build Coastguard Worker //slice_fields.bits.dependent_slice_segment_flag
1966*bbecb9d1SAndroid Build Coastguard Worker //slice_fields.bits.colour_plane_id
1967*bbecb9d1SAndroid Build Coastguard Worker //slice_fields.bits.slice_temporal_mvp_enabled_flag
1968*bbecb9d1SAndroid Build Coastguard Worker //slice_fields.bits.slice_sao_luma_flag
1969*bbecb9d1SAndroid Build Coastguard Worker //slice_fields.bits.slice_sao_chroma_flag
1970*bbecb9d1SAndroid Build Coastguard Worker /*
1971*bbecb9d1SAndroid Build Coastguard Worker * Sine num_ref_idx_l0_active_minus1 and num_ref_idx_l1_active_minus1
1972*bbecb9d1SAndroid Build Coastguard Worker * have been passed by VAEncPictureParameterBufferHEVC,
1973*bbecb9d1SAndroid Build Coastguard Worker * num_ref_idx_active_override_flag is always set to 0.
1974*bbecb9d1SAndroid Build Coastguard Worker */
1975*bbecb9d1SAndroid Build Coastguard Worker param->slice_fields.bits.num_ref_idx_active_override_flag = 0;
1976*bbecb9d1SAndroid Build Coastguard Worker //slice_fields.bits.mvd_l1_zero_flag
1977*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->slice_fields.bits, &desc->slice, cabac_init_flag);
1978*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->slice_fields.bits, &desc->slice,
1979*bbecb9d1SAndroid Build Coastguard Worker slice_deblocking_filter_disabled_flag);
1980*bbecb9d1SAndroid Build Coastguard Worker ITEM_SET(¶m->slice_fields.bits,
1981*bbecb9d1SAndroid Build Coastguard Worker &desc->slice, slice_loop_filter_across_slices_enabled_flag);
1982*bbecb9d1SAndroid Build Coastguard Worker //slice_fields.bits.collocated_from_l0_flag
1983*bbecb9d1SAndroid Build Coastguard Worker
1984*bbecb9d1SAndroid Build Coastguard Worker //pred_weight_table_bit_offset
1985*bbecb9d1SAndroid Build Coastguard Worker //pred_weight_table_bit_length;
1986*bbecb9d1SAndroid Build Coastguard Worker }
1987*bbecb9d1SAndroid Build Coastguard Worker
1988*bbecb9d1SAndroid Build Coastguard Worker /*
1989*bbecb9d1SAndroid Build Coastguard Worker * Refer to vlVaHandleVAEncMiscParameterTypeRateControlHEVC() in mesa,
1990*bbecb9d1SAndroid Build Coastguard Worker * and comment out some unused parameters.
1991*bbecb9d1SAndroid Build Coastguard Worker */
h265_fill_enc_misc_param_rate_ctrl(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h265_enc_picture_desc * desc,VAEncMiscParameterRateControl * param)1992*bbecb9d1SAndroid Build Coastguard Worker static void h265_fill_enc_misc_param_rate_ctrl(
1993*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
1994*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
1995*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h265_enc_picture_desc *desc,
1996*bbecb9d1SAndroid Build Coastguard Worker VAEncMiscParameterRateControl *param)
1997*bbecb9d1SAndroid Build Coastguard Worker {
1998*bbecb9d1SAndroid Build Coastguard Worker (void)codec;
1999*bbecb9d1SAndroid Build Coastguard Worker (void)source;
2000*bbecb9d1SAndroid Build Coastguard Worker
2001*bbecb9d1SAndroid Build Coastguard Worker param->bits_per_second = desc->rc.peak_bitrate;
2002*bbecb9d1SAndroid Build Coastguard Worker if (desc->rc.rate_ctrl_method !=
2003*bbecb9d1SAndroid Build Coastguard Worker PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT) {
2004*bbecb9d1SAndroid Build Coastguard Worker param->target_percentage = desc->rc.target_bitrate *
2005*bbecb9d1SAndroid Build Coastguard Worker param->bits_per_second / 100.0;
2006*bbecb9d1SAndroid Build Coastguard Worker }
2007*bbecb9d1SAndroid Build Coastguard Worker //window_size;
2008*bbecb9d1SAndroid Build Coastguard Worker //initial_qp;
2009*bbecb9d1SAndroid Build Coastguard Worker param->min_qp = desc->rc.min_qp;
2010*bbecb9d1SAndroid Build Coastguard Worker //basic_unit_size;
2011*bbecb9d1SAndroid Build Coastguard Worker
2012*bbecb9d1SAndroid Build Coastguard Worker /* rc_flags */
2013*bbecb9d1SAndroid Build Coastguard Worker //rc_flags.bits.reset
2014*bbecb9d1SAndroid Build Coastguard Worker param->rc_flags.bits.disable_frame_skip = !desc->rc.skip_frame_enable;
2015*bbecb9d1SAndroid Build Coastguard Worker param->rc_flags.bits.disable_bit_stuffing = !desc->rc.fill_data_enable;
2016*bbecb9d1SAndroid Build Coastguard Worker //rc_flags.bits.mb_rate_control
2017*bbecb9d1SAndroid Build Coastguard Worker //rc_flags.bits.temporal_id
2018*bbecb9d1SAndroid Build Coastguard Worker //rc_flags.bits.cfs_I_frames
2019*bbecb9d1SAndroid Build Coastguard Worker //rc_flags.bits.enable_parallel_brc
2020*bbecb9d1SAndroid Build Coastguard Worker //rc_flags.bits.enable_dynamic_scaling
2021*bbecb9d1SAndroid Build Coastguard Worker //rc_flags.bits.frame_tolerance_mode
2022*bbecb9d1SAndroid Build Coastguard Worker
2023*bbecb9d1SAndroid Build Coastguard Worker //ICQ_quality_factor;
2024*bbecb9d1SAndroid Build Coastguard Worker param->max_qp = desc->rc.max_qp;
2025*bbecb9d1SAndroid Build Coastguard Worker //quality_factor;
2026*bbecb9d1SAndroid Build Coastguard Worker //target_frame_size;
2027*bbecb9d1SAndroid Build Coastguard Worker }
2028*bbecb9d1SAndroid Build Coastguard Worker
2029*bbecb9d1SAndroid Build Coastguard Worker /*
2030*bbecb9d1SAndroid Build Coastguard Worker * Refer to vlVaHandleVAEncMiscParameterTypeFrameRateHEVC() in mesa,
2031*bbecb9d1SAndroid Build Coastguard Worker * and comment out some unused parameters.
2032*bbecb9d1SAndroid Build Coastguard Worker */
h265_fill_enc_misc_param_frame_rate(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h265_enc_picture_desc * desc,VAEncMiscParameterFrameRate * param)2033*bbecb9d1SAndroid Build Coastguard Worker static void h265_fill_enc_misc_param_frame_rate(
2034*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
2035*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
2036*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h265_enc_picture_desc *desc,
2037*bbecb9d1SAndroid Build Coastguard Worker VAEncMiscParameterFrameRate *param)
2038*bbecb9d1SAndroid Build Coastguard Worker {
2039*bbecb9d1SAndroid Build Coastguard Worker (void)codec;
2040*bbecb9d1SAndroid Build Coastguard Worker (void)source;
2041*bbecb9d1SAndroid Build Coastguard Worker
2042*bbecb9d1SAndroid Build Coastguard Worker param->framerate = desc->rc.frame_rate_num | (desc->rc.frame_rate_den << 16);
2043*bbecb9d1SAndroid Build Coastguard Worker //framerate_flags
2044*bbecb9d1SAndroid Build Coastguard Worker }
2045*bbecb9d1SAndroid Build Coastguard Worker
h265_decode_bitstream(struct virgl_video_codec * codec,struct virgl_video_buffer * target,const struct virgl_h265_picture_desc * desc,unsigned num_buffers,const void * const * buffers,const unsigned * sizes)2046*bbecb9d1SAndroid Build Coastguard Worker static int h265_decode_bitstream(struct virgl_video_codec *codec,
2047*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *target,
2048*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h265_picture_desc *desc,
2049*bbecb9d1SAndroid Build Coastguard Worker unsigned num_buffers,
2050*bbecb9d1SAndroid Build Coastguard Worker const void * const *buffers,
2051*bbecb9d1SAndroid Build Coastguard Worker const unsigned *sizes)
2052*bbecb9d1SAndroid Build Coastguard Worker {
2053*bbecb9d1SAndroid Build Coastguard Worker unsigned i;
2054*bbecb9d1SAndroid Build Coastguard Worker int err = 0;
2055*bbecb9d1SAndroid Build Coastguard Worker VAStatus va_stat;
2056*bbecb9d1SAndroid Build Coastguard Worker VABufferID *slice_data_buf, pic_param_buf, slice_param_buf;
2057*bbecb9d1SAndroid Build Coastguard Worker VAPictureParameterBufferHEVC pic_param = {0};
2058*bbecb9d1SAndroid Build Coastguard Worker VASliceParameterBufferHEVC slice_param = {0};
2059*bbecb9d1SAndroid Build Coastguard Worker
2060*bbecb9d1SAndroid Build Coastguard Worker slice_data_buf = calloc(num_buffers, sizeof(VABufferID));
2061*bbecb9d1SAndroid Build Coastguard Worker if (!slice_data_buf) {
2062*bbecb9d1SAndroid Build Coastguard Worker virgl_log("alloc slice data buffer id failed\n");
2063*bbecb9d1SAndroid Build Coastguard Worker return -1;
2064*bbecb9d1SAndroid Build Coastguard Worker }
2065*bbecb9d1SAndroid Build Coastguard Worker
2066*bbecb9d1SAndroid Build Coastguard Worker h265_fill_picture_param(codec, target, desc, &pic_param);
2067*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VAPictureParameterBufferType,
2068*bbecb9d1SAndroid Build Coastguard Worker sizeof(pic_param), 1, &pic_param, &pic_param_buf);
2069*bbecb9d1SAndroid Build Coastguard Worker
2070*bbecb9d1SAndroid Build Coastguard Worker h265_fill_slice_param(desc, &slice_param);
2071*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VASliceParameterBufferType,
2072*bbecb9d1SAndroid Build Coastguard Worker sizeof(slice_param), 1, &slice_param, &slice_param_buf);
2073*bbecb9d1SAndroid Build Coastguard Worker
2074*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < num_buffers; i++) {
2075*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VASliceDataBufferType,
2076*bbecb9d1SAndroid Build Coastguard Worker sizes[i], 1, (void *)(buffers[i]), &slice_data_buf[i]);
2077*bbecb9d1SAndroid Build Coastguard Worker }
2078*bbecb9d1SAndroid Build Coastguard Worker
2079*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &pic_param_buf, 1);
2080*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
2081*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render picture param failed, err = 0x%x\n", va_stat);
2082*bbecb9d1SAndroid Build Coastguard Worker err = -1;
2083*bbecb9d1SAndroid Build Coastguard Worker goto err;
2084*bbecb9d1SAndroid Build Coastguard Worker }
2085*bbecb9d1SAndroid Build Coastguard Worker
2086*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &slice_param_buf, 1);
2087*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
2088*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render slice param failed, err = 0x%x\n", va_stat);
2089*bbecb9d1SAndroid Build Coastguard Worker err = -1;
2090*bbecb9d1SAndroid Build Coastguard Worker goto err;
2091*bbecb9d1SAndroid Build Coastguard Worker }
2092*bbecb9d1SAndroid Build Coastguard Worker
2093*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < num_buffers; i++) {
2094*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &slice_data_buf[i], 1);
2095*bbecb9d1SAndroid Build Coastguard Worker
2096*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
2097*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render slice data failed, err = 0x%x\n", va_stat);
2098*bbecb9d1SAndroid Build Coastguard Worker err = -1;
2099*bbecb9d1SAndroid Build Coastguard Worker }
2100*bbecb9d1SAndroid Build Coastguard Worker }
2101*bbecb9d1SAndroid Build Coastguard Worker
2102*bbecb9d1SAndroid Build Coastguard Worker err:
2103*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, pic_param_buf);
2104*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, slice_param_buf);
2105*bbecb9d1SAndroid Build Coastguard Worker for (i = 0; i < num_buffers; i++)
2106*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, slice_data_buf[i]);
2107*bbecb9d1SAndroid Build Coastguard Worker free(slice_data_buf);
2108*bbecb9d1SAndroid Build Coastguard Worker
2109*bbecb9d1SAndroid Build Coastguard Worker return err;
2110*bbecb9d1SAndroid Build Coastguard Worker }
2111*bbecb9d1SAndroid Build Coastguard Worker
h265_encode_render_sequence(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h265_enc_picture_desc * desc)2112*bbecb9d1SAndroid Build Coastguard Worker static int h265_encode_render_sequence(
2113*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
2114*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
2115*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h265_enc_picture_desc *desc)
2116*bbecb9d1SAndroid Build Coastguard Worker {
2117*bbecb9d1SAndroid Build Coastguard Worker int err = 0;
2118*bbecb9d1SAndroid Build Coastguard Worker VAStatus va_stat;
2119*bbecb9d1SAndroid Build Coastguard Worker VAEncSequenceParameterBufferHEVC seq_param;
2120*bbecb9d1SAndroid Build Coastguard Worker VAEncMiscParameterBuffer *misc_param;
2121*bbecb9d1SAndroid Build Coastguard Worker VABufferID seq_param_buf, rc_param_buf, fr_param_buf;
2122*bbecb9d1SAndroid Build Coastguard Worker
2123*bbecb9d1SAndroid Build Coastguard Worker memset(&seq_param, 0, sizeof(seq_param));
2124*bbecb9d1SAndroid Build Coastguard Worker h265_fill_enc_seq_param(codec, source, desc, &seq_param);
2125*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VAEncSequenceParameterBufferType,
2126*bbecb9d1SAndroid Build Coastguard Worker sizeof(seq_param), 1, &seq_param, &seq_param_buf);
2127*bbecb9d1SAndroid Build Coastguard Worker
2128*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VAEncMiscParameterBufferType,
2129*bbecb9d1SAndroid Build Coastguard Worker sizeof(VAEncMiscParameterBuffer) +
2130*bbecb9d1SAndroid Build Coastguard Worker sizeof(VAEncMiscParameterRateControl), 1, NULL, &rc_param_buf);
2131*bbecb9d1SAndroid Build Coastguard Worker vaMapBuffer(va_dpy, rc_param_buf, (void **)&misc_param);
2132*bbecb9d1SAndroid Build Coastguard Worker misc_param->type = VAEncMiscParameterTypeRateControl;
2133*bbecb9d1SAndroid Build Coastguard Worker h265_fill_enc_misc_param_rate_ctrl(codec, source, desc,
2134*bbecb9d1SAndroid Build Coastguard Worker (VAEncMiscParameterRateControl *)misc_param->data);
2135*bbecb9d1SAndroid Build Coastguard Worker vaUnmapBuffer(va_dpy, rc_param_buf);
2136*bbecb9d1SAndroid Build Coastguard Worker
2137*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VAEncMiscParameterBufferType,
2138*bbecb9d1SAndroid Build Coastguard Worker sizeof(VAEncMiscParameterBuffer) +
2139*bbecb9d1SAndroid Build Coastguard Worker sizeof(VAEncMiscParameterFrameRate), 1, NULL, &fr_param_buf);
2140*bbecb9d1SAndroid Build Coastguard Worker vaMapBuffer(va_dpy, fr_param_buf, (void **)&misc_param);
2141*bbecb9d1SAndroid Build Coastguard Worker misc_param->type = VAEncMiscParameterTypeFrameRate;
2142*bbecb9d1SAndroid Build Coastguard Worker h265_fill_enc_misc_param_frame_rate(codec, source, desc,
2143*bbecb9d1SAndroid Build Coastguard Worker (VAEncMiscParameterFrameRate *)misc_param->data);
2144*bbecb9d1SAndroid Build Coastguard Worker vaUnmapBuffer(va_dpy, fr_param_buf);
2145*bbecb9d1SAndroid Build Coastguard Worker
2146*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &seq_param_buf, 1);
2147*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
2148*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render h265 sequence param failed, err = 0x%x\n", va_stat);
2149*bbecb9d1SAndroid Build Coastguard Worker err = -1;
2150*bbecb9d1SAndroid Build Coastguard Worker goto error;
2151*bbecb9d1SAndroid Build Coastguard Worker }
2152*bbecb9d1SAndroid Build Coastguard Worker
2153*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &rc_param_buf, 1);
2154*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
2155*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render h265 rate control param failed, err = 0x%x\n", va_stat);
2156*bbecb9d1SAndroid Build Coastguard Worker err = -1;
2157*bbecb9d1SAndroid Build Coastguard Worker goto error;
2158*bbecb9d1SAndroid Build Coastguard Worker }
2159*bbecb9d1SAndroid Build Coastguard Worker
2160*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &fr_param_buf, 1);
2161*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
2162*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render h265 frame rate param failed, err = 0x%x\n", va_stat);
2163*bbecb9d1SAndroid Build Coastguard Worker err = -1;
2164*bbecb9d1SAndroid Build Coastguard Worker goto error;
2165*bbecb9d1SAndroid Build Coastguard Worker }
2166*bbecb9d1SAndroid Build Coastguard Worker
2167*bbecb9d1SAndroid Build Coastguard Worker error:
2168*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, seq_param_buf);
2169*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, rc_param_buf);
2170*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, fr_param_buf);
2171*bbecb9d1SAndroid Build Coastguard Worker
2172*bbecb9d1SAndroid Build Coastguard Worker return err;
2173*bbecb9d1SAndroid Build Coastguard Worker }
2174*bbecb9d1SAndroid Build Coastguard Worker
h265_encode_render_picture(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h265_enc_picture_desc * desc)2175*bbecb9d1SAndroid Build Coastguard Worker static int h265_encode_render_picture(
2176*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
2177*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
2178*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h265_enc_picture_desc *desc)
2179*bbecb9d1SAndroid Build Coastguard Worker {
2180*bbecb9d1SAndroid Build Coastguard Worker VAStatus va_stat;
2181*bbecb9d1SAndroid Build Coastguard Worker VABufferID pic_param_buf;
2182*bbecb9d1SAndroid Build Coastguard Worker VAEncPictureParameterBufferHEVC pic_param;
2183*bbecb9d1SAndroid Build Coastguard Worker
2184*bbecb9d1SAndroid Build Coastguard Worker memset(&pic_param, 0, sizeof(pic_param));
2185*bbecb9d1SAndroid Build Coastguard Worker h265_fill_enc_picture_param(codec, source, desc, &pic_param);
2186*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VAEncPictureParameterBufferType,
2187*bbecb9d1SAndroid Build Coastguard Worker sizeof(pic_param), 1, &pic_param, &pic_param_buf);
2188*bbecb9d1SAndroid Build Coastguard Worker
2189*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &pic_param_buf, 1);
2190*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, pic_param_buf);
2191*bbecb9d1SAndroid Build Coastguard Worker
2192*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
2193*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render h265 picture param failed, err = 0x%x\n", va_stat);
2194*bbecb9d1SAndroid Build Coastguard Worker return -1;
2195*bbecb9d1SAndroid Build Coastguard Worker }
2196*bbecb9d1SAndroid Build Coastguard Worker
2197*bbecb9d1SAndroid Build Coastguard Worker return 0;
2198*bbecb9d1SAndroid Build Coastguard Worker }
2199*bbecb9d1SAndroid Build Coastguard Worker
h265_encode_render_slice(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h265_enc_picture_desc * desc)2200*bbecb9d1SAndroid Build Coastguard Worker static int h265_encode_render_slice(
2201*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
2202*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
2203*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h265_enc_picture_desc *desc)
2204*bbecb9d1SAndroid Build Coastguard Worker {
2205*bbecb9d1SAndroid Build Coastguard Worker VAStatus va_stat;
2206*bbecb9d1SAndroid Build Coastguard Worker VABufferID slice_param_buf;
2207*bbecb9d1SAndroid Build Coastguard Worker VAEncSliceParameterBufferHEVC slice_param;
2208*bbecb9d1SAndroid Build Coastguard Worker
2209*bbecb9d1SAndroid Build Coastguard Worker memset(&slice_param, 0, sizeof(slice_param));
2210*bbecb9d1SAndroid Build Coastguard Worker h265_fill_enc_slice_param(codec, source, desc, &slice_param);
2211*bbecb9d1SAndroid Build Coastguard Worker vaCreateBuffer(va_dpy, codec->va_ctx, VAEncSliceParameterBufferType,
2212*bbecb9d1SAndroid Build Coastguard Worker sizeof(slice_param), 1, &slice_param, &slice_param_buf);
2213*bbecb9d1SAndroid Build Coastguard Worker
2214*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &slice_param_buf, 1);
2215*bbecb9d1SAndroid Build Coastguard Worker vaDestroyBuffer(va_dpy, slice_param_buf);
2216*bbecb9d1SAndroid Build Coastguard Worker
2217*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
2218*bbecb9d1SAndroid Build Coastguard Worker virgl_log("render h265 slice param failed, err = 0x%x\n", va_stat);
2219*bbecb9d1SAndroid Build Coastguard Worker return -1;
2220*bbecb9d1SAndroid Build Coastguard Worker }
2221*bbecb9d1SAndroid Build Coastguard Worker
2222*bbecb9d1SAndroid Build Coastguard Worker return 0;
2223*bbecb9d1SAndroid Build Coastguard Worker }
2224*bbecb9d1SAndroid Build Coastguard Worker
h265_encode_bitstream(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const struct virgl_h265_enc_picture_desc * desc)2225*bbecb9d1SAndroid Build Coastguard Worker static int h265_encode_bitstream(
2226*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_codec *codec,
2227*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
2228*bbecb9d1SAndroid Build Coastguard Worker const struct virgl_h265_enc_picture_desc *desc)
2229*bbecb9d1SAndroid Build Coastguard Worker {
2230*bbecb9d1SAndroid Build Coastguard Worker if (desc->picture_type == PIPE_H2645_ENC_PICTURE_TYPE_IDR) {
2231*bbecb9d1SAndroid Build Coastguard Worker h265_encode_render_sequence(codec, source, desc);
2232*bbecb9d1SAndroid Build Coastguard Worker }
2233*bbecb9d1SAndroid Build Coastguard Worker
2234*bbecb9d1SAndroid Build Coastguard Worker h265_encode_render_picture(codec, source, desc);
2235*bbecb9d1SAndroid Build Coastguard Worker h265_encode_render_slice(codec, source, desc);
2236*bbecb9d1SAndroid Build Coastguard Worker
2237*bbecb9d1SAndroid Build Coastguard Worker return 0;
2238*bbecb9d1SAndroid Build Coastguard Worker }
2239*bbecb9d1SAndroid Build Coastguard Worker
virgl_video_decode_bitstream(struct virgl_video_codec * codec,struct virgl_video_buffer * target,const union virgl_picture_desc * desc,unsigned num_buffers,const void * const * buffers,const unsigned * sizes)2240*bbecb9d1SAndroid Build Coastguard Worker int virgl_video_decode_bitstream(struct virgl_video_codec *codec,
2241*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *target,
2242*bbecb9d1SAndroid Build Coastguard Worker const union virgl_picture_desc *desc,
2243*bbecb9d1SAndroid Build Coastguard Worker unsigned num_buffers,
2244*bbecb9d1SAndroid Build Coastguard Worker const void * const *buffers,
2245*bbecb9d1SAndroid Build Coastguard Worker const unsigned *sizes)
2246*bbecb9d1SAndroid Build Coastguard Worker {
2247*bbecb9d1SAndroid Build Coastguard Worker
2248*bbecb9d1SAndroid Build Coastguard Worker if (!va_dpy || !codec || !target || !desc
2249*bbecb9d1SAndroid Build Coastguard Worker || !num_buffers || !buffers || !sizes)
2250*bbecb9d1SAndroid Build Coastguard Worker return -1;
2251*bbecb9d1SAndroid Build Coastguard Worker
2252*bbecb9d1SAndroid Build Coastguard Worker if (desc->base.profile != codec->profile) {
2253*bbecb9d1SAndroid Build Coastguard Worker virgl_log("profiles not matched, picture: %d, codec: %d\n",
2254*bbecb9d1SAndroid Build Coastguard Worker desc->base.profile, codec->profile);
2255*bbecb9d1SAndroid Build Coastguard Worker return -1;
2256*bbecb9d1SAndroid Build Coastguard Worker }
2257*bbecb9d1SAndroid Build Coastguard Worker
2258*bbecb9d1SAndroid Build Coastguard Worker switch (codec->profile) {
2259*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE:
2260*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE:
2261*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:
2262*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_EXTENDED:
2263*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
2264*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10:
2265*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH422:
2266*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH444:
2267*bbecb9d1SAndroid Build Coastguard Worker return h264_decode_bitstream(codec, target, &desc->h264,
2268*bbecb9d1SAndroid Build Coastguard Worker num_buffers, buffers, sizes);
2269*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_HEVC_MAIN:
2270*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_HEVC_MAIN_10:
2271*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_HEVC_MAIN_STILL:
2272*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_HEVC_MAIN_12:
2273*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_HEVC_MAIN_444:
2274*bbecb9d1SAndroid Build Coastguard Worker return h265_decode_bitstream(codec, target, &desc->h265,
2275*bbecb9d1SAndroid Build Coastguard Worker num_buffers, buffers, sizes);
2276*bbecb9d1SAndroid Build Coastguard Worker default:
2277*bbecb9d1SAndroid Build Coastguard Worker break;
2278*bbecb9d1SAndroid Build Coastguard Worker }
2279*bbecb9d1SAndroid Build Coastguard Worker
2280*bbecb9d1SAndroid Build Coastguard Worker return -1;
2281*bbecb9d1SAndroid Build Coastguard Worker }
2282*bbecb9d1SAndroid Build Coastguard Worker
virgl_video_encode_bitstream(struct virgl_video_codec * codec,struct virgl_video_buffer * source,const union virgl_picture_desc * desc)2283*bbecb9d1SAndroid Build Coastguard Worker int virgl_video_encode_bitstream(struct virgl_video_codec *codec,
2284*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *source,
2285*bbecb9d1SAndroid Build Coastguard Worker const union virgl_picture_desc *desc)
2286*bbecb9d1SAndroid Build Coastguard Worker {
2287*bbecb9d1SAndroid Build Coastguard Worker if (!va_dpy || !codec || !source || !desc)
2288*bbecb9d1SAndroid Build Coastguard Worker return -1;
2289*bbecb9d1SAndroid Build Coastguard Worker
2290*bbecb9d1SAndroid Build Coastguard Worker if (desc->base.profile != codec->profile) {
2291*bbecb9d1SAndroid Build Coastguard Worker virgl_log("profiles not matched, picture: %d, codec: %d\n",
2292*bbecb9d1SAndroid Build Coastguard Worker desc->base.profile, codec->profile);
2293*bbecb9d1SAndroid Build Coastguard Worker return -1;
2294*bbecb9d1SAndroid Build Coastguard Worker }
2295*bbecb9d1SAndroid Build Coastguard Worker
2296*bbecb9d1SAndroid Build Coastguard Worker switch (codec->profile) {
2297*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE:
2298*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE:
2299*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:
2300*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_EXTENDED:
2301*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
2302*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10:
2303*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH422:
2304*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH444:
2305*bbecb9d1SAndroid Build Coastguard Worker return h264_encode_bitstream(codec, source, &desc->h264_enc);
2306*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_HEVC_MAIN:
2307*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_HEVC_MAIN_10:
2308*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_HEVC_MAIN_STILL:
2309*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_HEVC_MAIN_12:
2310*bbecb9d1SAndroid Build Coastguard Worker case PIPE_VIDEO_PROFILE_HEVC_MAIN_444:
2311*bbecb9d1SAndroid Build Coastguard Worker return h265_encode_bitstream(codec, source, &desc->h265_enc);
2312*bbecb9d1SAndroid Build Coastguard Worker default:
2313*bbecb9d1SAndroid Build Coastguard Worker break;
2314*bbecb9d1SAndroid Build Coastguard Worker }
2315*bbecb9d1SAndroid Build Coastguard Worker
2316*bbecb9d1SAndroid Build Coastguard Worker return -1;
2317*bbecb9d1SAndroid Build Coastguard Worker }
2318*bbecb9d1SAndroid Build Coastguard Worker
virgl_video_end_frame(struct virgl_video_codec * codec,struct virgl_video_buffer * target)2319*bbecb9d1SAndroid Build Coastguard Worker int virgl_video_end_frame(struct virgl_video_codec *codec,
2320*bbecb9d1SAndroid Build Coastguard Worker struct virgl_video_buffer *target)
2321*bbecb9d1SAndroid Build Coastguard Worker {
2322*bbecb9d1SAndroid Build Coastguard Worker VAStatus va_stat;
2323*bbecb9d1SAndroid Build Coastguard Worker
2324*bbecb9d1SAndroid Build Coastguard Worker if (!va_dpy || !codec || !target)
2325*bbecb9d1SAndroid Build Coastguard Worker return -1;
2326*bbecb9d1SAndroid Build Coastguard Worker
2327*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaEndPicture(va_dpy, codec->va_ctx);
2328*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
2329*bbecb9d1SAndroid Build Coastguard Worker virgl_log("end picture failed, err = 0x%x\n", va_stat);
2330*bbecb9d1SAndroid Build Coastguard Worker return -1;
2331*bbecb9d1SAndroid Build Coastguard Worker }
2332*bbecb9d1SAndroid Build Coastguard Worker
2333*bbecb9d1SAndroid Build Coastguard Worker va_stat = vaSyncSurface(va_dpy, target->va_sfc);
2334*bbecb9d1SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != va_stat) {
2335*bbecb9d1SAndroid Build Coastguard Worker virgl_log("sync surface failed, err = 0x%x\n", va_stat);
2336*bbecb9d1SAndroid Build Coastguard Worker return -1;
2337*bbecb9d1SAndroid Build Coastguard Worker }
2338*bbecb9d1SAndroid Build Coastguard Worker
2339*bbecb9d1SAndroid Build Coastguard Worker if (codec->entrypoint != PIPE_VIDEO_ENTRYPOINT_ENCODE) {
2340*bbecb9d1SAndroid Build Coastguard Worker decode_completed(codec, target);
2341*bbecb9d1SAndroid Build Coastguard Worker } else {
2342*bbecb9d1SAndroid Build Coastguard Worker encode_completed(codec, target);
2343*bbecb9d1SAndroid Build Coastguard Worker }
2344*bbecb9d1SAndroid Build Coastguard Worker
2345*bbecb9d1SAndroid Build Coastguard Worker return 0;
2346*bbecb9d1SAndroid Build Coastguard Worker }
2347*bbecb9d1SAndroid Build Coastguard Worker
2348