1428d7b3dSmrg/* 2428d7b3dSmrg * Copyright © 2008 Intel Corporation 3428d7b3dSmrg * 4428d7b3dSmrg * Permission is hereby granted, free of charge, to any person obtaining a 5428d7b3dSmrg * copy of this software and associated documentation files (the "Software"), 6428d7b3dSmrg * to deal in the Software without restriction, including without limitation 7428d7b3dSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8428d7b3dSmrg * and/or sell copies of the Software, and to permit persons to whom the 9428d7b3dSmrg * Software is furnished to do so, subject to the following conditions: 10428d7b3dSmrg * 11428d7b3dSmrg * The above copyright notice and this permission notice (including the next 12428d7b3dSmrg * paragraph) shall be included in all copies or substantial portions of the 13428d7b3dSmrg * Software. 14428d7b3dSmrg * 15428d7b3dSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16428d7b3dSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17428d7b3dSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18428d7b3dSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19428d7b3dSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20428d7b3dSmrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21428d7b3dSmrg * SOFTWARE. 22428d7b3dSmrg * 23428d7b3dSmrg * Authors: 24428d7b3dSmrg * Zhenyu Wang <zhenyu.z.wang@intel.com> 25428d7b3dSmrg * 26428d7b3dSmrg */ 27428d7b3dSmrg#include "intel_xvmc_private.h" 28428d7b3dSmrg 29428d7b3dSmrg#define DUMPFILE "./intel_xvmc_dump" 30428d7b3dSmrg 31428d7b3dSmrgstatic int xvmc_dump = 0; 32428d7b3dSmrgstatic FILE *fp = NULL; 33428d7b3dSmrg 34428d7b3dSmrgvoid intel_xvmc_dump_open(void) 35428d7b3dSmrg{ 36428d7b3dSmrg char *d = NULL; 37428d7b3dSmrg 38428d7b3dSmrg if (xvmc_dump) 39428d7b3dSmrg return; 40428d7b3dSmrg 41428d7b3dSmrg if ((d = getenv("INTEL_XVMC_DUMP"))) 42428d7b3dSmrg xvmc_dump = 1; 43428d7b3dSmrg 44428d7b3dSmrg if (xvmc_dump) { 45428d7b3dSmrg fp = fopen(DUMPFILE, "a"); 46428d7b3dSmrg if (!fp) 47428d7b3dSmrg xvmc_dump = 0; 48428d7b3dSmrg } 49428d7b3dSmrg} 50428d7b3dSmrg 51428d7b3dSmrgvoid intel_xvmc_dump_close(void) 52428d7b3dSmrg{ 53428d7b3dSmrg if (xvmc_dump) { 54428d7b3dSmrg fclose(fp); 55428d7b3dSmrg xvmc_dump = 0; 56428d7b3dSmrg } 57428d7b3dSmrg} 58428d7b3dSmrg 59428d7b3dSmrgvoid intel_xvmc_dump_render(XvMCContext * context, 60428d7b3dSmrg unsigned int picture_structure, 61428d7b3dSmrg XvMCSurface * target, XvMCSurface * past, 62428d7b3dSmrg XvMCSurface * future, unsigned int flags, 63428d7b3dSmrg unsigned int num_macroblocks, 64428d7b3dSmrg unsigned int first_macroblock, 65428d7b3dSmrg XvMCMacroBlockArray * macroblock_array, 66428d7b3dSmrg XvMCBlockArray * blocks) 67428d7b3dSmrg{ 68428d7b3dSmrg int i; 69428d7b3dSmrg XvMCMacroBlock *mb; 70428d7b3dSmrg 71428d7b3dSmrg if (!xvmc_dump) 72428d7b3dSmrg return; 73428d7b3dSmrg 74428d7b3dSmrg fprintf(fp, "========== new surface rendering ==========\n"); 75428d7b3dSmrg fprintf(fp, 76428d7b3dSmrg "Context (id:%d) (surface_type_id:%d) (width:%d) (height:%d)\n", 77428d7b3dSmrg (int)context->context_id, context->surface_type_id, 78428d7b3dSmrg context->width, context->height); 79428d7b3dSmrg 80428d7b3dSmrg if (picture_structure == XVMC_FRAME_PICTURE) 81428d7b3dSmrg fprintf(fp, "picture structure: frame picture\n"); 82428d7b3dSmrg else if (picture_structure == XVMC_TOP_FIELD) 83428d7b3dSmrg fprintf(fp, "picture structure: top field picture (%s)\n", 84428d7b3dSmrg (flags == XVMC_SECOND_FIELD) ? "second" : "first"); 85428d7b3dSmrg else if (picture_structure == XVMC_BOTTOM_FIELD) 86428d7b3dSmrg fprintf(fp, "picture structure: bottom field picture (%s)\n", 87428d7b3dSmrg (flags == XVMC_SECOND_FIELD) ? "second" : "first"); 88428d7b3dSmrg 89428d7b3dSmrg if (!past && !future) 90428d7b3dSmrg fprintf(fp, "picture type: I\n"); 91428d7b3dSmrg else if (past && !future) 92428d7b3dSmrg fprintf(fp, "picture type: P\n"); 93428d7b3dSmrg else if (past && future) 94428d7b3dSmrg fprintf(fp, "picture type: B\n"); 95428d7b3dSmrg else 96428d7b3dSmrg fprintf(fp, "picture type: Bad!\n"); 97428d7b3dSmrg 98428d7b3dSmrg fprintf(fp, "target picture: id (%d) width (%d) height (%d)\n", 99428d7b3dSmrg (int)target->surface_id, target->width, target->height); 100428d7b3dSmrg if (past) 101428d7b3dSmrg fprintf(fp, "past picture: id (%d) width (%d) height (%d)\n", 102428d7b3dSmrg (int)past->surface_id, past->width, past->height); 103428d7b3dSmrg if (future) 104428d7b3dSmrg fprintf(fp, "future picture: id (%d) width (%d) height (%d)\n", 105428d7b3dSmrg (int)future->surface_id, future->width, future->height); 106428d7b3dSmrg 107428d7b3dSmrg fprintf(fp, "num macroblocks: %d, first macroblocks %d\n", 108428d7b3dSmrg num_macroblocks, first_macroblock); 109428d7b3dSmrg 110428d7b3dSmrg for (i = first_macroblock; i < (first_macroblock + num_macroblocks); 111428d7b3dSmrg i++) { 112428d7b3dSmrg mb = ¯oblock_array->macro_blocks[i]; 113428d7b3dSmrg 114428d7b3dSmrg fprintf(fp, "- MB(%d): ", i); 115428d7b3dSmrg fprintf(fp, "x (%d) y (%d) ", mb->x, mb->y); 116428d7b3dSmrg fprintf(fp, "macroblock type ("); 117428d7b3dSmrg if (mb->macroblock_type & XVMC_MB_TYPE_MOTION_FORWARD) 118428d7b3dSmrg fprintf(fp, "motion_forward "); 119428d7b3dSmrg if (mb->macroblock_type & XVMC_MB_TYPE_MOTION_BACKWARD) 120428d7b3dSmrg fprintf(fp, "motion_backward "); 121428d7b3dSmrg if (mb->macroblock_type & XVMC_MB_TYPE_PATTERN) 122428d7b3dSmrg fprintf(fp, "pattern "); 123428d7b3dSmrg if (mb->macroblock_type & XVMC_MB_TYPE_INTRA) 124428d7b3dSmrg fprintf(fp, "intra "); 125428d7b3dSmrg fprintf(fp, ") "); 126428d7b3dSmrg fprintf(fp, "mc type "); 127428d7b3dSmrg if (picture_structure == XVMC_FRAME_PICTURE) { 128428d7b3dSmrg if (mb->motion_type & XVMC_PREDICTION_FIELD) 129428d7b3dSmrg fprintf(fp, "(field) "); 130428d7b3dSmrg else if (mb->motion_type & XVMC_PREDICTION_FRAME) 131428d7b3dSmrg fprintf(fp, "(frame) "); 132428d7b3dSmrg else if (mb->motion_type & XVMC_PREDICTION_DUAL_PRIME) 133428d7b3dSmrg fprintf(fp, "(dual-prime) "); 134428d7b3dSmrg else 135428d7b3dSmrg fprintf(fp, "(unknown %d) ", mb->motion_type); 136428d7b3dSmrg } else { /* field */ 137428d7b3dSmrg if (mb->motion_type & XVMC_PREDICTION_FIELD) 138428d7b3dSmrg fprintf(fp, "(field) "); 139428d7b3dSmrg else if (mb->motion_type & XVMC_PREDICTION_DUAL_PRIME) 140428d7b3dSmrg fprintf(fp, "(dual-prime) "); 141428d7b3dSmrg else if (mb->motion_type & XVMC_PREDICTION_16x8) 142428d7b3dSmrg fprintf(fp, "(16x8) "); 143428d7b3dSmrg else 144428d7b3dSmrg fprintf(fp, "(unknown %d) ", mb->motion_type); 145428d7b3dSmrg } 146428d7b3dSmrg 147428d7b3dSmrg if (mb->dct_type == XVMC_DCT_TYPE_FRAME) 148428d7b3dSmrg fprintf(fp, "dct type (frame) "); 149428d7b3dSmrg else if (mb->dct_type == XVMC_DCT_TYPE_FIELD) 150428d7b3dSmrg fprintf(fp, "dct type (field) "); 151428d7b3dSmrg 152428d7b3dSmrg fprintf(fp, "coded_block_pattern (0x%x)\n", 153428d7b3dSmrg mb->coded_block_pattern); 154428d7b3dSmrg 155428d7b3dSmrg /* XXX mv dump */ 156428d7b3dSmrg } 157428d7b3dSmrg 158428d7b3dSmrg} 159