vsp_VPP.c revision 0b79338c7b34af6f2baade29264bcf27cab80e83
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}, 1335d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [QVGA_TO_VGA] = {0, 7, 48, 47, 0, 0, 0, 0}, 1345d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [VGA_TO_SD] = {0, 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}, 1595d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [QVGA_TO_VGA] = {0, 10, 48, 47, 0, 0, 0, 0}, 1605d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [VGA_TO_SD] = {0, 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}, 1825d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [QVGA_TO_VGA] = {0, 15, 45, 25, 0, 0, 0, 0}, 1835d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [VGA_TO_SD] = {0, 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; 3927009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun int tiled = 0; 3938e9a21e730449c10cac6e6f69d255611c93f63c2hding 3948e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->surface_region != NULL) { 3958e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't scale\n"); 3968e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 3978e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 3988e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3998e9a21e730449c10cac6e6f69d255611c93f63c2hding 4008e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->output_region != NULL) { 4018e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't scale\n"); 4028e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4038e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4048e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4058e9a21e730449c10cac6e6f69d255611c93f63c2hding 406c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (pipeline_param->output_background_color != 0) { 407c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't support background color here\n"); 408c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 409c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto out; 410c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 4118e9a21e730449c10cac6e6f69d255611c93f63c2hding 4128e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->filters == NULL) { 4138e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filter setting filters = %p\n", pipeline_param->filters); 4148e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4158e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4168e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4178e9a21e730449c10cac6e6f69d255611c93f63c2hding 4188e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0 4198e9a21e730449c10cac6e6f69d255611c93f63c2hding /* for pass filter */ 4208e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->num_filters == 0 || pipeline_param->num_filters > VssProcPipelineMaxNumFilters) { 4218e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filter number = %d\n", pipeline_param->num_filters); 4228e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4238e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4248e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4258e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif 4268e9a21e730449c10cac6e6f69d255611c93f63c2hding 4278e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->forward_references == NULL) { 4288e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid forward_refereces %p setting\n", pipeline_param->forward_references); 4298e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4308e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4318e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4328e9a21e730449c10cac6e6f69d255611c93f63c2hding 4338e9a21e730449c10cac6e6f69d255611c93f63c2hding /* should we check it? since the begining it's not VSP_FORWARD_REF_NUM */ 4348e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->num_forward_references != VSP_FORWARD_REF_NUM) { 4358e9a21e730449c10cac6e6f69d255611c93f63c2hding 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); 4368e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4378e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4388e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4398e9a21e730449c10cac6e6f69d255611c93f63c2hding 4408e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: no backward reference checking */ 4418e9a21e730449c10cac6e6f69d255611c93f63c2hding if (!(pipeline_param->pipeline_flags & VA_PIPELINE_FLAG_END)) { 4428e9a21e730449c10cac6e6f69d255611c93f63c2hding input_surface = SURFACE(pipeline_param->surface); 4438e9a21e730449c10cac6e6f69d255611c93f63c2hding if (input_surface == NULL) { 4448e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input surface %x\n", pipeline_param->surface); 4458e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4468e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4478e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4488e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4498e9a21e730449c10cac6e6f69d255611c93f63c2hding input_surface = NULL; 4508e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4518e9a21e730449c10cac6e6f69d255611c93f63c2hding 4528e9a21e730449c10cac6e6f69d255611c93f63c2hding /* if it is the first pipeline command */ 4538e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->num_filters != ctx->num_filters || pipeline_param->num_filters == 0) { 4548e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->num_filters != 0) { 4558e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n"); 4568e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4578e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4588e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4598e9a21e730449c10cac6e6f69d255611c93f63c2hding /* save filters */ 4608e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->num_filters = pipeline_param->num_filters; 4618e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->num_filters == 0) { 4628e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filters = NULL; 4638e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4648e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filters = (VABufferID *) calloc(ctx->num_filters, sizeof(*ctx->filters)); 4658e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->filters == NULL) { 4668e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n"); 4678e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4688e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4698e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4708e9a21e730449c10cac6e6f69d255611c93f63c2hding memcpy(ctx->filters, pipeline_param->filters, ctx->num_filters * sizeof(*ctx->filters)); 4718e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4728e9a21e730449c10cac6e6f69d255611c93f63c2hding 4738e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set pipeline command to FW */ 4748e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = vsp_set_pipeline(ctx); 4758e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus) { 4768e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to set pipeline\n"); 4778e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4788e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4798e9a21e730449c10cac6e6f69d255611c93f63c2hding 4808e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set filter parameter to FW, record frc parameter buffer */ 4818e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = vsp_set_filter_param(ctx); 4828e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus) { 4838e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to set filter parameter\n"); 4848e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4858e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4868e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4878e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4888e9a21e730449c10cac6e6f69d255611c93f63c2hding /* else ignore pipeline/filter setting */ 4898e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0 4908e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: we can save these check for PnP */ 4918e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < pipeline_param->num_filters; i++) { 4928e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->filters[i] != ctx->filters[i]) { 4938e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n"); 4948e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4958e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4968e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4978e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4988e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif 4998e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5008e9a21e730449c10cac6e6f69d255611c93f63c2hding 5018e9a21e730449c10cac6e6f69d255611c93f63c2hding /* fill picture command to FW */ 5028e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->frc_buf != NULL) 5038e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_param = (VAProcFilterParameterBufferFrameRateConversion *)ctx->frc_buf->buffer_data; 5048e9a21e730449c10cac6e6f69d255611c93f63c2hding else 5058e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_param = NULL; 5068e9a21e730449c10cac6e6f69d255611c93f63c2hding 5078e9a21e730449c10cac6e6f69d255611c93f63c2hding /* end picture command */ 5088e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->pipeline_flags & VA_PIPELINE_FLAG_END) { 5098e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_end_param->num_input_pictures = 0; 5108e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_end_param->num_output_pictures = 0; 5118e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_insert_command(cmdbuf, &cmdbuf->param_mem, VssProcPictureCommand, 5128e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->end_param_offset, sizeof(struct VssProcPictureParameterBuffer)); 5138e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 5148e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5158e9a21e730449c10cac6e6f69d255611c93f63c2hding 5167009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun#ifdef PSBVIDEO_MSVDX_DEC_TILING 5177009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun /* Tiling available for 1080P*/ 5187009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun if (input_surface->width > 1280) 5197009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun tiled = 1; 5207009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun#endif 5217009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun /* Setup input surface */ 5228e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->num_input_pictures = 1; 5238e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->input_picture[0].surface_id = pipeline_param->surface; 5248e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_reloc_pic_param(&(cell_proc_picture_param->input_picture[0].base), ctx->pic_param_offset, &(input_surface->psb_surface->buf), 5258e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->param_mem_loc, cell_proc_picture_param); 5268e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->input_picture[0].height = input_surface->height_origin; 5278e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->input_picture[0].width = input_surface->width; 5288e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->input_picture[0].irq = 0; 529c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding cell_proc_picture_param->input_picture[0].stride = input_surface->psb_surface->stride; 530c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding cell_proc_picture_param->input_picture[0].format = ctx->format; 5317009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun cell_proc_picture_param->input_picture[0].tiled = tiled; 5325d69fca537b4dd301c586b988129305fa60f1c06Wang Kun cell_proc_picture_param->input_picture[0].rot_angle = 0; 5338e9a21e730449c10cac6e6f69d255611c93f63c2hding 5347009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun /* Setup output surfaces */ 5358e9a21e730449c10cac6e6f69d255611c93f63c2hding if (frc_param == NULL) 5368e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->num_output_pictures = 1; 5378e9a21e730449c10cac6e6f69d255611c93f63c2hding else 5388e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->num_output_pictures = frc_param->num_output_frames + 1; 5398e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < cell_proc_picture_param->num_output_pictures; ++i) { 5408e9a21e730449c10cac6e6f69d255611c93f63c2hding if (i == 0) { 5418e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_output_surf = ctx->obj_context->current_render_target; 5428e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 543c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (frc_param == NULL) { 544c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid output surface numbers %x\n", 545c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding cell_proc_picture_param->num_output_pictures); 546c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 547c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto out; 548c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 549c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 5508e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_output_surf = SURFACE(frc_param->output_frames[i-1]); 5518e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cur_output_surf == NULL) { 5528e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input surface %x\n", frc_param->output_frames[i-1]); 5538e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 5548e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 5558e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5568e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5578e9a21e730449c10cac6e6f69d255611c93f63c2hding 5588e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->output_picture[i].surface_id = wsbmKBufHandle(wsbmKBuf(cur_output_surf->psb_surface->buf.drm_buf)); 5598e9a21e730449c10cac6e6f69d255611c93f63c2hding 5608e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_reloc_pic_param(&(cell_proc_picture_param->output_picture[i].base), 5618e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pic_param_offset, &(cur_output_surf->psb_surface->buf), 5628e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->param_mem_loc, cell_proc_picture_param); 5638e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->output_picture[i].height = cur_output_surf->height_origin; 5648e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->output_picture[i].width = cur_output_surf->width; 565c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding cell_proc_picture_param->output_picture[i].stride = cur_output_surf->psb_surface->stride; 5668e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->output_picture[i].irq = 1; 5678e9a21e730449c10cac6e6f69d255611c93f63c2hding /* keep the same first, modify to dest format when feature's avaliable */ 5688e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->output_picture[i].format = ctx->format; 5694b8982ecb6744203ae0b5381942d72a518539661Wang Kun 5704b8982ecb6744203ae0b5381942d72a518539661Wang Kun /* Set the rotation angle info */ 5714b8982ecb6744203ae0b5381942d72a518539661Wang Kun switch (GET_SURFACE_INFO_rotate(cur_output_surf->psb_surface)) { 5724b8982ecb6744203ae0b5381942d72a518539661Wang Kun case VA_ROTATION_90: 5734b8982ecb6744203ae0b5381942d72a518539661Wang Kun rotation_angle = VSP_ROTATION_90; 5744b8982ecb6744203ae0b5381942d72a518539661Wang Kun break; 5754b8982ecb6744203ae0b5381942d72a518539661Wang Kun case VA_ROTATION_180: 5764b8982ecb6744203ae0b5381942d72a518539661Wang Kun rotation_angle = VSP_ROTATION_180; 5774b8982ecb6744203ae0b5381942d72a518539661Wang Kun break; 5784b8982ecb6744203ae0b5381942d72a518539661Wang Kun case VA_ROTATION_270: 5794b8982ecb6744203ae0b5381942d72a518539661Wang Kun rotation_angle = VSP_ROTATION_270; 5804b8982ecb6744203ae0b5381942d72a518539661Wang Kun break; 5814b8982ecb6744203ae0b5381942d72a518539661Wang Kun default: 5824b8982ecb6744203ae0b5381942d72a518539661Wang Kun rotation_angle = VSP_ROTATION_NONE; 5834b8982ecb6744203ae0b5381942d72a518539661Wang Kun } 5844b8982ecb6744203ae0b5381942d72a518539661Wang Kun /* FIXME: The rotation design is still on going, set it to default value */ 5854b8982ecb6744203ae0b5381942d72a518539661Wang Kun cell_proc_picture_param->output_picture[i].rot_angle = 0; 5867009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun cell_proc_picture_param->output_picture[i].tiled = tiled; 5878e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5888e9a21e730449c10cac6e6f69d255611c93f63c2hding 5898e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_insert_command(cmdbuf, &cmdbuf->param_mem, VssProcPictureCommand, 5908e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pic_param_offset, sizeof(struct VssProcPictureParameterBuffer)); 5918e9a21e730449c10cac6e6f69d255611c93f63c2hding 5928e9a21e730449c10cac6e6f69d255611c93f63c2hding 5938e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_fence_pic_param(cmdbuf, wsbmKBufHandle(wsbmKBuf(cmdbuf->param_mem.drm_buf))); 5948e9a21e730449c10cac6e6f69d255611c93f63c2hding 5958e9a21e730449c10cac6e6f69d255611c93f63c2hding /* handle reference frames, ignore backward reference */ 5968e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < pipeline_param->num_forward_references; ++i) { 5978e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_output_surf = SURFACE(pipeline_param->forward_references[i]); 5988e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cur_output_surf == NULL) 5998e9a21e730449c10cac6e6f69d255611c93f63c2hding continue; 600d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (vsp_cmdbuf_buffer_ref(cmdbuf, &cur_output_surf->psb_surface->buf) < 0) { 601d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "vsp_cmdbuf_buffer_ref() failed\n"); 602d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_UNKNOWN; 603d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto out; 604d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 6058e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6068e9a21e730449c10cac6e6f69d255611c93f63c2hding 6078e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 6088e9a21e730449c10cac6e6f69d255611c93f63c2hding free(pipeline_param); 6098e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_buffer->buffer_data = NULL; 6108e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_buffer->size = 0; 6118e9a21e730449c10cac6e6f69d255611c93f63c2hding 6128e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 6138e9a21e730449c10cac6e6f69d255611c93f63c2hding} 6148e9a21e730449c10cac6e6f69d255611c93f63c2hding 6158e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_RenderPicture( 6168e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context, 6178e9a21e730449c10cac6e6f69d255611c93f63c2hding object_buffer_p *buffers, 6188e9a21e730449c10cac6e6f69d255611c93f63c2hding int num_buffers) 6198e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 6208e9a21e730449c10cac6e6f69d255611c93f63c2hding int i; 6218e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 6228e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 6238e9a21e730449c10cac6e6f69d255611c93f63c2hding 6248e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < num_buffers; i++) { 6258e9a21e730449c10cac6e6f69d255611c93f63c2hding object_buffer_p obj_buffer = buffers[i]; 6268e9a21e730449c10cac6e6f69d255611c93f63c2hding 6278e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (obj_buffer->type) { 6288e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcPipelineParameterBufferType: 6298e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = vsp__VPP_process_pipeline_param(ctx, obj_buffer); 6308e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 6318e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 6328e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 6338e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 6348e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 6358e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6368e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus != VA_STATUS_SUCCESS) { 6378e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 6388e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6398e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6408e9a21e730449c10cac6e6f69d255611c93f63c2hding 6418e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 6428e9a21e730449c10cac6e6f69d255611c93f63c2hding} 6438e9a21e730449c10cac6e6f69d255611c93f63c2hding 6448e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_BeginPicture( 6458e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context) 6468e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 6478e9a21e730449c10cac6e6f69d255611c93f63c2hding int ret; 6488e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 6498e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 6508e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf; 6518e9a21e730449c10cac6e6f69d255611c93f63c2hding 6528e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Initialise the command buffer */ 6538e9a21e730449c10cac6e6f69d255611c93f63c2hding ret = vsp_context_get_next_cmdbuf(ctx->obj_context); 6548e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ret) { 6558e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "get next cmdbuf fail\n"); 6568e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 6578e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 6588e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6598e9a21e730449c10cac6e6f69d255611c93f63c2hding 6608e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf = obj_context->vsp_cmdbuf; 6618e9a21e730449c10cac6e6f69d255611c93f63c2hding 662c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (ctx->obj_context->frame_count == 0) /* first picture */ 663c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vsp_cmdbuf_insert_command(cmdbuf, ctx->context_buf, VspSetContextCommand, 664c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 0, VSP_PROC_CONTEXT_SIZE); 665c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 6668e9a21e730449c10cac6e6f69d255611c93f63c2hding /* map param mem */ 6678e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = psb_buffer_map(&cmdbuf->param_mem, &cmdbuf->param_mem_p); 6688e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus) { 6698e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 6708e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6718e9a21e730449c10cac6e6f69d255611c93f63c2hding 6728e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pic_param_p = cmdbuf->param_mem_p + ctx->pic_param_offset; 6738e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->end_param_p = cmdbuf->param_mem_p + ctx->end_param_offset; 6748e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pipeline_param_p = cmdbuf->param_mem_p + ctx->pipeline_param_offset; 6758e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->denoise_param_p = cmdbuf->param_mem_p + ctx->denoise_param_offset; 6768e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->enhancer_param_p = cmdbuf->param_mem_p + ctx->enhancer_param_offset; 6778e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->sharpen_param_p = cmdbuf->param_mem_p + ctx->sharpen_param_offset; 6788e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->frc_param_p = cmdbuf->param_mem_p + ctx->frc_param_offset; 6798e9a21e730449c10cac6e6f69d255611c93f63c2hding 6808e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_SUCCESS; 6818e9a21e730449c10cac6e6f69d255611c93f63c2hding} 6828e9a21e730449c10cac6e6f69d255611c93f63c2hding 6838e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_EndPicture( 6848e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context) 6858e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 6868e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 6878e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_driver_data_p driver_data = obj_context->driver_data; 6888e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = obj_context->vsp_cmdbuf; 6898e9a21e730449c10cac6e6f69d255611c93f63c2hding 6908e9a21e730449c10cac6e6f69d255611c93f63c2hding if(cmdbuf->param_mem_p != NULL) { 6918e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_unmap(&cmdbuf->param_mem); 6928e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->param_mem_p = NULL; 6938e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pic_param_p = NULL; 6948e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->end_param_p = NULL; 6958e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pipeline_param_p = NULL; 6968e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->denoise_param_p = NULL; 6978e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->enhancer_param_p = NULL; 6988e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->sharpen_param_p = NULL; 6998e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->frc_param_p = NULL; 7008e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7018e9a21e730449c10cac6e6f69d255611c93f63c2hding 702d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (vsp_context_flush_cmdbuf(ctx->obj_context)) { 7038e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VPP: flush deblock cmdbuf error\n"); 704d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun return VA_STATUS_ERROR_UNKNOWN; 705d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 7068e9a21e730449c10cac6e6f69d255611c93f63c2hding 7078e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_SUCCESS; 7088e9a21e730449c10cac6e6f69d255611c93f63c2hding} 7098e9a21e730449c10cac6e6f69d255611c93f63c2hding 7108e9a21e730449c10cac6e6f69d255611c93f63c2hdingstruct format_vtable_s vsp_VPP_vtable = { 7118e9a21e730449c10cac6e6f69d255611c93f63c2hdingqueryConfigAttributes: 7128e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_QueryConfigAttributes, 7138e9a21e730449c10cac6e6f69d255611c93f63c2hdingvalidateConfig: 7148e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_ValidateConfig, 7158e9a21e730449c10cac6e6f69d255611c93f63c2hdingcreateContext: 7168e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_CreateContext, 7178e9a21e730449c10cac6e6f69d255611c93f63c2hdingdestroyContext: 7188e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_DestroyContext, 7198e9a21e730449c10cac6e6f69d255611c93f63c2hdingbeginPicture: 7208e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_BeginPicture, 7218e9a21e730449c10cac6e6f69d255611c93f63c2hdingrenderPicture: 7228e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_RenderPicture, 7238e9a21e730449c10cac6e6f69d255611c93f63c2hdingendPicture: 7248e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_EndPicture 7258e9a21e730449c10cac6e6f69d255611c93f63c2hding}; 7268e9a21e730449c10cac6e6f69d255611c93f63c2hding 7278e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcFilters( 7288e9a21e730449c10cac6e6f69d255611c93f63c2hding VADriverContextP ctx, 7298e9a21e730449c10cac6e6f69d255611c93f63c2hding VAContextID context, 7308e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterType *filters, 7318e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int *num_filters 7328e9a21e730449c10cac6e6f69d255611c93f63c2hding ) 7338e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 7348e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_DRIVER_DATA; 7358e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 7368e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context; 7378e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config; 7388e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint tmp; 7398e9a21e730449c10cac6e6f69d255611c93f63c2hding int count; 7408e9a21e730449c10cac6e6f69d255611c93f63c2hding 7418e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if ctx is right */ 7428e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context = CONTEXT(context); 7438e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 7448e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 74538cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 7468e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 7478e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7488e9a21e730449c10cac6e6f69d255611c93f63c2hding 7498e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_config = CONFIG(obj_context->config_id); 7508e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 7518e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 75238cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 7538e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 7548e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7558e9a21e730449c10cac6e6f69d255611c93f63c2hding 7568e9a21e730449c10cac6e6f69d255611c93f63c2hding tmp = obj_config->entrypoint; 7578e9a21e730449c10cac6e6f69d255611c93f63c2hding if (tmp != VAEntrypointVideoProc) { 7588e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "current entrypoint is %d, not VAEntrypointVideoProc\n", tmp); 7598e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 7608e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 7618e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7628e9a21e730449c10cac6e6f69d255611c93f63c2hding 763d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check if filters and num_filters is valid */ 7648e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == num_filters || NULL == filters) { 7658e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters %p, filters %p\n", num_filters, filters); 76638cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 7678e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 7688e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7698e9a21e730449c10cac6e6f69d255611c93f63c2hding 770d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check if the filter array size is valid */ 771d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (*num_filters < VSP_SUPPORTED_FILTERS_NUM) { 772d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The filters array size(%d) is NOT valid! Supported filters num is %d\n", 773d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun *num_filters, VSP_SUPPORTED_FILTERS_NUM); 774d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 775d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun *num_filters = VSP_SUPPORTED_FILTERS_NUM; 776d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto err; 777d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 778d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun 7798e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if current HW support Video proc */ 7808e9a21e730449c10cac6e6f69d255611c93f63c2hding if (IS_MRFL(driver_data)) { 7818e9a21e730449c10cac6e6f69d255611c93f63c2hding count = 0; 782c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding filters[count++] = VAProcFilterDeblocking; 7838e9a21e730449c10cac6e6f69d255611c93f63c2hding filters[count++] = VAProcFilterNoiseReduction; 7848e9a21e730449c10cac6e6f69d255611c93f63c2hding filters[count++] = VAProcFilterSharpening; 785c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding filters[count++] = VAProcFilterColorBalance; 7868e9a21e730449c10cac6e6f69d255611c93f63c2hding filters[count++] = VAProcFilterFrameRateConversion; 7878e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filters = count; 7888e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 7898e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filters = 0; 7908e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7918e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr: 7928e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 7938e9a21e730449c10cac6e6f69d255611c93f63c2hding} 7948e9a21e730449c10cac6e6f69d255611c93f63c2hding 7958e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcFilterCaps( 7968e9a21e730449c10cac6e6f69d255611c93f63c2hding VADriverContextP ctx, 7978e9a21e730449c10cac6e6f69d255611c93f63c2hding VAContextID context, 7988e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterType type, 7998e9a21e730449c10cac6e6f69d255611c93f63c2hding void *filter_caps, 8008e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int *num_filter_caps 8018e9a21e730449c10cac6e6f69d255611c93f63c2hding ) 8028e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 8038e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_DRIVER_DATA; 8048e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 8058e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context; 8068e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config; 8078e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint tmp; 808fc84bd8b6852aff0a3f70c4f21533ce36e1937behding VAProcFilterCap *denoise_cap, *deblock_cap; 8098e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterCap *sharpen_cap; 810c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterCapColorBalance *color_balance_cap; 8118e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterCap *frc_cap; 8128e9a21e730449c10cac6e6f69d255611c93f63c2hding 8138e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if context is right */ 8148e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context = CONTEXT(context); 8158e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 8168e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 81738cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 8188e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8198e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8208e9a21e730449c10cac6e6f69d255611c93f63c2hding 8218e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_config = CONFIG(obj_context->config_id); 8228e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 8238e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 82438cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 8258e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8268e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8278e9a21e730449c10cac6e6f69d255611c93f63c2hding 8288e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if filter_caps and num_filter_caps is right */ 8298e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == num_filter_caps || NULL == filter_caps){ 8308e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters %p, filters %p\n", num_filter_caps, filter_caps); 83138cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 8328e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8338e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8348e9a21e730449c10cac6e6f69d255611c93f63c2hding 8358e9a21e730449c10cac6e6f69d255611c93f63c2hding if (*num_filter_caps < 1) { 8368e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters == %d (> 1)\n", *num_filter_caps); 83738cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 8388e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8398e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8408e9a21e730449c10cac6e6f69d255611c93f63c2hding 8418e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if curent HW support and return corresponding caps */ 8428e9a21e730449c10cac6e6f69d255611c93f63c2hding if (IS_MRFL(driver_data)) { 8438e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: we should use a constant table to return caps */ 8448e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (type) { 8458e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNoiseReduction: 8468e9a21e730449c10cac6e6f69d255611c93f63c2hding denoise_cap = filter_caps; 84766304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.min_value = MIN_VPP_PARAM; 84866304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.max_value = MAX_VPP_PARAM; 84966304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.default_value = MIN_VPP_PARAM; 85066304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.step = STEP_VPP_PARAM; 851c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 8528e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 853fc84bd8b6852aff0a3f70c4f21533ce36e1937behding case VAProcFilterDeblocking: 854fc84bd8b6852aff0a3f70c4f21533ce36e1937behding deblock_cap = filter_caps; 85566304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.min_value = MIN_VPP_PARAM; 85666304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.max_value = MAX_VPP_PARAM; 85766304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.default_value = MIN_VPP_PARAM; 85866304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.step = STEP_VPP_PARAM; 859c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 860fc84bd8b6852aff0a3f70c4f21533ce36e1937behding break; 8618e9a21e730449c10cac6e6f69d255611c93f63c2hding 8628e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterSharpening: 8638e9a21e730449c10cac6e6f69d255611c93f63c2hding sharpen_cap = filter_caps; 86466304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.min_value = MIN_VPP_PARAM; 86566304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.max_value = MAX_VPP_PARAM; 86666304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.default_value = MIN_VPP_PARAM; 86766304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.step = STEP_VPP_PARAM; 868c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 8698e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 8708e9a21e730449c10cac6e6f69d255611c93f63c2hding 871c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 872c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (*num_filter_caps < VSP_COLOR_ENHANCE_FEATURES) { 873c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding drv_debug_msg(VIDEO_DEBUG_ERROR, "filter cap num is should big than %d(%d)\n", 874c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VSP_COLOR_ENHANCE_FEATURES, *num_filter_caps); 875d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 876d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun *num_filter_caps = VSP_COLOR_ENHANCE_FEATURES; 877c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 878c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 879c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap = filter_caps; 880c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap->type = VAProcColorBalanceAutoSaturation; 88166304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.min_value = MIN_VPP_AUTO_PARAM; 88266304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.max_value = MAX_VPP_AUTO_PARAM; 88366304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.default_value = MIN_VPP_AUTO_PARAM; 88466304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.step = STEP_VPP_AUTO_PARAM; 885c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 886c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap++; 887c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap->type = VAProcColorBalanceAutoBrightness; 88866304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.min_value = MIN_VPP_AUTO_PARAM; 88966304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.max_value = MAX_VPP_AUTO_PARAM; 89066304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.default_value = MIN_VPP_AUTO_PARAM; 89166304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.step = STEP_VPP_AUTO_PARAM; 892c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 893c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 2; 8948e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 8958e9a21e730449c10cac6e6f69d255611c93f63c2hding 8968e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterFrameRateConversion: 8978e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap = filter_caps; 8988e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.min_value = 2; 8998e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.max_value = 4; 9008e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.default_value = 2; 9018e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: it's a set, step is helpless */ 9028e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.step = 0.5; 903c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 9048e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 9058e9a21e730449c10cac6e6f69d255611c93f63c2hding 9068e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 9078e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide filter type %d\n", type); 90838cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 9098e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filter_caps = 0; 9108e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9118e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9128e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 9138e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filter_caps = 0; 9148e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9158e9a21e730449c10cac6e6f69d255611c93f63c2hding 9168e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr: 9178e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 9188e9a21e730449c10cac6e6f69d255611c93f63c2hding} 9198e9a21e730449c10cac6e6f69d255611c93f63c2hding 9208e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcPipelineCaps( 9218e9a21e730449c10cac6e6f69d255611c93f63c2hding VADriverContextP ctx, 9228e9a21e730449c10cac6e6f69d255611c93f63c2hding VAContextID context, 9238e9a21e730449c10cac6e6f69d255611c93f63c2hding VABufferID *filters, 9248e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int num_filters, 9258e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcPipelineCaps *pipeline_caps 9268e9a21e730449c10cac6e6f69d255611c93f63c2hding ) 9278e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 9288e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_DRIVER_DATA; 9298e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 9308e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context; 9318e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config; 9328e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint tmp; 933c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding unsigned int i, j; 934c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBuffer *deblock, *denoise, *sharpen; 935c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBufferFrameRateConversion *frc; 936c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBufferColorBalance *balance; 937c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBufferBase *base; 938c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding object_buffer_p buf; 939c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding uint32_t enabled_brightness, enabled_saturation; 940c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding float ratio; 941c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int res_set; 94266304487373cf4ed335ba2614f00102dca837832Wang Kun int strength; 94366304487373cf4ed335ba2614f00102dca837832Wang Kun context_VPP_p vpp_ctx; 94436b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun int combination_check; 9458e9a21e730449c10cac6e6f69d255611c93f63c2hding 9468e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if ctx is right */ 9478e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context = CONTEXT(context); 9488e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 9498e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 95038cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 9518e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9528e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9538e9a21e730449c10cac6e6f69d255611c93f63c2hding 95466304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_ctx = (context_VPP_p) obj_context->format_data; 95566304487373cf4ed335ba2614f00102dca837832Wang Kun 9568e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_config = CONFIG(obj_context->config_id); 9578e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 9588e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 95938cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 9608e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9618e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9628e9a21e730449c10cac6e6f69d255611c93f63c2hding 9638e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if filters and num_filters and pipeline-caps are right */ 9648e9a21e730449c10cac6e6f69d255611c93f63c2hding if (num_filters == 0) { 9658e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_filters %d\n", num_filters); 96638cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 9678e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9688e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9698e9a21e730449c10cac6e6f69d255611c93f63c2hding 9708e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == filters || pipeline_caps == NULL) { 9718e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filters %p or pipeline_caps %p\n", filters, pipeline_caps); 97238cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 9738e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9748e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9758e9a21e730449c10cac6e6f69d255611c93f63c2hding 9768e9a21e730449c10cac6e6f69d255611c93f63c2hding /* base on HW capability check the filters and return pipeline caps */ 9778e9a21e730449c10cac6e6f69d255611c93f63c2hding if (IS_MRFL(driver_data)) { 9788e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->pipeline_flags = 0; 9798e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->filter_flags = 0; 9808e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->num_forward_references = VSP_FORWARD_REF_NUM; 9818e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->num_backward_references = 0; 9828e9a21e730449c10cac6e6f69d255611c93f63c2hding 983d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check the input color standard */ 984d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->input_color_standards == NULL){ 985d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input color standard array!\n"); 98638cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 9878e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9888e9a21e730449c10cac6e6f69d255611c93f63c2hding } 989d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->num_input_color_standards < COLOR_STANDARDS_NUM) { 990d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_input_color_standards %d\n", pipeline_caps->num_input_color_standards); 991d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 992d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_input_color_standards = COLOR_STANDARDS_NUM; 993d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto err; 994d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 9958e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->input_color_standards[0] = VAProcColorStandardNone; 996d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_input_color_standards = COLOR_STANDARDS_NUM; 9978e9a21e730449c10cac6e6f69d255611c93f63c2hding 998d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check the output color standard */ 999d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->output_color_standards == NULL){ 1000d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid output color standard array!\n"); 100138cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 10028e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10038e9a21e730449c10cac6e6f69d255611c93f63c2hding } 1004d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->num_output_color_standards < COLOR_STANDARDS_NUM) { 1005d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_output_color_standards %d\n", pipeline_caps->num_output_color_standards); 1006d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 1007d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_output_color_standards = COLOR_STANDARDS_NUM; 1008d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto err; 1009d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 10108e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->output_color_standards[0] = VAProcColorStandardNone; 1011d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_output_color_standards = COLOR_STANDARDS_NUM; 10128e9a21e730449c10cac6e6f69d255611c93f63c2hding 101366304487373cf4ed335ba2614f00102dca837832Wang Kun /* check the resolution */ 101466304487373cf4ed335ba2614f00102dca837832Wang Kun res_set = check_resolution(obj_context->picture_width, 101566304487373cf4ed335ba2614f00102dca837832Wang Kun obj_context->picture_height); 101666304487373cf4ed335ba2614f00102dca837832Wang Kun if (res_set == NOT_SUPPORTED_RESOLUTION) { 1017c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED; 1018c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1019c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1020c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 102136b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (getenv("VSP_PIPELINE_CHECK") != NULL) 102236b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun combination_check = 1; 102366304487373cf4ed335ba2614f00102dca837832Wang Kun else 102436b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun combination_check = 0; 1025c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 10268e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: should check filter value settings here */ 10278e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < num_filters; ++i) { 10288e9a21e730449c10cac6e6f69d255611c93f63c2hding /* find buffer */ 1029c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding buf = BUFFER(*(filters + i)); 10300b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun if (!buf) { 10310b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun vaStatus = VA_STATUS_ERROR_UNKNOWN; 10320b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun goto err; 10330b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun } 1034c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1035c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding base = (VAProcFilterParameterBufferBase *)buf->buffer_data; 10368e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check filter buffer setting */ 1037c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding switch (base->type) { 1038c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterDeblocking: 103966304487373cf4ed335ba2614f00102dca837832Wang Kun deblock = (VAProcFilterParameterBuffer *)base; 104066304487373cf4ed335ba2614f00102dca837832Wang Kun 104136b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 104266304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].deblock_enabled != FILTER_ENABLED) { 1043d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The deblock is DISABLE for %d format\n", res_set); 1044c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1045c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 104666304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 104766304487373cf4ed335ba2614f00102dca837832Wang Kun /* check if the value is right */ 104866304487373cf4ed335ba2614f00102dca837832Wang Kun strength = check_vpp_strength(deblock->value); 104966304487373cf4ed335ba2614f00102dca837832Wang Kun if (strength == INVALID_STRENGTH) { 105066304487373cf4ed335ba2614f00102dca837832Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_VALUE; 105166304487373cf4ed335ba2614f00102dca837832Wang Kun goto err; 105266304487373cf4ed335ba2614f00102dca837832Wang Kun } 105366304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->denoise_deblock_param, 105466304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].denoise_deblock[res_set], 105566304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->denoise_deblock_param)); 1056c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1057c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1058c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1059c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterNoiseReduction: 106066304487373cf4ed335ba2614f00102dca837832Wang Kun denoise = (VAProcFilterParameterBuffer *)base; 106166304487373cf4ed335ba2614f00102dca837832Wang Kun 106236b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 106366304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].denoise_enabled != FILTER_ENABLED) { 1064d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The denoise is DISABLE for %d format\n", res_set); 1065c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1066c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 106766304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 106866304487373cf4ed335ba2614f00102dca837832Wang Kun strength = check_vpp_strength(denoise->value); 106966304487373cf4ed335ba2614f00102dca837832Wang Kun if (strength == INVALID_STRENGTH) { 107066304487373cf4ed335ba2614f00102dca837832Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_VALUE; 107166304487373cf4ed335ba2614f00102dca837832Wang Kun goto err; 107266304487373cf4ed335ba2614f00102dca837832Wang Kun } 107366304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->denoise_deblock_param, 107466304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].denoise_deblock[res_set], 107566304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->denoise_deblock_param)); 1076c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1077c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1078c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1079c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterSharpening: 108066304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen = (VAProcFilterParameterBuffer *)base; 108166304487373cf4ed335ba2614f00102dca837832Wang Kun 108236b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 108366304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].sharpen_enabled != FILTER_ENABLED) { 1084d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The sharpen is DISABLE for %d format\n", res_set); 1085c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1086c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 108766304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 108866304487373cf4ed335ba2614f00102dca837832Wang Kun strength = check_vpp_strength(sharpen->value); 108966304487373cf4ed335ba2614f00102dca837832Wang Kun if (strength == INVALID_STRENGTH) { 109066304487373cf4ed335ba2614f00102dca837832Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_VALUE; 109166304487373cf4ed335ba2614f00102dca837832Wang Kun goto err; 109266304487373cf4ed335ba2614f00102dca837832Wang Kun } 109366304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->sharpen_param, 109466304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].sharpen[res_set], 109566304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->sharpen_param)); 1096c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1097c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1098c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1099c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 1100c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding balance = (VAProcFilterParameterBufferColorBalance *)base; 1101c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1102c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_brightness = 0; 1103c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_saturation = 0; 1104c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1105c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding for (j = 0; j < buf->num_elements; ++j, ++balance) { 110666304487373cf4ed335ba2614f00102dca837832Wang Kun if (balance->attrib == VAProcColorBalanceAutoSaturation && 110766304487373cf4ed335ba2614f00102dca837832Wang Kun balance->value == MAX_VPP_AUTO_PARAM) { 1108c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_saturation = 1; 110966304487373cf4ed335ba2614f00102dca837832Wang Kun } else if (balance->attrib == VAProcColorBalanceAutoBrightness && 111066304487373cf4ed335ba2614f00102dca837832Wang Kun balance->value == MAX_VPP_AUTO_PARAM) { 1111c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_brightness = 1; 1112c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } else { 1113d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The color_banlance do NOT support this attrib %d\n", 1114d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun balance->attrib); 1115c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 1116c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1117c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1118c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1119c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1120c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding /* check filter chain */ 112136b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 112266304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].color_balance_enabled != FILTER_ENABLED) { 1123d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The color_balance is DISABLE for %d format\n", res_set); 1124c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1125c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 112666304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 112766304487373cf4ed335ba2614f00102dca837832Wang Kun strength = MEDIUM_STRENGTH; 112866304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->enhancer_param, 112966304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].enhancer[res_set], 113066304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->enhancer_param)); 113166304487373cf4ed335ba2614f00102dca837832Wang Kun if (!enabled_saturation) 113266304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_ctx->enhancer_param.chroma_amm = 0; 113366304487373cf4ed335ba2614f00102dca837832Wang Kun if (!enabled_brightness) 113466304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_ctx->enhancer_param.luma_amm = 0; 1135c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1136c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1137c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1138c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1139c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterFrameRateConversion: 1140c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding frc = (VAProcFilterParameterBufferFrameRateConversion *)base; 1141c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1142c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding /* check frame rate */ 1143c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding ratio = frc->output_fps / (float)frc->input_fps; 1144c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1145c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (!((ratio == 2 || ratio == 2.5 || ratio == 4) && frc->output_fps <= 60)) { 1146d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The FRC do NOT support the ration(%f) and fps(%d)\n", 1147d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun ratio, frc->output_fps); 1148c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 1149c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1150c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1151c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1152c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding /* check the chain */ 115336b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 115466304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].frc_enabled != FILTER_ENABLED) { 1155d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The FRC is DISABLE for %d format\n", res_set); 1156c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1157c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1158c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1159c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1160c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1161c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding default: 1162d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "Do NOT support the filter type %d\n", base->type); 1163c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 1164c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1165c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 11668e9a21e730449c10cac6e6f69d255611c93f63c2hding } 11678e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 11688e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "no HW support\n"); 11698e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 11708e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 11718e9a21e730449c10cac6e6f69d255611c93f63c2hding } 11728e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr: 11738e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 11748e9a21e730449c10cac6e6f69d255611c93f63c2hding} 11758e9a21e730449c10cac6e6f69d255611c93f63c2hding 11768e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_pipeline(context_VPP_p ctx) 11778e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 11788e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 11798e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; 11808e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcPipelineParameterBuffer *cell_pipeline_param = (struct VssProcPipelineParameterBuffer *)cmdbuf->pipeline_param_p; 1181fc84bd8b6852aff0a3f70c4f21533ce36e1937behding unsigned int i, j, filter_count, check_filter = 0; 11828e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferBase *cur_param; 11838e9a21e730449c10cac6e6f69d255611c93f63c2hding enum VssProcFilterType tmp; 11848e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_driver_data_p driver_data = ctx->obj_context->driver_data; 11858e9a21e730449c10cac6e6f69d255611c93f63c2hding 11868e9a21e730449c10cac6e6f69d255611c93f63c2hding /* init pipeline cmd */ 11878e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < VssProcPipelineMaxNumFilters; ++i) 11888e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[i] = -1; 11898e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->num_filters = 0; 11908e9a21e730449c10cac6e6f69d255611c93f63c2hding 11918e9a21e730449c10cac6e6f69d255611c93f63c2hding filter_count = 0; 11928e9a21e730449c10cac6e6f69d255611c93f63c2hding 11938e9a21e730449c10cac6e6f69d255611c93f63c2hding /* store filter buffer object */ 11948e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->num_filters != 0) { 11958e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < ctx->num_filters; ++i) 11968e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filter_buf[i] = BUFFER(ctx->filters[i]); 11978e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 11988e9a21e730449c10cac6e6f69d255611c93f63c2hding goto finished; 11998e9a21e730449c10cac6e6f69d255611c93f63c2hding } 12008e9a21e730449c10cac6e6f69d255611c93f63c2hding 12018e9a21e730449c10cac6e6f69d255611c93f63c2hding /* loop the filter, set correct pipeline param for FW */ 12028e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < ctx->num_filters; ++i) { 12038e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_param = (VAProcFilterParameterBufferBase *)ctx->filter_buf[i]->buffer_data; 12048e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (cur_param->type) { 12058e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNone: 12068e9a21e730449c10cac6e6f69d255611c93f63c2hding goto finished; 12078e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 12088e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNoiseReduction: 1209fc84bd8b6852aff0a3f70c4f21533ce36e1937behding case VAProcFilterDeblocking: 12108e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterDenoise; 1211fc84bd8b6852aff0a3f70c4f21533ce36e1937behding check_filter++; 12128e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 12138e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterSharpening: 12148e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterSharpening; 12158e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 1216c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 12178e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterColorEnhancement; 12188e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 12198e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterFrameRateConversion: 12208e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterFrameRateConversion; 12218e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 12228e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 12238e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = -1; 12248e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 12258e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 12268e9a21e730449c10cac6e6f69d255611c93f63c2hding } 12278e9a21e730449c10cac6e6f69d255611c93f63c2hding } 12288e9a21e730449c10cac6e6f69d255611c93f63c2hding 1229fc84bd8b6852aff0a3f70c4f21533ce36e1937behding /* Denoise and Deblock is alternative */ 1230fc84bd8b6852aff0a3f70c4f21533ce36e1937behding if (check_filter >= 2) { 1231fc84bd8b6852aff0a3f70c4f21533ce36e1937behding drv_debug_msg(VIDEO_DEBUG_ERROR, "Denoise and Deblock is alternative!\n"); 1232fc84bd8b6852aff0a3f70c4f21533ce36e1937behding cell_pipeline_param->filter_pipeline[filter_count++] = -1; 1233fc84bd8b6852aff0a3f70c4f21533ce36e1937behding vaStatus = VA_STATUS_ERROR_UNKNOWN; 1234fc84bd8b6852aff0a3f70c4f21533ce36e1937behding goto out; 1235fc84bd8b6852aff0a3f70c4f21533ce36e1937behding } 1236fc84bd8b6852aff0a3f70c4f21533ce36e1937behding 12378e9a21e730449c10cac6e6f69d255611c93f63c2hdingfinished: 12388e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->num_filters = filter_count; 12398e9a21e730449c10cac6e6f69d255611c93f63c2hding 12408e9a21e730449c10cac6e6f69d255611c93f63c2hding /* reorder */ 12418e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 1; i < filter_count; ++i) 12428e9a21e730449c10cac6e6f69d255611c93f63c2hding for (j = i; j > 0; --j) 12438e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cell_pipeline_param->filter_pipeline[j] < cell_pipeline_param->filter_pipeline[j - 1]) { 12448e9a21e730449c10cac6e6f69d255611c93f63c2hding /* swap */ 12458e9a21e730449c10cac6e6f69d255611c93f63c2hding tmp = cell_pipeline_param->filter_pipeline[j]; 12468e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[j] = cell_pipeline_param->filter_pipeline[j - 1]; 12478e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[j - 1] = tmp; 12488e9a21e730449c10cac6e6f69d255611c93f63c2hding } 12498e9a21e730449c10cac6e6f69d255611c93f63c2hding 12508e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_insert_command(cmdbuf, &cmdbuf->param_mem, VssProcPipelineParameterCommand, 12518e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pipeline_param_offset, sizeof(struct VssProcPipelineParameterBuffer)); 12528e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 12538e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 12548e9a21e730449c10cac6e6f69d255611c93f63c2hding} 12558e9a21e730449c10cac6e6f69d255611c93f63c2hding 12568e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_filter_param(context_VPP_p ctx) 12578e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 12588e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 12598e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; 12608e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcDenoiseParameterBuffer *cell_denoiser_param = (struct VssProcDenoiseParameterBuffer *)cmdbuf->denoise_param_p; 12618e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcColorEnhancementParameterBuffer *cell_enhancer_param = (struct VssProcColorEnhancementParameterBuffer *)cmdbuf->enhancer_param_p; 12628e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcSharpenParameterBuffer *cell_sharpen_param = (struct VssProcSharpenParameterBuffer *)cmdbuf->sharpen_param_p; 12638e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcFrcParameterBuffer *cell_proc_frc_param = (struct VssProcFrcParameterBuffer *)cmdbuf->frc_param_p; 12648e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferBase *cur_param = NULL; 12658e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferFrameRateConversion *frc_param = NULL; 12668e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int i; 12678e9a21e730449c10cac6e6f69d255611c93f63c2hding float ratio; 12688e9a21e730449c10cac6e6f69d255611c93f63c2hding 12698e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < ctx->num_filters; ++i) { 12708e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_param = (VAProcFilterParameterBufferBase *)ctx->filter_buf[i]->buffer_data; 12718e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (cur_param->type) { 12728e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterDeblocking: 127366304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_denoiser_param, 127466304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->denoise_deblock_param, 127566304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->denoise_deblock_param)); 12768e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_denoiser_param->type = VssProcDeblock; 127766304487373cf4ed335ba2614f00102dca837832Wang Kun 127866304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 127966304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 128066304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcDenoiseParameterCommand, 128166304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->denoise_param_offset, 128266304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcDenoiseParameterBuffer)); 12838e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 12848e9a21e730449c10cac6e6f69d255611c93f63c2hding 12858e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNoiseReduction: 128666304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_denoiser_param, 128766304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->denoise_deblock_param, 128866304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->denoise_deblock_param)); 12898e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_denoiser_param->type = VssProcDegrain; 129066304487373cf4ed335ba2614f00102dca837832Wang Kun 129166304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 129266304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 129366304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcDenoiseParameterCommand, 129466304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->denoise_param_offset, 129566304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcDenoiseParameterBuffer)); 12968e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 12978e9a21e730449c10cac6e6f69d255611c93f63c2hding 12988e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterSharpening: 129966304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_sharpen_param, 130066304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->sharpen_param, 130166304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->sharpen_param)); 130266304487373cf4ed335ba2614f00102dca837832Wang Kun 130366304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 130466304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 130566304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcSharpenParameterCommand, 130666304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->sharpen_param_offset, 130766304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcSharpenParameterBuffer)); 13088e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13098e9a21e730449c10cac6e6f69d255611c93f63c2hding 1310c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 131166304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_enhancer_param, 131266304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->enhancer_param, 131366304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->enhancer_param)); 13145d69fca537b4dd301c586b988129305fa60f1c06Wang Kun 131566304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 131666304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 131766304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcColorEnhancementParameterCommand, 131866304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->enhancer_param_offset, 131966304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcColorEnhancementParameterBuffer)); 13208e9a21e730449c10cac6e6f69d255611c93f63c2hding 13218e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13228e9a21e730449c10cac6e6f69d255611c93f63c2hding 13238e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterFrameRateConversion: 13248e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_buf = ctx->filter_buf[i]; 13258e9a21e730449c10cac6e6f69d255611c93f63c2hding 13268e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_param = (VAProcFilterParameterBufferFrameRateConversion *)ctx->filter_buf[i]->buffer_data; 13278e9a21e730449c10cac6e6f69d255611c93f63c2hding ratio = frc_param->output_fps / (float)frc_param->input_fps; 13288e9a21e730449c10cac6e6f69d255611c93f63c2hding 13298e9a21e730449c10cac6e6f69d255611c93f63c2hding /* fixed to use medium quality */ 13308e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->quality = VssFrcMediumQuality; 13318e9a21e730449c10cac6e6f69d255611c93f63c2hding /* cell_proc_frc_param->quality = VssFrcHighQuality; */ 13328e9a21e730449c10cac6e6f69d255611c93f63c2hding 133366304487373cf4ed335ba2614f00102dca837832Wang Kun /* check if the input fps is in the range of HW capability */ 13348e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ratio == 2) 13358e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->conversion_rate = VssFrc2xConversionRate; 13368e9a21e730449c10cac6e6f69d255611c93f63c2hding else if (ratio == 2.5) 13378e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->conversion_rate = VssFrc2_5xConversionRate; 13388e9a21e730449c10cac6e6f69d255611c93f63c2hding else if (ratio == 4) 13398e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->conversion_rate = VssFrc4xConversionRate; 13405d69fca537b4dd301c586b988129305fa60f1c06Wang Kun else if (ratio == 1.25) 13415d69fca537b4dd301c586b988129305fa60f1c06Wang Kun cell_proc_frc_param->conversion_rate = VssFrc1_25xConversionRate; 13428e9a21e730449c10cac6e6f69d255611c93f63c2hding else { 13438e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid frame rate conversion ratio %f \n", ratio); 13448e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 13458e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 13468e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13478e9a21e730449c10cac6e6f69d255611c93f63c2hding 134866304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 134966304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 135066304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcFrcParameterCommand, 135166304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->frc_param_offset, 135266304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcFrcParameterBuffer)); 13538e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13548e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 13558e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 13568e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 13578e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13588e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13598e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 13608e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 13618e9a21e730449c10cac6e6f69d255611c93f63c2hding} 136266304487373cf4ed335ba2614f00102dca837832Wang Kun 136366304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_resolution(int width, int height) 136466304487373cf4ed335ba2614f00102dca837832Wang Kun{ 136566304487373cf4ed335ba2614f00102dca837832Wang Kun int ret; 136666304487373cf4ed335ba2614f00102dca837832Wang Kun int image_area; 136766304487373cf4ed335ba2614f00102dca837832Wang Kun 136866304487373cf4ed335ba2614f00102dca837832Wang Kun if (height < 96 || height > 1080) 136966304487373cf4ed335ba2614f00102dca837832Wang Kun return NOT_SUPPORTED_RESOLUTION; 137066304487373cf4ed335ba2614f00102dca837832Wang Kun 137166304487373cf4ed335ba2614f00102dca837832Wang Kun image_area = height * width; 137266304487373cf4ed335ba2614f00102dca837832Wang Kun 137366304487373cf4ed335ba2614f00102dca837832Wang Kun if (image_area <= QVGA_AREA) 137466304487373cf4ed335ba2614f00102dca837832Wang Kun ret = QCIF_TO_QVGA; 137566304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= VGA_AREA) 137666304487373cf4ed335ba2614f00102dca837832Wang Kun ret = QVGA_TO_VGA; 137766304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= SD_AREA) 137866304487373cf4ed335ba2614f00102dca837832Wang Kun ret = VGA_TO_SD; 137966304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= HD720P_AREA) 138066304487373cf4ed335ba2614f00102dca837832Wang Kun ret = SD_TO_720P; 138166304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= HD1080P_AREA) 138266304487373cf4ed335ba2614f00102dca837832Wang Kun ret = HD720P_TO_1080P; 138366304487373cf4ed335ba2614f00102dca837832Wang Kun else 138466304487373cf4ed335ba2614f00102dca837832Wang Kun ret = NOT_SUPPORTED_RESOLUTION; 138566304487373cf4ed335ba2614f00102dca837832Wang Kun 138666304487373cf4ed335ba2614f00102dca837832Wang Kun return ret; 138766304487373cf4ed335ba2614f00102dca837832Wang Kun} 138866304487373cf4ed335ba2614f00102dca837832Wang Kun 138966304487373cf4ed335ba2614f00102dca837832Wang Kun/* 139066304487373cf4ed335ba2614f00102dca837832Wang Kun * The strength area is: 139166304487373cf4ed335ba2614f00102dca837832Wang Kun * 139266304487373cf4ed335ba2614f00102dca837832Wang Kun * 0______33______66______100 139366304487373cf4ed335ba2614f00102dca837832Wang Kun * LOW MED HIGH 139466304487373cf4ed335ba2614f00102dca837832Wang Kun * 139566304487373cf4ed335ba2614f00102dca837832Wang Kun * MIN=0; MAX=100; STEP=33 139666304487373cf4ed335ba2614f00102dca837832Wang Kun */ 139766304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_vpp_strength(int value) 139866304487373cf4ed335ba2614f00102dca837832Wang Kun{ 139966304487373cf4ed335ba2614f00102dca837832Wang Kun if (value < MIN_VPP_PARAM || value > MAX_VPP_PARAM) 140066304487373cf4ed335ba2614f00102dca837832Wang Kun return INVALID_STRENGTH; 140166304487373cf4ed335ba2614f00102dca837832Wang Kun 140266304487373cf4ed335ba2614f00102dca837832Wang Kun if (value >= MIN_VPP_PARAM && 140366304487373cf4ed335ba2614f00102dca837832Wang Kun value < MIN_VPP_PARAM + STEP_VPP_PARAM) 140466304487373cf4ed335ba2614f00102dca837832Wang Kun return LOW_STRENGTH; 140566304487373cf4ed335ba2614f00102dca837832Wang Kun else if (value >= MIN_VPP_PARAM + STEP_VPP_PARAM && 140666304487373cf4ed335ba2614f00102dca837832Wang Kun value < MIN_VPP_PARAM + 2 * STEP_VPP_PARAM) 140766304487373cf4ed335ba2614f00102dca837832Wang Kun return MEDIUM_STRENGTH; 140866304487373cf4ed335ba2614f00102dca837832Wang Kun else 140966304487373cf4ed335ba2614f00102dca837832Wang Kun return HIGH_STRENGTH; 141066304487373cf4ed335ba2614f00102dca837832Wang Kun} 1411