X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=va%2Fva_fool.c;h=be2540b7d10bac82704aefa0984a38fd0536941f;hb=b7849f39151a5efda5ae103486b8d00dbe6b2ff2;hp=519304d060c8f041fe2443046b38bd13b4060bc3;hpb=aa7a8a0b05d25f9daedaa3c1e7dd5fa360dd28cd;p=android-x86%2Fhardware-intel-common-libva.git diff --git a/va/va_fool.c b/va/va_fool.c index 519304d..be2540b 100644 --- a/va/va_fool.c +++ b/va/va_fool.c @@ -26,6 +26,7 @@ #include "va.h" #include "va_backend.h" #include "va_trace.h" +#include "va_fool.h" #include #include @@ -39,9 +40,6 @@ #include #include -#include "va_fool_264.h" - - /* * Do dummy decode/encode, ignore the input data * In order to debug memory leak or low performance issues, we need to isolate driver problems @@ -49,10 +47,10 @@ * * LIBVA_FOOL_DECODE: * . if set, decode does nothing, but fill in some YUV data - * LIBVA_FOOL_ENCODE: - * . if set, encode does nothing, but fill in a hard-coded 720P clip into coded buffer. + * LIBVA_FOOL_ENCODE=: + * . if set, encode does nothing, but fill in the coded buffer from a H264 clip. * . VA CONTEXT/CONFIG/SURFACE will call into drivers, but VA Buffer creation is done in here - * . Bypass all ~SvaBeginPic/vaRenderPic/vaEndPic~T + * . Bypass all "vaBeginPic/vaRenderPic/vaEndPic" * LIBVA_FOOL_POSTP: * . if set, do nothing for vaPutSurface */ @@ -61,20 +59,28 @@ /* global settings */ /* LIBVA_FOOL_DECODE/LIBVA_FOOL_ENCODE/LIBVA_FOOL_POSTP */ -static int fool_decode = 0; -static int fool_encode = 0; +int fool_decode = 0; +int fool_encode = 0; int fool_postp = 0; + + +#define NAL_BUF_SIZE 65536 // maximum NAL unit size +#define RING_BUF_SIZE 8192 // input ring buffer size, MUST be a power of two! +#define MAX_FRAME 16 +#define SLICE_NUM 4 + #define FOOL_CONTEXT_MAX 4 /* per context settings */ static struct _fool_context { VADisplay dpy; /* should use context as the key */ - + VAProfile fool_profile; /* current profile for buffers */ VAEntrypoint fool_entrypoint; /* current entrypoint */ FILE *fool_fp_codedclip; /* load a clip from disk for fooling encode*/ - + char *frame_buf; + /* all buffers with same type share one malloc-ed memory * bufferID = (buffer numbers with the same type << 8) || type * the malloc-ed memory can be find by fool_buf[bufferID & 0xff] @@ -88,22 +94,23 @@ static struct _fool_context { #define FOOL_DECODE(idx) (fool_decode && (fool_context[idx].fool_entrypoint == VAEntrypointVLD)) #define FOOL_ENCODE(idx) \ -(fool_encode \ - && (fool_context[idx].fool_entrypoint == VAEntrypointEncSlice) \ - && (fool_context[idx].fool_profile >= VAProfileH264Baseline) \ - && (fool_context[idx].fool_profile <= VAProfileH264High)) + (fool_encode \ + && (fool_context[idx].fool_entrypoint == VAEntrypointEncSlice) \ + && (fool_context[idx].fool_profile >= VAProfileH264Baseline) \ + && (fool_context[idx].fool_profile <= VAProfileH264High)) + +#define DPY2INDEX(dpy) \ + int idx; \ + \ + for (idx = 0; idx < FOOL_CONTEXT_MAX; idx++) \ + if (fool_context[idx].dpy == dpy) \ + break; \ + \ + if (idx == FOOL_CONTEXT_MAX) \ + return 0; /* let driver go */ -#define DPY2INDEX(dpy) \ - int idx; \ - \ - for (idx = 0; idx < FOOL_CONTEXT_MAX; idx++) \ - if (fool_context[idx].dpy == dpy) \ - break; \ - \ - if (idx == FOOL_CONTEXT_MAX) \ - return 0; /* let driver go */ \ /* Prototype declarations (functions defined in va.c) */ @@ -113,29 +120,29 @@ void va_infoMessage(const char *msg, ...); int va_parseConfig(char *env, char *env_value); VAStatus vaBufferInfo( - VADisplay dpy, - VAContextID context, /* in */ - VABufferID buf_id, /* in */ - VABufferType *type, /* out */ - unsigned int *size, /* out */ - unsigned int *num_elements /* out */ + VADisplay dpy, + VAContextID context, /* in */ + VABufferID buf_id, /* in */ + VABufferType *type, /* out */ + unsigned int *size, /* out */ + unsigned int *num_elements /* out */ ); VAStatus vaLockSurface(VADisplay dpy, - VASurfaceID surface, - 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, - unsigned int *buffer_name, - void **buffer + VASurfaceID surface, + 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, + unsigned int *buffer_name, + void **buffer ); VAStatus vaUnlockSurface(VADisplay dpy, - VASurfaceID surface + VASurfaceID surface ); @@ -155,23 +162,30 @@ void va_FoolInit(VADisplay dpy) fool_postp = 1; va_infoMessage("LIBVA_FOOL_POSTP is on, dummy vaPutSurface\n"); } - - + + if (va_parseConfig("LIBVA_FOOL_DECODE", NULL) == 0) { fool_decode = 1; va_infoMessage("LIBVA_FOOL_DECODE is on, dummy decode\n"); } - + if (va_parseConfig("LIBVA_FOOL_ENCODE", &env_value[0]) == 0) { - FILE *tmp = fopen(env_value, "r"); + fool_context[fool_index].fool_fp_codedclip = fopen(env_value, "r"); - if (tmp) - fool_context[fool_index].fool_fp_codedclip = tmp; - - fool_encode = 1; + if (fool_context[fool_index].fool_fp_codedclip) { + fool_encode = 1; + } else + fool_encode = 0; - va_infoMessage("LIBVA_FOOL_ENCODE is on, dummy encode\n"); + if (fool_encode) /* malloc the buffer for fake clip */ + fool_context[fool_index].frame_buf = malloc(MAX_FRAME*SLICE_NUM*NAL_BUF_SIZE*sizeof(char)); + + if (fool_context[fool_index].frame_buf == NULL) + fool_encode = 0; + + if (fool_encode) + va_infoMessage("LIBVA_FOOL_ENCODE is on, dummy encode\n"); } if (fool_encode || fool_decode) @@ -182,12 +196,18 @@ void va_FoolInit(VADisplay dpy) int va_FoolEnd(VADisplay dpy) { int i; - + DPY2INDEX(dpy); - - for (i = 0; i < VABufferTypeMax; i++) /* free memory */ + + for (i = 0; i < VABufferTypeMax; i++) {/* free memory */ if (fool_context[idx].fool_buf[i]) free(fool_context[idx].fool_buf[i]); + } + if (fool_context[idx].fool_fp_codedclip) + fclose(fool_context[idx].fool_fp_codedclip); + + if (fool_context[idx].frame_buf) + free(fool_context[idx].frame_buf); memset(&fool_context[idx], sizeof(struct _fool_context), 0); return 0; @@ -201,16 +221,16 @@ int va_FoolCodedBuf(VADisplay dpy) int va_FoolCreateConfig( - VADisplay dpy, - VAProfile profile, - VAEntrypoint entrypoint, - VAConfigAttrib *attrib_list, - int num_attribs, - VAConfigID *config_id /* out */ + VADisplay dpy, + VAProfile profile, + VAEntrypoint entrypoint, + VAConfigAttrib *attrib_list, + int num_attribs, + VAConfigID *config_id /* out */ ) { DPY2INDEX(dpy); - + /* call into driver level to allocate real context/surface/buffers, etc */ fool_context[idx].fool_profile = profile; fool_context[idx].fool_entrypoint = entrypoint; @@ -218,12 +238,12 @@ int va_FoolCreateConfig( } static int yuvgen_planar( - int width, int height, - unsigned char *Y_start, int Y_pitch, - unsigned char *U_start, int U_pitch, - unsigned char *V_start, int V_pitch, - int UV_interleave, int box_width, int row_shift, - int field + int width, int height, + unsigned char *Y_start, int Y_pitch, + unsigned char *U_start, int U_pitch, + unsigned char *V_start, int V_pitch, + int UV_interleave, int box_width, int row_shift, + int field ) { int row; @@ -237,33 +257,33 @@ static int yuvgen_planar( /* fill garbage data into the other field */ if (((field == VA_TOP_FIELD) && (row &1)) - || ((field == VA_BOTTOM_FIELD) && ((row &1)==0))) { + || ((field == VA_BOTTOM_FIELD) && ((row &1)==0))) { memset(Y_row, 0xff, width); continue; } - + for (jj=0; jj