vsp_VPP.c revision e982f1e85b688d56a63c7e352281a182753f1e7b
18e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 28e9a21e730449c10cac6e6f69d255611c93f63c2hding * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 38e9a21e730449c10cac6e6f69d255611c93f63c2hding * 48e9a21e730449c10cac6e6f69d255611c93f63c2hding * Permission is hereby granted, free of charge, to any person obtaining a 58e9a21e730449c10cac6e6f69d255611c93f63c2hding * copy of this software and associated documentation files (the 68e9a21e730449c10cac6e6f69d255611c93f63c2hding * "Software"), to deal in the Software without restriction, including 78e9a21e730449c10cac6e6f69d255611c93f63c2hding * without limitation the rights to use, copy, modify, merge, publish, 88e9a21e730449c10cac6e6f69d255611c93f63c2hding * distribute, sub license, and/or sell copies of the Software, and to 98e9a21e730449c10cac6e6f69d255611c93f63c2hding * permit persons to whom the Software is furnished to do so, subject to 108e9a21e730449c10cac6e6f69d255611c93f63c2hding * the following conditions: 118e9a21e730449c10cac6e6f69d255611c93f63c2hding * 128e9a21e730449c10cac6e6f69d255611c93f63c2hding * The above copyright notice and this permission notice (including the 138e9a21e730449c10cac6e6f69d255611c93f63c2hding * next paragraph) shall be included in all copies or substantial portions 148e9a21e730449c10cac6e6f69d255611c93f63c2hding * of the Software. 158e9a21e730449c10cac6e6f69d255611c93f63c2hding * 168e9a21e730449c10cac6e6f69d255611c93f63c2hding * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 178e9a21e730449c10cac6e6f69d255611c93f63c2hding * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 188e9a21e730449c10cac6e6f69d255611c93f63c2hding * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 198e9a21e730449c10cac6e6f69d255611c93f63c2hding * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 208e9a21e730449c10cac6e6f69d255611c93f63c2hding * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 218e9a21e730449c10cac6e6f69d255611c93f63c2hding * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 228e9a21e730449c10cac6e6f69d255611c93f63c2hding * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 238e9a21e730449c10cac6e6f69d255611c93f63c2hding * 248e9a21e730449c10cac6e6f69d255611c93f63c2hding * Authors: 258e9a21e730449c10cac6e6f69d255611c93f63c2hding * Binglin Chen <binglin.chen@intel.com> 268e9a21e730449c10cac6e6f69d255611c93f63c2hding * 278e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 288e9a21e730449c10cac6e6f69d255611c93f63c2hding 298e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "vsp_VPP.h" 308e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_buffer.h" 318e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_surface.h" 328e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "vsp_cmdbuf.h" 338e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_drv_debug.h" 34e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun#include "vsp_compose.h" 358e9a21e730449c10cac6e6f69d255611c93f63c2hding 368e9a21e730449c10cac6e6f69d255611c93f63c2hding#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData; 378e9a21e730449c10cac6e6f69d255611c93f63c2hding#define INIT_CONTEXT_VPP context_VPP_p ctx = (context_VPP_p) obj_context->format_data; 388e9a21e730449c10cac6e6f69d255611c93f63c2hding#define CONFIG(id) ((object_config_p) object_heap_lookup( &driver_data->config_heap, id )) 398e9a21e730449c10cac6e6f69d255611c93f63c2hding#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id )) 408e9a21e730449c10cac6e6f69d255611c93f63c2hding#define BUFFER(id) ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id )) 418e9a21e730449c10cac6e6f69d255611c93f63c2hding 428e9a21e730449c10cac6e6f69d255611c93f63c2hding#define SURFACE(id) ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id )) 438e9a21e730449c10cac6e6f69d255611c93f63c2hding 448e9a21e730449c10cac6e6f69d255611c93f63c2hding#define KB 1024 458e9a21e730449c10cac6e6f69d255611c93f63c2hding#define MB (KB * KB) 463a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun#define VSP_CONTEXT_BUF_SIZE (60*KB) 473a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun#define VSP_INTERMEDIATE_BUF_SIZE (29*MB) 488e9a21e730449c10cac6e6f69d255611c93f63c2hding 4966304487373cf4ed335ba2614f00102dca837832Wang Kun#define MAX_VPP_PARAM (100) 5066304487373cf4ed335ba2614f00102dca837832Wang Kun#define MIN_VPP_PARAM (0) 5166304487373cf4ed335ba2614f00102dca837832Wang Kun#define STEP_VPP_PARAM (33) 5266304487373cf4ed335ba2614f00102dca837832Wang Kun#define MAX_VPP_AUTO_PARAM (1) 5366304487373cf4ed335ba2614f00102dca837832Wang Kun#define MIN_VPP_AUTO_PARAM (0) 5466304487373cf4ed335ba2614f00102dca837832Wang Kun#define STEP_VPP_AUTO_PARAM (1) 5566304487373cf4ed335ba2614f00102dca837832Wang Kun 568e9a21e730449c10cac6e6f69d255611c93f63c2hding#define VSP_FORWARD_REF_NUM 3 578e9a21e730449c10cac6e6f69d255611c93f63c2hding 58c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding#define VSP_COLOR_ENHANCE_FEATURES 2 59c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 608e9a21e730449c10cac6e6f69d255611c93f63c2hding#define ALIGN_TO_128(value) ((value + 128 - 1) & ~(128 - 1)) 6176777b6108cd39192cba113f96b04b98eee39c73Wang Kun#define ALIGN_TO_16(value) ((value + 16 - 1) & ~(16 - 1)) 628e9a21e730449c10cac6e6f69d255611c93f63c2hding 6366304487373cf4ed335ba2614f00102dca837832Wang Kun#define QVGA_AREA (320 * 240) 6466304487373cf4ed335ba2614f00102dca837832Wang Kun#define VGA_AREA (640 * 480) 6566304487373cf4ed335ba2614f00102dca837832Wang Kun#define SD_AREA (720 * 576) 6666304487373cf4ed335ba2614f00102dca837832Wang Kun#define HD720P_AREA (1280 * 720) 6776777b6108cd39192cba113f96b04b98eee39c73Wang Kun#define HD1080P_AREA (1920 * 1088) 6876777b6108cd39192cba113f96b04b98eee39c73Wang Kun 6976777b6108cd39192cba113f96b04b98eee39c73Wang Kun#define MIN_SUPPORTED_HEIGHT 96 7076777b6108cd39192cba113f96b04b98eee39c73Wang Kun#define MAX_SUPPORTED_HEIGHT 1088 7166304487373cf4ed335ba2614f00102dca837832Wang Kun 72d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun/** 73d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * The number of supported filter is 5: 74d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterDeblocking 75d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterNoiseReduction 76d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterSharpening 77d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterColorBalance 78d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterFrameRateConversion 79d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun */ 80d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun#define VSP_SUPPORTED_FILTERS_NUM 5 81d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun 82d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun/* The size of supported color standard */ 83d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun#define COLOR_STANDARDS_NUM 1 84d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun 85c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingenum resolution_set { 8666304487373cf4ed335ba2614f00102dca837832Wang Kun NOT_SUPPORTED_RESOLUTION = -1, 8766304487373cf4ed335ba2614f00102dca837832Wang Kun QCIF_TO_QVGA = 0, 8866304487373cf4ed335ba2614f00102dca837832Wang Kun QVGA_TO_VGA, 8966304487373cf4ed335ba2614f00102dca837832Wang Kun VGA_TO_SD, 9066304487373cf4ed335ba2614f00102dca837832Wang Kun SD_TO_720P, 9166304487373cf4ed335ba2614f00102dca837832Wang Kun HD720P_TO_1080P, 92c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding RESOLUTION_SET_NUM 93c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding}; 94c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 95c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingstruct vpp_chain_capability { 96c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int frc_enabled; 97c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int sharpen_enabled; 98c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int color_balance_enabled; 99c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int denoise_enabled; 100c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int deblock_enabled; 101c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding}; 102c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 103c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingenum filter_status { 104c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding FILTER_DISABLED = 0, 105c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding FILTER_ENABLED 106c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding}; 107c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 108c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingstruct vpp_chain_capability vpp_chain_caps[RESOLUTION_SET_NUM] = { 10966304487373cf4ed335ba2614f00102dca837832Wang Kun [HD720P_TO_1080P] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_DISABLED, FILTER_DISABLED}, 11066304487373cf4ed335ba2614f00102dca837832Wang Kun [SD_TO_720P] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_DISABLED, FILTER_DISABLED}, 11166304487373cf4ed335ba2614f00102dca837832Wang Kun [VGA_TO_SD] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_DISABLED, FILTER_DISABLED}, 11266304487373cf4ed335ba2614f00102dca837832Wang Kun [QVGA_TO_VGA] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED}, 11366304487373cf4ed335ba2614f00102dca837832Wang Kun [QCIF_TO_QVGA] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_ENABLED} 11466304487373cf4ed335ba2614f00102dca837832Wang Kun}; 11566304487373cf4ed335ba2614f00102dca837832Wang Kun 11666304487373cf4ed335ba2614f00102dca837832Wang Kunstruct filter_strength { 11766304487373cf4ed335ba2614f00102dca837832Wang Kun struct VssProcDenoiseParameterBuffer denoise_deblock[RESOLUTION_SET_NUM]; 11866304487373cf4ed335ba2614f00102dca837832Wang Kun struct VssProcColorEnhancementParameterBuffer enhancer[RESOLUTION_SET_NUM]; 11966304487373cf4ed335ba2614f00102dca837832Wang Kun struct VssProcSharpenParameterBuffer sharpen[RESOLUTION_SET_NUM]; 12066304487373cf4ed335ba2614f00102dca837832Wang Kun}; 12166304487373cf4ed335ba2614f00102dca837832Wang Kun 12266304487373cf4ed335ba2614f00102dca837832Wang Kunenum filter_strength_type { 12366304487373cf4ed335ba2614f00102dca837832Wang Kun INVALID_STRENGTH = -1, 12466304487373cf4ed335ba2614f00102dca837832Wang Kun LOW_STRENGTH = 0, 12566304487373cf4ed335ba2614f00102dca837832Wang Kun MEDIUM_STRENGTH, 12666304487373cf4ed335ba2614f00102dca837832Wang Kun HIGH_STRENGTH, 12766304487373cf4ed335ba2614f00102dca837832Wang Kun STRENGTH_NUM 12866304487373cf4ed335ba2614f00102dca837832Wang Kun}; 12966304487373cf4ed335ba2614f00102dca837832Wang Kun 13066304487373cf4ed335ba2614f00102dca837832Wang Kun#define SHARPEN_ON (1) 13166304487373cf4ed335ba2614f00102dca837832Wang Kun 13266304487373cf4ed335ba2614f00102dca837832Wang Kunstruct filter_strength vpp_strength[STRENGTH_NUM] = { 13366304487373cf4ed335ba2614f00102dca837832Wang Kun [LOW_STRENGTH] = { 1344b8982ecb6744203ae0b5381942d72a518539661Wang Kun /* structure: 1354b8982ecb6744203ae0b5381942d72a518539661Wang Kun * type(0-Denoise,1-Deblock), value_thr, cnt_thr, coef, temp_thr1, temp_thr2, _pad[2] 1364b8982ecb6744203ae0b5381942d72a518539661Wang Kun */ 13766304487373cf4ed335ba2614f00102dca837832Wang Kun .denoise_deblock = { 1384b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {1, 15, 47, 35, 0, 0, 0, 0}, 1395d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [QVGA_TO_VGA] = {0, 7, 48, 47, 0, 0, 0, 0}, 1405d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [VGA_TO_SD] = {0, 10, 8, 9, 1, 3, 0, 0}, 1414b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {0, 10, 48, 47, 0, 0, 0, 0}, 1424b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {0, 10, 48, 47, 0, 0, 0, 0} 14366304487373cf4ed335ba2614f00102dca837832Wang Kun }, 1444b8982ecb6744203ae0b5381942d72a518539661Wang Kun /* structure: 1454b8982ecb6744203ae0b5381942d72a518539661Wang Kun * temp_detect, temp_correct, clip_thr, mid_thr, luma_amm, chroma_amm, _pad[2] 1464b8982ecb6744203ae0b5381942d72a518539661Wang Kun */ 14766304487373cf4ed335ba2614f00102dca837832Wang Kun .enhancer = { 1484b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {200, 100, 1, 42, 40, 60, 0, 0}, 1494b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = {220, 180, 1, 42, 40, 60, 0, 0}, 1504b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = {220, 200, 1, 42, 40, 60, 0, 0}, 1514b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {100, 100, 5, 33, 0, 0, 0, 0}, 1524b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {100, 100, 5, 33, 0, 0, 0, 0} 15366304487373cf4ed335ba2614f00102dca837832Wang Kun }, 15466304487373cf4ed335ba2614f00102dca837832Wang Kun .sharpen = { 1554b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = { .quality = SHARPEN_ON }, 1564b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = { .quality = SHARPEN_ON }, 1574b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = { .quality = SHARPEN_ON }, 1584b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = { .quality = SHARPEN_ON }, 15966304487373cf4ed335ba2614f00102dca837832Wang Kun [HD720P_TO_1080P] = { .quality = SHARPEN_ON } 16066304487373cf4ed335ba2614f00102dca837832Wang Kun } 16166304487373cf4ed335ba2614f00102dca837832Wang Kun }, 16266304487373cf4ed335ba2614f00102dca837832Wang Kun [MEDIUM_STRENGTH] = { 16366304487373cf4ed335ba2614f00102dca837832Wang Kun .denoise_deblock = { 1644b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {1, 25, 47, 12, 0, 0, 0, 0}, 1655d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [QVGA_TO_VGA] = {0, 10, 48, 47, 0, 0, 0, 0}, 1665d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [VGA_TO_SD] = {0, 20, 8, 9, 2, 4, 0, 0}, 1674b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {0, 10, 48, 47, 0, 0, 0, 0}, 1684b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {0, 10, 48, 47, 0, 0, 0, 0} 16966304487373cf4ed335ba2614f00102dca837832Wang Kun }, 17066304487373cf4ed335ba2614f00102dca837832Wang Kun .enhancer = { 1714b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {100, 100, 1, 33, 100, 100, 0, 0}, 1724b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = {100, 180, 1, 33, 100, 100, 0, 0}, 1734b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = {100, 200, 1, 33, 100, 100, 0, 0}, 1744b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {100, 100, 5, 33, 0, 0, 0, 0}, 1754b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {100, 100, 5, 33, 0, 0, 0, 0} 17666304487373cf4ed335ba2614f00102dca837832Wang Kun }, 17766304487373cf4ed335ba2614f00102dca837832Wang Kun .sharpen = { 1784b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = { .quality = SHARPEN_ON }, 1794b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = { .quality = SHARPEN_ON }, 1804b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = { .quality = SHARPEN_ON }, 1814b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = { .quality = SHARPEN_ON }, 18266304487373cf4ed335ba2614f00102dca837832Wang Kun [HD720P_TO_1080P] = { .quality = SHARPEN_ON } 18366304487373cf4ed335ba2614f00102dca837832Wang Kun } 18466304487373cf4ed335ba2614f00102dca837832Wang Kun }, 18566304487373cf4ed335ba2614f00102dca837832Wang Kun [HIGH_STRENGTH] = { 18666304487373cf4ed335ba2614f00102dca837832Wang Kun .denoise_deblock = { 1874b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {1, 30, 40, 10, 0, 0, 0, 0}, 1885d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [QVGA_TO_VGA] = {0, 15, 45, 25, 0, 0, 0, 0}, 1895d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [VGA_TO_SD] = {0, 20, 7, 5, 3, 6, 0, 0}, 1904b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {0, 10, 48, 47, 0, 0, 0, 0}, 1914b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {0, 10, 48, 47, 0, 0, 0, 0} 19266304487373cf4ed335ba2614f00102dca837832Wang Kun }, 19366304487373cf4ed335ba2614f00102dca837832Wang Kun .enhancer = { 1944b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {100, 100, 5, 33, 150, 200, 0, 0}, 1954b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = {100, 180, 5, 33, 150, 200, 0, 0}, 1964b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = {100, 200, 5, 33, 100, 150, 0, 0}, 1974b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {100, 100, 5, 33, 0, 0, 0, 0}, 1984b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {100, 100, 5, 33, 0, 0, 0, 0} 19966304487373cf4ed335ba2614f00102dca837832Wang Kun }, 20066304487373cf4ed335ba2614f00102dca837832Wang Kun .sharpen = { 2014b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = { .quality = SHARPEN_ON }, 2024b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = { .quality = SHARPEN_ON }, 2034b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = { .quality = SHARPEN_ON }, 2044b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = { .quality = SHARPEN_ON }, 20566304487373cf4ed335ba2614f00102dca837832Wang Kun [HD720P_TO_1080P] = { .quality = SHARPEN_ON } 20666304487373cf4ed335ba2614f00102dca837832Wang Kun } 20766304487373cf4ed335ba2614f00102dca837832Wang Kun } 208c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding}; 209c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 2108e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic void vsp_VPP_DestroyContext(object_context_p obj_context); 2118e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_pipeline(context_VPP_p ctx); 2128e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_filter_param(context_VPP_p ctx); 2138e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp__VPP_check_legal_picture(object_context_p obj_context, object_config_p obj_config); 21466304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_resolution(int width, int height); 21566304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_vpp_strength(int value); 2168e9a21e730449c10cac6e6f69d255611c93f63c2hding 2178e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic void vsp_VPP_QueryConfigAttributes( 2188e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProfile profile, 2198e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint entrypoint, 2208e9a21e730449c10cac6e6f69d255611c93f63c2hding VAConfigAttrib *attrib_list, 2218e9a21e730449c10cac6e6f69d255611c93f63c2hding int num_attribs) 2228e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2238e9a21e730449c10cac6e6f69d255611c93f63c2hding /* No VPP specific attributes */ 2248e9a21e730449c10cac6e6f69d255611c93f63c2hding return; 2258e9a21e730449c10cac6e6f69d255611c93f63c2hding} 2268e9a21e730449c10cac6e6f69d255611c93f63c2hding 2278e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_ValidateConfig( 2288e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config) 2298e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2308e9a21e730449c10cac6e6f69d255611c93f63c2hding int i; 2318e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Check all attributes */ 2328e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < obj_config->attrib_count; i++) { 2338e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (obj_config->attrib_list[i].type) { 2348e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAConfigAttribRTFormat: 2358e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Ignore */ 2368e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 2378e9a21e730449c10cac6e6f69d255611c93f63c2hding 2388e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 2398e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED; 2408e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2418e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2428e9a21e730449c10cac6e6f69d255611c93f63c2hding 2438e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_SUCCESS; 2448e9a21e730449c10cac6e6f69d255611c93f63c2hding} 2458e9a21e730449c10cac6e6f69d255611c93f63c2hding 2468e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp__VPP_check_legal_picture(object_context_p obj_context, object_config_p obj_config) 2478e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2488e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 2498e9a21e730449c10cac6e6f69d255611c93f63c2hding 2508e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 2518e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 2528e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 2538e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2548e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2558e9a21e730449c10cac6e6f69d255611c93f63c2hding 2568e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 2578e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 2588e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 2598e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2608e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2618e9a21e730449c10cac6e6f69d255611c93f63c2hding 2628e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2638e9a21e730449c10cac6e6f69d255611c93f63c2hding} 2648e9a21e730449c10cac6e6f69d255611c93f63c2hding 2658e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_CreateContext( 2668e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context, 2678e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config) 2688e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2698e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 2708e9a21e730449c10cac6e6f69d255611c93f63c2hding context_VPP_p ctx; 2718e9a21e730449c10cac6e6f69d255611c93f63c2hding int i; 2728e9a21e730449c10cac6e6f69d255611c93f63c2hding 2738e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Validate flag */ 2748e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Validate picture dimensions */ 2758e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = vsp__VPP_check_legal_picture(obj_context, obj_config); 2768e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VA_STATUS_SUCCESS != vaStatus) { 2778e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 2788e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2798e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2808e9a21e730449c10cac6e6f69d255611c93f63c2hding 2818e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx = (context_VPP_p) calloc(1, sizeof(struct context_VPP_s)); 2828e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == ctx) { 2838e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 2848e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 2858e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2868e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2878e9a21e730449c10cac6e6f69d255611c93f63c2hding 2888e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filters = NULL; 2898e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->num_filters = 0; 2908e9a21e730449c10cac6e6f69d255611c93f63c2hding 2918e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_buf = NULL; 2928e9a21e730449c10cac6e6f69d255611c93f63c2hding 2938e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set size */ 2948e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz = 0; 2958e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pic_param_sz = ALIGN_TO_128(sizeof(struct VssProcPictureParameterBuffer)); 2968e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->pic_param_sz; 2978e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->end_param_sz = ALIGN_TO_128(sizeof(struct VssProcPictureParameterBuffer)); 2988e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->end_param_sz; 2998e9a21e730449c10cac6e6f69d255611c93f63c2hding 3008e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pipeline_param_sz = ALIGN_TO_128(sizeof(struct VssProcPipelineParameterBuffer)); 3018e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->pipeline_param_sz; 3028e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->denoise_param_sz = ALIGN_TO_128(sizeof(struct VssProcDenoiseParameterBuffer)); 3038e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->denoise_param_sz; 3048e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->enhancer_param_sz = ALIGN_TO_128(sizeof(struct VssProcColorEnhancementParameterBuffer)); 3058e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->enhancer_param_sz; 3068e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->sharpen_param_sz = ALIGN_TO_128(sizeof(struct VssProcSharpenParameterBuffer)); 3078e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->sharpen_param_sz; 3088e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_param_sz = ALIGN_TO_128(sizeof(struct VssProcFrcParameterBuffer)); 3098e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->frc_param_sz; 310e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun ctx->compose_param_sz = ALIGN_TO_128(sizeof(struct VssWiDi_ComposeSequenceParameterBuffer)); 311e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun ctx->param_sz += ctx->compose_param_sz; 3128e9a21e730449c10cac6e6f69d255611c93f63c2hding 3138e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set offset */ 3148e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pic_param_offset = 0; 3158e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->end_param_offset = ctx->pic_param_offset + ctx->pic_param_sz; 3168e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pipeline_param_offset = ctx->end_param_offset + ctx->end_param_sz; 3178e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->denoise_param_offset = ctx->pipeline_param_offset + ctx->pipeline_param_sz; 3188e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->enhancer_param_offset = ctx->denoise_param_offset + ctx->denoise_param_sz; 3198e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->sharpen_param_offset = ctx->enhancer_param_offset + ctx->enhancer_param_sz; 3208e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_param_offset = ctx->sharpen_param_offset + ctx->sharpen_param_sz; 321e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun /* For composer, it'll start on 0 */ 322e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun ctx->compose_param_offset = 0; 3238e9a21e730449c10cac6e6f69d255611c93f63c2hding 3243a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun /* create intermediate buffer */ 3253a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun ctx->intermediate_buf = (psb_buffer_p) calloc(1, sizeof(struct psb_buffer_s)); 3263a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun if (NULL == ctx->intermediate_buf) { 3273a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 3283a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun DEBUG_FAILURE; 3293a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun goto out; 3303a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun } 3313a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun vaStatus = psb_buffer_create(obj_context->driver_data, VSP_INTERMEDIATE_BUF_SIZE, psb_bt_vpu_only, ctx->intermediate_buf); 3328e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VA_STATUS_SUCCESS != vaStatus) { 3338e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 3348e9a21e730449c10cac6e6f69d255611c93f63c2hding } 335c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 3368e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context->format_data = (void*) ctx; 3378e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->obj_context = obj_context; 3388e9a21e730449c10cac6e6f69d255611c93f63c2hding 3398e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < obj_config->attrib_count; ++i) { 3408e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VAConfigAttribRTFormat == obj_config->attrib_list[i].type) { 3418e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (obj_config->attrib_list[i].value) { 3428e9a21e730449c10cac6e6f69d255611c93f63c2hding case VA_RT_FORMAT_YUV420: 3438e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->format = VSP_NV12; 3448e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 3458e9a21e730449c10cac6e6f69d255611c93f63c2hding case VA_RT_FORMAT_YUV422: 3468e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->format = VSP_NV16; 3478e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 3488e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->format = VSP_NV12; 3498e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 3508e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3518e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 3528e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3538e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3548e9a21e730449c10cac6e6f69d255611c93f63c2hding 35566304487373cf4ed335ba2614f00102dca837832Wang Kun bzero(&ctx->denoise_deblock_param, sizeof(ctx->denoise_deblock_param)); 35666304487373cf4ed335ba2614f00102dca837832Wang Kun bzero(&ctx->enhancer_param, sizeof(ctx->enhancer_param)); 35766304487373cf4ed335ba2614f00102dca837832Wang Kun bzero(&ctx->sharpen_param, sizeof(ctx->sharpen_param)); 35866304487373cf4ed335ba2614f00102dca837832Wang Kun 3598e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 3608e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 3618e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_VPP_DestroyContext(obj_context); 3628e9a21e730449c10cac6e6f69d255611c93f63c2hding 363c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (ctx) 364c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding free(ctx); 365c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 3668e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 3678e9a21e730449c10cac6e6f69d255611c93f63c2hding} 3688e9a21e730449c10cac6e6f69d255611c93f63c2hding 3698e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic void vsp_VPP_DestroyContext( 3708e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context) 3718e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 3728e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 3738e9a21e730449c10cac6e6f69d255611c93f63c2hding 3743a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun if (ctx->intermediate_buf) { 3753a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun psb_buffer_destroy(ctx->intermediate_buf); 3763a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun 3773a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun free(ctx->intermediate_buf); 3783a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun ctx->intermediate_buf = NULL; 3793a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun } 3803a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun 3818e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->filters) { 3828e9a21e730449c10cac6e6f69d255611c93f63c2hding free(ctx->filters); 3838e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->num_filters = 0; 3848e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3858e9a21e730449c10cac6e6f69d255611c93f63c2hding 3868e9a21e730449c10cac6e6f69d255611c93f63c2hding free(obj_context->format_data); 3878e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context->format_data = NULL; 3888e9a21e730449c10cac6e6f69d255611c93f63c2hding} 3898e9a21e730449c10cac6e6f69d255611c93f63c2hding 390208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kunstatic VAStatus vsp__VPP_process_pipeline_param(context_VPP_p ctx, object_context_p obj_context, object_buffer_p obj_buffer) 3918e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 3928e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 3938e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; 3948e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int i = 0; 3958e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcPipelineParameterBuffer *pipeline_param = (VAProcPipelineParameterBuffer *) obj_buffer->buffer_data; 3968e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcPictureParameterBuffer *cell_proc_picture_param = (struct VssProcPictureParameterBuffer *)cmdbuf->pic_param_p; 3978e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcPictureParameterBuffer *cell_end_param = (struct VssProcPictureParameterBuffer *)cmdbuf->end_param_p; 3988e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferFrameRateConversion *frc_param; 3998e9a21e730449c10cac6e6f69d255611c93f63c2hding object_surface_p input_surface = NULL; 4008e9a21e730449c10cac6e6f69d255611c93f63c2hding object_surface_p cur_output_surf = NULL; 401208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun unsigned int rotation_angle = 0, vsp_rotation_angle = 0; 402208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun int tiled = 0, width = 0, height = 0, stride = 0; 403208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun unsigned char *src_addr, *dest_addr; 404208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun struct psb_surface_s *output_surface; 405208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun psb_driver_data_p driver_data = obj_context->driver_data; 4068e9a21e730449c10cac6e6f69d255611c93f63c2hding 4078e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->surface_region != NULL) { 4088e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't scale\n"); 4098e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4108e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4118e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4128e9a21e730449c10cac6e6f69d255611c93f63c2hding 4138e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->output_region != NULL) { 4148e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't scale\n"); 4158e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4168e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4178e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4188e9a21e730449c10cac6e6f69d255611c93f63c2hding 419c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (pipeline_param->output_background_color != 0) { 420c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't support background color here\n"); 421c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 422c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto out; 423c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 4248e9a21e730449c10cac6e6f69d255611c93f63c2hding 4258e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->filters == NULL) { 4268e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filter setting filters = %p\n", pipeline_param->filters); 4278e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4288e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4298e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4308e9a21e730449c10cac6e6f69d255611c93f63c2hding 4318e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0 4328e9a21e730449c10cac6e6f69d255611c93f63c2hding /* for pass filter */ 4338e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->num_filters == 0 || pipeline_param->num_filters > VssProcPipelineMaxNumFilters) { 4348e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filter number = %d\n", pipeline_param->num_filters); 4358e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4368e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4378e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4388e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif 4398e9a21e730449c10cac6e6f69d255611c93f63c2hding 4408e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->forward_references == NULL) { 4418e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid forward_refereces %p setting\n", pipeline_param->forward_references); 4428e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4438e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4448e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4458e9a21e730449c10cac6e6f69d255611c93f63c2hding 4468e9a21e730449c10cac6e6f69d255611c93f63c2hding /* should we check it? since the begining it's not VSP_FORWARD_REF_NUM */ 4478e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->num_forward_references != VSP_FORWARD_REF_NUM) { 4488e9a21e730449c10cac6e6f69d255611c93f63c2hding 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); 4498e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4508e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4518e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4528e9a21e730449c10cac6e6f69d255611c93f63c2hding 453e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun /* first picture, need to setup the VSP context */ 454e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun if (ctx->obj_context->frame_count == 0) 455e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun vsp_cmdbuf_vpp_context(cmdbuf, VssGenInitializeContext, CONTEXT_VPP_ID, VSP_APP_ID_FRC_VPP); 456e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun 457e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun /* get the input surface */ 4588e9a21e730449c10cac6e6f69d255611c93f63c2hding if (!(pipeline_param->pipeline_flags & VA_PIPELINE_FLAG_END)) { 4598e9a21e730449c10cac6e6f69d255611c93f63c2hding input_surface = SURFACE(pipeline_param->surface); 4608e9a21e730449c10cac6e6f69d255611c93f63c2hding if (input_surface == NULL) { 4618e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input surface %x\n", pipeline_param->surface); 4628e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4638e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4648e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4658e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4668e9a21e730449c10cac6e6f69d255611c93f63c2hding input_surface = NULL; 4678e9a21e730449c10cac6e6f69d255611c93f63c2hding } 468e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun 4698e9a21e730449c10cac6e6f69d255611c93f63c2hding /* if it is the first pipeline command */ 4708e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->num_filters != ctx->num_filters || pipeline_param->num_filters == 0) { 4718e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->num_filters != 0) { 4728e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n"); 4738e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4748e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4758e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4768e9a21e730449c10cac6e6f69d255611c93f63c2hding /* save filters */ 4778e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->num_filters = pipeline_param->num_filters; 4788e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->num_filters == 0) { 4798e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filters = NULL; 4808e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4818e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filters = (VABufferID *) calloc(ctx->num_filters, sizeof(*ctx->filters)); 4828e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->filters == NULL) { 4838e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n"); 4848e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4858e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4868e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4878e9a21e730449c10cac6e6f69d255611c93f63c2hding memcpy(ctx->filters, pipeline_param->filters, ctx->num_filters * sizeof(*ctx->filters)); 4888e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4898e9a21e730449c10cac6e6f69d255611c93f63c2hding 4908e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set pipeline command to FW */ 4918e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = vsp_set_pipeline(ctx); 4928e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus) { 4938e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to set pipeline\n"); 4948e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4958e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4968e9a21e730449c10cac6e6f69d255611c93f63c2hding 4978e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set filter parameter to FW, record frc parameter buffer */ 4988e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = vsp_set_filter_param(ctx); 4998e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus) { 5008e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to set filter parameter\n"); 5018e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 5028e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5038e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5048e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 5058e9a21e730449c10cac6e6f69d255611c93f63c2hding /* else ignore pipeline/filter setting */ 5068e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0 5078e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: we can save these check for PnP */ 5088e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < pipeline_param->num_filters; i++) { 5098e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->filters[i] != ctx->filters[i]) { 5108e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n"); 5118e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 5128e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 5138e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5148e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5158e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif 5168e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5178e9a21e730449c10cac6e6f69d255611c93f63c2hding 5188e9a21e730449c10cac6e6f69d255611c93f63c2hding /* fill picture command to FW */ 5198e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->frc_buf != NULL) 5208e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_param = (VAProcFilterParameterBufferFrameRateConversion *)ctx->frc_buf->buffer_data; 5218e9a21e730449c10cac6e6f69d255611c93f63c2hding else 5228e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_param = NULL; 5238e9a21e730449c10cac6e6f69d255611c93f63c2hding 5248e9a21e730449c10cac6e6f69d255611c93f63c2hding /* end picture command */ 5258e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->pipeline_flags & VA_PIPELINE_FLAG_END) { 5268e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_end_param->num_input_pictures = 0; 5278e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_end_param->num_output_pictures = 0; 5288672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VPP_ID, &cmdbuf->param_mem, VssProcPictureCommand, 5298e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->end_param_offset, sizeof(struct VssProcPictureParameterBuffer)); 530d8c30d116941527fe7c43c89052741ec6ee913ebWang Kun /* Destory the VSP context */ 531d8c30d116941527fe7c43c89052741ec6ee913ebWang Kun vsp_cmdbuf_vpp_context(cmdbuf, VssGenDestroyContext, CONTEXT_VPP_ID, 0); 5328e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 5338e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5348e9a21e730449c10cac6e6f69d255611c93f63c2hding 53546a74932d7ffe581e724385891c0aa26df9b48a9Li Zeng#ifdef PSBVIDEO_VPP_TILING 536e6042d7a5abe6944724bc103e8fbf85082debdeeWang Kun /* get the tiling flag*/ 537e6042d7a5abe6944724bc103e8fbf85082debdeeWang Kun tiled = GET_SURFACE_INFO_tiling(input_surface->psb_surface); 5387009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun#endif 53976777b6108cd39192cba113f96b04b98eee39c73Wang Kun /* According to VIED's design, the width must be multiple of 16 */ 54076777b6108cd39192cba113f96b04b98eee39c73Wang Kun width = ALIGN_TO_16(input_surface->width); 54176777b6108cd39192cba113f96b04b98eee39c73Wang Kun if (width > input_surface->psb_surface->stride) 54276777b6108cd39192cba113f96b04b98eee39c73Wang Kun width = input_surface->psb_surface->stride; 54376777b6108cd39192cba113f96b04b98eee39c73Wang Kun 5447009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun /* Setup input surface */ 5458e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->num_input_pictures = 1; 5468e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->input_picture[0].surface_id = pipeline_param->surface; 5478e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_reloc_pic_param(&(cell_proc_picture_param->input_picture[0].base), ctx->pic_param_offset, &(input_surface->psb_surface->buf), 5488e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->param_mem_loc, cell_proc_picture_param); 5498e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->input_picture[0].height = input_surface->height_origin; 55076777b6108cd39192cba113f96b04b98eee39c73Wang Kun cell_proc_picture_param->input_picture[0].width = width; 5518e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->input_picture[0].irq = 0; 552c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding cell_proc_picture_param->input_picture[0].stride = input_surface->psb_surface->stride; 553c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding cell_proc_picture_param->input_picture[0].format = ctx->format; 5547009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun cell_proc_picture_param->input_picture[0].tiled = tiled; 5555d69fca537b4dd301c586b988129305fa60f1c06Wang Kun cell_proc_picture_param->input_picture[0].rot_angle = 0; 5568e9a21e730449c10cac6e6f69d255611c93f63c2hding 5577009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun /* Setup output surfaces */ 5588e9a21e730449c10cac6e6f69d255611c93f63c2hding if (frc_param == NULL) 5598e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->num_output_pictures = 1; 5608e9a21e730449c10cac6e6f69d255611c93f63c2hding else 5618e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->num_output_pictures = frc_param->num_output_frames + 1; 562208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 5638e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < cell_proc_picture_param->num_output_pictures; ++i) { 5648e9a21e730449c10cac6e6f69d255611c93f63c2hding if (i == 0) { 5658e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_output_surf = ctx->obj_context->current_render_target; 566208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 567e577a6436873cb07cdbd9e98b7ceccf3a558cf5fWang Kun#ifdef PSBVIDEO_MRFL_VPP_ROTATE 568208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun /* The rotation info is saved in the first frame */ 569208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun rotation_angle = GET_SURFACE_INFO_rotate(cur_output_surf->psb_surface); 570208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun switch (rotation_angle) { 571208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun case VA_ROTATION_90: 572208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_90; 573208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun break; 574208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun case VA_ROTATION_180: 575208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_180; 576208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun break; 577208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun case VA_ROTATION_270: 578208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_270; 579208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun break; 580208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun default: 581208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_NONE; 582208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun } 583e577a6436873cb07cdbd9e98b7ceccf3a558cf5fWang Kun#endif 5848e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 585c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (frc_param == NULL) { 586c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid output surface numbers %x\n", 587c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding cell_proc_picture_param->num_output_pictures); 588c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 589c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto out; 590c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 591c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 5928e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_output_surf = SURFACE(frc_param->output_frames[i-1]); 5938e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cur_output_surf == NULL) { 5948e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input surface %x\n", frc_param->output_frames[i-1]); 5958e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 5968e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 5978e9a21e730449c10cac6e6f69d255611c93f63c2hding } 598208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 599e577a6436873cb07cdbd9e98b7ceccf3a558cf5fWang Kun#ifdef PSBVIDEO_MRFL_VPP_ROTATE 600208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun /* VPP rotation is just for 1080P */ 601208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (tiled && rotation_angle != VA_ROTATION_NONE) { 602208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (VA_STATUS_SUCCESS != psb_CreateRotateSurface(obj_context, cur_output_surf, rotation_angle)) { 603208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc rotation surface!\n"); 604208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vaStatus = VA_STATUS_ERROR_UNKNOWN; 605208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun goto out; 606208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun } 607208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun } 608e577a6436873cb07cdbd9e98b7ceccf3a558cf5fWang Kun#endif 609208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun } 610208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 611208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (tiled && rotation_angle != VA_ROTATION_NONE) { 612e577a6436873cb07cdbd9e98b7ceccf3a558cf5fWang Kun#ifdef PSBVIDEO_MRFL_VPP_ROTATE 613208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun /* For 90d and 270d, we need to alloc rotation buff and 614208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun * copy the 0d data from input to output 615208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun */ 616208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun psb_buffer_map(&(input_surface->psb_surface->buf), &src_addr); 617208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun psb_buffer_map(&(cur_output_surf->psb_surface->buf), &dest_addr); 618208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun memcpy(dest_addr, src_addr, cur_output_surf->psb_surface->size); 619208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun psb_buffer_unmap(&(cur_output_surf->psb_surface->buf)); 620208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun psb_buffer_unmap(&(input_surface->psb_surface->buf)); 621208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 622208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun output_surface = cur_output_surf->out_loop_surface; 623208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 624208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun /* According to VIED's design, the width must be multiple of 16 */ 625208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun width = ALIGN_TO_16(cur_output_surf->height_origin); 626208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (width > cur_output_surf->out_loop_surface->stride) 627208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun width = cur_output_surf->out_loop_surface->stride; 628208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun height = cur_output_surf->width; 629208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun stride = cur_output_surf->out_loop_surface->stride; 630e577a6436873cb07cdbd9e98b7ceccf3a558cf5fWang Kun#endif 631208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun } else { 632208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun output_surface = cur_output_surf->psb_surface; 633208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 634208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun /* According to VIED's design, the width must be multiple of 16 */ 635208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun width = ALIGN_TO_16(cur_output_surf->width); 636208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (width > cur_output_surf->psb_surface->stride) 637208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun width = cur_output_surf->psb_surface->stride; 638208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun height = cur_output_surf->height_origin; 639208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun stride = cur_output_surf->psb_surface->stride; 640208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 641e577a6436873cb07cdbd9e98b7ceccf3a558cf5fWang Kun /* Check the rotate bit */ 642208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (pipeline_param->rotation_state == VA_ROTATION_90) 643208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_90; 644208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun else if (pipeline_param->rotation_state == VA_ROTATION_180) 645208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_180; 646208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun else if (pipeline_param->rotation_state == VA_ROTATION_270) 647208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_270; 648208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun else 649208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_NONE; 6508e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6518e9a21e730449c10cac6e6f69d255611c93f63c2hding 652208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cell_proc_picture_param->output_picture[i].surface_id = wsbmKBufHandle(wsbmKBuf(output_surface->buf.drm_buf)); 6538e9a21e730449c10cac6e6f69d255611c93f63c2hding 6548e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_reloc_pic_param(&(cell_proc_picture_param->output_picture[i].base), 655208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun ctx->pic_param_offset, &(output_surface->buf), 6568e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->param_mem_loc, cell_proc_picture_param); 657208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cell_proc_picture_param->output_picture[i].height = height; 65876777b6108cd39192cba113f96b04b98eee39c73Wang Kun cell_proc_picture_param->output_picture[i].width = width; 659208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cell_proc_picture_param->output_picture[i].stride = stride; 6608e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->output_picture[i].irq = 1; 6618e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->output_picture[i].format = ctx->format; 662208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cell_proc_picture_param->output_picture[i].rot_angle = vsp_rotation_angle; 663208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cell_proc_picture_param->output_picture[i].tiled = tiled; 6648e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6658e9a21e730449c10cac6e6f69d255611c93f63c2hding 6668672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VPP_ID, &cmdbuf->param_mem, VssProcPictureCommand, 6678e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pic_param_offset, sizeof(struct VssProcPictureParameterBuffer)); 6688e9a21e730449c10cac6e6f69d255611c93f63c2hding 6698e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_fence_pic_param(cmdbuf, wsbmKBufHandle(wsbmKBuf(cmdbuf->param_mem.drm_buf))); 6708e9a21e730449c10cac6e6f69d255611c93f63c2hding 671208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun#if 0 6728e9a21e730449c10cac6e6f69d255611c93f63c2hding /* handle reference frames, ignore backward reference */ 6738e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < pipeline_param->num_forward_references; ++i) { 6748e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_output_surf = SURFACE(pipeline_param->forward_references[i]); 6758e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cur_output_surf == NULL) 6768e9a21e730449c10cac6e6f69d255611c93f63c2hding continue; 677d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (vsp_cmdbuf_buffer_ref(cmdbuf, &cur_output_surf->psb_surface->buf) < 0) { 678d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "vsp_cmdbuf_buffer_ref() failed\n"); 679d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_UNKNOWN; 680d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto out; 681d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 6828e9a21e730449c10cac6e6f69d255611c93f63c2hding } 683208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun#endif 6848e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 6858e9a21e730449c10cac6e6f69d255611c93f63c2hding free(pipeline_param); 6868e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_buffer->buffer_data = NULL; 6878e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_buffer->size = 0; 6888e9a21e730449c10cac6e6f69d255611c93f63c2hding 6898e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 6908e9a21e730449c10cac6e6f69d255611c93f63c2hding} 6918e9a21e730449c10cac6e6f69d255611c93f63c2hding 6928e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_RenderPicture( 6938e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context, 6948e9a21e730449c10cac6e6f69d255611c93f63c2hding object_buffer_p *buffers, 6958e9a21e730449c10cac6e6f69d255611c93f63c2hding int num_buffers) 6968e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 6978e9a21e730449c10cac6e6f69d255611c93f63c2hding int i; 6988e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 699e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun VAProcPipelineParameterBuffer *pipeline_param = NULL; 7008e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 7018e9a21e730449c10cac6e6f69d255611c93f63c2hding 7028e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < num_buffers; i++) { 7038e9a21e730449c10cac6e6f69d255611c93f63c2hding object_buffer_p obj_buffer = buffers[i]; 704e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun pipeline_param = (VAProcPipelineParameterBuffer *) obj_buffer->buffer_data; 7058e9a21e730449c10cac6e6f69d255611c93f63c2hding 7068e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (obj_buffer->type) { 7078e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcPipelineParameterBufferType: 708e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun if (!pipeline_param->num_filters && pipeline_param->blend_state) 709e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun /* For Security Composer */ 710e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun vaStatus = vsp_compose_process_pipeline_param(ctx, obj_context, obj_buffer); 711e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun else 712e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun /* For VPP/FRC */ 713e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun vaStatus = vsp__VPP_process_pipeline_param(ctx, obj_context, obj_buffer); 7148e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 7158e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 7168e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 7178e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 7188e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 7198e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7208e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus != VA_STATUS_SUCCESS) { 7218e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 7228e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7238e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7248e9a21e730449c10cac6e6f69d255611c93f63c2hding 7258e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 7268e9a21e730449c10cac6e6f69d255611c93f63c2hding} 7278e9a21e730449c10cac6e6f69d255611c93f63c2hding 7288e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_BeginPicture( 7298e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context) 7308e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 7318e9a21e730449c10cac6e6f69d255611c93f63c2hding int ret; 7328e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 7338e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 7348e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf; 7358e9a21e730449c10cac6e6f69d255611c93f63c2hding 7368e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Initialise the command buffer */ 7378e9a21e730449c10cac6e6f69d255611c93f63c2hding ret = vsp_context_get_next_cmdbuf(ctx->obj_context); 7388e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ret) { 7398e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "get next cmdbuf fail\n"); 7408e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 7418e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 7428e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7438e9a21e730449c10cac6e6f69d255611c93f63c2hding 7448e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf = obj_context->vsp_cmdbuf; 7458e9a21e730449c10cac6e6f69d255611c93f63c2hding 7468e9a21e730449c10cac6e6f69d255611c93f63c2hding /* map param mem */ 7478e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = psb_buffer_map(&cmdbuf->param_mem, &cmdbuf->param_mem_p); 7488e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus) { 7498e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 7508e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7518e9a21e730449c10cac6e6f69d255611c93f63c2hding 7528e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pic_param_p = cmdbuf->param_mem_p + ctx->pic_param_offset; 7538e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->end_param_p = cmdbuf->param_mem_p + ctx->end_param_offset; 7548e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pipeline_param_p = cmdbuf->param_mem_p + ctx->pipeline_param_offset; 7558e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->denoise_param_p = cmdbuf->param_mem_p + ctx->denoise_param_offset; 7568e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->enhancer_param_p = cmdbuf->param_mem_p + ctx->enhancer_param_offset; 7578e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->sharpen_param_p = cmdbuf->param_mem_p + ctx->sharpen_param_offset; 7588e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->frc_param_p = cmdbuf->param_mem_p + ctx->frc_param_offset; 759e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun cmdbuf->compose_param_p = cmdbuf->param_mem_p + ctx->compose_param_offset; 7608e9a21e730449c10cac6e6f69d255611c93f63c2hding 7618e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_SUCCESS; 7628e9a21e730449c10cac6e6f69d255611c93f63c2hding} 7638e9a21e730449c10cac6e6f69d255611c93f63c2hding 7648e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_EndPicture( 7658e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context) 7668e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 7678e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 7688e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_driver_data_p driver_data = obj_context->driver_data; 7698e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = obj_context->vsp_cmdbuf; 7708e9a21e730449c10cac6e6f69d255611c93f63c2hding 7718e9a21e730449c10cac6e6f69d255611c93f63c2hding if(cmdbuf->param_mem_p != NULL) { 7728e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_unmap(&cmdbuf->param_mem); 7738e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->param_mem_p = NULL; 7748e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pic_param_p = NULL; 7758e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->end_param_p = NULL; 7768e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pipeline_param_p = NULL; 7778e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->denoise_param_p = NULL; 7788e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->enhancer_param_p = NULL; 7798e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->sharpen_param_p = NULL; 7808e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->frc_param_p = NULL; 781e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun cmdbuf->compose_param_p = NULL; 7828e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7838e9a21e730449c10cac6e6f69d255611c93f63c2hding 784d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (vsp_context_flush_cmdbuf(ctx->obj_context)) { 7858e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VPP: flush deblock cmdbuf error\n"); 786d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun return VA_STATUS_ERROR_UNKNOWN; 787d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 7888e9a21e730449c10cac6e6f69d255611c93f63c2hding 7898e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_SUCCESS; 7908e9a21e730449c10cac6e6f69d255611c93f63c2hding} 7918e9a21e730449c10cac6e6f69d255611c93f63c2hding 7928e9a21e730449c10cac6e6f69d255611c93f63c2hdingstruct format_vtable_s vsp_VPP_vtable = { 7938e9a21e730449c10cac6e6f69d255611c93f63c2hdingqueryConfigAttributes: 7948e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_QueryConfigAttributes, 7958e9a21e730449c10cac6e6f69d255611c93f63c2hdingvalidateConfig: 7968e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_ValidateConfig, 7978e9a21e730449c10cac6e6f69d255611c93f63c2hdingcreateContext: 7988e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_CreateContext, 7998e9a21e730449c10cac6e6f69d255611c93f63c2hdingdestroyContext: 8008e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_DestroyContext, 8018e9a21e730449c10cac6e6f69d255611c93f63c2hdingbeginPicture: 8028e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_BeginPicture, 8038e9a21e730449c10cac6e6f69d255611c93f63c2hdingrenderPicture: 8048e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_RenderPicture, 8058e9a21e730449c10cac6e6f69d255611c93f63c2hdingendPicture: 8068e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_EndPicture 8078e9a21e730449c10cac6e6f69d255611c93f63c2hding}; 8088e9a21e730449c10cac6e6f69d255611c93f63c2hding 8098e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcFilters( 8108e9a21e730449c10cac6e6f69d255611c93f63c2hding VADriverContextP ctx, 8118e9a21e730449c10cac6e6f69d255611c93f63c2hding VAContextID context, 8128e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterType *filters, 8138e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int *num_filters 8148e9a21e730449c10cac6e6f69d255611c93f63c2hding ) 8158e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 8168e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_DRIVER_DATA; 8178e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 8188e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context; 8198e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config; 8208e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint tmp; 8218e9a21e730449c10cac6e6f69d255611c93f63c2hding int count; 8228e9a21e730449c10cac6e6f69d255611c93f63c2hding 8238e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if ctx is right */ 8248e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context = CONTEXT(context); 8258e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 8268e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 82738cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 8288e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8298e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8308e9a21e730449c10cac6e6f69d255611c93f63c2hding 8318e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_config = CONFIG(obj_context->config_id); 8328e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 8338e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 83438cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 8358e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8368e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8378e9a21e730449c10cac6e6f69d255611c93f63c2hding 8388e9a21e730449c10cac6e6f69d255611c93f63c2hding tmp = obj_config->entrypoint; 8398e9a21e730449c10cac6e6f69d255611c93f63c2hding if (tmp != VAEntrypointVideoProc) { 8408e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "current entrypoint is %d, not VAEntrypointVideoProc\n", tmp); 8418e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 8428e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8438e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8448e9a21e730449c10cac6e6f69d255611c93f63c2hding 845d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check if filters and num_filters is valid */ 8468e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == num_filters || NULL == filters) { 8478e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters %p, filters %p\n", num_filters, filters); 84838cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 8498e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8508e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8518e9a21e730449c10cac6e6f69d255611c93f63c2hding 852d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check if the filter array size is valid */ 853d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (*num_filters < VSP_SUPPORTED_FILTERS_NUM) { 854d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The filters array size(%d) is NOT valid! Supported filters num is %d\n", 855d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun *num_filters, VSP_SUPPORTED_FILTERS_NUM); 856d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 857d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun *num_filters = VSP_SUPPORTED_FILTERS_NUM; 858d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto err; 859d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 860d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun 8618e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if current HW support Video proc */ 8628e9a21e730449c10cac6e6f69d255611c93f63c2hding if (IS_MRFL(driver_data)) { 8638e9a21e730449c10cac6e6f69d255611c93f63c2hding count = 0; 864c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding filters[count++] = VAProcFilterDeblocking; 8658e9a21e730449c10cac6e6f69d255611c93f63c2hding filters[count++] = VAProcFilterNoiseReduction; 8668e9a21e730449c10cac6e6f69d255611c93f63c2hding filters[count++] = VAProcFilterSharpening; 867c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding filters[count++] = VAProcFilterColorBalance; 8688e9a21e730449c10cac6e6f69d255611c93f63c2hding filters[count++] = VAProcFilterFrameRateConversion; 8698e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filters = count; 8708e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 8718e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filters = 0; 8728e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8738e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr: 8748e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 8758e9a21e730449c10cac6e6f69d255611c93f63c2hding} 8768e9a21e730449c10cac6e6f69d255611c93f63c2hding 8778e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcFilterCaps( 8788e9a21e730449c10cac6e6f69d255611c93f63c2hding VADriverContextP ctx, 8798e9a21e730449c10cac6e6f69d255611c93f63c2hding VAContextID context, 8808e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterType type, 8818e9a21e730449c10cac6e6f69d255611c93f63c2hding void *filter_caps, 8828e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int *num_filter_caps 8838e9a21e730449c10cac6e6f69d255611c93f63c2hding ) 8848e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 8858e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_DRIVER_DATA; 8868e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 8878e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context; 8888e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config; 8898e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint tmp; 890fc84bd8b6852aff0a3f70c4f21533ce36e1937behding VAProcFilterCap *denoise_cap, *deblock_cap; 8918e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterCap *sharpen_cap; 892c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterCapColorBalance *color_balance_cap; 8938e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterCap *frc_cap; 8948e9a21e730449c10cac6e6f69d255611c93f63c2hding 8958e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if context is right */ 8968e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context = CONTEXT(context); 8978e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 8988e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 89938cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 9008e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9018e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9028e9a21e730449c10cac6e6f69d255611c93f63c2hding 9038e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_config = CONFIG(obj_context->config_id); 9048e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 9058e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 90638cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 9078e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9088e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9098e9a21e730449c10cac6e6f69d255611c93f63c2hding 9108e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if filter_caps and num_filter_caps is right */ 9118e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == num_filter_caps || NULL == filter_caps){ 9128e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters %p, filters %p\n", num_filter_caps, filter_caps); 91338cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 9148e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9158e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9168e9a21e730449c10cac6e6f69d255611c93f63c2hding 9178e9a21e730449c10cac6e6f69d255611c93f63c2hding if (*num_filter_caps < 1) { 9188e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters == %d (> 1)\n", *num_filter_caps); 91938cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 9208e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9218e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9228e9a21e730449c10cac6e6f69d255611c93f63c2hding 9238e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if curent HW support and return corresponding caps */ 9248e9a21e730449c10cac6e6f69d255611c93f63c2hding if (IS_MRFL(driver_data)) { 9258e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: we should use a constant table to return caps */ 9268e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (type) { 9278e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNoiseReduction: 9288e9a21e730449c10cac6e6f69d255611c93f63c2hding denoise_cap = filter_caps; 92966304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.min_value = MIN_VPP_PARAM; 93066304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.max_value = MAX_VPP_PARAM; 93166304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.default_value = MIN_VPP_PARAM; 93266304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.step = STEP_VPP_PARAM; 933c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 9348e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 935fc84bd8b6852aff0a3f70c4f21533ce36e1937behding case VAProcFilterDeblocking: 936fc84bd8b6852aff0a3f70c4f21533ce36e1937behding deblock_cap = filter_caps; 93766304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.min_value = MIN_VPP_PARAM; 93866304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.max_value = MAX_VPP_PARAM; 93966304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.default_value = MIN_VPP_PARAM; 94066304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.step = STEP_VPP_PARAM; 941c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 942fc84bd8b6852aff0a3f70c4f21533ce36e1937behding break; 9438e9a21e730449c10cac6e6f69d255611c93f63c2hding 9448e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterSharpening: 9458e9a21e730449c10cac6e6f69d255611c93f63c2hding sharpen_cap = filter_caps; 94666304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.min_value = MIN_VPP_PARAM; 94766304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.max_value = MAX_VPP_PARAM; 94866304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.default_value = MIN_VPP_PARAM; 94966304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.step = STEP_VPP_PARAM; 950c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 9518e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 9528e9a21e730449c10cac6e6f69d255611c93f63c2hding 953c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 954c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (*num_filter_caps < VSP_COLOR_ENHANCE_FEATURES) { 955c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding drv_debug_msg(VIDEO_DEBUG_ERROR, "filter cap num is should big than %d(%d)\n", 956c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VSP_COLOR_ENHANCE_FEATURES, *num_filter_caps); 957d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 958d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun *num_filter_caps = VSP_COLOR_ENHANCE_FEATURES; 959c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 960c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 961c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap = filter_caps; 962c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap->type = VAProcColorBalanceAutoSaturation; 96366304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.min_value = MIN_VPP_AUTO_PARAM; 96466304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.max_value = MAX_VPP_AUTO_PARAM; 96566304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.default_value = MIN_VPP_AUTO_PARAM; 96666304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.step = STEP_VPP_AUTO_PARAM; 967c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 968c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap++; 969c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap->type = VAProcColorBalanceAutoBrightness; 97066304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.min_value = MIN_VPP_AUTO_PARAM; 97166304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.max_value = MAX_VPP_AUTO_PARAM; 97266304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.default_value = MIN_VPP_AUTO_PARAM; 97366304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.step = STEP_VPP_AUTO_PARAM; 974c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 975c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 2; 9768e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 9778e9a21e730449c10cac6e6f69d255611c93f63c2hding 9788e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterFrameRateConversion: 9798e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap = filter_caps; 9808e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.min_value = 2; 9818e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.max_value = 4; 9828e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.default_value = 2; 9838e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: it's a set, step is helpless */ 9848e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.step = 0.5; 985c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 9868e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 9878e9a21e730449c10cac6e6f69d255611c93f63c2hding 9888e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 9898e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide filter type %d\n", type); 99038cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 9918e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filter_caps = 0; 9928e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9938e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9948e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 9958e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filter_caps = 0; 9968e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9978e9a21e730449c10cac6e6f69d255611c93f63c2hding 9988e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr: 9998e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 10008e9a21e730449c10cac6e6f69d255611c93f63c2hding} 10018e9a21e730449c10cac6e6f69d255611c93f63c2hding 10028e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcPipelineCaps( 10038e9a21e730449c10cac6e6f69d255611c93f63c2hding VADriverContextP ctx, 10048e9a21e730449c10cac6e6f69d255611c93f63c2hding VAContextID context, 10058e9a21e730449c10cac6e6f69d255611c93f63c2hding VABufferID *filters, 10068e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int num_filters, 10078e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcPipelineCaps *pipeline_caps 10088e9a21e730449c10cac6e6f69d255611c93f63c2hding ) 10098e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 10108e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_DRIVER_DATA; 10118e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 10128e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context; 10138e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config; 10148e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint tmp; 1015c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding unsigned int i, j; 1016c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBuffer *deblock, *denoise, *sharpen; 1017c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBufferFrameRateConversion *frc; 1018c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBufferColorBalance *balance; 1019c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBufferBase *base; 1020c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding object_buffer_p buf; 1021c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding uint32_t enabled_brightness, enabled_saturation; 1022c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding float ratio; 1023c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int res_set; 102466304487373cf4ed335ba2614f00102dca837832Wang Kun int strength; 102566304487373cf4ed335ba2614f00102dca837832Wang Kun context_VPP_p vpp_ctx; 102636b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun int combination_check; 10278e9a21e730449c10cac6e6f69d255611c93f63c2hding 10288e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if ctx is right */ 10298e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context = CONTEXT(context); 10308e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 10318e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 103238cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 10338e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10348e9a21e730449c10cac6e6f69d255611c93f63c2hding } 10358e9a21e730449c10cac6e6f69d255611c93f63c2hding 103666304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_ctx = (context_VPP_p) obj_context->format_data; 103766304487373cf4ed335ba2614f00102dca837832Wang Kun 10388e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_config = CONFIG(obj_context->config_id); 10398e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 10408e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 104138cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 10428e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10438e9a21e730449c10cac6e6f69d255611c93f63c2hding } 10448e9a21e730449c10cac6e6f69d255611c93f63c2hding 104576777b6108cd39192cba113f96b04b98eee39c73Wang Kun /* Don't check the filter number. 104676777b6108cd39192cba113f96b04b98eee39c73Wang Kun * According to VIED's design, without any filter, HW will just copy input data 104776777b6108cd39192cba113f96b04b98eee39c73Wang Kun */ 104876777b6108cd39192cba113f96b04b98eee39c73Wang Kun#if 0 10498e9a21e730449c10cac6e6f69d255611c93f63c2hding if (num_filters == 0) { 10508e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_filters %d\n", num_filters); 105138cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 10528e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10538e9a21e730449c10cac6e6f69d255611c93f63c2hding } 105476777b6108cd39192cba113f96b04b98eee39c73Wang Kun#endif 10558e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == filters || pipeline_caps == NULL) { 10568e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filters %p or pipeline_caps %p\n", filters, pipeline_caps); 105738cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 10588e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10598e9a21e730449c10cac6e6f69d255611c93f63c2hding } 10608e9a21e730449c10cac6e6f69d255611c93f63c2hding 10618e9a21e730449c10cac6e6f69d255611c93f63c2hding /* base on HW capability check the filters and return pipeline caps */ 10628e9a21e730449c10cac6e6f69d255611c93f63c2hding if (IS_MRFL(driver_data)) { 10638e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->pipeline_flags = 0; 10648e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->filter_flags = 0; 10658e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->num_forward_references = VSP_FORWARD_REF_NUM; 10668e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->num_backward_references = 0; 10678e9a21e730449c10cac6e6f69d255611c93f63c2hding 1068d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check the input color standard */ 1069d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->input_color_standards == NULL){ 1070d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input color standard array!\n"); 107138cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 10728e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10738e9a21e730449c10cac6e6f69d255611c93f63c2hding } 1074d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->num_input_color_standards < COLOR_STANDARDS_NUM) { 1075d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_input_color_standards %d\n", pipeline_caps->num_input_color_standards); 1076d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 1077d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_input_color_standards = COLOR_STANDARDS_NUM; 1078d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto err; 1079d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 10808e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->input_color_standards[0] = VAProcColorStandardNone; 1081d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_input_color_standards = COLOR_STANDARDS_NUM; 10828e9a21e730449c10cac6e6f69d255611c93f63c2hding 1083d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check the output color standard */ 1084d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->output_color_standards == NULL){ 1085d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid output color standard array!\n"); 108638cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 10878e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10888e9a21e730449c10cac6e6f69d255611c93f63c2hding } 1089d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->num_output_color_standards < COLOR_STANDARDS_NUM) { 1090d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_output_color_standards %d\n", pipeline_caps->num_output_color_standards); 1091d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 1092d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_output_color_standards = COLOR_STANDARDS_NUM; 1093d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto err; 1094d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 10958e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->output_color_standards[0] = VAProcColorStandardNone; 1096d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_output_color_standards = COLOR_STANDARDS_NUM; 10978e9a21e730449c10cac6e6f69d255611c93f63c2hding 109866304487373cf4ed335ba2614f00102dca837832Wang Kun /* check the resolution */ 109966304487373cf4ed335ba2614f00102dca837832Wang Kun res_set = check_resolution(obj_context->picture_width, 110066304487373cf4ed335ba2614f00102dca837832Wang Kun obj_context->picture_height); 110166304487373cf4ed335ba2614f00102dca837832Wang Kun if (res_set == NOT_SUPPORTED_RESOLUTION) { 1102c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED; 1103c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1104c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1105c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1106e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun /* Blend type */ 1107e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun pipeline_caps->blend_flags = VA_BLEND_PREMULTIPLIED_ALPHA; 1108e982f1e85b688d56a63c7e352281a182753f1e7bWang Kun 110936b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (getenv("VSP_PIPELINE_CHECK") != NULL) 111036b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun combination_check = 1; 111166304487373cf4ed335ba2614f00102dca837832Wang Kun else 111236b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun combination_check = 0; 1113c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 11148e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: should check filter value settings here */ 11158e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < num_filters; ++i) { 11168e9a21e730449c10cac6e6f69d255611c93f63c2hding /* find buffer */ 1117c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding buf = BUFFER(*(filters + i)); 11180b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun if (!buf) { 11190b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun vaStatus = VA_STATUS_ERROR_UNKNOWN; 11200b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun goto err; 11210b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun } 1122c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1123c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding base = (VAProcFilterParameterBufferBase *)buf->buffer_data; 11248e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check filter buffer setting */ 1125c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding switch (base->type) { 1126c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterDeblocking: 112766304487373cf4ed335ba2614f00102dca837832Wang Kun deblock = (VAProcFilterParameterBuffer *)base; 112866304487373cf4ed335ba2614f00102dca837832Wang Kun 112936b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 113066304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].deblock_enabled != FILTER_ENABLED) { 1131d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The deblock is DISABLE for %d format\n", res_set); 1132c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1133c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 113466304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 113566304487373cf4ed335ba2614f00102dca837832Wang Kun /* check if the value is right */ 113666304487373cf4ed335ba2614f00102dca837832Wang Kun strength = check_vpp_strength(deblock->value); 113766304487373cf4ed335ba2614f00102dca837832Wang Kun if (strength == INVALID_STRENGTH) { 113866304487373cf4ed335ba2614f00102dca837832Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_VALUE; 113966304487373cf4ed335ba2614f00102dca837832Wang Kun goto err; 114066304487373cf4ed335ba2614f00102dca837832Wang Kun } 114166304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->denoise_deblock_param, 114266304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].denoise_deblock[res_set], 114366304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->denoise_deblock_param)); 1144c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1145c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1146c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1147c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterNoiseReduction: 114866304487373cf4ed335ba2614f00102dca837832Wang Kun denoise = (VAProcFilterParameterBuffer *)base; 114966304487373cf4ed335ba2614f00102dca837832Wang Kun 115036b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 115166304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].denoise_enabled != FILTER_ENABLED) { 1152d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The denoise is DISABLE for %d format\n", res_set); 1153c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1154c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 115566304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 115666304487373cf4ed335ba2614f00102dca837832Wang Kun strength = check_vpp_strength(denoise->value); 115766304487373cf4ed335ba2614f00102dca837832Wang Kun if (strength == INVALID_STRENGTH) { 115866304487373cf4ed335ba2614f00102dca837832Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_VALUE; 115966304487373cf4ed335ba2614f00102dca837832Wang Kun goto err; 116066304487373cf4ed335ba2614f00102dca837832Wang Kun } 116166304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->denoise_deblock_param, 116266304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].denoise_deblock[res_set], 116366304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->denoise_deblock_param)); 1164c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1165c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1166c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1167c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterSharpening: 116866304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen = (VAProcFilterParameterBuffer *)base; 116966304487373cf4ed335ba2614f00102dca837832Wang Kun 117036b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 117166304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].sharpen_enabled != FILTER_ENABLED) { 1172d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The sharpen is DISABLE for %d format\n", res_set); 1173c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1174c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 117566304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 117666304487373cf4ed335ba2614f00102dca837832Wang Kun strength = check_vpp_strength(sharpen->value); 117766304487373cf4ed335ba2614f00102dca837832Wang Kun if (strength == INVALID_STRENGTH) { 117866304487373cf4ed335ba2614f00102dca837832Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_VALUE; 117966304487373cf4ed335ba2614f00102dca837832Wang Kun goto err; 118066304487373cf4ed335ba2614f00102dca837832Wang Kun } 118166304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->sharpen_param, 118266304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].sharpen[res_set], 118366304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->sharpen_param)); 1184c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1185c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1186c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1187c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 1188c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding balance = (VAProcFilterParameterBufferColorBalance *)base; 1189c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1190c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_brightness = 0; 1191c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_saturation = 0; 1192c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1193c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding for (j = 0; j < buf->num_elements; ++j, ++balance) { 119466304487373cf4ed335ba2614f00102dca837832Wang Kun if (balance->attrib == VAProcColorBalanceAutoSaturation && 119566304487373cf4ed335ba2614f00102dca837832Wang Kun balance->value == MAX_VPP_AUTO_PARAM) { 1196c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_saturation = 1; 119766304487373cf4ed335ba2614f00102dca837832Wang Kun } else if (balance->attrib == VAProcColorBalanceAutoBrightness && 119866304487373cf4ed335ba2614f00102dca837832Wang Kun balance->value == MAX_VPP_AUTO_PARAM) { 1199c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_brightness = 1; 1200c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } else { 1201d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The color_banlance do NOT support this attrib %d\n", 1202d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun balance->attrib); 1203c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 1204c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1205c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1206c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1207c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1208c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding /* check filter chain */ 120936b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 121066304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].color_balance_enabled != FILTER_ENABLED) { 1211d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The color_balance is DISABLE for %d format\n", res_set); 1212c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1213c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 121466304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 121566304487373cf4ed335ba2614f00102dca837832Wang Kun strength = MEDIUM_STRENGTH; 121666304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->enhancer_param, 121766304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].enhancer[res_set], 121866304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->enhancer_param)); 121966304487373cf4ed335ba2614f00102dca837832Wang Kun if (!enabled_saturation) 122066304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_ctx->enhancer_param.chroma_amm = 0; 122166304487373cf4ed335ba2614f00102dca837832Wang Kun if (!enabled_brightness) 122266304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_ctx->enhancer_param.luma_amm = 0; 1223c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1224c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1225c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1226c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1227c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterFrameRateConversion: 1228c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding frc = (VAProcFilterParameterBufferFrameRateConversion *)base; 1229c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1230c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding /* check frame rate */ 1231c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding ratio = frc->output_fps / (float)frc->input_fps; 1232c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 12330e1ed1e239c04f2c34edd6252ed1b16f11980aabYu, Linda if (!((ratio == 2 || ratio == 2.5 || ratio == 4) && frc->output_fps <= 60)) { 1234d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The FRC do NOT support the ration(%f) and fps(%d)\n", 1235d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun ratio, frc->output_fps); 1236c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 1237c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1238c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1239c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1240c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding /* check the chain */ 124136b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 124266304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].frc_enabled != FILTER_ENABLED) { 1243d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The FRC is DISABLE for %d format\n", res_set); 1244c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1245c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1246c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1247c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1248c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1249c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding default: 1250d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "Do NOT support the filter type %d\n", base->type); 1251c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 1252c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1253c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 12548e9a21e730449c10cac6e6f69d255611c93f63c2hding } 12558e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 12568e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "no HW support\n"); 12578e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 12588e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 12598e9a21e730449c10cac6e6f69d255611c93f63c2hding } 12608e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr: 12618e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 12628e9a21e730449c10cac6e6f69d255611c93f63c2hding} 12638e9a21e730449c10cac6e6f69d255611c93f63c2hding 12648e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_pipeline(context_VPP_p ctx) 12658e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 12668e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 12678e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; 12688e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcPipelineParameterBuffer *cell_pipeline_param = (struct VssProcPipelineParameterBuffer *)cmdbuf->pipeline_param_p; 1269fc84bd8b6852aff0a3f70c4f21533ce36e1937behding unsigned int i, j, filter_count, check_filter = 0; 12708e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferBase *cur_param; 12718e9a21e730449c10cac6e6f69d255611c93f63c2hding enum VssProcFilterType tmp; 12728e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_driver_data_p driver_data = ctx->obj_context->driver_data; 12738e9a21e730449c10cac6e6f69d255611c93f63c2hding 12743a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun /* set intermediate buffer */ 12753a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun cell_pipeline_param->intermediate_buffer_size = VSP_INTERMEDIATE_BUF_SIZE; 12763a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun cell_pipeline_param->intermediate_buffer_base = wsbmBOOffsetHint(ctx->intermediate_buf->drm_buf); 12773a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun 12788e9a21e730449c10cac6e6f69d255611c93f63c2hding /* init pipeline cmd */ 12798e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < VssProcPipelineMaxNumFilters; ++i) 12808e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[i] = -1; 12818e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->num_filters = 0; 12828e9a21e730449c10cac6e6f69d255611c93f63c2hding 12838e9a21e730449c10cac6e6f69d255611c93f63c2hding filter_count = 0; 12848e9a21e730449c10cac6e6f69d255611c93f63c2hding 12858e9a21e730449c10cac6e6f69d255611c93f63c2hding /* store filter buffer object */ 12868e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->num_filters != 0) { 12878e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < ctx->num_filters; ++i) 12888e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filter_buf[i] = BUFFER(ctx->filters[i]); 12898e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 12908e9a21e730449c10cac6e6f69d255611c93f63c2hding goto finished; 12918e9a21e730449c10cac6e6f69d255611c93f63c2hding } 12928e9a21e730449c10cac6e6f69d255611c93f63c2hding 12938e9a21e730449c10cac6e6f69d255611c93f63c2hding /* loop the filter, set correct pipeline param for FW */ 12948e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < ctx->num_filters; ++i) { 12958e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_param = (VAProcFilterParameterBufferBase *)ctx->filter_buf[i]->buffer_data; 12968e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (cur_param->type) { 12978e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNone: 12988e9a21e730449c10cac6e6f69d255611c93f63c2hding goto finished; 12998e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13008e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNoiseReduction: 1301fc84bd8b6852aff0a3f70c4f21533ce36e1937behding case VAProcFilterDeblocking: 13028e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterDenoise; 1303fc84bd8b6852aff0a3f70c4f21533ce36e1937behding check_filter++; 13048e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13058e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterSharpening: 13068e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterSharpening; 13078e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 1308c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 13098e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterColorEnhancement; 13108e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13118e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterFrameRateConversion: 13128e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterFrameRateConversion; 13138e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13148e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 13158e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = -1; 13168e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 13178e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 13188e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13198e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13208e9a21e730449c10cac6e6f69d255611c93f63c2hding 1321fc84bd8b6852aff0a3f70c4f21533ce36e1937behding /* Denoise and Deblock is alternative */ 1322fc84bd8b6852aff0a3f70c4f21533ce36e1937behding if (check_filter >= 2) { 1323fc84bd8b6852aff0a3f70c4f21533ce36e1937behding drv_debug_msg(VIDEO_DEBUG_ERROR, "Denoise and Deblock is alternative!\n"); 1324fc84bd8b6852aff0a3f70c4f21533ce36e1937behding cell_pipeline_param->filter_pipeline[filter_count++] = -1; 1325fc84bd8b6852aff0a3f70c4f21533ce36e1937behding vaStatus = VA_STATUS_ERROR_UNKNOWN; 1326fc84bd8b6852aff0a3f70c4f21533ce36e1937behding goto out; 1327fc84bd8b6852aff0a3f70c4f21533ce36e1937behding } 1328fc84bd8b6852aff0a3f70c4f21533ce36e1937behding 13298e9a21e730449c10cac6e6f69d255611c93f63c2hdingfinished: 13308e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->num_filters = filter_count; 13318e9a21e730449c10cac6e6f69d255611c93f63c2hding 13328e9a21e730449c10cac6e6f69d255611c93f63c2hding /* reorder */ 13338e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 1; i < filter_count; ++i) 13348e9a21e730449c10cac6e6f69d255611c93f63c2hding for (j = i; j > 0; --j) 13358e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cell_pipeline_param->filter_pipeline[j] < cell_pipeline_param->filter_pipeline[j - 1]) { 13368e9a21e730449c10cac6e6f69d255611c93f63c2hding /* swap */ 13378e9a21e730449c10cac6e6f69d255611c93f63c2hding tmp = cell_pipeline_param->filter_pipeline[j]; 13388e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[j] = cell_pipeline_param->filter_pipeline[j - 1]; 13398e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[j - 1] = tmp; 13408e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13418e9a21e730449c10cac6e6f69d255611c93f63c2hding 13428672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VPP_ID, &cmdbuf->param_mem, VssProcPipelineParameterCommand, 13438e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pipeline_param_offset, sizeof(struct VssProcPipelineParameterBuffer)); 13448e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 13458e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 13468e9a21e730449c10cac6e6f69d255611c93f63c2hding} 13478e9a21e730449c10cac6e6f69d255611c93f63c2hding 13488e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_filter_param(context_VPP_p ctx) 13498e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 13508e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 13518e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; 13528e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcDenoiseParameterBuffer *cell_denoiser_param = (struct VssProcDenoiseParameterBuffer *)cmdbuf->denoise_param_p; 13538e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcColorEnhancementParameterBuffer *cell_enhancer_param = (struct VssProcColorEnhancementParameterBuffer *)cmdbuf->enhancer_param_p; 13548e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcSharpenParameterBuffer *cell_sharpen_param = (struct VssProcSharpenParameterBuffer *)cmdbuf->sharpen_param_p; 13558e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcFrcParameterBuffer *cell_proc_frc_param = (struct VssProcFrcParameterBuffer *)cmdbuf->frc_param_p; 13568e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferBase *cur_param = NULL; 13578e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferFrameRateConversion *frc_param = NULL; 13588e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int i; 13598e9a21e730449c10cac6e6f69d255611c93f63c2hding float ratio; 13608e9a21e730449c10cac6e6f69d255611c93f63c2hding 13618e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < ctx->num_filters; ++i) { 13628e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_param = (VAProcFilterParameterBufferBase *)ctx->filter_buf[i]->buffer_data; 13638e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (cur_param->type) { 13648e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterDeblocking: 136566304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_denoiser_param, 136666304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->denoise_deblock_param, 136766304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->denoise_deblock_param)); 13688e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_denoiser_param->type = VssProcDeblock; 136966304487373cf4ed335ba2614f00102dca837832Wang Kun 137066304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 13718672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo CONTEXT_VPP_ID, 137266304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 137366304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcDenoiseParameterCommand, 137466304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->denoise_param_offset, 137566304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcDenoiseParameterBuffer)); 13768e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13778e9a21e730449c10cac6e6f69d255611c93f63c2hding 13788e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNoiseReduction: 137966304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_denoiser_param, 138066304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->denoise_deblock_param, 138166304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->denoise_deblock_param)); 13828e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_denoiser_param->type = VssProcDegrain; 138366304487373cf4ed335ba2614f00102dca837832Wang Kun 138466304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 13858672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo CONTEXT_VPP_ID, 138666304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 138766304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcDenoiseParameterCommand, 138866304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->denoise_param_offset, 138966304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcDenoiseParameterBuffer)); 13908e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13918e9a21e730449c10cac6e6f69d255611c93f63c2hding 13928e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterSharpening: 139366304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_sharpen_param, 139466304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->sharpen_param, 139566304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->sharpen_param)); 139666304487373cf4ed335ba2614f00102dca837832Wang Kun 139766304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 13988672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo CONTEXT_VPP_ID, 139966304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 140066304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcSharpenParameterCommand, 140166304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->sharpen_param_offset, 140266304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcSharpenParameterBuffer)); 14038e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 14048e9a21e730449c10cac6e6f69d255611c93f63c2hding 1405c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 140666304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_enhancer_param, 140766304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->enhancer_param, 140866304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->enhancer_param)); 14095d69fca537b4dd301c586b988129305fa60f1c06Wang Kun 141066304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 14118672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo CONTEXT_VPP_ID, 141266304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 141366304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcColorEnhancementParameterCommand, 141466304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->enhancer_param_offset, 141566304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcColorEnhancementParameterBuffer)); 14168e9a21e730449c10cac6e6f69d255611c93f63c2hding 14178e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 14188e9a21e730449c10cac6e6f69d255611c93f63c2hding 14198e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterFrameRateConversion: 14208e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_buf = ctx->filter_buf[i]; 14218e9a21e730449c10cac6e6f69d255611c93f63c2hding 14228e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_param = (VAProcFilterParameterBufferFrameRateConversion *)ctx->filter_buf[i]->buffer_data; 14238e9a21e730449c10cac6e6f69d255611c93f63c2hding ratio = frc_param->output_fps / (float)frc_param->input_fps; 14248e9a21e730449c10cac6e6f69d255611c93f63c2hding 1425c8e206f338238963120ea9f3f0515329cb791d11Wang Kun /* set the FRC quality */ 1426c8e206f338238963120ea9f3f0515329cb791d11Wang Kun /* cell_proc_frc_param->quality = VssFrcMediumQuality; */ 1427c8e206f338238963120ea9f3f0515329cb791d11Wang Kun cell_proc_frc_param->quality = VssFrcHighQuality; 14288e9a21e730449c10cac6e6f69d255611c93f63c2hding 142966304487373cf4ed335ba2614f00102dca837832Wang Kun /* check if the input fps is in the range of HW capability */ 14308e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ratio == 2) 14318e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->conversion_rate = VssFrc2xConversionRate; 14320e1ed1e239c04f2c34edd6252ed1b16f11980aabYu, Linda else if (ratio == 2.5) 14338e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->conversion_rate = VssFrc2_5xConversionRate; 14348e9a21e730449c10cac6e6f69d255611c93f63c2hding else if (ratio == 4) 14358e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->conversion_rate = VssFrc4xConversionRate; 14365d69fca537b4dd301c586b988129305fa60f1c06Wang Kun else if (ratio == 1.25) 14375d69fca537b4dd301c586b988129305fa60f1c06Wang Kun cell_proc_frc_param->conversion_rate = VssFrc1_25xConversionRate; 14388e9a21e730449c10cac6e6f69d255611c93f63c2hding else { 14398e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid frame rate conversion ratio %f \n", ratio); 14408e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 14418e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 14428e9a21e730449c10cac6e6f69d255611c93f63c2hding } 14438e9a21e730449c10cac6e6f69d255611c93f63c2hding 144466304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 14458672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo CONTEXT_VPP_ID, 144666304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 144766304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcFrcParameterCommand, 144866304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->frc_param_offset, 144966304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcFrcParameterBuffer)); 14508e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 14518e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 14528e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 14538e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 14548e9a21e730449c10cac6e6f69d255611c93f63c2hding } 14558e9a21e730449c10cac6e6f69d255611c93f63c2hding } 14568e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 14578e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 14588e9a21e730449c10cac6e6f69d255611c93f63c2hding} 145966304487373cf4ed335ba2614f00102dca837832Wang Kun 146066304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_resolution(int width, int height) 146166304487373cf4ed335ba2614f00102dca837832Wang Kun{ 146266304487373cf4ed335ba2614f00102dca837832Wang Kun int ret; 146366304487373cf4ed335ba2614f00102dca837832Wang Kun int image_area; 146466304487373cf4ed335ba2614f00102dca837832Wang Kun 146576777b6108cd39192cba113f96b04b98eee39c73Wang Kun if (height < MIN_SUPPORTED_HEIGHT || height > MAX_SUPPORTED_HEIGHT) 146666304487373cf4ed335ba2614f00102dca837832Wang Kun return NOT_SUPPORTED_RESOLUTION; 146766304487373cf4ed335ba2614f00102dca837832Wang Kun 146866304487373cf4ed335ba2614f00102dca837832Wang Kun image_area = height * width; 146966304487373cf4ed335ba2614f00102dca837832Wang Kun 147066304487373cf4ed335ba2614f00102dca837832Wang Kun if (image_area <= QVGA_AREA) 147166304487373cf4ed335ba2614f00102dca837832Wang Kun ret = QCIF_TO_QVGA; 147266304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= VGA_AREA) 147366304487373cf4ed335ba2614f00102dca837832Wang Kun ret = QVGA_TO_VGA; 147466304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= SD_AREA) 147566304487373cf4ed335ba2614f00102dca837832Wang Kun ret = VGA_TO_SD; 147666304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= HD720P_AREA) 147766304487373cf4ed335ba2614f00102dca837832Wang Kun ret = SD_TO_720P; 147866304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= HD1080P_AREA) 147966304487373cf4ed335ba2614f00102dca837832Wang Kun ret = HD720P_TO_1080P; 148066304487373cf4ed335ba2614f00102dca837832Wang Kun else 148166304487373cf4ed335ba2614f00102dca837832Wang Kun ret = NOT_SUPPORTED_RESOLUTION; 148266304487373cf4ed335ba2614f00102dca837832Wang Kun 148366304487373cf4ed335ba2614f00102dca837832Wang Kun return ret; 148466304487373cf4ed335ba2614f00102dca837832Wang Kun} 148566304487373cf4ed335ba2614f00102dca837832Wang Kun 148666304487373cf4ed335ba2614f00102dca837832Wang Kun/* 148766304487373cf4ed335ba2614f00102dca837832Wang Kun * The strength area is: 148866304487373cf4ed335ba2614f00102dca837832Wang Kun * 148966304487373cf4ed335ba2614f00102dca837832Wang Kun * 0______33______66______100 149066304487373cf4ed335ba2614f00102dca837832Wang Kun * LOW MED HIGH 149166304487373cf4ed335ba2614f00102dca837832Wang Kun * 149266304487373cf4ed335ba2614f00102dca837832Wang Kun * MIN=0; MAX=100; STEP=33 149366304487373cf4ed335ba2614f00102dca837832Wang Kun */ 149466304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_vpp_strength(int value) 149566304487373cf4ed335ba2614f00102dca837832Wang Kun{ 149666304487373cf4ed335ba2614f00102dca837832Wang Kun if (value < MIN_VPP_PARAM || value > MAX_VPP_PARAM) 149766304487373cf4ed335ba2614f00102dca837832Wang Kun return INVALID_STRENGTH; 149866304487373cf4ed335ba2614f00102dca837832Wang Kun 149966304487373cf4ed335ba2614f00102dca837832Wang Kun if (value >= MIN_VPP_PARAM && 150066304487373cf4ed335ba2614f00102dca837832Wang Kun value < MIN_VPP_PARAM + STEP_VPP_PARAM) 150166304487373cf4ed335ba2614f00102dca837832Wang Kun return LOW_STRENGTH; 150266304487373cf4ed335ba2614f00102dca837832Wang Kun else if (value >= MIN_VPP_PARAM + STEP_VPP_PARAM && 150366304487373cf4ed335ba2614f00102dca837832Wang Kun value < MIN_VPP_PARAM + 2 * STEP_VPP_PARAM) 150466304487373cf4ed335ba2614f00102dca837832Wang Kun return MEDIUM_STRENGTH; 150566304487373cf4ed335ba2614f00102dca837832Wang Kun else 150666304487373cf4ed335ba2614f00102dca837832Wang Kun return HIGH_STRENGTH; 150766304487373cf4ed335ba2614f00102dca837832Wang Kun} 1508