1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 Younes Manton.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <assert.h>
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdio.h>
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <string.h>
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <error.h>
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/time.h>
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "testlib.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MACROBLOCK_WIDTH		16
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MACROBLOCK_HEIGHT		16
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BLOCKS_PER_MACROBLOCK		6
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEFAULT_INPUT_WIDTH		720
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEFAULT_INPUT_HEIGHT		480
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEFAULT_REPS			100
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PIPELINE_STEP_MC		1
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PIPELINE_STEP_CSC		2
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PIPELINE_STEP_SWAP		4
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MB_TYPE_I			1
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MB_TYPE_P			2
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MB_TYPE_B			4
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct Config
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int input_width;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int input_height;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int output_width;
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int output_height;
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int pipeline;
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int mb_types;
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int reps;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid ParseArgs(int argc, char **argv, struct Config *config);
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid ParseArgs(int argc, char **argv, struct Config *config)
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int fail = 0;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	config->input_width = DEFAULT_INPUT_WIDTH;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	config->input_height = DEFAULT_INPUT_HEIGHT;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	config->output_width = 0;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	config->output_height = 0;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	config->pipeline = 0;
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	config->mb_types = 0;
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	config->reps = DEFAULT_REPS;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = 1; i < argc && !fail; ++i)
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (!strcmp(argv[i], "-iw"))
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (sscanf(argv[++i], "%u", &config->input_width) != 1)
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				fail = 1;
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if (!strcmp(argv[i], "-ih"))
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (sscanf(argv[++i], "%u", &config->input_height) != 1)
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				fail = 1;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if (!strcmp(argv[i], "-ow"))
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (sscanf(argv[++i], "%u", &config->output_width) != 1)
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				fail = 1;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if (!strcmp(argv[i], "-oh"))
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (sscanf(argv[++i], "%u", &config->output_height) != 1)
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				fail = 1;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if (!strcmp(argv[i], "-p"))
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			char *token = strtok(argv[++i], ",");
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			while (token && !fail)
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (!strcmp(token, "mc"))
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					config->pipeline |= PIPELINE_STEP_MC;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				else if (!strcmp(token, "csc"))
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					config->pipeline |= PIPELINE_STEP_CSC;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				else if (!strcmp(token, "swp"))
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					config->pipeline |= PIPELINE_STEP_SWAP;
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				else
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					fail = 1;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (!fail)
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					token = strtok(NULL, ",");
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if (!strcmp(argv[i], "-mb"))
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			char *token = strtok(argv[++i], ",");
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			while (token && !fail)
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (strcmp(token, "i"))
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					config->mb_types |= MB_TYPE_I;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				else if (strcmp(token, "p"))
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					config->mb_types |= MB_TYPE_P;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				else if (strcmp(token, "b"))
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					config->mb_types |= MB_TYPE_B;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				else
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					fail = 1;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (!fail)
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					token = strtok(NULL, ",");
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if (!strcmp(argv[i], "-r"))
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (sscanf(argv[++i], "%u", &config->reps) != 1)
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				fail = 1;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			fail = 1;
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (fail)
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		error
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		(
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			1, 0,
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			"Bad argument.\n"
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			"\n"
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			"Usage: %s [options]\n"
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			"\t-iw <width>\tInput width\n"
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			"\t-ih <height>\tInput height\n"
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			"\t-ow <width>\tOutput width\n"
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			"\t-oh <height>\tOutput height\n"
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			"\t-p <pipeline>\tPipeline to test\n"
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			"\t-mb <mb type>\tMacroBlock types to use\n"
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			"\t-r <reps>\tRepetitions\n\n"
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			"\tPipeline steps: mc,csc,swap\n"
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			"\tMB types: i,p,b\n",
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			argv[0]
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		);
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (config->output_width == 0)
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		config->output_width = config->input_width;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (config->output_height == 0)
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		config->output_height = config->input_height;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!config->pipeline)
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		config->pipeline = PIPELINE_STEP_MC | PIPELINE_STEP_CSC | PIPELINE_STEP_SWAP;
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!config->mb_types)
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		config->mb_types = MB_TYPE_I | MB_TYPE_P | MB_TYPE_B;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint main(int argc, char **argv)
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct Config		config;
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	Display			*display;
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	Window			root, window;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	const unsigned int	mc_types[2] = {XVMC_MOCOMP | XVMC_MPEG_2, XVMC_IDCT | XVMC_MPEG_2};
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	XvPortID		port_num;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int			surface_type_id;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int		is_overlay, intra_unsigned;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int			colorkey;
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	XvMCContext		context;
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	XvMCSurface		surface;
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	XvMCBlockArray		block_array;
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	XvMCMacroBlockArray	mb_array;
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int		mbw, mbh;
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int		mbx, mby;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int		reps;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct timeval		start, stop, diff;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	double			diff_secs;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ParseArgs(argc, argv, &config);
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	mbw = align(config.input_width, MACROBLOCK_WIDTH) / MACROBLOCK_WIDTH;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	mbh = align(config.input_height, MACROBLOCK_HEIGHT) / MACROBLOCK_HEIGHT;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	display = XOpenDisplay(NULL);
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!GetPort
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	(
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		display,
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		config.input_width,
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		config.input_height,
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		XVMC_CHROMA_FORMAT_420,
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		mc_types,
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		2,
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		&port_num,
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		&surface_type_id,
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		&is_overlay,
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		&intra_unsigned
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	))
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		XCloseDisplay(display);
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		error(1, 0, "Error, unable to find a good port.\n");
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (is_overlay)
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		Atom xv_colorkey = XInternAtom(display, "XV_COLORKEY", 0);
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		XvGetPortAttribute(display, port_num, xv_colorkey, &colorkey);
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	root = XDefaultRootWindow(display);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	window = XCreateSimpleWindow(display, root, 0, 0, config.output_width, config.output_height, 0, 0, colorkey);
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(XvMCCreateContext(display, port_num, surface_type_id, config.input_width, config.input_height, XVMC_DIRECT, &context) == Success);
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(XvMCCreateSurface(display, &context, &surface) == Success);
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(XvMCCreateBlocks(display, &context, mbw * mbh * BLOCKS_PER_MACROBLOCK, &block_array) == Success);
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(XvMCCreateMacroBlocks(display, &context, mbw * mbh, &mb_array) == Success);
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (mby = 0; mby < mbh; ++mby)
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (mbx = 0; mbx < mbw; ++mbx)
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			mb_array.macro_blocks[mby * mbw + mbx].x = mbx;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			mb_array.macro_blocks[mby * mbw + mbx].y = mby;
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			mb_array.macro_blocks[mby * mbw + mbx].macroblock_type = XVMC_MB_TYPE_INTRA;
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/*mb->motion_type = ;*/
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/*mb->motion_vertical_field_select = ;*/
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			mb_array.macro_blocks[mby * mbw + mbx].dct_type = XVMC_DCT_TYPE_FRAME;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			/*mb->PMV[0][0][0] = ;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			mb->PMV[0][0][1] = ;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			mb->PMV[0][1][0] = ;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			mb->PMV[0][1][1] = ;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			mb->PMV[1][0][0] = ;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			mb->PMV[1][0][1] = ;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			mb->PMV[1][1][0] = ;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			mb->PMV[1][1][1] = ;*/
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			mb_array.macro_blocks[mby * mbw + mbx].index = (mby * mbw + mbx) * BLOCKS_PER_MACROBLOCK;
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			mb_array.macro_blocks[mby * mbw + mbx].coded_block_pattern = 0x3F;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	XSelectInput(display, window, ExposureMask | KeyPressMask);
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	XMapWindow(display, window);
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	XSync(display, 0);
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	gettimeofday(&start, NULL);
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (reps = 0; reps < config.reps; ++reps)
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (config.pipeline & PIPELINE_STEP_MC)
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			assert(XvMCRenderSurface(display, &context, XVMC_FRAME_PICTURE, &surface, NULL, NULL, 0, mbw * mbh, 0, &mb_array, &block_array) == Success);
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			assert(XvMCFlushSurface(display, &surface) == Success);
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (config.pipeline & PIPELINE_STEP_CSC)
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			assert(XvMCPutSurface(display, &surface, window, 0, 0, config.input_width, config.input_height, 0, 0, config.output_width, config.output_height, XVMC_FRAME_PICTURE) == Success);
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	gettimeofday(&stop, NULL);
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	timeval_subtract(&diff, &stop, &start);
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	diff_secs = (double)diff.tv_sec + (double)diff.tv_usec / 1000000.0;
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	printf("XvMC Benchmark\n");
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	printf("Input: %u,%u\nOutput: %u,%u\n", config.input_width, config.input_height, config.output_width, config.output_height);
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	printf("Pipeline: ");
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (config.pipeline & PIPELINE_STEP_MC)
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		printf("|mc|");
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (config.pipeline & PIPELINE_STEP_CSC)
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		printf("|csc|");
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (config.pipeline & PIPELINE_STEP_SWAP)
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		printf("|swap|");
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	printf("\n");
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	printf("Reps: %u\n", config.reps);
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	printf("Total time: %.2lf (%.2lf reps / sec)\n", diff_secs, config.reps / diff_secs);
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(XvMCDestroyBlocks(display, &block_array) == Success);
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(XvMCDestroyMacroBlocks(display, &mb_array) == Success);
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(XvMCDestroySurface(display, &surface) == Success);
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(XvMCDestroyContext(display, &context) == Success);
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	XvUngrabPort(display, port_num, CurrentTime);
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	XDestroyWindow(display, window);
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	XCloseDisplay(display);
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return 0;
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
301