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: 11d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel * 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. 15d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel * 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" 34e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun#include "vsp_compose.h" 358e9a21e730449c10cac6e6f69d255611c93f63c2hding 365526ee6314de2723fa8f651dec2ff337e4c7a7daElliott Hughes#include <strings.h> 377d8048d2853335f06ddd71539830cfc2a270585eElliott Hughes 388e9a21e730449c10cac6e6f69d255611c93f63c2hding#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData; 398e9a21e730449c10cac6e6f69d255611c93f63c2hding#define INIT_CONTEXT_VPP context_VPP_p ctx = (context_VPP_p) obj_context->format_data; 408e9a21e730449c10cac6e6f69d255611c93f63c2hding#define CONFIG(id) ((object_config_p) object_heap_lookup( &driver_data->config_heap, id )) 418e9a21e730449c10cac6e6f69d255611c93f63c2hding#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id )) 428e9a21e730449c10cac6e6f69d255611c93f63c2hding#define BUFFER(id) ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id )) 438e9a21e730449c10cac6e6f69d255611c93f63c2hding 448e9a21e730449c10cac6e6f69d255611c93f63c2hding#define SURFACE(id) ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id )) 458e9a21e730449c10cac6e6f69d255611c93f63c2hding 468e9a21e730449c10cac6e6f69d255611c93f63c2hding#define KB 1024 478e9a21e730449c10cac6e6f69d255611c93f63c2hding#define MB (KB * KB) 483a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun#define VSP_CONTEXT_BUF_SIZE (60*KB) 493a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun#define VSP_INTERMEDIATE_BUF_SIZE (29*MB) 508e9a21e730449c10cac6e6f69d255611c93f63c2hding 5166304487373cf4ed335ba2614f00102dca837832Wang Kun#define MAX_VPP_PARAM (100) 5266304487373cf4ed335ba2614f00102dca837832Wang Kun#define MIN_VPP_PARAM (0) 5366304487373cf4ed335ba2614f00102dca837832Wang Kun#define STEP_VPP_PARAM (33) 5466304487373cf4ed335ba2614f00102dca837832Wang Kun#define MAX_VPP_AUTO_PARAM (1) 5566304487373cf4ed335ba2614f00102dca837832Wang Kun#define MIN_VPP_AUTO_PARAM (0) 5666304487373cf4ed335ba2614f00102dca837832Wang Kun#define STEP_VPP_AUTO_PARAM (1) 5766304487373cf4ed335ba2614f00102dca837832Wang Kun 588e9a21e730449c10cac6e6f69d255611c93f63c2hding#define VSP_FORWARD_REF_NUM 3 598e9a21e730449c10cac6e6f69d255611c93f63c2hding 60c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding#define VSP_COLOR_ENHANCE_FEATURES 2 61c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 628e9a21e730449c10cac6e6f69d255611c93f63c2hding#define ALIGN_TO_128(value) ((value + 128 - 1) & ~(128 - 1)) 6376777b6108cd39192cba113f96b04b98eee39c73Wang Kun#define ALIGN_TO_16(value) ((value + 16 - 1) & ~(16 - 1)) 648e9a21e730449c10cac6e6f69d255611c93f63c2hding 6566304487373cf4ed335ba2614f00102dca837832Wang Kun#define QVGA_AREA (320 * 240) 6666304487373cf4ed335ba2614f00102dca837832Wang Kun#define VGA_AREA (640 * 480) 6766304487373cf4ed335ba2614f00102dca837832Wang Kun#define SD_AREA (720 * 576) 6866304487373cf4ed335ba2614f00102dca837832Wang Kun#define HD720P_AREA (1280 * 720) 6976777b6108cd39192cba113f96b04b98eee39c73Wang Kun#define HD1080P_AREA (1920 * 1088) 7076777b6108cd39192cba113f96b04b98eee39c73Wang Kun 7176777b6108cd39192cba113f96b04b98eee39c73Wang Kun#define MIN_SUPPORTED_HEIGHT 96 7276777b6108cd39192cba113f96b04b98eee39c73Wang Kun#define MAX_SUPPORTED_HEIGHT 1088 7366304487373cf4ed335ba2614f00102dca837832Wang Kun 74d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun/** 75d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * The number of supported filter is 5: 76d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterDeblocking 77d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterNoiseReduction 78d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterSharpening 79d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterColorBalance 80d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterFrameRateConversion 81d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun */ 82d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun#define VSP_SUPPORTED_FILTERS_NUM 5 83d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun 84d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun/* The size of supported color standard */ 85d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun#define COLOR_STANDARDS_NUM 1 86d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun 87c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingenum resolution_set { 8866304487373cf4ed335ba2614f00102dca837832Wang Kun NOT_SUPPORTED_RESOLUTION = -1, 8966304487373cf4ed335ba2614f00102dca837832Wang Kun QCIF_TO_QVGA = 0, 9066304487373cf4ed335ba2614f00102dca837832Wang Kun QVGA_TO_VGA, 9166304487373cf4ed335ba2614f00102dca837832Wang Kun VGA_TO_SD, 9266304487373cf4ed335ba2614f00102dca837832Wang Kun SD_TO_720P, 9366304487373cf4ed335ba2614f00102dca837832Wang Kun HD720P_TO_1080P, 94c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding RESOLUTION_SET_NUM 95c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding}; 96c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 97c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingstruct vpp_chain_capability { 98c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int frc_enabled; 99c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int sharpen_enabled; 100c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int color_balance_enabled; 101c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int denoise_enabled; 102c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int deblock_enabled; 103c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding}; 104c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 105c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingenum filter_status { 106c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding FILTER_DISABLED = 0, 107c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding FILTER_ENABLED 108c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding}; 109c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 110c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingstruct vpp_chain_capability vpp_chain_caps[RESOLUTION_SET_NUM] = { 11166304487373cf4ed335ba2614f00102dca837832Wang Kun [HD720P_TO_1080P] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_DISABLED, FILTER_DISABLED}, 11266304487373cf4ed335ba2614f00102dca837832Wang Kun [SD_TO_720P] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_DISABLED, FILTER_DISABLED}, 11366304487373cf4ed335ba2614f00102dca837832Wang Kun [VGA_TO_SD] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_DISABLED, FILTER_DISABLED}, 11466304487373cf4ed335ba2614f00102dca837832Wang Kun [QVGA_TO_VGA] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED}, 11566304487373cf4ed335ba2614f00102dca837832Wang Kun [QCIF_TO_QVGA] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_ENABLED} 11666304487373cf4ed335ba2614f00102dca837832Wang Kun}; 11766304487373cf4ed335ba2614f00102dca837832Wang Kun 11866304487373cf4ed335ba2614f00102dca837832Wang Kunstruct filter_strength { 11966304487373cf4ed335ba2614f00102dca837832Wang Kun struct VssProcDenoiseParameterBuffer denoise_deblock[RESOLUTION_SET_NUM]; 12066304487373cf4ed335ba2614f00102dca837832Wang Kun struct VssProcColorEnhancementParameterBuffer enhancer[RESOLUTION_SET_NUM]; 12166304487373cf4ed335ba2614f00102dca837832Wang Kun struct VssProcSharpenParameterBuffer sharpen[RESOLUTION_SET_NUM]; 12266304487373cf4ed335ba2614f00102dca837832Wang Kun}; 123d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel 12466304487373cf4ed335ba2614f00102dca837832Wang Kunenum filter_strength_type { 12566304487373cf4ed335ba2614f00102dca837832Wang Kun INVALID_STRENGTH = -1, 12666304487373cf4ed335ba2614f00102dca837832Wang Kun LOW_STRENGTH = 0, 12766304487373cf4ed335ba2614f00102dca837832Wang Kun MEDIUM_STRENGTH, 12866304487373cf4ed335ba2614f00102dca837832Wang Kun HIGH_STRENGTH, 12966304487373cf4ed335ba2614f00102dca837832Wang Kun STRENGTH_NUM 13066304487373cf4ed335ba2614f00102dca837832Wang Kun}; 13166304487373cf4ed335ba2614f00102dca837832Wang Kun 13266304487373cf4ed335ba2614f00102dca837832Wang Kun#define SHARPEN_ON (1) 13366304487373cf4ed335ba2614f00102dca837832Wang Kun 13466304487373cf4ed335ba2614f00102dca837832Wang Kunstruct filter_strength vpp_strength[STRENGTH_NUM] = { 13566304487373cf4ed335ba2614f00102dca837832Wang Kun [LOW_STRENGTH] = { 1364b8982ecb6744203ae0b5381942d72a518539661Wang Kun /* structure: 1374b8982ecb6744203ae0b5381942d72a518539661Wang Kun * type(0-Denoise,1-Deblock), value_thr, cnt_thr, coef, temp_thr1, temp_thr2, _pad[2] 1384b8982ecb6744203ae0b5381942d72a518539661Wang Kun */ 13966304487373cf4ed335ba2614f00102dca837832Wang Kun .denoise_deblock = { 140b35344f5c0b8568df0630efe9fce076e810de8d3ywan [QCIF_TO_QVGA] = {1, 15, 47, 35, 0, 0, {0, 0}}, 141b35344f5c0b8568df0630efe9fce076e810de8d3ywan [QVGA_TO_VGA] = {0, 7, 48, 47, 0, 0, {0, 0}}, 142b35344f5c0b8568df0630efe9fce076e810de8d3ywan [VGA_TO_SD] = {0, 10, 8, 9, 1, 3, {0, 0}}, 143b35344f5c0b8568df0630efe9fce076e810de8d3ywan [SD_TO_720P] = {0, 10, 48, 47, 0, 0, {0, 0}}, 144b35344f5c0b8568df0630efe9fce076e810de8d3ywan [HD720P_TO_1080P] = {0, 10, 48, 47, 0, 0, {0, 0}} 14566304487373cf4ed335ba2614f00102dca837832Wang Kun }, 1464b8982ecb6744203ae0b5381942d72a518539661Wang Kun /* structure: 1474b8982ecb6744203ae0b5381942d72a518539661Wang Kun * temp_detect, temp_correct, clip_thr, mid_thr, luma_amm, chroma_amm, _pad[2] 1484b8982ecb6744203ae0b5381942d72a518539661Wang Kun */ 14966304487373cf4ed335ba2614f00102dca837832Wang Kun .enhancer = { 150b35344f5c0b8568df0630efe9fce076e810de8d3ywan [QCIF_TO_QVGA] = {200, 100, 1, 42, 40, 60, {0, 0}}, 151b35344f5c0b8568df0630efe9fce076e810de8d3ywan [QVGA_TO_VGA] = {220, 180, 1, 42, 40, 60, {0, 0}}, 152b35344f5c0b8568df0630efe9fce076e810de8d3ywan [VGA_TO_SD] = {220, 200, 1, 42, 40, 60, {0, 0}}, 153b35344f5c0b8568df0630efe9fce076e810de8d3ywan [SD_TO_720P] = {100, 100, 5, 33, 0, 0, {0, 0}}, 154b35344f5c0b8568df0630efe9fce076e810de8d3ywan [HD720P_TO_1080P] = {100, 100, 5, 33, 0, 0, {0, 0}} 15566304487373cf4ed335ba2614f00102dca837832Wang Kun }, 15666304487373cf4ed335ba2614f00102dca837832Wang Kun .sharpen = { 1574b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = { .quality = SHARPEN_ON }, 1584b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = { .quality = SHARPEN_ON }, 1594b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = { .quality = SHARPEN_ON }, 1604b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = { .quality = SHARPEN_ON }, 16166304487373cf4ed335ba2614f00102dca837832Wang Kun [HD720P_TO_1080P] = { .quality = SHARPEN_ON } 16266304487373cf4ed335ba2614f00102dca837832Wang Kun } 16366304487373cf4ed335ba2614f00102dca837832Wang Kun }, 16466304487373cf4ed335ba2614f00102dca837832Wang Kun [MEDIUM_STRENGTH] = { 16566304487373cf4ed335ba2614f00102dca837832Wang Kun .denoise_deblock = { 166b35344f5c0b8568df0630efe9fce076e810de8d3ywan [QCIF_TO_QVGA] = {1, 25, 47, 12, 0, 0, {0, 0}}, 167b35344f5c0b8568df0630efe9fce076e810de8d3ywan [QVGA_TO_VGA] = {0, 10, 48, 47, 0, 0, {0, 0}}, 168b35344f5c0b8568df0630efe9fce076e810de8d3ywan [VGA_TO_SD] = {0, 20, 8, 9, 2, 4, {0, 0}}, 169b35344f5c0b8568df0630efe9fce076e810de8d3ywan [SD_TO_720P] = {0, 10, 48, 47, 0, 0, {0, 0}}, 170b35344f5c0b8568df0630efe9fce076e810de8d3ywan [HD720P_TO_1080P] = {0, 10, 48, 47, 0, 0, {0, 0}} 17166304487373cf4ed335ba2614f00102dca837832Wang Kun }, 17266304487373cf4ed335ba2614f00102dca837832Wang Kun .enhancer = { 173b35344f5c0b8568df0630efe9fce076e810de8d3ywan [QCIF_TO_QVGA] = {100, 100, 1, 33, 100, 100, {0, 0}}, 174b35344f5c0b8568df0630efe9fce076e810de8d3ywan [QVGA_TO_VGA] = {100, 180, 1, 33, 100, 100, {0, 0}}, 175b35344f5c0b8568df0630efe9fce076e810de8d3ywan [VGA_TO_SD] = {100, 200, 1, 33, 100, 100, {0, 0}}, 176b35344f5c0b8568df0630efe9fce076e810de8d3ywan [SD_TO_720P] = {100, 100, 5, 33, 0, 0, {0, 0}}, 177b35344f5c0b8568df0630efe9fce076e810de8d3ywan [HD720P_TO_1080P] = {100, 100, 5, 33, 0, 0, {0, 0}} 17866304487373cf4ed335ba2614f00102dca837832Wang Kun }, 17966304487373cf4ed335ba2614f00102dca837832Wang Kun .sharpen = { 1804b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = { .quality = SHARPEN_ON }, 1814b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = { .quality = SHARPEN_ON }, 1824b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = { .quality = SHARPEN_ON }, 1834b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = { .quality = SHARPEN_ON }, 18466304487373cf4ed335ba2614f00102dca837832Wang Kun [HD720P_TO_1080P] = { .quality = SHARPEN_ON } 18566304487373cf4ed335ba2614f00102dca837832Wang Kun } 18666304487373cf4ed335ba2614f00102dca837832Wang Kun }, 18766304487373cf4ed335ba2614f00102dca837832Wang Kun [HIGH_STRENGTH] = { 18866304487373cf4ed335ba2614f00102dca837832Wang Kun .denoise_deblock = { 189b35344f5c0b8568df0630efe9fce076e810de8d3ywan [QCIF_TO_QVGA] = {1, 30, 40, 10, 0, 0, {0, 0}}, 190b35344f5c0b8568df0630efe9fce076e810de8d3ywan [QVGA_TO_VGA] = {0, 15, 45, 25, 0, 0, {0, 0}}, 191b35344f5c0b8568df0630efe9fce076e810de8d3ywan [VGA_TO_SD] = {0, 20, 7, 5, 3, 6, {0, 0}}, 192b35344f5c0b8568df0630efe9fce076e810de8d3ywan [SD_TO_720P] = {0, 10, 48, 47, 0, 0, {0, 0}}, 193b35344f5c0b8568df0630efe9fce076e810de8d3ywan [HD720P_TO_1080P] = {0, 10, 48, 47, 0, 0, {0, 0}} 19466304487373cf4ed335ba2614f00102dca837832Wang Kun }, 19566304487373cf4ed335ba2614f00102dca837832Wang Kun .enhancer = { 196b35344f5c0b8568df0630efe9fce076e810de8d3ywan [QCIF_TO_QVGA] = {100, 100, 5, 33, 150, 200, {0, 0}}, 197b35344f5c0b8568df0630efe9fce076e810de8d3ywan [QVGA_TO_VGA] = {100, 180, 5, 33, 150, 200, {0, 0}}, 198b35344f5c0b8568df0630efe9fce076e810de8d3ywan [VGA_TO_SD] = {100, 200, 5, 33, 100, 150, {0, 0}}, 199b35344f5c0b8568df0630efe9fce076e810de8d3ywan [SD_TO_720P] = {100, 100, 5, 33, 0, 0, {0, 0}}, 200b35344f5c0b8568df0630efe9fce076e810de8d3ywan [HD720P_TO_1080P] = {100, 100, 5, 33, 0, 0, {0, 0}} 20166304487373cf4ed335ba2614f00102dca837832Wang Kun }, 20266304487373cf4ed335ba2614f00102dca837832Wang Kun .sharpen = { 2034b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = { .quality = SHARPEN_ON }, 2044b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = { .quality = SHARPEN_ON }, 2054b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = { .quality = SHARPEN_ON }, 2064b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = { .quality = SHARPEN_ON }, 20766304487373cf4ed335ba2614f00102dca837832Wang Kun [HD720P_TO_1080P] = { .quality = SHARPEN_ON } 20866304487373cf4ed335ba2614f00102dca837832Wang Kun } 20966304487373cf4ed335ba2614f00102dca837832Wang Kun } 210c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding}; 211c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 2128e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic void vsp_VPP_DestroyContext(object_context_p obj_context); 2138e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_pipeline(context_VPP_p ctx); 2148e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_filter_param(context_VPP_p ctx); 2158e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp__VPP_check_legal_picture(object_context_p obj_context, object_config_p obj_config); 21666304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_resolution(int width, int height); 21766304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_vpp_strength(int value); 2188e9a21e730449c10cac6e6f69d255611c93f63c2hding 2198e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic void vsp_VPP_QueryConfigAttributes( 220b35344f5c0b8568df0630efe9fce076e810de8d3ywan VAProfile __maybe_unused profile, 221b35344f5c0b8568df0630efe9fce076e810de8d3ywan VAEntrypoint __maybe_unused entrypoint, 222b35344f5c0b8568df0630efe9fce076e810de8d3ywan VAConfigAttrib __maybe_unused *attrib_list, 223b35344f5c0b8568df0630efe9fce076e810de8d3ywan int __maybe_unused num_attribs) 2248e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2258e9a21e730449c10cac6e6f69d255611c93f63c2hding /* No VPP specific attributes */ 2268e9a21e730449c10cac6e6f69d255611c93f63c2hding return; 2278e9a21e730449c10cac6e6f69d255611c93f63c2hding} 2288e9a21e730449c10cac6e6f69d255611c93f63c2hding 2298e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_ValidateConfig( 2308e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config) 2318e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2328e9a21e730449c10cac6e6f69d255611c93f63c2hding int i; 2338e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Check all attributes */ 2348e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < obj_config->attrib_count; i++) { 2358e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (obj_config->attrib_list[i].type) { 2368e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAConfigAttribRTFormat: 2378e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Ignore */ 2388e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 2398e9a21e730449c10cac6e6f69d255611c93f63c2hding 2408e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 2418e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED; 2428e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2438e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2448e9a21e730449c10cac6e6f69d255611c93f63c2hding 2458e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_SUCCESS; 2468e9a21e730449c10cac6e6f69d255611c93f63c2hding} 2478e9a21e730449c10cac6e6f69d255611c93f63c2hding 2488e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp__VPP_check_legal_picture(object_context_p obj_context, object_config_p obj_config) 2498e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2508e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 2518e9a21e730449c10cac6e6f69d255611c93f63c2hding 2528e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 2538e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 2548e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 2558e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2568e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2578e9a21e730449c10cac6e6f69d255611c93f63c2hding 2588e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 2598e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 2608e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 2618e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2628e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2638e9a21e730449c10cac6e6f69d255611c93f63c2hding 2648e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2658e9a21e730449c10cac6e6f69d255611c93f63c2hding} 2668e9a21e730449c10cac6e6f69d255611c93f63c2hding 2678e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_CreateContext( 2688e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context, 2698e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config) 2708e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2718e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 2728e9a21e730449c10cac6e6f69d255611c93f63c2hding context_VPP_p ctx; 2738e9a21e730449c10cac6e6f69d255611c93f63c2hding int i; 2748e9a21e730449c10cac6e6f69d255611c93f63c2hding 2758e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Validate flag */ 2768e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Validate picture dimensions */ 2778e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = vsp__VPP_check_legal_picture(obj_context, obj_config); 2788e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VA_STATUS_SUCCESS != vaStatus) { 2798e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 2808e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2818e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2828e9a21e730449c10cac6e6f69d255611c93f63c2hding 2838e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx = (context_VPP_p) calloc(1, sizeof(struct context_VPP_s)); 2848e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == ctx) { 2858e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 2868e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 2878e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2888e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2898e9a21e730449c10cac6e6f69d255611c93f63c2hding 2908e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filters = NULL; 2918e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->num_filters = 0; 2928e9a21e730449c10cac6e6f69d255611c93f63c2hding 2938e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_buf = NULL; 2948e9a21e730449c10cac6e6f69d255611c93f63c2hding 2958e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set size */ 2968e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz = 0; 2978e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pic_param_sz = ALIGN_TO_128(sizeof(struct VssProcPictureParameterBuffer)); 2988e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->pic_param_sz; 2998e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->end_param_sz = ALIGN_TO_128(sizeof(struct VssProcPictureParameterBuffer)); 3008e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->end_param_sz; 3018e9a21e730449c10cac6e6f69d255611c93f63c2hding 3028e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pipeline_param_sz = ALIGN_TO_128(sizeof(struct VssProcPipelineParameterBuffer)); 3038e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->pipeline_param_sz; 3048e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->denoise_param_sz = ALIGN_TO_128(sizeof(struct VssProcDenoiseParameterBuffer)); 3058e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->denoise_param_sz; 3068e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->enhancer_param_sz = ALIGN_TO_128(sizeof(struct VssProcColorEnhancementParameterBuffer)); 3078e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->enhancer_param_sz; 3088e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->sharpen_param_sz = ALIGN_TO_128(sizeof(struct VssProcSharpenParameterBuffer)); 3098e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->sharpen_param_sz; 3108e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_param_sz = ALIGN_TO_128(sizeof(struct VssProcFrcParameterBuffer)); 3118e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->frc_param_sz; 312e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun ctx->compose_param_sz = ALIGN_TO_128(sizeof(struct VssWiDi_ComposeSequenceParameterBuffer)); 313e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun ctx->param_sz += ctx->compose_param_sz; 3148e9a21e730449c10cac6e6f69d255611c93f63c2hding 3158e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set offset */ 3168e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pic_param_offset = 0; 3178e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->end_param_offset = ctx->pic_param_offset + ctx->pic_param_sz; 3188e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pipeline_param_offset = ctx->end_param_offset + ctx->end_param_sz; 3198e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->denoise_param_offset = ctx->pipeline_param_offset + ctx->pipeline_param_sz; 3208e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->enhancer_param_offset = ctx->denoise_param_offset + ctx->denoise_param_sz; 3218e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->sharpen_param_offset = ctx->enhancer_param_offset + ctx->enhancer_param_sz; 3228e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_param_offset = ctx->sharpen_param_offset + ctx->sharpen_param_sz; 323e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun /* For composer, it'll start on 0 */ 324e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun ctx->compose_param_offset = 0; 3258e9a21e730449c10cac6e6f69d255611c93f63c2hding 3263a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun /* create intermediate buffer */ 3273a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun ctx->intermediate_buf = (psb_buffer_p) calloc(1, sizeof(struct psb_buffer_s)); 3283a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun if (NULL == ctx->intermediate_buf) { 3293a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 3303a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun DEBUG_FAILURE; 3313a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun goto out; 3323a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun } 3333a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun vaStatus = psb_buffer_create(obj_context->driver_data, VSP_INTERMEDIATE_BUF_SIZE, psb_bt_vpu_only, ctx->intermediate_buf); 3348e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VA_STATUS_SUCCESS != vaStatus) { 3358e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 3368e9a21e730449c10cac6e6f69d255611c93f63c2hding } 337c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 3388e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context->format_data = (void*) ctx; 3398e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->obj_context = obj_context; 3408e9a21e730449c10cac6e6f69d255611c93f63c2hding 3418e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < obj_config->attrib_count; ++i) { 3428e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VAConfigAttribRTFormat == obj_config->attrib_list[i].type) { 3438e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (obj_config->attrib_list[i].value) { 3448e9a21e730449c10cac6e6f69d255611c93f63c2hding case VA_RT_FORMAT_YUV420: 3458e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->format = VSP_NV12; 3468e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 3478e9a21e730449c10cac6e6f69d255611c93f63c2hding case VA_RT_FORMAT_YUV422: 3488e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->format = VSP_NV16; 3498e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 3508e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->format = VSP_NV12; 3518e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 3528e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3538e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 3548e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3558e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3568e9a21e730449c10cac6e6f69d255611c93f63c2hding 35766304487373cf4ed335ba2614f00102dca837832Wang Kun bzero(&ctx->denoise_deblock_param, sizeof(ctx->denoise_deblock_param)); 35866304487373cf4ed335ba2614f00102dca837832Wang Kun bzero(&ctx->enhancer_param, sizeof(ctx->enhancer_param)); 35966304487373cf4ed335ba2614f00102dca837832Wang Kun bzero(&ctx->sharpen_param, sizeof(ctx->sharpen_param)); 36066304487373cf4ed335ba2614f00102dca837832Wang Kun 3618e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 3628e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 3638e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_VPP_DestroyContext(obj_context); 3648e9a21e730449c10cac6e6f69d255611c93f63c2hding 365c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (ctx) 366c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding free(ctx); 367c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 3688e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 3698e9a21e730449c10cac6e6f69d255611c93f63c2hding} 3708e9a21e730449c10cac6e6f69d255611c93f63c2hding 3718e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic void vsp_VPP_DestroyContext( 3728e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context) 3738e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 3748e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 3758e9a21e730449c10cac6e6f69d255611c93f63c2hding 3763a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun if (ctx->intermediate_buf) { 3773a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun psb_buffer_destroy(ctx->intermediate_buf); 3783a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun 3793a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun free(ctx->intermediate_buf); 3803a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun ctx->intermediate_buf = NULL; 3813a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun } 3823a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun 3838e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->filters) { 3848e9a21e730449c10cac6e6f69d255611c93f63c2hding free(ctx->filters); 3858e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->num_filters = 0; 3868e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3878e9a21e730449c10cac6e6f69d255611c93f63c2hding 3888e9a21e730449c10cac6e6f69d255611c93f63c2hding free(obj_context->format_data); 3898e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context->format_data = NULL; 3908e9a21e730449c10cac6e6f69d255611c93f63c2hding} 3918e9a21e730449c10cac6e6f69d255611c93f63c2hding 392208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kunstatic VAStatus vsp__VPP_process_pipeline_param(context_VPP_p ctx, object_context_p obj_context, object_buffer_p obj_buffer) 3938e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 3948e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 3958e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; 3968e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int i = 0; 3978e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcPipelineParameterBuffer *pipeline_param = (VAProcPipelineParameterBuffer *) obj_buffer->buffer_data; 3988e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcPictureParameterBuffer *cell_proc_picture_param = (struct VssProcPictureParameterBuffer *)cmdbuf->pic_param_p; 3998e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcPictureParameterBuffer *cell_end_param = (struct VssProcPictureParameterBuffer *)cmdbuf->end_param_p; 4008e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferFrameRateConversion *frc_param; 4018e9a21e730449c10cac6e6f69d255611c93f63c2hding object_surface_p input_surface = NULL; 4028e9a21e730449c10cac6e6f69d255611c93f63c2hding object_surface_p cur_output_surf = NULL; 403208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun unsigned int rotation_angle = 0, vsp_rotation_angle = 0; 404d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel unsigned int tiled = 0, width = 0, height = 0, stride = 0; 405208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun unsigned char *src_addr, *dest_addr; 406208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun struct psb_surface_s *output_surface; 407d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel psb_surface_share_info_p input_share_info = NULL; 408d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel psb_surface_share_info_p output_share_info = NULL; 40902f3955632048eb112d521f9c8e80ab2c911598aXigui Wang enum vsp_format format; 41002f3955632048eb112d521f9c8e80ab2c911598aXigui Wang 411d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel 412208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun psb_driver_data_p driver_data = obj_context->driver_data; 4138e9a21e730449c10cac6e6f69d255611c93f63c2hding 4148e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->surface_region != NULL) { 4158e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't scale\n"); 4168e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4178e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4188e9a21e730449c10cac6e6f69d255611c93f63c2hding } 419d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel 4208e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->output_region != NULL) { 4218e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't scale\n"); 4228e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4238e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4248e9a21e730449c10cac6e6f69d255611c93f63c2hding } 425d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel 426c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (pipeline_param->output_background_color != 0) { 427c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't support background color here\n"); 428c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 429c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto out; 430c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 4318e9a21e730449c10cac6e6f69d255611c93f63c2hding 4328e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->filters == NULL) { 4338e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filter setting filters = %p\n", pipeline_param->filters); 4348e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4358e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4368e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4378e9a21e730449c10cac6e6f69d255611c93f63c2hding 4388e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0 4398e9a21e730449c10cac6e6f69d255611c93f63c2hding /* for pass filter */ 4408e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->num_filters == 0 || pipeline_param->num_filters > VssProcPipelineMaxNumFilters) { 4418e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filter number = %d\n", pipeline_param->num_filters); 4428e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4438e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4448e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4458e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif 4468e9a21e730449c10cac6e6f69d255611c93f63c2hding 4478e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->forward_references == NULL) { 4488e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid forward_refereces %p setting\n", pipeline_param->forward_references); 4498e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4508e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4518e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4528e9a21e730449c10cac6e6f69d255611c93f63c2hding 4538e9a21e730449c10cac6e6f69d255611c93f63c2hding /* should we check it? since the begining it's not VSP_FORWARD_REF_NUM */ 4548e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->num_forward_references != VSP_FORWARD_REF_NUM) { 4558e9a21e730449c10cac6e6f69d255611c93f63c2hding 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); 4568e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4578e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4588e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4598e9a21e730449c10cac6e6f69d255611c93f63c2hding 460e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun /* first picture, need to setup the VSP context */ 461e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun if (ctx->obj_context->frame_count == 0) 462e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun vsp_cmdbuf_vpp_context(cmdbuf, VssGenInitializeContext, CONTEXT_VPP_ID, VSP_APP_ID_FRC_VPP); 463e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun 464e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun /* get the input surface */ 4658e9a21e730449c10cac6e6f69d255611c93f63c2hding if (!(pipeline_param->pipeline_flags & VA_PIPELINE_FLAG_END)) { 4668e9a21e730449c10cac6e6f69d255611c93f63c2hding input_surface = SURFACE(pipeline_param->surface); 4678e9a21e730449c10cac6e6f69d255611c93f63c2hding if (input_surface == NULL) { 4688e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input surface %x\n", pipeline_param->surface); 4698e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4708e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4718e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4728e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4738e9a21e730449c10cac6e6f69d255611c93f63c2hding input_surface = NULL; 4748e9a21e730449c10cac6e6f69d255611c93f63c2hding } 475e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun 4768e9a21e730449c10cac6e6f69d255611c93f63c2hding /* if it is the first pipeline command */ 4778e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->num_filters != ctx->num_filters || pipeline_param->num_filters == 0) { 4788e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->num_filters != 0) { 4798e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n"); 4808e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4818e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4828e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4838e9a21e730449c10cac6e6f69d255611c93f63c2hding /* save filters */ 4848e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->num_filters = pipeline_param->num_filters; 4858e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->num_filters == 0) { 4868e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filters = NULL; 4878e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4888e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filters = (VABufferID *) calloc(ctx->num_filters, sizeof(*ctx->filters)); 4898e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->filters == NULL) { 4908e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n"); 4918e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4928e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4938e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4948e9a21e730449c10cac6e6f69d255611c93f63c2hding memcpy(ctx->filters, pipeline_param->filters, ctx->num_filters * sizeof(*ctx->filters)); 4958e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4968e9a21e730449c10cac6e6f69d255611c93f63c2hding 4978e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set pipeline command to FW */ 4988e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = vsp_set_pipeline(ctx); 4998e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus) { 5008e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to set pipeline\n"); 5018e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 5028e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5038e9a21e730449c10cac6e6f69d255611c93f63c2hding 5048e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set filter parameter to FW, record frc parameter buffer */ 5058e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = vsp_set_filter_param(ctx); 5068e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus) { 5078e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to set filter parameter\n"); 5088e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 5098e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5108e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5118e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 5128e9a21e730449c10cac6e6f69d255611c93f63c2hding /* else ignore pipeline/filter setting */ 5138e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0 5148e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: we can save these check for PnP */ 5158e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < pipeline_param->num_filters; i++) { 5168e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->filters[i] != ctx->filters[i]) { 5178e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n"); 5188e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 5198e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 5208e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5218e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5228e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif 5238e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5248e9a21e730449c10cac6e6f69d255611c93f63c2hding 5258e9a21e730449c10cac6e6f69d255611c93f63c2hding /* fill picture command to FW */ 5268e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->frc_buf != NULL) 5278e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_param = (VAProcFilterParameterBufferFrameRateConversion *)ctx->frc_buf->buffer_data; 5288e9a21e730449c10cac6e6f69d255611c93f63c2hding else 5298e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_param = NULL; 5308e9a21e730449c10cac6e6f69d255611c93f63c2hding 5318e9a21e730449c10cac6e6f69d255611c93f63c2hding /* end picture command */ 5328e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->pipeline_flags & VA_PIPELINE_FLAG_END) { 5338e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_end_param->num_input_pictures = 0; 5348e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_end_param->num_output_pictures = 0; 5358672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VPP_ID, &cmdbuf->param_mem, VssProcPictureCommand, 5368e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->end_param_offset, sizeof(struct VssProcPictureParameterBuffer)); 537d8c30d116941527fe7c43c89052741ec6ee913ebWang Kun /* Destory the VSP context */ 538d8c30d116941527fe7c43c89052741ec6ee913ebWang Kun vsp_cmdbuf_vpp_context(cmdbuf, VssGenDestroyContext, CONTEXT_VPP_ID, 0); 5398e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 5408e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5418e9a21e730449c10cac6e6f69d255611c93f63c2hding 54246a74932d7ffe581e724385891c0aa26df9b48a9Li Zeng#ifdef PSBVIDEO_VPP_TILING 543e6042d7a5abe6944724bc103e8fbf85082debdeeWang Kun /* get the tiling flag*/ 544e6042d7a5abe6944724bc103e8fbf85082debdeeWang Kun tiled = GET_SURFACE_INFO_tiling(input_surface->psb_surface); 5457009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun#endif 54602f3955632048eb112d521f9c8e80ab2c911598aXigui Wang 54702f3955632048eb112d521f9c8e80ab2c911598aXigui Wang /* get the surface format info */ 54802f3955632048eb112d521f9c8e80ab2c911598aXigui Wang switch (input_surface->psb_surface->extra_info[8]) { 54902f3955632048eb112d521f9c8e80ab2c911598aXigui Wang case VA_FOURCC_YV12: 55002f3955632048eb112d521f9c8e80ab2c911598aXigui Wang format = VSP_YV12; 55102f3955632048eb112d521f9c8e80ab2c911598aXigui Wang break; 55202f3955632048eb112d521f9c8e80ab2c911598aXigui Wang case VA_FOURCC_NV12: 55302f3955632048eb112d521f9c8e80ab2c911598aXigui Wang format = VSP_NV12; 55402f3955632048eb112d521f9c8e80ab2c911598aXigui Wang break; 55502f3955632048eb112d521f9c8e80ab2c911598aXigui Wang default: 55602f3955632048eb112d521f9c8e80ab2c911598aXigui Wang vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 55702f3955632048eb112d521f9c8e80ab2c911598aXigui Wang drv_debug_msg(VIDEO_DEBUG_ERROR, "Only support NV12 and YV12 format!\n"); 55802f3955632048eb112d521f9c8e80ab2c911598aXigui Wang goto out; 55902f3955632048eb112d521f9c8e80ab2c911598aXigui Wang } 56002f3955632048eb112d521f9c8e80ab2c911598aXigui Wang 56176777b6108cd39192cba113f96b04b98eee39c73Wang Kun /* According to VIED's design, the width must be multiple of 16 */ 56276777b6108cd39192cba113f96b04b98eee39c73Wang Kun width = ALIGN_TO_16(input_surface->width); 563d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel if (width > input_surface->psb_surface->stride) 564d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel width = input_surface->psb_surface->stride; 565d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel 566d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel /* get the input share info */ 567d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel input_share_info = input_surface->share_info; 568d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s The input surface %p share info %p\n", __func__, input_surface,input_surface->share_info); 56976777b6108cd39192cba113f96b04b98eee39c73Wang Kun 5707009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun /* Setup input surface */ 5718e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->num_input_pictures = 1; 5728e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->input_picture[0].surface_id = pipeline_param->surface; 5738e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_reloc_pic_param(&(cell_proc_picture_param->input_picture[0].base), ctx->pic_param_offset, &(input_surface->psb_surface->buf), 5748e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->param_mem_loc, cell_proc_picture_param); 575d796955a5f4639769cd919935f8773def641d66fhding cell_proc_picture_param->input_picture[0].height = input_surface->height; 57676777b6108cd39192cba113f96b04b98eee39c73Wang Kun cell_proc_picture_param->input_picture[0].width = width; 5778e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->input_picture[0].irq = 0; 578c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding cell_proc_picture_param->input_picture[0].stride = input_surface->psb_surface->stride; 57902f3955632048eb112d521f9c8e80ab2c911598aXigui Wang cell_proc_picture_param->input_picture[0].format = format; 5807009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun cell_proc_picture_param->input_picture[0].tiled = tiled; 5815d69fca537b4dd301c586b988129305fa60f1c06Wang Kun cell_proc_picture_param->input_picture[0].rot_angle = 0; 5828e9a21e730449c10cac6e6f69d255611c93f63c2hding 5837009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun /* Setup output surfaces */ 5848e9a21e730449c10cac6e6f69d255611c93f63c2hding if (frc_param == NULL) 5858e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->num_output_pictures = 1; 5868e9a21e730449c10cac6e6f69d255611c93f63c2hding else 5878e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->num_output_pictures = frc_param->num_output_frames + 1; 588208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 5898e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < cell_proc_picture_param->num_output_pictures; ++i) { 5908e9a21e730449c10cac6e6f69d255611c93f63c2hding if (i == 0) { 5918e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_output_surf = ctx->obj_context->current_render_target; 592208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 593e577a6436873cb07cdbd9e98b7ceccf3a558cf5fWang Kun#ifdef PSBVIDEO_MRFL_VPP_ROTATE 594208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun /* The rotation info is saved in the first frame */ 595208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun rotation_angle = GET_SURFACE_INFO_rotate(cur_output_surf->psb_surface); 596208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun switch (rotation_angle) { 597208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun case VA_ROTATION_90: 598208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_90; 599208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun break; 600208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun case VA_ROTATION_180: 601208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_180; 602208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun break; 603208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun case VA_ROTATION_270: 604208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_270; 605208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun break; 606208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun default: 607208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_NONE; 608208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun } 609e577a6436873cb07cdbd9e98b7ceccf3a558cf5fWang Kun#endif 6108e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 611c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (frc_param == NULL) { 612c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid output surface numbers %x\n", 613c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding cell_proc_picture_param->num_output_pictures); 614c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 615c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto out; 616c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 617c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 6188e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_output_surf = SURFACE(frc_param->output_frames[i-1]); 6198e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cur_output_surf == NULL) { 6208e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input surface %x\n", frc_param->output_frames[i-1]); 6218e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 6228e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 6238e9a21e730449c10cac6e6f69d255611c93f63c2hding } 624208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 625e577a6436873cb07cdbd9e98b7ceccf3a558cf5fWang Kun#ifdef PSBVIDEO_MRFL_VPP_ROTATE 626208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun /* VPP rotation is just for 1080P */ 627208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (tiled && rotation_angle != VA_ROTATION_NONE) { 628208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (VA_STATUS_SUCCESS != psb_CreateRotateSurface(obj_context, cur_output_surf, rotation_angle)) { 629208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc rotation surface!\n"); 630208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vaStatus = VA_STATUS_ERROR_UNKNOWN; 631208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun goto out; 632208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun } 633208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun } 634e577a6436873cb07cdbd9e98b7ceccf3a558cf5fWang Kun#endif 635208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun } 636208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 637208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (tiled && rotation_angle != VA_ROTATION_NONE) { 638e577a6436873cb07cdbd9e98b7ceccf3a558cf5fWang Kun#ifdef PSBVIDEO_MRFL_VPP_ROTATE 639208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun /* For 90d and 270d, we need to alloc rotation buff and 640208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun * copy the 0d data from input to output 641208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun */ 642208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun psb_buffer_map(&(input_surface->psb_surface->buf), &src_addr); 643208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun psb_buffer_map(&(cur_output_surf->psb_surface->buf), &dest_addr); 644208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun memcpy(dest_addr, src_addr, cur_output_surf->psb_surface->size); 645208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun psb_buffer_unmap(&(cur_output_surf->psb_surface->buf)); 646208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun psb_buffer_unmap(&(input_surface->psb_surface->buf)); 647208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 648208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun output_surface = cur_output_surf->out_loop_surface; 649208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 650208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun /* According to VIED's design, the width must be multiple of 16 */ 651208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun width = ALIGN_TO_16(cur_output_surf->height_origin); 652208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (width > cur_output_surf->out_loop_surface->stride) 653208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun width = cur_output_surf->out_loop_surface->stride; 654208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun height = cur_output_surf->width; 655208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun stride = cur_output_surf->out_loop_surface->stride; 656e577a6436873cb07cdbd9e98b7ceccf3a558cf5fWang Kun#endif 657208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun } else { 658208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun output_surface = cur_output_surf->psb_surface; 659208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 660208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun /* According to VIED's design, the width must be multiple of 16 */ 661208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun width = ALIGN_TO_16(cur_output_surf->width); 662d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel if (width > cur_output_surf->psb_surface->stride) 663208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun width = cur_output_surf->psb_surface->stride; 664d796955a5f4639769cd919935f8773def641d66fhding height = cur_output_surf->height; 665208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun stride = cur_output_surf->psb_surface->stride; 666208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 667e577a6436873cb07cdbd9e98b7ceccf3a558cf5fWang Kun /* Check the rotate bit */ 668208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (pipeline_param->rotation_state == VA_ROTATION_90) 669208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_90; 670208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun else if (pipeline_param->rotation_state == VA_ROTATION_180) 671208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_180; 672208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun else if (pipeline_param->rotation_state == VA_ROTATION_270) 673208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_270; 674208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun else 675208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_NONE; 6768e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6778e9a21e730449c10cac6e6f69d255611c93f63c2hding 678208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cell_proc_picture_param->output_picture[i].surface_id = wsbmKBufHandle(wsbmKBuf(output_surface->buf.drm_buf)); 6798e9a21e730449c10cac6e6f69d255611c93f63c2hding 6808e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_reloc_pic_param(&(cell_proc_picture_param->output_picture[i].base), 681208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun ctx->pic_param_offset, &(output_surface->buf), 6828e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->param_mem_loc, cell_proc_picture_param); 683208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cell_proc_picture_param->output_picture[i].height = height; 68476777b6108cd39192cba113f96b04b98eee39c73Wang Kun cell_proc_picture_param->output_picture[i].width = width; 685208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cell_proc_picture_param->output_picture[i].stride = stride; 6868e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->output_picture[i].irq = 1; 68702f3955632048eb112d521f9c8e80ab2c911598aXigui Wang cell_proc_picture_param->output_picture[i].format = format; 688208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cell_proc_picture_param->output_picture[i].rot_angle = vsp_rotation_angle; 689208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cell_proc_picture_param->output_picture[i].tiled = tiled; 690d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel 691d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel /* copy the input share info to output */ 692d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel output_share_info = cur_output_surf->share_info; 693d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel if (input_share_info != NULL && output_share_info != NULL) { 694d640886ce44885e2a70f4d31187d17f4ce08d52dXigui Wang output_share_info->native_window = input_share_info->native_window; 695d640886ce44885e2a70f4d31187d17f4ce08d52dXigui Wang output_share_info->force_output_method = input_share_info->force_output_method; 696d640886ce44885e2a70f4d31187d17f4ce08d52dXigui Wang output_share_info->surface_protected = input_share_info->surface_protected; 697d640886ce44885e2a70f4d31187d17f4ce08d52dXigui Wang output_share_info->bob_deinterlace = input_share_info->bob_deinterlace; 698d640886ce44885e2a70f4d31187d17f4ce08d52dXigui Wang 699d640886ce44885e2a70f4d31187d17f4ce08d52dXigui Wang output_share_info->crop_width = input_share_info->crop_width; 700d640886ce44885e2a70f4d31187d17f4ce08d52dXigui Wang output_share_info->crop_height = input_share_info->crop_height; 701d640886ce44885e2a70f4d31187d17f4ce08d52dXigui Wang output_share_info->coded_width = input_share_info->coded_width; 702d640886ce44885e2a70f4d31187d17f4ce08d52dXigui Wang output_share_info->coded_height = input_share_info->coded_height; 703d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel drv_debug_msg(VIDEO_DEBUG_GENERAL, "The input/output wxh %dx%d\n",input_share_info->width,input_share_info->height); 704d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel } else { 705d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel drv_debug_msg(VIDEO_DEBUG_WARNING, "The input/output share_info is NULL!!\n"); 706d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel } 7078e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7088e9a21e730449c10cac6e6f69d255611c93f63c2hding 7098672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VPP_ID, &cmdbuf->param_mem, VssProcPictureCommand, 7108e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pic_param_offset, sizeof(struct VssProcPictureParameterBuffer)); 7118e9a21e730449c10cac6e6f69d255611c93f63c2hding 7128e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_fence_pic_param(cmdbuf, wsbmKBufHandle(wsbmKBuf(cmdbuf->param_mem.drm_buf))); 7138e9a21e730449c10cac6e6f69d255611c93f63c2hding 714208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun#if 0 7158e9a21e730449c10cac6e6f69d255611c93f63c2hding /* handle reference frames, ignore backward reference */ 7168e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < pipeline_param->num_forward_references; ++i) { 7178e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_output_surf = SURFACE(pipeline_param->forward_references[i]); 7188e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cur_output_surf == NULL) 7198e9a21e730449c10cac6e6f69d255611c93f63c2hding continue; 720d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (vsp_cmdbuf_buffer_ref(cmdbuf, &cur_output_surf->psb_surface->buf) < 0) { 721d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "vsp_cmdbuf_buffer_ref() failed\n"); 722d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_UNKNOWN; 723d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto out; 724d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 7258e9a21e730449c10cac6e6f69d255611c93f63c2hding } 726208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun#endif 7278e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 7288e9a21e730449c10cac6e6f69d255611c93f63c2hding free(pipeline_param); 7298e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_buffer->buffer_data = NULL; 7308e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_buffer->size = 0; 7318e9a21e730449c10cac6e6f69d255611c93f63c2hding 7328e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 7338e9a21e730449c10cac6e6f69d255611c93f63c2hding} 7348e9a21e730449c10cac6e6f69d255611c93f63c2hding 7358e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_RenderPicture( 7368e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context, 7378e9a21e730449c10cac6e6f69d255611c93f63c2hding object_buffer_p *buffers, 7388e9a21e730449c10cac6e6f69d255611c93f63c2hding int num_buffers) 7398e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 7408e9a21e730449c10cac6e6f69d255611c93f63c2hding int i; 7418e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 742e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun VAProcPipelineParameterBuffer *pipeline_param = NULL; 7438e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 7448e9a21e730449c10cac6e6f69d255611c93f63c2hding 7458e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < num_buffers; i++) { 7468e9a21e730449c10cac6e6f69d255611c93f63c2hding object_buffer_p obj_buffer = buffers[i]; 747e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun pipeline_param = (VAProcPipelineParameterBuffer *) obj_buffer->buffer_data; 7488e9a21e730449c10cac6e6f69d255611c93f63c2hding 7498e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (obj_buffer->type) { 7508e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcPipelineParameterBufferType: 751e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun if (!pipeline_param->num_filters && pipeline_param->blend_state) 752e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun /* For Security Composer */ 753e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun vaStatus = vsp_compose_process_pipeline_param(ctx, obj_context, obj_buffer); 754e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun else 755e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun /* For VPP/FRC */ 756e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun vaStatus = vsp__VPP_process_pipeline_param(ctx, obj_context, obj_buffer); 7578e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 7588e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 7598e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 7608e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 7618e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 7628e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7638e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus != VA_STATUS_SUCCESS) { 7648e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 7658e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7668e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7678e9a21e730449c10cac6e6f69d255611c93f63c2hding 7688e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 7698e9a21e730449c10cac6e6f69d255611c93f63c2hding} 7708e9a21e730449c10cac6e6f69d255611c93f63c2hding 7718e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_BeginPicture( 7728e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context) 7738e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 7748e9a21e730449c10cac6e6f69d255611c93f63c2hding int ret; 7758e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 7768e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 7778e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf; 7788e9a21e730449c10cac6e6f69d255611c93f63c2hding 7798e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Initialise the command buffer */ 7808e9a21e730449c10cac6e6f69d255611c93f63c2hding ret = vsp_context_get_next_cmdbuf(ctx->obj_context); 7818e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ret) { 7828e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "get next cmdbuf fail\n"); 7838e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 7848e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 7858e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7868e9a21e730449c10cac6e6f69d255611c93f63c2hding 7878e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf = obj_context->vsp_cmdbuf; 7888e9a21e730449c10cac6e6f69d255611c93f63c2hding 7898e9a21e730449c10cac6e6f69d255611c93f63c2hding /* map param mem */ 7908e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = psb_buffer_map(&cmdbuf->param_mem, &cmdbuf->param_mem_p); 7918e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus) { 7928e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 7938e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7948e9a21e730449c10cac6e6f69d255611c93f63c2hding 7958e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pic_param_p = cmdbuf->param_mem_p + ctx->pic_param_offset; 7968e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->end_param_p = cmdbuf->param_mem_p + ctx->end_param_offset; 7978e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pipeline_param_p = cmdbuf->param_mem_p + ctx->pipeline_param_offset; 7988e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->denoise_param_p = cmdbuf->param_mem_p + ctx->denoise_param_offset; 7998e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->enhancer_param_p = cmdbuf->param_mem_p + ctx->enhancer_param_offset; 8008e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->sharpen_param_p = cmdbuf->param_mem_p + ctx->sharpen_param_offset; 8018e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->frc_param_p = cmdbuf->param_mem_p + ctx->frc_param_offset; 802e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun cmdbuf->compose_param_p = cmdbuf->param_mem_p + ctx->compose_param_offset; 8038e9a21e730449c10cac6e6f69d255611c93f63c2hding 8048e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_SUCCESS; 8058e9a21e730449c10cac6e6f69d255611c93f63c2hding} 8068e9a21e730449c10cac6e6f69d255611c93f63c2hding 8078e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_EndPicture( 8088e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context) 8098e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 8108e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 8118e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_driver_data_p driver_data = obj_context->driver_data; 8128e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = obj_context->vsp_cmdbuf; 8138e9a21e730449c10cac6e6f69d255611c93f63c2hding 8148e9a21e730449c10cac6e6f69d255611c93f63c2hding if(cmdbuf->param_mem_p != NULL) { 8158e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_unmap(&cmdbuf->param_mem); 8168e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->param_mem_p = NULL; 8178e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pic_param_p = NULL; 8188e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->end_param_p = NULL; 8198e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pipeline_param_p = NULL; 8208e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->denoise_param_p = NULL; 8218e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->enhancer_param_p = NULL; 8228e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->sharpen_param_p = NULL; 8238e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->frc_param_p = NULL; 824e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun cmdbuf->compose_param_p = NULL; 8258e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8268e9a21e730449c10cac6e6f69d255611c93f63c2hding 827d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (vsp_context_flush_cmdbuf(ctx->obj_context)) { 8288e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VPP: flush deblock cmdbuf error\n"); 829d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun return VA_STATUS_ERROR_UNKNOWN; 830d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 8318e9a21e730449c10cac6e6f69d255611c93f63c2hding 8328e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_SUCCESS; 8338e9a21e730449c10cac6e6f69d255611c93f63c2hding} 8348e9a21e730449c10cac6e6f69d255611c93f63c2hding 8358e9a21e730449c10cac6e6f69d255611c93f63c2hdingstruct format_vtable_s vsp_VPP_vtable = { 8368e9a21e730449c10cac6e6f69d255611c93f63c2hdingqueryConfigAttributes: 8378e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_QueryConfigAttributes, 8388e9a21e730449c10cac6e6f69d255611c93f63c2hdingvalidateConfig: 8398e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_ValidateConfig, 8408e9a21e730449c10cac6e6f69d255611c93f63c2hdingcreateContext: 8418e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_CreateContext, 8428e9a21e730449c10cac6e6f69d255611c93f63c2hdingdestroyContext: 8438e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_DestroyContext, 8448e9a21e730449c10cac6e6f69d255611c93f63c2hdingbeginPicture: 8458e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_BeginPicture, 8468e9a21e730449c10cac6e6f69d255611c93f63c2hdingrenderPicture: 8478e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_RenderPicture, 8488e9a21e730449c10cac6e6f69d255611c93f63c2hdingendPicture: 8498e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_EndPicture 8508e9a21e730449c10cac6e6f69d255611c93f63c2hding}; 8518e9a21e730449c10cac6e6f69d255611c93f63c2hding 8528e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcFilters( 853d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel VADriverContextP ctx, 854d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel VAContextID context, 855d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel VAProcFilterType *filters, 856d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel unsigned int *num_filters 8578e9a21e730449c10cac6e6f69d255611c93f63c2hding ) 8588e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 8598e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_DRIVER_DATA; 8608e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 8618e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context; 8628e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config; 8638e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint tmp; 8648e9a21e730449c10cac6e6f69d255611c93f63c2hding int count; 8658e9a21e730449c10cac6e6f69d255611c93f63c2hding 8668e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if ctx is right */ 8678e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context = CONTEXT(context); 8688e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 8698e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 87038cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 8718e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8728e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8738e9a21e730449c10cac6e6f69d255611c93f63c2hding 8748e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_config = CONFIG(obj_context->config_id); 8758e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 8768e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 87738cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 8788e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8798e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8808e9a21e730449c10cac6e6f69d255611c93f63c2hding 8818e9a21e730449c10cac6e6f69d255611c93f63c2hding tmp = obj_config->entrypoint; 8828e9a21e730449c10cac6e6f69d255611c93f63c2hding if (tmp != VAEntrypointVideoProc) { 8838e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "current entrypoint is %d, not VAEntrypointVideoProc\n", tmp); 8848e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 8858e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8868e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8878e9a21e730449c10cac6e6f69d255611c93f63c2hding 888d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check if filters and num_filters is valid */ 8898e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == num_filters || NULL == filters) { 8908e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters %p, filters %p\n", num_filters, filters); 89138cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 8928e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8938e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8948e9a21e730449c10cac6e6f69d255611c93f63c2hding 895d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check if the filter array size is valid */ 896d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (*num_filters < VSP_SUPPORTED_FILTERS_NUM) { 897d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The filters array size(%d) is NOT valid! Supported filters num is %d\n", 898d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun *num_filters, VSP_SUPPORTED_FILTERS_NUM); 899d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 900d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun *num_filters = VSP_SUPPORTED_FILTERS_NUM; 901d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto err; 902d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 903d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun 9048e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if current HW support Video proc */ 9058e9a21e730449c10cac6e6f69d255611c93f63c2hding if (IS_MRFL(driver_data)) { 9068e9a21e730449c10cac6e6f69d255611c93f63c2hding count = 0; 907c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding filters[count++] = VAProcFilterDeblocking; 9088e9a21e730449c10cac6e6f69d255611c93f63c2hding filters[count++] = VAProcFilterNoiseReduction; 9098e9a21e730449c10cac6e6f69d255611c93f63c2hding filters[count++] = VAProcFilterSharpening; 910c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding filters[count++] = VAProcFilterColorBalance; 9118e9a21e730449c10cac6e6f69d255611c93f63c2hding filters[count++] = VAProcFilterFrameRateConversion; 9128e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filters = count; 9138e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 9148e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filters = 0; 9158e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9168e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr: 9178e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 9188e9a21e730449c10cac6e6f69d255611c93f63c2hding} 9198e9a21e730449c10cac6e6f69d255611c93f63c2hding 9208e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcFilterCaps( 921d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel VADriverContextP ctx, 922d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel VAContextID context, 923d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel VAProcFilterType type, 924d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel void *filter_caps, 925d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel unsigned int *num_filter_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; 933fc84bd8b6852aff0a3f70c4f21533ce36e1937behding VAProcFilterCap *denoise_cap, *deblock_cap; 9348e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterCap *sharpen_cap; 935c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterCapColorBalance *color_balance_cap; 9368e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterCap *frc_cap; 9378e9a21e730449c10cac6e6f69d255611c93f63c2hding 9388e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if context is right */ 9398e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context = CONTEXT(context); 9408e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 9418e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 94238cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 9438e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9448e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9458e9a21e730449c10cac6e6f69d255611c93f63c2hding 9468e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_config = CONFIG(obj_context->config_id); 9478e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 9488e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 94938cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 9508e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9518e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9528e9a21e730449c10cac6e6f69d255611c93f63c2hding 9538e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if filter_caps and num_filter_caps is right */ 9548e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == num_filter_caps || NULL == filter_caps){ 9558e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters %p, filters %p\n", num_filter_caps, filter_caps); 95638cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 9578e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9588e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9598e9a21e730449c10cac6e6f69d255611c93f63c2hding 9608e9a21e730449c10cac6e6f69d255611c93f63c2hding if (*num_filter_caps < 1) { 9618e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters == %d (> 1)\n", *num_filter_caps); 96238cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 9638e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9648e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9658e9a21e730449c10cac6e6f69d255611c93f63c2hding 9668e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if curent HW support and return corresponding caps */ 9678e9a21e730449c10cac6e6f69d255611c93f63c2hding if (IS_MRFL(driver_data)) { 9688e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: we should use a constant table to return caps */ 9698e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (type) { 9708e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNoiseReduction: 9718e9a21e730449c10cac6e6f69d255611c93f63c2hding denoise_cap = filter_caps; 97266304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.min_value = MIN_VPP_PARAM; 97366304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.max_value = MAX_VPP_PARAM; 97466304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.default_value = MIN_VPP_PARAM; 97566304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.step = STEP_VPP_PARAM; 976c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 9778e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 978fc84bd8b6852aff0a3f70c4f21533ce36e1937behding case VAProcFilterDeblocking: 979fc84bd8b6852aff0a3f70c4f21533ce36e1937behding deblock_cap = filter_caps; 98066304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.min_value = MIN_VPP_PARAM; 98166304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.max_value = MAX_VPP_PARAM; 98266304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.default_value = MIN_VPP_PARAM; 98366304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.step = STEP_VPP_PARAM; 984c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 985fc84bd8b6852aff0a3f70c4f21533ce36e1937behding break; 9868e9a21e730449c10cac6e6f69d255611c93f63c2hding 9878e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterSharpening: 9888e9a21e730449c10cac6e6f69d255611c93f63c2hding sharpen_cap = filter_caps; 98966304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.min_value = MIN_VPP_PARAM; 99066304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.max_value = MAX_VPP_PARAM; 99166304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.default_value = MIN_VPP_PARAM; 99266304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.step = STEP_VPP_PARAM; 993c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 9948e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 9958e9a21e730449c10cac6e6f69d255611c93f63c2hding 996c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 997c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (*num_filter_caps < VSP_COLOR_ENHANCE_FEATURES) { 998c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding drv_debug_msg(VIDEO_DEBUG_ERROR, "filter cap num is should big than %d(%d)\n", 999c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VSP_COLOR_ENHANCE_FEATURES, *num_filter_caps); 1000d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 1001d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun *num_filter_caps = VSP_COLOR_ENHANCE_FEATURES; 1002c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1003c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1004c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap = filter_caps; 1005c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap->type = VAProcColorBalanceAutoSaturation; 100666304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.min_value = MIN_VPP_AUTO_PARAM; 100766304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.max_value = MAX_VPP_AUTO_PARAM; 100866304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.default_value = MIN_VPP_AUTO_PARAM; 100966304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.step = STEP_VPP_AUTO_PARAM; 1010c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1011c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap++; 1012c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap->type = VAProcColorBalanceAutoBrightness; 101366304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.min_value = MIN_VPP_AUTO_PARAM; 101466304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.max_value = MAX_VPP_AUTO_PARAM; 101566304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.default_value = MIN_VPP_AUTO_PARAM; 101666304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.step = STEP_VPP_AUTO_PARAM; 1017c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1018c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 2; 10198e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 10208e9a21e730449c10cac6e6f69d255611c93f63c2hding 10218e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterFrameRateConversion: 10228e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap = filter_caps; 10238e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.min_value = 2; 10248e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.max_value = 4; 10258e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.default_value = 2; 10268e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: it's a set, step is helpless */ 10278e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.step = 0.5; 1028c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 10298e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 10308e9a21e730449c10cac6e6f69d255611c93f63c2hding 10318e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 10328e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide filter type %d\n", type); 103338cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 10348e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filter_caps = 0; 10358e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10368e9a21e730449c10cac6e6f69d255611c93f63c2hding } 10378e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 10388e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filter_caps = 0; 10398e9a21e730449c10cac6e6f69d255611c93f63c2hding } 10408e9a21e730449c10cac6e6f69d255611c93f63c2hding 10418e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr: 10428e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 10438e9a21e730449c10cac6e6f69d255611c93f63c2hding} 10448e9a21e730449c10cac6e6f69d255611c93f63c2hding 10458e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcPipelineCaps( 10468e9a21e730449c10cac6e6f69d255611c93f63c2hding VADriverContextP ctx, 1047d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel VAContextID context, 1048d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel VABufferID *filters, 1049d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel unsigned int num_filters, 1050d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel VAProcPipelineCaps *pipeline_caps 10518e9a21e730449c10cac6e6f69d255611c93f63c2hding ) 10528e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 10538e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_DRIVER_DATA; 10548e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 10558e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context; 10568e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config; 10578e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint tmp; 1058c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding unsigned int i, j; 1059c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBuffer *deblock, *denoise, *sharpen; 1060c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBufferFrameRateConversion *frc; 1061c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBufferColorBalance *balance; 1062c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBufferBase *base; 1063c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding object_buffer_p buf; 1064c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding uint32_t enabled_brightness, enabled_saturation; 1065c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding float ratio; 1066c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int res_set; 106766304487373cf4ed335ba2614f00102dca837832Wang Kun int strength; 106866304487373cf4ed335ba2614f00102dca837832Wang Kun context_VPP_p vpp_ctx; 106936b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun int combination_check; 10708e9a21e730449c10cac6e6f69d255611c93f63c2hding 10718e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if ctx is right */ 10728e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context = CONTEXT(context); 10738e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 10748e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 107538cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 10768e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10778e9a21e730449c10cac6e6f69d255611c93f63c2hding } 10788e9a21e730449c10cac6e6f69d255611c93f63c2hding 107966304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_ctx = (context_VPP_p) obj_context->format_data; 108066304487373cf4ed335ba2614f00102dca837832Wang Kun 10818e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_config = CONFIG(obj_context->config_id); 10828e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 10838e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 108438cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 10858e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10868e9a21e730449c10cac6e6f69d255611c93f63c2hding } 10878e9a21e730449c10cac6e6f69d255611c93f63c2hding 108876777b6108cd39192cba113f96b04b98eee39c73Wang Kun /* Don't check the filter number. 108976777b6108cd39192cba113f96b04b98eee39c73Wang Kun * According to VIED's design, without any filter, HW will just copy input data 109076777b6108cd39192cba113f96b04b98eee39c73Wang Kun */ 109176777b6108cd39192cba113f96b04b98eee39c73Wang Kun#if 0 10928e9a21e730449c10cac6e6f69d255611c93f63c2hding if (num_filters == 0) { 10938e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_filters %d\n", num_filters); 109438cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 10958e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10968e9a21e730449c10cac6e6f69d255611c93f63c2hding } 109776777b6108cd39192cba113f96b04b98eee39c73Wang Kun#endif 10988e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == filters || pipeline_caps == NULL) { 10998e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filters %p or pipeline_caps %p\n", filters, pipeline_caps); 110038cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 11018e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 11028e9a21e730449c10cac6e6f69d255611c93f63c2hding } 11038e9a21e730449c10cac6e6f69d255611c93f63c2hding 11048e9a21e730449c10cac6e6f69d255611c93f63c2hding /* base on HW capability check the filters and return pipeline caps */ 11058e9a21e730449c10cac6e6f69d255611c93f63c2hding if (IS_MRFL(driver_data)) { 11068e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->pipeline_flags = 0; 11078e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->filter_flags = 0; 11088e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->num_forward_references = VSP_FORWARD_REF_NUM; 11098e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->num_backward_references = 0; 11108e9a21e730449c10cac6e6f69d255611c93f63c2hding 1111d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check the input color standard */ 1112d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->input_color_standards == NULL){ 1113d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input color standard array!\n"); 111438cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 11158e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 11168e9a21e730449c10cac6e6f69d255611c93f63c2hding } 1117d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->num_input_color_standards < COLOR_STANDARDS_NUM) { 1118d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_input_color_standards %d\n", pipeline_caps->num_input_color_standards); 1119d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 1120d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_input_color_standards = COLOR_STANDARDS_NUM; 1121d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto err; 1122d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 11238e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->input_color_standards[0] = VAProcColorStandardNone; 1124d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_input_color_standards = COLOR_STANDARDS_NUM; 11258e9a21e730449c10cac6e6f69d255611c93f63c2hding 1126d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check the output color standard */ 1127d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->output_color_standards == NULL){ 1128d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid output color standard array!\n"); 112938cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 11308e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 11318e9a21e730449c10cac6e6f69d255611c93f63c2hding } 1132d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->num_output_color_standards < COLOR_STANDARDS_NUM) { 1133d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_output_color_standards %d\n", pipeline_caps->num_output_color_standards); 1134d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 1135d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_output_color_standards = COLOR_STANDARDS_NUM; 1136d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto err; 1137d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 11388e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->output_color_standards[0] = VAProcColorStandardNone; 1139d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_output_color_standards = COLOR_STANDARDS_NUM; 11408e9a21e730449c10cac6e6f69d255611c93f63c2hding 114166304487373cf4ed335ba2614f00102dca837832Wang Kun /* check the resolution */ 114266304487373cf4ed335ba2614f00102dca837832Wang Kun res_set = check_resolution(obj_context->picture_width, 114366304487373cf4ed335ba2614f00102dca837832Wang Kun obj_context->picture_height); 114466304487373cf4ed335ba2614f00102dca837832Wang Kun if (res_set == NOT_SUPPORTED_RESOLUTION) { 1145c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED; 1146c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1147c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1148c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1149e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun /* Blend type */ 1150e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun pipeline_caps->blend_flags = VA_BLEND_PREMULTIPLIED_ALPHA; 1151e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun 115236b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (getenv("VSP_PIPELINE_CHECK") != NULL) 115336b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun combination_check = 1; 115466304487373cf4ed335ba2614f00102dca837832Wang Kun else 115536b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun combination_check = 0; 1156c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 11578e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: should check filter value settings here */ 11588e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < num_filters; ++i) { 11598e9a21e730449c10cac6e6f69d255611c93f63c2hding /* find buffer */ 1160c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding buf = BUFFER(*(filters + i)); 11610b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun if (!buf) { 11620b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun vaStatus = VA_STATUS_ERROR_UNKNOWN; 11630b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun goto err; 11640b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun } 1165c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1166c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding base = (VAProcFilterParameterBufferBase *)buf->buffer_data; 11678e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check filter buffer setting */ 1168c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding switch (base->type) { 1169c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterDeblocking: 117066304487373cf4ed335ba2614f00102dca837832Wang Kun deblock = (VAProcFilterParameterBuffer *)base; 117166304487373cf4ed335ba2614f00102dca837832Wang Kun 117236b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 117366304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].deblock_enabled != FILTER_ENABLED) { 1174d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The deblock is DISABLE for %d format\n", res_set); 1175c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1176c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 117766304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 117866304487373cf4ed335ba2614f00102dca837832Wang Kun /* check if the value is right */ 117966304487373cf4ed335ba2614f00102dca837832Wang Kun strength = check_vpp_strength(deblock->value); 118066304487373cf4ed335ba2614f00102dca837832Wang Kun if (strength == INVALID_STRENGTH) { 118166304487373cf4ed335ba2614f00102dca837832Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_VALUE; 118266304487373cf4ed335ba2614f00102dca837832Wang Kun goto err; 118366304487373cf4ed335ba2614f00102dca837832Wang Kun } 118466304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->denoise_deblock_param, 118566304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].denoise_deblock[res_set], 118666304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->denoise_deblock_param)); 1187c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1188c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1189c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1190c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterNoiseReduction: 119166304487373cf4ed335ba2614f00102dca837832Wang Kun denoise = (VAProcFilterParameterBuffer *)base; 119266304487373cf4ed335ba2614f00102dca837832Wang Kun 119336b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 119466304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].denoise_enabled != FILTER_ENABLED) { 1195d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The denoise is DISABLE for %d format\n", res_set); 1196c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1197c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 119866304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 119966304487373cf4ed335ba2614f00102dca837832Wang Kun strength = check_vpp_strength(denoise->value); 120066304487373cf4ed335ba2614f00102dca837832Wang Kun if (strength == INVALID_STRENGTH) { 120166304487373cf4ed335ba2614f00102dca837832Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_VALUE; 120266304487373cf4ed335ba2614f00102dca837832Wang Kun goto err; 120366304487373cf4ed335ba2614f00102dca837832Wang Kun } 120466304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->denoise_deblock_param, 120566304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].denoise_deblock[res_set], 120666304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->denoise_deblock_param)); 1207c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1208c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1209c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1210c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterSharpening: 121166304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen = (VAProcFilterParameterBuffer *)base; 121266304487373cf4ed335ba2614f00102dca837832Wang Kun 121336b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 121466304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].sharpen_enabled != FILTER_ENABLED) { 1215d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The sharpen is DISABLE for %d format\n", res_set); 1216c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1217c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 121866304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 121966304487373cf4ed335ba2614f00102dca837832Wang Kun strength = check_vpp_strength(sharpen->value); 122066304487373cf4ed335ba2614f00102dca837832Wang Kun if (strength == INVALID_STRENGTH) { 122166304487373cf4ed335ba2614f00102dca837832Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_VALUE; 122266304487373cf4ed335ba2614f00102dca837832Wang Kun goto err; 122366304487373cf4ed335ba2614f00102dca837832Wang Kun } 122466304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->sharpen_param, 122566304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].sharpen[res_set], 122666304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->sharpen_param)); 1227c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1228c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1229c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1230c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 1231c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding balance = (VAProcFilterParameterBufferColorBalance *)base; 1232c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1233c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_brightness = 0; 1234c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_saturation = 0; 1235c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1236c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding for (j = 0; j < buf->num_elements; ++j, ++balance) { 123766304487373cf4ed335ba2614f00102dca837832Wang Kun if (balance->attrib == VAProcColorBalanceAutoSaturation && 123866304487373cf4ed335ba2614f00102dca837832Wang Kun balance->value == MAX_VPP_AUTO_PARAM) { 1239c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_saturation = 1; 124066304487373cf4ed335ba2614f00102dca837832Wang Kun } else if (balance->attrib == VAProcColorBalanceAutoBrightness && 124166304487373cf4ed335ba2614f00102dca837832Wang Kun balance->value == MAX_VPP_AUTO_PARAM) { 1242c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_brightness = 1; 1243c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } else { 1244d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The color_banlance do NOT support this attrib %d\n", 1245d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun balance->attrib); 1246c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 1247c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1248c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1249c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1250c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1251c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding /* check filter chain */ 125236b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 125366304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].color_balance_enabled != FILTER_ENABLED) { 1254d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The color_balance is DISABLE for %d format\n", res_set); 1255c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1256c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 125766304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 125866304487373cf4ed335ba2614f00102dca837832Wang Kun strength = MEDIUM_STRENGTH; 125966304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->enhancer_param, 126066304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].enhancer[res_set], 126166304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->enhancer_param)); 126266304487373cf4ed335ba2614f00102dca837832Wang Kun if (!enabled_saturation) 126366304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_ctx->enhancer_param.chroma_amm = 0; 126466304487373cf4ed335ba2614f00102dca837832Wang Kun if (!enabled_brightness) 126566304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_ctx->enhancer_param.luma_amm = 0; 1266c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1267c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1268c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1269c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1270c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterFrameRateConversion: 1271c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding frc = (VAProcFilterParameterBufferFrameRateConversion *)base; 1272c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1273c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding /* check frame rate */ 1274c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding ratio = frc->output_fps / (float)frc->input_fps; 1275c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 12760e1ed1e239c04f2c34edd6252ed1b16f11980aabYu, Linda if (!((ratio == 2 || ratio == 2.5 || ratio == 4) && frc->output_fps <= 60)) { 1277d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The FRC do NOT support the ration(%f) and fps(%d)\n", 1278d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun ratio, frc->output_fps); 1279c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 1280c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1281c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1282c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1283c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding /* check the chain */ 128436b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 128566304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].frc_enabled != FILTER_ENABLED) { 1286d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The FRC is DISABLE for %d format\n", res_set); 1287c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1288c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1289c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1290c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1291c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1292c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding default: 1293d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "Do NOT support the filter type %d\n", base->type); 1294c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 1295c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1296c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 12978e9a21e730449c10cac6e6f69d255611c93f63c2hding } 12988e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 12998e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "no HW support\n"); 13008e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 13018e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 13028e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13038e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr: 13048e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 13058e9a21e730449c10cac6e6f69d255611c93f63c2hding} 13068e9a21e730449c10cac6e6f69d255611c93f63c2hding 13078e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_pipeline(context_VPP_p ctx) 13088e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 13098e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 13108e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; 13118e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcPipelineParameterBuffer *cell_pipeline_param = (struct VssProcPipelineParameterBuffer *)cmdbuf->pipeline_param_p; 1312fc84bd8b6852aff0a3f70c4f21533ce36e1937behding unsigned int i, j, filter_count, check_filter = 0; 13138e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferBase *cur_param; 13148e9a21e730449c10cac6e6f69d255611c93f63c2hding enum VssProcFilterType tmp; 13158e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_driver_data_p driver_data = ctx->obj_context->driver_data; 13168e9a21e730449c10cac6e6f69d255611c93f63c2hding 13173a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun /* set intermediate buffer */ 13183a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun cell_pipeline_param->intermediate_buffer_size = VSP_INTERMEDIATE_BUF_SIZE; 13193a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun cell_pipeline_param->intermediate_buffer_base = wsbmBOOffsetHint(ctx->intermediate_buf->drm_buf); 13203a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun 13218e9a21e730449c10cac6e6f69d255611c93f63c2hding /* init pipeline cmd */ 13228e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < VssProcPipelineMaxNumFilters; ++i) 13238e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[i] = -1; 13248e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->num_filters = 0; 13258e9a21e730449c10cac6e6f69d255611c93f63c2hding 13268e9a21e730449c10cac6e6f69d255611c93f63c2hding filter_count = 0; 13278e9a21e730449c10cac6e6f69d255611c93f63c2hding 13288e9a21e730449c10cac6e6f69d255611c93f63c2hding /* store filter buffer object */ 13298e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->num_filters != 0) { 13308e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < ctx->num_filters; ++i) 13318e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filter_buf[i] = BUFFER(ctx->filters[i]); 13328e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 13338e9a21e730449c10cac6e6f69d255611c93f63c2hding goto finished; 13348e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13358e9a21e730449c10cac6e6f69d255611c93f63c2hding 13368e9a21e730449c10cac6e6f69d255611c93f63c2hding /* loop the filter, set correct pipeline param for FW */ 13378e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < ctx->num_filters; ++i) { 13388e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_param = (VAProcFilterParameterBufferBase *)ctx->filter_buf[i]->buffer_data; 13398e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (cur_param->type) { 1340d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel case VAProcFilterNone: 13418e9a21e730449c10cac6e6f69d255611c93f63c2hding goto finished; 13428e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13438e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNoiseReduction: 1344fc84bd8b6852aff0a3f70c4f21533ce36e1937behding case VAProcFilterDeblocking: 13458e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterDenoise; 1346fc84bd8b6852aff0a3f70c4f21533ce36e1937behding check_filter++; 13478e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13488e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterSharpening: 13498e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterSharpening; 13508e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 1351c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 13528e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterColorEnhancement; 13538e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13548e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterFrameRateConversion: 13558e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterFrameRateConversion; 13568e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 1357d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel default: 13588e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = -1; 13598e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 13608e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 13618e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13628e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13638e9a21e730449c10cac6e6f69d255611c93f63c2hding 1364fc84bd8b6852aff0a3f70c4f21533ce36e1937behding /* Denoise and Deblock is alternative */ 1365fc84bd8b6852aff0a3f70c4f21533ce36e1937behding if (check_filter >= 2) { 1366fc84bd8b6852aff0a3f70c4f21533ce36e1937behding drv_debug_msg(VIDEO_DEBUG_ERROR, "Denoise and Deblock is alternative!\n"); 1367fc84bd8b6852aff0a3f70c4f21533ce36e1937behding cell_pipeline_param->filter_pipeline[filter_count++] = -1; 1368fc84bd8b6852aff0a3f70c4f21533ce36e1937behding vaStatus = VA_STATUS_ERROR_UNKNOWN; 1369fc84bd8b6852aff0a3f70c4f21533ce36e1937behding goto out; 1370fc84bd8b6852aff0a3f70c4f21533ce36e1937behding } 1371fc84bd8b6852aff0a3f70c4f21533ce36e1937behding 13728e9a21e730449c10cac6e6f69d255611c93f63c2hdingfinished: 13738e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->num_filters = filter_count; 13748e9a21e730449c10cac6e6f69d255611c93f63c2hding 13758e9a21e730449c10cac6e6f69d255611c93f63c2hding /* reorder */ 13768e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 1; i < filter_count; ++i) 13778e9a21e730449c10cac6e6f69d255611c93f63c2hding for (j = i; j > 0; --j) 13788e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cell_pipeline_param->filter_pipeline[j] < cell_pipeline_param->filter_pipeline[j - 1]) { 13798e9a21e730449c10cac6e6f69d255611c93f63c2hding /* swap */ 13808e9a21e730449c10cac6e6f69d255611c93f63c2hding tmp = cell_pipeline_param->filter_pipeline[j]; 13818e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[j] = cell_pipeline_param->filter_pipeline[j - 1]; 13828e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[j - 1] = tmp; 13838e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13848e9a21e730449c10cac6e6f69d255611c93f63c2hding 13858672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VPP_ID, &cmdbuf->param_mem, VssProcPipelineParameterCommand, 13868e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pipeline_param_offset, sizeof(struct VssProcPipelineParameterBuffer)); 13878e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 13888e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 13898e9a21e730449c10cac6e6f69d255611c93f63c2hding} 13908e9a21e730449c10cac6e6f69d255611c93f63c2hding 13918e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_filter_param(context_VPP_p ctx) 13928e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 13938e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 13948e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; 13958e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcDenoiseParameterBuffer *cell_denoiser_param = (struct VssProcDenoiseParameterBuffer *)cmdbuf->denoise_param_p; 13968e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcColorEnhancementParameterBuffer *cell_enhancer_param = (struct VssProcColorEnhancementParameterBuffer *)cmdbuf->enhancer_param_p; 13978e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcSharpenParameterBuffer *cell_sharpen_param = (struct VssProcSharpenParameterBuffer *)cmdbuf->sharpen_param_p; 13988e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcFrcParameterBuffer *cell_proc_frc_param = (struct VssProcFrcParameterBuffer *)cmdbuf->frc_param_p; 13998e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferBase *cur_param = NULL; 14008e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferFrameRateConversion *frc_param = NULL; 14018e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int i; 14028e9a21e730449c10cac6e6f69d255611c93f63c2hding float ratio; 14038e9a21e730449c10cac6e6f69d255611c93f63c2hding 14048e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < ctx->num_filters; ++i) { 14058e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_param = (VAProcFilterParameterBufferBase *)ctx->filter_buf[i]->buffer_data; 14068e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (cur_param->type) { 14078e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterDeblocking: 140866304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_denoiser_param, 140966304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->denoise_deblock_param, 141066304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->denoise_deblock_param)); 14118e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_denoiser_param->type = VssProcDeblock; 141266304487373cf4ed335ba2614f00102dca837832Wang Kun 141366304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 1414d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel CONTEXT_VPP_ID, 141566304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 141666304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcDenoiseParameterCommand, 141766304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->denoise_param_offset, 141866304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcDenoiseParameterBuffer)); 14198e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 14208e9a21e730449c10cac6e6f69d255611c93f63c2hding 14218e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNoiseReduction: 142266304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_denoiser_param, 142366304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->denoise_deblock_param, 142466304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->denoise_deblock_param)); 14258e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_denoiser_param->type = VssProcDegrain; 142666304487373cf4ed335ba2614f00102dca837832Wang Kun 142766304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 1428d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel CONTEXT_VPP_ID, 142966304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 143066304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcDenoiseParameterCommand, 143166304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->denoise_param_offset, 143266304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcDenoiseParameterBuffer)); 14338e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 14348e9a21e730449c10cac6e6f69d255611c93f63c2hding 14358e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterSharpening: 143666304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_sharpen_param, 143766304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->sharpen_param, 143866304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->sharpen_param)); 143966304487373cf4ed335ba2614f00102dca837832Wang Kun 144066304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 1441d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel CONTEXT_VPP_ID, 144266304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 144366304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcSharpenParameterCommand, 144466304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->sharpen_param_offset, 144566304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcSharpenParameterBuffer)); 14468e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 14478e9a21e730449c10cac6e6f69d255611c93f63c2hding 1448c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 144966304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_enhancer_param, 145066304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->enhancer_param, 145166304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->enhancer_param)); 14525d69fca537b4dd301c586b988129305fa60f1c06Wang Kun 145366304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 1454d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel CONTEXT_VPP_ID, 145566304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 145666304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcColorEnhancementParameterCommand, 145766304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->enhancer_param_offset, 145866304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcColorEnhancementParameterBuffer)); 14598e9a21e730449c10cac6e6f69d255611c93f63c2hding 14608e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 14618e9a21e730449c10cac6e6f69d255611c93f63c2hding 14628e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterFrameRateConversion: 14638e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_buf = ctx->filter_buf[i]; 14648e9a21e730449c10cac6e6f69d255611c93f63c2hding 14658e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_param = (VAProcFilterParameterBufferFrameRateConversion *)ctx->filter_buf[i]->buffer_data; 14668e9a21e730449c10cac6e6f69d255611c93f63c2hding ratio = frc_param->output_fps / (float)frc_param->input_fps; 14678e9a21e730449c10cac6e6f69d255611c93f63c2hding 1468c8e206f338238963120ea9f3f0515329cb791d11Wang Kun /* set the FRC quality */ 1469c8e206f338238963120ea9f3f0515329cb791d11Wang Kun /* cell_proc_frc_param->quality = VssFrcMediumQuality; */ 1470c8e206f338238963120ea9f3f0515329cb791d11Wang Kun cell_proc_frc_param->quality = VssFrcHighQuality; 1471d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel 147266304487373cf4ed335ba2614f00102dca837832Wang Kun /* check if the input fps is in the range of HW capability */ 14738e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ratio == 2) 14748e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->conversion_rate = VssFrc2xConversionRate; 14750e1ed1e239c04f2c34edd6252ed1b16f11980aabYu, Linda else if (ratio == 2.5) 14768e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->conversion_rate = VssFrc2_5xConversionRate; 14778e9a21e730449c10cac6e6f69d255611c93f63c2hding else if (ratio == 4) 14788e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->conversion_rate = VssFrc4xConversionRate; 1479d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel else if (ratio == 1.25) 1480d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel cell_proc_frc_param->conversion_rate = VssFrc1_25xConversionRate; 14818e9a21e730449c10cac6e6f69d255611c93f63c2hding else { 14828e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid frame rate conversion ratio %f \n", ratio); 14838e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 14848e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 14858e9a21e730449c10cac6e6f69d255611c93f63c2hding } 14868e9a21e730449c10cac6e6f69d255611c93f63c2hding 148766304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 1488d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel CONTEXT_VPP_ID, 148966304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 149066304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcFrcParameterCommand, 149166304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->frc_param_offset, 149266304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcFrcParameterBuffer)); 14938e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 1494d50cf45fbdb02245b8d45b14935fc5f2f4575653Thierry Strudel default: 14958e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 14968e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 14978e9a21e730449c10cac6e6f69d255611c93f63c2hding } 14988e9a21e730449c10cac6e6f69d255611c93f63c2hding } 14998e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 15008e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 15018e9a21e730449c10cac6e6f69d255611c93f63c2hding} 150266304487373cf4ed335ba2614f00102dca837832Wang Kun 150366304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_resolution(int width, int height) 150466304487373cf4ed335ba2614f00102dca837832Wang Kun{ 150566304487373cf4ed335ba2614f00102dca837832Wang Kun int ret; 150666304487373cf4ed335ba2614f00102dca837832Wang Kun int image_area; 150766304487373cf4ed335ba2614f00102dca837832Wang Kun 150876777b6108cd39192cba113f96b04b98eee39c73Wang Kun if (height < MIN_SUPPORTED_HEIGHT || height > MAX_SUPPORTED_HEIGHT) 150966304487373cf4ed335ba2614f00102dca837832Wang Kun return NOT_SUPPORTED_RESOLUTION; 151066304487373cf4ed335ba2614f00102dca837832Wang Kun 151166304487373cf4ed335ba2614f00102dca837832Wang Kun image_area = height * width; 151266304487373cf4ed335ba2614f00102dca837832Wang Kun 151366304487373cf4ed335ba2614f00102dca837832Wang Kun if (image_area <= QVGA_AREA) 151466304487373cf4ed335ba2614f00102dca837832Wang Kun ret = QCIF_TO_QVGA; 151566304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= VGA_AREA) 151666304487373cf4ed335ba2614f00102dca837832Wang Kun ret = QVGA_TO_VGA; 151766304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= SD_AREA) 151866304487373cf4ed335ba2614f00102dca837832Wang Kun ret = VGA_TO_SD; 151966304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= HD720P_AREA) 152066304487373cf4ed335ba2614f00102dca837832Wang Kun ret = SD_TO_720P; 152166304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= HD1080P_AREA) 152266304487373cf4ed335ba2614f00102dca837832Wang Kun ret = HD720P_TO_1080P; 152366304487373cf4ed335ba2614f00102dca837832Wang Kun else 152466304487373cf4ed335ba2614f00102dca837832Wang Kun ret = NOT_SUPPORTED_RESOLUTION; 152566304487373cf4ed335ba2614f00102dca837832Wang Kun 152666304487373cf4ed335ba2614f00102dca837832Wang Kun return ret; 152766304487373cf4ed335ba2614f00102dca837832Wang Kun} 152866304487373cf4ed335ba2614f00102dca837832Wang Kun 152966304487373cf4ed335ba2614f00102dca837832Wang Kun/* 153066304487373cf4ed335ba2614f00102dca837832Wang Kun * The strength area is: 153166304487373cf4ed335ba2614f00102dca837832Wang Kun * 153266304487373cf4ed335ba2614f00102dca837832Wang Kun * 0______33______66______100 153366304487373cf4ed335ba2614f00102dca837832Wang Kun * LOW MED HIGH 153466304487373cf4ed335ba2614f00102dca837832Wang Kun * 153566304487373cf4ed335ba2614f00102dca837832Wang Kun * MIN=0; MAX=100; STEP=33 153666304487373cf4ed335ba2614f00102dca837832Wang Kun */ 153766304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_vpp_strength(int value) 153866304487373cf4ed335ba2614f00102dca837832Wang Kun{ 153966304487373cf4ed335ba2614f00102dca837832Wang Kun if (value < MIN_VPP_PARAM || value > MAX_VPP_PARAM) 154066304487373cf4ed335ba2614f00102dca837832Wang Kun return INVALID_STRENGTH; 154166304487373cf4ed335ba2614f00102dca837832Wang Kun 154266304487373cf4ed335ba2614f00102dca837832Wang Kun if (value >= MIN_VPP_PARAM && 154366304487373cf4ed335ba2614f00102dca837832Wang Kun value < MIN_VPP_PARAM + STEP_VPP_PARAM) 154466304487373cf4ed335ba2614f00102dca837832Wang Kun return LOW_STRENGTH; 154566304487373cf4ed335ba2614f00102dca837832Wang Kun else if (value >= MIN_VPP_PARAM + STEP_VPP_PARAM && 154666304487373cf4ed335ba2614f00102dca837832Wang Kun value < MIN_VPP_PARAM + 2 * STEP_VPP_PARAM) 154766304487373cf4ed335ba2614f00102dca837832Wang Kun return MEDIUM_STRENGTH; 154866304487373cf4ed335ba2614f00102dca837832Wang Kun else 154966304487373cf4ed335ba2614f00102dca837832Wang Kun return HIGH_STRENGTH; 155066304487373cf4ed335ba2614f00102dca837832Wang Kun} 1551