/*
* Copyright (c) 2011 Intel Corporation. All Rights Reserved.
* Copyright (c) Imagination Technologies Limited, UK
*
* 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.
*
* Authors:
* Fei Jiang <fei.jiang@intel.com>
*
*/
#include <va/va_backend.h>
#include <va/va_backend_tpi.h>
#include <va/va_backend_egl.h>
#include <va/va_drmcommon.h>
#include <stdlib.h>
#include "psb_drv_video.h"
#include "psb_drv_debug.h"
#include "psb_buffer.h"
#include "psb_cmdbuf.h"
#include "psb_surface.h"
#include "hwdefs/mem_io.h"
#include "hwdefs/msvdx_offsets.h"
#include "hwdefs/dma_api.h"
#include "hwdefs/reg_io2.h"
#include "hwdefs/msvdx_vec_reg_io2.h"
#include "hwdefs/msvdx_vdmc_reg_io2.h"
#include "hwdefs/msvdx_mtx_reg_io2.h"
#include "hwdefs/msvdx_dmac_linked_list.h"
#include "hwdefs/msvdx_rendec_mtx_slice_cntrl_reg_io2.h"
#include "hwdefs/dxva_cmdseq_msg.h"
#include "hwdefs/dxva_fw_ctrl.h"
#include "hwdefs/fwrk_msg_mem_io.h"
#include "hwdefs/dxva_msg.h"
#include "hwdefs/msvdx_cmds_io2.h"
#define PSB_VIDEO_DEBUG_FILE "/data/mediadrm/log"
#define PSB_VIDEO_TRACE_FILE "/data/mediadrm/trace"
#define PSB_VIDEO_DUMP_VABUF_FILE "/data/mediadrm/dump.va"
#define PSB_VIDEO_DUMP_VABUF_VERBOSE_FILE "/data/mediadrm/dump.va.verbose"
#define PSB_VIDEO_DUMP_YUVBUF_FILE "/data/mediadrm/dump.yuv"
void psb__open_log(void)
{
char log_fn[1024] = {0};
unsigned int suffix;
char env_fn[1024] = {0};//used to get file name from psbvideo.conf, only to check if value is set
if ((psb_video_debug_fp != NULL) && (psb_video_debug_fp != stderr)) {
debug_fp_count++;
} else {
/* psb video info debug */
if (psb_parse_config("PSB_VIDEO_DEBUG", &env_fn[0]) == 0) {
strcpy(log_fn, PSB_VIDEO_DEBUG_FILE);
drv_debug_msg(VIDEO_DEBUG_GENERAL, "Log file %s , force use %s\n", env_fn, log_fn);
suffix = 0xffff & ((unsigned int)time(NULL));
snprintf(log_fn + strnlen(log_fn, 1024),
(1024 - 8 - strnlen(log_fn, 1024)),
".%d.%d", getpid(), suffix);
psb_video_debug_fp = fopen(log_fn, "w");
if (psb_video_debug_fp == 0) {
drv_debug_msg(VIDEO_DEBUG_ERROR, "Log file %s open failed, reason %s, fall back to stderr\n",
log_fn, strerror(errno));
psb_video_debug_fp = stderr;
} else {
drv_debug_msg(VIDEO_DEBUG_GENERAL, "Log file %s open successfully\n", log_fn);
debug_fp_count++;
}
#ifdef ANDROID
ALOGD("PSB_VIDEO_DEBUG is enabled.\n");
#endif
} else {
psb_video_debug_fp = NULL;
}
}
if(psb_parse_config("PSB_VIDEO_TRACE", &env_fn[0]) == 0) {
strcpy(log_fn, PSB_VIDEO_TRACE_FILE);
drv_debug_msg(VIDEO_DEBUG_GENERAL, "Log file %s , force use %s\n", env_fn, log_fn);
unsigned int suffix = 0xffff & ((unsigned int)time(NULL));
time_t curtime;
log_fn[1024 - 8] = '\0';
if(strncmp(log_fn, "/dev/stdout", sizeof("/dev/stdout")) != 0)
sprintf(log_fn + strlen(log_fn), ".%d", suffix);
psb_video_trace_fp = fopen(log_fn, "w");
if (psb_video_trace_fp == NULL)
psb_video_trace_fp = stderr;
time(&curtime);
fprintf(psb_video_trace_fp, "---- %s\n---- Start Trace ----\n", ctime(&curtime));
debug_dump_count = 0;
g_hexdump_offset = 0;
#ifdef ANDROID
ALOGD("PSB_VIDEO_TRACE is enabled.\n");
#endif
} else {
psb_video_trace_fp = NULL;
}
/* debug level include error, warning, general, init, entry, ...... */
if(psb_parse_config("PSB_VIDEO_DEBUG_LEVEL", &env_fn[0]) == 0) {
psb_video_debug_level = atoi(env_fn);
#ifdef ANDROID
ALOGD("psb_video_debug_level is %d parsed.\n", psb_video_debug_level);
#endif
} else {
psb_video_debug_level = 0x1;
}
/* control debug output option, logcat output or print to file */
if(psb_parse_config("PSB_VIDEO_DEBUG_OPTION", &env_fn[0]) == 0) {
psb_video_debug_option = atoi(env_fn);
#ifdef ANDROID
ALOGD("psb_video_debug_option is %d parsed.\n", psb_video_debug_option);
#endif
} else {
psb_video_debug_option = 0;
}
/* trace level include vabuf, cmdmsg buf, aux buffer, lldma */
if(psb_parse_config("PSB_VIDEO_TRACE_LEVEL", &env_fn[0]) == 0) {
psb_video_trace_level = atoi(env_fn);
#ifdef ANDROID
ALOGD("psb_video_trace_level is %d parsed.\n", psb_video_trace_level);
#endif
} else {
psb_video_trace_level = 0;
}
/* control trace output option, logcat output or print to file */
if(psb_parse_config("PSB_VIDEO_TRACE_OPTION", &env_fn[0]) == 0) {
psb_video_trace_option = atoi(env_fn);
#ifdef ANDROID
ALOGD("psb_video_debug_option is %d parsed.\n", psb_video_trace_option);
#endif
} else {
psb_video_trace_option = 0;
}
/* cmdbuf dump, every frame decoded cmdbuf dump to /data/ctrlAlloc%i.txt */
if(psb_parse_config("PSB_VIDEO_DUMP_CMDBUF", &env_fn[0]) == 0) {
if(strstr(env_fn, "true") != NULL)
psb_video_dump_cmdbuf = TRUE;
else
psb_video_dump_cmdbuf = FALSE;
#ifdef ANDROID
ALOGD("PSB_VIDEO_DUMP_CMDBUF is %d.\n", psb_video_dump_cmdbuf);
#endif
} else {
psb_video_dump_cmdbuf = FALSE;
}
/* psb video va buffers dump */
if(psb_parse_config("PSB_VIDEO_DUMP_VABUF", &env_fn[0]) == 0) {
strcpy(log_fn, PSB_VIDEO_DUMP_VABUF_FILE);
drv_debug_msg(VIDEO_DEBUG_GENERAL, "Log file %s , force use %s\n", env_fn, log_fn);
unsigned int suffix = 0xffff & ((unsigned int)time(NULL));
/* Make sure there is space left for suffix */
log_fn[1024 - 12] = '\0';
if(strncmp(log_fn, "/dev/stdout", sizeof("/dev/stdout")) != 0)
snprintf(log_fn + strlen(log_fn), 11, ".%d", suffix);
psb_dump_vabuf_fp = fopen(log_fn, "w");
#ifdef ANDROID
ALOGD("PSB_VIDEO_DUMP_VABUF is enabled.\n");
#endif
} else {
psb_dump_vabuf_fp = NULL;
}
/* psb video va buffer verbose dump */
if(psb_parse_config("PSB_VIDEO_DUMP_VABUF_VERBOSE", &env_fn[0]) == 0) {
strcpy(log_fn, PSB_VIDEO_DUMP_VABUF_VERBOSE_FILE);
drv_debug_msg(VIDEO_DEBUG_GENERAL, "Log file %s , force use %s\n", env_fn, log_fn);
unsigned int suffix = 0xffff & ((unsigned int)time(NULL));
/* Make sure there is space left for suffix */
log_fn[1024 - 12] = '\0';
if(strncmp(log_fn, "/dev/stdout", sizeof("/dev/stdout")) != 0)
snprintf(log_fn + strlen(log_fn), 11, ".%d", suffix);
psb_dump_vabuf_verbose_fp = fopen(log_fn, "w");
#ifdef ANDROID
ALOGD("PSB_VIDEO_DUMP_VABUF_VERBOSE is enabled.\n");
#endif
} else {
psb_dump_vabuf_verbose_fp = NULL;
}
/* dump decoded surface to a yuv file */
if(psb_parse_config("PSB_VIDEO_DUMP_YUVBUF", &env_fn[0]) == 0) {
strcpy(log_fn, PSB_VIDEO_DUMP_YUVBUF_FILE);
drv_debug_msg(VIDEO_DEBUG_GENERAL, "Log file %s , force use %s\n", env_fn, log_fn);
unsigned int suffix = 0xffff & ((unsigned int)time(NULL));
/* Make sure there is space left for suffix */
log_fn[1024 - 12] = '\0';
if(strncmp(log_fn, "/dev/stdout", sizeof("/dev/stdout")) != 0)
snprintf(log_fn + strlen(log_fn), 11, ".%d", suffix);
psb_dump_yuvbuf_fp = fopen(log_fn, "ab");
#ifdef ANDROID
ALOGD("PSB_VIDEO_DUMP_YUVBUF is enabled.\n");
#endif
} else {
psb_dump_yuvbuf_fp = NULL;
}
}
void psb__close_log(void)
{
if ((psb_video_debug_fp != NULL) & (psb_video_debug_fp != stderr)) {
debug_fp_count--;
if (debug_fp_count == 0) {
fclose(psb_video_debug_fp);
psb_video_debug_fp = NULL;
}
}
if(psb_video_trace_fp != NULL) {
fclose(psb_video_trace_fp);
psb_video_trace_fp = NULL;
}
if(psb_dump_vabuf_fp != NULL) {
fclose(psb_dump_vabuf_fp);
psb_dump_vabuf_fp = NULL;
}
if(psb_dump_vabuf_verbose_fp != NULL) {
fclose(psb_dump_vabuf_verbose_fp);
psb_dump_vabuf_verbose_fp = NULL;
}
if(psb_dump_yuvbuf_fp != NULL) {
fclose(psb_dump_yuvbuf_fp);
psb_dump_yuvbuf_fp = NULL;
}
return;
}
/*
* read a config "env" for libva.conf or from environment setting
* liva.conf has higher priority
* return 0: the "env" is set, and the value is copied into env_value
* 1: the env is not set
*/
int psb_parse_config(char *env, char *env_value)
{
char *token, *value, *saveptr;
char oneline[1024];
FILE *fp = NULL;
char *env_ptr;
if (env == NULL)
return 1;
fp = fopen("/etc/psbvideo.conf", "r");
while (fp && (fgets(oneline, 1024, fp) != NULL)) {
if (strlen(oneline) == 1)
continue;
token = strtok_r(oneline, "=\n", &saveptr);
value = strtok_r(NULL, "=\n", &saveptr);
if (NULL == token || NULL == value)
continue;
if (strcmp(token, env) == 0) {
if (env_value)
strcpy(env_value, value);
fclose(fp);
return 0;
}
}
if (fp)
fclose(fp);
env_ptr = getenv(env);
if (env_ptr) {
if (env_value)
strncpy(env_value, env_ptr, strlen(env_ptr));
return 0;
}
return 1;
}
void drv_debug_msg(DEBUG_LEVEL debug_level, const char *msg, ...)
{
va_list args;
#ifdef ANDROID
if (debug_level == VIDEO_DEBUG_ERROR) {
va_start(args, msg);
char tag[128];
(void)tag;
sprintf(tag, "pvr_drv_video ");
__android_log_vprint(ANDROID_LOG_ERROR, tag, msg, args);
va_end(args);
}
if ((psb_video_debug_option & PRINT_TO_LOGCAT) && (debug_level & psb_video_debug_level)) {
va_start(args, msg);
char tag[128];
(void)tag;
if (psb_video_debug_option & THREAD_DEBUG)
sprintf(tag, "pvr_drv_video[%d:0x%08lx]", getpid(), pthread_self());
else
sprintf(tag, "pvr_drv_video ");
__android_log_vprint(ANDROID_LOG_DEBUG, tag, msg, args);
va_end(args);
}
#endif
if (!psb_video_debug_fp && (psb_video_debug_level & VIDEO_DEBUG_ERROR))
psb_video_debug_fp = stderr;
if (psb_video_debug_fp && (psb_video_debug_option & PRINT_TO_FILE) &&
(debug_level & psb_video_debug_level)) {
if (psb_video_debug_option & TIME_DEBUG)
fprintf(psb_video_debug_fp, "TickCount - [0x%08lx], ",
GetTickCount());
if (psb_video_debug_option & THREAD_DEBUG)
fprintf(psb_video_debug_fp, "Thread - (%d:0x%08lx) ",
getpid(), pthread_self());
va_start(args, msg);
vfprintf(psb_video_debug_fp, msg, args);
va_end(args);
fflush(psb_video_debug_fp);
//fsync(fileno(psb_video_debug_fp));
}
}
int psb__dump_I420_buffers(
psb_surface_p psb_surface,
short __maybe_unused srcx,
short srcy,
unsigned short srcw,
unsigned short srch)
{
unsigned char *mapped_buffer;
unsigned char *mapped_buffer1, *mapped_buffer2;
if (psb_dump_yuvbuf_fp) {
psb_buffer_map(&psb_surface->buf, (unsigned char**)&mapped_buffer);
if(mapped_buffer == NULL)
return VA_STATUS_ERROR_INVALID_BUFFER;
int j,k;
mapped_buffer1 = mapped_buffer + psb_surface->stride * srcy;
mapped_buffer2 = mapped_buffer + psb_surface->stride * (srch + srcy / 2);
mapped_buffer = mapped_buffer2;
for(j = 0; j < srch; ++j)
{
fwrite(mapped_buffer1, srcw, 1, psb_dump_yuvbuf_fp);
mapped_buffer1 += psb_surface->stride;
}
for(j = 0; j < srch /2; ++j) {
for(k = 0; k < srcw; ++k) {
if((k%2) == 0)fwrite(mapped_buffer2, 1, 1, psb_dump_yuvbuf_fp);
mapped_buffer2++;
}
mapped_buffer2 += psb_surface->stride - srcw;
}
mapped_buffer2 = mapped_buffer;
for(j = 0; j < srch /2; ++j)
{
for(k = 0; k < srcw; ++k)
{
if((k % 2) == 1)
fwrite(mapped_buffer2, 1, 1, psb_dump_yuvbuf_fp);
mapped_buffer2++;
}
mapped_buffer2 += psb_surface->stride-srcw;
}
psb_buffer_unmap(&psb_surface->buf);
}
return 0;
}
int psb__dump_NV12_buffers(
psb_surface_p psb_surface,
short __maybe_unused srcx,
short __maybe_unused srcy,
unsigned short srcw,
unsigned short srch)
{
unsigned char *mapped_buffer;
unsigned char *mapped_start;
if (psb_dump_yuvbuf_fp) {
psb_buffer_map(&psb_surface->buf, (unsigned char **)&mapped_buffer);
if(mapped_buffer == NULL)
return VA_STATUS_ERROR_INVALID_BUFFER;
int i;
int row = srch;
mapped_start = mapped_buffer;
for(i = 0; i < row; ++i)
{
fwrite(mapped_buffer, srcw, 1, psb_dump_yuvbuf_fp);
mapped_buffer += psb_surface->stride;
}
mapped_buffer = mapped_start + psb_surface->chroma_offset;
for(i = 0; i < row/2; ++i)
{
fwrite(mapped_buffer, srcw, 1, psb_dump_yuvbuf_fp);
mapped_buffer += psb_surface->stride;
}
psb_buffer_unmap(&psb_surface->buf);
}
return 0;
}
int psb_cmdbuf_dump(unsigned int *buffer, int byte_size)
{
static int c=0;
static char pFileName[50];
if (psb_video_dump_cmdbuf == FALSE)
return 0;
sprintf( pFileName , "/data/ctrlAlloc%i.txt", c++);
FILE* pF = fopen(pFileName,"w");
if(pF == NULL) {
return 1;
}
int idx=0;
unsigned int x;
while( idx < byte_size / 4 )
{
unsigned int cmd = buffer[idx++];
fprintf( pF , "Command Word: %08X\n" , cmd );
switch( cmd&0xf0000000 )
{
case 0x70000000:
{
fprintf( pF , "%04X 2NDPASSDEBLOCK\n" , (idx-1)*4 );
for( x=0;x< 5 ;x++)
{
fprintf( pF ,"\t\t%08X\n",
buffer[idx] );
idx++;
}
break;
}
case 0x90000000:
{
fprintf( pF , "%04X HEADER\n" , (idx-1)*4 );
for( x=0;x< 7 ;x++)
{
fprintf( pF ,"\t\t%08X\n",
buffer[idx] );
idx++;
}
break;
}
case 0x10000000:
{
fprintf( pF , "%04X CMD_REGVALPAIR_WRITE ( %08X )\n", (idx-1)*4 , cmd);
unsigned int addr = cmd&0xffff;
unsigned int count = (cmd>>16)&0xff;
for( x=0;x< count ;x++)
{
fprintf( pF ,"\t\t%08X %08X\n",
addr ,
buffer[idx] );
idx+=1;
addr+=4;
}
break;
}
case 0x50000000:
{
fprintf( pF , "%04X CMD_RENDEC_BLOCK( %08X )\n", (idx-1)*4 , cmd);
unsigned int count = (cmd>>16)&0x00ff;
unsigned int uiAddr = (cmd &0xffff ); /* to do, limit this */
for( x=0;x< count ;x++)
{
fprintf( pF ,"\t\t%08X %08X\n",
uiAddr ,
buffer[idx++] );
uiAddr+= 4;
}
break;
}
case 0xd0000000:
{
fprintf( pF , "%04X CMD_NEXT_SEG\n", (idx-1)*4 );
fprintf( pF , "wrong\n");
goto done;
break;
}
case 0xb0000000:
{
fprintf( pF , "%04X SR SETUP %08x\n" , (idx-1)*4 , cmd );
for( x=0;x< 2 ;x++)
{
fprintf( pF ,"\t\t%08X\n",
buffer[idx] );
idx++;
}
break;
}
case 0xf0000000:
{
fprintf( pF , "%04X CMD_PARSE_HEADER %08x\n" , (idx-1)*4 , cmd );
for( x=0;x< 8 ;x++)
{
fprintf( pF ,"\t\t%08X\n",
buffer[idx] );
idx++;
}
break;
}
case 0x60000000:
goto done;
default:
fprintf( pF , "%04X %08x\n" ,(idx-1)*4 , cmd);
}
}
done:
fclose( pF );
return 0;
}
/********************* trace debug start *************************/
void psb__trace_message(const char *msg, ...)
{
va_list args;
#ifdef ANDROID
if ((psb_video_trace_option & PRINT_TO_LOGCAT) && msg) {
va_start(args, msg);
char tag[128];
(void)tag;
sprintf(tag, "pvr_drv_video ");
__android_log_vprint(ANDROID_LOG_DEBUG, tag, msg, args);
va_end(args);
}
#endif
if (psb_video_trace_fp && (psb_video_trace_option & PRINT_TO_FILE)) {
if (msg) {
va_start(args, msg);
vfprintf(psb_video_trace_fp, msg, args);
va_end(args);
} else {
fflush(psb_video_trace_fp);
//fsync(fileno(psb_video_trace_fp));
}
}
}
void psb__debug_w(uint32_t val, char *fmt, uint32_t bit_to, uint32_t bit_from)
{
if (bit_to < 31) {
val &= ~(0xffffffff << (bit_to + 1));
}
val = val >> bit_from;
psb__trace_message(fmt, val);
}
#define DBH(fmt, arg...) psb__trace_message(fmt, ##arg)
#define DB(fmt, arg1, arg...) psb__trace_message("[%08x] %08x = " fmt, ((unsigned char *) arg1) - cmd_start, *arg1, ##arg)
/* See also MsvdxGpuSim() in msvdxgpu.c */
void debug_dump_cmdbuf(uint32_t *cmd_idx, uint32_t cmd_size_in_bytes)
{
uint32_t cmd_size = cmd_size_in_bytes / sizeof(uint32_t);
uint32_t *cmd_end = cmd_idx + cmd_size;
unsigned char *cmd_start = (unsigned char *)cmd_idx;
struct {
unsigned int start;
unsigned int end;
char *name;
} msvdx_regs[11] = {{0x00000000, 0x000003FF, "MTX_MTX"},
{0x00000400, 0x0000047F, "VDMC_MTX"},
{0x00000480, 0x000004FF, "VDEB_MTX"},
{0x00000500, 0x000005FF, "DMAC_MTX"},
{0x00000600, 0x000006FF, "SYS_MTX"},
{0x00000700, 0x000007FF, "VEC_IQRAM_MTX"},
{0x00000800, 0x00000FFF, "VEC_MTX"},
{0x00001000, 0x00001FFF, "CMD_MTX"},
{0x00002000, 0x00002FFF, "VEC_RAM_MTX"},
{0x00003000, 0x00004FFF, "VEC_VLC_M"},
{0x00005000, 0xFFFFFFFF, "OUT_OF_RANGE"}
};
DBH("CMD BUFFER [%08x] - [%08x], %08x bytes, %08x dwords\n", (uint32_t) cmd_idx, cmd_end, cmd_size_in_bytes, cmd_size);
while (cmd_idx < cmd_end) {
uint32_t cmd = *cmd_idx;
/* What about CMD_MAGIC_BEGIN ?*/
switch (cmd & CMD_MASK) {
case CMD_NOP: {
DB("CMD_NOPE\n", cmd_idx);
cmd_idx++;
break;
}
case CMD_REGVALPAIR_WRITE: {
uint32_t count = (cmd & 0xfff0000) >> 16;
uint32_t reg = cmd & 0xffff;
DB("CMD_REGVALPAIR_WRITE count = 0x%08x\n", cmd_idx, count);
cmd_idx++;
while (count--) {
int i;
for (i = 0; i < 10; i++) {
if ((reg >= msvdx_regs[i].start) &&
(reg <= msvdx_regs[i].end))
break;
}
psb__trace_message("%s_%04x\n", msvdx_regs[i].name, reg);
reg += 4;
DB("value\n", cmd_idx);
cmd_idx++;
}
break;
}
case CMD_RENDEC_WRITE: {
uint32_t encoding;
uint32_t count = (cmd & CMD_RENDEC_COUNT_MASK) >> CMD_RENDEC_COUNT_SHIFT;
DB("CMD_RENDEC_WRITE count = %08x\n", cmd_idx, count);
cmd_idx++;
DB("RENDEC_SL_HDR\n", cmd_idx);
cmd_idx++;
DB("RENDEC_SL_NULL\n", cmd_idx);
cmd_idx++;
do {
uint32_t chk_hdr = *cmd_idx;
count = 1 + ((chk_hdr & 0x07FF0000) >> 16);
uint32_t start_address = (chk_hdr & 0x0000FFF0) >> 4;
encoding = (chk_hdr & 0x07);
if ((count == 1) && (encoding == 7)) {
count = 0;
DB("SLICE_SEPARATOR\n", cmd_idx);
} else {
DB("RENDEC_CK_HDR #symbols = %d address = %08x encoding = %01x\n", cmd_idx, count, start_address, encoding);
}
cmd_idx++;
while (count && (count < 0x1000)) {
DB("value\n", cmd_idx);
cmd_idx++;
count -= 2;
}
} while (encoding != 0x07);
break;
}
case CMD_RENDEC_BLOCK: {
uint32_t count = (cmd & 0xff0000) >> 16;
uint32_t rendec = cmd & 0xffff;
DB("CMD_RENDEC_BLOCK count = 0x%08x\n", cmd_idx, count);
cmd_idx++;
while (count--) {
psb__trace_message("%04x\n", rendec);
rendec += 4;
DB("value\n", cmd_idx);
cmd_idx++;
}
break;
}
case CMD_COMPLETION: {
if (*cmd_idx == PSB_RELOC_MAGIC) {
DB("CMD_(S)LLDMA (assumed)\n", cmd_idx);
cmd_idx++;
} else {
DB("CMD_COMPLETION\n", cmd_idx);
cmd_idx++;
// DB("interrupt\n", cmd_idx);
// cmd_idx++;
}
break;
}
case CMD_HEADER: {
uint32_t context = cmd & CMD_HEADER_CONTEXT_MASK;
DB("CMD_HEADER context = %08x\n", cmd_idx, context);
cmd_idx++;
DB("StatusBufferAddress\n", cmd_idx);
cmd_idx++;
DB("PreloadSave\n", cmd_idx);
cmd_idx++;
DB("PreloadRestore\n", cmd_idx);
cmd_idx++;
break;
}
case CMD_CONDITIONAL_SKIP: {
DB("CMD_CONDITIONAL_SKIP\n", cmd_idx);
cmd_idx++;
DB("vlc table address\n", cmd_idx);
break;
}
case CMD_CTRL_ALLOC_HEADER: {
psb__trace_message("CMD_CTRL_ALLOC_HEADER count = 0x%08x\n", sizeof(CTRL_ALLOC_HEADER));
uint32_t count = sizeof(CTRL_ALLOC_HEADER)/4;
while (count) {
DB("value\n", cmd_idx);
cmd_idx++;
count--;
}
break;
}
case CMD_LLDMA: {
DB("CMD_LLDMA\n", cmd_idx);
cmd_idx++;
break;
}
case CMD_SR_SETUP: {
DB("CMD_SR_SETUP\n", cmd_idx);
cmd_idx++;
DB("offset in bits\n", cmd_idx);
cmd_idx++;
DB("size in bytes\n", cmd_idx);
cmd_idx++;
break;
}
case CMD_SLLDMA: {
DB("CMD_SLLDMA\n", cmd_idx);
cmd_idx++;
break;
}
case CMD_DMA: {
DB("CMD_DMA\n", cmd_idx);
cmd_idx++;
DB("cmd dma address\n", cmd_idx);
break;
}
default:
if (*cmd_idx == PSB_RELOC_MAGIC) {
DB("CMD_(S)LLDMA (assumed)\n", cmd_idx);
cmd_idx++;
} else {
DB("*** Unknown command ***\n", cmd_idx);
cmd_idx++;
}
break;
} /* switch */
} /* while */
}
/********************* trace debug end *************************/
/********************* dump buffer when flush cmdbuf - start *************************/
void psb__debug_schedule_hexdump(const char *name, psb_buffer_p buf, uint32_t offset, uint32_t size)
{
ASSERT(debug_dump_count < MAX_DUMP_COUNT);
debug_dump_name[debug_dump_count] = name;
debug_dump_buf[debug_dump_count] = buf;
debug_dump_offset[debug_dump_count] = offset;
debug_dump_size[debug_dump_count] = size;
debug_dump_count++;
}
static void psb__hexdump2(unsigned char *p, int offset, int size)
{
if (offset + size > 8)
size = 8 - offset;
psb__trace_message("[%04x]", g_hexdump_offset);
g_hexdump_offset += offset;
g_hexdump_offset += size;
while (offset-- > 0) {
psb__trace_message(" --");
}
while (size-- > 0) {
psb__trace_message(" %02x", *p++);
}
psb__trace_message("\n");
}
void psb__hexdump(unsigned char *addr, int size)
{
unsigned char *p = (unsigned char *) addr;
int offset = g_hexdump_offset % 8;
g_hexdump_offset -= offset;
if (offset) {
psb__hexdump2(p, offset, size);
size -= 8 - offset;
p += 8 - offset;
}
while (1) {
if (size < 8) {
if (size > 0) {
psb__hexdump2(p, 0, size);
}
return;
}
psb__trace_message("[%04x] %02x %02x %02x %02x %02x %02x %02x %02x\n", g_hexdump_offset, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
p += 8;
size -= 8;
g_hexdump_offset += 8;
}
}
/********************* dump buffer when flush cmdbuf - end*************************/
int psb__dump_va_buffers(object_buffer_p obj_buffer)
{
unsigned int j,k;
unsigned char *mapped_buffer;
int print_num;
if(psb_dump_vabuf_fp) {
fprintf(psb_dump_vabuf_fp, "%s", buffer_type_to_string(obj_buffer->type));
print_num = fprintf(psb_dump_vabuf_fp, "BUFF SIZE :%d NUMELEMENTS:%d BUFF INFO:\n", obj_buffer->size, obj_buffer->num_elements);
switch(obj_buffer->type) {
case VAPictureParameterBufferType:
case VAIQMatrixBufferType:
case VASliceParameterBufferType:
j=0;
for(k=0;k < obj_buffer->size;++k)
print_num = fprintf(psb_dump_vabuf_fp,"0x%02x ,",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_fp,"\n ");
break;
case VASliceGroupMapBufferType:
case VABitPlaneBufferType:
psb_buffer_map(obj_buffer->psb_buffer, (unsigned char **)&mapped_buffer);
if(mapped_buffer == NULL)
return VA_STATUS_ERROR_INVALID_BUFFER;
for(j=0; j<obj_buffer->size;++j) {
if(j%16 == 0) fprintf(psb_dump_vabuf_fp,"\n");
for(k=0;k < obj_buffer->num_elements;++k)
fprintf(psb_dump_vabuf_fp,"0x%02x ",*((unsigned char *)(mapped_buffer+obj_buffer->num_elements*j+k)));
}
psb_buffer_unmap(obj_buffer->psb_buffer);
break;
case VASliceDataBufferType:
case VAProtectedSliceDataBufferType:
fprintf(psb_dump_vabuf_fp,"first 256 bytes:\n");
psb_buffer_map(obj_buffer->psb_buffer, (unsigned char **)&mapped_buffer);
if (!mapped_buffer)
break;
for(j=0; j<256;++j) {
if(j%16 == 0) fprintf(psb_dump_vabuf_fp,"\n");
for(k=0;k < obj_buffer->num_elements;++k)
fprintf(psb_dump_vabuf_fp,"0x%02x ",*((unsigned char *)(mapped_buffer+obj_buffer->num_elements*j+k)));
}
psb_buffer_unmap(obj_buffer->psb_buffer);
break;
default:
break;
}
fprintf(psb_dump_vabuf_fp, "\n");
fflush(psb_dump_vabuf_fp);
fsync(fileno(psb_dump_vabuf_fp));
}
return 0;
}
int psb__dump_va_buffers_verbose(object_buffer_p obj_buffer)
{
unsigned int j,k;
unsigned char *mapped_buffer;
if(psb_dump_vabuf_verbose_fp) {
fprintf(psb_dump_vabuf_verbose_fp, "%s", buffer_type_to_string(obj_buffer->type));
fprintf(psb_dump_vabuf_verbose_fp, "BUFF SIZE :%d NUMELEMENTS:%d BUFF INFO:\n", obj_buffer->size, obj_buffer->num_elements);
switch(obj_buffer->type) {
case VAPictureParameterBufferType:
for(j=0; j < 340; j = j+20) {
if(j==0) fprintf(psb_dump_vabuf_verbose_fp,"\nCurrPic:\n");
else fprintf(psb_dump_vabuf_verbose_fp,"\nReferenceFrames%d\n", j / 20);
fprintf(psb_dump_vabuf_verbose_fp,"picture_id:");
for(k=0;k < 4;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp," frame_idx:");
for(k=4;k < 8;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp," flags:");
for(k=8;k < 12;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp," TopFieldOrderCnt:");
for(k=12;k < 16;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp," BottomFieldOrderCnt:");
for(k=16;k < 20;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
}
j=340;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\npicture_width_in_mbs_minus1:");
for(k=0;k < 2;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=342;k=0;
fprintf(psb_dump_vabuf_verbose_fp, "\npicture_height_in_mbs_minus1:");
for(k=0;k < 2;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=344;k=0;
fprintf(psb_dump_vabuf_verbose_fp, "\nbit_depth_luma_minus8:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=345;k=0;
fprintf(psb_dump_vabuf_verbose_fp, "\nbit_depth_chroma_minus8:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=346;k=0;
fprintf(psb_dump_vabuf_verbose_fp, "\nnum_ref_frames:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=348;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nseq_fields_value:");
for(k=0;k < 4;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=352;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nnum_slice_groups_minus1:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=353;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nslice_group_map_type:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=354;k=0;
fprintf(psb_dump_vabuf_verbose_fp, "\nslice_group_change_rate_minus1:");
for(k=0;k < 2;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=356;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\npic_init_qp_minus26:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=357;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\npic_init_qs_minus26:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=358;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nchroma_qp_index_offset:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=359;k=0;
fprintf(psb_dump_vabuf_verbose_fp, "\nsecond_chroma_qp_index_offset:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=360;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\npic_fields_value:");
for(k=0;k < 4;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=364;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nframe_num:");
for(k=0;k < 2;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
break;
case VAIQMatrixBufferType:
for(j=0;j<96;j=j+16) {
fprintf(psb_dump_vabuf_verbose_fp,"\nScalingList4x4_%d:", j/16);
for(k=0; k<16;++k) {
if(k%4 == 0) fprintf(psb_dump_vabuf_verbose_fp, "\n");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
}
}
for(j=96;j<224;j=j+64) {
fprintf(psb_dump_vabuf_verbose_fp,"\nScalingList4x4_%d:",( j-96)/64);
for(k=0; k<64;++k) {
if(k%8 == 0) fprintf(psb_dump_vabuf_verbose_fp, "\n");
fprintf(psb_dump_vabuf_verbose_fp, "0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
}
}
break;
case VASliceParameterBufferType:
j=0;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nslice_data_size:");
for(k=0;k < 4;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=4;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nslice_data_offset:");
for(k=0;k < 4;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=8;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nslice_data_flag:");
for(k=0;k < 4;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=12;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nslice_data_bit_offset:");
for(k=0;k < 2;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=14;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nfirst_mb_in_slice:");
for(k=0;k < 2;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=16;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nslice_type:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=17;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\ndirect_spatial_mv_pred_flag:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=18;k=0;
fprintf(psb_dump_vabuf_verbose_fp, "\nnum_ref_idx_l0_active_minus1:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=19;k=0;
fprintf(psb_dump_vabuf_verbose_fp, "\nnum_ref_idx_l1_active_minus1:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=20;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\ncabac_init_idc:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=21;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nslice_qp_delta:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=22;k=0;
fprintf(psb_dump_vabuf_verbose_fp, "\ndisable_deblocking_filter_idc:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=23;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nslice_alpha_c0_offset_div2:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=24;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nslice_beta_offset_div2:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
for(j=28; j < 668; j = j+20) {
fprintf(psb_dump_vabuf_verbose_fp,"\nRefPicList0 ListIndex=%d\n", (j -28)/ 20);
fprintf(psb_dump_vabuf_verbose_fp,"picture_id:");
for(k=0;k < 4;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp," frame_idx:");
for(k=4;k < 8;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp," flags:");
for(k=8;k < 12;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp," TopFieldOrderCnt:");
for(k=12;k < 16;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp," BottomFieldOrderCnt:");
for(k=16;k < 20;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
}
for(j=668; j < 1308; j = j+20) {
fprintf(psb_dump_vabuf_verbose_fp,"\nRefPicList1 ListIndex=%d\n", (j -668)/ 20);
fprintf(psb_dump_vabuf_verbose_fp,"picture_id:");
for(k=0;k < 4;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp," frame_idx:");
for(k=4;k < 8;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp," flags:");
for(k=8;k < 12;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp," TopFieldOrderCnt:");
for(k=12;k < 16;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp," BottomFieldOrderCnt:");
for(k=16;k < 20;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
}
j=1308;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nluma_log2_weight_denom:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=1309;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nchroma_log2_weight_denom:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=1310;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nluma_weight_l0_flag:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=1312;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nluma_weight_l0:");
for(j=1312;j<1376;j=j+2) {
if((j-1312)%16 == 0)fprintf(psb_dump_vabuf_verbose_fp,"\n");
fprintf(psb_dump_vabuf_verbose_fp," :");
for(k=0;k < 2;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
}
fprintf(psb_dump_vabuf_verbose_fp,"\nluma_offset_l0:");
for(j=1376;j<1440;j=j+2) {
if((j-1376)%16 == 0) fprintf(psb_dump_vabuf_verbose_fp,"\n");
fprintf(psb_dump_vabuf_verbose_fp," ");
for(k=0;k < 2;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
}
j=1440;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nchroma_weight_l0_flag:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
j=1442;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nchroma_weight_l0:");
for(j=1442;j<1570;j=j+4) {
if((j-1442)%16 == 0) fprintf(psb_dump_vabuf_verbose_fp,"\n");
fprintf(psb_dump_vabuf_verbose_fp," ");
for(k=0;k < 2;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp," , ");
for(k=2;k < 4;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
}
fprintf(psb_dump_vabuf_verbose_fp,"\nchroma_offset_l0:");
for(j=1570;j<1698;j=j+4) {
if((j-1570)%16 == 0) fprintf(psb_dump_vabuf_verbose_fp,"\n");
fprintf(psb_dump_vabuf_verbose_fp," ");
for(k=0;k < 2;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp," , ");
for(k=2;k < 4;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
}
j=1698;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nluma_weight_l1_flag:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp,"\nluma_weight_l1:");
for(j=1700;j<1764;j=j+2) {
if((j-1700)%16 == 0) fprintf(psb_dump_vabuf_verbose_fp,"\n");
fprintf(psb_dump_vabuf_verbose_fp," ");
for(k=0;k < 2;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
}
fprintf(psb_dump_vabuf_verbose_fp,"\nluma_offset_l1:");
for(j=1764;j<1828;j=j+2) {
if((j-1764)%16 == 0) fprintf(psb_dump_vabuf_verbose_fp,"\n");
fprintf(psb_dump_vabuf_verbose_fp," ");
for(k=0;k < 2;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
}
j=1828;k=0;
fprintf(psb_dump_vabuf_verbose_fp,"\nchroma_weight_l1_flag:");
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp,"\nchroma_weight_l1:");
for(j=1830;j<1958;j=j+4) {
if((j-1830)%16 == 0) fprintf(psb_dump_vabuf_verbose_fp,"\n");
fprintf(psb_dump_vabuf_verbose_fp," ");
for(k=0;k < 2;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp," , ");
for(k=2;k < 4;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
}
fprintf(psb_dump_vabuf_verbose_fp,"\nchroma_offset_l1:");
for(j=1958;j<2086;j=j+4) {
if((j-1958)%16 == 0) fprintf(psb_dump_vabuf_verbose_fp,"\n");
fprintf(psb_dump_vabuf_verbose_fp," ");
for(k=0;k < 2;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
fprintf(psb_dump_vabuf_verbose_fp," , ");
for(k=2;k < 4;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(obj_buffer->buffer_data+obj_buffer->num_elements*j+k)));
}
break;
case VASliceGroupMapBufferType:
psb_buffer_map(obj_buffer->psb_buffer, (unsigned char **)&mapped_buffer);
if(mapped_buffer == NULL)
return VA_STATUS_ERROR_INVALID_BUFFER;
for(j=0; j<obj_buffer->size;++j) {
if(j%16 == 0) fprintf(psb_dump_vabuf_verbose_fp,"\n");
for(k=0;k < obj_buffer->num_elements;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(mapped_buffer+obj_buffer->num_elements*j+k)));
}
psb_buffer_unmap(obj_buffer->psb_buffer);
break;
case VASliceDataBufferType:
case VAProtectedSliceDataBufferType:
fprintf(psb_dump_vabuf_verbose_fp,"first 256 bytes:\n");
psb_buffer_map(obj_buffer->psb_buffer,(unsigned char **)&mapped_buffer);
if(mapped_buffer == NULL)
return VA_STATUS_ERROR_INVALID_BUFFER;
for(j=0; j<256;++j) {
if(j%16 == 0) fprintf(psb_dump_vabuf_verbose_fp,"\n");
for(k=0;k < obj_buffer->num_elements;++k)
fprintf(psb_dump_vabuf_verbose_fp,"0x%02x ",*((unsigned char *)(mapped_buffer+obj_buffer->num_elements*j+k)));
}
psb_buffer_unmap(obj_buffer->psb_buffer);
break;
default:
break;
}
fprintf(psb_dump_vabuf_verbose_fp, "\n");
fflush(psb_dump_vabuf_verbose_fp);
fsync(fileno(psb_dump_vabuf_verbose_fp));
}
return 0;
}