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