/*
 * Copyright (c) 2009 Intel Corporation. All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sub license, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 * 
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial portions
 * of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#define _GNU_SOURCE 1
#include "va.h"
#include "va_backend.h"

#include <assert.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dlfcn.h>
#include <unistd.h>

unsigned int trace_flag = 0;

static const char *trace_file = 0;
static FILE *trace_fp = 0;

static VASurfaceID  trace_rendertarget; /* current render target */
static VAProfile trace_profile; /* current entrypoint for buffers */

static unsigned int trace_frame;
static unsigned int trace_slice;

static unsigned int trace_width;
static unsigned int trace_height;

int va_TraceInit(void)
{
    trace_file = (const char *)getenv("LIBVA_TRACE");
    if (trace_file) {
	trace_fp = fopen(trace_file, "w");
        if (trace_fp)
            trace_flag = 1;
    }
}

int va_TraceEnd(void)
{
    if (trace_file && trace_fp) {
        fclose(trace_fp);

        trace_file = NULL;
        trace_fp = NULL;

        trace_flag = 0;

        trace_width = 0;
        trace_height = 0;
    }
}

int va_TraceMsg(const char *msg, ...)
{
    va_list args;
    
    if (msg)  {
        va_start(args, msg);
        vfprintf(trace_fp, msg, args);
        va_end(args);
    } else  {
        fflush(trace_fp);
    }
}


int va_TraceCreateConfig(
    VADisplay dpy,
    VAProfile profile, 
    VAEntrypoint entrypoint, 
    VAConfigAttrib *attrib_list,
    int num_attribs,
    VAConfigID *config_id /* out */
                         )
{
    int i;
    
    va_TraceMsg("\tprofile = %d\n", profile);
    va_TraceMsg("\tentrypoint = %d\n", entrypoint);
    va_TraceMsg("\tnum_attribs = %d\n", num_attribs);
    for (i = 0; i < num_attribs; i++) {
	va_TraceMsg("\t\tattrib_list[%d].type = 0x%08x\n", i, attrib_list[i].type);
        va_TraceMsg("\t\tattrib_list[%d].value = 0x%08x\n", i, attrib_list[i].value);
    }

    trace_profile = profile;
}


int va_TraceCreateSurface(
    VADisplay dpy,
    int width,
    int height,
    int format,
    int num_surfaces,
    VASurfaceID *surfaces	/* out */
                          )
{
    int i;
    
    va_TraceMsg("\twidth = %d\n", width);
    va_TraceMsg("\theight = %d\n", height);
    va_TraceMsg("\tformat = %d\n", format);
    va_TraceMsg("\tnum_surfaces = %d\n", num_surfaces);

    for (i = 0; i < num_surfaces; i++)
        va_TraceMsg("\t\tsurfaces[%d] = 0x%08x\n", i, surfaces[i]);
}


int va_TraceCreateContext(
    VADisplay dpy,
    VAConfigID config_id,
    int picture_width,
    int picture_height,
    int flag,
    VASurfaceID *render_targets,
    int num_render_targets,
    VAContextID *context		/* out */
                          )
{
    int i;

    va_TraceMsg("\twidth = %d\n", picture_width);
    va_TraceMsg("\theight = %d\n", picture_height);
    va_TraceMsg("\tflag = 0x%08x\n", flag);
    va_TraceMsg("\tnum_render_targets = %d\n", num_render_targets);
    for (i=0; i<num_render_targets; i++)
        va_TraceMsg("\t\trender_targets[%d] = 0x%08x\n", i, render_targets[i]);
    va_TraceMsg("\tcontext = 0x%08x\n", context);


    trace_frame = 0;
    trace_slice = 0;

    trace_width = picture_width;
    trace_height = picture_height;
}


static char * buffer_type_to_string(int type)
{
    switch (type) {
    case VAPictureParameterBufferType: return "VAPictureParameterBufferType";
    case VAIQMatrixBufferType: return "VAIQMatrixBufferType";
    case VABitPlaneBufferType: return "VABitPlaneBufferType";
    case VASliceGroupMapBufferType: return "VASliceGroupMapBufferType";
    case VASliceParameterBufferType: return "VASliceParameterBufferType";
    case VASliceDataBufferType: return "VASliceDataBufferType";
    case VAProtectedSliceDataBufferType: return "VAProtectedSliceDataBufferType";
    case VAMacroblockParameterBufferType: return "VAMacroblockParameterBufferType";
    case VAResidualDataBufferType: return "VAResidualDataBufferType";
    case VADeblockingParameterBufferType: return "VADeblockingParameterBufferType";
    case VAImageBufferType: return "VAImageBufferType";
    case VAEncCodedBufferType: return "VAEncCodedBufferType";
    case VAEncSequenceParameterBufferType: return "VAEncSequenceParameterBufferType";
    case VAEncPictureParameterBufferType: return "VAEncPictureParameterBufferType";
    case VAEncSliceParameterBufferType: return "VAEncSliceParameterBufferType";
    default: return "UnknowBuffer";
    }
}


static int va_TraceVABuffers(
    VADisplay dpy,
    VAContextID context,
    VABufferID buffer,
    VABufferType type,
    unsigned int size,
    unsigned int num_elements,
    void *pbuf
                             )
{
    int i;
    char *p = pbuf;
    unsigned int *pi = (unsigned int *)pbuf;

    va_TraceMsg("***Buffer Data***");
    for (i=0; i<size; i++) {
        if ((i%16) == 0)
            va_TraceMsg("\n0x%08x:", i);
        va_TraceMsg("%08x ", p[i]);
    }

    va_TraceMsg("\n");
    return 0;
}


static void va_TraceVAPictureParameterBufferMPEG2(
    VADisplay dpy,
    VAContextID context,
    VABufferID buffer,
    VABufferType type,
    unsigned int size,
    unsigned int num_elements,
    void *data)
{
    va_TraceVABuffers(dpy, context, buffer, type, size, num_elements, data);
    
    return;
}


static void va_TraceVAIQMatrixBufferMPEG2(
    VADisplay dpy,
    VAContextID context,
    VABufferID buffer,
    VABufferType type,
    unsigned int size,
    unsigned int num_elements,
    void *data)
{
    va_TraceVABuffers(dpy, context, buffer, type, size, num_elements, data);
    
    return;
}


static void va_TraceVASliceParameterBufferMPEG2(
    VADisplay dpy,
    VAContextID context,
    VABufferID buffer,
    VABufferType type,
    unsigned int size,
    unsigned int num_elements,
    void *data)
{
    va_TraceVABuffers(dpy, context, buffer, type, size, num_elements, data);
    
    return;
}



static void va_TraceVAPictureParameterBufferMPEG4(
    VADisplay dpy,
    VAContextID context,
    VABufferID buffer,
    VABufferType type,
    unsigned int size,
    unsigned int num_elements,
    void *data)
{
    va_TraceVABuffers(dpy, context, buffer, type, size, num_elements, data);
    
    return;
}


static void va_TraceVAIQMatrixBufferMPEG4(
    VADisplay dpy,
    VAContextID context,
    VABufferID buffer,
    VABufferType type,
    unsigned int size,
    unsigned int num_elements,
    void *data)
{
    va_TraceVABuffers(dpy, context, buffer, type, size, num_elements, data);
    
    return;
}


static void va_TraceVASliceParameterBufferMPEG4(
    VADisplay dpy,
    VAContextID context,
    VABufferID buffer,
    VABufferType type,
    unsigned int size,
    unsigned int num_elements,
    void *data)
{
    va_TraceVABuffers(dpy, context, buffer, type, size, num_elements, data);
    
    return;
}


static void va_TraceVAPictureParameterBufferH264(
    VADisplay dpy,
    VAContextID context,
    VABufferID buffer,
    VABufferType type,
    unsigned int size,
    unsigned int num_elements,
    void *data)
{
    int i;

    VAPictureParameterBufferH264 *p = (VAPictureParameterBufferH264*)data;

    va_TraceMsg  ("==========H264PicParameterBuffer============\n");

#if 0    
    if (p->num_ref_frames > 4)
    {
        int num = 0;
        for (i = 15; i >= 0; i--)
        {
            if (p->ReferenceFrames[i].flags != VA_PICTURE_H264_INVALID)
            {
                num++;
            }
            if (num > 4)
            {
                p->ReferenceFrames[i].flags = VA_PICTURE_H264_INVALID;
            }
        }  	
        p->num_ref_frames  = 4;
    }
#endif
    
#if 1
    va_TraceMsg("picture id: %d\n", p->CurrPic.picture_id);
    va_TraceMsg("frame idx: %d\n", p->CurrPic.frame_idx);
    va_TraceMsg("picture flags: %d\n", p->CurrPic.flags);
    va_TraceMsg("top field order count: %d\n", p->CurrPic.TopFieldOrderCnt);
    va_TraceMsg("bottom field order count: %d\n", p->CurrPic.BottomFieldOrderCnt);


    va_TraceMsg("Reference frames: \n");
    for (i = 0; i < 16; i++)
    {
        if (p->ReferenceFrames[i].flags != VA_PICTURE_H264_INVALID)
        {
            //va_TraceMsg("%d-%d; ", p->ReferenceFrames[i].TopFieldOrderCnt, p->ReferenceFrames[i].BottomFieldOrderCnt);
            va_TraceMsg("%d-%d-%d-%d; ", p->ReferenceFrames[i].TopFieldOrderCnt, p->ReferenceFrames[i].BottomFieldOrderCnt, p->ReferenceFrames[i].picture_id, p->ReferenceFrames[i].frame_idx);
        }
    }
    va_TraceMsg("\n");
#endif
    va_TraceMsg("picture_width_in_mbs_minus1: %d\n", p->picture_width_in_mbs_minus1);
    va_TraceMsg("picture_height_in_mbs_minus1: %d\n", p->picture_height_in_mbs_minus1);
    va_TraceMsg("bit_depth_luma_minus8: %d\n", p->bit_depth_luma_minus8);
    va_TraceMsg("bit_depth_chroma_minus8: %d\n", p->bit_depth_chroma_minus8);
    va_TraceMsg("num_ref_frames: %d\n", p->num_ref_frames);
    va_TraceMsg("seq fields: %d\n", p->seq_fields.value);
    va_TraceMsg("\t chroma_format_idc: %d\n", p->seq_fields.bits.chroma_format_idc);
    va_TraceMsg("\t residual_colour_transform_flag: %d\n", p->seq_fields.bits.residual_colour_transform_flag);
    va_TraceMsg("\t frame_mbs_only_flag: %d\n", p->seq_fields.bits.frame_mbs_only_flag);
    va_TraceMsg("\t mb_adaptive_frame_field_flag: %d\n", p->seq_fields.bits.mb_adaptive_frame_field_flag);
    va_TraceMsg("\t direct_8x8_inference_flag: %d\n", p->seq_fields.bits.direct_8x8_inference_flag);
    va_TraceMsg("\t MinLumaBiPredSize8x8: %d\n", p->seq_fields.bits.MinLumaBiPredSize8x8);
    va_TraceMsg("num_slice_groups_minus1: %d\n", p->num_slice_groups_minus1);
    va_TraceMsg("slice_group_map_type: %d\n", p->slice_group_map_type);
    va_TraceMsg("slice_group_change_rate_minus1: %d\n", p->slice_group_change_rate_minus1);
    va_TraceMsg("pic_init_qp_minus26: %d\n", p->pic_init_qp_minus26);
    va_TraceMsg("pic_init_qs_minus26: %d\n", p->pic_init_qs_minus26);
    va_TraceMsg("chroma_qp_index_offset: %d\n", p->chroma_qp_index_offset);
    va_TraceMsg("second_chroma_qp_index_offset: %d\n", p->second_chroma_qp_index_offset);
    va_TraceMsg("pic_fields: %d\n", p->pic_fields.value);
    va_TraceMsg("\t entropy_coding_mode_flag: %d\n", p->pic_fields.bits.entropy_coding_mode_flag);
    va_TraceMsg("\t weighted_pred_flag: %d\n", p->pic_fields.bits.weighted_pred_flag);
    va_TraceMsg("\t weighted_bipred_idc: %d\n", p->pic_fields.bits.weighted_bipred_idc);
    va_TraceMsg("\t transform_8x8_mode_flag: %d\n", p->pic_fields.bits.transform_8x8_mode_flag);
    va_TraceMsg("\t field_pic_flag: %d\n", p->pic_fields.bits.field_pic_flag);
    va_TraceMsg("\t constrained_intra_pred_flag: %d\n", p->pic_fields.bits.constrained_intra_pred_flag);
    va_TraceMsg("frame_num: %d\n", p->frame_num);

    return;
}

static void va_TraceVASliceParameterBufferH264(
    VADisplay dpy,
    VAContextID context,
    VABufferID buffer,
    VABufferType type,
    unsigned int size,
    unsigned int num_elements,
    void *data)
{
    int i;
    VASliceParameterBufferH264* p = (VASliceParameterBufferH264*)data;

    va_TraceMsg  ("========== SLICE HEADER ============.\n");
    va_TraceMsg("slice_data_size: %d\n", p->slice_data_size);
    va_TraceMsg("slice_data_offset: %d\n", p->slice_data_offset);
    va_TraceMsg("slice_data_flag: %d\n", p->slice_data_flag);
    va_TraceMsg("slice_data_bit_offset: %d\n", p->slice_data_bit_offset);
    va_TraceMsg("first_mb_in_slice: %d\n", p->first_mb_in_slice);
    va_TraceMsg("slice_type: %d\n", p->slice_type);
    va_TraceMsg("direct_spatial_mv_pred_flag: %d\n", p->direct_spatial_mv_pred_flag);
    va_TraceMsg("num_ref_idx_l0_active_minus1: %d\n", p->num_ref_idx_l0_active_minus1);
    va_TraceMsg("num_ref_idx_l1_active_minus1: %d\n", p->num_ref_idx_l1_active_minus1);
    va_TraceMsg("cabac_init_idc: %d\n", p->cabac_init_idc);
    va_TraceMsg("slice_qp_delta: %d\n", p->slice_qp_delta);
    va_TraceMsg("disable_deblocking_filter_idc: %d\n", p->disable_deblocking_filter_idc);
    va_TraceMsg("slice_alpha_c0_offset_div2: %d\n", p->slice_alpha_c0_offset_div2);
    va_TraceMsg("slice_beta_offset_div2: %d\n", p->slice_beta_offset_div2);	

#if 1
    if (p->slice_type == 0 || p->slice_type == 1)
    {
        va_TraceMsg("RefPicList0:\n");
        for (i = 0; i < p->num_ref_idx_l0_active_minus1 + 1; i++)
        {
            //va_TraceMsg("%d-%d; ", p->RefPicList0[i].TopFieldOrderCnt, p->RefPicList0[i].BottomFieldOrderCnt);
            va_TraceMsg("%d-%d-%d-%d; ", p->RefPicList0[i].TopFieldOrderCnt, p->RefPicList0[i].BottomFieldOrderCnt, p->RefPicList0[i].picture_id, p->RefPicList0[i].frame_idx);
        }
        va_TraceMsg("\n");
        if (p->slice_type == 1)
        {
            va_TraceMsg("RefPicList1:\n");
            for (i = 0; i < p->num_ref_idx_l1_active_minus1 + 1; i++)
            {
                //va_TraceMsg("%d-%d; ", p->RefPicList1[i].TopFieldOrderCnt, p->RefPicList1[i].BottomFieldOrderCnt);
                va_TraceMsg("%d-%d-%d-%d; ", p->RefPicList1[i].TopFieldOrderCnt, p->RefPicList1[i].BottomFieldOrderCnt, p->RefPicList1[i].picture_id, p->RefPicList1[i].frame_idx);
            }
        }
        va_TraceMsg("\n");
    }
#endif

    va_TraceMsg("luma_log2_weight_denom: %d\n", p->luma_log2_weight_denom);
    va_TraceMsg("chroma_log2_weight_denom: %d\n", p->chroma_log2_weight_denom);
    va_TraceMsg("luma_weight_l0_flag: %d\n", p->luma_weight_l0_flag);
    if (p->luma_weight_l0_flag)
    {
        for (i = 0; i <=  p->num_ref_idx_l0_active_minus1; i++)
        {
            va_TraceMsg("%d ", p->luma_weight_l0[i]);
            va_TraceMsg("%d ", p->luma_offset_l0[i]);
        }
        va_TraceMsg("\n");
    }
	
		
    va_TraceMsg("chroma_weight_l0_flag: %d\n", p->chroma_weight_l0_flag);
    if (p->chroma_weight_l0_flag)
    {
        for (i = 0; i <= p->num_ref_idx_l0_active_minus1; i++)
        {
            va_TraceMsg("%d ", p->chroma_weight_l0[i][0]);
            va_TraceMsg("%d ", p->chroma_offset_l0[i][0]);
            va_TraceMsg("%d ", p->chroma_weight_l0[i][1]);
            va_TraceMsg("%d ", p->chroma_offset_l0[i][1]);
        }
        va_TraceMsg("\n");			
    }
    va_TraceMsg("luma_weight_l1_flag: %d\n", p->luma_weight_l1_flag);
    if (p->luma_weight_l1_flag)
    {
        for (i = 0; i <=  p->num_ref_idx_l1_active_minus1; i++)
        {
            va_TraceMsg("%d ", p->luma_weight_l1[i]);
            va_TraceMsg("%d ", p->luma_offset_l1[i]);
        }
        va_TraceMsg("\n");
    }
    va_TraceMsg("chroma_weight_l1_flag: %d\n", p->chroma_weight_l1_flag);
    if (p->chroma_weight_l1_flag)
    {
        for (i = 0; i <= p->num_ref_idx_l1_active_minus1; i++)
        {
            va_TraceMsg("%d ", p->chroma_weight_l1[i][0]);
            va_TraceMsg("%d ", p->chroma_offset_l1[i][0]);
            va_TraceMsg("%d ", p->chroma_weight_l1[i][1]);
            va_TraceMsg("%d ", p->chroma_offset_l1[i][1]);
        }
        va_TraceMsg("\n");			
    }	
}

static void va_TraceVAIQMatrixBufferH264(
    VADisplay dpy,
    VAContextID context,
    VABufferID buffer,
    VABufferType type,
    unsigned int size,
    unsigned int num_elements,
    void *data
)
{
    va_TraceMsg("========== IQMatrix ============.\n");
    VAIQMatrixBufferH264* p = (VAIQMatrixBufferH264* )data;
    int i, j;
    for (i = 0; i < 6; i++)
    {
        for (j = 0; j < 16; j++)
        {
            va_TraceMsg("%d\t", p->ScalingList4x4[i][j]);
            if ((j + 1) % 8 == 0)
                va_TraceMsg("\n");
        }
    }

    for (i = 0; i < 2; i++)
    {
        for (j = 0; j < 64; j++)
        {
            va_TraceMsg("%d\t", p->ScalingList8x8[i][j]);
            if ((j + 1) % 8 == 0)
                va_TraceMsg("\n");
        }		
    }
}

static void va_TraceVAPictureParameterBufferVC1(
    VADisplay dpy,
    VAContextID context,
    VABufferID buffer,
    VABufferType type,
    unsigned int size,
    unsigned int num_elements,
    void *data
)
{
    VAPictureParameterBufferVC1* p = (VAPictureParameterBufferVC1*)data;

    va_TraceMsg("\tforward_reference_picture = 0x%08x\n", p->forward_reference_picture);
    va_TraceMsg("\tbackward_reference_picture = 0x%08x\n", p->backward_reference_picture);
    va_TraceMsg("\tinloop_decoded_picture = 0x%08x\n", p->inloop_decoded_picture);
    
    va_TraceMsg("\tpulldown = %d\n", p->sequence_fields.bits.pulldown);
    va_TraceMsg("\tinterlace = %d\n", p->sequence_fields.bits.interlace);
    va_TraceMsg("\ttfcntrflag = %d\n", p->sequence_fields.bits.tfcntrflag);
    va_TraceMsg("\tfinterpflag = %d\n", p->sequence_fields.bits.finterpflag);
    va_TraceMsg("\tpsf                           = %d.\n",
                p->sequence_fields.bits.psf);
    va_TraceMsg("\tmultires                      = %d.\n",
                p->sequence_fields.bits.multires);
    va_TraceMsg("\toverlap                       = %d.\n",
                p->sequence_fields.bits.overlap);
    va_TraceMsg("\tsyncmarker                    = %d.\n",
                p->sequence_fields.bits.syncmarker);
    va_TraceMsg("\trangered                      = %d.\n",
                p->sequence_fields.bits.rangered);
    va_TraceMsg("\tmax_b_frames                  = %d.\n",
                p->sequence_fields.bits.max_b_frames);
    va_TraceMsg("\tcoded_width                   = %d.\n",
                p->coded_width);
    va_TraceMsg("\tcoded_height                  = %d.\n",
                p->coded_height);
    va_TraceMsg("\tclosed_entry                  = %d.\n",
                p->entrypoint_fields.bits.closed_entry);
    va_TraceMsg("\tbroken_link                   = %d.\n",
                p->entrypoint_fields.bits.broken_link);
    va_TraceMsg("\tclosed_entry                  = %d.\n",
                p->entrypoint_fields.bits.closed_entry);
    va_TraceMsg("\tpanscan_flag                  = %d.\n",
                p->entrypoint_fields.bits.panscan_flag);
    va_TraceMsg("\tloopfilter                    = %d.\n",
                p->entrypoint_fields.bits.loopfilter);
    va_TraceMsg("\tconditional_overlap_flag      = %d.\n",
                p->conditional_overlap_flag);
    va_TraceMsg("\tfast_uvmc_flag                = %d.\n",
                p->fast_uvmc_flag);
    va_TraceMsg("\trange_mapping_luma_flag       = %d.\n",
                p->range_mapping_fields.bits.luma_flag);
    va_TraceMsg("\trange_mapping_luma            = %d.\n",
                p->range_mapping_fields.bits.luma);
    va_TraceMsg("\trange_mapping_chroma_flag     = %d.\n",
                p->range_mapping_fields.bits.chroma_flag);
    va_TraceMsg("\trange_mapping_chroma          = %d.\n",
                p->range_mapping_fields.bits.chroma);
    va_TraceMsg("\tb_picture_fraction            = %d.\n",
                p->b_picture_fraction);
    va_TraceMsg("\tcbp_table                     = %d.\n",
                p->cbp_table);
    va_TraceMsg("\tmb_mode_table                 = %d.\n",
                p->mb_mode_table);
    va_TraceMsg("\trange_reduction_frame         = %d.\n",
                p->range_reduction_frame);
    va_TraceMsg("\trounding_control              = %d.\n",
                p->rounding_control);
    va_TraceMsg("\tpost_processing               = %d.\n",
                p->post_processing);
    va_TraceMsg("\tpicture_resolution_index      = %d.\n",
                p->picture_resolution_index);
    va_TraceMsg("\tluma_scale                    = %d.\n",
                p->luma_scale);
    va_TraceMsg("\tluma_shift                    = %d.\n",
                p->luma_shift);
    va_TraceMsg("\tpicture_type                  = %d.\n",
                p->picture_fields.bits.picture_type);
    va_TraceMsg("\tframe_coding_mode             = %d.\n",
                p->picture_fields.bits.frame_coding_mode);
    va_TraceMsg("\ttop_field_first               = %d.\n",
                p->picture_fields.bits.top_field_first);
    va_TraceMsg("\tis_first_field                = %d.\n",
                p->picture_fields.bits.is_first_field);
    va_TraceMsg("\tintensity_compensation        = %d.\n",
                p->picture_fields.bits.intensity_compensation);
    va_TraceMsg("  ---------------------------------\n");
    va_TraceMsg("\tmv_type_mb                    = %d.\n",
                p->raw_coding.flags.mv_type_mb);
    va_TraceMsg("\tdirect_mb                     = %d.\n",
                p->raw_coding.flags.direct_mb);
    va_TraceMsg("\tskip_mb                       = %d.\n",
                p->raw_coding.flags.skip_mb);
    va_TraceMsg("\tfield_tx                      = %d.\n",
                p->raw_coding.flags.field_tx);
    va_TraceMsg("\tforward_mb                    = %d.\n",
                p->raw_coding.flags.forward_mb);
    va_TraceMsg("\tac_pred                       = %d.\n",
                p->raw_coding.flags.ac_pred);
    va_TraceMsg("\toverflags                     = %d.\n",
                p->raw_coding.flags.overflags);
    va_TraceMsg("  ---------------------------------\n");
    va_TraceMsg("\tbp_mv_type_mb                 = %d.\n",
                p->bitplane_present.flags.bp_mv_type_mb);
    va_TraceMsg("\tbp_direct_mb                  = %d.\n",
                p->bitplane_present.flags.bp_direct_mb);
    va_TraceMsg("\tbp_skip_mb                    = %d.\n",
                p->bitplane_present.flags.bp_skip_mb);
    va_TraceMsg("\tbp_field_tx                   = %d.\n",
                p->bitplane_present.flags.bp_field_tx);
    va_TraceMsg("\tbp_forward_mb                 = %d.\n",
                p->bitplane_present.flags.bp_forward_mb);
    va_TraceMsg("\tbp_ac_pred                    = %d.\n",
                p->bitplane_present.flags.bp_ac_pred);
    va_TraceMsg("\tbp_overflags                  = %d.\n",
                p->bitplane_present.flags.bp_overflags);
    va_TraceMsg("  ---------------------------------\n");
    va_TraceMsg("\treference_distance_flag       = %d.\n",
                p->reference_fields.bits.reference_distance_flag);
    va_TraceMsg("\treference_distance            = %d.\n",
                p->reference_fields.bits.reference_distance);
    va_TraceMsg("\tnum_reference_pictures        = %d.\n",
                p->reference_fields.bits.num_reference_pictures);
    va_TraceMsg("\treference_field_pic_indicator = %d.\n",
                p->reference_fields.bits.reference_field_pic_indicator);
    va_TraceMsg("\tmv_mode                       = %d.\n",
                p->mv_fields.bits.mv_mode);
    va_TraceMsg("\tmv_mode2                      = %d.\n",
                p->mv_fields.bits.mv_mode2);
    va_TraceMsg("\tmv_table                      = %d.\n",
                p->mv_fields.bits.mv_table);
    va_TraceMsg("\ttwo_mv_block_pattern_table    = %d.\n",
                p->mv_fields.bits.two_mv_block_pattern_table);
    va_TraceMsg("\tfour_mv_switch                = %d.\n",
                p->mv_fields.bits.four_mv_switch);
    va_TraceMsg("\tfour_mv_block_pattern_table   = %d.\n",
                p->mv_fields.bits.four_mv_block_pattern_table);
    va_TraceMsg("\textended_mv_flag              = %d.\n",
                p->mv_fields.bits.extended_mv_flag);
    va_TraceMsg("\textended_mv_range             = %d.\n",
                p->mv_fields.bits.extended_mv_range);
    va_TraceMsg("\textended_dmv_flag             = %d.\n",
                p->mv_fields.bits.extended_dmv_flag);
    va_TraceMsg("\textended_dmv_range            = %d.\n",
                p->mv_fields.bits.extended_dmv_range);
    va_TraceMsg("\tdquant                        = %d.\n",
                p->pic_quantizer_fields.bits.dquant);
    va_TraceMsg("\tquantizer                     = %d.\n",
                p->pic_quantizer_fields.bits.quantizer);
    va_TraceMsg("\thalf_qp                       = %d.\n",
                p->pic_quantizer_fields.bits.half_qp);
    va_TraceMsg("\tpic_quantizer_scale           = %d.\n",
                p->pic_quantizer_fields.bits.pic_quantizer_scale);
    va_TraceMsg("\tpic_quantizer_type            = %d.\n",
                p->pic_quantizer_fields.bits.pic_quantizer_type);
    va_TraceMsg("\tdq_frame                      = %d.\n",
                p->pic_quantizer_fields.bits.dq_frame);
    va_TraceMsg("\tdq_profile                    = %d.\n",
                p->pic_quantizer_fields.bits.dq_profile);
    va_TraceMsg("\tdq_sb_edge                    = %d.\n",
                p->pic_quantizer_fields.bits.dq_sb_edge);
    va_TraceMsg("\tdq_db_edge                    = %d.\n",
                p->pic_quantizer_fields.bits.dq_db_edge);
    va_TraceMsg("\tdq_binary_level               = %d.\n",
                p->pic_quantizer_fields.bits.dq_binary_level);
    va_TraceMsg("\talt_pic_quantizer             = %d.\n",
                p->pic_quantizer_fields.bits.alt_pic_quantizer);
    va_TraceMsg("\tvariable_sized_transform_flag = %d.\n",
                p->transform_fields.bits.variable_sized_transform_flag);
    va_TraceMsg("\tmb_level_transform_type_flag  = %d.\n",
                p->transform_fields.bits.mb_level_transform_type_flag);
    va_TraceMsg("\tframe_level_transform_type    = %d.\n",
                p->transform_fields.bits.frame_level_transform_type);
    va_TraceMsg("\ttransform_ac_codingset_idx1   = %d.\n",
                p->transform_fields.bits.transform_ac_codingset_idx1);
    va_TraceMsg("\ttransform_ac_codingset_idx2   = %d.\n",
                p->transform_fields.bits.transform_ac_codingset_idx2);
    va_TraceMsg("\tintra_transform_dc_table      = %d.\n",
                p->transform_fields.bits.intra_transform_dc_table);
}

static void va_TraceVASliceParameterBufferVC1(
    VADisplay dpy,
    VAContextID context,
    VABufferID buffer,
    VABufferType type,
    unsigned int size,
    unsigned int num_elements,
    void* data
)
{
    VASliceParameterBufferVC1 *p = (VASliceParameterBufferVC1*)data;

    va_TraceMsg ("========== SLICE NUMBER ==========\n");
    va_TraceMsg ("    slice_data_size               = %d\n", p->slice_data_size);
    va_TraceMsg ("    slice_data_offset             = %d\n", p->slice_data_offset);
    va_TraceMsg ("    slice_data_flag               = %d\n", p->slice_data_flag);
    va_TraceMsg ("    macroblock_offset             = %d\n", p->macroblock_offset);
    va_TraceMsg ("    slice_vertical_position       = %d\n", p->slice_vertical_position);
}

int va_TraceBeginPicture(
    VADisplay dpy,
    VAContextID context,
    VASurfaceID render_target
)
{
    int i;

    va_TraceMsg("\tcontext = 0x%08x\n", context);
    va_TraceMsg("\t\trender_targets = 0x%08x\n", render_target);

    trace_rendertarget = render_target; /* for surface data dump after vaEndPicture */

    trace_frame++;
    trace_slice = 0;
}

VAStatus vaBufferInfo (
    VADisplay dpy,
    VAContextID context,	/* in */
    VABufferID buf_id,		/* in */
    VABufferType *type,		/* out */
    unsigned int *size,		/* out */
    unsigned int *num_elements	/* out */
);

static int va_TraceMPEG2Buf(
    VADisplay dpy,
    VAContextID context,
    VABufferID buffer,
    VABufferType type,
    unsigned int size,
    unsigned int num_elements,
    void *pbuf
)
{
    switch (type) {
    case VAPictureParameterBufferType:
        va_TraceVAPictureParameterBufferMPEG2(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VAIQMatrixBufferType:
        va_TraceVAIQMatrixBufferMPEG2(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VABitPlaneBufferType:
        break;
    case VASliceGroupMapBufferType:
        break;
    case VASliceParameterBufferType:
        trace_slice++;
        va_TraceVASliceParameterBufferMPEG2(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VASliceDataBufferType:
        va_TraceVABuffers(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VAMacroblockParameterBufferType:
        break;
    case VAResidualDataBufferType:
        break;
    case VADeblockingParameterBufferType:
        break;
    case VAImageBufferType:
        break;
    case VAProtectedSliceDataBufferType:
        break;
    case VAEncCodedBufferType:
        break;
    case VAEncSequenceParameterBufferType:
        break;
    case VAEncPictureParameterBufferType:
        break;
    case VAEncSliceParameterBufferType:
        break;
    case VAEncH264VUIBufferType:
        break;
    case VAEncH264SEIBufferType:
        break;
    }
    
    return 0;
}


static int va_TraceMPEG4Buf(
    VADisplay dpy,
    VAContextID context,
    VABufferID buffer,
    VABufferType type,
    unsigned int size,
    unsigned int num_elements,
    void *pbuf
)
{
    switch (type) {
    case VAPictureParameterBufferType:
        va_TraceVAPictureParameterBufferMPEG4(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VAIQMatrixBufferType:
        va_TraceVAIQMatrixBufferMPEG4(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VABitPlaneBufferType:
        break;
    case VASliceGroupMapBufferType:
        break;
    case VASliceParameterBufferType:
        va_TraceVASliceParameterBufferMPEG4(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VASliceDataBufferType:
        va_TraceVABuffers(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VAMacroblockParameterBufferType:
        break;
    case VAResidualDataBufferType:
        break;
    case VADeblockingParameterBufferType:
        break;
    case VAImageBufferType:
        break;
    case VAProtectedSliceDataBufferType:
        va_TraceVABuffers(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VAEncCodedBufferType:
        break;
    case VAEncSequenceParameterBufferType:
        break;
    case VAEncPictureParameterBufferType:
        break;
    case VAEncSliceParameterBufferType:
        break;
    case VAEncH264VUIBufferType:
        break;
    case VAEncH264SEIBufferType:
        break;
    default:
        break;
    }
    
    
    return 0;
}


static int va_TraceH264Buf(
    VADisplay dpy,
    VAContextID context,
    VABufferID buffer,
    VABufferType type,
    unsigned int size,
    unsigned int num_elements,
    void *pbuf
)
{
    switch (type) {
    case VAPictureParameterBufferType:
        va_TraceVAPictureParameterBufferMPEG2(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VAIQMatrixBufferType:
        va_TraceVAIQMatrixBufferH264(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VABitPlaneBufferType:
        break;
    case VASliceGroupMapBufferType:
        break;
    case VASliceParameterBufferType:
        va_TraceVASliceParameterBufferH264(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VASliceDataBufferType:
        va_TraceVABuffers(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VAMacroblockParameterBufferType:
        break;
    case VAResidualDataBufferType:
        break;
    case VADeblockingParameterBufferType:
        break;
    case VAImageBufferType:
        break;
    case VAProtectedSliceDataBufferType:
        va_TraceVABuffers(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VAEncCodedBufferType:
        break;
    case VAEncSequenceParameterBufferType:
        break;
    case VAEncPictureParameterBufferType:
        break;
    case VAEncSliceParameterBufferType:
        break;
    case VAEncH264VUIBufferType:
        break;
    case VAEncH264SEIBufferType:
        break;
    default:
        break;
    }
    
    
    return 0;
}


static int va_TraceVC1Buf(
    VADisplay dpy,
    VAContextID context,
    VABufferID buffer,
    VABufferType type,
    unsigned int size,
    unsigned int num_elements,
    void *pbuf
)
{
    switch (type) {
    case VAPictureParameterBufferType:
        va_TraceVAPictureParameterBufferVC1(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VAIQMatrixBufferType:
        break;
    case VABitPlaneBufferType:
        va_TraceVABuffers(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VASliceGroupMapBufferType:
        break;
    case VASliceParameterBufferType:
        va_TraceVASliceParameterBufferVC1(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VASliceDataBufferType:
        va_TraceVABuffers(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VAMacroblockParameterBufferType:
        break;
    case VAResidualDataBufferType:
        break;
    case VADeblockingParameterBufferType:
        break;
    case VAImageBufferType:
        break;
    case VAProtectedSliceDataBufferType:
        va_TraceVABuffers(dpy, context, buffer, type, size, num_elements, pbuf);
        break;
    case VAEncCodedBufferType:
        break;
    case VAEncSequenceParameterBufferType:
        break;
    case VAEncPictureParameterBufferType:
        break;
    case VAEncSliceParameterBufferType:
        break;
    case VAEncH264VUIBufferType:
        break;
    case VAEncH264SEIBufferType:
        break;
    default:
        break;
    }
    
    return 0;
}

int va_TraceRenderPicture(
    VADisplay dpy,
    VAContextID context,
    VABufferID *buffers,
    int num_buffers
)
{
    VABufferType type;
    unsigned int size;
    unsigned int num_elements;
    int i;

    va_TraceMsg("\tcontext = 0x%08x\n", context);
    va_TraceMsg("\tnum_buffers = %d\n", num_buffers);
    for (i = 0; i < num_buffers; i++) {
        void *pbuf;

        /* get buffer type information */
        vaBufferInfo(dpy, context, buffers[i], &type, &size, &num_elements);
        
        va_TraceMsg("\t\tbuffers[%d] = 0x%08x\n", i, buffers[i]);
        va_TraceMsg("\t\t\ttype = %s\n", buffer_type_to_string(type));
        va_TraceMsg("\t\t\tsize = %d\n", size);
        va_TraceMsg("\t\t\tnum_elements = %d\n", num_elements);


        vaMapBuffer(dpy, buffers[i], &pbuf);

        switch (trace_profile) {
        case VAProfileMPEG2Simple:
        case VAProfileMPEG2Main:
            va_TraceMPEG2Buf(dpy, context, buffers[i], type, size, num_elements, pbuf);
            break;
        case VAProfileMPEG4Simple:
        case VAProfileMPEG4AdvancedSimple:
        case VAProfileMPEG4Main:
            va_TraceMPEG4Buf(dpy, context, buffers[i], type, size, num_elements, pbuf);
            break;
        case VAProfileH264Baseline:
        case VAProfileH264Main:
        case VAProfileH264High:
            va_TraceH264Buf(dpy, context, buffers[i], type, size, num_elements, pbuf);
            break;
        case VAProfileVC1Simple:
        case VAProfileVC1Main:
        case VAProfileVC1Advanced:
            va_TraceVC1Buf(dpy, context, buffers[i], type, size, num_elements, pbuf);
            break;
        case VAProfileH263Baseline:
            break;
        }

        vaUnmapBuffer(dpy, buffers[i]);
    }
}


int va_TraceEndPicture(
    VADisplay dpy,
    VAContextID context
)
{
    int i, j;
    unsigned int fourcc; /* following are output argument */
    unsigned int luma_stride;
    unsigned int chroma_u_stride;
    unsigned int chroma_v_stride;
    unsigned int luma_offset;
    unsigned int chroma_u_offset;
    unsigned int chroma_v_offset;
    void *buffer;
    char *Y_data, *UV_data, *tmp;
    
    VAStatus va_status;
    
    va_TraceMsg("\tcontext = 0x%08x\n", context);
    va_TraceMsg("\t\trender_targets = 0x%08x\n", trace_rendertarget);
    
    /* force the pipleline finish rendering */
    vaSyncSurface(dpy, trace_rendertarget);

    va_TraceMsg("***dump surface data***\n", trace_rendertarget);

    va_status = vaCopySurfaceToBuffer(dpy, trace_rendertarget, &fourcc, &luma_stride, &chroma_u_stride, &chroma_v_stride,
                                      &luma_offset, &chroma_u_offset, &chroma_v_offset, &buffer);

    if (va_status != VA_STATUS_SUCCESS)
        return va_status;
    
    va_TraceMsg("\tfourcc=0x%08x\n", fourcc);
    va_TraceMsg("\twidth=%d\n", trace_width);
    va_TraceMsg("\theight=%d\n", trace_height);
    va_TraceMsg("\tluma_stride=%d\n", luma_stride);
    va_TraceMsg("\tchroma_u_stride=%d\n", chroma_u_stride);
    va_TraceMsg("\tchroma_v_stride=%d\n", chroma_v_stride);
    va_TraceMsg("\tluma_offset=%d\n", luma_offset);
    va_TraceMsg("\tchroma_u_offset=%d\n", chroma_u_offset);
    va_TraceMsg("\tchroma_v_offset=%d\n", chroma_v_offset);

    va_TraceMsg("**Y data**\n");

    Y_data = buffer;
    UV_data = buffer + luma_offset;

    tmp = Y_data;
    
    for (i=0; i<trace_height; i++) {
        for (j=0; j<trace_width; j++) {
            if ((j%16) == 0)
                va_TraceMsg("\n0x%08x:", j + i*trace_width);
            va_TraceMsg("%08x ", tmp[j]);
        }

        va_TraceMsg("\n");
        tmp = Y_data + i * luma_stride;
    }

    tmp = UV_data;
    if (fourcc == VA_FOURCC_NV12) {
        va_TraceMsg("**UV data**\n");
        
        for (i=0; i<trace_height/2; i++) {
            for (j=0; j<trace_width; j++) {
                if ((j%16) == 0)
                    va_TraceMsg("\n0x%08x:", j + i*trace_width);
                va_TraceMsg("%08x ", tmp[j]);
            }

            va_TraceMsg("\n");
            tmp = UV_data + i * chroma_u_stride;
        }
    }
    free((void *)buffer);
}
