1*61046927SAndroid Build Coastguard Worker /**************************************************************************
2*61046927SAndroid Build Coastguard Worker *
3*61046927SAndroid Build Coastguard Worker * Copyright 2010 Thomas Balling Sørensen.
4*61046927SAndroid Build Coastguard Worker * All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker *
6*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
7*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the
8*61046927SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including
9*61046927SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish,
10*61046927SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to
11*61046927SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to
12*61046927SAndroid Build Coastguard Worker * the following conditions:
13*61046927SAndroid Build Coastguard Worker *
14*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the
15*61046927SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions
16*61046927SAndroid Build Coastguard Worker * of the Software.
17*61046927SAndroid Build Coastguard Worker *
18*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20*61046927SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21*61046927SAndroid Build Coastguard Worker * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22*61046927SAndroid Build Coastguard Worker * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23*61046927SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24*61046927SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25*61046927SAndroid Build Coastguard Worker *
26*61046927SAndroid Build Coastguard Worker **************************************************************************/
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker #include "util/u_memory.h"
29*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
30*61046927SAndroid Build Coastguard Worker #include "util/u_debug.h"
31*61046927SAndroid Build Coastguard Worker #include "util/u_video.h"
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker #include "util/vl_vlc.h"
34*61046927SAndroid Build Coastguard Worker
35*61046927SAndroid Build Coastguard Worker #include "vl/vl_codec.h"
36*61046927SAndroid Build Coastguard Worker #include "vdpau_private.h"
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard Worker #define AV1_KEY_FRAME 0
39*61046927SAndroid Build Coastguard Worker #define AV1_REFS_PER_FRAME 7
40*61046927SAndroid Build Coastguard Worker #define AV1_NUM_REF_FRAMES 8
41*61046927SAndroid Build Coastguard Worker #define AV1_PRIMARY_REF_NONE AV1_REFS_PER_FRAME
42*61046927SAndroid Build Coastguard Worker #define AV1_SUPERRES_DENOM_MIN 9
43*61046927SAndroid Build Coastguard Worker #define AV1_SUPERRES_NUM 8
44*61046927SAndroid Build Coastguard Worker
45*61046927SAndroid Build Coastguard Worker /**
46*61046927SAndroid Build Coastguard Worker * Create a VdpDecoder.
47*61046927SAndroid Build Coastguard Worker */
48*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpDecoderCreate(VdpDevice device,VdpDecoderProfile profile,uint32_t width,uint32_t height,uint32_t max_references,VdpDecoder * decoder)49*61046927SAndroid Build Coastguard Worker vlVdpDecoderCreate(VdpDevice device,
50*61046927SAndroid Build Coastguard Worker VdpDecoderProfile profile,
51*61046927SAndroid Build Coastguard Worker uint32_t width, uint32_t height,
52*61046927SAndroid Build Coastguard Worker uint32_t max_references,
53*61046927SAndroid Build Coastguard Worker VdpDecoder *decoder)
54*61046927SAndroid Build Coastguard Worker {
55*61046927SAndroid Build Coastguard Worker struct pipe_video_codec templat = {};
56*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe;
57*61046927SAndroid Build Coastguard Worker struct pipe_screen *screen;
58*61046927SAndroid Build Coastguard Worker vlVdpDevice *dev;
59*61046927SAndroid Build Coastguard Worker vlVdpDecoder *vldecoder;
60*61046927SAndroid Build Coastguard Worker VdpStatus ret;
61*61046927SAndroid Build Coastguard Worker bool supported;
62*61046927SAndroid Build Coastguard Worker uint32_t maxwidth, maxheight;
63*61046927SAndroid Build Coastguard Worker
64*61046927SAndroid Build Coastguard Worker if (!decoder)
65*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
66*61046927SAndroid Build Coastguard Worker *decoder = 0;
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Worker if (!(width && height))
69*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_VALUE;
70*61046927SAndroid Build Coastguard Worker
71*61046927SAndroid Build Coastguard Worker templat.profile = ProfileToPipe(profile);
72*61046927SAndroid Build Coastguard Worker if (templat.profile == PIPE_VIDEO_PROFILE_UNKNOWN)
73*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_DECODER_PROFILE;
74*61046927SAndroid Build Coastguard Worker
75*61046927SAndroid Build Coastguard Worker dev = vlGetDataHTAB(device);
76*61046927SAndroid Build Coastguard Worker if (!dev)
77*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_HANDLE;
78*61046927SAndroid Build Coastguard Worker
79*61046927SAndroid Build Coastguard Worker pipe = dev->context;
80*61046927SAndroid Build Coastguard Worker screen = dev->vscreen->pscreen;
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker mtx_lock(&dev->mutex);
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker supported = vl_codec_supported(screen, templat.profile, false);
85*61046927SAndroid Build Coastguard Worker if (!supported) {
86*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
87*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_DECODER_PROFILE;
88*61046927SAndroid Build Coastguard Worker }
89*61046927SAndroid Build Coastguard Worker
90*61046927SAndroid Build Coastguard Worker maxwidth = screen->get_video_param
91*61046927SAndroid Build Coastguard Worker (
92*61046927SAndroid Build Coastguard Worker screen,
93*61046927SAndroid Build Coastguard Worker templat.profile,
94*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
95*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_MAX_WIDTH
96*61046927SAndroid Build Coastguard Worker );
97*61046927SAndroid Build Coastguard Worker maxheight = screen->get_video_param
98*61046927SAndroid Build Coastguard Worker (
99*61046927SAndroid Build Coastguard Worker screen,
100*61046927SAndroid Build Coastguard Worker templat.profile,
101*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
102*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_MAX_HEIGHT
103*61046927SAndroid Build Coastguard Worker );
104*61046927SAndroid Build Coastguard Worker if (width > maxwidth || height > maxheight) {
105*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
106*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_SIZE;
107*61046927SAndroid Build Coastguard Worker }
108*61046927SAndroid Build Coastguard Worker
109*61046927SAndroid Build Coastguard Worker vldecoder = CALLOC(1,sizeof(vlVdpDecoder));
110*61046927SAndroid Build Coastguard Worker if (!vldecoder) {
111*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
112*61046927SAndroid Build Coastguard Worker return VDP_STATUS_RESOURCES;
113*61046927SAndroid Build Coastguard Worker }
114*61046927SAndroid Build Coastguard Worker
115*61046927SAndroid Build Coastguard Worker DeviceReference(&vldecoder->device, dev);
116*61046927SAndroid Build Coastguard Worker
117*61046927SAndroid Build Coastguard Worker templat.entrypoint = PIPE_VIDEO_ENTRYPOINT_BITSTREAM;
118*61046927SAndroid Build Coastguard Worker templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420;
119*61046927SAndroid Build Coastguard Worker templat.width = width;
120*61046927SAndroid Build Coastguard Worker templat.height = height;
121*61046927SAndroid Build Coastguard Worker templat.max_references = max_references;
122*61046927SAndroid Build Coastguard Worker
123*61046927SAndroid Build Coastguard Worker if (u_reduce_video_profile(templat.profile) ==
124*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_FORMAT_MPEG4_AVC)
125*61046927SAndroid Build Coastguard Worker templat.level = u_get_h264_level(templat.width, templat.height,
126*61046927SAndroid Build Coastguard Worker &templat.max_references);
127*61046927SAndroid Build Coastguard Worker
128*61046927SAndroid Build Coastguard Worker vldecoder->decoder = pipe->create_video_codec(pipe, &templat);
129*61046927SAndroid Build Coastguard Worker
130*61046927SAndroid Build Coastguard Worker if (!vldecoder->decoder) {
131*61046927SAndroid Build Coastguard Worker ret = VDP_STATUS_ERROR;
132*61046927SAndroid Build Coastguard Worker goto error_decoder;
133*61046927SAndroid Build Coastguard Worker }
134*61046927SAndroid Build Coastguard Worker
135*61046927SAndroid Build Coastguard Worker *decoder = vlAddDataHTAB(vldecoder);
136*61046927SAndroid Build Coastguard Worker if (*decoder == 0) {
137*61046927SAndroid Build Coastguard Worker ret = VDP_STATUS_ERROR;
138*61046927SAndroid Build Coastguard Worker goto error_handle;
139*61046927SAndroid Build Coastguard Worker }
140*61046927SAndroid Build Coastguard Worker
141*61046927SAndroid Build Coastguard Worker (void) mtx_init(&vldecoder->mutex, mtx_plain);
142*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
143*61046927SAndroid Build Coastguard Worker
144*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
145*61046927SAndroid Build Coastguard Worker
146*61046927SAndroid Build Coastguard Worker error_handle:
147*61046927SAndroid Build Coastguard Worker vldecoder->decoder->destroy(vldecoder->decoder);
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard Worker error_decoder:
150*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
151*61046927SAndroid Build Coastguard Worker DeviceReference(&vldecoder->device, NULL);
152*61046927SAndroid Build Coastguard Worker FREE(vldecoder);
153*61046927SAndroid Build Coastguard Worker return ret;
154*61046927SAndroid Build Coastguard Worker }
155*61046927SAndroid Build Coastguard Worker
156*61046927SAndroid Build Coastguard Worker /**
157*61046927SAndroid Build Coastguard Worker * Destroy a VdpDecoder.
158*61046927SAndroid Build Coastguard Worker */
159*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpDecoderDestroy(VdpDecoder decoder)160*61046927SAndroid Build Coastguard Worker vlVdpDecoderDestroy(VdpDecoder decoder)
161*61046927SAndroid Build Coastguard Worker {
162*61046927SAndroid Build Coastguard Worker vlVdpDecoder *vldecoder;
163*61046927SAndroid Build Coastguard Worker
164*61046927SAndroid Build Coastguard Worker vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
165*61046927SAndroid Build Coastguard Worker if (!vldecoder)
166*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_HANDLE;
167*61046927SAndroid Build Coastguard Worker
168*61046927SAndroid Build Coastguard Worker mtx_lock(&vldecoder->mutex);
169*61046927SAndroid Build Coastguard Worker vldecoder->decoder->destroy(vldecoder->decoder);
170*61046927SAndroid Build Coastguard Worker mtx_unlock(&vldecoder->mutex);
171*61046927SAndroid Build Coastguard Worker mtx_destroy(&vldecoder->mutex);
172*61046927SAndroid Build Coastguard Worker
173*61046927SAndroid Build Coastguard Worker vlRemoveDataHTAB(decoder);
174*61046927SAndroid Build Coastguard Worker DeviceReference(&vldecoder->device, NULL);
175*61046927SAndroid Build Coastguard Worker FREE(vldecoder);
176*61046927SAndroid Build Coastguard Worker
177*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
178*61046927SAndroid Build Coastguard Worker }
179*61046927SAndroid Build Coastguard Worker
180*61046927SAndroid Build Coastguard Worker /**
181*61046927SAndroid Build Coastguard Worker * Retrieve the parameters used to create a VdpDecoder.
182*61046927SAndroid Build Coastguard Worker */
183*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpDecoderGetParameters(VdpDecoder decoder,VdpDecoderProfile * profile,uint32_t * width,uint32_t * height)184*61046927SAndroid Build Coastguard Worker vlVdpDecoderGetParameters(VdpDecoder decoder,
185*61046927SAndroid Build Coastguard Worker VdpDecoderProfile *profile,
186*61046927SAndroid Build Coastguard Worker uint32_t *width,
187*61046927SAndroid Build Coastguard Worker uint32_t *height)
188*61046927SAndroid Build Coastguard Worker {
189*61046927SAndroid Build Coastguard Worker vlVdpDecoder *vldecoder;
190*61046927SAndroid Build Coastguard Worker
191*61046927SAndroid Build Coastguard Worker vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
192*61046927SAndroid Build Coastguard Worker if (!vldecoder)
193*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_HANDLE;
194*61046927SAndroid Build Coastguard Worker
195*61046927SAndroid Build Coastguard Worker *profile = PipeToProfile(vldecoder->decoder->profile);
196*61046927SAndroid Build Coastguard Worker *width = vldecoder->decoder->width;
197*61046927SAndroid Build Coastguard Worker *height = vldecoder->decoder->height;
198*61046927SAndroid Build Coastguard Worker
199*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
200*61046927SAndroid Build Coastguard Worker }
201*61046927SAndroid Build Coastguard Worker
202*61046927SAndroid Build Coastguard Worker static VdpStatus
vlVdpGetReferenceFrame(VdpVideoSurface handle,struct pipe_video_buffer ** ref_frame)203*61046927SAndroid Build Coastguard Worker vlVdpGetReferenceFrame(VdpVideoSurface handle, struct pipe_video_buffer **ref_frame)
204*61046927SAndroid Build Coastguard Worker {
205*61046927SAndroid Build Coastguard Worker vlVdpSurface *surface;
206*61046927SAndroid Build Coastguard Worker
207*61046927SAndroid Build Coastguard Worker /* if surfaces equals VDP_STATUS_INVALID_HANDLE, they are not used */
208*61046927SAndroid Build Coastguard Worker if (handle == VDP_INVALID_HANDLE) {
209*61046927SAndroid Build Coastguard Worker *ref_frame = NULL;
210*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
211*61046927SAndroid Build Coastguard Worker }
212*61046927SAndroid Build Coastguard Worker
213*61046927SAndroid Build Coastguard Worker surface = vlGetDataHTAB(handle);
214*61046927SAndroid Build Coastguard Worker if (!surface)
215*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_HANDLE;
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker *ref_frame = surface->video_buffer;
218*61046927SAndroid Build Coastguard Worker if (!*ref_frame)
219*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_HANDLE;
220*61046927SAndroid Build Coastguard Worker
221*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
222*61046927SAndroid Build Coastguard Worker }
223*61046927SAndroid Build Coastguard Worker
224*61046927SAndroid Build Coastguard Worker /**
225*61046927SAndroid Build Coastguard Worker * Decode a mpeg 1/2 video.
226*61046927SAndroid Build Coastguard Worker */
227*61046927SAndroid Build Coastguard Worker static VdpStatus
vlVdpDecoderRenderMpeg12(struct pipe_mpeg12_picture_desc * picture,const VdpPictureInfoMPEG1Or2 * picture_info)228*61046927SAndroid Build Coastguard Worker vlVdpDecoderRenderMpeg12(struct pipe_mpeg12_picture_desc *picture,
229*61046927SAndroid Build Coastguard Worker const VdpPictureInfoMPEG1Or2 *picture_info)
230*61046927SAndroid Build Coastguard Worker {
231*61046927SAndroid Build Coastguard Worker VdpStatus r;
232*61046927SAndroid Build Coastguard Worker
233*61046927SAndroid Build Coastguard Worker VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG12\n");
234*61046927SAndroid Build Coastguard Worker
235*61046927SAndroid Build Coastguard Worker r = vlVdpGetReferenceFrame(picture_info->forward_reference, &picture->ref[0]);
236*61046927SAndroid Build Coastguard Worker if (r != VDP_STATUS_OK)
237*61046927SAndroid Build Coastguard Worker return r;
238*61046927SAndroid Build Coastguard Worker
239*61046927SAndroid Build Coastguard Worker r = vlVdpGetReferenceFrame(picture_info->backward_reference, &picture->ref[1]);
240*61046927SAndroid Build Coastguard Worker if (r != VDP_STATUS_OK)
241*61046927SAndroid Build Coastguard Worker return r;
242*61046927SAndroid Build Coastguard Worker
243*61046927SAndroid Build Coastguard Worker picture->picture_coding_type = picture_info->picture_coding_type;
244*61046927SAndroid Build Coastguard Worker picture->picture_structure = picture_info->picture_structure;
245*61046927SAndroid Build Coastguard Worker picture->frame_pred_frame_dct = picture_info->frame_pred_frame_dct;
246*61046927SAndroid Build Coastguard Worker picture->q_scale_type = picture_info->q_scale_type;
247*61046927SAndroid Build Coastguard Worker picture->alternate_scan = picture_info->alternate_scan;
248*61046927SAndroid Build Coastguard Worker picture->intra_vlc_format = picture_info->intra_vlc_format;
249*61046927SAndroid Build Coastguard Worker picture->concealment_motion_vectors = picture_info->concealment_motion_vectors;
250*61046927SAndroid Build Coastguard Worker picture->intra_dc_precision = picture_info->intra_dc_precision;
251*61046927SAndroid Build Coastguard Worker picture->f_code[0][0] = picture_info->f_code[0][0] - 1;
252*61046927SAndroid Build Coastguard Worker picture->f_code[0][1] = picture_info->f_code[0][1] - 1;
253*61046927SAndroid Build Coastguard Worker picture->f_code[1][0] = picture_info->f_code[1][0] - 1;
254*61046927SAndroid Build Coastguard Worker picture->f_code[1][1] = picture_info->f_code[1][1] - 1;
255*61046927SAndroid Build Coastguard Worker picture->num_slices = picture_info->slice_count;
256*61046927SAndroid Build Coastguard Worker picture->top_field_first = picture_info->top_field_first;
257*61046927SAndroid Build Coastguard Worker picture->full_pel_forward_vector = picture_info->full_pel_forward_vector;
258*61046927SAndroid Build Coastguard Worker picture->full_pel_backward_vector = picture_info->full_pel_backward_vector;
259*61046927SAndroid Build Coastguard Worker picture->intra_matrix = picture_info->intra_quantizer_matrix;
260*61046927SAndroid Build Coastguard Worker picture->non_intra_matrix = picture_info->non_intra_quantizer_matrix;
261*61046927SAndroid Build Coastguard Worker
262*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
263*61046927SAndroid Build Coastguard Worker }
264*61046927SAndroid Build Coastguard Worker
265*61046927SAndroid Build Coastguard Worker /**
266*61046927SAndroid Build Coastguard Worker * Decode a mpeg 4 video.
267*61046927SAndroid Build Coastguard Worker */
268*61046927SAndroid Build Coastguard Worker static VdpStatus
vlVdpDecoderRenderMpeg4(struct pipe_mpeg4_picture_desc * picture,const VdpPictureInfoMPEG4Part2 * picture_info)269*61046927SAndroid Build Coastguard Worker vlVdpDecoderRenderMpeg4(struct pipe_mpeg4_picture_desc *picture,
270*61046927SAndroid Build Coastguard Worker const VdpPictureInfoMPEG4Part2 *picture_info)
271*61046927SAndroid Build Coastguard Worker {
272*61046927SAndroid Build Coastguard Worker VdpStatus r;
273*61046927SAndroid Build Coastguard Worker unsigned i;
274*61046927SAndroid Build Coastguard Worker
275*61046927SAndroid Build Coastguard Worker VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding MPEG4\n");
276*61046927SAndroid Build Coastguard Worker
277*61046927SAndroid Build Coastguard Worker r = vlVdpGetReferenceFrame(picture_info->forward_reference, &picture->ref[0]);
278*61046927SAndroid Build Coastguard Worker if (r != VDP_STATUS_OK)
279*61046927SAndroid Build Coastguard Worker return r;
280*61046927SAndroid Build Coastguard Worker
281*61046927SAndroid Build Coastguard Worker r = vlVdpGetReferenceFrame(picture_info->backward_reference, &picture->ref[1]);
282*61046927SAndroid Build Coastguard Worker if (r != VDP_STATUS_OK)
283*61046927SAndroid Build Coastguard Worker return r;
284*61046927SAndroid Build Coastguard Worker
285*61046927SAndroid Build Coastguard Worker for (i = 0; i < 2; ++i) {
286*61046927SAndroid Build Coastguard Worker picture->trd[i] = picture_info->trd[i];
287*61046927SAndroid Build Coastguard Worker picture->trb[i] = picture_info->trb[i];
288*61046927SAndroid Build Coastguard Worker }
289*61046927SAndroid Build Coastguard Worker picture->vop_time_increment_resolution = picture_info->vop_time_increment_resolution;
290*61046927SAndroid Build Coastguard Worker picture->vop_coding_type = picture_info->vop_coding_type;
291*61046927SAndroid Build Coastguard Worker picture->vop_fcode_forward = picture_info->vop_fcode_forward;
292*61046927SAndroid Build Coastguard Worker picture->vop_fcode_backward = picture_info->vop_fcode_backward;
293*61046927SAndroid Build Coastguard Worker picture->resync_marker_disable = picture_info->resync_marker_disable;
294*61046927SAndroid Build Coastguard Worker picture->interlaced = picture_info->interlaced;
295*61046927SAndroid Build Coastguard Worker picture->quant_type = picture_info->quant_type;
296*61046927SAndroid Build Coastguard Worker picture->quarter_sample = picture_info->quarter_sample;
297*61046927SAndroid Build Coastguard Worker picture->short_video_header = picture_info->short_video_header;
298*61046927SAndroid Build Coastguard Worker picture->rounding_control = picture_info->rounding_control;
299*61046927SAndroid Build Coastguard Worker picture->alternate_vertical_scan_flag = picture_info->alternate_vertical_scan_flag;
300*61046927SAndroid Build Coastguard Worker picture->top_field_first = picture_info->top_field_first;
301*61046927SAndroid Build Coastguard Worker picture->intra_matrix = picture_info->intra_quantizer_matrix;
302*61046927SAndroid Build Coastguard Worker picture->non_intra_matrix = picture_info->non_intra_quantizer_matrix;
303*61046927SAndroid Build Coastguard Worker
304*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
305*61046927SAndroid Build Coastguard Worker }
306*61046927SAndroid Build Coastguard Worker
307*61046927SAndroid Build Coastguard Worker static VdpStatus
vlVdpDecoderRenderVC1(struct pipe_vc1_picture_desc * picture,const VdpPictureInfoVC1 * picture_info)308*61046927SAndroid Build Coastguard Worker vlVdpDecoderRenderVC1(struct pipe_vc1_picture_desc *picture,
309*61046927SAndroid Build Coastguard Worker const VdpPictureInfoVC1 *picture_info)
310*61046927SAndroid Build Coastguard Worker {
311*61046927SAndroid Build Coastguard Worker VdpStatus r;
312*61046927SAndroid Build Coastguard Worker
313*61046927SAndroid Build Coastguard Worker VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding VC-1\n");
314*61046927SAndroid Build Coastguard Worker
315*61046927SAndroid Build Coastguard Worker r = vlVdpGetReferenceFrame(picture_info->forward_reference, &picture->ref[0]);
316*61046927SAndroid Build Coastguard Worker if (r != VDP_STATUS_OK)
317*61046927SAndroid Build Coastguard Worker return r;
318*61046927SAndroid Build Coastguard Worker
319*61046927SAndroid Build Coastguard Worker r = vlVdpGetReferenceFrame(picture_info->backward_reference, &picture->ref[1]);
320*61046927SAndroid Build Coastguard Worker if (r != VDP_STATUS_OK)
321*61046927SAndroid Build Coastguard Worker return r;
322*61046927SAndroid Build Coastguard Worker
323*61046927SAndroid Build Coastguard Worker picture->slice_count = picture_info->slice_count;
324*61046927SAndroid Build Coastguard Worker picture->picture_type = picture_info->picture_type;
325*61046927SAndroid Build Coastguard Worker picture->frame_coding_mode = picture_info->frame_coding_mode;
326*61046927SAndroid Build Coastguard Worker picture->postprocflag = picture_info->postprocflag;
327*61046927SAndroid Build Coastguard Worker picture->pulldown = picture_info->pulldown;
328*61046927SAndroid Build Coastguard Worker picture->interlace = picture_info->interlace;
329*61046927SAndroid Build Coastguard Worker picture->tfcntrflag = picture_info->tfcntrflag;
330*61046927SAndroid Build Coastguard Worker picture->finterpflag = picture_info->finterpflag;
331*61046927SAndroid Build Coastguard Worker picture->psf = picture_info->psf;
332*61046927SAndroid Build Coastguard Worker picture->dquant = picture_info->dquant;
333*61046927SAndroid Build Coastguard Worker picture->panscan_flag = picture_info->panscan_flag;
334*61046927SAndroid Build Coastguard Worker picture->refdist_flag = picture_info->refdist_flag;
335*61046927SAndroid Build Coastguard Worker picture->quantizer = picture_info->quantizer;
336*61046927SAndroid Build Coastguard Worker picture->extended_mv = picture_info->extended_mv;
337*61046927SAndroid Build Coastguard Worker picture->extended_dmv = picture_info->extended_dmv;
338*61046927SAndroid Build Coastguard Worker picture->overlap = picture_info->overlap;
339*61046927SAndroid Build Coastguard Worker picture->vstransform = picture_info->vstransform;
340*61046927SAndroid Build Coastguard Worker picture->loopfilter = picture_info->loopfilter;
341*61046927SAndroid Build Coastguard Worker picture->fastuvmc = picture_info->fastuvmc;
342*61046927SAndroid Build Coastguard Worker picture->range_mapy_flag = picture_info->range_mapy_flag;
343*61046927SAndroid Build Coastguard Worker picture->range_mapy = picture_info->range_mapy;
344*61046927SAndroid Build Coastguard Worker picture->range_mapuv_flag = picture_info->range_mapuv_flag;
345*61046927SAndroid Build Coastguard Worker picture->range_mapuv = picture_info->range_mapuv;
346*61046927SAndroid Build Coastguard Worker picture->multires = picture_info->multires;
347*61046927SAndroid Build Coastguard Worker picture->syncmarker = picture_info->syncmarker;
348*61046927SAndroid Build Coastguard Worker picture->rangered = picture_info->rangered;
349*61046927SAndroid Build Coastguard Worker picture->maxbframes = picture_info->maxbframes;
350*61046927SAndroid Build Coastguard Worker picture->deblockEnable = picture_info->deblockEnable;
351*61046927SAndroid Build Coastguard Worker picture->pquant = picture_info->pquant;
352*61046927SAndroid Build Coastguard Worker
353*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
354*61046927SAndroid Build Coastguard Worker }
355*61046927SAndroid Build Coastguard Worker
356*61046927SAndroid Build Coastguard Worker static VdpStatus
vlVdpDecoderRenderH264(struct pipe_h264_picture_desc * picture,const VdpPictureInfoH264 * picture_info,unsigned level_idc)357*61046927SAndroid Build Coastguard Worker vlVdpDecoderRenderH264(struct pipe_h264_picture_desc *picture,
358*61046927SAndroid Build Coastguard Worker const VdpPictureInfoH264 *picture_info,
359*61046927SAndroid Build Coastguard Worker unsigned level_idc)
360*61046927SAndroid Build Coastguard Worker {
361*61046927SAndroid Build Coastguard Worker unsigned i;
362*61046927SAndroid Build Coastguard Worker
363*61046927SAndroid Build Coastguard Worker VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Decoding H264\n");
364*61046927SAndroid Build Coastguard Worker
365*61046927SAndroid Build Coastguard Worker picture->pps->sps->mb_adaptive_frame_field_flag = picture_info->mb_adaptive_frame_field_flag;
366*61046927SAndroid Build Coastguard Worker picture->pps->sps->frame_mbs_only_flag = picture_info->frame_mbs_only_flag;
367*61046927SAndroid Build Coastguard Worker picture->pps->sps->log2_max_frame_num_minus4 = picture_info->log2_max_frame_num_minus4;
368*61046927SAndroid Build Coastguard Worker picture->pps->sps->pic_order_cnt_type = picture_info->pic_order_cnt_type;
369*61046927SAndroid Build Coastguard Worker picture->pps->sps->log2_max_pic_order_cnt_lsb_minus4 = picture_info->log2_max_pic_order_cnt_lsb_minus4;
370*61046927SAndroid Build Coastguard Worker picture->pps->sps->delta_pic_order_always_zero_flag = picture_info->delta_pic_order_always_zero_flag;
371*61046927SAndroid Build Coastguard Worker picture->pps->sps->direct_8x8_inference_flag = picture_info->direct_8x8_inference_flag;
372*61046927SAndroid Build Coastguard Worker picture->pps->sps->level_idc = level_idc;
373*61046927SAndroid Build Coastguard Worker picture->pps->sps->MinLumaBiPredSize8x8 = (level_idc >= 31); /* See section A.3.3.2 of H264 spec */;
374*61046927SAndroid Build Coastguard Worker
375*61046927SAndroid Build Coastguard Worker picture->pps->transform_8x8_mode_flag = picture_info->transform_8x8_mode_flag;
376*61046927SAndroid Build Coastguard Worker picture->pps->chroma_qp_index_offset = picture_info->chroma_qp_index_offset;
377*61046927SAndroid Build Coastguard Worker picture->pps->second_chroma_qp_index_offset = picture_info->second_chroma_qp_index_offset;
378*61046927SAndroid Build Coastguard Worker picture->pps->pic_init_qp_minus26 = picture_info->pic_init_qp_minus26;
379*61046927SAndroid Build Coastguard Worker /*picture->pps-> pic_init_qs_minus26 not passed in VdpPictureInfoH264*/
380*61046927SAndroid Build Coastguard Worker picture->pps->entropy_coding_mode_flag = picture_info->entropy_coding_mode_flag;
381*61046927SAndroid Build Coastguard Worker picture->pps->deblocking_filter_control_present_flag = picture_info->deblocking_filter_control_present_flag;
382*61046927SAndroid Build Coastguard Worker picture->pps->redundant_pic_cnt_present_flag = picture_info->redundant_pic_cnt_present_flag;
383*61046927SAndroid Build Coastguard Worker picture->pps->constrained_intra_pred_flag = picture_info->constrained_intra_pred_flag;
384*61046927SAndroid Build Coastguard Worker picture->pps->weighted_pred_flag = picture_info->weighted_pred_flag;
385*61046927SAndroid Build Coastguard Worker picture->pps->weighted_bipred_idc = picture_info->weighted_bipred_idc;
386*61046927SAndroid Build Coastguard Worker picture->pps->bottom_field_pic_order_in_frame_present_flag = picture_info->pic_order_present_flag;
387*61046927SAndroid Build Coastguard Worker memcpy(picture->pps->ScalingList4x4, picture_info->scaling_lists_4x4, 6*16);
388*61046927SAndroid Build Coastguard Worker memcpy(picture->pps->ScalingList8x8, picture_info->scaling_lists_8x8, 2*64);
389*61046927SAndroid Build Coastguard Worker
390*61046927SAndroid Build Coastguard Worker picture->slice_count = picture_info->slice_count;
391*61046927SAndroid Build Coastguard Worker picture->field_order_cnt[0] = picture_info->field_order_cnt[0];
392*61046927SAndroid Build Coastguard Worker picture->field_order_cnt[1] = picture_info->field_order_cnt[1];
393*61046927SAndroid Build Coastguard Worker picture->is_reference = picture_info->is_reference;
394*61046927SAndroid Build Coastguard Worker picture->frame_num = picture_info->frame_num;
395*61046927SAndroid Build Coastguard Worker picture->field_pic_flag = picture_info->field_pic_flag;
396*61046927SAndroid Build Coastguard Worker picture->bottom_field_flag = picture_info->bottom_field_flag;
397*61046927SAndroid Build Coastguard Worker picture->num_ref_frames = picture_info->num_ref_frames;
398*61046927SAndroid Build Coastguard Worker
399*61046927SAndroid Build Coastguard Worker picture->num_ref_idx_l0_active_minus1 = picture_info->num_ref_idx_l0_active_minus1;
400*61046927SAndroid Build Coastguard Worker picture->num_ref_idx_l1_active_minus1 = picture_info->num_ref_idx_l1_active_minus1;
401*61046927SAndroid Build Coastguard Worker
402*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; ++i) {
403*61046927SAndroid Build Coastguard Worker VdpStatus ret = vlVdpGetReferenceFrame
404*61046927SAndroid Build Coastguard Worker (
405*61046927SAndroid Build Coastguard Worker picture_info->referenceFrames[i].surface,
406*61046927SAndroid Build Coastguard Worker &picture->ref[i]
407*61046927SAndroid Build Coastguard Worker );
408*61046927SAndroid Build Coastguard Worker if (ret != VDP_STATUS_OK)
409*61046927SAndroid Build Coastguard Worker return ret;
410*61046927SAndroid Build Coastguard Worker
411*61046927SAndroid Build Coastguard Worker picture->is_long_term[i] = picture_info->referenceFrames[i].is_long_term;
412*61046927SAndroid Build Coastguard Worker picture->top_is_reference[i] = picture_info->referenceFrames[i].top_is_reference;
413*61046927SAndroid Build Coastguard Worker picture->bottom_is_reference[i] = picture_info->referenceFrames[i].bottom_is_reference;
414*61046927SAndroid Build Coastguard Worker picture->field_order_cnt_list[i][0] = picture_info->referenceFrames[i].field_order_cnt[0];
415*61046927SAndroid Build Coastguard Worker picture->field_order_cnt_list[i][1] = picture_info->referenceFrames[i].field_order_cnt[1];
416*61046927SAndroid Build Coastguard Worker picture->frame_num_list[i] = picture_info->referenceFrames[i].frame_idx;
417*61046927SAndroid Build Coastguard Worker }
418*61046927SAndroid Build Coastguard Worker
419*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
420*61046927SAndroid Build Coastguard Worker }
421*61046927SAndroid Build Coastguard Worker
422*61046927SAndroid Build Coastguard Worker static VdpStatus
vlVdpDecoderRenderH265(struct pipe_h265_picture_desc * picture,const VdpPictureInfoHEVC * picture_info)423*61046927SAndroid Build Coastguard Worker vlVdpDecoderRenderH265(struct pipe_h265_picture_desc *picture,
424*61046927SAndroid Build Coastguard Worker const VdpPictureInfoHEVC *picture_info)
425*61046927SAndroid Build Coastguard Worker {
426*61046927SAndroid Build Coastguard Worker unsigned i;
427*61046927SAndroid Build Coastguard Worker
428*61046927SAndroid Build Coastguard Worker picture->pps->sps->chroma_format_idc = picture_info->chroma_format_idc;
429*61046927SAndroid Build Coastguard Worker picture->pps->sps->separate_colour_plane_flag = picture_info->separate_colour_plane_flag;
430*61046927SAndroid Build Coastguard Worker picture->pps->sps->pic_width_in_luma_samples = picture_info->pic_width_in_luma_samples;
431*61046927SAndroid Build Coastguard Worker picture->pps->sps->pic_height_in_luma_samples = picture_info->pic_height_in_luma_samples;
432*61046927SAndroid Build Coastguard Worker picture->pps->sps->bit_depth_luma_minus8 = picture_info->bit_depth_luma_minus8;
433*61046927SAndroid Build Coastguard Worker picture->pps->sps->bit_depth_chroma_minus8 = picture_info->bit_depth_chroma_minus8;
434*61046927SAndroid Build Coastguard Worker picture->pps->sps->log2_max_pic_order_cnt_lsb_minus4 = picture_info->log2_max_pic_order_cnt_lsb_minus4;
435*61046927SAndroid Build Coastguard Worker picture->pps->sps->sps_max_dec_pic_buffering_minus1 = picture_info->sps_max_dec_pic_buffering_minus1;
436*61046927SAndroid Build Coastguard Worker picture->pps->sps->log2_min_luma_coding_block_size_minus3 = picture_info->log2_min_luma_coding_block_size_minus3;
437*61046927SAndroid Build Coastguard Worker picture->pps->sps->log2_diff_max_min_luma_coding_block_size = picture_info->log2_diff_max_min_luma_coding_block_size;
438*61046927SAndroid Build Coastguard Worker picture->pps->sps->log2_min_transform_block_size_minus2 = picture_info->log2_min_transform_block_size_minus2;
439*61046927SAndroid Build Coastguard Worker picture->pps->sps->log2_diff_max_min_transform_block_size = picture_info->log2_diff_max_min_transform_block_size;
440*61046927SAndroid Build Coastguard Worker picture->pps->sps->max_transform_hierarchy_depth_inter = picture_info->max_transform_hierarchy_depth_inter;
441*61046927SAndroid Build Coastguard Worker picture->pps->sps->max_transform_hierarchy_depth_intra = picture_info->max_transform_hierarchy_depth_intra;
442*61046927SAndroid Build Coastguard Worker picture->pps->sps->scaling_list_enabled_flag = picture_info->scaling_list_enabled_flag;
443*61046927SAndroid Build Coastguard Worker memcpy(picture->pps->sps->ScalingList4x4, picture_info->ScalingList4x4, 6*16);
444*61046927SAndroid Build Coastguard Worker memcpy(picture->pps->sps->ScalingList8x8, picture_info->ScalingList8x8, 6*64);
445*61046927SAndroid Build Coastguard Worker memcpy(picture->pps->sps->ScalingList16x16, picture_info->ScalingList16x16, 6*64);
446*61046927SAndroid Build Coastguard Worker memcpy(picture->pps->sps->ScalingList32x32, picture_info->ScalingList32x32, 2*64);
447*61046927SAndroid Build Coastguard Worker memcpy(picture->pps->sps->ScalingListDCCoeff16x16, picture_info->ScalingListDCCoeff16x16, 6);
448*61046927SAndroid Build Coastguard Worker memcpy(picture->pps->sps->ScalingListDCCoeff32x32, picture_info->ScalingListDCCoeff32x32, 2);
449*61046927SAndroid Build Coastguard Worker picture->pps->sps->amp_enabled_flag = picture_info->amp_enabled_flag;
450*61046927SAndroid Build Coastguard Worker picture->pps->sps->sample_adaptive_offset_enabled_flag = picture_info->sample_adaptive_offset_enabled_flag;
451*61046927SAndroid Build Coastguard Worker picture->pps->sps->pcm_enabled_flag = picture_info->pcm_enabled_flag;
452*61046927SAndroid Build Coastguard Worker picture->pps->sps->pcm_sample_bit_depth_luma_minus1 = picture_info->pcm_sample_bit_depth_luma_minus1;
453*61046927SAndroid Build Coastguard Worker picture->pps->sps->pcm_sample_bit_depth_chroma_minus1 = picture_info->pcm_sample_bit_depth_chroma_minus1;
454*61046927SAndroid Build Coastguard Worker picture->pps->sps->log2_min_pcm_luma_coding_block_size_minus3 = picture_info->log2_min_pcm_luma_coding_block_size_minus3;
455*61046927SAndroid Build Coastguard Worker picture->pps->sps->log2_diff_max_min_pcm_luma_coding_block_size = picture_info->log2_diff_max_min_pcm_luma_coding_block_size;
456*61046927SAndroid Build Coastguard Worker picture->pps->sps->pcm_loop_filter_disabled_flag = picture_info->pcm_loop_filter_disabled_flag;
457*61046927SAndroid Build Coastguard Worker picture->pps->sps->num_short_term_ref_pic_sets = picture_info->num_short_term_ref_pic_sets;
458*61046927SAndroid Build Coastguard Worker picture->pps->sps->long_term_ref_pics_present_flag = picture_info->long_term_ref_pics_present_flag;
459*61046927SAndroid Build Coastguard Worker picture->pps->sps->num_long_term_ref_pics_sps = picture_info->num_long_term_ref_pics_sps;
460*61046927SAndroid Build Coastguard Worker picture->pps->sps->sps_temporal_mvp_enabled_flag = picture_info->sps_temporal_mvp_enabled_flag;
461*61046927SAndroid Build Coastguard Worker picture->pps->sps->strong_intra_smoothing_enabled_flag = picture_info->strong_intra_smoothing_enabled_flag;
462*61046927SAndroid Build Coastguard Worker
463*61046927SAndroid Build Coastguard Worker picture->pps->dependent_slice_segments_enabled_flag = picture_info->dependent_slice_segments_enabled_flag;
464*61046927SAndroid Build Coastguard Worker picture->pps->output_flag_present_flag = picture_info->output_flag_present_flag;
465*61046927SAndroid Build Coastguard Worker picture->pps->num_extra_slice_header_bits = picture_info->num_extra_slice_header_bits;
466*61046927SAndroid Build Coastguard Worker picture->pps->sign_data_hiding_enabled_flag = picture_info->sign_data_hiding_enabled_flag;
467*61046927SAndroid Build Coastguard Worker picture->pps->cabac_init_present_flag = picture_info->cabac_init_present_flag;
468*61046927SAndroid Build Coastguard Worker picture->pps->num_ref_idx_l0_default_active_minus1 = picture_info->num_ref_idx_l0_default_active_minus1;
469*61046927SAndroid Build Coastguard Worker picture->pps->num_ref_idx_l1_default_active_minus1 = picture_info->num_ref_idx_l1_default_active_minus1;
470*61046927SAndroid Build Coastguard Worker picture->pps->init_qp_minus26 = picture_info->init_qp_minus26;
471*61046927SAndroid Build Coastguard Worker picture->pps->constrained_intra_pred_flag = picture_info->constrained_intra_pred_flag;
472*61046927SAndroid Build Coastguard Worker picture->pps->transform_skip_enabled_flag = picture_info->transform_skip_enabled_flag;
473*61046927SAndroid Build Coastguard Worker picture->pps->cu_qp_delta_enabled_flag = picture_info->cu_qp_delta_enabled_flag;
474*61046927SAndroid Build Coastguard Worker picture->pps->diff_cu_qp_delta_depth = picture_info->diff_cu_qp_delta_depth;
475*61046927SAndroid Build Coastguard Worker picture->pps->pps_cb_qp_offset = picture_info->pps_cb_qp_offset;
476*61046927SAndroid Build Coastguard Worker picture->pps->pps_cr_qp_offset = picture_info->pps_cr_qp_offset;
477*61046927SAndroid Build Coastguard Worker picture->pps->pps_slice_chroma_qp_offsets_present_flag = picture_info->pps_slice_chroma_qp_offsets_present_flag;
478*61046927SAndroid Build Coastguard Worker picture->pps->weighted_pred_flag = picture_info->weighted_pred_flag;
479*61046927SAndroid Build Coastguard Worker picture->pps->weighted_bipred_flag = picture_info->weighted_bipred_flag;
480*61046927SAndroid Build Coastguard Worker picture->pps->transquant_bypass_enabled_flag = picture_info->transquant_bypass_enabled_flag;
481*61046927SAndroid Build Coastguard Worker picture->pps->tiles_enabled_flag = picture_info->tiles_enabled_flag;
482*61046927SAndroid Build Coastguard Worker picture->pps->entropy_coding_sync_enabled_flag = picture_info->entropy_coding_sync_enabled_flag;
483*61046927SAndroid Build Coastguard Worker picture->pps->num_tile_columns_minus1 = picture_info->num_tile_columns_minus1;
484*61046927SAndroid Build Coastguard Worker picture->pps->num_tile_rows_minus1 = picture_info->num_tile_rows_minus1;
485*61046927SAndroid Build Coastguard Worker picture->pps->uniform_spacing_flag = picture_info->uniform_spacing_flag;
486*61046927SAndroid Build Coastguard Worker memcpy(picture->pps->column_width_minus1, picture_info->column_width_minus1, 20 * 2);
487*61046927SAndroid Build Coastguard Worker memcpy(picture->pps->row_height_minus1, picture_info->row_height_minus1, 22 * 2);
488*61046927SAndroid Build Coastguard Worker picture->pps->loop_filter_across_tiles_enabled_flag = picture_info->loop_filter_across_tiles_enabled_flag;
489*61046927SAndroid Build Coastguard Worker picture->pps->pps_loop_filter_across_slices_enabled_flag = picture_info->pps_loop_filter_across_slices_enabled_flag;
490*61046927SAndroid Build Coastguard Worker picture->pps->deblocking_filter_control_present_flag = picture_info->deblocking_filter_control_present_flag;
491*61046927SAndroid Build Coastguard Worker picture->pps->deblocking_filter_override_enabled_flag = picture_info->deblocking_filter_override_enabled_flag;
492*61046927SAndroid Build Coastguard Worker picture->pps->pps_deblocking_filter_disabled_flag = picture_info->pps_deblocking_filter_disabled_flag;
493*61046927SAndroid Build Coastguard Worker picture->pps->pps_beta_offset_div2 = picture_info->pps_beta_offset_div2;
494*61046927SAndroid Build Coastguard Worker picture->pps->pps_tc_offset_div2 = picture_info->pps_tc_offset_div2;
495*61046927SAndroid Build Coastguard Worker picture->pps->lists_modification_present_flag = picture_info->lists_modification_present_flag;
496*61046927SAndroid Build Coastguard Worker picture->pps->log2_parallel_merge_level_minus2 = picture_info->log2_parallel_merge_level_minus2;
497*61046927SAndroid Build Coastguard Worker picture->pps->slice_segment_header_extension_present_flag = picture_info->slice_segment_header_extension_present_flag;
498*61046927SAndroid Build Coastguard Worker
499*61046927SAndroid Build Coastguard Worker picture->IDRPicFlag = picture_info->IDRPicFlag;
500*61046927SAndroid Build Coastguard Worker picture->RAPPicFlag = picture_info->RAPPicFlag;
501*61046927SAndroid Build Coastguard Worker picture->IntraPicFlag = picture_info->RAPPicFlag;
502*61046927SAndroid Build Coastguard Worker picture->CurrRpsIdx = picture_info->CurrRpsIdx;
503*61046927SAndroid Build Coastguard Worker picture->NumPocTotalCurr = picture_info->NumPocTotalCurr;
504*61046927SAndroid Build Coastguard Worker picture->NumDeltaPocsOfRefRpsIdx = picture_info->NumDeltaPocsOfRefRpsIdx;
505*61046927SAndroid Build Coastguard Worker picture->NumShortTermPictureSliceHeaderBits = picture_info->NumShortTermPictureSliceHeaderBits;
506*61046927SAndroid Build Coastguard Worker picture->NumLongTermPictureSliceHeaderBits = picture_info->NumLongTermPictureSliceHeaderBits;
507*61046927SAndroid Build Coastguard Worker picture->CurrPicOrderCntVal = picture_info->CurrPicOrderCntVal;
508*61046927SAndroid Build Coastguard Worker
509*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; ++i) {
510*61046927SAndroid Build Coastguard Worker VdpStatus ret = vlVdpGetReferenceFrame
511*61046927SAndroid Build Coastguard Worker (
512*61046927SAndroid Build Coastguard Worker picture_info->RefPics[i],
513*61046927SAndroid Build Coastguard Worker &picture->ref[i]
514*61046927SAndroid Build Coastguard Worker );
515*61046927SAndroid Build Coastguard Worker if (ret != VDP_STATUS_OK)
516*61046927SAndroid Build Coastguard Worker return ret;
517*61046927SAndroid Build Coastguard Worker
518*61046927SAndroid Build Coastguard Worker picture->PicOrderCntVal[i] = picture_info->PicOrderCntVal[i];
519*61046927SAndroid Build Coastguard Worker picture->IsLongTerm[i] = picture_info->IsLongTerm[i];
520*61046927SAndroid Build Coastguard Worker }
521*61046927SAndroid Build Coastguard Worker
522*61046927SAndroid Build Coastguard Worker picture->NumPocStCurrBefore = picture_info->NumPocStCurrBefore;
523*61046927SAndroid Build Coastguard Worker picture->NumPocStCurrAfter = picture_info->NumPocStCurrAfter;
524*61046927SAndroid Build Coastguard Worker picture->NumPocLtCurr = picture_info->NumPocLtCurr;
525*61046927SAndroid Build Coastguard Worker memcpy(picture->RefPicSetStCurrBefore, picture_info->RefPicSetStCurrBefore, 8);
526*61046927SAndroid Build Coastguard Worker memcpy(picture->RefPicSetStCurrAfter, picture_info->RefPicSetStCurrAfter, 8);
527*61046927SAndroid Build Coastguard Worker memcpy(picture->RefPicSetLtCurr, picture_info->RefPicSetLtCurr, 8);
528*61046927SAndroid Build Coastguard Worker picture->UseRefPicList = false;
529*61046927SAndroid Build Coastguard Worker picture->UseStRpsBits = false;
530*61046927SAndroid Build Coastguard Worker
531*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
532*61046927SAndroid Build Coastguard Worker }
533*61046927SAndroid Build Coastguard Worker
534*61046927SAndroid Build Coastguard Worker static void
copyArrayInt8FromShort(int8_t * dest,const short * src,unsigned count)535*61046927SAndroid Build Coastguard Worker copyArrayInt8FromShort(int8_t *dest, const short *src, unsigned count) {
536*61046927SAndroid Build Coastguard Worker unsigned i;
537*61046927SAndroid Build Coastguard Worker
538*61046927SAndroid Build Coastguard Worker for (i = 0; i < count; ++i) {
539*61046927SAndroid Build Coastguard Worker *dest = *src;
540*61046927SAndroid Build Coastguard Worker ++dest;
541*61046927SAndroid Build Coastguard Worker ++src;
542*61046927SAndroid Build Coastguard Worker }
543*61046927SAndroid Build Coastguard Worker }
544*61046927SAndroid Build Coastguard Worker
545*61046927SAndroid Build Coastguard Worker static void
copyAV1ScalingPoints(uint8_t * value,uint8_t * scaling,const unsigned char point[][2],unsigned count)546*61046927SAndroid Build Coastguard Worker copyAV1ScalingPoints(uint8_t *value, uint8_t *scaling, const unsigned char point[][2], unsigned count) {
547*61046927SAndroid Build Coastguard Worker unsigned i;
548*61046927SAndroid Build Coastguard Worker
549*61046927SAndroid Build Coastguard Worker for (i = 0; i < count; ++i) {
550*61046927SAndroid Build Coastguard Worker *value = (*point)[0];
551*61046927SAndroid Build Coastguard Worker ++value;
552*61046927SAndroid Build Coastguard Worker *scaling = (*point)[1];
553*61046927SAndroid Build Coastguard Worker ++scaling;
554*61046927SAndroid Build Coastguard Worker ++point;
555*61046927SAndroid Build Coastguard Worker }
556*61046927SAndroid Build Coastguard Worker }
557*61046927SAndroid Build Coastguard Worker
558*61046927SAndroid Build Coastguard Worker static uint8_t
indexOfAV1RefFrame(uint32_t frame,const unsigned int * ref_frame_map)559*61046927SAndroid Build Coastguard Worker indexOfAV1RefFrame(uint32_t frame, const unsigned int *ref_frame_map) {
560*61046927SAndroid Build Coastguard Worker uint8_t i;
561*61046927SAndroid Build Coastguard Worker
562*61046927SAndroid Build Coastguard Worker for (i = 0; i < AV1_NUM_REF_FRAMES; ++i) {
563*61046927SAndroid Build Coastguard Worker if (frame == *ref_frame_map) {
564*61046927SAndroid Build Coastguard Worker break;
565*61046927SAndroid Build Coastguard Worker }
566*61046927SAndroid Build Coastguard Worker ++ref_frame_map;
567*61046927SAndroid Build Coastguard Worker }
568*61046927SAndroid Build Coastguard Worker
569*61046927SAndroid Build Coastguard Worker return i;
570*61046927SAndroid Build Coastguard Worker }
571*61046927SAndroid Build Coastguard Worker
572*61046927SAndroid Build Coastguard Worker static void
copyAV1TileInfo(struct pipe_av1_picture_desc * picture,const VdpPictureInfoAV1 * picture_info)573*61046927SAndroid Build Coastguard Worker copyAV1TileInfo(struct pipe_av1_picture_desc *picture,
574*61046927SAndroid Build Coastguard Worker const VdpPictureInfoAV1 *picture_info)
575*61046927SAndroid Build Coastguard Worker {
576*61046927SAndroid Build Coastguard Worker uint32_t sbCols, sbRows;
577*61046927SAndroid Build Coastguard Worker uint32_t startSb, i;
578*61046927SAndroid Build Coastguard Worker int32_t width_sb, height_sb;
579*61046927SAndroid Build Coastguard Worker uint32_t MiCols = ((picture_info->width + 7) >> 3) << 1;
580*61046927SAndroid Build Coastguard Worker uint32_t MiRows = ((picture_info->height + 7) >> 3) << 1;
581*61046927SAndroid Build Coastguard Worker
582*61046927SAndroid Build Coastguard Worker if (picture_info->use_superres) {
583*61046927SAndroid Build Coastguard Worker const uint32_t superres_scale_denominator = picture_info->coded_denom + AV1_SUPERRES_DENOM_MIN;
584*61046927SAndroid Build Coastguard Worker const uint32_t width = ((picture_info->width * 8) + (superres_scale_denominator / 2))
585*61046927SAndroid Build Coastguard Worker / superres_scale_denominator;
586*61046927SAndroid Build Coastguard Worker MiCols = (((width - 1) + 8) >> 3) << 1;
587*61046927SAndroid Build Coastguard Worker }
588*61046927SAndroid Build Coastguard Worker
589*61046927SAndroid Build Coastguard Worker sbCols = picture_info->use_128x128_superblock ? ((MiCols + 31) >> 5) : ((MiCols + 15) >> 4);
590*61046927SAndroid Build Coastguard Worker sbRows = picture_info->use_128x128_superblock ? ((MiRows + 31) >> 5) : ((MiRows + 15) >> 4);
591*61046927SAndroid Build Coastguard Worker
592*61046927SAndroid Build Coastguard Worker width_sb = sbCols;
593*61046927SAndroid Build Coastguard Worker height_sb = sbRows;
594*61046927SAndroid Build Coastguard Worker
595*61046927SAndroid Build Coastguard Worker startSb = 0;
596*61046927SAndroid Build Coastguard Worker for (i = 0; startSb < sbCols; ++i) {
597*61046927SAndroid Build Coastguard Worker const uint32_t tile_width = picture_info->tile_widths[i];
598*61046927SAndroid Build Coastguard Worker picture->picture_parameter.width_in_sbs[i] = tile_width;
599*61046927SAndroid Build Coastguard Worker
600*61046927SAndroid Build Coastguard Worker picture->picture_parameter.tile_col_start_sb[i] = startSb;
601*61046927SAndroid Build Coastguard Worker startSb += tile_width;
602*61046927SAndroid Build Coastguard Worker width_sb -= tile_width;
603*61046927SAndroid Build Coastguard Worker }
604*61046927SAndroid Build Coastguard Worker picture->picture_parameter.tile_col_start_sb[i] = startSb + width_sb;
605*61046927SAndroid Build Coastguard Worker
606*61046927SAndroid Build Coastguard Worker startSb = 0;
607*61046927SAndroid Build Coastguard Worker for (i = 0; startSb < sbRows; ++i) {
608*61046927SAndroid Build Coastguard Worker const uint32_t tile_height = picture_info->tile_heights[i];
609*61046927SAndroid Build Coastguard Worker picture->picture_parameter.height_in_sbs[i] = tile_height;
610*61046927SAndroid Build Coastguard Worker
611*61046927SAndroid Build Coastguard Worker picture->picture_parameter.tile_row_start_sb[i] = startSb;
612*61046927SAndroid Build Coastguard Worker startSb += tile_height;
613*61046927SAndroid Build Coastguard Worker height_sb -= tile_height;
614*61046927SAndroid Build Coastguard Worker }
615*61046927SAndroid Build Coastguard Worker picture->picture_parameter.tile_row_start_sb[i] = startSb + height_sb;
616*61046927SAndroid Build Coastguard Worker }
617*61046927SAndroid Build Coastguard Worker
618*61046927SAndroid Build Coastguard Worker static VdpStatus
vlVdpDecoderRenderAV1(struct pipe_av1_picture_desc * picture,VdpVideoSurface target,const VdpPictureInfoAV1 * picture_info)619*61046927SAndroid Build Coastguard Worker vlVdpDecoderRenderAV1(struct pipe_av1_picture_desc *picture,
620*61046927SAndroid Build Coastguard Worker VdpVideoSurface target,
621*61046927SAndroid Build Coastguard Worker const VdpPictureInfoAV1 *picture_info)
622*61046927SAndroid Build Coastguard Worker {
623*61046927SAndroid Build Coastguard Worker unsigned i, j;
624*61046927SAndroid Build Coastguard Worker
625*61046927SAndroid Build Coastguard Worker picture->film_grain_target = NULL;
626*61046927SAndroid Build Coastguard Worker
627*61046927SAndroid Build Coastguard Worker picture->picture_parameter.profile = picture_info->profile;
628*61046927SAndroid Build Coastguard Worker picture->picture_parameter.order_hint_bits_minus_1 = picture_info->order_hint_bits_minus1;
629*61046927SAndroid Build Coastguard Worker picture->picture_parameter.bit_depth_idx = picture_info->bit_depth_minus8 >> 1;
630*61046927SAndroid Build Coastguard Worker
631*61046927SAndroid Build Coastguard Worker picture->picture_parameter.seq_info_fields.use_128x128_superblock =
632*61046927SAndroid Build Coastguard Worker picture_info->use_128x128_superblock;
633*61046927SAndroid Build Coastguard Worker picture->picture_parameter.seq_info_fields.enable_filter_intra =
634*61046927SAndroid Build Coastguard Worker picture_info->enable_filter_intra;
635*61046927SAndroid Build Coastguard Worker picture->picture_parameter.seq_info_fields.enable_intra_edge_filter =
636*61046927SAndroid Build Coastguard Worker picture_info->enable_intra_edge_filter;
637*61046927SAndroid Build Coastguard Worker picture->picture_parameter.seq_info_fields.enable_interintra_compound =
638*61046927SAndroid Build Coastguard Worker picture_info->enable_interintra_compound;
639*61046927SAndroid Build Coastguard Worker picture->picture_parameter.seq_info_fields.enable_masked_compound =
640*61046927SAndroid Build Coastguard Worker picture_info->enable_masked_compound;
641*61046927SAndroid Build Coastguard Worker
642*61046927SAndroid Build Coastguard Worker picture->picture_parameter.seq_info_fields.enable_dual_filter =
643*61046927SAndroid Build Coastguard Worker picture_info->enable_dual_filter;
644*61046927SAndroid Build Coastguard Worker picture->picture_parameter.seq_info_fields.enable_order_hint =
645*61046927SAndroid Build Coastguard Worker picture_info->enable_order_hint;
646*61046927SAndroid Build Coastguard Worker picture->picture_parameter.seq_info_fields.enable_jnt_comp =
647*61046927SAndroid Build Coastguard Worker picture_info->enable_jnt_comp;
648*61046927SAndroid Build Coastguard Worker picture->picture_parameter.seq_info_fields.enable_cdef =
649*61046927SAndroid Build Coastguard Worker picture_info->enable_cdef;
650*61046927SAndroid Build Coastguard Worker picture->picture_parameter.seq_info_fields.mono_chrome =
651*61046927SAndroid Build Coastguard Worker picture_info->mono_chrome;
652*61046927SAndroid Build Coastguard Worker picture->picture_parameter.seq_info_fields.ref_frame_mvs =
653*61046927SAndroid Build Coastguard Worker picture_info->enable_order_hint;
654*61046927SAndroid Build Coastguard Worker picture->picture_parameter.seq_info_fields.film_grain_params_present =
655*61046927SAndroid Build Coastguard Worker picture_info->enable_fgs;
656*61046927SAndroid Build Coastguard Worker
657*61046927SAndroid Build Coastguard Worker picture->picture_parameter.current_frame_id = target;
658*61046927SAndroid Build Coastguard Worker picture->picture_parameter.frame_width = picture_info->width;
659*61046927SAndroid Build Coastguard Worker picture->picture_parameter.frame_height = picture_info->height;
660*61046927SAndroid Build Coastguard Worker picture->picture_parameter.max_width = picture_info->width;
661*61046927SAndroid Build Coastguard Worker picture->picture_parameter.max_height = picture_info->height;
662*61046927SAndroid Build Coastguard Worker
663*61046927SAndroid Build Coastguard Worker for (i = 0; i < AV1_NUM_REF_FRAMES; ++i) {
664*61046927SAndroid Build Coastguard Worker if (picture_info->frame_type == AV1_KEY_FRAME && picture_info->show_frame) {
665*61046927SAndroid Build Coastguard Worker picture->ref[i] = NULL;
666*61046927SAndroid Build Coastguard Worker } else {
667*61046927SAndroid Build Coastguard Worker VdpStatus ret = vlVdpGetReferenceFrame(picture_info->ref_frame_map[i], &picture->ref[i]);
668*61046927SAndroid Build Coastguard Worker if (ret != VDP_STATUS_OK) {
669*61046927SAndroid Build Coastguard Worker return ret;
670*61046927SAndroid Build Coastguard Worker }
671*61046927SAndroid Build Coastguard Worker }
672*61046927SAndroid Build Coastguard Worker }
673*61046927SAndroid Build Coastguard Worker
674*61046927SAndroid Build Coastguard Worker for (i = 0; i < AV1_REFS_PER_FRAME; ++i) {
675*61046927SAndroid Build Coastguard Worker const uint8_t idx = indexOfAV1RefFrame(picture_info->ref_frame[i].index,
676*61046927SAndroid Build Coastguard Worker picture_info->ref_frame_map);
677*61046927SAndroid Build Coastguard Worker if (idx == AV1_NUM_REF_FRAMES) {
678*61046927SAndroid Build Coastguard Worker return VDP_STATUS_ERROR;
679*61046927SAndroid Build Coastguard Worker }
680*61046927SAndroid Build Coastguard Worker picture->picture_parameter.ref_frame_idx[i] = idx;
681*61046927SAndroid Build Coastguard Worker }
682*61046927SAndroid Build Coastguard Worker
683*61046927SAndroid Build Coastguard Worker if (picture_info->primary_ref_frame == VDP_INVALID_HANDLE) {
684*61046927SAndroid Build Coastguard Worker picture->picture_parameter.primary_ref_frame = AV1_PRIMARY_REF_NONE;
685*61046927SAndroid Build Coastguard Worker } else {
686*61046927SAndroid Build Coastguard Worker const uint8_t *ref_index = picture->picture_parameter.ref_frame_idx;
687*61046927SAndroid Build Coastguard Worker const uint8_t idx = indexOfAV1RefFrame(picture_info->primary_ref_frame,
688*61046927SAndroid Build Coastguard Worker picture_info->ref_frame_map);
689*61046927SAndroid Build Coastguard Worker if (idx == AV1_NUM_REF_FRAMES) {
690*61046927SAndroid Build Coastguard Worker return VDP_STATUS_ERROR;
691*61046927SAndroid Build Coastguard Worker }
692*61046927SAndroid Build Coastguard Worker
693*61046927SAndroid Build Coastguard Worker for (i = 0; i < AV1_REFS_PER_FRAME; ++i) {
694*61046927SAndroid Build Coastguard Worker if (idx == *ref_index) {
695*61046927SAndroid Build Coastguard Worker break;
696*61046927SAndroid Build Coastguard Worker }
697*61046927SAndroid Build Coastguard Worker ++ref_index;
698*61046927SAndroid Build Coastguard Worker }
699*61046927SAndroid Build Coastguard Worker picture->picture_parameter.primary_ref_frame = i;
700*61046927SAndroid Build Coastguard Worker }
701*61046927SAndroid Build Coastguard Worker
702*61046927SAndroid Build Coastguard Worker picture->picture_parameter.refresh_frame_flags = 0x01;
703*61046927SAndroid Build Coastguard Worker picture->picture_parameter.order_hint = picture_info->frame_offset;
704*61046927SAndroid Build Coastguard Worker
705*61046927SAndroid Build Coastguard Worker // Segment Info
706*61046927SAndroid Build Coastguard Worker picture->picture_parameter.seg_info.segment_info_fields.enabled =
707*61046927SAndroid Build Coastguard Worker picture_info->segmentation_enabled;
708*61046927SAndroid Build Coastguard Worker picture->picture_parameter.seg_info.segment_info_fields.update_map =
709*61046927SAndroid Build Coastguard Worker picture_info->segmentation_update_map;
710*61046927SAndroid Build Coastguard Worker picture->picture_parameter.seg_info.segment_info_fields.update_data =
711*61046927SAndroid Build Coastguard Worker picture_info->segmentation_update_data;
712*61046927SAndroid Build Coastguard Worker picture->picture_parameter.seg_info.segment_info_fields.temporal_update =
713*61046927SAndroid Build Coastguard Worker picture_info->segmentation_temporal_update;
714*61046927SAndroid Build Coastguard Worker memcpy(picture->picture_parameter.seg_info.feature_data,
715*61046927SAndroid Build Coastguard Worker picture_info->segmentation_feature_data,
716*61046927SAndroid Build Coastguard Worker sizeof(picture->picture_parameter.seg_info.feature_data));
717*61046927SAndroid Build Coastguard Worker memcpy(picture->picture_parameter.seg_info.feature_mask,
718*61046927SAndroid Build Coastguard Worker picture_info->segmentation_feature_mask,
719*61046927SAndroid Build Coastguard Worker sizeof(picture->picture_parameter.seg_info.feature_mask));
720*61046927SAndroid Build Coastguard Worker
721*61046927SAndroid Build Coastguard Worker // Film Grain Info
722*61046927SAndroid Build Coastguard Worker if (picture_info->enable_fgs) {
723*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.film_grain_info_fields.apply_grain =
724*61046927SAndroid Build Coastguard Worker picture_info->apply_grain;
725*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.film_grain_info_fields.chroma_scaling_from_luma =
726*61046927SAndroid Build Coastguard Worker picture_info->chroma_scaling_from_luma;
727*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.film_grain_info_fields.grain_scaling_minus_8 =
728*61046927SAndroid Build Coastguard Worker picture_info->scaling_shift_minus8;
729*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.film_grain_info_fields.ar_coeff_lag =
730*61046927SAndroid Build Coastguard Worker picture_info->ar_coeff_lag;
731*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.film_grain_info_fields.ar_coeff_shift_minus_6 =
732*61046927SAndroid Build Coastguard Worker picture_info->ar_coeff_shift_minus6;
733*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.film_grain_info_fields.grain_scale_shift =
734*61046927SAndroid Build Coastguard Worker picture_info->grain_scale_shift;
735*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.film_grain_info_fields.overlap_flag =
736*61046927SAndroid Build Coastguard Worker picture_info->overlap_flag;
737*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.film_grain_info_fields.clip_to_restricted_range =
738*61046927SAndroid Build Coastguard Worker picture_info->clip_to_restricted_range;
739*61046927SAndroid Build Coastguard Worker
740*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.grain_seed =
741*61046927SAndroid Build Coastguard Worker picture_info->random_seed;
742*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.num_y_points =
743*61046927SAndroid Build Coastguard Worker picture_info->num_y_points;
744*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.num_cb_points =
745*61046927SAndroid Build Coastguard Worker picture_info->num_cb_points;
746*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.num_cr_points =
747*61046927SAndroid Build Coastguard Worker picture_info->num_cr_points;
748*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.cb_mult =
749*61046927SAndroid Build Coastguard Worker picture_info->cb_mult;
750*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.cb_luma_mult =
751*61046927SAndroid Build Coastguard Worker picture_info->cb_luma_mult;
752*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.cb_offset =
753*61046927SAndroid Build Coastguard Worker picture_info->cb_offset;
754*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.cr_mult =
755*61046927SAndroid Build Coastguard Worker picture_info->cr_mult;
756*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.cr_luma_mult =
757*61046927SAndroid Build Coastguard Worker picture_info->cr_luma_mult;
758*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.cr_offset =
759*61046927SAndroid Build Coastguard Worker picture_info->cr_offset;
760*61046927SAndroid Build Coastguard Worker
761*61046927SAndroid Build Coastguard Worker copyAV1ScalingPoints(
762*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.point_y_value,
763*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.point_y_scaling,
764*61046927SAndroid Build Coastguard Worker picture_info->scaling_points_y,
765*61046927SAndroid Build Coastguard Worker ARRAY_SIZE(picture->picture_parameter.film_grain_info.point_y_value));
766*61046927SAndroid Build Coastguard Worker copyAV1ScalingPoints(
767*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.point_cb_value,
768*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.point_cb_scaling,
769*61046927SAndroid Build Coastguard Worker picture_info->scaling_points_cb,
770*61046927SAndroid Build Coastguard Worker ARRAY_SIZE(picture->picture_parameter.film_grain_info.point_cb_value));
771*61046927SAndroid Build Coastguard Worker copyAV1ScalingPoints(
772*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.point_cr_value,
773*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.point_cr_scaling,
774*61046927SAndroid Build Coastguard Worker picture_info->scaling_points_cr,
775*61046927SAndroid Build Coastguard Worker ARRAY_SIZE(picture->picture_parameter.film_grain_info.point_cr_value));
776*61046927SAndroid Build Coastguard Worker
777*61046927SAndroid Build Coastguard Worker copyArrayInt8FromShort(
778*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.ar_coeffs_y,
779*61046927SAndroid Build Coastguard Worker picture_info->ar_coeffs_y,
780*61046927SAndroid Build Coastguard Worker ARRAY_SIZE(picture->picture_parameter.film_grain_info.ar_coeffs_y));
781*61046927SAndroid Build Coastguard Worker copyArrayInt8FromShort(
782*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.ar_coeffs_cb,
783*61046927SAndroid Build Coastguard Worker picture_info->ar_coeffs_cb,
784*61046927SAndroid Build Coastguard Worker ARRAY_SIZE(picture->picture_parameter.film_grain_info.ar_coeffs_cb));
785*61046927SAndroid Build Coastguard Worker copyArrayInt8FromShort(
786*61046927SAndroid Build Coastguard Worker picture->picture_parameter.film_grain_info.ar_coeffs_cr,
787*61046927SAndroid Build Coastguard Worker picture_info->ar_coeffs_cr,
788*61046927SAndroid Build Coastguard Worker ARRAY_SIZE(picture->picture_parameter.film_grain_info.ar_coeffs_cr));
789*61046927SAndroid Build Coastguard Worker }
790*61046927SAndroid Build Coastguard Worker
791*61046927SAndroid Build Coastguard Worker // Picture Info
792*61046927SAndroid Build Coastguard Worker picture->picture_parameter.pic_info_fields.frame_type =
793*61046927SAndroid Build Coastguard Worker picture_info->frame_type;
794*61046927SAndroid Build Coastguard Worker picture->picture_parameter.pic_info_fields.show_frame =
795*61046927SAndroid Build Coastguard Worker picture_info->show_frame;
796*61046927SAndroid Build Coastguard Worker picture->picture_parameter.pic_info_fields.showable_frame = 1;
797*61046927SAndroid Build Coastguard Worker picture->picture_parameter.pic_info_fields.error_resilient_mode = 1;
798*61046927SAndroid Build Coastguard Worker picture->picture_parameter.pic_info_fields.disable_cdf_update =
799*61046927SAndroid Build Coastguard Worker picture_info->disable_cdf_update;
800*61046927SAndroid Build Coastguard Worker picture->picture_parameter.pic_info_fields.allow_screen_content_tools =
801*61046927SAndroid Build Coastguard Worker picture_info->allow_screen_content_tools;
802*61046927SAndroid Build Coastguard Worker picture->picture_parameter.pic_info_fields.force_integer_mv =
803*61046927SAndroid Build Coastguard Worker picture_info->force_integer_mv;
804*61046927SAndroid Build Coastguard Worker picture->picture_parameter.pic_info_fields.allow_intrabc =
805*61046927SAndroid Build Coastguard Worker picture_info->allow_intrabc;
806*61046927SAndroid Build Coastguard Worker picture->picture_parameter.pic_info_fields.use_superres =
807*61046927SAndroid Build Coastguard Worker picture_info->use_superres;
808*61046927SAndroid Build Coastguard Worker picture->picture_parameter.pic_info_fields.allow_high_precision_mv =
809*61046927SAndroid Build Coastguard Worker picture_info->allow_high_precision_mv;
810*61046927SAndroid Build Coastguard Worker picture->picture_parameter.pic_info_fields.is_motion_mode_switchable =
811*61046927SAndroid Build Coastguard Worker picture_info->switchable_motion_mode;
812*61046927SAndroid Build Coastguard Worker picture->picture_parameter.pic_info_fields.use_ref_frame_mvs =
813*61046927SAndroid Build Coastguard Worker picture_info->use_ref_frame_mvs;
814*61046927SAndroid Build Coastguard Worker picture->picture_parameter.pic_info_fields.disable_frame_end_update_cdf =
815*61046927SAndroid Build Coastguard Worker picture_info->disable_frame_end_update_cdf;
816*61046927SAndroid Build Coastguard Worker picture->picture_parameter.pic_info_fields.uniform_tile_spacing_flag = 0;
817*61046927SAndroid Build Coastguard Worker picture->picture_parameter.pic_info_fields.allow_warped_motion =
818*61046927SAndroid Build Coastguard Worker picture_info->allow_warped_motion;
819*61046927SAndroid Build Coastguard Worker picture->picture_parameter.pic_info_fields.large_scale_tile = 0;
820*61046927SAndroid Build Coastguard Worker
821*61046927SAndroid Build Coastguard Worker picture->picture_parameter.superres_scale_denominator =
822*61046927SAndroid Build Coastguard Worker picture_info->use_superres ? picture_info->coded_denom + AV1_SUPERRES_DENOM_MIN : AV1_SUPERRES_NUM;
823*61046927SAndroid Build Coastguard Worker
824*61046927SAndroid Build Coastguard Worker // Loop Filter
825*61046927SAndroid Build Coastguard Worker picture->picture_parameter.interp_filter = picture_info->interp_filter;
826*61046927SAndroid Build Coastguard Worker memcpy(picture->picture_parameter.filter_level,
827*61046927SAndroid Build Coastguard Worker picture_info->loop_filter_level,
828*61046927SAndroid Build Coastguard Worker sizeof(picture->picture_parameter.filter_level));
829*61046927SAndroid Build Coastguard Worker picture->picture_parameter.filter_level_u =
830*61046927SAndroid Build Coastguard Worker picture_info->loop_filter_level_u;
831*61046927SAndroid Build Coastguard Worker picture->picture_parameter.filter_level_v =
832*61046927SAndroid Build Coastguard Worker picture_info->loop_filter_level_v;
833*61046927SAndroid Build Coastguard Worker picture->picture_parameter.loop_filter_info_fields.sharpness_level =
834*61046927SAndroid Build Coastguard Worker picture_info->loop_filter_sharpness;
835*61046927SAndroid Build Coastguard Worker picture->picture_parameter.loop_filter_info_fields.mode_ref_delta_enabled =
836*61046927SAndroid Build Coastguard Worker picture_info->loop_filter_delta_enabled;
837*61046927SAndroid Build Coastguard Worker picture->picture_parameter.loop_filter_info_fields.mode_ref_delta_update =
838*61046927SAndroid Build Coastguard Worker picture_info->loop_filter_delta_update;
839*61046927SAndroid Build Coastguard Worker memcpy(picture->picture_parameter.ref_deltas,
840*61046927SAndroid Build Coastguard Worker picture_info->loop_filter_ref_deltas,
841*61046927SAndroid Build Coastguard Worker sizeof(picture->picture_parameter.ref_deltas));
842*61046927SAndroid Build Coastguard Worker memcpy(picture->picture_parameter.mode_deltas,
843*61046927SAndroid Build Coastguard Worker picture_info->loop_filter_mode_deltas,
844*61046927SAndroid Build Coastguard Worker sizeof(picture->picture_parameter.mode_deltas));
845*61046927SAndroid Build Coastguard Worker
846*61046927SAndroid Build Coastguard Worker // Tile Info
847*61046927SAndroid Build Coastguard Worker picture->picture_parameter.tile_cols = picture_info->num_tile_cols;
848*61046927SAndroid Build Coastguard Worker picture->picture_parameter.tile_rows = picture_info->num_tile_rows;
849*61046927SAndroid Build Coastguard Worker picture->picture_parameter.context_update_tile_id =
850*61046927SAndroid Build Coastguard Worker picture_info->context_update_tile_id;
851*61046927SAndroid Build Coastguard Worker copyAV1TileInfo(picture, picture_info);
852*61046927SAndroid Build Coastguard Worker
853*61046927SAndroid Build Coastguard Worker // Quantization Parameters
854*61046927SAndroid Build Coastguard Worker picture->picture_parameter.base_qindex = picture_info->base_qindex;
855*61046927SAndroid Build Coastguard Worker picture->picture_parameter.y_dc_delta_q = picture_info->qp_y_dc_delta_q;
856*61046927SAndroid Build Coastguard Worker picture->picture_parameter.u_dc_delta_q = picture_info->qp_u_dc_delta_q;
857*61046927SAndroid Build Coastguard Worker picture->picture_parameter.u_ac_delta_q = picture_info->qp_u_ac_delta_q;
858*61046927SAndroid Build Coastguard Worker picture->picture_parameter.v_dc_delta_q = picture_info->qp_v_dc_delta_q;
859*61046927SAndroid Build Coastguard Worker picture->picture_parameter.v_ac_delta_q = picture_info->qp_v_ac_delta_q;
860*61046927SAndroid Build Coastguard Worker
861*61046927SAndroid Build Coastguard Worker // QMatrix
862*61046927SAndroid Build Coastguard Worker picture->picture_parameter.qmatrix_fields.using_qmatrix =
863*61046927SAndroid Build Coastguard Worker picture_info->using_qmatrix;
864*61046927SAndroid Build Coastguard Worker if (picture_info->using_qmatrix) {
865*61046927SAndroid Build Coastguard Worker picture->picture_parameter.qmatrix_fields.qm_y = picture_info->qm_y;
866*61046927SAndroid Build Coastguard Worker picture->picture_parameter.qmatrix_fields.qm_u = picture_info->qm_u;
867*61046927SAndroid Build Coastguard Worker picture->picture_parameter.qmatrix_fields.qm_v = picture_info->qm_v;
868*61046927SAndroid Build Coastguard Worker } else {
869*61046927SAndroid Build Coastguard Worker picture->picture_parameter.qmatrix_fields.qm_y = 0x0f;
870*61046927SAndroid Build Coastguard Worker picture->picture_parameter.qmatrix_fields.qm_u = 0x0f;
871*61046927SAndroid Build Coastguard Worker picture->picture_parameter.qmatrix_fields.qm_v = 0x0f;
872*61046927SAndroid Build Coastguard Worker }
873*61046927SAndroid Build Coastguard Worker
874*61046927SAndroid Build Coastguard Worker // Mode Control Fields
875*61046927SAndroid Build Coastguard Worker picture->picture_parameter.mode_control_fields.delta_q_present_flag =
876*61046927SAndroid Build Coastguard Worker picture_info->delta_q_present;
877*61046927SAndroid Build Coastguard Worker picture->picture_parameter.mode_control_fields.log2_delta_q_res =
878*61046927SAndroid Build Coastguard Worker picture_info->delta_q_res;
879*61046927SAndroid Build Coastguard Worker picture->picture_parameter.mode_control_fields.delta_lf_present_flag =
880*61046927SAndroid Build Coastguard Worker picture_info->delta_lf_present;
881*61046927SAndroid Build Coastguard Worker picture->picture_parameter.mode_control_fields.log2_delta_lf_res =
882*61046927SAndroid Build Coastguard Worker picture_info->delta_lf_res;
883*61046927SAndroid Build Coastguard Worker picture->picture_parameter.mode_control_fields.delta_lf_multi =
884*61046927SAndroid Build Coastguard Worker picture_info->delta_lf_multi;
885*61046927SAndroid Build Coastguard Worker picture->picture_parameter.mode_control_fields.tx_mode =
886*61046927SAndroid Build Coastguard Worker picture_info->tx_mode;
887*61046927SAndroid Build Coastguard Worker picture->picture_parameter.mode_control_fields.reference_select =
888*61046927SAndroid Build Coastguard Worker picture_info->reference_mode;
889*61046927SAndroid Build Coastguard Worker picture->picture_parameter.mode_control_fields.reduced_tx_set_used =
890*61046927SAndroid Build Coastguard Worker picture_info->reduced_tx_set;
891*61046927SAndroid Build Coastguard Worker picture->picture_parameter.mode_control_fields.skip_mode_present =
892*61046927SAndroid Build Coastguard Worker picture_info->skip_mode;
893*61046927SAndroid Build Coastguard Worker
894*61046927SAndroid Build Coastguard Worker // CDEF
895*61046927SAndroid Build Coastguard Worker picture->picture_parameter.cdef_damping_minus_3 =
896*61046927SAndroid Build Coastguard Worker picture_info->cdef_damping_minus_3;
897*61046927SAndroid Build Coastguard Worker picture->picture_parameter.cdef_bits = picture_info->cdef_bits;
898*61046927SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(picture->picture_parameter.cdef_y_strengths); ++i) {
899*61046927SAndroid Build Coastguard Worker picture->picture_parameter.cdef_y_strengths[i] =
900*61046927SAndroid Build Coastguard Worker ((picture_info->cdef_y_strength[i] & 0xf) << 2) +
901*61046927SAndroid Build Coastguard Worker (picture_info->cdef_y_strength[i] >> 4);
902*61046927SAndroid Build Coastguard Worker picture->picture_parameter.cdef_uv_strengths[i] =
903*61046927SAndroid Build Coastguard Worker ((picture_info->cdef_uv_strength[i] & 0xf) << 2) +
904*61046927SAndroid Build Coastguard Worker (picture_info->cdef_uv_strength[i] >> 4);
905*61046927SAndroid Build Coastguard Worker }
906*61046927SAndroid Build Coastguard Worker
907*61046927SAndroid Build Coastguard Worker // Loop Restoration
908*61046927SAndroid Build Coastguard Worker picture->picture_parameter.loop_restoration_fields.yframe_restoration_type =
909*61046927SAndroid Build Coastguard Worker picture_info->lr_type[0];
910*61046927SAndroid Build Coastguard Worker picture->picture_parameter.loop_restoration_fields.cbframe_restoration_type =
911*61046927SAndroid Build Coastguard Worker picture_info->lr_type[1];
912*61046927SAndroid Build Coastguard Worker picture->picture_parameter.loop_restoration_fields.crframe_restoration_type =
913*61046927SAndroid Build Coastguard Worker picture_info->lr_type[2];
914*61046927SAndroid Build Coastguard Worker picture->picture_parameter.loop_restoration_fields.lr_unit_shift =
915*61046927SAndroid Build Coastguard Worker picture_info->lr_unit_size[0] - 1;
916*61046927SAndroid Build Coastguard Worker picture->picture_parameter.loop_restoration_fields.lr_uv_shift =
917*61046927SAndroid Build Coastguard Worker picture_info->lr_unit_size[0] - picture_info->lr_unit_size[1];
918*61046927SAndroid Build Coastguard Worker
919*61046927SAndroid Build Coastguard Worker if (picture_info->lr_type[0] || picture_info->lr_type[1] || picture_info->lr_type[2]) {
920*61046927SAndroid Build Coastguard Worker const uint8_t unit_shift = 6 + picture->picture_parameter.loop_restoration_fields.lr_unit_shift;
921*61046927SAndroid Build Coastguard Worker
922*61046927SAndroid Build Coastguard Worker picture->picture_parameter.lr_unit_size[0] = (1 << unit_shift);
923*61046927SAndroid Build Coastguard Worker picture->picture_parameter.lr_unit_size[1] =
924*61046927SAndroid Build Coastguard Worker 1 << (unit_shift - picture->picture_parameter.loop_restoration_fields.lr_uv_shift);
925*61046927SAndroid Build Coastguard Worker picture->picture_parameter.lr_unit_size[2] =
926*61046927SAndroid Build Coastguard Worker picture->picture_parameter.lr_unit_size[1];
927*61046927SAndroid Build Coastguard Worker } else {
928*61046927SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(picture->picture_parameter.lr_unit_size); ++i) {
929*61046927SAndroid Build Coastguard Worker picture->picture_parameter.lr_unit_size[i] = (1 << 8);
930*61046927SAndroid Build Coastguard Worker }
931*61046927SAndroid Build Coastguard Worker }
932*61046927SAndroid Build Coastguard Worker
933*61046927SAndroid Build Coastguard Worker // Global Motion
934*61046927SAndroid Build Coastguard Worker for (i = 0; i < AV1_REFS_PER_FRAME; ++i) {
935*61046927SAndroid Build Coastguard Worker picture->picture_parameter.wm[i].invalid = picture_info->global_motion[i].invalid;
936*61046927SAndroid Build Coastguard Worker picture->picture_parameter.wm[i].wmtype = picture_info->global_motion[i].wmtype;
937*61046927SAndroid Build Coastguard Worker
938*61046927SAndroid Build Coastguard Worker // VDPAU only has 6 wmmat[] elements, whereas Gallium provides 8.
939*61046927SAndroid Build Coastguard Worker for (j = 0; j < ARRAY_SIZE(picture_info->global_motion[0].wmmat); ++j) {
940*61046927SAndroid Build Coastguard Worker picture->picture_parameter.wm[i].wmmat[j] = picture_info->global_motion[i].wmmat[j];
941*61046927SAndroid Build Coastguard Worker }
942*61046927SAndroid Build Coastguard Worker }
943*61046927SAndroid Build Coastguard Worker
944*61046927SAndroid Build Coastguard Worker picture->picture_parameter.matrix_coefficients = 0;
945*61046927SAndroid Build Coastguard Worker
946*61046927SAndroid Build Coastguard Worker // Tile Information
947*61046927SAndroid Build Coastguard Worker picture->slice_parameter.slice_count =
948*61046927SAndroid Build Coastguard Worker picture_info->num_tile_rows * picture_info->num_tile_cols;
949*61046927SAndroid Build Coastguard Worker for (i = 0; i < picture->slice_parameter.slice_count; ++i) {
950*61046927SAndroid Build Coastguard Worker const uint32_t start_offset = picture_info->tile_info[i * 2];
951*61046927SAndroid Build Coastguard Worker
952*61046927SAndroid Build Coastguard Worker picture->slice_parameter.slice_data_offset[i] = start_offset;
953*61046927SAndroid Build Coastguard Worker picture->slice_parameter.slice_data_size[i] =
954*61046927SAndroid Build Coastguard Worker picture_info->tile_info[i * 2 + 1] - start_offset;
955*61046927SAndroid Build Coastguard Worker }
956*61046927SAndroid Build Coastguard Worker
957*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
958*61046927SAndroid Build Coastguard Worker }
959*61046927SAndroid Build Coastguard Worker
960*61046927SAndroid Build Coastguard Worker static void
vlVdpDecoderFixVC1Startcode(uint32_t * num_buffers,const void * buffers[],unsigned sizes[])961*61046927SAndroid Build Coastguard Worker vlVdpDecoderFixVC1Startcode(uint32_t *num_buffers, const void *buffers[], unsigned sizes[])
962*61046927SAndroid Build Coastguard Worker {
963*61046927SAndroid Build Coastguard Worker static const uint8_t vc1_startcode[] = { 0x00, 0x00, 0x01, 0x0D };
964*61046927SAndroid Build Coastguard Worker struct vl_vlc vlc = {};
965*61046927SAndroid Build Coastguard Worker unsigned i;
966*61046927SAndroid Build Coastguard Worker
967*61046927SAndroid Build Coastguard Worker /* search the first 64 bytes for a startcode */
968*61046927SAndroid Build Coastguard Worker vl_vlc_init(&vlc, *num_buffers, buffers, sizes);
969*61046927SAndroid Build Coastguard Worker while (vl_vlc_search_byte(&vlc, 64*8, 0x00) && vl_vlc_bits_left(&vlc) >= 32) {
970*61046927SAndroid Build Coastguard Worker uint32_t value = vl_vlc_peekbits(&vlc, 32);
971*61046927SAndroid Build Coastguard Worker if (value == 0x0000010D ||
972*61046927SAndroid Build Coastguard Worker value == 0x0000010C ||
973*61046927SAndroid Build Coastguard Worker value == 0x0000010B)
974*61046927SAndroid Build Coastguard Worker return;
975*61046927SAndroid Build Coastguard Worker vl_vlc_eatbits(&vlc, 8);
976*61046927SAndroid Build Coastguard Worker }
977*61046927SAndroid Build Coastguard Worker
978*61046927SAndroid Build Coastguard Worker /* none found, ok add one manually */
979*61046927SAndroid Build Coastguard Worker VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Manually adding VC-1 startcode\n");
980*61046927SAndroid Build Coastguard Worker for (i = *num_buffers; i > 0; --i) {
981*61046927SAndroid Build Coastguard Worker buffers[i] = buffers[i - 1];
982*61046927SAndroid Build Coastguard Worker sizes[i] = sizes[i - 1];
983*61046927SAndroid Build Coastguard Worker }
984*61046927SAndroid Build Coastguard Worker ++(*num_buffers);
985*61046927SAndroid Build Coastguard Worker buffers[0] = vc1_startcode;
986*61046927SAndroid Build Coastguard Worker sizes[0] = 4;
987*61046927SAndroid Build Coastguard Worker }
988*61046927SAndroid Build Coastguard Worker
989*61046927SAndroid Build Coastguard Worker static bool
vlVdpQueryInterlacedH264(struct pipe_h264_picture_desc * h264)990*61046927SAndroid Build Coastguard Worker vlVdpQueryInterlacedH264(struct pipe_h264_picture_desc *h264)
991*61046927SAndroid Build Coastguard Worker {
992*61046927SAndroid Build Coastguard Worker if (h264->pps->sps->frame_mbs_only_flag)
993*61046927SAndroid Build Coastguard Worker return false;
994*61046927SAndroid Build Coastguard Worker
995*61046927SAndroid Build Coastguard Worker return h264->field_pic_flag || /* PAFF */
996*61046927SAndroid Build Coastguard Worker h264->pps->sps->mb_adaptive_frame_field_flag; /* MBAFF */
997*61046927SAndroid Build Coastguard Worker }
998*61046927SAndroid Build Coastguard Worker
999*61046927SAndroid Build Coastguard Worker /**
1000*61046927SAndroid Build Coastguard Worker * Decode a compressed field/frame and render the result into a VdpVideoSurface.
1001*61046927SAndroid Build Coastguard Worker */
1002*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpDecoderRender(VdpDecoder decoder,VdpVideoSurface target,VdpPictureInfo const * picture_info,uint32_t bitstream_buffer_count,VdpBitstreamBuffer const * bitstream_buffers)1003*61046927SAndroid Build Coastguard Worker vlVdpDecoderRender(VdpDecoder decoder,
1004*61046927SAndroid Build Coastguard Worker VdpVideoSurface target,
1005*61046927SAndroid Build Coastguard Worker VdpPictureInfo const *picture_info,
1006*61046927SAndroid Build Coastguard Worker uint32_t bitstream_buffer_count,
1007*61046927SAndroid Build Coastguard Worker VdpBitstreamBuffer const *bitstream_buffers)
1008*61046927SAndroid Build Coastguard Worker {
1009*61046927SAndroid Build Coastguard Worker const void * buffers[bitstream_buffer_count + 1];
1010*61046927SAndroid Build Coastguard Worker unsigned sizes[bitstream_buffer_count + 1];
1011*61046927SAndroid Build Coastguard Worker vlVdpDecoder *vldecoder;
1012*61046927SAndroid Build Coastguard Worker vlVdpSurface *vlsurf;
1013*61046927SAndroid Build Coastguard Worker VdpStatus ret;
1014*61046927SAndroid Build Coastguard Worker struct pipe_screen *screen;
1015*61046927SAndroid Build Coastguard Worker struct pipe_video_codec *dec;
1016*61046927SAndroid Build Coastguard Worker bool buffer_support[2];
1017*61046927SAndroid Build Coastguard Worker unsigned i;
1018*61046927SAndroid Build Coastguard Worker struct pipe_h264_sps sps_h264 = {};
1019*61046927SAndroid Build Coastguard Worker struct pipe_h264_pps pps_h264 = { &sps_h264 };
1020*61046927SAndroid Build Coastguard Worker struct pipe_h265_sps sps_h265 = {};
1021*61046927SAndroid Build Coastguard Worker struct pipe_h265_pps pps_h265 = { &sps_h265 };
1022*61046927SAndroid Build Coastguard Worker union {
1023*61046927SAndroid Build Coastguard Worker struct pipe_picture_desc base;
1024*61046927SAndroid Build Coastguard Worker struct pipe_mpeg12_picture_desc mpeg12;
1025*61046927SAndroid Build Coastguard Worker struct pipe_mpeg4_picture_desc mpeg4;
1026*61046927SAndroid Build Coastguard Worker struct pipe_vc1_picture_desc vc1;
1027*61046927SAndroid Build Coastguard Worker struct pipe_h264_picture_desc h264;
1028*61046927SAndroid Build Coastguard Worker struct pipe_h265_picture_desc h265;
1029*61046927SAndroid Build Coastguard Worker struct pipe_av1_picture_desc av1;
1030*61046927SAndroid Build Coastguard Worker } desc;
1031*61046927SAndroid Build Coastguard Worker bool picture_interlaced = false;
1032*61046927SAndroid Build Coastguard Worker
1033*61046927SAndroid Build Coastguard Worker if (!(picture_info && bitstream_buffers))
1034*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
1035*61046927SAndroid Build Coastguard Worker
1036*61046927SAndroid Build Coastguard Worker vldecoder = (vlVdpDecoder *)vlGetDataHTAB(decoder);
1037*61046927SAndroid Build Coastguard Worker if (!vldecoder)
1038*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_HANDLE;
1039*61046927SAndroid Build Coastguard Worker dec = vldecoder->decoder;
1040*61046927SAndroid Build Coastguard Worker screen = dec->context->screen;
1041*61046927SAndroid Build Coastguard Worker
1042*61046927SAndroid Build Coastguard Worker vlsurf = (vlVdpSurface *)vlGetDataHTAB(target);
1043*61046927SAndroid Build Coastguard Worker if (!vlsurf)
1044*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_HANDLE;
1045*61046927SAndroid Build Coastguard Worker
1046*61046927SAndroid Build Coastguard Worker if (vlsurf->device != vldecoder->device)
1047*61046927SAndroid Build Coastguard Worker return VDP_STATUS_HANDLE_DEVICE_MISMATCH;
1048*61046927SAndroid Build Coastguard Worker
1049*61046927SAndroid Build Coastguard Worker if (vlsurf->video_buffer != NULL &&
1050*61046927SAndroid Build Coastguard Worker pipe_format_to_chroma_format(vlsurf->video_buffer->buffer_format) != dec->chroma_format)
1051*61046927SAndroid Build Coastguard Worker // TODO: Recreate decoder with correct chroma
1052*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_CHROMA_TYPE;
1053*61046927SAndroid Build Coastguard Worker
1054*61046927SAndroid Build Coastguard Worker for (i = 0; i < bitstream_buffer_count; ++i) {
1055*61046927SAndroid Build Coastguard Worker buffers[i] = bitstream_buffers[i].bitstream;
1056*61046927SAndroid Build Coastguard Worker sizes[i] = bitstream_buffers[i].bitstream_bytes;
1057*61046927SAndroid Build Coastguard Worker }
1058*61046927SAndroid Build Coastguard Worker
1059*61046927SAndroid Build Coastguard Worker memset(&desc, 0, sizeof(desc));
1060*61046927SAndroid Build Coastguard Worker desc.base.profile = dec->profile;
1061*61046927SAndroid Build Coastguard Worker switch (u_reduce_video_profile(dec->profile)) {
1062*61046927SAndroid Build Coastguard Worker case PIPE_VIDEO_FORMAT_MPEG12:
1063*61046927SAndroid Build Coastguard Worker ret = vlVdpDecoderRenderMpeg12(&desc.mpeg12, (VdpPictureInfoMPEG1Or2 *)picture_info);
1064*61046927SAndroid Build Coastguard Worker break;
1065*61046927SAndroid Build Coastguard Worker case PIPE_VIDEO_FORMAT_MPEG4:
1066*61046927SAndroid Build Coastguard Worker ret = vlVdpDecoderRenderMpeg4(&desc.mpeg4, (VdpPictureInfoMPEG4Part2 *)picture_info);
1067*61046927SAndroid Build Coastguard Worker break;
1068*61046927SAndroid Build Coastguard Worker case PIPE_VIDEO_FORMAT_VC1:
1069*61046927SAndroid Build Coastguard Worker if (dec->profile == PIPE_VIDEO_PROFILE_VC1_ADVANCED)
1070*61046927SAndroid Build Coastguard Worker vlVdpDecoderFixVC1Startcode(&bitstream_buffer_count, buffers, sizes);
1071*61046927SAndroid Build Coastguard Worker ret = vlVdpDecoderRenderVC1(&desc.vc1, (VdpPictureInfoVC1 *)picture_info);
1072*61046927SAndroid Build Coastguard Worker break;
1073*61046927SAndroid Build Coastguard Worker case PIPE_VIDEO_FORMAT_MPEG4_AVC:
1074*61046927SAndroid Build Coastguard Worker desc.h264.pps = &pps_h264;
1075*61046927SAndroid Build Coastguard Worker ret = vlVdpDecoderRenderH264(&desc.h264, (VdpPictureInfoH264 *)picture_info, dec->level);
1076*61046927SAndroid Build Coastguard Worker picture_interlaced = vlVdpQueryInterlacedH264(&desc.h264);
1077*61046927SAndroid Build Coastguard Worker break;
1078*61046927SAndroid Build Coastguard Worker case PIPE_VIDEO_FORMAT_HEVC:
1079*61046927SAndroid Build Coastguard Worker desc.h265.pps = &pps_h265;
1080*61046927SAndroid Build Coastguard Worker ret = vlVdpDecoderRenderH265(&desc.h265, (VdpPictureInfoHEVC *)picture_info);
1081*61046927SAndroid Build Coastguard Worker break;
1082*61046927SAndroid Build Coastguard Worker case PIPE_VIDEO_FORMAT_AV1:
1083*61046927SAndroid Build Coastguard Worker ret = vlVdpDecoderRenderAV1(&desc.av1, target, (VdpPictureInfoAV1 *)picture_info);
1084*61046927SAndroid Build Coastguard Worker break;
1085*61046927SAndroid Build Coastguard Worker default:
1086*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_DECODER_PROFILE;
1087*61046927SAndroid Build Coastguard Worker }
1088*61046927SAndroid Build Coastguard Worker
1089*61046927SAndroid Build Coastguard Worker if (ret != VDP_STATUS_OK)
1090*61046927SAndroid Build Coastguard Worker return ret;
1091*61046927SAndroid Build Coastguard Worker
1092*61046927SAndroid Build Coastguard Worker buffer_support[0] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
1093*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE);
1094*61046927SAndroid Build Coastguard Worker buffer_support[1] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
1095*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_SUPPORTS_INTERLACED);
1096*61046927SAndroid Build Coastguard Worker
1097*61046927SAndroid Build Coastguard Worker if (vlsurf->video_buffer == NULL ||
1098*61046927SAndroid Build Coastguard Worker !screen->is_video_format_supported(screen, vlsurf->video_buffer->buffer_format,
1099*61046927SAndroid Build Coastguard Worker dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM) ||
1100*61046927SAndroid Build Coastguard Worker !buffer_support[vlsurf->video_buffer->interlaced] ||
1101*61046927SAndroid Build Coastguard Worker (picture_interlaced && !vlsurf->video_buffer->interlaced && buffer_support[1])) {
1102*61046927SAndroid Build Coastguard Worker
1103*61046927SAndroid Build Coastguard Worker mtx_lock(&vlsurf->device->mutex);
1104*61046927SAndroid Build Coastguard Worker
1105*61046927SAndroid Build Coastguard Worker /* destroy the old one */
1106*61046927SAndroid Build Coastguard Worker if (vlsurf->video_buffer)
1107*61046927SAndroid Build Coastguard Worker vlsurf->video_buffer->destroy(vlsurf->video_buffer);
1108*61046927SAndroid Build Coastguard Worker
1109*61046927SAndroid Build Coastguard Worker /* set the buffer format to the prefered one */
1110*61046927SAndroid Build Coastguard Worker vlsurf->templat.buffer_format = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
1111*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_PREFERED_FORMAT);
1112*61046927SAndroid Build Coastguard Worker
1113*61046927SAndroid Build Coastguard Worker /* also set interlacing to decoders preferences */
1114*61046927SAndroid Build Coastguard Worker vlsurf->templat.interlaced = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
1115*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_PREFERS_INTERLACED) || picture_interlaced;
1116*61046927SAndroid Build Coastguard Worker
1117*61046927SAndroid Build Coastguard Worker /* and recreate the video buffer */
1118*61046927SAndroid Build Coastguard Worker vlsurf->video_buffer = dec->context->create_video_buffer(dec->context, &vlsurf->templat);
1119*61046927SAndroid Build Coastguard Worker
1120*61046927SAndroid Build Coastguard Worker /* still no luck? get me out of here... */
1121*61046927SAndroid Build Coastguard Worker if (!vlsurf->video_buffer) {
1122*61046927SAndroid Build Coastguard Worker mtx_unlock(&vlsurf->device->mutex);
1123*61046927SAndroid Build Coastguard Worker return VDP_STATUS_NO_IMPLEMENTATION;
1124*61046927SAndroid Build Coastguard Worker }
1125*61046927SAndroid Build Coastguard Worker vlVdpVideoSurfaceClear(vlsurf);
1126*61046927SAndroid Build Coastguard Worker mtx_unlock(&vlsurf->device->mutex);
1127*61046927SAndroid Build Coastguard Worker }
1128*61046927SAndroid Build Coastguard Worker
1129*61046927SAndroid Build Coastguard Worker mtx_lock(&vldecoder->mutex);
1130*61046927SAndroid Build Coastguard Worker dec->begin_frame(dec, vlsurf->video_buffer, &desc.base);
1131*61046927SAndroid Build Coastguard Worker dec->decode_bitstream(dec, vlsurf->video_buffer, &desc.base, bitstream_buffer_count, buffers, sizes);
1132*61046927SAndroid Build Coastguard Worker dec->end_frame(dec, vlsurf->video_buffer, &desc.base);
1133*61046927SAndroid Build Coastguard Worker mtx_unlock(&vldecoder->mutex);
1134*61046927SAndroid Build Coastguard Worker return ret;
1135*61046927SAndroid Build Coastguard Worker }
1136