1fa225cbcSrjs/*
2fa225cbcSrjs * Copyright © 2008 Intel Corporation
3fa225cbcSrjs *
4fa225cbcSrjs * Permission is hereby granted, free of charge, to any person obtaining a
5fa225cbcSrjs * copy of this software and associated documentation files (the "Software"),
6fa225cbcSrjs * to deal in the Software without restriction, including without limitation
7fa225cbcSrjs * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8fa225cbcSrjs * and/or sell copies of the Software, and to permit persons to whom the
9fa225cbcSrjs * Software is furnished to do so, subject to the following conditions:
10fa225cbcSrjs *
11fa225cbcSrjs * The above copyright notice and this permission notice (including the next
12fa225cbcSrjs * paragraph) shall be included in all copies or substantial portions of the
13fa225cbcSrjs * Software.
14fa225cbcSrjs *
15fa225cbcSrjs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16fa225cbcSrjs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17fa225cbcSrjs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18fa225cbcSrjs * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19fa225cbcSrjs * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20fa225cbcSrjs * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21fa225cbcSrjs * SOFTWARE.
22fa225cbcSrjs *
23fa225cbcSrjs * Authors:
24fa225cbcSrjs *    Zhenyu Wang <zhenyu.z.wang@intel.com>
25fa225cbcSrjs *
26fa225cbcSrjs */
27fa225cbcSrjs#include "intel_xvmc.h"
28fa225cbcSrjs
29fa225cbcSrjs#define DUMPFILE "./intel_xvmc_dump"
30fa225cbcSrjs
31fa225cbcSrjsstatic int xvmc_dump = 0;
32fa225cbcSrjsstatic FILE *fp = NULL;
33fa225cbcSrjs
34fa225cbcSrjsvoid intel_xvmc_dump_open(void)
35fa225cbcSrjs{
36fa225cbcSrjs    char *d  = NULL;
37fa225cbcSrjs
38fa225cbcSrjs    if (xvmc_dump)
39fa225cbcSrjs	return;
40fa225cbcSrjs
41fa225cbcSrjs    if (d = getenv("INTEL_XVMC_DUMP"))
42fa225cbcSrjs	xvmc_dump = 1;
43fa225cbcSrjs
44fa225cbcSrjs    if (xvmc_dump) {
45fa225cbcSrjs	fp = fopen(DUMPFILE, "a");
46fa225cbcSrjs	if (!fp)
47fa225cbcSrjs	    xvmc_dump = 0;
48fa225cbcSrjs    }
49fa225cbcSrjs}
50fa225cbcSrjs
51fa225cbcSrjsvoid intel_xvmc_dump_close(void)
52fa225cbcSrjs{
53fa225cbcSrjs    if (xvmc_dump) {
54fa225cbcSrjs	fclose(fp);
55fa225cbcSrjs	xvmc_dump = 0;
56fa225cbcSrjs    }
57fa225cbcSrjs}
58fa225cbcSrjs
59fa225cbcSrjsvoid intel_xvmc_dump_render(XvMCContext *context, unsigned int picture_structure,
60fa225cbcSrjs	XvMCSurface *target, XvMCSurface *past, XvMCSurface *future, unsigned int flags,
61fa225cbcSrjs	unsigned int num_macroblocks, unsigned int first_macroblock,
62fa225cbcSrjs	XvMCMacroBlockArray *macroblock_array, XvMCBlockArray *blocks)
63fa225cbcSrjs{
64fa225cbcSrjs    int i;
65fa225cbcSrjs    XvMCMacroBlock *mb;
66fa225cbcSrjs
67fa225cbcSrjs    if (!xvmc_dump)
68fa225cbcSrjs	return;
69fa225cbcSrjs
70fa225cbcSrjs    fprintf(fp, "========== new surface rendering ==========\n");
71fa225cbcSrjs    fprintf(fp, "Context (id:%d) (surface_type_id:%d) (width:%d) (height:%d)\n",
72fa225cbcSrjs	    context->context_id, context->surface_type_id, context->width, context->height);
73fa225cbcSrjs
74fa225cbcSrjs    if (picture_structure == XVMC_FRAME_PICTURE)
75fa225cbcSrjs	fprintf(fp, "picture structure: frame picture\n");
76fa225cbcSrjs    else if (picture_structure == XVMC_TOP_FIELD)
77fa225cbcSrjs	fprintf(fp, "picture structure: top field picture (%s)\n",
78fa225cbcSrjs		(flags == XVMC_SECOND_FIELD)?"second":"first");
79fa225cbcSrjs    else if (picture_structure == XVMC_BOTTOM_FIELD)
80fa225cbcSrjs	fprintf(fp, "picture structure: bottom field picture (%s)\n",
81fa225cbcSrjs		(flags == XVMC_SECOND_FIELD)?"second":"first");
82fa225cbcSrjs
83fa225cbcSrjs    if (!past && !future)
84fa225cbcSrjs	fprintf(fp, "picture type: I\n");
85fa225cbcSrjs    else if (past && !future)
86fa225cbcSrjs	fprintf(fp, "picture type: P\n");
87fa225cbcSrjs    else if (past && future)
88fa225cbcSrjs	fprintf(fp, "picture type: B\n");
89fa225cbcSrjs    else
90fa225cbcSrjs	fprintf(fp, "picture type: Bad!\n");
91fa225cbcSrjs
92fa225cbcSrjs    fprintf(fp, "target picture: id (%d) width (%d) height (%d)\n", target->surface_id,
93fa225cbcSrjs	    target->width, target->height);
94fa225cbcSrjs    if (past)
95fa225cbcSrjs	fprintf(fp, "past picture: id (%d) width (%d) height (%d)\n", past->surface_id,
96fa225cbcSrjs		past->width, past->height);
97fa225cbcSrjs    if (future)
98fa225cbcSrjs	fprintf(fp, "future picture: id (%d) width (%d) height (%d)\n", future->surface_id,
99fa225cbcSrjs		future->width, future->height);
100fa225cbcSrjs
101fa225cbcSrjs    fprintf(fp, "num macroblocks: %d, first macroblocks %d\n", num_macroblocks, first_macroblock);
102fa225cbcSrjs
103fa225cbcSrjs    for (i = first_macroblock; i < (first_macroblock + num_macroblocks); i++) {
104fa225cbcSrjs	mb = &macroblock_array->macro_blocks[i];
105fa225cbcSrjs
106fa225cbcSrjs	fprintf(fp, "- MB(%d): ", i);
107fa225cbcSrjs	fprintf(fp, "x (%d) y (%d)  ", mb->x, mb->y);
108fa225cbcSrjs	fprintf(fp, "macroblock type (");
109fa225cbcSrjs	if (mb->macroblock_type & XVMC_MB_TYPE_MOTION_FORWARD)
110fa225cbcSrjs	    fprintf(fp, "motion_forward ");
111fa225cbcSrjs	if (mb->macroblock_type & XVMC_MB_TYPE_MOTION_BACKWARD)
112fa225cbcSrjs	    fprintf(fp, "motion_backward ");
113fa225cbcSrjs	if (mb->macroblock_type & XVMC_MB_TYPE_PATTERN)
114fa225cbcSrjs	    fprintf(fp, "pattern ");
115fa225cbcSrjs	if (mb->macroblock_type & XVMC_MB_TYPE_INTRA)
116fa225cbcSrjs	    fprintf(fp, "intra ");
117fa225cbcSrjs	fprintf(fp, ")  ");
118fa225cbcSrjs	fprintf(fp, "mc type ");
119fa225cbcSrjs	if (picture_structure == XVMC_FRAME_PICTURE) {
120fa225cbcSrjs	    if (mb->motion_type & XVMC_PREDICTION_FIELD)
121fa225cbcSrjs		fprintf(fp, "(field)  ");
122fa225cbcSrjs	    else if (mb->motion_type & XVMC_PREDICTION_FRAME)
123fa225cbcSrjs		fprintf(fp, "(frame)  ");
124fa225cbcSrjs	    else if (mb->motion_type & XVMC_PREDICTION_DUAL_PRIME)
125fa225cbcSrjs		fprintf(fp, "(dual-prime)  ");
126fa225cbcSrjs	    else
127fa225cbcSrjs		fprintf(fp, "(unknown %d)  ", mb->motion_type);
128fa225cbcSrjs	} else { /* field */
129fa225cbcSrjs	    if (mb->motion_type & XVMC_PREDICTION_FIELD)
130fa225cbcSrjs		fprintf(fp, "(field)  ");
131fa225cbcSrjs	    else if (mb->motion_type & XVMC_PREDICTION_DUAL_PRIME)
132fa225cbcSrjs		fprintf(fp, "(dual-prime)  ");
133fa225cbcSrjs	    else if (mb->motion_type & XVMC_PREDICTION_16x8)
134fa225cbcSrjs		fprintf(fp, "(16x8)  ");
135fa225cbcSrjs	    else
136fa225cbcSrjs		fprintf(fp, "(unknown %d)  ", mb->motion_type);
137fa225cbcSrjs	}
138fa225cbcSrjs
139fa225cbcSrjs	if (mb->dct_type == XVMC_DCT_TYPE_FRAME)
140fa225cbcSrjs	    fprintf(fp, "dct type (frame)  ");
141fa225cbcSrjs	else if (mb->dct_type == XVMC_DCT_TYPE_FIELD)
142fa225cbcSrjs	    fprintf(fp, "dct type (field)  ");
143fa225cbcSrjs
144fa225cbcSrjs	fprintf(fp, "coded_block_pattern (0x%x)\n", mb->coded_block_pattern);
145fa225cbcSrjs
146fa225cbcSrjs	/* XXX mv dump */
147fa225cbcSrjs    }
148fa225cbcSrjs
149fa225cbcSrjs}
150