110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan/*
210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * Copyright (c) 2014 Intel Corporation. All Rights Reserved.
310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan *
410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * Permission is hereby granted, free of charge, to any person obtaining a
510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * copy of this software and associated documentation files (the
610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * "Software"), to deal in the Software without restriction, including
710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * without limitation the rights to use, copy, modify, merge, publish,
810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * distribute, sub license, and/or sell copies of the Software, and to
910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * permit persons to whom the Software is furnished to do so, subject to
1010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * the following conditions:
1110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan *
1210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * The above copyright notice and this permission notice (including the
1310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * next paragraph) shall be included in all copies or substantial portions
1410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * of the Software.
1510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan *
1610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
1910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR
2010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan */
2410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan/*
2510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * Video process test case based on LibVA.
2610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * This test covers deinterlace, denoise, color balance, sharpening,
2710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * blending, scaling and several surface format conversion.
2810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan * Usage: videoprocess process.cfg
2910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan */
3010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
3110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan#include <stdio.h>
3210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan#include <stdlib.h>
3310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan#include <string.h>
3410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan#include <stdint.h>
3510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan#include <sys/time.h>
3610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan#include <assert.h>
3710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan#include <va/va.h>
3810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan#include <va/va_vpp.h>
3910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan#include "va_display.h"
4010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
4110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan#ifndef VA_FOURCC_I420
4210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan#define VA_FOURCC_I420 0x30323449
4310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan#endif
4410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
4510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan#define MAX_LEN   1024
4610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
4710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan#define CHECK_VASTATUS(va_status,func)                                      \
4810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan  if (va_status != VA_STATUS_SUCCESS) {                                     \
4910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan      fprintf(stderr,"%s:%s (%d) failed,exit\n", __func__, func, __LINE__); \
5010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan      exit(1);                                                              \
5110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan  }
5210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
5310d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VADisplay va_dpy = NULL;
5410d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VAContextID context_id = 0;
5510d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VAConfigID  config_id = 0;
5610d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VAProcFilterType g_filter_type = VAProcFilterNone;
5710d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VASurfaceID g_in_surface_id = VA_INVALID_ID;
5810d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VASurfaceID g_out_surface_id = VA_INVALID_ID;
5910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
6010d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic FILE* g_config_file_fd = NULL;
6110d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic FILE* g_src_file_fd = NULL;
6210d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic FILE* g_dst_file_fd = NULL;
6310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
6410d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic char g_config_file_name[MAX_LEN];
6510d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic char g_src_file_name[MAX_LEN];
6610d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic char g_dst_file_name[MAX_LEN];
6710d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic char g_filter_type_name[MAX_LEN];
6810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
6910d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic uint32_t g_in_pic_width = 352;
7010d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic uint32_t g_in_pic_height = 288;
7110d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic uint32_t g_out_pic_width = 352;
7210d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic uint32_t g_out_pic_height = 288;
7310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
7410d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic uint32_t g_in_fourcc  = VA_FOURCC('N', 'V', '1', '2');
7510d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic uint32_t g_in_format  = VA_RT_FORMAT_YUV420;
7610d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic uint32_t g_out_fourcc = VA_FOURCC('N', 'V', '1', '2');
7710d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic uint32_t g_out_format = VA_RT_FORMAT_YUV420;
7810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
7910d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic uint8_t g_blending_enabled = 0;
8010d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic uint8_t g_blending_min_luma = 1;
8110d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic uint8_t g_blending_max_luma = 254;
8210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
8310d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic uint32_t g_frame_count = 0;
8410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
8510d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic int8_t
8610d94aff40fa7cb9349f839613856ea37327268cAustin Yuanread_value_string(FILE *fp, const char* field_name, char* value)
8710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
8810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    char strLine[MAX_LEN];
8910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    char* field;
9010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    char* str;
9110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    uint16_t i;
9210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
9310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (!fp || !field_name || !value)  {
9410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Invalid fuction parameters\n");
9510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        return -1;
9610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
9710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
9810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    rewind(fp);
9910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
10010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    while (!feof(fp)) {
10110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (!fgets(strLine, MAX_LEN, fp))
10210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            continue;
10310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
10410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        for (i = 0; strLine[i] && i < MAX_LEN; i++)
10510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            if (strLine[i] != ' ') break;
10610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
10710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (strLine[i] == '#' || strLine[i] == '\n' || i == 1024)
10810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            continue;
10910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
11010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        field = strtok(&strLine[i], ":");
11110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (strncmp(field, field_name, strlen(field_name)))
11210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            continue;
11310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
11410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (!(str = strtok(NULL, ":")))
11510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            continue;
11610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
11710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        /* skip blank space in string */
11810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        while (*str == ' ')
11910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            str++;
12010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
12110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        *(str + strlen(str)-1) = '\0';
12210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        strcpy(value, str);
12310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
12410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        return 0;
12510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
12610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
12710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    return -1;
12810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
12910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
13010d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic int8_t
13110d94aff40fa7cb9349f839613856ea37327268cAustin Yuanread_value_uint8(FILE* fp, const char* field_name, uint8_t* value)
13210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
13310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    char str[MAX_LEN];
13410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
13510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (read_value_string(fp, field_name, str)) {
13610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Failed to find integer field: %s", field_name);
13710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        return -1;
13810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
13910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
14010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    *value = (uint8_t)atoi(str);
14110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    return 0;
14210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
14310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
14410d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic int8_t
14510d94aff40fa7cb9349f839613856ea37327268cAustin Yuanread_value_uint32(FILE* fp, const char* field_name, uint32_t* value)
14610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
14710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    char str[MAX_LEN];
14810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
14910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (read_value_string(fp, field_name, str)) {
15010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan       printf("Failed to find integer field: %s", field_name);
15110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan       return -1;
15210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
15310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
15410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    *value = (uint32_t)atoi(str);
15510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    return 0;
15610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
15710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
15810d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic int8_t
15910d94aff40fa7cb9349f839613856ea37327268cAustin Yuanread_value_float(FILE *fp, const char* field_name, float* value)
16010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
16110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    char str[MAX_LEN];
16210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (read_value_string(fp, field_name, str)) {
16310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan       printf("Failed to find float field: %s \n",field_name);
16410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan       return -1;
16510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
16610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
16710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    *value = atof(str);
16810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    return 0;
16910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
17010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
17110d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic float
17210d94aff40fa7cb9349f839613856ea37327268cAustin Yuanadjust_to_range(VAProcFilterValueRange *range, float value)
17310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
17410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (value < range->min_value || value > range->max_value){
17510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Value: %f exceed range: (%f ~ %f), force to use default: %f \n",
17610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                value, range->min_value, range->max_value, range->default_value);
17710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        return range->default_value;
17810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
17910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
18010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    return value;
18110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
18210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
18310d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VAStatus
18410d94aff40fa7cb9349f839613856ea37327268cAustin Yuancreate_surface(VASurfaceID * p_surface_id,
18510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan               uint32_t width, uint32_t height,
18610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan               uint32_t fourCC, uint32_t format)
18710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
18810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAStatus va_status;
18910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VASurfaceAttrib    surface_attrib;
19010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    surface_attrib.type =  VASurfaceAttribPixelFormat;
19110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    surface_attrib.flags = VA_SURFACE_ATTRIB_SETTABLE;
19210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    surface_attrib.value.type = VAGenericValueTypeInteger;
19310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    surface_attrib.value.value.i = fourCC;
19410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
19510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaCreateSurfaces(va_dpy,
19610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                 format,
19710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                 width ,
19810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                 height,
19910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                 p_surface_id,
20010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                 1,
20110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                 &surface_attrib,
20210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                 1);
20310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan   return va_status;
20410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
20510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
20610d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VAStatus
20710d94aff40fa7cb9349f839613856ea37327268cAustin Yuanconstruct_nv12_mask_surface(VASurfaceID surface_id,
20810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                            uint8_t min_luma,
20910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                            uint8_t max_luma)
21010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
21110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAStatus va_status;
21210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAImage surface_image;
21310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    void *surface_p = NULL;
21410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    unsigned char *y_dst, *u_dst, *v_dst;
21510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    uint32_t row, col;
21610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
21710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaDeriveImage(va_dpy, surface_id, &surface_image);
21810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaDeriveImage");
21910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
22010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaMapBuffer(va_dpy, surface_image.buf, &surface_p);
22110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaMapBuffer");
22210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
22310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    y_dst = (unsigned char *)((unsigned char*)surface_p + surface_image.offsets[0]);
22410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    u_dst = (unsigned char *)((unsigned char*)surface_p + surface_image.offsets[1]);
22510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    v_dst = u_dst;
22610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
22710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* fill Y plane, the luma values of some pixels is in the range of min_luma~max_luma,
22810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     * and others are out side of it, in luma key blending case, the pixels with Y value
22910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     * exceeding the range will be hided*/
23010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    for (row = 0; row < surface_image.height; row++) {
23110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (row < surface_image.height / 4 || row > surface_image.height * 3 / 4)
23210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            memset(y_dst, max_luma + 1, surface_image.pitches[0]);
23310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        else
23410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            memset(y_dst, (min_luma + max_luma) / 2, surface_image.pitches[0]);
23510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
23610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        y_dst += surface_image.pitches[0];
23710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     }
23810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
23910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     /* fill UV plane */
24010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     for (row = 0; row < surface_image.height / 2; row++) {
24110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         for (col = 0; col < surface_image.width / 2; col++) {
24210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan             u_dst[col * 2] = 128;
24310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan             u_dst[col * 2 + 1] = 128;
24410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        }
24510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        u_dst += surface_image.pitches[1];
24610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     }
24710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
24810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    vaUnmapBuffer(va_dpy, surface_image.buf);
24910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    vaDestroyImage(va_dpy, surface_image.image_id);
25010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
25110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    return VA_STATUS_SUCCESS;
25210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
25310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
25410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan/* Load yv12 frame to NV12/YV12/I420 surface*/
25510d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VAStatus
25610d94aff40fa7cb9349f839613856ea37327268cAustin Yuanupload_yv12_frame_to_yuv_surface(FILE *fp,
25710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                 VASurfaceID surface_id)
25810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
25910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAStatus va_status;
26010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAImage surface_image;
26110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    unsigned char *y_src, *u_src, *v_src;
26210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    unsigned char *y_dst, *u_dst, *v_dst;
26310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    void *surface_p = NULL;
26410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    uint32_t frame_size, i, row, col;
26510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    size_t n_items;
26610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    unsigned char * newImageBuffer = NULL;
26710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
26810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaDeriveImage(va_dpy, surface_id, &surface_image);
26910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaDeriveImage");
27010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
27110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaMapBuffer(va_dpy, surface_image.buf, &surface_p);
27210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaMapBuffer");
27310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
27410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (surface_image.format.fourcc == VA_FOURCC_YV12 ||
27510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        surface_image.format.fourcc == VA_FOURCC_I420 ||
27610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        surface_image.format.fourcc == VA_FOURCC_NV12){
27710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
27810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        frame_size = surface_image.width * surface_image.height * 3 / 2;
27910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        newImageBuffer = (unsigned char*)malloc(frame_size);
28010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        do {
28110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            n_items = fread(newImageBuffer, frame_size, 1, fp);
28210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        } while (n_items != 1);
28310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
28410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        y_src = newImageBuffer;
28510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        v_src = newImageBuffer + surface_image.width * surface_image.height;
28610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        u_src = newImageBuffer + surface_image.width * surface_image.height * 5 / 4;
28710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
28810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        y_dst = (unsigned char *)((unsigned char*)surface_p + surface_image.offsets[0]);
28910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
29010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if(surface_image.format.fourcc == VA_FOURCC_YV12){
29110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            v_dst = (unsigned char *)((unsigned char*)surface_p + surface_image.offsets[1]);
29210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            u_dst = (unsigned char *)((unsigned char*)surface_p + surface_image.offsets[2]);
29310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        }else if(surface_image.format.fourcc == VA_FOURCC_I420){
29410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            u_dst = (unsigned char *)((unsigned char*)surface_p + surface_image.offsets[1]);
29510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            v_dst = (unsigned char *)((unsigned char*)surface_p + surface_image.offsets[2]);
29610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        }else {
29710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            u_dst = (unsigned char *)((unsigned char*)surface_p + surface_image.offsets[1]);
29810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            v_dst = u_dst;
29910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        }
30010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
30110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        /* Y plane, directly copy */
30210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        for (row = 0; row < surface_image.height; row++) {
30310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            memcpy(y_dst, y_src, surface_image.width);
30410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            y_dst += surface_image.pitches[0];
30510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            y_src += surface_image.width;
30610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        }
30710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
30810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        /* UV plane */
30910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (surface_image.format.fourcc == VA_FOURCC_YV12||
31010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            surface_image.format.fourcc == VA_FOURCC_I420){
31110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            /* UV plane */
31210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            for (row = 0; row < surface_image.height /2; row ++){
31310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                memcpy(v_dst, v_src, surface_image.width/2);
31410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                memcpy(u_dst, u_src, surface_image.width/2);
31510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
31610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                v_src += surface_image.width/2;
31710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                u_src += surface_image.width/2;
31810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
31910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                if (surface_image.format.fourcc == VA_FOURCC_YV12){
32010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                    v_dst += surface_image.pitches[1];
32110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                    u_dst += surface_image.pitches[2];
32210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                } else {
32310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                    v_dst += surface_image.pitches[2];
32410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                    u_dst += surface_image.pitches[1];
32510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                }
32610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            }
32710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        } else if (surface_image.format.fourcc == VA_FOURCC_NV12){
32810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            for (row = 0; row < surface_image.height / 2; row++) {
32910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                for (col = 0; col < surface_image.width / 2; col++) {
33010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                    u_dst[col * 2] = u_src[col];
33110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                    u_dst[col * 2 + 1] = v_src[col];
33210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                }
33310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
33410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                u_dst += surface_image.pitches[1];
33510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                u_src += (surface_image.width / 2);
33610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                v_src += (surface_image.width / 2);
33710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            }
33810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        }
33910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     } else {
34010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         printf("Not supported YUV surface fourcc !!! \n");
34110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         return VA_STATUS_ERROR_INVALID_SURFACE;
34210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     }
34310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
34410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     if (newImageBuffer){
34510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         free(newImageBuffer);
34610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         newImageBuffer = NULL;
34710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     }
34810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
34910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     vaUnmapBuffer(va_dpy, surface_image.buf);
35010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     vaDestroyImage(va_dpy, surface_image.image_id);
35110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
35210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     return VA_STATUS_SUCCESS;
35310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
35410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
35510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan/* Store NV12/YV12/I420 surface to yv12 frame*/
35610d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VAStatus
35710d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstore_yuv_surface_to_yv12_frame(FILE *fp,
35810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                            VASurfaceID surface_id)
35910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
36010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAStatus va_status;
36110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAImageFormat image_format;
36210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAImage surface_image;
36310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    void *surface_p = NULL;
36410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    unsigned char *y_src, *u_src, *v_src;
36510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    unsigned char *y_dst, *u_dst, *v_dst;
36610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    uint32_t frame_size, row, col;
36710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    int32_t  ret, n_items;
36810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    unsigned char * newImageBuffer = NULL;
36910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
37010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaDeriveImage(va_dpy, surface_id, &surface_image);
37110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaDeriveImage");
37210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
37310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaMapBuffer(va_dpy, surface_image.buf, &surface_p);
37410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaMapBuffer");
37510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
37610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* store the surface to one YV12 file or one bmp file*/
37710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (surface_image.format.fourcc == VA_FOURCC_YV12 ||
37810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        surface_image.format.fourcc == VA_FOURCC_I420 ||
37910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        surface_image.format.fourcc == VA_FOURCC_NV12){
38010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
38110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        uint32_t y_size = surface_image.width * surface_image.height;
38210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        uint32_t u_size = y_size/4;
38310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
38410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        newImageBuffer = (unsigned char*)malloc(y_size * 3 / 2);
38510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
38610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        /* stored as YV12 format */
38710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        y_dst = newImageBuffer;
38810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        v_dst = newImageBuffer + y_size;
38910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        u_dst = newImageBuffer + y_size + u_size;
39010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
39110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        y_src = (unsigned char *)((unsigned char*)surface_p + surface_image.offsets[0]);
39210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (surface_image.format.fourcc == VA_FOURCC_YV12){
39310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            v_src = (unsigned char *)((unsigned char*)surface_p + surface_image.offsets[1]);
39410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            u_src = (unsigned char *)((unsigned char*)surface_p + surface_image.offsets[2]);
39510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        } else if(surface_image.format.fourcc == VA_FOURCC_I420){
39610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            u_src = (unsigned char *)((unsigned char*)surface_p + surface_image.offsets[1]);
39710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            v_src = (unsigned char *)((unsigned char*)surface_p + surface_image.offsets[2]);
39810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        } else if(surface_image.format.fourcc == VA_FOURCC_NV12){
39910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            u_src = (unsigned char *)((unsigned char*)surface_p + surface_image.offsets[1]);
40010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            v_src = u_src;
40110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        }
40210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
40310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        /* Y plane copy */
40410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        for (row = 0; row < surface_image.height; row++) {
40510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            memcpy(y_dst, y_src, surface_image.width);
40610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            y_src += surface_image.pitches[0];
40710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            y_dst += surface_image.width;
40810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        }
40910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
41010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        /* UV plane copy */
41110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (surface_image.format.fourcc == VA_FOURCC_YV12||
41210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            surface_image.format.fourcc == VA_FOURCC_I420){
41310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            for (row = 0; row < surface_image.height /2; row ++){
41410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                memcpy(v_dst, v_src, surface_image.width/2);
41510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                memcpy(u_dst, u_src, surface_image.width/2);
41610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
41710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                v_dst += surface_image.width/2;
41810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                u_dst += surface_image.width/2;
41910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
42010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                if (surface_image.format.fourcc == VA_FOURCC_YV12){
42110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                    v_src += surface_image.pitches[1];
42210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                    u_src += surface_image.pitches[2];
42310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                 } else {
42410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                    v_src += surface_image.pitches[2];
42510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                    u_src += surface_image.pitches[1];
42610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                 }
42710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan             }
42810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         } else if (surface_image.format.fourcc == VA_FOURCC_NV12){
42910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan             for (row = 0; row < surface_image.height / 2; row++) {
43010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                 for (col = 0; col < surface_image.width /2; col++) {
43110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                     u_dst[col] = u_src[col * 2];
43210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                     v_dst[col] = u_src[col * 2 + 1];
43310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                  }
43410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
43510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                  u_src += surface_image.pitches[1];
43610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                  u_dst += (surface_image.width / 2);
43710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                  v_dst += (surface_image.width / 2);
43810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan             }
43910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         }
44010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
44110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         /* write frame to file */
44210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         do {
44310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan             n_items = fwrite(newImageBuffer, y_size * 3 / 2, 1, fp);
44410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         } while (n_items != 1);
44510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
44610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     } else {
44710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         printf("Not supported YUV surface fourcc !!! \n");
44810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         return VA_STATUS_ERROR_INVALID_SURFACE;
44910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     }
45010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
45110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     if (newImageBuffer){
45210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         free(newImageBuffer);
45310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         newImageBuffer = NULL;
45410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     }
45510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
45610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     vaUnmapBuffer(va_dpy, surface_image.buf);
45710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     vaDestroyImage(va_dpy, surface_image.image_id);
45810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
45910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan     return VA_STATUS_SUCCESS;
46010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
46110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
46210d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VAStatus
46310d94aff40fa7cb9349f839613856ea37327268cAustin Yuandenoise_filter_init(VABufferID *filter_param_buf_id)
46410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
46510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAStatus va_status = VA_STATUS_SUCCESS;
46610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAProcFilterParameterBuffer denoise_param;
46710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VABufferID denoise_param_buf_id;
46810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    float intensity;
46910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
47010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAProcFilterCap denoise_caps;
47110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    uint32_t num_denoise_caps = 1;
47210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaQueryVideoProcFilterCaps(va_dpy, context_id,
47310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                           VAProcFilterNoiseReduction,
47410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                           &denoise_caps, &num_denoise_caps);
47510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status,"vaQueryVideoProcFilterCaps");
47610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
47710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (read_value_float(g_config_file_fd, "DENOISE_INTENSITY", &intensity)) {
47810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Read denoise intensity failed, use default value");
47910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        intensity = denoise_caps.range.default_value;
48010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
48110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    intensity = adjust_to_range(&denoise_caps.range, intensity);
48210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
48310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    denoise_param.type  = VAProcFilterNoiseReduction;
48410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    denoise_param.value = intensity;
48510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
48610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    printf("Denoise intensity: %f\n", intensity);
48710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
48810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaCreateBuffer(va_dpy, context_id,
48910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               VAProcFilterParameterBufferType, sizeof(denoise_param), 1,
49010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               &denoise_param, &denoise_param_buf_id);
49110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status,"vaCreateBuffer");
49210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
49310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    *filter_param_buf_id = denoise_param_buf_id;
49410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
49510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    return va_status;
49610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
49710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
49810d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VAStatus
49910d94aff40fa7cb9349f839613856ea37327268cAustin Yuandeinterlace_filter_init(VABufferID *filter_param_buf_id)
50010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
50110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAStatus va_status = VA_STATUS_SUCCESS;
50210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAProcFilterParameterBufferDeinterlacing deinterlacing_param;
50310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VABufferID deinterlacing_param_buf_id;
50410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    char algorithm_str[MAX_LEN], flags_str[MAX_LEN];
50510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    uint32_t i;
50610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
50710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* read and check whether configured deinterlace algorithm is supported */
50810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    deinterlacing_param.algorithm  = VAProcDeinterlacingBob;
50910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (!read_value_string(g_config_file_fd, "DEINTERLACING_ALGORITHM", algorithm_str)) {
51010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Deinterlacing algorithm in config: %s \n", algorithm_str);
51110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (!strcmp(algorithm_str, "VAProcDeinterlacingBob"))
51210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            deinterlacing_param.algorithm  = VAProcDeinterlacingBob;
51310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        else if (!strcmp(algorithm_str, "VAProcDeinterlacingWeave"))
51410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            deinterlacing_param.algorithm  = VAProcDeinterlacingWeave;
51510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        else if (!strcmp(algorithm_str, "VAProcDeinterlacingMotionAdaptive"))
51610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            deinterlacing_param.algorithm  = VAProcDeinterlacingMotionAdaptive;
51710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        else if (!strcmp(algorithm_str, "VAProcDeinterlacingMotionCompensated"))
51810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            deinterlacing_param.algorithm  = VAProcDeinterlacingMotionCompensated;
51910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    } else {
52010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Read deinterlace algorithm failed, use default algorithm");
52110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        deinterlacing_param.algorithm  = VAProcDeinterlacingBob;
52210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
52310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
52410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAProcFilterCapDeinterlacing deinterlacing_caps[VAProcDeinterlacingCount];
52510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    uint32_t num_deinterlacing_caps = VAProcDeinterlacingCount;
52610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaQueryVideoProcFilterCaps(va_dpy, context_id,
52710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                           VAProcFilterDeinterlacing,
52810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                           &deinterlacing_caps, &num_deinterlacing_caps);
52910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status,"vaQueryVideoProcFilterCaps");
53010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
53110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    for (i = 0; i < VAProcDeinterlacingCount; i ++)
53210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan       if (deinterlacing_caps[i].type == deinterlacing_param.algorithm)
53310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         break;
53410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
53510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (i == VAProcDeinterlacingCount) {
53610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Deinterlacing algorithm: %d is not supported by driver, \
53710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                use defautl algorithm :%d \n",
53810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                deinterlacing_param.algorithm,
53910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                VAProcDeinterlacingBob);
54010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        deinterlacing_param.algorithm = VAProcDeinterlacingBob;
54110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
54210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
54310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* read and check the deinterlace flags */
54410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    deinterlacing_param.flags = 0;
54510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (!read_value_string(g_config_file_fd, "DEINTERLACING_FLAG", flags_str)) {
54610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (strstr(flags_str, "VA_DEINTERLACING_BOTTOM_FIELD_FIRST"))
54710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            deinterlacing_param.flags |= VA_DEINTERLACING_BOTTOM_FIELD_FIRST;
54810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (strstr(flags_str, "VA_DEINTERLACING_BOTTOM_FIELD"))
54910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            deinterlacing_param.flags |= VA_DEINTERLACING_BOTTOM_FIELD;
55010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (strstr(flags_str, "VA_DEINTERLACING_ONE_FIELD"))
55110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            deinterlacing_param.flags |= VA_DEINTERLACING_ONE_FIELD;
55210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
55310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
55410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    deinterlacing_param.type  = VAProcFilterDeinterlacing;
55510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
55610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* create deinterlace fitler buffer */
55710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaCreateBuffer(va_dpy, context_id,
55810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               VAProcFilterParameterBufferType, sizeof(deinterlacing_param), 1,
55910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               &deinterlacing_param, &deinterlacing_param_buf_id);
56010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaCreateBuffer");
56110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
56210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    *filter_param_buf_id = deinterlacing_param_buf_id;
56310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
56410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    return va_status;
56510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
56610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
56710d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VAStatus
56810d94aff40fa7cb9349f839613856ea37327268cAustin Yuansharpening_filter_init(VABufferID *filter_param_buf_id)
56910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
57010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAStatus va_status;
57110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAProcFilterParameterBuffer sharpening_param;
57210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VABufferID sharpening_param_buf_id;
57310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    float intensity;
57410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
57510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAProcFilterCap sharpening_caps;
57610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    uint32_t num_sharpening_caps = 1;
57710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaQueryVideoProcFilterCaps(va_dpy, context_id,
57810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                VAProcFilterSharpening,
57910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                &sharpening_caps, &num_sharpening_caps);
58010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status,"vaQueryVideoProcFilterCaps");
58110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
58210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if(read_value_float(g_config_file_fd, "SHARPENING_INTENSITY", &intensity)) {
58310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Read sharpening intensity failed, use default value.");
58410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        intensity = sharpening_caps.range.default_value;
58510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
58610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
58710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    intensity = adjust_to_range(&sharpening_caps.range, intensity);
58810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    printf("Sharpening intensity: %f\n", intensity);
58910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    sharpening_param.value = intensity;
59010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
59110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    sharpening_param.type  = VAProcFilterSharpening;
59210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
59310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* create sharpening fitler buffer */
59410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaCreateBuffer(va_dpy, context_id,
59510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               VAProcFilterParameterBufferType, sizeof(sharpening_param), 1,
59610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               &sharpening_param, &sharpening_param_buf_id);
59710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
59810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    *filter_param_buf_id = sharpening_param_buf_id;
59910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
60010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    return va_status;
60110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
60210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
60310d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VAStatus
60410d94aff40fa7cb9349f839613856ea37327268cAustin Yuancolor_balance_filter_init(VABufferID *filter_param_buf_id)
60510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
60610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAStatus va_status;
60710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAProcFilterParameterBufferColorBalance color_balance_param[4];
60810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VABufferID color_balance_param_buf_id;
60910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    float value;
61010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    uint32_t i, count;
61110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    int8_t status;
61210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
61310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAProcFilterCapColorBalance color_balance_caps[VAProcColorBalanceCount];
61410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    unsigned int num_color_balance_caps = VAProcColorBalanceCount;
61510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaQueryVideoProcFilterCaps(va_dpy, context_id,
61610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                           VAProcFilterColorBalance,
61710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                           &color_balance_caps, &num_color_balance_caps);
61810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status,"vaQueryVideoProcFilterCaps");
61910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
62010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    count = 0;
62110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    printf("Color balance params: ");
62210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    for (i = 0; i < num_color_balance_caps; i++) {
62310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (color_balance_caps[i].type == VAProcColorBalanceHue) {
62410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            color_balance_param[count].attrib  = VAProcColorBalanceHue;
62510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            status = read_value_float(g_config_file_fd, "COLOR_BALANCE_HUE", &value);
62610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            printf("Hue: ");
62710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        } else if (color_balance_caps[i].type == VAProcColorBalanceSaturation) {
62810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            color_balance_param[count].attrib  = VAProcColorBalanceSaturation;
62910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            status = read_value_float(g_config_file_fd, "COLOR_BALANCE_SATURATION", &value);
63010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            printf("Saturation: ");
63110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        } else if (color_balance_caps[i].type == VAProcColorBalanceBrightness) {
63210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            color_balance_param[count].attrib  = VAProcColorBalanceBrightness;
63310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            status = read_value_float(g_config_file_fd, "COLOR_BALANCE_BRIGHTNESS", &value);
63410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            printf("Brightness: ");
63510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        } else if (color_balance_caps[i].type == VAProcColorBalanceContrast) {
63610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            color_balance_param[count].attrib  = VAProcColorBalanceContrast;
63710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            status = read_value_float(g_config_file_fd, "COLOR_BALANCE_CONTRAST", &value);
63810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            printf("Contrast: ");
63910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        } else {
64010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            continue;
64110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        }
64210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
64310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (status)
64410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            value = color_balance_caps[i].range.default_value;
64510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        else
64610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            value = adjust_to_range(&color_balance_caps[i].range, value);
64710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
64810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        color_balance_param[count].value = value;
64910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        color_balance_param[count].type  = VAProcFilterColorBalance;
65010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        count++;
65110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
65210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("%4f,  ", value);
65310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
65410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    printf("\n");
65510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
65610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaCreateBuffer(va_dpy, context_id,
65710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               VAProcFilterParameterBufferType, sizeof(color_balance_param), 4,
65810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               color_balance_param, &color_balance_param_buf_id);
65910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
66010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    *filter_param_buf_id = color_balance_param_buf_id;
66110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
66210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    return va_status;
66310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
66410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
66510d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VAStatus
66610d94aff40fa7cb9349f839613856ea37327268cAustin Yuanblending_state_init(VABlendState *state)
66710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
66810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAStatus va_status = VA_STATUS_SUCCESS;
66910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    char blending_flags_str[MAX_LEN];
67010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    float global_alpha;
67110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    uint32_t min_luma, max_luma;
67210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
67310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* read and check blend state */
67410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    state->flags = 0;
67510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (!read_value_string(g_config_file_fd, "BLENDING_FLAGS", blending_flags_str)){
67610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (strstr(blending_flags_str, "VA_BLEND_GLOBAL_ALPHA")) {
67710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan           if (read_value_float(g_config_file_fd, "BLENDING_GLOBAL_ALPHA", &global_alpha)) {
67810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan               global_alpha = 1.0  ;
67910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan               printf("Use default global alpha : %4f \n", global_alpha);
68010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan           }
68110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan           state->flags |= VA_BLEND_GLOBAL_ALPHA;
68210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan           state->global_alpha = global_alpha;
68310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        }
68410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (strstr(blending_flags_str, "VA_BLEND_LUMA_KEY")) {
68510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            if (read_value_uint8(g_config_file_fd, "BLENDING_MIN_LUMA", &g_blending_min_luma)) {
68610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                g_blending_min_luma = 1;
68710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                printf("Use default min luma : %3d \n", g_blending_min_luma);
68810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            }
68910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            if (read_value_uint8(g_config_file_fd, "BLENDING_MAX_LUMA", &g_blending_max_luma)) {
69010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                g_blending_max_luma = 254;
69110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                printf("Use default max luma : %3d \n", g_blending_max_luma);
69210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            }
69310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            state->flags |= VA_BLEND_LUMA_KEY;
69410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            state->min_luma = g_blending_min_luma * 1.0 / 256;
69510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            state->max_luma = g_blending_max_luma * 1.0 / 256;
69610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        }
69710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
69810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Blending type = %s, alpha = %f, min_luma = %3d, max_luma = %3d \n",
69910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan              blending_flags_str, global_alpha, min_luma, max_luma);
70010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
70110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
70210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAProcPipelineCaps pipeline_caps;
70310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaQueryVideoProcPipelineCaps(va_dpy, context_id,
70410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                NULL, 0, &pipeline_caps);
70510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status,"vaQueryVideoProcPipelineCaps");
70610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
70710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (!pipeline_caps.blend_flags){
70810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Blending is not supported in driver! \n");
70910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        return VA_STATUS_ERROR_UNIMPLEMENTED;
71010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
71110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
71210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (! (pipeline_caps.blend_flags & state->flags)) {
71310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Driver do not support current blending flags: %d", state->flags);
71410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        return VA_STATUS_ERROR_UNIMPLEMENTED;
71510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
71610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
71710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    return va_status;
71810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
71910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
72010d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VAStatus
72110d94aff40fa7cb9349f839613856ea37327268cAustin Yuanvideo_frame_process(VAProcFilterType filter_type,
72210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                    uint32_t frame_idx,
72310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                    VASurfaceID in_surface_id,
72410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                    VASurfaceID out_surface_id)
72510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
72610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAStatus va_status;
72710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAProcPipelineParameterBuffer pipeline_param;
72810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VARectangle surface_region, output_region;
72910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VABufferID pipeline_param_buf_id = VA_INVALID_ID;
73010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VABufferID filter_param_buf_id = VA_INVALID_ID;
73110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VABlendState state ;
73210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    uint32_t filter_count = 1;
73310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
73410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* create denoise_filter buffer id */
73510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    switch(filter_type){
73610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan      case VAProcFilterNoiseReduction:
73710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan           denoise_filter_init(&filter_param_buf_id);
73810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan           break;
73910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan      case VAProcFilterDeinterlacing:
74010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan           deinterlace_filter_init(&filter_param_buf_id);
74110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan           break;
74210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan      case VAProcFilterSharpening:
74310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan           sharpening_filter_init(&filter_param_buf_id);
74410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan           break;
74510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan      case VAProcFilterColorBalance:
74610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan           color_balance_filter_init(&filter_param_buf_id);
74710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan           break;
74810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan      default :
74910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan           filter_count = 0;
75010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         break;
75110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
75210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
75310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* Fill pipeline buffer */
75410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    surface_region.x = 0;
75510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    surface_region.y = 0;
75610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    surface_region.width = g_in_pic_width;
75710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    surface_region.height = g_in_pic_height;
75810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    output_region.x = 0;
75910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    output_region.y = 0;
76010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    output_region.width = g_out_pic_width;
76110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    output_region.height = g_out_pic_height;
76210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
76310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    memset(&pipeline_param, 0, sizeof(pipeline_param));
76410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    pipeline_param.surface = in_surface_id;
76510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    pipeline_param.surface_region = &surface_region;
76610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    pipeline_param.output_region = &output_region;
76710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
76810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    pipeline_param.filter_flags = 0;
76910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    pipeline_param.filters      = &filter_param_buf_id;
77010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    pipeline_param.num_filters  = filter_count;
77110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
77210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* Blending related state */
77310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (g_blending_enabled){
77410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        blending_state_init(&state);
77510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        pipeline_param.blend_state = &state;
77610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
77710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
77810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaCreateBuffer(va_dpy,
77910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               context_id,
78010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               VAProcPipelineParameterBufferType,
78110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               sizeof(pipeline_param),
78210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               1,
78310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               &pipeline_param,
78410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               &pipeline_param_buf_id);
78510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaCreateBuffer");
78610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
78710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaBeginPicture(va_dpy,
78810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               context_id,
78910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               out_surface_id);
79010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaBeginPicture");
79110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
79210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaRenderPicture(va_dpy,
79310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                context_id,
79410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                &pipeline_param_buf_id,
79510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                1);
79610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaRenderPicture");
79710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
79810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaEndPicture(va_dpy, context_id);
79910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaEndPicture");
80010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
80110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (filter_param_buf_id != VA_INVALID_ID)
80210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        vaDestroyBuffer(va_dpy,filter_param_buf_id);
80310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
80410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (pipeline_param_buf_id != VA_INVALID_ID)
80510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        vaDestroyBuffer(va_dpy,pipeline_param_buf_id);
80610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
80710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    return va_status;
80810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
80910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
81010d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic VAStatus
81110d94aff40fa7cb9349f839613856ea37327268cAustin Yuanvpp_context_create()
81210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
81310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAStatus va_status = VA_STATUS_SUCCESS;
81410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    uint32_t i;
81510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
81610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* VA driver initialization */
81710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_dpy = va_open_display();
81810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    int32_t major_ver, minor_ver;
81910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaInitialize(va_dpy, &major_ver, &minor_ver);
82010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    assert(va_status == VA_STATUS_SUCCESS);
82110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
82210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* Check whether VPP is supported by driver */
82310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAEntrypoint entrypoints[5];
82410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    int32_t num_entrypoints;
82510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    num_entrypoints = vaMaxNumEntrypoints(va_dpy);
82610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaQueryConfigEntrypoints(va_dpy,
82710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                         VAProfileNone,
82810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                         entrypoints,
82910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                         &num_entrypoints);
83010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaQueryConfigEntrypoints");
83110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
83210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    for	(i = 0; i < num_entrypoints; i++) {
83310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (entrypoints[i] == VAEntrypointVideoProc)
83410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            break;
83510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
83610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
83710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (i == num_entrypoints) {
83810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("VPP is not supported by driver\n");
83910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        assert(0);
84010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
84110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
84210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* Render target surface format check */
84310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAConfigAttrib attrib;
84410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    attrib.type = VAConfigAttribRTFormat;
84510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaGetConfigAttributes(va_dpy,
84610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                      VAProfileNone,
84710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                      VAEntrypointVideoProc,
84810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                      &attrib,
84910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                     1);
85010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaGetConfigAttributes");
85110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if ((attrib.value != g_out_format)) {
85210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("RT format %d is not supported by VPP !\n",g_out_format);
85310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        assert(0);
85410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
85510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
85610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* Create surface/config/context for VPP pipeline */
85710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = create_surface(&g_in_surface_id, g_in_pic_width, g_in_pic_height,
85810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                g_in_fourcc, g_in_format);
85910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaCreateSurfaces for input");
86010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
86110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = create_surface(&g_out_surface_id, g_out_pic_width, g_out_pic_height,
86210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                g_out_fourcc, g_out_format);
86310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaCreateSurfaces for output");
86410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
86510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaCreateConfig(va_dpy,
86610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               VAProfileNone,
86710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               VAEntrypointVideoProc,
86810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               &attrib,
86910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               1,
87010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                               &config_id);
87110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaCreateConfig");
87210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
87310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* Source surface format check */
87410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    uint32_t num_surf_attribs = VASurfaceAttribCount;
87510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VASurfaceAttrib * surf_attribs = (VASurfaceAttrib*)
87610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan              malloc(sizeof(VASurfaceAttrib) * num_surf_attribs);
87710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (!surf_attribs)
87810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan       assert(0);
87910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
88010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaQuerySurfaceAttributes(va_dpy,
88110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                        config_id,
88210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                        surf_attribs,
88310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                        &num_surf_attribs);
88410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
88510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (va_status == VA_STATUS_ERROR_MAX_NUM_EXCEEDED) {
88610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        surf_attribs = (VASurfaceAttrib*)realloc(surf_attribs,
88710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                        sizeof(VASurfaceAttrib) * num_surf_attribs);
88810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         if (!surf_attribs)
88910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan             assert(0);
89010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         va_status = vaQuerySurfaceAttributes(va_dpy,
89110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                              config_id,
89210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                              surf_attribs,
89310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                              &num_surf_attribs);
89410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
89510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaQuerySurfaceAttributes");
89610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
89710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    for (i = 0; i < num_surf_attribs; i++) {
89810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (surf_attribs[i].type == VASurfaceAttribPixelFormat &&
89910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            surf_attribs[i].value.value.i == g_in_fourcc)
90010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            break;
90110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
90210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    free(surf_attribs);
90310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
90410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (i == num_surf_attribs) {
90510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Input fourCC %d  is not supported by VPP !\n", g_in_fourcc);
90610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        assert(0);
90710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
90810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
90910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vaCreateContext(va_dpy,
91010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                config_id,
91110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                g_out_pic_width,
91210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                g_out_pic_height,
91310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                VA_PROGRESSIVE,
91410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                &g_out_surface_id,
91510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                1,
91610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                &context_id);
91710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    CHECK_VASTATUS(va_status, "vaCreateContext");
91810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
91910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
92010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* Validate  whether currect filter is supported */
92110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (g_filter_type != VAProcFilterNone) {
92210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        uint32_t supported_filter_num = VAProcFilterCount;
92310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        VAProcFilterType supported_filter_types[VAProcFilterCount];
92410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
92510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        va_status = vaQueryVideoProcFilters(va_dpy,
92610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                            context_id,
92710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                            supported_filter_types,
92810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                                            &supported_filter_num);
92910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
93010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        CHECK_VASTATUS(va_status, "vaQueryVideoProcFilters");
93110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
93210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        for (i = 0; i < supported_filter_num; i++){
93310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            if (supported_filter_types[i] == g_filter_type)
93410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                break;
93510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        }
93610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
93710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (i == supported_filter_num) {
93810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            printf("VPP filter type %s is not supported by driver !\n", g_filter_type_name);
93910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            assert(0);
94010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        }
94110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
94210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
94310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    return va_status;
94410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
94510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
94610d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic void
94710d94aff40fa7cb9349f839613856ea37327268cAustin Yuanvpp_context_destroy()
94810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
94910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* Release resource */
95010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    vaDestroySurfaces(va_dpy, &g_in_surface_id, 1);
95110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    vaDestroySurfaces(va_dpy, &g_out_surface_id, 1);
95210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    vaDestroyContext(va_dpy, context_id);
95310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    vaDestroyConfig(va_dpy, config_id);
95410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
95510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    vaTerminate(va_dpy);
95610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_close_display(va_dpy);
95710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
95810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
95910d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic int8_t
96010d94aff40fa7cb9349f839613856ea37327268cAustin Yuanparse_fourcc_and_format(char *str, uint32_t *fourcc, uint32_t *format)
96110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
96210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (!strcmp(str, "YV12")){
96310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        *fourcc = VA_FOURCC('Y', 'V', '1', '2');
96410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        *format = VA_RT_FORMAT_YUV420;
96510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    } else if(!strcmp(str, "I420")){
96610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        *fourcc = VA_FOURCC('I', '4', '2', '0');
96710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        *format = VA_RT_FORMAT_YUV420;
96810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    } else if(!strcmp(str, "NV12")){
96910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        *fourcc = VA_FOURCC('N', 'V', '1', '2');
97010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        *format = VA_RT_FORMAT_YUV420;
97110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    } else{
97210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Not supported format: %s! Currently only support following format: %s\n",
97310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan         str, "YV12, I420, NV12");
97410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        assert(0);
97510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
97610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    return 0;
97710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
97810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
97910d94aff40fa7cb9349f839613856ea37327268cAustin Yuanstatic int8_t
98010d94aff40fa7cb9349f839613856ea37327268cAustin Yuanparse_basic_parameters()
98110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
98210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    char str[MAX_LEN];
98310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
98410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* Read src frame file information */
98510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    read_value_string(g_config_file_fd, "SRC_FILE_NAME", g_src_file_name);
98610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    read_value_uint32(g_config_file_fd, "SRC_FRAME_WIDTH", &g_in_pic_width);
98710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    read_value_uint32(g_config_file_fd, "SRC_FRAME_HEIGHT", &g_in_pic_height);
98810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    read_value_string(g_config_file_fd, "SRC_FRAME_FORMAT", str);
98910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    parse_fourcc_and_format(str, &g_in_fourcc, &g_in_format);
99010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
99110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* Read dst frame file information */
99210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    read_value_string(g_config_file_fd, "DST_FILE_NAME", g_dst_file_name);
99310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    read_value_uint32(g_config_file_fd, "DST_FRAME_WIDTH", &g_out_pic_width);
99410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    read_value_uint32(g_config_file_fd, "DST_FRAME_HEIGHT",&g_out_pic_height);
99510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    read_value_string(g_config_file_fd, "DST_FRAME_FORMAT", str);
99610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    parse_fourcc_and_format(str, &g_out_fourcc, &g_out_format);
99710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
99810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    read_value_uint32(g_config_file_fd, "FRAME_SUM", &g_frame_count);
99910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
100010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* Read filter type */
100110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (read_value_string(g_config_file_fd, "FILTER_TYPE", g_filter_type_name)){
100210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Read filter type error !\n");
100310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        assert(0);
100410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
100510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
100610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (!strcmp(g_filter_type_name, "VAProcFilterNoiseReduction"))
100710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        g_filter_type = VAProcFilterNoiseReduction;
100810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    else if (!strcmp(g_filter_type_name, "VAProcFilterDeinterlacing"))
100910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        g_filter_type = VAProcFilterDeinterlacing;
101010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    else if (!strcmp(g_filter_type_name, "VAProcFilterSharpening"))
101110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        g_filter_type = VAProcFilterSharpening;
101210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    else if (!strcmp(g_filter_type_name, "VAProcFilterColorBalance"))
101310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        g_filter_type = VAProcFilterColorBalance;
101410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    else if (!strcmp(g_filter_type_name, "VAProcFilterNone"))
101510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        g_filter_type = VAProcFilterNone;
101610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    else {
101710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Unsupported filter type :%s \n", g_filter_type_name);
101810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        return -1;
101910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
102010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
102110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* Check whether blending is enabled */
102210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (read_value_uint8(g_config_file_fd, "BLENDING_ENABLED", &g_blending_enabled))
102310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        g_blending_enabled = 0;
102410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
102510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (g_blending_enabled)
102610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Blending will be done \n");
102710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
102810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (g_in_pic_width != g_out_pic_width ||
102910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        g_in_pic_height != g_out_pic_height)
103010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Scaling will be done : from %4d x %4d to %4d x %4d \n",
103110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                g_in_pic_width, g_in_pic_height,
103210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                g_out_pic_width, g_out_pic_height);
103310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
103410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (g_in_fourcc != g_out_fourcc)
103510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Format conversion will be done: from %d to %d \n",
103610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan               g_in_fourcc, g_out_fourcc);
103710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
103810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    return 0;
103910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
104010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
104110d94aff40fa7cb9349f839613856ea37327268cAustin Yuanint32_t main(int32_t argc, char *argv[])
104210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan{
104310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    VAStatus va_status;
104410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    uint32_t i;
104510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
104610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (argc != 2){
104710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Input error! please specify the configure file \n");
104810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        return -1;
104910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
105010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
105110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* Parse the configure file for video process*/
105210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    strcpy(g_config_file_name, argv[1]);
105310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (NULL == (g_config_file_fd = fopen(g_config_file_name, "r"))){
105410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Open configure file %s failed!\n",g_config_file_name);
105510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        assert(0);
105610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
105710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
105810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* Parse basic parameters */
105910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (parse_basic_parameters()){
106010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Parse parameters in configure file error\n");
106110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        assert(0);
106210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
106310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
106410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    va_status = vpp_context_create();
106510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (va_status != VA_STATUS_SUCCESS) {
106610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("vpp context create failed \n");
106710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        assert(0);
106810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
106910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
107010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    /* Video frame fetch, process and store */
107110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (NULL == (g_src_file_fd = fopen(g_src_file_name, "r"))){
107210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Open SRC_FILE_NAME: %s failed, please specify it in config file: %s !\n",
107310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                g_src_file_name, g_config_file_name);
107410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        assert(0);
107510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
107610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
107710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (NULL == (g_dst_file_fd = fopen(g_dst_file_name, "w"))){
107810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        printf("Open DST_FILE_NAME: %s failed, please specify it in config file: %s !\n",
107910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan               g_dst_file_name, g_config_file_name);
108010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        assert(0);
108110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
108210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
108310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    printf("\nStart to process, processing type is %s ...\n", g_filter_type_name);
108410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    struct timeval start_time, end_time;
108510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    gettimeofday(&start_time, NULL);
108610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
108710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    for (i = 0; i < g_frame_count; i ++){
108810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        if (g_blending_enabled) {
108910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            construct_nv12_mask_surface(g_in_surface_id, g_blending_min_luma, g_blending_max_luma);
109010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            upload_yv12_frame_to_yuv_surface(g_src_file_fd, g_out_surface_id);
109110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        } else {
109210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan            upload_yv12_frame_to_yuv_surface(g_src_file_fd, g_in_surface_id);
109310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        }
109410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
109510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        video_frame_process(g_filter_type, i, g_in_surface_id, g_out_surface_id);
109610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan        store_yuv_surface_to_yv12_frame(g_dst_file_fd, g_out_surface_id);
109710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    }
109810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
109910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    gettimeofday(&end_time, NULL);
110010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    float duration = (end_time.tv_sec - start_time.tv_sec) +
110110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan                     (end_time.tv_usec - start_time.tv_usec)/1000000.0;
110210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    printf("Finish processing, performance: \n" );
110310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    printf("%d frames processed in: %f s, ave time = %.6fs \n",g_frame_count, duration, duration/g_frame_count);
110410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
110510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (g_src_file_fd)
110610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan       fclose(g_src_file_fd);
110710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
110810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (g_dst_file_fd)
110910d94aff40fa7cb9349f839613856ea37327268cAustin Yuan       fclose(g_dst_file_fd);
111010d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
111110d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    if (g_config_file_fd)
111210d94aff40fa7cb9349f839613856ea37327268cAustin Yuan       fclose(g_config_file_fd);
111310d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
111410d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    vpp_context_destroy();
111510d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
111610d94aff40fa7cb9349f839613856ea37327268cAustin Yuan    return 0;
111710d94aff40fa7cb9349f839613856ea37327268cAustin Yuan}
111810d94aff40fa7cb9349f839613856ea37327268cAustin Yuan
1119