121e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan/* 221e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * Copyright (c) 2009 Intel Corporation. All Rights Reserved. 321e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * 421e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * Permission is hereby granted, free of charge, to any person obtaining a 521e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * copy of this software and associated documentation files (the 621e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * "Software"), to deal in the Software without restriction, including 721e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * without limitation the rights to use, copy, modify, merge, publish, 821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * distribute, sub license, and/or sell copies of the Software, and to 921e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * permit persons to whom the Software is furnished to do so, subject to 1021e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * the following conditions: 1121e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * 1221e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * The above copyright notice and this permission notice (including the 1321e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * next paragraph) shall be included in all copies or substantial portions 1421e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * of the Software. 1521e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * 1621e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1721e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 1821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 1921e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 2021e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2121e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2221e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2321e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan */ 2421e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 2521e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan#define _GNU_SOURCE 1 2621e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan#include "va.h" 2721e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan#include "va_backend.h" 2821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan#include "va_trace.h" 29cceaa0568f77a7452857559614100b71fb36ee3awangkun#include "va_fool.h" 3021e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 3121e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan#include <assert.h> 3221e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan#include <stdarg.h> 3321e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan#include <stdlib.h> 3421e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan#include <stdio.h> 352687b6fb4c688fd1d045527aa48692c9db1ab141pingshix#include <errno.h> 3621e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan#include <string.h> 3721e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan#include <dlfcn.h> 3821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan#include <unistd.h> 3921e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan#include <sys/types.h> 4021e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan#include <sys/stat.h> 4121e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan#include <unistd.h> 4221e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan#include <time.h> 435b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang#include <fcntl.h> 4421e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 4521e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan/* 4621e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * Do dummy decode/encode, ignore the input data 4721e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * In order to debug memory leak or low performance issues, we need to isolate driver problems 4821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * We export env "VA_FOOL", with which, we can do fake decode/encode: 4921e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * 5021e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * LIBVA_FOOL_DECODE: 515b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang * . if set, decode does nothing 525b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang * LIBVA_FOOL_ENCODE=<framename>: 535b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang * . if set, encode does nothing, but fill in the coded buffer from the content of files with 542687b6fb4c688fd1d045527aa48692c9db1ab141pingshix * name framename.0,framename.1,..., framename.N, framename.0,..., framename.N,...repeatly 55c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan * Use file name to determine h264 or vp8 565b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang * LIBVA_FOOL_JPEG=<framename>:fill the content of filename to codedbuf for jpeg encoding 5721e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * LIBVA_FOOL_POSTP: 5821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * . if set, do nothing for vaPutSurface 5921e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan */ 6021e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 6121e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 6221e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan/* global settings */ 635b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sangint fool_codec = 0; 6421e26478769d887b8357289ebb7faa47b8b415aeAustin Yuanint fool_postp = 0; 6521e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 665b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang#define FOOL_BUFID_MAGIC 0x12345600 675b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang#define FOOL_BUFID_MASK 0xffffff00 68cceaa0568f77a7452857559614100b71fb36ee3awangkun 69f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolunstruct fool_context { 70c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan int enabled; /* fool_codec is global, and it is for concurent encode/decode */ 715b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang char *fn_enc;/* file pattern with codedbuf content for encode */ 725b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang char *segbuf_enc; /* the segment buffer of coded buffer, load frome fn_enc */ 735b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang int file_count; 7421e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 755b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang char *fn_jpg;/* file name of JPEG fool with codedbuf content */ 765b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang char *segbuf_jpg; /* the segment buffer of coded buffer, load frome fn_jpg */ 77cceaa0568f77a7452857559614100b71fb36ee3awangkun 785b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang VAEntrypoint entrypoint; /* current entrypoint */ 795b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang 8021e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan /* all buffers with same type share one malloc-ed memory 8121e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * bufferID = (buffer numbers with the same type << 8) || type 8221e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * the malloc-ed memory can be find by fool_buf[bufferID & 0xff] 8321e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan * the size is ignored here 8421e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan */ 8521e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan char *fool_buf[VABufferTypeMax]; /* memory of fool buffers */ 8621e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan unsigned int fool_buf_size[VABufferTypeMax]; /* size of memory of fool buffers */ 875b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang unsigned int fool_buf_element[VABufferTypeMax]; /* element count of created buffers */ 8821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan unsigned int fool_buf_count[VABufferTypeMax]; /* count of created buffers */ 8921e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan VAContextID context; 90f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun}; 91f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun 92f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun#define FOOL_CTX(dpy) ((struct fool_context *)((VADisplayContextP)dpy)->vafool) 93c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan 94f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun#define DPY2FOOLCTX(dpy) \ 95f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun struct fool_context *fool_ctx = FOOL_CTX(dpy); \ 96f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun if (fool_ctx == NULL) \ 97c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan return 0; /* no fool for the context */ \ 98c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan 99c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan#define DPY2FOOLCTX_CHK(dpy) \ 100c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan struct fool_context *fool_ctx = FOOL_CTX(dpy); \ 101c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan if ((fool_ctx == NULL) || (fool_ctx->enabled == 0)) \ 102c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan return 0; /* no fool for the context */ \ 10321e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 10421e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan/* Prototype declarations (functions defined in va.c) */ 10521e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 10621e26478769d887b8357289ebb7faa47b8b415aeAustin Yuanvoid va_errorMessage(const char *msg, ...); 10721e26478769d887b8357289ebb7faa47b8b415aeAustin Yuanvoid va_infoMessage(const char *msg, ...); 10821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 1095b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sangint va_parseConfig(char *env, char *env_value); 11021e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 11121e26478769d887b8357289ebb7faa47b8b415aeAustin Yuanvoid va_FoolInit(VADisplay dpy) 11221e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan{ 11321e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan char env_value[1024]; 11421e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 115f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun struct fool_context *fool_ctx = calloc(sizeof(struct fool_context), 1); 116f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun 117f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun if (fool_ctx == NULL) 11821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan return; 119f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun 12021e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan if (va_parseConfig("LIBVA_FOOL_POSTP", NULL) == 0) { 12121e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan fool_postp = 1; 12221e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan va_infoMessage("LIBVA_FOOL_POSTP is on, dummy vaPutSurface\n"); 12321e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan } 1245b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang 12521e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan if (va_parseConfig("LIBVA_FOOL_DECODE", NULL) == 0) { 1265b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang fool_codec |= VA_FOOL_FLAG_DECODE; 12721e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan va_infoMessage("LIBVA_FOOL_DECODE is on, dummy decode\n"); 12821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan } 12921e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan if (va_parseConfig("LIBVA_FOOL_ENCODE", &env_value[0]) == 0) { 1305b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang fool_codec |= VA_FOOL_FLAG_ENCODE; 131f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun fool_ctx->fn_enc = strdup(env_value); 1325b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang va_infoMessage("LIBVA_FOOL_ENCODE is on, load encode data from file with patten %s\n", 133f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun fool_ctx->fn_enc); 13421e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan } 1355b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang if (va_parseConfig("LIBVA_FOOL_JPEG", &env_value[0]) == 0) { 1365b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang fool_codec |= VA_FOOL_FLAG_JPEG; 137f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun fool_ctx->fn_jpg = strdup(env_value); 1385b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang va_infoMessage("LIBVA_FOOL_JPEG is on, load encode data from file with patten %s\n", 139f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun fool_ctx->fn_jpg); 1405b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang } 1415b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang 142f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun ((VADisplayContextP)dpy)->vafool = fool_ctx; 14321e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan} 14421e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 14521e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 14621e26478769d887b8357289ebb7faa47b8b415aeAustin Yuanint va_FoolEnd(VADisplay dpy) 14721e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan{ 14821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan int i; 149f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun DPY2FOOLCTX(dpy); 150cceaa0568f77a7452857559614100b71fb36ee3awangkun 151cceaa0568f77a7452857559614100b71fb36ee3awangkun for (i = 0; i < VABufferTypeMax; i++) {/* free memory */ 152f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun if (fool_ctx->fool_buf[i]) 153f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun free(fool_ctx->fool_buf[i]); 154cceaa0568f77a7452857559614100b71fb36ee3awangkun } 155f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun if (fool_ctx->segbuf_enc) 156f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun free(fool_ctx->segbuf_enc); 157f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun if (fool_ctx->segbuf_jpg) 158f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun free(fool_ctx->segbuf_jpg); 159f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun if (fool_ctx->fn_enc) 160f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun free(fool_ctx->fn_enc); 161f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun if (fool_ctx->fn_jpg) 162f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun free(fool_ctx->fn_jpg); 163f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun 164f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun free(fool_ctx); 165f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun ((VADisplayContextP)dpy)->vafool = NULL; 166a11b959f9fe7476b4da95fbaf34105e33cfeb0d6ywan 16721e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan return 0; 16821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan} 16921e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 17021e26478769d887b8357289ebb7faa47b8b415aeAustin Yuanint va_FoolCreateConfig( 171cceaa0568f77a7452857559614100b71fb36ee3awangkun VADisplay dpy, 172cceaa0568f77a7452857559614100b71fb36ee3awangkun VAProfile profile, 173cceaa0568f77a7452857559614100b71fb36ee3awangkun VAEntrypoint entrypoint, 174a11b959f9fe7476b4da95fbaf34105e33cfeb0d6ywan VAConfigAttrib __maybe_unused *attrib_list, 175a11b959f9fe7476b4da95fbaf34105e33cfeb0d6ywan int __maybe_unused num_attribs, 176a11b959f9fe7476b4da95fbaf34105e33cfeb0d6ywan VAConfigID __maybe_unused *config_id /* out */ 17721e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan) 17821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan{ 179f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun DPY2FOOLCTX(dpy); 180cceaa0568f77a7452857559614100b71fb36ee3awangkun 181f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun fool_ctx->entrypoint = entrypoint; 182a11b959f9fe7476b4da95fbaf34105e33cfeb0d6ywan 1835b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang /* 1845b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang * check fool_codec to align with current context 1855b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang * e.g. fool_codec = decode then for encode, the 1865b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang * vaBegin/vaRender/vaEnd also run into fool path 1875b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang * which is not desired 1885b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang */ 1895b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang if (((fool_codec & VA_FOOL_FLAG_DECODE) && (entrypoint == VAEntrypointVLD)) || 1905b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang ((fool_codec & VA_FOOL_FLAG_JPEG) && (entrypoint == VAEntrypointEncPicture))) 191c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan fool_ctx->enabled = 1; 192c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan else if ((fool_codec & VA_FOOL_FLAG_ENCODE) && (entrypoint == VAEntrypointEncSlice)) { 193c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan /* H264 is desired */ 194c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan if (((profile == VAProfileH264Baseline || 195c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan profile == VAProfileH264Main || 196c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan profile == VAProfileH264High || 197c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan profile == VAProfileH264ConstrainedBaseline)) && 198c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan strstr(fool_ctx->fn_enc, "h264")) 199c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan fool_ctx->enabled = 1; 200c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan 201c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan /* vp8 is desired */ 202c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan if ((profile == VAProfileVP8Version0_3) && 203c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan strstr(fool_ctx->fn_enc, "vp8")) 204c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan fool_ctx->enabled = 1; 205c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan } 206c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan if (fool_ctx->enabled) 207c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan va_infoMessage("FOOL is enabled for this context\n"); 2085b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang else 209c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan va_infoMessage("FOOL is not enabled for this context\n"); 2105b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang 211c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan return 0; /* continue */ 21221e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan} 21321e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 21421e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 2155b3d55a0433b48477823f81821817a78ef53ac2eShuduo SangVAStatus va_FoolCreateBuffer( 2165b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang VADisplay dpy, 217a11b959f9fe7476b4da95fbaf34105e33cfeb0d6ywan VAContextID __maybe_unused context, /* in */ 2185b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang VABufferType type, /* in */ 2195b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang unsigned int size, /* in */ 2205b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang unsigned int num_elements, /* in */ 221a11b959f9fe7476b4da95fbaf34105e33cfeb0d6ywan void __maybe_unused *data, /* in */ 2225b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang VABufferID *buf_id /* out */ 22321e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan) 22421e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan{ 2255b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang unsigned int new_size = size * num_elements; 2265b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang unsigned int old_size; 227c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan DPY2FOOLCTX_CHK(dpy); 22821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 229f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun old_size = fool_ctx->fool_buf_size[type] * fool_ctx->fool_buf_element[type]; 2305b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang 2315b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang if (old_size < new_size) 232f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun fool_ctx->fool_buf[type] = realloc(fool_ctx->fool_buf[type], new_size); 2335b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang 234f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun fool_ctx->fool_buf_size[type] = size; 235f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun fool_ctx->fool_buf_element[type] = num_elements; 236f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun fool_ctx->fool_buf_count[type]++; 2375b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang /* because we ignore the vaRenderPicture, 2385b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang * all buffers with same type share same real memory 2395b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang * bufferID = (magic number) | type 2405b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang */ 2415b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang *buf_id = FOOL_BUFID_MAGIC | type; 2425b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang 2435b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang return 1; /* don't call into driver */ 24421e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan} 24521e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 2465b3d55a0433b48477823f81821817a78ef53ac2eShuduo SangVAStatus va_FoolBufferInfo( 2475b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang VADisplay dpy, 2485b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang VABufferID buf_id, /* in */ 2495b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang VABufferType *type, /* out */ 2505b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang unsigned int *size, /* out */ 2515b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang unsigned int *num_elements /* out */ 25221e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan) 25321e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan{ 254c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan unsigned int magic; 255c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan 256c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan DPY2FOOLCTX_CHK(dpy); 25721e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 258c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan magic = buf_id & FOOL_BUFID_MASK; 2595b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang if (magic != FOOL_BUFID_MAGIC) 260c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan return 0; /* could be VAImageBufferType from vaDeriveImage */ 261c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan 2625b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang *type = buf_id & 0xff; 263f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun *size = fool_ctx->fool_buf_size[*type]; 264f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun *num_elements = fool_ctx->fool_buf_element[*type];; 2655b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang 266c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan return 1; /* fool is valid */ 26721e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan} 26821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 269f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolunstatic int va_FoolFillCodedBufEnc(struct fool_context *fool_ctx) 27021e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan{ 2715b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang char file_name[1024]; 2722687b6fb4c688fd1d045527aa48692c9db1ab141pingshix struct stat file_stat = {0}; 2735b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang VACodedBufferSegment *codedbuf; 2745b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang int i, fd = -1; 2755b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang 2765b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang /* try file_name.file_count, if fail, try file_name.file_count-- */ 2775b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang for (i=0; i<=1; i++) { 2782b4f23f4aaf44ee9e7820f3799c74f813eb34cd8hding snprintf(file_name, 1024, "%s.%d", 279f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun fool_ctx->fn_enc, 280f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun fool_ctx->file_count); 2815b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang 2825b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang if ((fd = open(file_name, O_RDONLY)) != -1) { 2835b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang fstat(fd, &file_stat); 284f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun fool_ctx->file_count++; /* open next file */ 2855b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang break; 2862687b6fb4c688fd1d045527aa48692c9db1ab141pingshix } else /* fall back to the first file file */ 287f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun fool_ctx->file_count = 0; 28821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan } 2895b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang if (fd != -1) { 290f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun fool_ctx->segbuf_enc = realloc(fool_ctx->segbuf_enc, file_stat.st_size); 291f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun read(fd, fool_ctx->segbuf_enc, file_stat.st_size); 2925b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang close(fd); 2932687b6fb4c688fd1d045527aa48692c9db1ab141pingshix } else 2942687b6fb4c688fd1d045527aa48692c9db1ab141pingshix va_errorMessage("Open file %s failed:%s\n", file_name, strerror(errno)); 2952687b6fb4c688fd1d045527aa48692c9db1ab141pingshix 296f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun codedbuf = (VACodedBufferSegment *)fool_ctx->fool_buf[VAEncCodedBufferType]; 2975b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang codedbuf->size = file_stat.st_size; 2985b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang codedbuf->bit_offset = 0; 2995b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang codedbuf->status = 0; 3005b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang codedbuf->reserved = 0; 301f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun codedbuf->buf = fool_ctx->segbuf_enc; 3025b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang codedbuf->next = NULL; 303cceaa0568f77a7452857559614100b71fb36ee3awangkun 3045b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang return 0; 30521e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan} 30621e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 307f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolunstatic int va_FoolFillCodedBufJPG(struct fool_context *fool_ctx) 30821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan{ 3092687b6fb4c688fd1d045527aa48692c9db1ab141pingshix struct stat file_stat = {0}; 3105b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang VACodedBufferSegment *codedbuf; 311c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan int fd = -1; 3125b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang 313f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun if ((fd = open(fool_ctx->fn_jpg, O_RDONLY)) != -1) { 3145b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang fstat(fd, &file_stat); 315f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun fool_ctx->segbuf_jpg = realloc(fool_ctx->segbuf_jpg, file_stat.st_size); 316f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun read(fd, fool_ctx->segbuf_jpg, file_stat.st_size); 3175b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang close(fd); 3182687b6fb4c688fd1d045527aa48692c9db1ab141pingshix } else 319f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun va_errorMessage("Open file %s failed:%s\n", fool_ctx->fn_jpg, strerror(errno)); 3202687b6fb4c688fd1d045527aa48692c9db1ab141pingshix 321f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun codedbuf = (VACodedBufferSegment *)fool_ctx->fool_buf[VAEncCodedBufferType]; 3225b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang codedbuf->size = file_stat.st_size; 3235b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang codedbuf->bit_offset = 0; 3245b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang codedbuf->status = 0; 3255b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang codedbuf->reserved = 0; 326f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun codedbuf->buf = fool_ctx->segbuf_jpg; 3275b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang codedbuf->next = NULL; 328cceaa0568f77a7452857559614100b71fb36ee3awangkun 3295b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang return 0; 33021e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan} 33121e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 33221e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 333f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolunstatic int va_FoolFillCodedBuf(struct fool_context *fool_ctx) 33421e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan{ 335f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun if (fool_ctx->entrypoint == VAEntrypointEncSlice) 336f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun va_FoolFillCodedBufEnc(fool_ctx); 337f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun else if (fool_ctx->entrypoint == VAEntrypointEncPicture) 338f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun va_FoolFillCodedBufJPG(fool_ctx); 3395b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang 3405b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang return 0; 34121e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan} 34221e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 3435b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang 3445b3d55a0433b48477823f81821817a78ef53ac2eShuduo SangVAStatus va_FoolMapBuffer( 3455b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang VADisplay dpy, 3465b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang VABufferID buf_id, /* in */ 3475b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang void **pbuf /* out */ 348cceaa0568f77a7452857559614100b71fb36ee3awangkun) 34921e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan{ 350c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan unsigned int magic, buftype; 351c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan DPY2FOOLCTX_CHK(dpy); 352cceaa0568f77a7452857559614100b71fb36ee3awangkun 353c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan magic = buf_id & FOOL_BUFID_MASK; 354c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan if (magic != FOOL_BUFID_MAGIC) 355c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan return 0; /* could be VAImageBufferType from vaDeriveImage */ 356c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan 357c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan buftype = buf_id & 0xff; 358f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun *pbuf = fool_ctx->fool_buf[buftype]; 35921e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 360c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan /* it is coded buffer, fill coded segment from file */ 3615b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang if (*pbuf && (buftype == VAEncCodedBufferType)) 362f32d88b4751aa44be38f62dcd25533aec6ca46a2Liu Bolun va_FoolFillCodedBuf(fool_ctx); 3635b3d55a0433b48477823f81821817a78ef53ac2eShuduo Sang 364c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan return 1; /* fool is valid */ 36521e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan} 36621e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 367c263d6a794e2a50d0f95919ed9f56003caedd492Austin YuanVAStatus va_FoolCheckContinuity(VADisplay dpy) 36821e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan{ 369c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan DPY2FOOLCTX_CHK(dpy); 37021e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan 371c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan return 1; /* fool is valid */ 37221e26478769d887b8357289ebb7faa47b8b415aeAustin Yuan} 373c263d6a794e2a50d0f95919ed9f56003caedd492Austin Yuan 374