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 "testlib.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BLOCK_WIDTH 8 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BLOCK_HEIGHT 8 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BLOCK_SIZE (BLOCK_WIDTH * BLOCK_HEIGHT) 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MACROBLOCK_WIDTH 16 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MACROBLOCK_HEIGHT 16 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MACROBLOCK_WIDTH_IN_BLOCKS (MACROBLOCK_WIDTH / BLOCK_WIDTH) 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MACROBLOCK_HEIGHT_IN_BLOCKS (MACROBLOCK_HEIGHT / BLOCK_HEIGHT) 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BLOCKS_PER_MACROBLOCK 6 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INPUT_WIDTH 64 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INPUT_HEIGHT 64 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INPUT_WIDTH_IN_MACROBLOCKS (INPUT_WIDTH / MACROBLOCK_WIDTH) 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INPUT_HEIGHT_IN_MACROBLOCKS (INPUT_HEIGHT / MACROBLOCK_HEIGHT) 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NUM_MACROBLOCKS (INPUT_WIDTH_IN_MACROBLOCKS * INPUT_HEIGHT_IN_MACROBLOCKS) 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEFAULT_OUTPUT_WIDTH INPUT_WIDTH 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEFAULT_OUTPUT_HEIGHT INPUT_HEIGHT 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEFAULT_ACCEPTABLE_ERR 0.01 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid ParseArgs(int argc, char **argv, unsigned int *output_width, unsigned int *output_height, double *acceptable_error, int *prompt); 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid ParseArgs(int argc, char **argv, unsigned int *output_width, unsigned int *output_height, double *acceptable_error, int *prompt) 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int fail = 0; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *output_width = DEFAULT_OUTPUT_WIDTH; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *output_height = DEFAULT_OUTPUT_HEIGHT; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *acceptable_error = DEFAULT_ACCEPTABLE_ERR; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *prompt = 1; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 1; i < argc && !fail; ++i) 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!strcmp(argv[i], "-w")) 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sscanf(argv[++i], "%u", output_width) != 1) 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fail = 1; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!strcmp(argv[i], "-h")) 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sscanf(argv[++i], "%u", output_height) != 1) 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fail = 1; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!strcmp(argv[i], "-e")) 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sscanf(argv[++i], "%lf", acceptable_error) != 1) 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fail = 1; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (strcmp(argv[i], "-n")) 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *prompt = 0; 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fail = 1; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fail) 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, 0, 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Bad argument.\n" 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "\n" 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "Usage: %s [options]\n" 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "\t-w <width>\tOutput width\n" 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "\t-h <height>\tOutput height\n" 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "\t-e <error>\tAcceptable margin of error per pixel, from 0 to 1\n" 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "\t-n\tDon't prompt for quit\n", 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org argv[0] 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void Gradient(short *block, unsigned int start, unsigned int stop, int horizontal, unsigned int intra_unsigned) 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int x, y; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int range = stop - start; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (horizontal) 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (y = 0; y < BLOCK_HEIGHT; ++y) 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (x = 0; x < BLOCK_WIDTH; ++x) { 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *block = (short)(start + range * (x / (float)(BLOCK_WIDTH - 1))); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intra_unsigned) 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *block += 1 << 10; 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org block++; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (y = 0; y < BLOCK_HEIGHT; ++y) 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (x = 0; x < BLOCK_WIDTH; ++x) { 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *block = (short)(start + range * (y / (float)(BLOCK_WIDTH - 1))); 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (intra_unsigned) 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *block += 1 << 10; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org block++; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint main(int argc, char **argv) 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int output_width; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int output_height; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org double acceptable_error; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int prompt; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Display *display; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Window root, window; 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned int mc_types[] = {XVMC_MOCOMP | XVMC_MPEG_2}; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XvPortID port_num; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int surface_type_id; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int is_overlay, intra_unsigned; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int colorkey; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XvMCContext context; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XvMCSurface surface; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XvMCBlockArray block_array; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XvMCMacroBlockArray mb_array; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int mbx, mby, bx, by; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XvMCMacroBlock *mb; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org short *blocks; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int quit = 0; 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ParseArgs(argc, argv, &output_width, &output_height, &acceptable_error, &prompt); 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org display = XOpenDisplay(NULL); 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!GetPort 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org display, 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_WIDTH, 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INPUT_HEIGHT, 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XVMC_CHROMA_FORMAT_420, 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mc_types, 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(mc_types)/sizeof(*mc_types), 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &port_num, 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &surface_type_id, 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &is_overlay, 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &intra_unsigned 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org )) 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XCloseDisplay(display); 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error(1, 0, "Error, unable to find a good port.\n"); 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_overlay) 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Atom xv_colorkey = XInternAtom(display, "XV_COLORKEY", 0); 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XvGetPortAttribute(display, port_num, xv_colorkey, &colorkey); 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org root = XDefaultRootWindow(display); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org window = XCreateSimpleWindow(display, root, 0, 0, output_width, output_height, 0, 0, colorkey); 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(XvMCCreateContext(display, port_num, surface_type_id, INPUT_WIDTH, INPUT_HEIGHT, XVMC_DIRECT, &context) == Success); 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(XvMCCreateSurface(display, &context, &surface) == Success); 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(XvMCCreateBlocks(display, &context, NUM_MACROBLOCKS * BLOCKS_PER_MACROBLOCK, &block_array) == Success); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(XvMCCreateMacroBlocks(display, &context, NUM_MACROBLOCKS, &mb_array) == Success); 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mb = mb_array.macro_blocks; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blocks = block_array.blocks; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (mby = 0; mby < INPUT_HEIGHT_IN_MACROBLOCKS; ++mby) 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (mbx = 0; mbx < INPUT_WIDTH_IN_MACROBLOCKS; ++mbx) 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mb->x = mbx; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mb->y = mby; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mb->macroblock_type = XVMC_MB_TYPE_INTRA; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*mb->motion_type = ;*/ 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*mb->motion_vertical_field_select = ;*/ 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mb->dct_type = XVMC_DCT_TYPE_FRAME; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*mb->PMV[0][0][0] = ; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mb->PMV[0][0][1] = ; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mb->PMV[0][1][0] = ; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mb->PMV[0][1][1] = ; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mb->PMV[1][0][0] = ; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mb->PMV[1][0][1] = ; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mb->PMV[1][1][0] = ; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mb->PMV[1][1][1] = ;*/ 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mb->index = (mby * INPUT_WIDTH_IN_MACROBLOCKS + mbx) * BLOCKS_PER_MACROBLOCK; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mb->coded_block_pattern = 0x3F; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mb++; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (by = 0; by < MACROBLOCK_HEIGHT_IN_BLOCKS; ++by) 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (bx = 0; bx < MACROBLOCK_WIDTH_IN_BLOCKS; ++bx) 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int start = 16, stop = 235, range = stop - start; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Gradient 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blocks, 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (short)(start + range * ((mbx * MACROBLOCK_WIDTH + bx * BLOCK_WIDTH) / (float)(INPUT_WIDTH - 1))), 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (short)(start + range * ((mbx * MACROBLOCK_WIDTH + bx * BLOCK_WIDTH + BLOCK_WIDTH - 1) / (float)(INPUT_WIDTH - 1))), 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intra_unsigned 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blocks += BLOCK_SIZE; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (by = 0; by < MACROBLOCK_HEIGHT_IN_BLOCKS / 2; ++by) 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (bx = 0; bx < MACROBLOCK_WIDTH_IN_BLOCKS / 2; ++bx) 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int start = 16, stop = 240, range = stop - start; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Gradient 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blocks, 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (short)(start + range * ((mbx * MACROBLOCK_WIDTH + bx * BLOCK_WIDTH) / (float)(INPUT_WIDTH - 1))), 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (short)(start + range * ((mbx * MACROBLOCK_WIDTH + bx * BLOCK_WIDTH + BLOCK_WIDTH - 1) / (float)(INPUT_WIDTH - 1))), 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intra_unsigned 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blocks += BLOCK_SIZE; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Gradient 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blocks, 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (short)(start + range * ((mbx * MACROBLOCK_WIDTH + bx * BLOCK_WIDTH) / (float)(INPUT_WIDTH - 1))), 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (short)(start + range * ((mbx * MACROBLOCK_WIDTH + bx * BLOCK_WIDTH + BLOCK_WIDTH - 1) / (float)(INPUT_WIDTH - 1))), 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intra_unsigned 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blocks += BLOCK_SIZE; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XSelectInput(display, window, ExposureMask | KeyPressMask); 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMapWindow(display, window); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XSync(display, 0); 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Test NULL context */ 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(XvMCRenderSurface(display, NULL, XVMC_FRAME_PICTURE, &surface, NULL, NULL, 0, NUM_MACROBLOCKS, 0, &mb_array, &block_array) == XvMCBadContext); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Test NULL surface */ 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(XvMCRenderSurface(display, &context, XVMC_FRAME_PICTURE, NULL, NULL, NULL, 0, NUM_MACROBLOCKS, 0, &mb_array, &block_array) == XvMCBadSurface); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Test bad picture structure */ 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(XvMCRenderSurface(display, &context, 0, &surface, NULL, NULL, 0, NUM_MACROBLOCKS, 0, &mb_array, &block_array) == BadValue); 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Test valid params */ 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(XvMCRenderSurface(display, &context, XVMC_FRAME_PICTURE, &surface, NULL, NULL, 0, NUM_MACROBLOCKS, 0, &mb_array, &block_array) == Success); 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Test NULL surface */ 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(XvMCPutSurface(display, NULL, window, 0, 0, INPUT_WIDTH, INPUT_HEIGHT, 0, 0, output_width, output_height, XVMC_FRAME_PICTURE) == XvMCBadSurface); 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Test bad window */ 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: X halts with a bad drawable for some reason, doesn't return BadDrawable as expected */ 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*assert(XvMCPutSurface(display, &surface, 0, 0, 0, width, height, 0, 0, width, height, XVMC_FRAME_PICTURE) == BadDrawable);*/ 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prompt) 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org puts("Press any button to quit..."); 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (!quit) 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (XPending(display) > 0) 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XEvent event; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XNextEvent(display, &event); 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (event.type) 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case Expose: 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Test valid params */ 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XvMCPutSurface 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org display, &surface, window, 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, INPUT_WIDTH, INPUT_HEIGHT, 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, output_width, output_height, 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XVMC_FRAME_PICTURE 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ) == Success 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case KeyPress: 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quit = 1; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(XvMCDestroyBlocks(display, &block_array) == Success); 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(XvMCDestroyMacroBlocks(display, &mb_array) == Success); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(XvMCDestroySurface(display, &surface) == Success); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(XvMCDestroyContext(display, &context) == Success); 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XvUngrabPort(display, port_num, CurrentTime); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XDestroyWindow(display, window); 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XCloseDisplay(display); 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 328