vsp_VPP.c revision 4b8982ecb6744203ae0b5381942d72a518539661
18e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 28e9a21e730449c10cac6e6f69d255611c93f63c2hding * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 38e9a21e730449c10cac6e6f69d255611c93f63c2hding * 48e9a21e730449c10cac6e6f69d255611c93f63c2hding * Permission is hereby granted, free of charge, to any person obtaining a 58e9a21e730449c10cac6e6f69d255611c93f63c2hding * copy of this software and associated documentation files (the 68e9a21e730449c10cac6e6f69d255611c93f63c2hding * "Software"), to deal in the Software without restriction, including 78e9a21e730449c10cac6e6f69d255611c93f63c2hding * without limitation the rights to use, copy, modify, merge, publish, 88e9a21e730449c10cac6e6f69d255611c93f63c2hding * distribute, sub license, and/or sell copies of the Software, and to 98e9a21e730449c10cac6e6f69d255611c93f63c2hding * permit persons to whom the Software is furnished to do so, subject to 108e9a21e730449c10cac6e6f69d255611c93f63c2hding * the following conditions: 118e9a21e730449c10cac6e6f69d255611c93f63c2hding * 128e9a21e730449c10cac6e6f69d255611c93f63c2hding * The above copyright notice and this permission notice (including the 138e9a21e730449c10cac6e6f69d255611c93f63c2hding * next paragraph) shall be included in all copies or substantial portions 148e9a21e730449c10cac6e6f69d255611c93f63c2hding * of the Software. 158e9a21e730449c10cac6e6f69d255611c93f63c2hding * 168e9a21e730449c10cac6e6f69d255611c93f63c2hding * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 178e9a21e730449c10cac6e6f69d255611c93f63c2hding * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 188e9a21e730449c10cac6e6f69d255611c93f63c2hding * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 198e9a21e730449c10cac6e6f69d255611c93f63c2hding * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 208e9a21e730449c10cac6e6f69d255611c93f63c2hding * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 218e9a21e730449c10cac6e6f69d255611c93f63c2hding * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 228e9a21e730449c10cac6e6f69d255611c93f63c2hding * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 238e9a21e730449c10cac6e6f69d255611c93f63c2hding * 248e9a21e730449c10cac6e6f69d255611c93f63c2hding * Authors: 258e9a21e730449c10cac6e6f69d255611c93f63c2hding * Binglin Chen <binglin.chen@intel.com> 268e9a21e730449c10cac6e6f69d255611c93f63c2hding * 278e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 288e9a21e730449c10cac6e6f69d255611c93f63c2hding 298e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "vsp_VPP.h" 308e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_buffer.h" 318e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_surface.h" 328e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "vsp_cmdbuf.h" 338e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_drv_debug.h" 348e9a21e730449c10cac6e6f69d255611c93f63c2hding 358e9a21e730449c10cac6e6f69d255611c93f63c2hding#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData; 368e9a21e730449c10cac6e6f69d255611c93f63c2hding#define INIT_CONTEXT_VPP context_VPP_p ctx = (context_VPP_p) obj_context->format_data; 378e9a21e730449c10cac6e6f69d255611c93f63c2hding#define CONFIG(id) ((object_config_p) object_heap_lookup( &driver_data->config_heap, id )) 388e9a21e730449c10cac6e6f69d255611c93f63c2hding#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id )) 398e9a21e730449c10cac6e6f69d255611c93f63c2hding#define BUFFER(id) ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id )) 408e9a21e730449c10cac6e6f69d255611c93f63c2hding 418e9a21e730449c10cac6e6f69d255611c93f63c2hding#define SURFACE(id) ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id )) 428e9a21e730449c10cac6e6f69d255611c93f63c2hding 438e9a21e730449c10cac6e6f69d255611c93f63c2hding#define KB 1024 448e9a21e730449c10cac6e6f69d255611c93f63c2hding#define MB (KB * KB) 454b8982ecb6744203ae0b5381942d72a518539661Wang Kun#define VSP_PROC_CONTEXT_SIZE (30*MB) 468e9a21e730449c10cac6e6f69d255611c93f63c2hding 4766304487373cf4ed335ba2614f00102dca837832Wang Kun#define MAX_VPP_PARAM (100) 4866304487373cf4ed335ba2614f00102dca837832Wang Kun#define MIN_VPP_PARAM (0) 4966304487373cf4ed335ba2614f00102dca837832Wang Kun#define STEP_VPP_PARAM (33) 5066304487373cf4ed335ba2614f00102dca837832Wang Kun#define MAX_VPP_AUTO_PARAM (1) 5166304487373cf4ed335ba2614f00102dca837832Wang Kun#define MIN_VPP_AUTO_PARAM (0) 5266304487373cf4ed335ba2614f00102dca837832Wang Kun#define STEP_VPP_AUTO_PARAM (1) 5366304487373cf4ed335ba2614f00102dca837832Wang Kun 548e9a21e730449c10cac6e6f69d255611c93f63c2hding#define VSP_FORWARD_REF_NUM 3 558e9a21e730449c10cac6e6f69d255611c93f63c2hding 56c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding#define VSP_COLOR_ENHANCE_FEATURES 2 57c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 588e9a21e730449c10cac6e6f69d255611c93f63c2hding#define ALIGN_TO_128(value) ((value + 128 - 1) & ~(128 - 1)) 598e9a21e730449c10cac6e6f69d255611c93f63c2hding 6066304487373cf4ed335ba2614f00102dca837832Wang Kun#define QVGA_AREA (320 * 240) 6166304487373cf4ed335ba2614f00102dca837832Wang Kun#define VGA_AREA (640 * 480) 6266304487373cf4ed335ba2614f00102dca837832Wang Kun#define SD_AREA (720 * 576) 6366304487373cf4ed335ba2614f00102dca837832Wang Kun#define HD720P_AREA (1280 * 720) 6466304487373cf4ed335ba2614f00102dca837832Wang Kun#define HD1080P_AREA (1920 * 1080) 6566304487373cf4ed335ba2614f00102dca837832Wang Kun 66d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun/** 67d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * The number of supported filter is 5: 68d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterDeblocking 69d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterNoiseReduction 70d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterSharpening 71d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterColorBalance 72d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterFrameRateConversion 73d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun */ 74d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun#define VSP_SUPPORTED_FILTERS_NUM 5 75d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun 76d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun/* The size of supported color standard */ 77d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun#define COLOR_STANDARDS_NUM 1 78d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun 79c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingenum resolution_set { 8066304487373cf4ed335ba2614f00102dca837832Wang Kun NOT_SUPPORTED_RESOLUTION = -1, 8166304487373cf4ed335ba2614f00102dca837832Wang Kun QCIF_TO_QVGA = 0, 8266304487373cf4ed335ba2614f00102dca837832Wang Kun QVGA_TO_VGA, 8366304487373cf4ed335ba2614f00102dca837832Wang Kun VGA_TO_SD, 8466304487373cf4ed335ba2614f00102dca837832Wang Kun SD_TO_720P, 8566304487373cf4ed335ba2614f00102dca837832Wang Kun HD720P_TO_1080P, 86c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding RESOLUTION_SET_NUM 87c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding}; 88c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 89c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingstruct vpp_chain_capability { 90c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int frc_enabled; 91c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int sharpen_enabled; 92c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int color_balance_enabled; 93c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int denoise_enabled; 94c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int deblock_enabled; 95c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding}; 96c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 97c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingenum filter_status { 98c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding FILTER_DISABLED = 0, 99c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding FILTER_ENABLED 100c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding}; 101c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 102c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingstruct vpp_chain_capability vpp_chain_caps[RESOLUTION_SET_NUM] = { 10366304487373cf4ed335ba2614f00102dca837832Wang Kun [HD720P_TO_1080P] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_DISABLED, FILTER_DISABLED}, 10466304487373cf4ed335ba2614f00102dca837832Wang Kun [SD_TO_720P] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_DISABLED, FILTER_DISABLED}, 10566304487373cf4ed335ba2614f00102dca837832Wang Kun [VGA_TO_SD] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_DISABLED, FILTER_DISABLED}, 10666304487373cf4ed335ba2614f00102dca837832Wang Kun [QVGA_TO_VGA] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED}, 10766304487373cf4ed335ba2614f00102dca837832Wang Kun [QCIF_TO_QVGA] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_ENABLED} 10866304487373cf4ed335ba2614f00102dca837832Wang Kun}; 10966304487373cf4ed335ba2614f00102dca837832Wang Kun 11066304487373cf4ed335ba2614f00102dca837832Wang Kunstruct filter_strength { 11166304487373cf4ed335ba2614f00102dca837832Wang Kun struct VssProcDenoiseParameterBuffer denoise_deblock[RESOLUTION_SET_NUM]; 11266304487373cf4ed335ba2614f00102dca837832Wang Kun struct VssProcColorEnhancementParameterBuffer enhancer[RESOLUTION_SET_NUM]; 11366304487373cf4ed335ba2614f00102dca837832Wang Kun struct VssProcSharpenParameterBuffer sharpen[RESOLUTION_SET_NUM]; 11466304487373cf4ed335ba2614f00102dca837832Wang Kun}; 11566304487373cf4ed335ba2614f00102dca837832Wang Kun 11666304487373cf4ed335ba2614f00102dca837832Wang Kunenum filter_strength_type { 11766304487373cf4ed335ba2614f00102dca837832Wang Kun INVALID_STRENGTH = -1, 11866304487373cf4ed335ba2614f00102dca837832Wang Kun LOW_STRENGTH = 0, 11966304487373cf4ed335ba2614f00102dca837832Wang Kun MEDIUM_STRENGTH, 12066304487373cf4ed335ba2614f00102dca837832Wang Kun HIGH_STRENGTH, 12166304487373cf4ed335ba2614f00102dca837832Wang Kun STRENGTH_NUM 12266304487373cf4ed335ba2614f00102dca837832Wang Kun}; 12366304487373cf4ed335ba2614f00102dca837832Wang Kun 12466304487373cf4ed335ba2614f00102dca837832Wang Kun#define SHARPEN_ON (1) 12566304487373cf4ed335ba2614f00102dca837832Wang Kun 12666304487373cf4ed335ba2614f00102dca837832Wang Kunstruct filter_strength vpp_strength[STRENGTH_NUM] = { 12766304487373cf4ed335ba2614f00102dca837832Wang Kun [LOW_STRENGTH] = { 1284b8982ecb6744203ae0b5381942d72a518539661Wang Kun /* structure: 1294b8982ecb6744203ae0b5381942d72a518539661Wang Kun * type(0-Denoise,1-Deblock), value_thr, cnt_thr, coef, temp_thr1, temp_thr2, _pad[2] 1304b8982ecb6744203ae0b5381942d72a518539661Wang Kun */ 13166304487373cf4ed335ba2614f00102dca837832Wang Kun .denoise_deblock = { 1324b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {1, 15, 47, 35, 0, 0, 0, 0}, 1334b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = {1, 7, 48, 47, 0, 0, 0, 0}, 1344b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = {1, 10, 8, 9, 1, 3, 0, 0}, 1354b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {0, 10, 48, 47, 0, 0, 0, 0}, 1364b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {0, 10, 48, 47, 0, 0, 0, 0} 13766304487373cf4ed335ba2614f00102dca837832Wang Kun }, 1384b8982ecb6744203ae0b5381942d72a518539661Wang Kun /* structure: 1394b8982ecb6744203ae0b5381942d72a518539661Wang Kun * temp_detect, temp_correct, clip_thr, mid_thr, luma_amm, chroma_amm, _pad[2] 1404b8982ecb6744203ae0b5381942d72a518539661Wang Kun */ 14166304487373cf4ed335ba2614f00102dca837832Wang Kun .enhancer = { 1424b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {200, 100, 1, 42, 40, 60, 0, 0}, 1434b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = {220, 180, 1, 42, 40, 60, 0, 0}, 1444b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = {220, 200, 1, 42, 40, 60, 0, 0}, 1454b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {100, 100, 5, 33, 0, 0, 0, 0}, 1464b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {100, 100, 5, 33, 0, 0, 0, 0} 14766304487373cf4ed335ba2614f00102dca837832Wang Kun }, 14866304487373cf4ed335ba2614f00102dca837832Wang Kun .sharpen = { 1494b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = { .quality = SHARPEN_ON }, 1504b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = { .quality = SHARPEN_ON }, 1514b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = { .quality = SHARPEN_ON }, 1524b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = { .quality = SHARPEN_ON }, 15366304487373cf4ed335ba2614f00102dca837832Wang Kun [HD720P_TO_1080P] = { .quality = SHARPEN_ON } 15466304487373cf4ed335ba2614f00102dca837832Wang Kun } 15566304487373cf4ed335ba2614f00102dca837832Wang Kun }, 15666304487373cf4ed335ba2614f00102dca837832Wang Kun [MEDIUM_STRENGTH] = { 15766304487373cf4ed335ba2614f00102dca837832Wang Kun .denoise_deblock = { 1584b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {1, 25, 47, 12, 0, 0, 0, 0}, 1594b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = {1, 10, 48, 47, 0, 0, 0, 0}, 1604b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = {1, 20, 8, 9, 2, 4, 0, 0}, 1614b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {0, 10, 48, 47, 0, 0, 0, 0}, 1624b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {0, 10, 48, 47, 0, 0, 0, 0} 16366304487373cf4ed335ba2614f00102dca837832Wang Kun }, 16466304487373cf4ed335ba2614f00102dca837832Wang Kun .enhancer = { 1654b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {100, 100, 1, 33, 100, 100, 0, 0}, 1664b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = {100, 180, 1, 33, 100, 100, 0, 0}, 1674b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = {100, 200, 1, 33, 100, 100, 0, 0}, 1684b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {100, 100, 5, 33, 0, 0, 0, 0}, 1694b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {100, 100, 5, 33, 0, 0, 0, 0} 17066304487373cf4ed335ba2614f00102dca837832Wang Kun }, 17166304487373cf4ed335ba2614f00102dca837832Wang Kun .sharpen = { 1724b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = { .quality = SHARPEN_ON }, 1734b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = { .quality = SHARPEN_ON }, 1744b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = { .quality = SHARPEN_ON }, 1754b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = { .quality = SHARPEN_ON }, 17666304487373cf4ed335ba2614f00102dca837832Wang Kun [HD720P_TO_1080P] = { .quality = SHARPEN_ON } 17766304487373cf4ed335ba2614f00102dca837832Wang Kun } 17866304487373cf4ed335ba2614f00102dca837832Wang Kun }, 17966304487373cf4ed335ba2614f00102dca837832Wang Kun [HIGH_STRENGTH] = { 18066304487373cf4ed335ba2614f00102dca837832Wang Kun .denoise_deblock = { 1814b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {1, 30, 40, 10, 0, 0, 0, 0}, 1824b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = {1, 15, 45, 25, 0, 0, 0, 0}, 1834b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = {1, 20, 7, 5, 3, 6, 0, 0}, 1844b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {0, 10, 48, 47, 0, 0, 0, 0}, 1854b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {0, 10, 48, 47, 0, 0, 0, 0} 18666304487373cf4ed335ba2614f00102dca837832Wang Kun }, 18766304487373cf4ed335ba2614f00102dca837832Wang Kun .enhancer = { 1884b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {100, 100, 5, 33, 150, 200, 0, 0}, 1894b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = {100, 180, 5, 33, 150, 200, 0, 0}, 1904b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = {100, 200, 5, 33, 100, 150, 0, 0}, 1914b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {100, 100, 5, 33, 0, 0, 0, 0}, 1924b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {100, 100, 5, 33, 0, 0, 0, 0} 19366304487373cf4ed335ba2614f00102dca837832Wang Kun }, 19466304487373cf4ed335ba2614f00102dca837832Wang Kun .sharpen = { 1954b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = { .quality = SHARPEN_ON }, 1964b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = { .quality = SHARPEN_ON }, 1974b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = { .quality = SHARPEN_ON }, 1984b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = { .quality = SHARPEN_ON }, 19966304487373cf4ed335ba2614f00102dca837832Wang Kun [HD720P_TO_1080P] = { .quality = SHARPEN_ON } 20066304487373cf4ed335ba2614f00102dca837832Wang Kun } 20166304487373cf4ed335ba2614f00102dca837832Wang Kun } 202c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding}; 203c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 2048e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic void vsp_VPP_DestroyContext(object_context_p obj_context); 2058e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_pipeline(context_VPP_p ctx); 2068e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_filter_param(context_VPP_p ctx); 2078e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp__VPP_check_legal_picture(object_context_p obj_context, object_config_p obj_config); 20866304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_resolution(int width, int height); 20966304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_vpp_strength(int value); 2108e9a21e730449c10cac6e6f69d255611c93f63c2hding 2118e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic void vsp_VPP_QueryConfigAttributes( 2128e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProfile profile, 2138e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint entrypoint, 2148e9a21e730449c10cac6e6f69d255611c93f63c2hding VAConfigAttrib *attrib_list, 2158e9a21e730449c10cac6e6f69d255611c93f63c2hding int num_attribs) 2168e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2178e9a21e730449c10cac6e6f69d255611c93f63c2hding /* No VPP specific attributes */ 2188e9a21e730449c10cac6e6f69d255611c93f63c2hding return; 2198e9a21e730449c10cac6e6f69d255611c93f63c2hding} 2208e9a21e730449c10cac6e6f69d255611c93f63c2hding 2218e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_ValidateConfig( 2228e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config) 2238e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2248e9a21e730449c10cac6e6f69d255611c93f63c2hding int i; 2258e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Check all attributes */ 2268e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < obj_config->attrib_count; i++) { 2278e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (obj_config->attrib_list[i].type) { 2288e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAConfigAttribRTFormat: 2298e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Ignore */ 2308e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 2318e9a21e730449c10cac6e6f69d255611c93f63c2hding 2328e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 2338e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED; 2348e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2358e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2368e9a21e730449c10cac6e6f69d255611c93f63c2hding 2378e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_SUCCESS; 2388e9a21e730449c10cac6e6f69d255611c93f63c2hding} 2398e9a21e730449c10cac6e6f69d255611c93f63c2hding 2408e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp__VPP_check_legal_picture(object_context_p obj_context, object_config_p obj_config) 2418e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2428e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 2438e9a21e730449c10cac6e6f69d255611c93f63c2hding 2448e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 2458e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 2468e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 2478e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2488e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2498e9a21e730449c10cac6e6f69d255611c93f63c2hding 2508e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 2518e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 2528e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 2538e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2548e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2558e9a21e730449c10cac6e6f69d255611c93f63c2hding 2568e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2578e9a21e730449c10cac6e6f69d255611c93f63c2hding} 2588e9a21e730449c10cac6e6f69d255611c93f63c2hding 2598e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_CreateContext( 2608e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context, 2618e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config) 2628e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2638e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 2648e9a21e730449c10cac6e6f69d255611c93f63c2hding context_VPP_p ctx; 2658e9a21e730449c10cac6e6f69d255611c93f63c2hding int i; 2668e9a21e730449c10cac6e6f69d255611c93f63c2hding 2678e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Validate flag */ 2688e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Validate picture dimensions */ 2698e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = vsp__VPP_check_legal_picture(obj_context, obj_config); 2708e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VA_STATUS_SUCCESS != vaStatus) { 2718e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 2728e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2738e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2748e9a21e730449c10cac6e6f69d255611c93f63c2hding 2758e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx = (context_VPP_p) calloc(1, sizeof(struct context_VPP_s)); 2768e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == ctx) { 2778e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 2788e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 2798e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2808e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2818e9a21e730449c10cac6e6f69d255611c93f63c2hding 2828e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filters = NULL; 2838e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->num_filters = 0; 2848e9a21e730449c10cac6e6f69d255611c93f63c2hding 2858e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_buf = NULL; 2868e9a21e730449c10cac6e6f69d255611c93f63c2hding 2878e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set size */ 2888e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz = 0; 2898e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pic_param_sz = ALIGN_TO_128(sizeof(struct VssProcPictureParameterBuffer)); 2908e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->pic_param_sz; 2918e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->end_param_sz = ALIGN_TO_128(sizeof(struct VssProcPictureParameterBuffer)); 2928e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->end_param_sz; 2938e9a21e730449c10cac6e6f69d255611c93f63c2hding 2948e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pipeline_param_sz = ALIGN_TO_128(sizeof(struct VssProcPipelineParameterBuffer)); 2958e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->pipeline_param_sz; 2968e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->denoise_param_sz = ALIGN_TO_128(sizeof(struct VssProcDenoiseParameterBuffer)); 2978e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->denoise_param_sz; 2988e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->enhancer_param_sz = ALIGN_TO_128(sizeof(struct VssProcColorEnhancementParameterBuffer)); 2998e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->enhancer_param_sz; 3008e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->sharpen_param_sz = ALIGN_TO_128(sizeof(struct VssProcSharpenParameterBuffer)); 3018e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->sharpen_param_sz; 3028e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_param_sz = ALIGN_TO_128(sizeof(struct VssProcFrcParameterBuffer)); 3038e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->frc_param_sz; 3048e9a21e730449c10cac6e6f69d255611c93f63c2hding 3058e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set offset */ 3068e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pic_param_offset = 0; 3078e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->end_param_offset = ctx->pic_param_offset + ctx->pic_param_sz; 3088e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pipeline_param_offset = ctx->end_param_offset + ctx->end_param_sz; 3098e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->denoise_param_offset = ctx->pipeline_param_offset + ctx->pipeline_param_sz; 3108e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->enhancer_param_offset = ctx->denoise_param_offset + ctx->denoise_param_sz; 3118e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->sharpen_param_offset = ctx->enhancer_param_offset + ctx->enhancer_param_sz; 3128e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_param_offset = ctx->sharpen_param_offset + ctx->sharpen_param_sz; 3138e9a21e730449c10cac6e6f69d255611c93f63c2hding 3148e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->context_buf = (psb_buffer_p) calloc(1, sizeof(struct psb_buffer_s)); 3158e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == ctx->context_buf) { 3168e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 3178e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 3188e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 3198e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3208e9a21e730449c10cac6e6f69d255611c93f63c2hding 3218e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = psb_buffer_create(obj_context->driver_data, VSP_PROC_CONTEXT_SIZE, psb_bt_vpu_only, ctx->context_buf); 3228e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VA_STATUS_SUCCESS != vaStatus) { 3238e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 3248e9a21e730449c10cac6e6f69d255611c93f63c2hding } 325c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 3268e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context->format_data = (void*) ctx; 3278e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->obj_context = obj_context; 3288e9a21e730449c10cac6e6f69d255611c93f63c2hding 3298e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < obj_config->attrib_count; ++i) { 3308e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VAConfigAttribRTFormat == obj_config->attrib_list[i].type) { 3318e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (obj_config->attrib_list[i].value) { 3328e9a21e730449c10cac6e6f69d255611c93f63c2hding case VA_RT_FORMAT_YUV420: 3338e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->format = VSP_NV12; 3348e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 3358e9a21e730449c10cac6e6f69d255611c93f63c2hding case VA_RT_FORMAT_YUV422: 3368e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->format = VSP_NV16; 3378e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 3388e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->format = VSP_NV12; 3398e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 3408e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3418e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 3428e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3438e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3448e9a21e730449c10cac6e6f69d255611c93f63c2hding 34566304487373cf4ed335ba2614f00102dca837832Wang Kun bzero(&ctx->denoise_deblock_param, sizeof(ctx->denoise_deblock_param)); 34666304487373cf4ed335ba2614f00102dca837832Wang Kun bzero(&ctx->enhancer_param, sizeof(ctx->enhancer_param)); 34766304487373cf4ed335ba2614f00102dca837832Wang Kun bzero(&ctx->sharpen_param, sizeof(ctx->sharpen_param)); 34866304487373cf4ed335ba2614f00102dca837832Wang Kun 3498e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 3508e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 3518e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_VPP_DestroyContext(obj_context); 3528e9a21e730449c10cac6e6f69d255611c93f63c2hding 353c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (ctx) 354c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding free(ctx); 355c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 3568e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 3578e9a21e730449c10cac6e6f69d255611c93f63c2hding} 3588e9a21e730449c10cac6e6f69d255611c93f63c2hding 3598e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic void vsp_VPP_DestroyContext( 3608e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context) 3618e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 3628e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 3638e9a21e730449c10cac6e6f69d255611c93f63c2hding 3648e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->context_buf) { 3658e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_destroy(ctx->context_buf); 3668e9a21e730449c10cac6e6f69d255611c93f63c2hding 3678e9a21e730449c10cac6e6f69d255611c93f63c2hding free(ctx->context_buf); 3688e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->context_buf = NULL; 3698e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3708e9a21e730449c10cac6e6f69d255611c93f63c2hding 3718e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->filters) { 3728e9a21e730449c10cac6e6f69d255611c93f63c2hding free(ctx->filters); 3738e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->num_filters = 0; 3748e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3758e9a21e730449c10cac6e6f69d255611c93f63c2hding 3768e9a21e730449c10cac6e6f69d255611c93f63c2hding free(obj_context->format_data); 3778e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context->format_data = NULL; 3788e9a21e730449c10cac6e6f69d255611c93f63c2hding} 3798e9a21e730449c10cac6e6f69d255611c93f63c2hding 3808e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp__VPP_process_pipeline_param(context_VPP_p ctx, object_buffer_p obj_buffer) 3818e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 3828e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 3838e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; 3848e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int i = 0; 3858e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcPipelineParameterBuffer *pipeline_param = (VAProcPipelineParameterBuffer *) obj_buffer->buffer_data; 3868e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcPictureParameterBuffer *cell_proc_picture_param = (struct VssProcPictureParameterBuffer *)cmdbuf->pic_param_p; 3878e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcPictureParameterBuffer *cell_end_param = (struct VssProcPictureParameterBuffer *)cmdbuf->end_param_p; 3888e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferFrameRateConversion *frc_param; 3898e9a21e730449c10cac6e6f69d255611c93f63c2hding object_surface_p input_surface = NULL; 3908e9a21e730449c10cac6e6f69d255611c93f63c2hding object_surface_p cur_output_surf = NULL; 3914b8982ecb6744203ae0b5381942d72a518539661Wang Kun unsigned int rotation_angle; 3928e9a21e730449c10cac6e6f69d255611c93f63c2hding 3938e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: ignore output input color standard */ 3948e9a21e730449c10cac6e6f69d255611c93f63c2hding 3958e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->surface_region != NULL) { 3968e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't scale\n"); 3978e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 3988e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 3998e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4008e9a21e730449c10cac6e6f69d255611c93f63c2hding 4018e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->output_region != NULL) { 4028e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't scale\n"); 4038e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4048e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4058e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4068e9a21e730449c10cac6e6f69d255611c93f63c2hding 407c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (pipeline_param->output_background_color != 0) { 408c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't support background color here\n"); 409c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 410c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto out; 411c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 4128e9a21e730449c10cac6e6f69d255611c93f63c2hding 4138e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->filters == NULL) { 4148e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filter setting filters = %p\n", pipeline_param->filters); 4158e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4168e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4178e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4188e9a21e730449c10cac6e6f69d255611c93f63c2hding 4198e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0 4208e9a21e730449c10cac6e6f69d255611c93f63c2hding /* for pass filter */ 4218e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->num_filters == 0 || pipeline_param->num_filters > VssProcPipelineMaxNumFilters) { 4228e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filter number = %d\n", pipeline_param->num_filters); 4238e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4248e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4258e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4268e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif 4278e9a21e730449c10cac6e6f69d255611c93f63c2hding 4288e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->forward_references == NULL) { 4298e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid forward_refereces %p setting\n", pipeline_param->forward_references); 4308e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4318e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4328e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4338e9a21e730449c10cac6e6f69d255611c93f63c2hding 4348e9a21e730449c10cac6e6f69d255611c93f63c2hding /* should we check it? since the begining it's not VSP_FORWARD_REF_NUM */ 4358e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->num_forward_references != VSP_FORWARD_REF_NUM) { 4368e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_forward_refereces %d setting, should be %d\n", pipeline_param->num_forward_references, VSP_FORWARD_REF_NUM); 4378e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4388e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4398e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4408e9a21e730449c10cac6e6f69d255611c93f63c2hding 4418e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: no backward reference checking */ 4428e9a21e730449c10cac6e6f69d255611c93f63c2hding if (!(pipeline_param->pipeline_flags & VA_PIPELINE_FLAG_END)) { 4438e9a21e730449c10cac6e6f69d255611c93f63c2hding input_surface = SURFACE(pipeline_param->surface); 4448e9a21e730449c10cac6e6f69d255611c93f63c2hding if (input_surface == NULL) { 4458e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input surface %x\n", pipeline_param->surface); 4468e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4478e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4488e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4498e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4508e9a21e730449c10cac6e6f69d255611c93f63c2hding input_surface = NULL; 4518e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4528e9a21e730449c10cac6e6f69d255611c93f63c2hding 4538e9a21e730449c10cac6e6f69d255611c93f63c2hding /* IGNORE backward references setting */ 4548e9a21e730449c10cac6e6f69d255611c93f63c2hding 4558e9a21e730449c10cac6e6f69d255611c93f63c2hding /* if it is the first pipeline command */ 4568e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->num_filters != ctx->num_filters || pipeline_param->num_filters == 0) { 4578e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->num_filters != 0) { 4588e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n"); 4598e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4608e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4618e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4628e9a21e730449c10cac6e6f69d255611c93f63c2hding /* save filters */ 4638e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->num_filters = pipeline_param->num_filters; 4648e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->num_filters == 0) { 4658e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filters = NULL; 4668e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4678e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filters = (VABufferID *) calloc(ctx->num_filters, sizeof(*ctx->filters)); 4688e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->filters == NULL) { 4698e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n"); 4708e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4718e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4728e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4738e9a21e730449c10cac6e6f69d255611c93f63c2hding memcpy(ctx->filters, pipeline_param->filters, ctx->num_filters * sizeof(*ctx->filters)); 4748e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4758e9a21e730449c10cac6e6f69d255611c93f63c2hding 4768e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set pipeline command to FW */ 4778e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = vsp_set_pipeline(ctx); 4788e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus) { 4798e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to set pipeline\n"); 4808e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4818e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4828e9a21e730449c10cac6e6f69d255611c93f63c2hding 4838e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set filter parameter to FW, record frc parameter buffer */ 4848e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = vsp_set_filter_param(ctx); 4858e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus) { 4868e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to set filter parameter\n"); 4878e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4888e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4898e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4908e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4918e9a21e730449c10cac6e6f69d255611c93f63c2hding /* else ignore pipeline/filter setting */ 4928e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0 4938e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: we can save these check for PnP */ 4948e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < pipeline_param->num_filters; i++) { 4958e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->filters[i] != ctx->filters[i]) { 4968e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n"); 4978e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4988e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4998e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5008e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5018e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif 5028e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5038e9a21e730449c10cac6e6f69d255611c93f63c2hding 5048e9a21e730449c10cac6e6f69d255611c93f63c2hding /* fill picture command to FW */ 5058e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->frc_buf != NULL) 5068e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_param = (VAProcFilterParameterBufferFrameRateConversion *)ctx->frc_buf->buffer_data; 5078e9a21e730449c10cac6e6f69d255611c93f63c2hding else 5088e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_param = NULL; 5098e9a21e730449c10cac6e6f69d255611c93f63c2hding 5108e9a21e730449c10cac6e6f69d255611c93f63c2hding /* end picture command */ 5118e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: how to acknowledge driver to send end command */ 5128e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->pipeline_flags & VA_PIPELINE_FLAG_END) { 5138e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_end_param->num_input_pictures = 0; 5148e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_end_param->num_output_pictures = 0; 5158e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_insert_command(cmdbuf, &cmdbuf->param_mem, VssProcPictureCommand, 5168e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->end_param_offset, sizeof(struct VssProcPictureParameterBuffer)); 5178e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 5188e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5198e9a21e730449c10cac6e6f69d255611c93f63c2hding 5208e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->num_input_pictures = 1; 5218e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->input_picture[0].surface_id = pipeline_param->surface; 5228e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_reloc_pic_param(&(cell_proc_picture_param->input_picture[0].base), ctx->pic_param_offset, &(input_surface->psb_surface->buf), 5238e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->param_mem_loc, cell_proc_picture_param); 5248e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->input_picture[0].height = input_surface->height_origin; 5258e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->input_picture[0].width = input_surface->width; 5268e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->input_picture[0].irq = 0; 527c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding cell_proc_picture_param->input_picture[0].stride = input_surface->psb_surface->stride; 528c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding cell_proc_picture_param->input_picture[0].format = ctx->format; 5298e9a21e730449c10cac6e6f69d255611c93f63c2hding 5308e9a21e730449c10cac6e6f69d255611c93f63c2hding if (frc_param == NULL) 5318e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->num_output_pictures = 1; 5328e9a21e730449c10cac6e6f69d255611c93f63c2hding else 5338e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->num_output_pictures = frc_param->num_output_frames + 1; 5348e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < cell_proc_picture_param->num_output_pictures; ++i) { 5358e9a21e730449c10cac6e6f69d255611c93f63c2hding if (i == 0) { 5368e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_output_surf = ctx->obj_context->current_render_target; 5378e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 538c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (frc_param == NULL) { 539c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid output surface numbers %x\n", 540c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding cell_proc_picture_param->num_output_pictures); 541c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 542c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto out; 543c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 544c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 5458e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_output_surf = SURFACE(frc_param->output_frames[i-1]); 5468e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cur_output_surf == NULL) { 5478e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input surface %x\n", frc_param->output_frames[i-1]); 5488e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 5498e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 5508e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5518e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5528e9a21e730449c10cac6e6f69d255611c93f63c2hding 5538e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->output_picture[i].surface_id = wsbmKBufHandle(wsbmKBuf(cur_output_surf->psb_surface->buf.drm_buf)); 5548e9a21e730449c10cac6e6f69d255611c93f63c2hding 5558e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_reloc_pic_param(&(cell_proc_picture_param->output_picture[i].base), 5568e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pic_param_offset, &(cur_output_surf->psb_surface->buf), 5578e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->param_mem_loc, cell_proc_picture_param); 5588e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->output_picture[i].height = cur_output_surf->height_origin; 5598e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->output_picture[i].width = cur_output_surf->width; 560c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding cell_proc_picture_param->output_picture[i].stride = cur_output_surf->psb_surface->stride; 5618e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->output_picture[i].irq = 1; 5628e9a21e730449c10cac6e6f69d255611c93f63c2hding /* keep the same first, modify to dest format when feature's avaliable */ 5638e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->output_picture[i].format = ctx->format; 5644b8982ecb6744203ae0b5381942d72a518539661Wang Kun 5654b8982ecb6744203ae0b5381942d72a518539661Wang Kun /* Set the rotation angle info */ 5664b8982ecb6744203ae0b5381942d72a518539661Wang Kun switch (GET_SURFACE_INFO_rotate(cur_output_surf->psb_surface)) { 5674b8982ecb6744203ae0b5381942d72a518539661Wang Kun case VA_ROTATION_90: 5684b8982ecb6744203ae0b5381942d72a518539661Wang Kun rotation_angle = VSP_ROTATION_90; 5694b8982ecb6744203ae0b5381942d72a518539661Wang Kun break; 5704b8982ecb6744203ae0b5381942d72a518539661Wang Kun case VA_ROTATION_180: 5714b8982ecb6744203ae0b5381942d72a518539661Wang Kun rotation_angle = VSP_ROTATION_180; 5724b8982ecb6744203ae0b5381942d72a518539661Wang Kun break; 5734b8982ecb6744203ae0b5381942d72a518539661Wang Kun case VA_ROTATION_270: 5744b8982ecb6744203ae0b5381942d72a518539661Wang Kun rotation_angle = VSP_ROTATION_270; 5754b8982ecb6744203ae0b5381942d72a518539661Wang Kun break; 5764b8982ecb6744203ae0b5381942d72a518539661Wang Kun default: 5774b8982ecb6744203ae0b5381942d72a518539661Wang Kun rotation_angle = VSP_ROTATION_NONE; 5784b8982ecb6744203ae0b5381942d72a518539661Wang Kun } 5794b8982ecb6744203ae0b5381942d72a518539661Wang Kun /* FIXME: The rotation design is still on going, set it to default value */ 5804b8982ecb6744203ae0b5381942d72a518539661Wang Kun cell_proc_picture_param->output_picture[i].rot_angle = 0; 5818e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5828e9a21e730449c10cac6e6f69d255611c93f63c2hding 5838e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_insert_command(cmdbuf, &cmdbuf->param_mem, VssProcPictureCommand, 5848e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pic_param_offset, sizeof(struct VssProcPictureParameterBuffer)); 5858e9a21e730449c10cac6e6f69d255611c93f63c2hding 5868e9a21e730449c10cac6e6f69d255611c93f63c2hding 5878e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_fence_pic_param(cmdbuf, wsbmKBufHandle(wsbmKBuf(cmdbuf->param_mem.drm_buf))); 5888e9a21e730449c10cac6e6f69d255611c93f63c2hding 5898e9a21e730449c10cac6e6f69d255611c93f63c2hding /* handle reference frames, ignore backward reference */ 5908e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < pipeline_param->num_forward_references; ++i) { 5918e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_output_surf = SURFACE(pipeline_param->forward_references[i]); 5928e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cur_output_surf == NULL) 5938e9a21e730449c10cac6e6f69d255611c93f63c2hding continue; 594d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (vsp_cmdbuf_buffer_ref(cmdbuf, &cur_output_surf->psb_surface->buf) < 0) { 595d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "vsp_cmdbuf_buffer_ref() failed\n"); 596d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_UNKNOWN; 597d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto out; 598d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 5998e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6008e9a21e730449c10cac6e6f69d255611c93f63c2hding 6018e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 6028e9a21e730449c10cac6e6f69d255611c93f63c2hding free(pipeline_param); 6038e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_buffer->buffer_data = NULL; 6048e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_buffer->size = 0; 6058e9a21e730449c10cac6e6f69d255611c93f63c2hding 6068e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 6078e9a21e730449c10cac6e6f69d255611c93f63c2hding} 6088e9a21e730449c10cac6e6f69d255611c93f63c2hding 6098e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_RenderPicture( 6108e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context, 6118e9a21e730449c10cac6e6f69d255611c93f63c2hding object_buffer_p *buffers, 6128e9a21e730449c10cac6e6f69d255611c93f63c2hding int num_buffers) 6138e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 6148e9a21e730449c10cac6e6f69d255611c93f63c2hding int i; 6158e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 6168e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 6178e9a21e730449c10cac6e6f69d255611c93f63c2hding 6188e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < num_buffers; i++) { 6198e9a21e730449c10cac6e6f69d255611c93f63c2hding object_buffer_p obj_buffer = buffers[i]; 6208e9a21e730449c10cac6e6f69d255611c93f63c2hding 6218e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (obj_buffer->type) { 6228e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcPipelineParameterBufferType: 6238e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = vsp__VPP_process_pipeline_param(ctx, obj_buffer); 6248e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 6258e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 6268e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 6278e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 6288e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 6298e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6308e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus != VA_STATUS_SUCCESS) { 6318e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 6328e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6338e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6348e9a21e730449c10cac6e6f69d255611c93f63c2hding 6358e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 6368e9a21e730449c10cac6e6f69d255611c93f63c2hding} 6378e9a21e730449c10cac6e6f69d255611c93f63c2hding 6388e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_BeginPicture( 6398e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context) 6408e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 6418e9a21e730449c10cac6e6f69d255611c93f63c2hding int ret; 6428e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 6438e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 6448e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf; 6458e9a21e730449c10cac6e6f69d255611c93f63c2hding 6468e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Initialise the command buffer */ 6478e9a21e730449c10cac6e6f69d255611c93f63c2hding ret = vsp_context_get_next_cmdbuf(ctx->obj_context); 6488e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ret) { 6498e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "get next cmdbuf fail\n"); 6508e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 6518e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 6528e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6538e9a21e730449c10cac6e6f69d255611c93f63c2hding 6548e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf = obj_context->vsp_cmdbuf; 6558e9a21e730449c10cac6e6f69d255611c93f63c2hding 656c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (ctx->obj_context->frame_count == 0) /* first picture */ 657c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vsp_cmdbuf_insert_command(cmdbuf, ctx->context_buf, VspSetContextCommand, 658c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 0, VSP_PROC_CONTEXT_SIZE); 659c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 6608e9a21e730449c10cac6e6f69d255611c93f63c2hding /* map param mem */ 6618e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = psb_buffer_map(&cmdbuf->param_mem, &cmdbuf->param_mem_p); 6628e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus) { 6638e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 6648e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6658e9a21e730449c10cac6e6f69d255611c93f63c2hding 6668e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pic_param_p = cmdbuf->param_mem_p + ctx->pic_param_offset; 6678e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->end_param_p = cmdbuf->param_mem_p + ctx->end_param_offset; 6688e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pipeline_param_p = cmdbuf->param_mem_p + ctx->pipeline_param_offset; 6698e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->denoise_param_p = cmdbuf->param_mem_p + ctx->denoise_param_offset; 6708e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->enhancer_param_p = cmdbuf->param_mem_p + ctx->enhancer_param_offset; 6718e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->sharpen_param_p = cmdbuf->param_mem_p + ctx->sharpen_param_offset; 6728e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->frc_param_p = cmdbuf->param_mem_p + ctx->frc_param_offset; 6738e9a21e730449c10cac6e6f69d255611c93f63c2hding 6748e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_SUCCESS; 6758e9a21e730449c10cac6e6f69d255611c93f63c2hding} 6768e9a21e730449c10cac6e6f69d255611c93f63c2hding 6778e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_EndPicture( 6788e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context) 6798e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 6808e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 6818e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_driver_data_p driver_data = obj_context->driver_data; 6828e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = obj_context->vsp_cmdbuf; 6838e9a21e730449c10cac6e6f69d255611c93f63c2hding 6848e9a21e730449c10cac6e6f69d255611c93f63c2hding if(cmdbuf->param_mem_p != NULL) { 6858e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_unmap(&cmdbuf->param_mem); 6868e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->param_mem_p = NULL; 6878e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pic_param_p = NULL; 6888e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->end_param_p = NULL; 6898e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pipeline_param_p = NULL; 6908e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->denoise_param_p = NULL; 6918e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->enhancer_param_p = NULL; 6928e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->sharpen_param_p = NULL; 6938e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->frc_param_p = NULL; 6948e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6958e9a21e730449c10cac6e6f69d255611c93f63c2hding 696d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (vsp_context_flush_cmdbuf(ctx->obj_context)) { 6978e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VPP: flush deblock cmdbuf error\n"); 698d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun return VA_STATUS_ERROR_UNKNOWN; 699d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 7008e9a21e730449c10cac6e6f69d255611c93f63c2hding 7018e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_SUCCESS; 7028e9a21e730449c10cac6e6f69d255611c93f63c2hding} 7038e9a21e730449c10cac6e6f69d255611c93f63c2hding 7048e9a21e730449c10cac6e6f69d255611c93f63c2hdingstruct format_vtable_s vsp_VPP_vtable = { 7058e9a21e730449c10cac6e6f69d255611c93f63c2hdingqueryConfigAttributes: 7068e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_QueryConfigAttributes, 7078e9a21e730449c10cac6e6f69d255611c93f63c2hdingvalidateConfig: 7088e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_ValidateConfig, 7098e9a21e730449c10cac6e6f69d255611c93f63c2hdingcreateContext: 7108e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_CreateContext, 7118e9a21e730449c10cac6e6f69d255611c93f63c2hdingdestroyContext: 7128e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_DestroyContext, 7138e9a21e730449c10cac6e6f69d255611c93f63c2hdingbeginPicture: 7148e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_BeginPicture, 7158e9a21e730449c10cac6e6f69d255611c93f63c2hdingrenderPicture: 7168e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_RenderPicture, 7178e9a21e730449c10cac6e6f69d255611c93f63c2hdingendPicture: 7188e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_EndPicture 7198e9a21e730449c10cac6e6f69d255611c93f63c2hding}; 7208e9a21e730449c10cac6e6f69d255611c93f63c2hding 7218e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcFilters( 7228e9a21e730449c10cac6e6f69d255611c93f63c2hding VADriverContextP ctx, 7238e9a21e730449c10cac6e6f69d255611c93f63c2hding VAContextID context, 7248e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterType *filters, 7258e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int *num_filters 7268e9a21e730449c10cac6e6f69d255611c93f63c2hding ) 7278e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 7288e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_DRIVER_DATA; 7298e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 7308e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context; 7318e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config; 7328e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint tmp; 7338e9a21e730449c10cac6e6f69d255611c93f63c2hding int count; 7348e9a21e730449c10cac6e6f69d255611c93f63c2hding 7358e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if ctx is right */ 7368e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context = CONTEXT(context); 7378e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 7388e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 73938cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 7408e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 7418e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7428e9a21e730449c10cac6e6f69d255611c93f63c2hding 7438e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_config = CONFIG(obj_context->config_id); 7448e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 7458e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 74638cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 7478e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 7488e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7498e9a21e730449c10cac6e6f69d255611c93f63c2hding 7508e9a21e730449c10cac6e6f69d255611c93f63c2hding tmp = obj_config->entrypoint; 7518e9a21e730449c10cac6e6f69d255611c93f63c2hding if (tmp != VAEntrypointVideoProc) { 7528e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "current entrypoint is %d, not VAEntrypointVideoProc\n", tmp); 7538e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 7548e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 7558e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7568e9a21e730449c10cac6e6f69d255611c93f63c2hding 757d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check if filters and num_filters is valid */ 7588e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == num_filters || NULL == filters) { 7598e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters %p, filters %p\n", num_filters, filters); 76038cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 7618e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 7628e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7638e9a21e730449c10cac6e6f69d255611c93f63c2hding 764d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check if the filter array size is valid */ 765d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (*num_filters < VSP_SUPPORTED_FILTERS_NUM) { 766d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The filters array size(%d) is NOT valid! Supported filters num is %d\n", 767d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun *num_filters, VSP_SUPPORTED_FILTERS_NUM); 768d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 769d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun *num_filters = VSP_SUPPORTED_FILTERS_NUM; 770d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto err; 771d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 772d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun 7738e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if current HW support Video proc */ 7748e9a21e730449c10cac6e6f69d255611c93f63c2hding if (IS_MRFL(driver_data)) { 7758e9a21e730449c10cac6e6f69d255611c93f63c2hding count = 0; 776c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding filters[count++] = VAProcFilterDeblocking; 7778e9a21e730449c10cac6e6f69d255611c93f63c2hding filters[count++] = VAProcFilterNoiseReduction; 7788e9a21e730449c10cac6e6f69d255611c93f63c2hding filters[count++] = VAProcFilterSharpening; 779c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding filters[count++] = VAProcFilterColorBalance; 7808e9a21e730449c10cac6e6f69d255611c93f63c2hding filters[count++] = VAProcFilterFrameRateConversion; 7818e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filters = count; 7828e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 7838e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filters = 0; 7848e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7858e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr: 7868e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 7878e9a21e730449c10cac6e6f69d255611c93f63c2hding} 7888e9a21e730449c10cac6e6f69d255611c93f63c2hding 7898e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcFilterCaps( 7908e9a21e730449c10cac6e6f69d255611c93f63c2hding VADriverContextP ctx, 7918e9a21e730449c10cac6e6f69d255611c93f63c2hding VAContextID context, 7928e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterType type, 7938e9a21e730449c10cac6e6f69d255611c93f63c2hding void *filter_caps, 7948e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int *num_filter_caps 7958e9a21e730449c10cac6e6f69d255611c93f63c2hding ) 7968e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 7978e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_DRIVER_DATA; 7988e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 7998e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context; 8008e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config; 8018e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint tmp; 802fc84bd8b6852aff0a3f70c4f21533ce36e1937behding VAProcFilterCap *denoise_cap, *deblock_cap; 8038e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterCap *sharpen_cap; 804c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterCapColorBalance *color_balance_cap; 8058e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterCap *frc_cap; 8068e9a21e730449c10cac6e6f69d255611c93f63c2hding 8078e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if context is right */ 8088e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context = CONTEXT(context); 8098e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 8108e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 81138cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 8128e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8138e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8148e9a21e730449c10cac6e6f69d255611c93f63c2hding 8158e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_config = CONFIG(obj_context->config_id); 8168e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 8178e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 81838cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 8198e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8208e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8218e9a21e730449c10cac6e6f69d255611c93f63c2hding 8228e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if filter_caps and num_filter_caps is right */ 8238e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == num_filter_caps || NULL == filter_caps){ 8248e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters %p, filters %p\n", num_filter_caps, filter_caps); 82538cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 8268e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8278e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8288e9a21e730449c10cac6e6f69d255611c93f63c2hding 8298e9a21e730449c10cac6e6f69d255611c93f63c2hding if (*num_filter_caps < 1) { 8308e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters == %d (> 1)\n", *num_filter_caps); 83138cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 8328e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8338e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8348e9a21e730449c10cac6e6f69d255611c93f63c2hding 8358e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if curent HW support and return corresponding caps */ 8368e9a21e730449c10cac6e6f69d255611c93f63c2hding if (IS_MRFL(driver_data)) { 8378e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: we should use a constant table to return caps */ 8388e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (type) { 8398e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNoiseReduction: 8408e9a21e730449c10cac6e6f69d255611c93f63c2hding denoise_cap = filter_caps; 84166304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.min_value = MIN_VPP_PARAM; 84266304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.max_value = MAX_VPP_PARAM; 84366304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.default_value = MIN_VPP_PARAM; 84466304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.step = STEP_VPP_PARAM; 845c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 8468e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 847fc84bd8b6852aff0a3f70c4f21533ce36e1937behding case VAProcFilterDeblocking: 848fc84bd8b6852aff0a3f70c4f21533ce36e1937behding deblock_cap = filter_caps; 84966304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.min_value = MIN_VPP_PARAM; 85066304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.max_value = MAX_VPP_PARAM; 85166304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.default_value = MIN_VPP_PARAM; 85266304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.step = STEP_VPP_PARAM; 853c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 854fc84bd8b6852aff0a3f70c4f21533ce36e1937behding break; 8558e9a21e730449c10cac6e6f69d255611c93f63c2hding 8568e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterSharpening: 8578e9a21e730449c10cac6e6f69d255611c93f63c2hding sharpen_cap = filter_caps; 85866304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.min_value = MIN_VPP_PARAM; 85966304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.max_value = MAX_VPP_PARAM; 86066304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.default_value = MIN_VPP_PARAM; 86166304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.step = STEP_VPP_PARAM; 862c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 8638e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 8648e9a21e730449c10cac6e6f69d255611c93f63c2hding 865c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 866c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (*num_filter_caps < VSP_COLOR_ENHANCE_FEATURES) { 867c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding drv_debug_msg(VIDEO_DEBUG_ERROR, "filter cap num is should big than %d(%d)\n", 868c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VSP_COLOR_ENHANCE_FEATURES, *num_filter_caps); 869d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 870d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun *num_filter_caps = VSP_COLOR_ENHANCE_FEATURES; 871c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 872c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 873c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap = filter_caps; 874c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap->type = VAProcColorBalanceAutoSaturation; 87566304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.min_value = MIN_VPP_AUTO_PARAM; 87666304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.max_value = MAX_VPP_AUTO_PARAM; 87766304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.default_value = MIN_VPP_AUTO_PARAM; 87866304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.step = STEP_VPP_AUTO_PARAM; 879c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 880c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap++; 881c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap->type = VAProcColorBalanceAutoBrightness; 88266304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.min_value = MIN_VPP_AUTO_PARAM; 88366304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.max_value = MAX_VPP_AUTO_PARAM; 88466304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.default_value = MIN_VPP_AUTO_PARAM; 88566304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.step = STEP_VPP_AUTO_PARAM; 886c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 887c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 2; 8888e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 8898e9a21e730449c10cac6e6f69d255611c93f63c2hding 8908e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterFrameRateConversion: 8918e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap = filter_caps; 8928e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.min_value = 2; 8938e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.max_value = 4; 8948e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.default_value = 2; 8958e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: it's a set, step is helpless */ 8968e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.step = 0.5; 897c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 8988e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 8998e9a21e730449c10cac6e6f69d255611c93f63c2hding 9008e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 9018e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide filter type %d\n", type); 90238cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 9038e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filter_caps = 0; 9048e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9058e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9068e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 9078e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filter_caps = 0; 9088e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9098e9a21e730449c10cac6e6f69d255611c93f63c2hding 9108e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr: 9118e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 9128e9a21e730449c10cac6e6f69d255611c93f63c2hding} 9138e9a21e730449c10cac6e6f69d255611c93f63c2hding 9148e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcPipelineCaps( 9158e9a21e730449c10cac6e6f69d255611c93f63c2hding VADriverContextP ctx, 9168e9a21e730449c10cac6e6f69d255611c93f63c2hding VAContextID context, 9178e9a21e730449c10cac6e6f69d255611c93f63c2hding VABufferID *filters, 9188e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int num_filters, 9198e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcPipelineCaps *pipeline_caps 9208e9a21e730449c10cac6e6f69d255611c93f63c2hding ) 9218e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 9228e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_DRIVER_DATA; 9238e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 9248e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context; 9258e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config; 9268e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint tmp; 927c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding unsigned int i, j; 928c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBuffer *deblock, *denoise, *sharpen; 929c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBufferFrameRateConversion *frc; 930c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBufferColorBalance *balance; 931c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBufferBase *base; 932c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding object_buffer_p buf; 933c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding uint32_t enabled_brightness, enabled_saturation; 934c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding float ratio; 935c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int res_set; 93666304487373cf4ed335ba2614f00102dca837832Wang Kun int strength; 93766304487373cf4ed335ba2614f00102dca837832Wang Kun context_VPP_p vpp_ctx; 93836b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun int combination_check; 9398e9a21e730449c10cac6e6f69d255611c93f63c2hding 9408e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if ctx is right */ 9418e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context = CONTEXT(context); 9428e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 9438e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 94438cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 9458e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9468e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9478e9a21e730449c10cac6e6f69d255611c93f63c2hding 94866304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_ctx = (context_VPP_p) obj_context->format_data; 94966304487373cf4ed335ba2614f00102dca837832Wang Kun 9508e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_config = CONFIG(obj_context->config_id); 9518e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 9528e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 95338cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 9548e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9558e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9568e9a21e730449c10cac6e6f69d255611c93f63c2hding 9578e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if filters and num_filters and pipeline-caps are right */ 9588e9a21e730449c10cac6e6f69d255611c93f63c2hding if (num_filters == 0) { 9598e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_filters %d\n", num_filters); 96038cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 9618e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9628e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9638e9a21e730449c10cac6e6f69d255611c93f63c2hding 9648e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == filters || pipeline_caps == NULL) { 9658e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filters %p or pipeline_caps %p\n", filters, pipeline_caps); 96638cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 9678e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9688e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9698e9a21e730449c10cac6e6f69d255611c93f63c2hding 9708e9a21e730449c10cac6e6f69d255611c93f63c2hding /* base on HW capability check the filters and return pipeline caps */ 9718e9a21e730449c10cac6e6f69d255611c93f63c2hding if (IS_MRFL(driver_data)) { 9728e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->pipeline_flags = 0; 9738e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->filter_flags = 0; 9748e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->num_forward_references = VSP_FORWARD_REF_NUM; 9758e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->num_backward_references = 0; 9768e9a21e730449c10cac6e6f69d255611c93f63c2hding 977d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check the input color standard */ 978d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->input_color_standards == NULL){ 979d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input color standard array!\n"); 98038cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 9818e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9828e9a21e730449c10cac6e6f69d255611c93f63c2hding } 983d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->num_input_color_standards < COLOR_STANDARDS_NUM) { 984d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_input_color_standards %d\n", pipeline_caps->num_input_color_standards); 985d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 986d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_input_color_standards = COLOR_STANDARDS_NUM; 987d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto err; 988d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 9898e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->input_color_standards[0] = VAProcColorStandardNone; 990d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_input_color_standards = COLOR_STANDARDS_NUM; 9918e9a21e730449c10cac6e6f69d255611c93f63c2hding 992d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check the output color standard */ 993d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->output_color_standards == NULL){ 994d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid output color standard array!\n"); 99538cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 9968e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9978e9a21e730449c10cac6e6f69d255611c93f63c2hding } 998d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->num_output_color_standards < COLOR_STANDARDS_NUM) { 999d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_output_color_standards %d\n", pipeline_caps->num_output_color_standards); 1000d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 1001d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_output_color_standards = COLOR_STANDARDS_NUM; 1002d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto err; 1003d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 10048e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->output_color_standards[0] = VAProcColorStandardNone; 1005d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_output_color_standards = COLOR_STANDARDS_NUM; 10068e9a21e730449c10cac6e6f69d255611c93f63c2hding 100766304487373cf4ed335ba2614f00102dca837832Wang Kun /* check the resolution */ 100866304487373cf4ed335ba2614f00102dca837832Wang Kun res_set = check_resolution(obj_context->picture_width, 100966304487373cf4ed335ba2614f00102dca837832Wang Kun obj_context->picture_height); 101066304487373cf4ed335ba2614f00102dca837832Wang Kun if (res_set == NOT_SUPPORTED_RESOLUTION) { 1011c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED; 1012c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1013c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1014c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 101536b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (getenv("VSP_PIPELINE_CHECK") != NULL) 101636b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun combination_check = 1; 101766304487373cf4ed335ba2614f00102dca837832Wang Kun else 101836b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun combination_check = 0; 1019c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 10208e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: should check filter value settings here */ 10218e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < num_filters; ++i) { 10228e9a21e730449c10cac6e6f69d255611c93f63c2hding /* find buffer */ 1023c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding buf = BUFFER(*(filters + i)); 1024c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1025c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding base = (VAProcFilterParameterBufferBase *)buf->buffer_data; 10268e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check filter buffer setting */ 1027c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding switch (base->type) { 1028c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterDeblocking: 102966304487373cf4ed335ba2614f00102dca837832Wang Kun deblock = (VAProcFilterParameterBuffer *)base; 103066304487373cf4ed335ba2614f00102dca837832Wang Kun 103136b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 103266304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].deblock_enabled != FILTER_ENABLED) { 1033d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The deblock is DISABLE for %d format\n", res_set); 1034c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1035c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 103666304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 103766304487373cf4ed335ba2614f00102dca837832Wang Kun /* check if the value is right */ 103866304487373cf4ed335ba2614f00102dca837832Wang Kun strength = check_vpp_strength(deblock->value); 103966304487373cf4ed335ba2614f00102dca837832Wang Kun if (strength == INVALID_STRENGTH) { 104066304487373cf4ed335ba2614f00102dca837832Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_VALUE; 104166304487373cf4ed335ba2614f00102dca837832Wang Kun goto err; 104266304487373cf4ed335ba2614f00102dca837832Wang Kun } 104366304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->denoise_deblock_param, 104466304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].denoise_deblock[res_set], 104566304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->denoise_deblock_param)); 1046c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1047c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1048c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1049c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterNoiseReduction: 105066304487373cf4ed335ba2614f00102dca837832Wang Kun denoise = (VAProcFilterParameterBuffer *)base; 105166304487373cf4ed335ba2614f00102dca837832Wang Kun 105236b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 105366304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].denoise_enabled != FILTER_ENABLED) { 1054d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The denoise is DISABLE for %d format\n", res_set); 1055c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1056c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 105766304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 105866304487373cf4ed335ba2614f00102dca837832Wang Kun strength = check_vpp_strength(denoise->value); 105966304487373cf4ed335ba2614f00102dca837832Wang Kun if (strength == INVALID_STRENGTH) { 106066304487373cf4ed335ba2614f00102dca837832Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_VALUE; 106166304487373cf4ed335ba2614f00102dca837832Wang Kun goto err; 106266304487373cf4ed335ba2614f00102dca837832Wang Kun } 106366304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->denoise_deblock_param, 106466304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].denoise_deblock[res_set], 106566304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->denoise_deblock_param)); 1066c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1067c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1068c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1069c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterSharpening: 107066304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen = (VAProcFilterParameterBuffer *)base; 107166304487373cf4ed335ba2614f00102dca837832Wang Kun 107236b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 107366304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].sharpen_enabled != FILTER_ENABLED) { 1074d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The sharpen is DISABLE for %d format\n", res_set); 1075c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1076c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 107766304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 107866304487373cf4ed335ba2614f00102dca837832Wang Kun strength = check_vpp_strength(sharpen->value); 107966304487373cf4ed335ba2614f00102dca837832Wang Kun if (strength == INVALID_STRENGTH) { 108066304487373cf4ed335ba2614f00102dca837832Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_VALUE; 108166304487373cf4ed335ba2614f00102dca837832Wang Kun goto err; 108266304487373cf4ed335ba2614f00102dca837832Wang Kun } 108366304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->sharpen_param, 108466304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].sharpen[res_set], 108566304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->sharpen_param)); 1086c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1087c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1088c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1089c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 1090c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding balance = (VAProcFilterParameterBufferColorBalance *)base; 1091c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1092c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_brightness = 0; 1093c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_saturation = 0; 1094c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1095c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding for (j = 0; j < buf->num_elements; ++j, ++balance) { 109666304487373cf4ed335ba2614f00102dca837832Wang Kun if (balance->attrib == VAProcColorBalanceAutoSaturation && 109766304487373cf4ed335ba2614f00102dca837832Wang Kun balance->value == MAX_VPP_AUTO_PARAM) { 1098c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_saturation = 1; 109966304487373cf4ed335ba2614f00102dca837832Wang Kun } else if (balance->attrib == VAProcColorBalanceAutoBrightness && 110066304487373cf4ed335ba2614f00102dca837832Wang Kun balance->value == MAX_VPP_AUTO_PARAM) { 1101c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_brightness = 1; 1102c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } else { 1103d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The color_banlance do NOT support this attrib %d\n", 1104d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun balance->attrib); 1105c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 1106c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1107c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1108c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1109c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1110c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding /* check filter chain */ 111136b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 111266304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].color_balance_enabled != FILTER_ENABLED) { 1113d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The color_balance is DISABLE for %d format\n", res_set); 1114c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1115c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 111666304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 111766304487373cf4ed335ba2614f00102dca837832Wang Kun strength = MEDIUM_STRENGTH; 111866304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->enhancer_param, 111966304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].enhancer[res_set], 112066304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->enhancer_param)); 112166304487373cf4ed335ba2614f00102dca837832Wang Kun if (!enabled_saturation) 112266304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_ctx->enhancer_param.chroma_amm = 0; 112366304487373cf4ed335ba2614f00102dca837832Wang Kun if (!enabled_brightness) 112466304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_ctx->enhancer_param.luma_amm = 0; 1125c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1126c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1127c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1128c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1129c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterFrameRateConversion: 1130c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding frc = (VAProcFilterParameterBufferFrameRateConversion *)base; 1131c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1132c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding /* check frame rate */ 1133c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding ratio = frc->output_fps / (float)frc->input_fps; 1134c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1135c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (!((ratio == 2 || ratio == 2.5 || ratio == 4) && frc->output_fps <= 60)) { 1136d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The FRC do NOT support the ration(%f) and fps(%d)\n", 1137d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun ratio, frc->output_fps); 1138c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 1139c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1140c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1141c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1142c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding /* check the chain */ 114336b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 114466304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].frc_enabled != FILTER_ENABLED) { 1145d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The FRC is DISABLE for %d format\n", res_set); 1146c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1147c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1148c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1149c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1150c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1151c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding default: 1152d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "Do NOT support the filter type %d\n", base->type); 1153c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 1154c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1155c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 11568e9a21e730449c10cac6e6f69d255611c93f63c2hding } 11578e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 11588e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "no HW support\n"); 11598e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 11608e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 11618e9a21e730449c10cac6e6f69d255611c93f63c2hding } 11628e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr: 11638e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 11648e9a21e730449c10cac6e6f69d255611c93f63c2hding} 11658e9a21e730449c10cac6e6f69d255611c93f63c2hding 11668e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_pipeline(context_VPP_p ctx) 11678e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 11688e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 11698e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; 11708e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcPipelineParameterBuffer *cell_pipeline_param = (struct VssProcPipelineParameterBuffer *)cmdbuf->pipeline_param_p; 1171fc84bd8b6852aff0a3f70c4f21533ce36e1937behding unsigned int i, j, filter_count, check_filter = 0; 11728e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferBase *cur_param; 11738e9a21e730449c10cac6e6f69d255611c93f63c2hding enum VssProcFilterType tmp; 11748e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_driver_data_p driver_data = ctx->obj_context->driver_data; 11758e9a21e730449c10cac6e6f69d255611c93f63c2hding 11768e9a21e730449c10cac6e6f69d255611c93f63c2hding /* init pipeline cmd */ 11778e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < VssProcPipelineMaxNumFilters; ++i) 11788e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[i] = -1; 11798e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->num_filters = 0; 11808e9a21e730449c10cac6e6f69d255611c93f63c2hding 11818e9a21e730449c10cac6e6f69d255611c93f63c2hding filter_count = 0; 11828e9a21e730449c10cac6e6f69d255611c93f63c2hding 11838e9a21e730449c10cac6e6f69d255611c93f63c2hding /* store filter buffer object */ 11848e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->num_filters != 0) { 11858e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < ctx->num_filters; ++i) 11868e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filter_buf[i] = BUFFER(ctx->filters[i]); 11878e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 11888e9a21e730449c10cac6e6f69d255611c93f63c2hding goto finished; 11898e9a21e730449c10cac6e6f69d255611c93f63c2hding } 11908e9a21e730449c10cac6e6f69d255611c93f63c2hding 11918e9a21e730449c10cac6e6f69d255611c93f63c2hding /* loop the filter, set correct pipeline param for FW */ 11928e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < ctx->num_filters; ++i) { 11938e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_param = (VAProcFilterParameterBufferBase *)ctx->filter_buf[i]->buffer_data; 11948e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (cur_param->type) { 11958e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNone: 11968e9a21e730449c10cac6e6f69d255611c93f63c2hding goto finished; 11978e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 11988e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNoiseReduction: 1199fc84bd8b6852aff0a3f70c4f21533ce36e1937behding case VAProcFilterDeblocking: 12008e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterDenoise; 1201fc84bd8b6852aff0a3f70c4f21533ce36e1937behding check_filter++; 12028e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 12038e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterSharpening: 12048e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterSharpening; 12058e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 1206c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 12078e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterColorEnhancement; 12088e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 12098e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterFrameRateConversion: 12108e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterFrameRateConversion; 12118e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 12128e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 12138e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = -1; 12148e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 12158e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 12168e9a21e730449c10cac6e6f69d255611c93f63c2hding } 12178e9a21e730449c10cac6e6f69d255611c93f63c2hding } 12188e9a21e730449c10cac6e6f69d255611c93f63c2hding 1219fc84bd8b6852aff0a3f70c4f21533ce36e1937behding /* Denoise and Deblock is alternative */ 1220fc84bd8b6852aff0a3f70c4f21533ce36e1937behding if (check_filter >= 2) { 1221fc84bd8b6852aff0a3f70c4f21533ce36e1937behding drv_debug_msg(VIDEO_DEBUG_ERROR, "Denoise and Deblock is alternative!\n"); 1222fc84bd8b6852aff0a3f70c4f21533ce36e1937behding cell_pipeline_param->filter_pipeline[filter_count++] = -1; 1223fc84bd8b6852aff0a3f70c4f21533ce36e1937behding vaStatus = VA_STATUS_ERROR_UNKNOWN; 1224fc84bd8b6852aff0a3f70c4f21533ce36e1937behding goto out; 1225fc84bd8b6852aff0a3f70c4f21533ce36e1937behding } 1226fc84bd8b6852aff0a3f70c4f21533ce36e1937behding 12278e9a21e730449c10cac6e6f69d255611c93f63c2hdingfinished: 12288e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->num_filters = filter_count; 12298e9a21e730449c10cac6e6f69d255611c93f63c2hding 12308e9a21e730449c10cac6e6f69d255611c93f63c2hding /* reorder */ 12318e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 1; i < filter_count; ++i) 12328e9a21e730449c10cac6e6f69d255611c93f63c2hding for (j = i; j > 0; --j) 12338e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cell_pipeline_param->filter_pipeline[j] < cell_pipeline_param->filter_pipeline[j - 1]) { 12348e9a21e730449c10cac6e6f69d255611c93f63c2hding /* swap */ 12358e9a21e730449c10cac6e6f69d255611c93f63c2hding tmp = cell_pipeline_param->filter_pipeline[j]; 12368e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[j] = cell_pipeline_param->filter_pipeline[j - 1]; 12378e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[j - 1] = tmp; 12388e9a21e730449c10cac6e6f69d255611c93f63c2hding } 12398e9a21e730449c10cac6e6f69d255611c93f63c2hding 12408e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_insert_command(cmdbuf, &cmdbuf->param_mem, VssProcPipelineParameterCommand, 12418e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pipeline_param_offset, sizeof(struct VssProcPipelineParameterBuffer)); 12428e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 12438e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 12448e9a21e730449c10cac6e6f69d255611c93f63c2hding} 12458e9a21e730449c10cac6e6f69d255611c93f63c2hding 12468e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_filter_param(context_VPP_p ctx) 12478e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 12488e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 12498e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; 12508e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcDenoiseParameterBuffer *cell_denoiser_param = (struct VssProcDenoiseParameterBuffer *)cmdbuf->denoise_param_p; 12518e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcColorEnhancementParameterBuffer *cell_enhancer_param = (struct VssProcColorEnhancementParameterBuffer *)cmdbuf->enhancer_param_p; 12528e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcSharpenParameterBuffer *cell_sharpen_param = (struct VssProcSharpenParameterBuffer *)cmdbuf->sharpen_param_p; 12538e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcFrcParameterBuffer *cell_proc_frc_param = (struct VssProcFrcParameterBuffer *)cmdbuf->frc_param_p; 12548e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferBase *cur_param = NULL; 12558e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferFrameRateConversion *frc_param = NULL; 12568e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int i; 12578e9a21e730449c10cac6e6f69d255611c93f63c2hding float ratio; 12588e9a21e730449c10cac6e6f69d255611c93f63c2hding 12598e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < ctx->num_filters; ++i) { 12608e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_param = (VAProcFilterParameterBufferBase *)ctx->filter_buf[i]->buffer_data; 12618e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (cur_param->type) { 12628e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterDeblocking: 126366304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_denoiser_param, 126466304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->denoise_deblock_param, 126566304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->denoise_deblock_param)); 12668e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_denoiser_param->type = VssProcDeblock; 126766304487373cf4ed335ba2614f00102dca837832Wang Kun 126866304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 126966304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 127066304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcDenoiseParameterCommand, 127166304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->denoise_param_offset, 127266304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcDenoiseParameterBuffer)); 12738e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 12748e9a21e730449c10cac6e6f69d255611c93f63c2hding 12758e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNoiseReduction: 127666304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_denoiser_param, 127766304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->denoise_deblock_param, 127866304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->denoise_deblock_param)); 12798e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_denoiser_param->type = VssProcDegrain; 128066304487373cf4ed335ba2614f00102dca837832Wang Kun 128166304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 128266304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 128366304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcDenoiseParameterCommand, 128466304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->denoise_param_offset, 128566304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcDenoiseParameterBuffer)); 12868e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 12878e9a21e730449c10cac6e6f69d255611c93f63c2hding 12888e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterSharpening: 128966304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_sharpen_param, 129066304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->sharpen_param, 129166304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->sharpen_param)); 129266304487373cf4ed335ba2614f00102dca837832Wang Kun 129366304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 129466304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 129566304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcSharpenParameterCommand, 129666304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->sharpen_param_offset, 129766304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcSharpenParameterBuffer)); 12988e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 12998e9a21e730449c10cac6e6f69d255611c93f63c2hding 1300c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 130166304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_enhancer_param, 130266304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->enhancer_param, 130366304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->enhancer_param)); 130466304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 130566304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 130666304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcColorEnhancementParameterCommand, 130766304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->enhancer_param_offset, 130866304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcColorEnhancementParameterBuffer)); 13098e9a21e730449c10cac6e6f69d255611c93f63c2hding 13108e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13118e9a21e730449c10cac6e6f69d255611c93f63c2hding 13128e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterFrameRateConversion: 13138e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_buf = ctx->filter_buf[i]; 13148e9a21e730449c10cac6e6f69d255611c93f63c2hding 13158e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_param = (VAProcFilterParameterBufferFrameRateConversion *)ctx->filter_buf[i]->buffer_data; 13168e9a21e730449c10cac6e6f69d255611c93f63c2hding ratio = frc_param->output_fps / (float)frc_param->input_fps; 13178e9a21e730449c10cac6e6f69d255611c93f63c2hding 13188e9a21e730449c10cac6e6f69d255611c93f63c2hding /* fixed to use medium quality */ 13198e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->quality = VssFrcMediumQuality; 13208e9a21e730449c10cac6e6f69d255611c93f63c2hding /* cell_proc_frc_param->quality = VssFrcHighQuality; */ 13218e9a21e730449c10cac6e6f69d255611c93f63c2hding 132266304487373cf4ed335ba2614f00102dca837832Wang Kun /* check if the input fps is in the range of HW capability */ 13238e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ratio == 2) 13248e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->conversion_rate = VssFrc2xConversionRate; 13258e9a21e730449c10cac6e6f69d255611c93f63c2hding else if (ratio == 2.5) 13268e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->conversion_rate = VssFrc2_5xConversionRate; 13278e9a21e730449c10cac6e6f69d255611c93f63c2hding else if (ratio == 4) 13288e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->conversion_rate = VssFrc4xConversionRate; 13298e9a21e730449c10cac6e6f69d255611c93f63c2hding else { 13308e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid frame rate conversion ratio %f \n", ratio); 13318e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 13328e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 13338e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13348e9a21e730449c10cac6e6f69d255611c93f63c2hding 133566304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 133666304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 133766304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcFrcParameterCommand, 133866304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->frc_param_offset, 133966304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcFrcParameterBuffer)); 13408e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13418e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 13428e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 13438e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 13448e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13458e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13468e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 13478e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 13488e9a21e730449c10cac6e6f69d255611c93f63c2hding} 134966304487373cf4ed335ba2614f00102dca837832Wang Kun 135066304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_resolution(int width, int height) 135166304487373cf4ed335ba2614f00102dca837832Wang Kun{ 135266304487373cf4ed335ba2614f00102dca837832Wang Kun int ret; 135366304487373cf4ed335ba2614f00102dca837832Wang Kun int image_area; 135466304487373cf4ed335ba2614f00102dca837832Wang Kun 135566304487373cf4ed335ba2614f00102dca837832Wang Kun if (height < 96 || height > 1080) 135666304487373cf4ed335ba2614f00102dca837832Wang Kun return NOT_SUPPORTED_RESOLUTION; 135766304487373cf4ed335ba2614f00102dca837832Wang Kun 135866304487373cf4ed335ba2614f00102dca837832Wang Kun image_area = height * width; 135966304487373cf4ed335ba2614f00102dca837832Wang Kun 136066304487373cf4ed335ba2614f00102dca837832Wang Kun if (image_area <= QVGA_AREA) 136166304487373cf4ed335ba2614f00102dca837832Wang Kun ret = QCIF_TO_QVGA; 136266304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= VGA_AREA) 136366304487373cf4ed335ba2614f00102dca837832Wang Kun ret = QVGA_TO_VGA; 136466304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= SD_AREA) 136566304487373cf4ed335ba2614f00102dca837832Wang Kun ret = VGA_TO_SD; 136666304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= HD720P_AREA) 136766304487373cf4ed335ba2614f00102dca837832Wang Kun ret = SD_TO_720P; 136866304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= HD1080P_AREA) 136966304487373cf4ed335ba2614f00102dca837832Wang Kun ret = HD720P_TO_1080P; 137066304487373cf4ed335ba2614f00102dca837832Wang Kun else 137166304487373cf4ed335ba2614f00102dca837832Wang Kun ret = NOT_SUPPORTED_RESOLUTION; 137266304487373cf4ed335ba2614f00102dca837832Wang Kun 137366304487373cf4ed335ba2614f00102dca837832Wang Kun return ret; 137466304487373cf4ed335ba2614f00102dca837832Wang Kun} 137566304487373cf4ed335ba2614f00102dca837832Wang Kun 137666304487373cf4ed335ba2614f00102dca837832Wang Kun/* 137766304487373cf4ed335ba2614f00102dca837832Wang Kun * The strength area is: 137866304487373cf4ed335ba2614f00102dca837832Wang Kun * 137966304487373cf4ed335ba2614f00102dca837832Wang Kun * 0______33______66______100 138066304487373cf4ed335ba2614f00102dca837832Wang Kun * LOW MED HIGH 138166304487373cf4ed335ba2614f00102dca837832Wang Kun * 138266304487373cf4ed335ba2614f00102dca837832Wang Kun * MIN=0; MAX=100; STEP=33 138366304487373cf4ed335ba2614f00102dca837832Wang Kun */ 138466304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_vpp_strength(int value) 138566304487373cf4ed335ba2614f00102dca837832Wang Kun{ 138666304487373cf4ed335ba2614f00102dca837832Wang Kun if (value < MIN_VPP_PARAM || value > MAX_VPP_PARAM) 138766304487373cf4ed335ba2614f00102dca837832Wang Kun return INVALID_STRENGTH; 138866304487373cf4ed335ba2614f00102dca837832Wang Kun 138966304487373cf4ed335ba2614f00102dca837832Wang Kun if (value >= MIN_VPP_PARAM && 139066304487373cf4ed335ba2614f00102dca837832Wang Kun value < MIN_VPP_PARAM + STEP_VPP_PARAM) 139166304487373cf4ed335ba2614f00102dca837832Wang Kun return LOW_STRENGTH; 139266304487373cf4ed335ba2614f00102dca837832Wang Kun else if (value >= MIN_VPP_PARAM + STEP_VPP_PARAM && 139366304487373cf4ed335ba2614f00102dca837832Wang Kun value < MIN_VPP_PARAM + 2 * STEP_VPP_PARAM) 139466304487373cf4ed335ba2614f00102dca837832Wang Kun return MEDIUM_STRENGTH; 139566304487373cf4ed335ba2614f00102dca837832Wang Kun else 139666304487373cf4ed335ba2614f00102dca837832Wang Kun return HIGH_STRENGTH; 139766304487373cf4ed335ba2614f00102dca837832Wang Kun} 1398