162074f44bb5944593b65d6203deae6300bead42dYounes Manton/************************************************************************** 2dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König * 362074f44bb5944593b65d6203deae6300bead42dYounes Manton * Copyright 2009 Younes Manton. 462074f44bb5944593b65d6203deae6300bead42dYounes Manton * All Rights Reserved. 5dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König * 662074f44bb5944593b65d6203deae6300bead42dYounes Manton * Permission is hereby granted, free of charge, to any person obtaining a 762074f44bb5944593b65d6203deae6300bead42dYounes Manton * copy of this software and associated documentation files (the 862074f44bb5944593b65d6203deae6300bead42dYounes Manton * "Software"), to deal in the Software without restriction, including 962074f44bb5944593b65d6203deae6300bead42dYounes Manton * without limitation the rights to use, copy, modify, merge, publish, 1062074f44bb5944593b65d6203deae6300bead42dYounes Manton * distribute, sub license, and/or sell copies of the Software, and to 1162074f44bb5944593b65d6203deae6300bead42dYounes Manton * permit persons to whom the Software is furnished to do so, subject to 1262074f44bb5944593b65d6203deae6300bead42dYounes Manton * the following conditions: 13dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König * 1462074f44bb5944593b65d6203deae6300bead42dYounes Manton * The above copyright notice and this permission notice (including the 1562074f44bb5944593b65d6203deae6300bead42dYounes Manton * next paragraph) shall be included in all copies or substantial portions 1662074f44bb5944593b65d6203deae6300bead42dYounes Manton * of the Software. 17dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König * 1862074f44bb5944593b65d6203deae6300bead42dYounes Manton * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1962074f44bb5944593b65d6203deae6300bead42dYounes Manton * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2062074f44bb5944593b65d6203deae6300bead42dYounes Manton * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2162074f44bb5944593b65d6203deae6300bead42dYounes Manton * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2262074f44bb5944593b65d6203deae6300bead42dYounes Manton * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2362074f44bb5944593b65d6203deae6300bead42dYounes Manton * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2462074f44bb5944593b65d6203deae6300bead42dYounes Manton * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König * 2662074f44bb5944593b65d6203deae6300bead42dYounes Manton **************************************************************************/ 2762074f44bb5944593b65d6203deae6300bead42dYounes Manton 2862074f44bb5944593b65d6203deae6300bead42dYounes Manton#include <assert.h> 2962074f44bb5944593b65d6203deae6300bead42dYounes Manton#include <stdio.h> 3062074f44bb5944593b65d6203deae6300bead42dYounes Manton#include <string.h> 3162074f44bb5944593b65d6203deae6300bead42dYounes Manton#include <error.h> 3262074f44bb5944593b65d6203deae6300bead42dYounes Manton#include <sys/time.h> 3362074f44bb5944593b65d6203deae6300bead42dYounes Manton#include "testlib.h" 3462074f44bb5944593b65d6203deae6300bead42dYounes Manton 3562074f44bb5944593b65d6203deae6300bead42dYounes Manton#define MACROBLOCK_WIDTH 16 3662074f44bb5944593b65d6203deae6300bead42dYounes Manton#define MACROBLOCK_HEIGHT 16 3762074f44bb5944593b65d6203deae6300bead42dYounes Manton#define BLOCKS_PER_MACROBLOCK 6 3862074f44bb5944593b65d6203deae6300bead42dYounes Manton 3962074f44bb5944593b65d6203deae6300bead42dYounes Manton#define DEFAULT_INPUT_WIDTH 720 4062074f44bb5944593b65d6203deae6300bead42dYounes Manton#define DEFAULT_INPUT_HEIGHT 480 4162074f44bb5944593b65d6203deae6300bead42dYounes Manton#define DEFAULT_REPS 100 4262074f44bb5944593b65d6203deae6300bead42dYounes Manton 4362074f44bb5944593b65d6203deae6300bead42dYounes Manton#define PIPELINE_STEP_MC 1 4462074f44bb5944593b65d6203deae6300bead42dYounes Manton#define PIPELINE_STEP_CSC 2 4562074f44bb5944593b65d6203deae6300bead42dYounes Manton#define PIPELINE_STEP_SWAP 4 4662074f44bb5944593b65d6203deae6300bead42dYounes Manton 4762074f44bb5944593b65d6203deae6300bead42dYounes Manton#define MB_TYPE_I 1 4862074f44bb5944593b65d6203deae6300bead42dYounes Manton#define MB_TYPE_P 2 4962074f44bb5944593b65d6203deae6300bead42dYounes Manton#define MB_TYPE_B 4 5062074f44bb5944593b65d6203deae6300bead42dYounes Manton 5162074f44bb5944593b65d6203deae6300bead42dYounes Mantonstruct Config 5262074f44bb5944593b65d6203deae6300bead42dYounes Manton{ 5362074f44bb5944593b65d6203deae6300bead42dYounes Manton unsigned int input_width; 5462074f44bb5944593b65d6203deae6300bead42dYounes Manton unsigned int input_height; 5562074f44bb5944593b65d6203deae6300bead42dYounes Manton unsigned int output_width; 5662074f44bb5944593b65d6203deae6300bead42dYounes Manton unsigned int output_height; 5762074f44bb5944593b65d6203deae6300bead42dYounes Manton unsigned int pipeline; 5862074f44bb5944593b65d6203deae6300bead42dYounes Manton unsigned int mb_types; 5962074f44bb5944593b65d6203deae6300bead42dYounes Manton unsigned int reps; 6062074f44bb5944593b65d6203deae6300bead42dYounes Manton}; 6162074f44bb5944593b65d6203deae6300bead42dYounes Manton 6262074f44bb5944593b65d6203deae6300bead42dYounes Mantonvoid ParseArgs(int argc, char **argv, struct Config *config); 6362074f44bb5944593b65d6203deae6300bead42dYounes Manton 6462074f44bb5944593b65d6203deae6300bead42dYounes Mantonvoid ParseArgs(int argc, char **argv, struct Config *config) 6562074f44bb5944593b65d6203deae6300bead42dYounes Manton{ 6662074f44bb5944593b65d6203deae6300bead42dYounes Manton int fail = 0; 6762074f44bb5944593b65d6203deae6300bead42dYounes Manton int i; 6862074f44bb5944593b65d6203deae6300bead42dYounes Manton 6962074f44bb5944593b65d6203deae6300bead42dYounes Manton config->input_width = DEFAULT_INPUT_WIDTH; 7062074f44bb5944593b65d6203deae6300bead42dYounes Manton config->input_height = DEFAULT_INPUT_HEIGHT; 7162074f44bb5944593b65d6203deae6300bead42dYounes Manton config->output_width = 0; 7262074f44bb5944593b65d6203deae6300bead42dYounes Manton config->output_height = 0; 7362074f44bb5944593b65d6203deae6300bead42dYounes Manton config->pipeline = 0; 7462074f44bb5944593b65d6203deae6300bead42dYounes Manton config->mb_types = 0; 7562074f44bb5944593b65d6203deae6300bead42dYounes Manton config->reps = DEFAULT_REPS; 7662074f44bb5944593b65d6203deae6300bead42dYounes Manton 7762074f44bb5944593b65d6203deae6300bead42dYounes Manton for (i = 1; i < argc && !fail; ++i) 7862074f44bb5944593b65d6203deae6300bead42dYounes Manton { 7962074f44bb5944593b65d6203deae6300bead42dYounes Manton if (!strcmp(argv[i], "-iw")) 8062074f44bb5944593b65d6203deae6300bead42dYounes Manton { 8162074f44bb5944593b65d6203deae6300bead42dYounes Manton if (sscanf(argv[++i], "%u", &config->input_width) != 1) 8262074f44bb5944593b65d6203deae6300bead42dYounes Manton fail = 1; 8362074f44bb5944593b65d6203deae6300bead42dYounes Manton } 8462074f44bb5944593b65d6203deae6300bead42dYounes Manton else if (!strcmp(argv[i], "-ih")) 8562074f44bb5944593b65d6203deae6300bead42dYounes Manton { 8662074f44bb5944593b65d6203deae6300bead42dYounes Manton if (sscanf(argv[++i], "%u", &config->input_height) != 1) 8762074f44bb5944593b65d6203deae6300bead42dYounes Manton fail = 1; 8862074f44bb5944593b65d6203deae6300bead42dYounes Manton } 8962074f44bb5944593b65d6203deae6300bead42dYounes Manton else if (!strcmp(argv[i], "-ow")) 9062074f44bb5944593b65d6203deae6300bead42dYounes Manton { 9162074f44bb5944593b65d6203deae6300bead42dYounes Manton if (sscanf(argv[++i], "%u", &config->output_width) != 1) 9262074f44bb5944593b65d6203deae6300bead42dYounes Manton fail = 1; 9362074f44bb5944593b65d6203deae6300bead42dYounes Manton } 9462074f44bb5944593b65d6203deae6300bead42dYounes Manton else if (!strcmp(argv[i], "-oh")) 9562074f44bb5944593b65d6203deae6300bead42dYounes Manton { 9662074f44bb5944593b65d6203deae6300bead42dYounes Manton if (sscanf(argv[++i], "%u", &config->output_height) != 1) 9762074f44bb5944593b65d6203deae6300bead42dYounes Manton fail = 1; 9862074f44bb5944593b65d6203deae6300bead42dYounes Manton } 9962074f44bb5944593b65d6203deae6300bead42dYounes Manton else if (!strcmp(argv[i], "-p")) 10062074f44bb5944593b65d6203deae6300bead42dYounes Manton { 10162074f44bb5944593b65d6203deae6300bead42dYounes Manton char *token = strtok(argv[++i], ","); 10262074f44bb5944593b65d6203deae6300bead42dYounes Manton 10362074f44bb5944593b65d6203deae6300bead42dYounes Manton while (token && !fail) 10462074f44bb5944593b65d6203deae6300bead42dYounes Manton { 10562074f44bb5944593b65d6203deae6300bead42dYounes Manton if (!strcmp(token, "mc")) 10662074f44bb5944593b65d6203deae6300bead42dYounes Manton config->pipeline |= PIPELINE_STEP_MC; 10762074f44bb5944593b65d6203deae6300bead42dYounes Manton else if (!strcmp(token, "csc")) 10862074f44bb5944593b65d6203deae6300bead42dYounes Manton config->pipeline |= PIPELINE_STEP_CSC; 10962074f44bb5944593b65d6203deae6300bead42dYounes Manton else if (!strcmp(token, "swp")) 11062074f44bb5944593b65d6203deae6300bead42dYounes Manton config->pipeline |= PIPELINE_STEP_SWAP; 11162074f44bb5944593b65d6203deae6300bead42dYounes Manton else 11262074f44bb5944593b65d6203deae6300bead42dYounes Manton fail = 1; 11362074f44bb5944593b65d6203deae6300bead42dYounes Manton 11462074f44bb5944593b65d6203deae6300bead42dYounes Manton if (!fail) 11562074f44bb5944593b65d6203deae6300bead42dYounes Manton token = strtok(NULL, ","); 11662074f44bb5944593b65d6203deae6300bead42dYounes Manton } 11762074f44bb5944593b65d6203deae6300bead42dYounes Manton } 11862074f44bb5944593b65d6203deae6300bead42dYounes Manton else if (!strcmp(argv[i], "-mb")) 11962074f44bb5944593b65d6203deae6300bead42dYounes Manton { 12062074f44bb5944593b65d6203deae6300bead42dYounes Manton char *token = strtok(argv[++i], ","); 12162074f44bb5944593b65d6203deae6300bead42dYounes Manton 12262074f44bb5944593b65d6203deae6300bead42dYounes Manton while (token && !fail) 12362074f44bb5944593b65d6203deae6300bead42dYounes Manton { 12462074f44bb5944593b65d6203deae6300bead42dYounes Manton if (strcmp(token, "i")) 12562074f44bb5944593b65d6203deae6300bead42dYounes Manton config->mb_types |= MB_TYPE_I; 12662074f44bb5944593b65d6203deae6300bead42dYounes Manton else if (strcmp(token, "p")) 12762074f44bb5944593b65d6203deae6300bead42dYounes Manton config->mb_types |= MB_TYPE_P; 12862074f44bb5944593b65d6203deae6300bead42dYounes Manton else if (strcmp(token, "b")) 12962074f44bb5944593b65d6203deae6300bead42dYounes Manton config->mb_types |= MB_TYPE_B; 13062074f44bb5944593b65d6203deae6300bead42dYounes Manton else 13162074f44bb5944593b65d6203deae6300bead42dYounes Manton fail = 1; 13262074f44bb5944593b65d6203deae6300bead42dYounes Manton 13362074f44bb5944593b65d6203deae6300bead42dYounes Manton if (!fail) 13462074f44bb5944593b65d6203deae6300bead42dYounes Manton token = strtok(NULL, ","); 13562074f44bb5944593b65d6203deae6300bead42dYounes Manton } 13662074f44bb5944593b65d6203deae6300bead42dYounes Manton } 13762074f44bb5944593b65d6203deae6300bead42dYounes Manton else if (!strcmp(argv[i], "-r")) 13862074f44bb5944593b65d6203deae6300bead42dYounes Manton { 13962074f44bb5944593b65d6203deae6300bead42dYounes Manton if (sscanf(argv[++i], "%u", &config->reps) != 1) 14062074f44bb5944593b65d6203deae6300bead42dYounes Manton fail = 1; 14162074f44bb5944593b65d6203deae6300bead42dYounes Manton } 14262074f44bb5944593b65d6203deae6300bead42dYounes Manton else 14362074f44bb5944593b65d6203deae6300bead42dYounes Manton fail = 1; 14462074f44bb5944593b65d6203deae6300bead42dYounes Manton } 14562074f44bb5944593b65d6203deae6300bead42dYounes Manton 14662074f44bb5944593b65d6203deae6300bead42dYounes Manton if (fail) 14762074f44bb5944593b65d6203deae6300bead42dYounes Manton error 14862074f44bb5944593b65d6203deae6300bead42dYounes Manton ( 14962074f44bb5944593b65d6203deae6300bead42dYounes Manton 1, 0, 15062074f44bb5944593b65d6203deae6300bead42dYounes Manton "Bad argument.\n" 15162074f44bb5944593b65d6203deae6300bead42dYounes Manton "\n" 15262074f44bb5944593b65d6203deae6300bead42dYounes Manton "Usage: %s [options]\n" 15362074f44bb5944593b65d6203deae6300bead42dYounes Manton "\t-iw <width>\tInput width\n" 15462074f44bb5944593b65d6203deae6300bead42dYounes Manton "\t-ih <height>\tInput height\n" 15562074f44bb5944593b65d6203deae6300bead42dYounes Manton "\t-ow <width>\tOutput width\n" 15662074f44bb5944593b65d6203deae6300bead42dYounes Manton "\t-oh <height>\tOutput height\n" 15762074f44bb5944593b65d6203deae6300bead42dYounes Manton "\t-p <pipeline>\tPipeline to test\n" 15862074f44bb5944593b65d6203deae6300bead42dYounes Manton "\t-mb <mb type>\tMacroBlock types to use\n" 15962074f44bb5944593b65d6203deae6300bead42dYounes Manton "\t-r <reps>\tRepetitions\n\n" 16062074f44bb5944593b65d6203deae6300bead42dYounes Manton "\tPipeline steps: mc,csc,swap\n" 16162074f44bb5944593b65d6203deae6300bead42dYounes Manton "\tMB types: i,p,b\n", 16262074f44bb5944593b65d6203deae6300bead42dYounes Manton argv[0] 16362074f44bb5944593b65d6203deae6300bead42dYounes Manton ); 16462074f44bb5944593b65d6203deae6300bead42dYounes Manton 16562074f44bb5944593b65d6203deae6300bead42dYounes Manton if (config->output_width == 0) 16662074f44bb5944593b65d6203deae6300bead42dYounes Manton config->output_width = config->input_width; 16762074f44bb5944593b65d6203deae6300bead42dYounes Manton if (config->output_height == 0) 16862074f44bb5944593b65d6203deae6300bead42dYounes Manton config->output_height = config->input_height; 16962074f44bb5944593b65d6203deae6300bead42dYounes Manton if (!config->pipeline) 17062074f44bb5944593b65d6203deae6300bead42dYounes Manton config->pipeline = PIPELINE_STEP_MC | PIPELINE_STEP_CSC | PIPELINE_STEP_SWAP; 17162074f44bb5944593b65d6203deae6300bead42dYounes Manton if (!config->mb_types) 17262074f44bb5944593b65d6203deae6300bead42dYounes Manton config->mb_types = MB_TYPE_I | MB_TYPE_P | MB_TYPE_B; 17362074f44bb5944593b65d6203deae6300bead42dYounes Manton} 17462074f44bb5944593b65d6203deae6300bead42dYounes Manton 17562074f44bb5944593b65d6203deae6300bead42dYounes Mantonint main(int argc, char **argv) 17662074f44bb5944593b65d6203deae6300bead42dYounes Manton{ 17762074f44bb5944593b65d6203deae6300bead42dYounes Manton struct Config config; 17862074f44bb5944593b65d6203deae6300bead42dYounes Manton Display *display; 17962074f44bb5944593b65d6203deae6300bead42dYounes Manton Window root, window; 18062074f44bb5944593b65d6203deae6300bead42dYounes Manton const unsigned int mc_types[2] = {XVMC_MOCOMP | XVMC_MPEG_2, XVMC_IDCT | XVMC_MPEG_2}; 18162074f44bb5944593b65d6203deae6300bead42dYounes Manton XvPortID port_num; 18262074f44bb5944593b65d6203deae6300bead42dYounes Manton int surface_type_id; 18362074f44bb5944593b65d6203deae6300bead42dYounes Manton unsigned int is_overlay, intra_unsigned; 18462074f44bb5944593b65d6203deae6300bead42dYounes Manton int colorkey; 18562074f44bb5944593b65d6203deae6300bead42dYounes Manton XvMCContext context; 18662074f44bb5944593b65d6203deae6300bead42dYounes Manton XvMCSurface surface; 18762074f44bb5944593b65d6203deae6300bead42dYounes Manton XvMCBlockArray block_array; 18862074f44bb5944593b65d6203deae6300bead42dYounes Manton XvMCMacroBlockArray mb_array; 18962074f44bb5944593b65d6203deae6300bead42dYounes Manton unsigned int mbw, mbh; 19062074f44bb5944593b65d6203deae6300bead42dYounes Manton unsigned int mbx, mby; 19162074f44bb5944593b65d6203deae6300bead42dYounes Manton unsigned int reps; 19262074f44bb5944593b65d6203deae6300bead42dYounes Manton struct timeval start, stop, diff; 19362074f44bb5944593b65d6203deae6300bead42dYounes Manton double diff_secs; 19462074f44bb5944593b65d6203deae6300bead42dYounes Manton 19562074f44bb5944593b65d6203deae6300bead42dYounes Manton ParseArgs(argc, argv, &config); 19662074f44bb5944593b65d6203deae6300bead42dYounes Manton 19762074f44bb5944593b65d6203deae6300bead42dYounes Manton mbw = align(config.input_width, MACROBLOCK_WIDTH) / MACROBLOCK_WIDTH; 19862074f44bb5944593b65d6203deae6300bead42dYounes Manton mbh = align(config.input_height, MACROBLOCK_HEIGHT) / MACROBLOCK_HEIGHT; 19962074f44bb5944593b65d6203deae6300bead42dYounes Manton 20062074f44bb5944593b65d6203deae6300bead42dYounes Manton display = XOpenDisplay(NULL); 20162074f44bb5944593b65d6203deae6300bead42dYounes Manton 20262074f44bb5944593b65d6203deae6300bead42dYounes Manton if (!GetPort 20362074f44bb5944593b65d6203deae6300bead42dYounes Manton ( 20462074f44bb5944593b65d6203deae6300bead42dYounes Manton display, 20562074f44bb5944593b65d6203deae6300bead42dYounes Manton config.input_width, 20662074f44bb5944593b65d6203deae6300bead42dYounes Manton config.input_height, 20762074f44bb5944593b65d6203deae6300bead42dYounes Manton XVMC_CHROMA_FORMAT_420, 208dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König mc_types, 209dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König 2, 210dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König &port_num, 211dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König &surface_type_id, 212dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König &is_overlay, 213dcf8ee7d6ac89bb2a9d608618a51604a3c78fe96Christian König &intra_unsigned 21462074f44bb5944593b65d6203deae6300bead42dYounes Manton )) 21562074f44bb5944593b65d6203deae6300bead42dYounes Manton { 21662074f44bb5944593b65d6203deae6300bead42dYounes Manton XCloseDisplay(display); 21762074f44bb5944593b65d6203deae6300bead42dYounes Manton error(1, 0, "Error, unable to find a good port.\n"); 21862074f44bb5944593b65d6203deae6300bead42dYounes Manton } 21962074f44bb5944593b65d6203deae6300bead42dYounes Manton 22062074f44bb5944593b65d6203deae6300bead42dYounes Manton if (is_overlay) 22162074f44bb5944593b65d6203deae6300bead42dYounes Manton { 22262074f44bb5944593b65d6203deae6300bead42dYounes Manton Atom xv_colorkey = XInternAtom(display, "XV_COLORKEY", 0); 22362074f44bb5944593b65d6203deae6300bead42dYounes Manton XvGetPortAttribute(display, port_num, xv_colorkey, &colorkey); 22462074f44bb5944593b65d6203deae6300bead42dYounes Manton } 22562074f44bb5944593b65d6203deae6300bead42dYounes Manton 22662074f44bb5944593b65d6203deae6300bead42dYounes Manton root = XDefaultRootWindow(display); 22762074f44bb5944593b65d6203deae6300bead42dYounes Manton window = XCreateSimpleWindow(display, root, 0, 0, config.output_width, config.output_height, 0, 0, colorkey); 22862074f44bb5944593b65d6203deae6300bead42dYounes Manton 22962074f44bb5944593b65d6203deae6300bead42dYounes Manton assert(XvMCCreateContext(display, port_num, surface_type_id, config.input_width, config.input_height, XVMC_DIRECT, &context) == Success); 23062074f44bb5944593b65d6203deae6300bead42dYounes Manton assert(XvMCCreateSurface(display, &context, &surface) == Success); 23162074f44bb5944593b65d6203deae6300bead42dYounes Manton assert(XvMCCreateBlocks(display, &context, mbw * mbh * BLOCKS_PER_MACROBLOCK, &block_array) == Success); 23262074f44bb5944593b65d6203deae6300bead42dYounes Manton assert(XvMCCreateMacroBlocks(display, &context, mbw * mbh, &mb_array) == Success); 23362074f44bb5944593b65d6203deae6300bead42dYounes Manton 23462074f44bb5944593b65d6203deae6300bead42dYounes Manton for (mby = 0; mby < mbh; ++mby) 23562074f44bb5944593b65d6203deae6300bead42dYounes Manton for (mbx = 0; mbx < mbw; ++mbx) 23662074f44bb5944593b65d6203deae6300bead42dYounes Manton { 23762074f44bb5944593b65d6203deae6300bead42dYounes Manton mb_array.macro_blocks[mby * mbw + mbx].x = mbx; 23862074f44bb5944593b65d6203deae6300bead42dYounes Manton mb_array.macro_blocks[mby * mbw + mbx].y = mby; 23962074f44bb5944593b65d6203deae6300bead42dYounes Manton mb_array.macro_blocks[mby * mbw + mbx].macroblock_type = XVMC_MB_TYPE_INTRA; 24062074f44bb5944593b65d6203deae6300bead42dYounes Manton /*mb->motion_type = ;*/ 24162074f44bb5944593b65d6203deae6300bead42dYounes Manton /*mb->motion_vertical_field_select = ;*/ 24262074f44bb5944593b65d6203deae6300bead42dYounes Manton mb_array.macro_blocks[mby * mbw + mbx].dct_type = XVMC_DCT_TYPE_FRAME; 24362074f44bb5944593b65d6203deae6300bead42dYounes Manton /*mb->PMV[0][0][0] = ; 24462074f44bb5944593b65d6203deae6300bead42dYounes Manton mb->PMV[0][0][1] = ; 24562074f44bb5944593b65d6203deae6300bead42dYounes Manton mb->PMV[0][1][0] = ; 24662074f44bb5944593b65d6203deae6300bead42dYounes Manton mb->PMV[0][1][1] = ; 24762074f44bb5944593b65d6203deae6300bead42dYounes Manton mb->PMV[1][0][0] = ; 24862074f44bb5944593b65d6203deae6300bead42dYounes Manton mb->PMV[1][0][1] = ; 24962074f44bb5944593b65d6203deae6300bead42dYounes Manton mb->PMV[1][1][0] = ; 25062074f44bb5944593b65d6203deae6300bead42dYounes Manton mb->PMV[1][1][1] = ;*/ 25162074f44bb5944593b65d6203deae6300bead42dYounes Manton mb_array.macro_blocks[mby * mbw + mbx].index = (mby * mbw + mbx) * BLOCKS_PER_MACROBLOCK; 25262074f44bb5944593b65d6203deae6300bead42dYounes Manton mb_array.macro_blocks[mby * mbw + mbx].coded_block_pattern = 0x3F; 25362074f44bb5944593b65d6203deae6300bead42dYounes Manton } 25462074f44bb5944593b65d6203deae6300bead42dYounes Manton 25562074f44bb5944593b65d6203deae6300bead42dYounes Manton XSelectInput(display, window, ExposureMask | KeyPressMask); 25662074f44bb5944593b65d6203deae6300bead42dYounes Manton XMapWindow(display, window); 25762074f44bb5944593b65d6203deae6300bead42dYounes Manton XSync(display, 0); 25862074f44bb5944593b65d6203deae6300bead42dYounes Manton 25962074f44bb5944593b65d6203deae6300bead42dYounes Manton gettimeofday(&start, NULL); 26062074f44bb5944593b65d6203deae6300bead42dYounes Manton 26162074f44bb5944593b65d6203deae6300bead42dYounes Manton for (reps = 0; reps < config.reps; ++reps) 26262074f44bb5944593b65d6203deae6300bead42dYounes Manton { 26362074f44bb5944593b65d6203deae6300bead42dYounes Manton if (config.pipeline & PIPELINE_STEP_MC) 26462074f44bb5944593b65d6203deae6300bead42dYounes Manton { 26562074f44bb5944593b65d6203deae6300bead42dYounes Manton assert(XvMCRenderSurface(display, &context, XVMC_FRAME_PICTURE, &surface, NULL, NULL, 0, mbw * mbh, 0, &mb_array, &block_array) == Success); 26662074f44bb5944593b65d6203deae6300bead42dYounes Manton assert(XvMCFlushSurface(display, &surface) == Success); 26762074f44bb5944593b65d6203deae6300bead42dYounes Manton } 26862074f44bb5944593b65d6203deae6300bead42dYounes Manton if (config.pipeline & PIPELINE_STEP_CSC) 26962074f44bb5944593b65d6203deae6300bead42dYounes Manton 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); 27062074f44bb5944593b65d6203deae6300bead42dYounes Manton } 27162074f44bb5944593b65d6203deae6300bead42dYounes Manton 27262074f44bb5944593b65d6203deae6300bead42dYounes Manton gettimeofday(&stop, NULL); 27362074f44bb5944593b65d6203deae6300bead42dYounes Manton 27462074f44bb5944593b65d6203deae6300bead42dYounes Manton timeval_subtract(&diff, &stop, &start); 27562074f44bb5944593b65d6203deae6300bead42dYounes Manton diff_secs = (double)diff.tv_sec + (double)diff.tv_usec / 1000000.0; 27662074f44bb5944593b65d6203deae6300bead42dYounes Manton 27762074f44bb5944593b65d6203deae6300bead42dYounes Manton printf("XvMC Benchmark\n"); 27862074f44bb5944593b65d6203deae6300bead42dYounes Manton printf("Input: %u,%u\nOutput: %u,%u\n", config.input_width, config.input_height, config.output_width, config.output_height); 27962074f44bb5944593b65d6203deae6300bead42dYounes Manton printf("Pipeline: "); 28062074f44bb5944593b65d6203deae6300bead42dYounes Manton if (config.pipeline & PIPELINE_STEP_MC) 28162074f44bb5944593b65d6203deae6300bead42dYounes Manton printf("|mc|"); 28262074f44bb5944593b65d6203deae6300bead42dYounes Manton if (config.pipeline & PIPELINE_STEP_CSC) 28362074f44bb5944593b65d6203deae6300bead42dYounes Manton printf("|csc|"); 28462074f44bb5944593b65d6203deae6300bead42dYounes Manton if (config.pipeline & PIPELINE_STEP_SWAP) 28562074f44bb5944593b65d6203deae6300bead42dYounes Manton printf("|swap|"); 28662074f44bb5944593b65d6203deae6300bead42dYounes Manton printf("\n"); 28762074f44bb5944593b65d6203deae6300bead42dYounes Manton printf("Reps: %u\n", config.reps); 28862074f44bb5944593b65d6203deae6300bead42dYounes Manton printf("Total time: %.2lf (%.2lf reps / sec)\n", diff_secs, config.reps / diff_secs); 28962074f44bb5944593b65d6203deae6300bead42dYounes Manton 29062074f44bb5944593b65d6203deae6300bead42dYounes Manton assert(XvMCDestroyBlocks(display, &block_array) == Success); 29162074f44bb5944593b65d6203deae6300bead42dYounes Manton assert(XvMCDestroyMacroBlocks(display, &mb_array) == Success); 29262074f44bb5944593b65d6203deae6300bead42dYounes Manton assert(XvMCDestroySurface(display, &surface) == Success); 29362074f44bb5944593b65d6203deae6300bead42dYounes Manton assert(XvMCDestroyContext(display, &context) == Success); 29462074f44bb5944593b65d6203deae6300bead42dYounes Manton 29562074f44bb5944593b65d6203deae6300bead42dYounes Manton XvUngrabPort(display, port_num, CurrentTime); 29662074f44bb5944593b65d6203deae6300bead42dYounes Manton XDestroyWindow(display, window); 29762074f44bb5944593b65d6203deae6300bead42dYounes Manton XCloseDisplay(display); 29862074f44bb5944593b65d6203deae6300bead42dYounes Manton 29962074f44bb5944593b65d6203deae6300bead42dYounes Manton return 0; 30062074f44bb5944593b65d6203deae6300bead42dYounes Manton} 301