#include "va_dec_vp8.h"
#include "va_dec_vp9.h"
#include "va_dec_hevc.h"
+#include "va_str.h"
#include "va_vpp.h"
#include <assert.h>
#include <stdarg.h>
#define DPY2TRACECTX(dpy, context, buf_id) \
struct va_trace *pva_trace = NULL; \
struct trace_context *trace_ctx = NULL; \
- int ctx_id = context; \
+ VAContextID ctx_id = context; \
\
pva_trace = (struct va_trace *)(((VADisplayContextP)dpy)->vatrace); \
if(!pva_trace) \
struct va_trace *pva_trace,
VAConfigID config_id)
{
- struct trace_config_info *pconfig_info;
int idx = MAX_TRACE_CTX_NUM;
LOCK_RESOURCE(pva_trace);
- pconfig_info = pva_trace->config_info;
- idx = config_id & TRACE_CTX_ID_MASK;
- if(!pconfig_info[idx].valid
- || pconfig_info[idx].config_id != config_id)
- idx = MAX_TRACE_CTX_NUM;
+ for (idx = 0;idx < MAX_TRACE_CTX_NUM;idx++) {
+ if (pva_trace->config_info[idx].valid &&
+ pva_trace->config_info[idx].config_id == config_id)
+ break;
+ }
UNLOCK_RESOURCE(pva_trace);
LOCK_RESOURCE(pva_trace);
- idx = config_id & TRACE_CTX_ID_MASK;
- pconfig_info = &pva_trace->config_info[idx];
- if(!pconfig_info->valid ||
- pconfig_info->config_id == config_id) {
+ for (idx = 0;idx < MAX_TRACE_CTX_NUM;idx++) {
+ if (!pva_trace->config_info[idx].valid ||
+ pva_trace->config_info[idx].config_id == config_id)
+ break;
+ }
+
+ if (idx < MAX_TRACE_CTX_NUM) {
+ pconfig_info = &pva_trace->config_info[idx];
+
pconfig_info->valid = 1;
pconfig_info->config_id = config_id;
pconfig_info->trace_profile = profile;
{
struct trace_config_info *pconfig_info;
int idx = 0;
- pid_t thd_id = syscall(__NR_gettid);
LOCK_RESOURCE(pva_trace);
- idx = config_id & TRACE_CTX_ID_MASK;
- pconfig_info = &pva_trace->config_info[idx];
- if(pconfig_info->valid &&
- pconfig_info->config_id == config_id &&
- pconfig_info->created_thd_id == thd_id) {
+ for (idx = 0;idx < MAX_TRACE_CTX_NUM;idx++) {
+ if (pva_trace->config_info[idx].valid &&
+ pva_trace->config_info[idx].config_id == config_id)
+ break;
+ }
+
+ if (idx < MAX_TRACE_CTX_NUM) {
+ pconfig_info = &pva_trace->config_info[idx];
+
pconfig_info->valid = 0;
+ pconfig_info->config_id = -1;
}
UNLOCK_RESOURCE(pva_trace);
struct va_trace *pva_trace,
VAContextID context)
{
- int idx = MAX_TRACE_CTX_NUM;
- int i = 0;
+ int idx;
LOCK_RESOURCE(pva_trace);
- i = context & TRACE_CTX_ID_MASK;
- if(!pva_trace->ptra_ctx[i]
- || pva_trace->ptra_ctx[i]->trace_context == context)
- idx = i;
+ for (idx = 0;idx < MAX_TRACE_CTX_NUM;idx++)
+ if (!pva_trace->ptra_ctx[idx] ||
+ pva_trace->ptra_ctx[idx]->trace_context == context)
+ break;
UNLOCK_RESOURCE(pva_trace);
struct va_trace *pva_trace,
VAContextID context)
{
- int idx = MAX_TRACE_CTX_NUM;
- int i = 0;
+ int idx;
LOCK_RESOURCE(pva_trace);
- i = context & TRACE_CTX_ID_MASK;
- if(pva_trace->ptra_ctx[i]
- && pva_trace->ptra_ctx[i]->trace_context == context)
- idx = i;
+ for (idx = 0;idx < MAX_TRACE_CTX_NUM;idx++)
+ if (pva_trace->ptra_ctx[idx] &&
+ pva_trace->ptra_ctx[idx]->trace_context == context)
+ break;
UNLOCK_RESOURCE(pva_trace);
if(type == 0) {
ptra_ctx->trace_codedbuf_fn = fn_env;
ptra_ctx->trace_fp_codedbuf = fp;
- va_infoMessage("LIBVA_TRACE_CODEDBUF is on, save codedbuf into %s\n",
+ va_infoMessage(pva_trace->dpy, "LIBVA_TRACE_CODEDBUF is on, save codedbuf into %s\n",
fn_env);
}
else {
ptra_ctx->trace_surface_fn = fn_env;
ptra_ctx->trace_fp_surface = fp;
- va_infoMessage("LIBVA_TRACE_SURFACE is on, save surface into %s\n",
+ va_infoMessage(pva_trace->dpy, "LIBVA_TRACE_SURFACE is on, save surface into %s\n",
fn_env);
}
if(!pfp)
goto FAIL;
- va_infoMessage("%s %s for the thread 0x%08x\n",
+ va_infoMessage(pva_trace->dpy, "%s %s for the thread 0x%08x\n",
new_fn_flag ? "Open new log file" : "Append to log file",
plog_file->fn_log, thd_id);
return;
}
+ pva_trace->dpy = dpy;
+
+ pthread_mutex_init(&pva_trace->resource_mutex, NULL);
+ pthread_mutex_init(&pva_trace->context_mutex, NULL);
+
if (va_parseConfig("LIBVA_TRACE", &env_value[0]) == 0) {
pva_trace->fn_log_env = strdup(env_value);
trace_ctx->plog_file = start_tracing2log_file(pva_trace);
trace_ctx->plog_file_list[0] = trace_ctx->plog_file;
va_trace_flag = VA_TRACE_FLAG_LOG;
- va_infoMessage("LIBVA_TRACE is on, save log into %s\n",
+ va_infoMessage(dpy, "LIBVA_TRACE is on, save log into %s\n",
trace_ctx->plog_file->fn_log);
}
else
- va_errorMessage("Open file %s failed (%s)\n", env_value, strerror(errno));
+ va_errorMessage(dpy, "Open file %s failed (%s)\n", env_value, strerror(errno));
}
/* may re-get the global settings for multiple context */
}
}
- pthread_mutex_init(&pva_trace->resource_mutex, NULL);
- pthread_mutex_init(&pva_trace->context_mutex, NULL);
-
trace_ctx->trace_context = VA_INVALID_ID;
pva_trace->ptra_ctx[MAX_TRACE_CTX_NUM] = trace_ctx;
((VADisplayContextP)dpy)->vatrace = (void *)pva_trace;
- pva_trace->dpy = dpy;
if(!va_trace_flag)
va_TraceEnd(dpy);
}
free(pva_trace->ptra_ctx[MAX_TRACE_CTX_NUM]);
+ pva_trace->dpy = NULL;
free(pva_trace);
((VADisplayContextP)dpy)->vatrace = NULL;
}
unsigned int buffer_name;
void *buffer = NULL;
unsigned char *Y_data, *UV_data, *tmp;
+ unsigned int pixel_byte;
VAStatus va_status;
DPY2TRACECTX(dpy, context, VA_INVALID_ID);
Y_data = (unsigned char*)buffer;
UV_data = (unsigned char*)buffer + chroma_u_offset;
+ if (fourcc == VA_FOURCC_P010)
+ pixel_byte = 2;
+ else
+ pixel_byte = 1;
+
tmp = Y_data + luma_stride * trace_ctx->trace_surface_yoff;
+
for (i=0; i<trace_ctx->trace_surface_height; i++) {
fwrite(tmp + trace_ctx->trace_surface_xoff,
trace_ctx->trace_surface_width,
- 1, trace_ctx->trace_fp_surface);
+ pixel_byte, trace_ctx->trace_fp_surface);
tmp += luma_stride;
}
+
tmp = UV_data + chroma_u_stride * trace_ctx->trace_surface_yoff / 2;
- if (fourcc == VA_FOURCC_NV12) {
+ if (fourcc == VA_FOURCC_NV12 || fourcc == VA_FOURCC_P010) {
for (i=0; i<trace_ctx->trace_surface_height/2; i++) {
fwrite(tmp + trace_ctx->trace_surface_xoff,
trace_ctx->trace_surface_width,
- 1, trace_ctx->trace_fp_surface);
+ pixel_byte, trace_ctx->trace_fp_surface);
tmp += chroma_u_stride;
}
va_TraceMsg(trace_ctx, "\t\tvalue.value.p = %p\n", p->value.value.p);
if ((p->type == VASurfaceAttribExternalBufferDescriptor) && p->value.value.p) {
VASurfaceAttribExternalBuffers *tmp = (VASurfaceAttribExternalBuffers *) p->value.value.p;
- int j;
+ uint32_t j;
va_TraceMsg(trace_ctx, "\t\t--VASurfaceAttribExternalBufferDescriptor\n");
va_TraceMsg(trace_ctx, "\t\t pixel_format=0x%08x\n", tmp->pixel_format);
UNLOCK_CONTEXT(pva_trace);
}
-static char * buffer_type_to_string(int type)
+void va_TraceCreateMFContext (
+ VADisplay dpy,
+ VAMFContextID *mf_context /* out */
+)
{
- 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 VAQMatrixBufferType: return "VAQMatrixBufferType";
- case VAHuffmanTableBufferType: return "VAHuffmanTableBufferType";
-/* Following are encode buffer types */
- case VAEncCodedBufferType: return "VAEncCodedBufferType";
- case VAEncSequenceParameterBufferType: return "VAEncSequenceParameterBufferType";
- case VAEncPictureParameterBufferType: return "VAEncPictureParameterBufferType";
- case VAEncSliceParameterBufferType: return "VAEncSliceParameterBufferType";
- case VAEncPackedHeaderParameterBufferType: return "VAEncPackedHeaderParameterBufferType";
- case VAEncPackedHeaderDataBufferType: return "VAEncPackedHeaderDataBufferType";
- case VAEncMiscParameterBufferType: return "VAEncMiscParameterBufferType";
- case VAEncMacroblockParameterBufferType: return "VAEncMacroblockParameterBufferType";
- case VAProcPipelineParameterBufferType: return "VAProcPipelineParameterBufferType";
- case VAProcFilterParameterBufferType: return "VAProcFilterParameterBufferType";
- default: return "UnknowBuffer";
+ DPY2TRACECTX(dpy, VA_INVALID_ID, VA_INVALID_ID);
+ TRACE_FUNCNAME(idx);
+ if (mf_context) {
+ va_TraceMsg(trace_ctx, "\tmf_context = 0x%08x\n", *mf_context);
+ trace_ctx->trace_context = *mf_context;
+ } else
+ trace_ctx->trace_context = VA_INVALID_ID;
+}
+
+void va_TraceMFAddContext (
+ VADisplay dpy,
+ VAMFContextID mf_context,
+ VAContextID context
+)
+{
+ DPY2TRACECTX(dpy, mf_context, VA_INVALID_ID);
+
+ TRACE_FUNCNAME(idx);
+ va_TraceMsg(trace_ctx, "\tmf_context = 0x%08x\n", mf_context);
+ va_TraceMsg(trace_ctx, "\tcontext = 0x%08x\n", context);
+}
+
+void va_TraceMFReleaseContext (
+ VADisplay dpy,
+ VAMFContextID mf_context,
+ VAContextID context
+)
+{
+ DPY2TRACECTX(dpy, mf_context, VA_INVALID_ID);
+
+ TRACE_FUNCNAME(idx);
+ va_TraceMsg(trace_ctx, "\tmf_context = 0x%08x\n", mf_context);
+ va_TraceMsg(trace_ctx, "\tcontext = 0x%08x\n", context);
+}
+
+void va_TraceMFSubmit (
+ VADisplay dpy,
+ VAMFContextID mf_context,
+ VAContextID *contexts,
+ int num_contexts
+)
+{
+ int i;
+
+ DPY2TRACECTX(dpy, mf_context, VA_INVALID_ID);
+
+ TRACE_FUNCNAME(idx);
+ va_TraceMsg(trace_ctx, "\tmf_context = 0x%08x\n", mf_context);
+
+ for(i = 0; i < num_contexts; i++){
+ va_TraceMsg(trace_ctx, "\t\tcontext[%d] = 0x%08x\n", i, contexts[i]);
}
}
return;
TRACE_FUNCNAME(idx);
- va_TraceMsg(trace_ctx, "\tbuf_type=%s\n", buffer_type_to_string(type));
+ va_TraceMsg(trace_ctx, "\tbuf_type=%s\n", vaBufferTypeStr(type));
if (buf_id)
va_TraceMsg(trace_ctx, "\tbuf_id=0x%x\n", *buf_id);
va_TraceMsg(trace_ctx, "\tsize=%u\n", size);
return;
TRACE_FUNCNAME(idx);
- va_TraceMsg(trace_ctx, "\tbuf_type=%s\n", buffer_type_to_string(type));
+ va_TraceMsg(trace_ctx, "\tbuf_type=%s\n", vaBufferTypeStr(type));
va_TraceMsg(trace_ctx, "\tbuf_id=0x%x\n", buf_id);
va_TraceMsg(trace_ctx, "\tsize=%u\n", size);
va_TraceMsg(trace_ctx, "\tnum_elements=%u\n", num_elements);
TRACE_FUNCNAME(idx);
va_TraceMsg(trace_ctx, "\tbuf_id=0x%x\n", buf_id);
- va_TraceMsg(trace_ctx, "\tbuf_type=%s\n", buffer_type_to_string(type));
+ va_TraceMsg(trace_ctx, "\tbuf_type=%s\n", vaBufferTypeStr(type));
if ((pbuf == NULL) || (*pbuf == NULL))
return;
DPY2TRACECTX(dpy, context, VA_INVALID_ID);
- va_TracePrint(trace_ctx, "--%s\n", buffer_type_to_string(type));
+ va_TracePrint(trace_ctx, "--%s\n", vaBufferTypeStr(type));
if(trace_ctx->plog_file)
fp = trace_ctx->plog_file->fp_log;
VAEncMiscParameterFrameRate *p = (VAEncMiscParameterFrameRate *)tmp->data;
va_TraceMsg(trace_ctx, "\t--VAEncMiscParameterFrameRate\n");
va_TraceMsg(trace_ctx, "\tframerate = %d\n", p->framerate);
-
+ va_TraceMsg(trace_ctx, "\tframerate_flags.temporal_id = %d\n", p->framerate_flags.bits.temporal_id);
break;
}
case VAEncMiscParameterTypeRateControl:
va_TraceMsg(trace_ctx, "\trc_flags.disable_bit_stuffing = %d\n", p->rc_flags.bits.disable_bit_stuffing);
va_TraceMsg(trace_ctx, "\trc_flags.mb_rate_control = %d\n", p->rc_flags.bits.mb_rate_control);
va_TraceMsg(trace_ctx, "\trc_flags.temporal_id = %d\n", p->rc_flags.bits.temporal_id);
+ va_TraceMsg(trace_ctx, "\trc_flags.cfs_I_frames = %d\n", p->rc_flags.bits.cfs_I_frames);
+ va_TraceMsg(trace_ctx, "\trc_flags.enable_parallel_brc = %d\n", p->rc_flags.bits.enable_parallel_brc);
+ va_TraceMsg(trace_ctx, "\trc_flags.enable_dynamic_scaling = %d\n", p->rc_flags.bits.enable_dynamic_scaling);
+ va_TraceMsg(trace_ctx, "\trc_flags.frame_tolerance_mode = %d\n", p->rc_flags.bits.frame_tolerance_mode);
+ va_TraceMsg(trace_ctx, "\tICQ_quality_factor = %d\n", p->ICQ_quality_factor);
+ va_TraceMsg(trace_ctx, "\tmax_qp = %d\n", p->max_qp);
break;
}
case VAEncMiscParameterTypeMaxSliceSize:
va_TraceMsg(trace_ctx, "\tmax_frame_size = %d\n", p->max_frame_size);
break;
}
+ case VAEncMiscParameterTypeMultiPassFrameSize:
+ {
+ int i;
+ VAEncMiscParameterBufferMultiPassFrameSize *p = (VAEncMiscParameterBufferMultiPassFrameSize *)tmp->data;
+
+ va_TraceMsg(trace_ctx, "\t--VAEncMiscParameterTypeMultiPassFrameSize\n");
+ va_TraceMsg(trace_ctx, "\tmax_frame_size = %d\n", p->max_frame_size);
+ va_TraceMsg(trace_ctx, "\tnum_passes = %d\n", p->num_passes);
+ for(i = 0; i<p->num_passes; ++i)
+ va_TraceMsg(trace_ctx, "\tdelta_qp[%d] = %d\n", i, p->delta_qp[i]);
+ break;
+ }
case VAEncMiscParameterTypeQualityLevel:
{
VAEncMiscParameterBufferQualityLevel *p = (VAEncMiscParameterBufferQualityLevel *)tmp->data;
unsigned int size;
unsigned int num_elements;
VAProcFilterParameterBufferBase *base_filter = NULL;
- int i;
+ unsigned int i;
DPY2TRACECTX(dpy, context, VA_INVALID_ID);
)
{
VAProcPipelineParameterBuffer *p = (VAProcPipelineParameterBuffer *)data;
- int i;
+ uint32_t i;
DPY2TRACECTX(dpy, context, VA_INVALID_ID);
va_TraceMsg(trace_ctx, "\t---------------------------\n");
va_TraceMsg(trace_ctx, "\tbuffers[%d] = 0x%08x\n", i, buffers[i]);
- va_TraceMsg(trace_ctx, "\t type = %s\n", buffer_type_to_string(type));
+ va_TraceMsg(trace_ctx, "\t type = %s\n", vaBufferTypeStr(type));
va_TraceMsg(trace_ctx, "\t size = %d\n", size);
va_TraceMsg(trace_ctx, "\t num_elements = %d\n", num_elements);
va_TraceMPEG4Buf(dpy, context, buffers[i], type, size, num_elements, pbuf + size*j);
}
break;
- case VAProfileH264Baseline:
case VAProfileH264Main:
case VAProfileH264High:
case VAProfileH264ConstrainedBaseline: