static int va_FoolFillCodedBufJPG(VADisplay dpy, struct fool_context *fool_ctx) { struct stat file_stat = {}; VACodedBufferSegment *codedbuf; int fd = -1; ssize_t ret; if ((fd = open(fool_ctx->fn_jpg, O_RDONLY)) != -1) { if (fstat(fd, &file_stat) != -1) { fool_ctx->segbuf_jpg = realloc(fool_ctx->segbuf_jpg, file_stat.st_size); ret = read(fd, fool_ctx->segbuf_jpg, file_stat.st_size); if (ret < file_stat.st_size) va_errorMessage(dpy, "Reading file %s failed.\n", fool_ctx->fn_jpg); } else { va_errorMessage(dpy, "Identify file %s failed:%s\n", fool_ctx->fn_jpg, strerror(errno)); } close(fd); } else va_errorMessage(dpy, "Open file %s failed:%s\n", fool_ctx->fn_jpg, strerror(errno)); codedbuf = (VACodedBufferSegment *)fool_ctx->fool_buf[VAEncCodedBufferType]; codedbuf->size = file_stat.st_size; codedbuf->bit_offset = 0; codedbuf->status = 0; codedbuf->reserved = 0; codedbuf->buf = fool_ctx->segbuf_jpg; codedbuf->next = NULL; return 0; }
static int va_FoolFillCodedBufEnc(VADisplay dpy, struct fool_context *fool_ctx) { char file_name[1024]; struct stat file_stat = {}; VACodedBufferSegment *codedbuf; int i, fd = -1; ssize_t ret; /* try file_name.file_count, if fail, try file_name.file_count-- */ for (i=0; i<=1; i++) { snprintf(file_name, 1024, "%s.%d", fool_ctx->fn_enc, fool_ctx->file_count); if ((fd = open(file_name, O_RDONLY)) != -1) { if (fstat(fd, &file_stat) != -1) { fool_ctx->file_count++; /* open next file */ break; } va_errorMessage(dpy, "Identify file %s failed:%s\n", file_name, strerror(errno)); close(fd); fd = -1; } /* fall back to the first file file */ fool_ctx->file_count = 0; } if (fd != -1) { fool_ctx->segbuf_enc = realloc(fool_ctx->segbuf_enc, file_stat.st_size); ret = read(fd, fool_ctx->segbuf_enc, file_stat.st_size); if (ret < file_stat.st_size) va_errorMessage(dpy, "Reading file %s failed.\n", file_name); close(fd); } else va_errorMessage(dpy, "Open file %s failed:%s\n", file_name, strerror(errno)); codedbuf = (VACodedBufferSegment *)fool_ctx->fool_buf[VAEncCodedBufferType]; codedbuf->size = file_stat.st_size; codedbuf->bit_offset = 0; codedbuf->status = 0; codedbuf->reserved = 0; codedbuf->buf = fool_ctx->segbuf_enc; codedbuf->next = NULL; return 0; }
static bool va_checkString(const char* value, char *variable) { if (!value) { va_errorMessage("Failed to define str_%s in init\n", variable); return false; } return true; }
static bool va_checkMaximum(int value, char *variable) { if (!value) { va_errorMessage("Failed to define max_%s in init\n", variable); return false; } return true; }
static bool va_checkVtable(void *ptr, char *function) { if (!ptr) { va_errorMessage("No valid vtable entry for va%s\n", function); return false; } return true; }
VAStatus vaInitialize ( VADisplay dpy, int *major_version, /* out */ int *minor_version /* out */ ) { const char *driver_name_env = NULL; char *driver_name = NULL; VAStatus vaStatus; CHECK_DISPLAY(dpy); va_TraceInit(dpy); va_FoolInit(dpy); va_infoMessage("VA-API version %s\n", VA_VERSION_S); vaStatus = va_getDriverName(dpy, &driver_name); va_infoMessage("va_getDriverName() returns %d\n", vaStatus); driver_name_env = getenv("LIBVA_DRIVER_NAME"); if ((VA_STATUS_SUCCESS == vaStatus) && driver_name_env && (geteuid() == getuid())) { /* Don't allow setuid apps to use LIBVA_DRIVER_NAME */ if (driver_name) /* memory is allocated in va_getDriverName */ free(driver_name); driver_name = strdup(driver_name_env); vaStatus = VA_STATUS_SUCCESS; va_infoMessage("User requested driver '%s'\n", driver_name); } if ((VA_STATUS_SUCCESS == vaStatus) && (driver_name != NULL)) { vaStatus = va_openDriver(dpy, driver_name); va_infoMessage("va_openDriver() returns %d\n", vaStatus); *major_version = VA_MAJOR_VERSION; *minor_version = VA_MINOR_VERSION; } else va_errorMessage("va_getDriverName() failed with %s,driver_name=%s\n", vaErrorStr(vaStatus), driver_name); if (driver_name) free(driver_name); VA_TRACE_LOG(va_TraceInitialize, dpy, major_version, minor_version); return vaStatus; }
VAStatus vaInitialize ( VADisplay dpy, int *major_version, /* out */ int *minor_version /* out */ ) { char *driver_name = NULL; VAStatus vaStatus; CHECK_DISPLAY(dpy); va_TraceInit(dpy); va_FoolInit(dpy); va_infoMessage("VA-API version %s\n", VA_VERSION_S); vaStatus = va_getDriverName(dpy, &driver_name); va_infoMessage("va_getDriverName() returns %d\n", vaStatus); if ((VA_STATUS_SUCCESS == vaStatus) && (driver_name != NULL)) { vaStatus = va_openDriver(dpy, driver_name); va_infoMessage("va_openDriver() returns %d\n", vaStatus); *major_version = VA_MAJOR_VERSION; *minor_version = VA_MINOR_VERSION; } else va_errorMessage("va_getDriverName() failed with %s,driver_name=%s\n", vaErrorStr(vaStatus), driver_name); if (driver_name) free(driver_name); VA_TRACE_LOG(va_TraceInitialize, dpy, major_version, minor_version); return vaStatus; }
static int va_FoolFillCodedBufJPG(struct fool_context *fool_ctx) { struct stat file_stat = {0}; VACodedBufferSegment *codedbuf; int fd = -1; if ((fd = open(fool_ctx->fn_jpg, O_RDONLY)) != -1) { fstat(fd, &file_stat); fool_ctx->segbuf_jpg = realloc(fool_ctx->segbuf_jpg, file_stat.st_size); read(fd, fool_ctx->segbuf_jpg, file_stat.st_size); close(fd); } else va_errorMessage("Open file %s failed:%s\n", fool_ctx->fn_jpg, strerror(errno)); codedbuf = (VACodedBufferSegment *)fool_ctx->fool_buf[VAEncCodedBufferType]; codedbuf->size = file_stat.st_size; codedbuf->bit_offset = 0; codedbuf->status = 0; codedbuf->reserved = 0; codedbuf->buf = fool_ctx->segbuf_jpg; codedbuf->next = NULL; return 0; }
static VAStatus va_openDriver(VADisplay dpy, char *driver_name) { VADriverContextP ctx = CTX(dpy); VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN; char *search_path = NULL; char *saveptr; char *driver_dir; if (!search_path) search_path = VA_DRIVERS_PATH; search_path = strdup((const char *)search_path); driver_dir = strtok_r(search_path, ":", &saveptr); while (driver_dir) { void *handle = NULL; char *driver_path = (char *) malloc( strlen(driver_dir) + strlen(driver_name) + strlen(DRIVER_EXTENSION) + 2 ); if (!driver_path) { va_errorMessage("%s L%d Out of memory!n", __FUNCTION__, __LINE__); free(search_path); return VA_STATUS_ERROR_ALLOCATION_FAILED; } strncpy( driver_path, driver_dir, strlen(driver_dir) + 1); strncat( driver_path, "/", strlen("/") ); strncat( driver_path, driver_name, strlen(driver_name) ); strncat( driver_path, DRIVER_EXTENSION, strlen(DRIVER_EXTENSION) ); va_infoMessage("Trying to open %s\n", driver_path); handle = load_library( driver_path); if (!handle) { /* Don't give errors for non-existing files */ if (0 == access( driver_path, F_OK)) va_errorMessage("load_library of %s failed\n", driver_path); } else { VADriverInit init_func = NULL; char init_func_s[256]; int i; static const struct { int major; int minor; } compatible_versions[] = { { VA_MAJOR_VERSION, VA_MINOR_VERSION }, { 0, 35 }, { 0, 34 }, { 0, 33 }, { 0, 32 }, { -1, } }; for (i = 0; compatible_versions[i].major >= 0; i++) { if (va_getDriverInitName(init_func_s, sizeof(init_func_s), compatible_versions[i].major, compatible_versions[i].minor)) { init_func = (VADriverInit)get_proc_address(handle, init_func_s); if (init_func) { va_infoMessage("Found init function %s\n", init_func_s); break; } } } if (compatible_versions[i].major < 0) { va_errorMessage("%s has no function %s\n", driver_path, init_func_s); // dlclose(handle); } else { struct VADriverVTable *vtable = ctx->vtable; struct VADriverVTableVPP *vtable_vpp = ctx->vtable_vpp; vaStatus = VA_STATUS_SUCCESS; if (!vtable) { vtable = calloc(1, sizeof(*vtable)); if (!vtable) vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; } ctx->vtable = vtable; if (!vtable_vpp) { vtable_vpp = calloc(1, sizeof(*vtable_vpp)); if (vtable_vpp) vtable_vpp->version = VA_DRIVER_VTABLE_VPP_VERSION; else vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; } ctx->vtable_vpp = vtable_vpp; if (init_func && VA_STATUS_SUCCESS == vaStatus) vaStatus = (*init_func)(ctx); if (VA_STATUS_SUCCESS == vaStatus) { CHECK_MAXIMUM(vaStatus, ctx, profiles); CHECK_MAXIMUM(vaStatus, ctx, entrypoints); CHECK_MAXIMUM(vaStatus, ctx, attributes); CHECK_MAXIMUM(vaStatus, ctx, image_formats); CHECK_MAXIMUM(vaStatus, ctx, subpic_formats); CHECK_MAXIMUM(vaStatus, ctx, display_attributes); CHECK_STRING(vaStatus, ctx, vendor); CHECK_VTABLE(vaStatus, ctx, Terminate); CHECK_VTABLE(vaStatus, ctx, QueryConfigProfiles); CHECK_VTABLE(vaStatus, ctx, QueryConfigEntrypoints); CHECK_VTABLE(vaStatus, ctx, QueryConfigAttributes); CHECK_VTABLE(vaStatus, ctx, CreateConfig); CHECK_VTABLE(vaStatus, ctx, DestroyConfig); CHECK_VTABLE(vaStatus, ctx, GetConfigAttributes); CHECK_VTABLE(vaStatus, ctx, CreateSurfaces); CHECK_VTABLE(vaStatus, ctx, DestroySurfaces); CHECK_VTABLE(vaStatus, ctx, CreateContext); CHECK_VTABLE(vaStatus, ctx, DestroyContext); CHECK_VTABLE(vaStatus, ctx, CreateBuffer); CHECK_VTABLE(vaStatus, ctx, BufferSetNumElements); CHECK_VTABLE(vaStatus, ctx, MapBuffer); CHECK_VTABLE(vaStatus, ctx, UnmapBuffer); CHECK_VTABLE(vaStatus, ctx, DestroyBuffer); CHECK_VTABLE(vaStatus, ctx, BeginPicture); CHECK_VTABLE(vaStatus, ctx, RenderPicture); CHECK_VTABLE(vaStatus, ctx, EndPicture); CHECK_VTABLE(vaStatus, ctx, SyncSurface); CHECK_VTABLE(vaStatus, ctx, QuerySurfaceStatus); CHECK_VTABLE(vaStatus, ctx, PutSurface); CHECK_VTABLE(vaStatus, ctx, QueryImageFormats); CHECK_VTABLE(vaStatus, ctx, CreateImage); CHECK_VTABLE(vaStatus, ctx, DeriveImage); CHECK_VTABLE(vaStatus, ctx, DestroyImage); CHECK_VTABLE(vaStatus, ctx, SetImagePalette); CHECK_VTABLE(vaStatus, ctx, GetImage); CHECK_VTABLE(vaStatus, ctx, PutImage); CHECK_VTABLE(vaStatus, ctx, QuerySubpictureFormats); CHECK_VTABLE(vaStatus, ctx, CreateSubpicture); CHECK_VTABLE(vaStatus, ctx, DestroySubpicture); CHECK_VTABLE(vaStatus, ctx, SetSubpictureImage); CHECK_VTABLE(vaStatus, ctx, SetSubpictureChromakey); CHECK_VTABLE(vaStatus, ctx, SetSubpictureGlobalAlpha); CHECK_VTABLE(vaStatus, ctx, AssociateSubpicture); CHECK_VTABLE(vaStatus, ctx, DeassociateSubpicture); CHECK_VTABLE(vaStatus, ctx, QueryDisplayAttributes); CHECK_VTABLE(vaStatus, ctx, GetDisplayAttributes); CHECK_VTABLE(vaStatus, ctx, SetDisplayAttributes); } if (VA_STATUS_SUCCESS != vaStatus) { va_errorMessage("%s init failed\n", driver_path); // dlclose(handle); } if (VA_STATUS_SUCCESS == vaStatus) ctx->handle = handle; free(driver_path); break; } } free(driver_path); driver_dir = strtok_r(NULL, ":", &saveptr); } free(search_path); return vaStatus; }