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 = &macroblock_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