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