2 * Copyright (c) 2007 Intel Corporation. All Rights Reserved.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sub license, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 #define TEST_DESCRIPTION "Sample MPEG2 VLD Decoding"
28 #include "test_common.c"
30 #include <sys/types.h>
39 /* Data dump of a 16x16 MPEG2 video clip,it has one I frame
41 static unsigned char mpeg2_clip[]={
42 0x00,0x00,0x01,0xb3,0x01,0x00,0x10,0x13,0xff,0xff,0xe0,0x18,0x00,0x00,0x01,0xb5,
43 0x14,0x8a,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xb8,0x00,0x08,0x00,0x00,0x00,0x00,
44 0x01,0x00,0x00,0x0f,0xff,0xf8,0x00,0x00,0x01,0xb5,0x8f,0xff,0xf3,0x41,0x80,0x00,
45 0x00,0x01,0x01,0x13,0xe1,0x00,0x15,0x81,0x54,0xe0,0x2a,0x05,0x43,0x00,0x2d,0x60,
46 0x18,0x01,0x4e,0x82,0xb9,0x58,0xb1,0x83,0x49,0xa4,0xa0,0x2e,0x05,0x80,0x4b,0x7a,
47 0x00,0x01,0x38,0x20,0x80,0xe8,0x05,0xff,0x60,0x18,0xe0,0x1d,0x80,0x98,0x01,0xf8,
48 0x06,0x00,0x54,0x02,0xc0,0x18,0x14,0x03,0xb2,0x92,0x80,0xc0,0x18,0x94,0x42,0x2c,
49 0xb2,0x11,0x64,0xa0,0x12,0x5e,0x78,0x03,0x3c,0x01,0x80,0x0e,0x80,0x18,0x80,0x6b,
50 0xca,0x4e,0x01,0x0f,0xe4,0x32,0xc9,0xbf,0x01,0x42,0x69,0x43,0x50,0x4b,0x01,0xc9,
51 0x45,0x80,0x50,0x01,0x38,0x65,0xe8,0x01,0x03,0xf3,0xc0,0x76,0x00,0xe0,0x03,0x20,
52 0x28,0x18,0x01,0xa9,0x34,0x04,0xc5,0xe0,0x0b,0x0b,0x04,0x20,0x06,0xc0,0x89,0xff,
53 0x60,0x12,0x12,0x8a,0x2c,0x34,0x11,0xff,0xf6,0xe2,0x40,0xc0,0x30,0x1b,0x7a,0x01,
54 0xa9,0x0d,0x00,0xac,0x64
57 /* hardcoded here without a bitstream parser helper
58 * please see picture mpeg2-I.jpg for bitstream details
60 static VAPictureParameterBufferMPEG2 pic_param={
63 forward_reference_picture:0xffffffff,
64 backward_reference_picture:0xffffffff,
65 picture_coding_type:1,
72 frame_pred_frame_dct:1,
73 concealment_motion_vectors:0,
84 /* see MPEG2 spec65 for the defines of matrix */
85 static VAIQMatrixBufferMPEG2 iq_matrix = {
86 load_intra_quantiser_matrix:1,
87 load_non_intra_quantiser_matrix:1,
88 load_chroma_intra_quantiser_matrix:0,
89 load_chroma_non_intra_quantiser_matrix:0,
90 intra_quantiser_matrix:{
91 8, 16, 16, 19, 16, 19, 22, 22,
92 22, 22, 22, 22, 26, 24, 26, 27,
93 27, 27, 26, 26, 26, 26, 27, 27,
94 27, 29, 29, 29, 34, 34, 34, 29,
95 29, 29, 27, 27, 29, 29, 32, 32,
96 34, 34, 37, 38, 37, 35, 35, 34,
97 35, 38, 38, 40, 40, 40, 48, 48,
98 46, 46, 56, 56, 58, 69, 69, 83
100 non_intra_quantiser_matrix:{16},
101 chroma_intra_quantiser_matrix:{0},
102 chroma_non_intra_quantiser_matrix:{0}
105 static VASliceParameterBufferMPEG2 slice_param={
109 macroblock_offset:38,/* 4byte + 6bits=38bits */
110 slice_vertical_position:0,
111 quantiser_scale_code:2,
115 #define CLIP_WIDTH 16
116 #define CLIP_HEIGHT 16
118 int surf_width=CLIP_WIDTH,surf_height=CLIP_HEIGHT;
119 int win_width=CLIP_WIDTH<<1,win_height=CLIP_HEIGHT<<1;
123 VAEntrypoint entrypoints[5];
124 int num_entrypoints,vld_entrypoint;
125 VAConfigAttrib attrib;
126 VAConfigID config_id;
127 VASurfaceID vaSurface;
128 VAContextID vaContext;
129 VABufferID vaPicParamBuf,vaIQMatrixBuf,vaSliceParamBuf,vaSliceDataBuf;
132 va_status = vaQueryConfigEntrypoints(va_dpy, VAProfileMPEG2Main, entrypoints,
134 ASSERT( VA_STATUS_SUCCESS == va_status );
136 for (vld_entrypoint = 0; vld_entrypoint < num_entrypoints; vld_entrypoint++) {
137 if (entrypoints[vld_entrypoint] == VAEntrypointVLD)
140 if (vld_entrypoint == num_entrypoints) {
141 /* not find VLD entry point */
145 /* Assuming finding VLD, find out the format for the render target */
146 attrib.type = VAConfigAttribRTFormat;
147 va_status = vaGetConfigAttributes(va_dpy, VAProfileMPEG2Main, VAEntrypointVLD,
149 ASSERT( VA_STATUS_SUCCESS == va_status );
150 if ((attrib.value & VA_RT_FORMAT_YUV420) == 0) {
151 /* not find desired YUV420 RT format */
155 va_status = vaCreateConfig(va_dpy, VAProfileMPEG2Main, VAEntrypointVLD,
156 &attrib, 1,&config_id);
157 ASSERT( VA_STATUS_SUCCESS == va_status );
159 va_status = vaCreateSurfaces(va_dpy,surf_width,surf_height,
160 VA_RT_FORMAT_YUV420, 1, &vaSurface);
161 ASSERT( VA_STATUS_SUCCESS == va_status );
163 /* Create a context for this decode pipe */
164 va_status = vaCreateContext(va_dpy, config_id,
166 ((CLIP_HEIGHT+15)/16)*16,
171 ASSERT( VA_STATUS_SUCCESS == va_status );
173 va_status = vaCreateBuffer(va_dpy, vaContext,
174 VAPictureParameterBufferType,
175 sizeof(VAPictureParameterBufferMPEG2),
178 ASSERT( VA_STATUS_SUCCESS == va_status );
180 va_status = vaCreateBuffer(va_dpy, vaContext,
181 VAIQMatrixBufferType,
182 sizeof(VAIQMatrixBufferMPEG2),
185 ASSERT( VA_STATUS_SUCCESS == va_status );
187 va_status = vaCreateBuffer(va_dpy, vaContext,
188 VASliceParameterBufferType,
189 sizeof(VASliceParameterBufferMPEG2),
191 &slice_param, &vaSliceParamBuf);
192 ASSERT( VA_STATUS_SUCCESS == va_status );
194 va_status = vaCreateBuffer(va_dpy, vaContext,
195 VASliceDataBufferType,
200 ASSERT( VA_STATUS_SUCCESS == va_status );
202 va_status = vaBeginPicture(va_dpy, vaContext, vaSurface);
203 ASSERT( VA_STATUS_SUCCESS == va_status );
205 va_status = vaRenderPicture(va_dpy,vaContext, &vaPicParamBuf, 1);
206 ASSERT( VA_STATUS_SUCCESS == va_status );
208 va_status = vaRenderPicture(va_dpy,vaContext, &vaIQMatrixBuf, 1);
209 ASSERT( VA_STATUS_SUCCESS == va_status );
211 va_status = vaRenderPicture(va_dpy,vaContext, &vaSliceParamBuf, 1);
212 ASSERT( VA_STATUS_SUCCESS == va_status );
214 va_status = vaRenderPicture(va_dpy,vaContext, &vaSliceDataBuf, 1);
215 ASSERT( VA_STATUS_SUCCESS == va_status );
217 va_status = vaEndPicture(va_dpy,vaContext);
218 ASSERT( VA_STATUS_SUCCESS == va_status );
220 va_status = vaSyncSurface(va_dpy, vaContext, vaSurface);
221 ASSERT( VA_STATUS_SUCCESS == va_status );
223 win = XCreateSimpleWindow(dpy, RootWindow(dpy, 0), 0, 0,
224 win_width,win_height, 0, 0, WhitePixel(dpy, 0));
225 XMapWindow(dpy, win);
228 va_status = vaPutSurface(va_dpy, vaSurface, win,
229 0,0,surf_width,surf_height,
230 0,0,win_width,win_height,
232 ASSERT( VA_STATUS_SUCCESS == va_status );
234 printf("press any key to exit\n");
237 vaDestroySurfaces(va_dpy,&vaSurface,1);
238 vaDestroyConfig(va_dpy,config_id);
239 vaDestroyContext(va_dpy,vaContext);