vsp_VPP.c revision 208fdf0dfa4973738828afe4c0fee995d1c5079c
18e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 28e9a21e730449c10cac6e6f69d255611c93f63c2hding * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 38e9a21e730449c10cac6e6f69d255611c93f63c2hding * 48e9a21e730449c10cac6e6f69d255611c93f63c2hding * Permission is hereby granted, free of charge, to any person obtaining a 58e9a21e730449c10cac6e6f69d255611c93f63c2hding * copy of this software and associated documentation files (the 68e9a21e730449c10cac6e6f69d255611c93f63c2hding * "Software"), to deal in the Software without restriction, including 78e9a21e730449c10cac6e6f69d255611c93f63c2hding * without limitation the rights to use, copy, modify, merge, publish, 88e9a21e730449c10cac6e6f69d255611c93f63c2hding * distribute, sub license, and/or sell copies of the Software, and to 98e9a21e730449c10cac6e6f69d255611c93f63c2hding * permit persons to whom the Software is furnished to do so, subject to 108e9a21e730449c10cac6e6f69d255611c93f63c2hding * the following conditions: 118e9a21e730449c10cac6e6f69d255611c93f63c2hding * 128e9a21e730449c10cac6e6f69d255611c93f63c2hding * The above copyright notice and this permission notice (including the 138e9a21e730449c10cac6e6f69d255611c93f63c2hding * next paragraph) shall be included in all copies or substantial portions 148e9a21e730449c10cac6e6f69d255611c93f63c2hding * of the Software. 158e9a21e730449c10cac6e6f69d255611c93f63c2hding * 168e9a21e730449c10cac6e6f69d255611c93f63c2hding * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 178e9a21e730449c10cac6e6f69d255611c93f63c2hding * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 188e9a21e730449c10cac6e6f69d255611c93f63c2hding * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 198e9a21e730449c10cac6e6f69d255611c93f63c2hding * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 208e9a21e730449c10cac6e6f69d255611c93f63c2hding * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 218e9a21e730449c10cac6e6f69d255611c93f63c2hding * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 228e9a21e730449c10cac6e6f69d255611c93f63c2hding * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 238e9a21e730449c10cac6e6f69d255611c93f63c2hding * 248e9a21e730449c10cac6e6f69d255611c93f63c2hding * Authors: 258e9a21e730449c10cac6e6f69d255611c93f63c2hding * Binglin Chen <binglin.chen@intel.com> 268e9a21e730449c10cac6e6f69d255611c93f63c2hding * 278e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 288e9a21e730449c10cac6e6f69d255611c93f63c2hding 298e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "vsp_VPP.h" 308e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_buffer.h" 318e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_surface.h" 328e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "vsp_cmdbuf.h" 338e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_drv_debug.h" 348e9a21e730449c10cac6e6f69d255611c93f63c2hding 358e9a21e730449c10cac6e6f69d255611c93f63c2hding#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData; 368e9a21e730449c10cac6e6f69d255611c93f63c2hding#define INIT_CONTEXT_VPP context_VPP_p ctx = (context_VPP_p) obj_context->format_data; 378e9a21e730449c10cac6e6f69d255611c93f63c2hding#define CONFIG(id) ((object_config_p) object_heap_lookup( &driver_data->config_heap, id )) 388e9a21e730449c10cac6e6f69d255611c93f63c2hding#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id )) 398e9a21e730449c10cac6e6f69d255611c93f63c2hding#define BUFFER(id) ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id )) 408e9a21e730449c10cac6e6f69d255611c93f63c2hding 418e9a21e730449c10cac6e6f69d255611c93f63c2hding#define SURFACE(id) ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id )) 428e9a21e730449c10cac6e6f69d255611c93f63c2hding 438e9a21e730449c10cac6e6f69d255611c93f63c2hding#define KB 1024 448e9a21e730449c10cac6e6f69d255611c93f63c2hding#define MB (KB * KB) 453a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun#define VSP_CONTEXT_BUF_SIZE (60*KB) 463a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun#define VSP_INTERMEDIATE_BUF_SIZE (29*MB) 478e9a21e730449c10cac6e6f69d255611c93f63c2hding 4866304487373cf4ed335ba2614f00102dca837832Wang Kun#define MAX_VPP_PARAM (100) 4966304487373cf4ed335ba2614f00102dca837832Wang Kun#define MIN_VPP_PARAM (0) 5066304487373cf4ed335ba2614f00102dca837832Wang Kun#define STEP_VPP_PARAM (33) 5166304487373cf4ed335ba2614f00102dca837832Wang Kun#define MAX_VPP_AUTO_PARAM (1) 5266304487373cf4ed335ba2614f00102dca837832Wang Kun#define MIN_VPP_AUTO_PARAM (0) 5366304487373cf4ed335ba2614f00102dca837832Wang Kun#define STEP_VPP_AUTO_PARAM (1) 5466304487373cf4ed335ba2614f00102dca837832Wang Kun 558e9a21e730449c10cac6e6f69d255611c93f63c2hding#define VSP_FORWARD_REF_NUM 3 568e9a21e730449c10cac6e6f69d255611c93f63c2hding 57c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding#define VSP_COLOR_ENHANCE_FEATURES 2 58c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 598e9a21e730449c10cac6e6f69d255611c93f63c2hding#define ALIGN_TO_128(value) ((value + 128 - 1) & ~(128 - 1)) 6076777b6108cd39192cba113f96b04b98eee39c73Wang Kun#define ALIGN_TO_16(value) ((value + 16 - 1) & ~(16 - 1)) 618e9a21e730449c10cac6e6f69d255611c93f63c2hding 6266304487373cf4ed335ba2614f00102dca837832Wang Kun#define QVGA_AREA (320 * 240) 6366304487373cf4ed335ba2614f00102dca837832Wang Kun#define VGA_AREA (640 * 480) 6466304487373cf4ed335ba2614f00102dca837832Wang Kun#define SD_AREA (720 * 576) 6566304487373cf4ed335ba2614f00102dca837832Wang Kun#define HD720P_AREA (1280 * 720) 6676777b6108cd39192cba113f96b04b98eee39c73Wang Kun#define HD1080P_AREA (1920 * 1088) 6776777b6108cd39192cba113f96b04b98eee39c73Wang Kun 6876777b6108cd39192cba113f96b04b98eee39c73Wang Kun#define MIN_SUPPORTED_HEIGHT 96 6976777b6108cd39192cba113f96b04b98eee39c73Wang Kun#define MAX_SUPPORTED_HEIGHT 1088 7066304487373cf4ed335ba2614f00102dca837832Wang Kun 71d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun/** 72d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * The number of supported filter is 5: 73d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterDeblocking 74d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterNoiseReduction 75d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterSharpening 76d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterColorBalance 77d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterFrameRateConversion 78d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun */ 79d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun#define VSP_SUPPORTED_FILTERS_NUM 5 80d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun 81d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun/* The size of supported color standard */ 82d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun#define COLOR_STANDARDS_NUM 1 83d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun 84c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingenum resolution_set { 8566304487373cf4ed335ba2614f00102dca837832Wang Kun NOT_SUPPORTED_RESOLUTION = -1, 8666304487373cf4ed335ba2614f00102dca837832Wang Kun QCIF_TO_QVGA = 0, 8766304487373cf4ed335ba2614f00102dca837832Wang Kun QVGA_TO_VGA, 8866304487373cf4ed335ba2614f00102dca837832Wang Kun VGA_TO_SD, 8966304487373cf4ed335ba2614f00102dca837832Wang Kun SD_TO_720P, 9066304487373cf4ed335ba2614f00102dca837832Wang Kun HD720P_TO_1080P, 91c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding RESOLUTION_SET_NUM 92c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding}; 93c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 94c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingstruct vpp_chain_capability { 95c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int frc_enabled; 96c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int sharpen_enabled; 97c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int color_balance_enabled; 98c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int denoise_enabled; 99c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int deblock_enabled; 100c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding}; 101c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 102c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingenum filter_status { 103c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding FILTER_DISABLED = 0, 104c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding FILTER_ENABLED 105c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding}; 106c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 107c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingstruct vpp_chain_capability vpp_chain_caps[RESOLUTION_SET_NUM] = { 10866304487373cf4ed335ba2614f00102dca837832Wang Kun [HD720P_TO_1080P] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_DISABLED, FILTER_DISABLED}, 10966304487373cf4ed335ba2614f00102dca837832Wang Kun [SD_TO_720P] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_DISABLED, FILTER_DISABLED}, 11066304487373cf4ed335ba2614f00102dca837832Wang Kun [VGA_TO_SD] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_DISABLED, FILTER_DISABLED}, 11166304487373cf4ed335ba2614f00102dca837832Wang Kun [QVGA_TO_VGA] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED}, 11266304487373cf4ed335ba2614f00102dca837832Wang Kun [QCIF_TO_QVGA] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_ENABLED} 11366304487373cf4ed335ba2614f00102dca837832Wang Kun}; 11466304487373cf4ed335ba2614f00102dca837832Wang Kun 11566304487373cf4ed335ba2614f00102dca837832Wang Kunstruct filter_strength { 11666304487373cf4ed335ba2614f00102dca837832Wang Kun struct VssProcDenoiseParameterBuffer denoise_deblock[RESOLUTION_SET_NUM]; 11766304487373cf4ed335ba2614f00102dca837832Wang Kun struct VssProcColorEnhancementParameterBuffer enhancer[RESOLUTION_SET_NUM]; 11866304487373cf4ed335ba2614f00102dca837832Wang Kun struct VssProcSharpenParameterBuffer sharpen[RESOLUTION_SET_NUM]; 11966304487373cf4ed335ba2614f00102dca837832Wang Kun}; 12066304487373cf4ed335ba2614f00102dca837832Wang Kun 12166304487373cf4ed335ba2614f00102dca837832Wang Kunenum filter_strength_type { 12266304487373cf4ed335ba2614f00102dca837832Wang Kun INVALID_STRENGTH = -1, 12366304487373cf4ed335ba2614f00102dca837832Wang Kun LOW_STRENGTH = 0, 12466304487373cf4ed335ba2614f00102dca837832Wang Kun MEDIUM_STRENGTH, 12566304487373cf4ed335ba2614f00102dca837832Wang Kun HIGH_STRENGTH, 12666304487373cf4ed335ba2614f00102dca837832Wang Kun STRENGTH_NUM 12766304487373cf4ed335ba2614f00102dca837832Wang Kun}; 12866304487373cf4ed335ba2614f00102dca837832Wang Kun 12966304487373cf4ed335ba2614f00102dca837832Wang Kun#define SHARPEN_ON (1) 13066304487373cf4ed335ba2614f00102dca837832Wang Kun 13166304487373cf4ed335ba2614f00102dca837832Wang Kunstruct filter_strength vpp_strength[STRENGTH_NUM] = { 13266304487373cf4ed335ba2614f00102dca837832Wang Kun [LOW_STRENGTH] = { 1334b8982ecb6744203ae0b5381942d72a518539661Wang Kun /* structure: 1344b8982ecb6744203ae0b5381942d72a518539661Wang Kun * type(0-Denoise,1-Deblock), value_thr, cnt_thr, coef, temp_thr1, temp_thr2, _pad[2] 1354b8982ecb6744203ae0b5381942d72a518539661Wang Kun */ 13666304487373cf4ed335ba2614f00102dca837832Wang Kun .denoise_deblock = { 1374b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {1, 15, 47, 35, 0, 0, 0, 0}, 1385d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [QVGA_TO_VGA] = {0, 7, 48, 47, 0, 0, 0, 0}, 1395d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [VGA_TO_SD] = {0, 10, 8, 9, 1, 3, 0, 0}, 1404b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {0, 10, 48, 47, 0, 0, 0, 0}, 1414b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {0, 10, 48, 47, 0, 0, 0, 0} 14266304487373cf4ed335ba2614f00102dca837832Wang Kun }, 1434b8982ecb6744203ae0b5381942d72a518539661Wang Kun /* structure: 1444b8982ecb6744203ae0b5381942d72a518539661Wang Kun * temp_detect, temp_correct, clip_thr, mid_thr, luma_amm, chroma_amm, _pad[2] 1454b8982ecb6744203ae0b5381942d72a518539661Wang Kun */ 14666304487373cf4ed335ba2614f00102dca837832Wang Kun .enhancer = { 1474b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {200, 100, 1, 42, 40, 60, 0, 0}, 1484b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = {220, 180, 1, 42, 40, 60, 0, 0}, 1494b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = {220, 200, 1, 42, 40, 60, 0, 0}, 1504b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {100, 100, 5, 33, 0, 0, 0, 0}, 1514b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {100, 100, 5, 33, 0, 0, 0, 0} 15266304487373cf4ed335ba2614f00102dca837832Wang Kun }, 15366304487373cf4ed335ba2614f00102dca837832Wang Kun .sharpen = { 1544b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = { .quality = SHARPEN_ON }, 1554b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = { .quality = SHARPEN_ON }, 1564b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = { .quality = SHARPEN_ON }, 1574b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = { .quality = SHARPEN_ON }, 15866304487373cf4ed335ba2614f00102dca837832Wang Kun [HD720P_TO_1080P] = { .quality = SHARPEN_ON } 15966304487373cf4ed335ba2614f00102dca837832Wang Kun } 16066304487373cf4ed335ba2614f00102dca837832Wang Kun }, 16166304487373cf4ed335ba2614f00102dca837832Wang Kun [MEDIUM_STRENGTH] = { 16266304487373cf4ed335ba2614f00102dca837832Wang Kun .denoise_deblock = { 1634b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {1, 25, 47, 12, 0, 0, 0, 0}, 1645d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [QVGA_TO_VGA] = {0, 10, 48, 47, 0, 0, 0, 0}, 1655d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [VGA_TO_SD] = {0, 20, 8, 9, 2, 4, 0, 0}, 1664b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {0, 10, 48, 47, 0, 0, 0, 0}, 1674b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {0, 10, 48, 47, 0, 0, 0, 0} 16866304487373cf4ed335ba2614f00102dca837832Wang Kun }, 16966304487373cf4ed335ba2614f00102dca837832Wang Kun .enhancer = { 1704b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {100, 100, 1, 33, 100, 100, 0, 0}, 1714b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = {100, 180, 1, 33, 100, 100, 0, 0}, 1724b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = {100, 200, 1, 33, 100, 100, 0, 0}, 1734b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {100, 100, 5, 33, 0, 0, 0, 0}, 1744b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {100, 100, 5, 33, 0, 0, 0, 0} 17566304487373cf4ed335ba2614f00102dca837832Wang Kun }, 17666304487373cf4ed335ba2614f00102dca837832Wang Kun .sharpen = { 1774b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = { .quality = SHARPEN_ON }, 1784b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = { .quality = SHARPEN_ON }, 1794b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = { .quality = SHARPEN_ON }, 1804b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = { .quality = SHARPEN_ON }, 18166304487373cf4ed335ba2614f00102dca837832Wang Kun [HD720P_TO_1080P] = { .quality = SHARPEN_ON } 18266304487373cf4ed335ba2614f00102dca837832Wang Kun } 18366304487373cf4ed335ba2614f00102dca837832Wang Kun }, 18466304487373cf4ed335ba2614f00102dca837832Wang Kun [HIGH_STRENGTH] = { 18566304487373cf4ed335ba2614f00102dca837832Wang Kun .denoise_deblock = { 1864b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {1, 30, 40, 10, 0, 0, 0, 0}, 1875d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [QVGA_TO_VGA] = {0, 15, 45, 25, 0, 0, 0, 0}, 1885d69fca537b4dd301c586b988129305fa60f1c06Wang Kun [VGA_TO_SD] = {0, 20, 7, 5, 3, 6, 0, 0}, 1894b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {0, 10, 48, 47, 0, 0, 0, 0}, 1904b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {0, 10, 48, 47, 0, 0, 0, 0} 19166304487373cf4ed335ba2614f00102dca837832Wang Kun }, 19266304487373cf4ed335ba2614f00102dca837832Wang Kun .enhancer = { 1934b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = {100, 100, 5, 33, 150, 200, 0, 0}, 1944b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = {100, 180, 5, 33, 150, 200, 0, 0}, 1954b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = {100, 200, 5, 33, 100, 150, 0, 0}, 1964b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = {100, 100, 5, 33, 0, 0, 0, 0}, 1974b8982ecb6744203ae0b5381942d72a518539661Wang Kun [HD720P_TO_1080P] = {100, 100, 5, 33, 0, 0, 0, 0} 19866304487373cf4ed335ba2614f00102dca837832Wang Kun }, 19966304487373cf4ed335ba2614f00102dca837832Wang Kun .sharpen = { 2004b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QCIF_TO_QVGA] = { .quality = SHARPEN_ON }, 2014b8982ecb6744203ae0b5381942d72a518539661Wang Kun [QVGA_TO_VGA] = { .quality = SHARPEN_ON }, 2024b8982ecb6744203ae0b5381942d72a518539661Wang Kun [VGA_TO_SD] = { .quality = SHARPEN_ON }, 2034b8982ecb6744203ae0b5381942d72a518539661Wang Kun [SD_TO_720P] = { .quality = SHARPEN_ON }, 20466304487373cf4ed335ba2614f00102dca837832Wang Kun [HD720P_TO_1080P] = { .quality = SHARPEN_ON } 20566304487373cf4ed335ba2614f00102dca837832Wang Kun } 20666304487373cf4ed335ba2614f00102dca837832Wang Kun } 207c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding}; 208c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 2098e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic void vsp_VPP_DestroyContext(object_context_p obj_context); 2108e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_pipeline(context_VPP_p ctx); 2118e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_filter_param(context_VPP_p ctx); 2128e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp__VPP_check_legal_picture(object_context_p obj_context, object_config_p obj_config); 21366304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_resolution(int width, int height); 21466304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_vpp_strength(int value); 2158e9a21e730449c10cac6e6f69d255611c93f63c2hding 2168e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic void vsp_VPP_QueryConfigAttributes( 2178e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProfile profile, 2188e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint entrypoint, 2198e9a21e730449c10cac6e6f69d255611c93f63c2hding VAConfigAttrib *attrib_list, 2208e9a21e730449c10cac6e6f69d255611c93f63c2hding int num_attribs) 2218e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2228e9a21e730449c10cac6e6f69d255611c93f63c2hding /* No VPP specific attributes */ 2238e9a21e730449c10cac6e6f69d255611c93f63c2hding return; 2248e9a21e730449c10cac6e6f69d255611c93f63c2hding} 2258e9a21e730449c10cac6e6f69d255611c93f63c2hding 2268e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_ValidateConfig( 2278e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config) 2288e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2298e9a21e730449c10cac6e6f69d255611c93f63c2hding int i; 2308e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Check all attributes */ 2318e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < obj_config->attrib_count; i++) { 2328e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (obj_config->attrib_list[i].type) { 2338e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAConfigAttribRTFormat: 2348e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Ignore */ 2358e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 2368e9a21e730449c10cac6e6f69d255611c93f63c2hding 2378e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 2388e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED; 2398e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2408e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2418e9a21e730449c10cac6e6f69d255611c93f63c2hding 2428e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_SUCCESS; 2438e9a21e730449c10cac6e6f69d255611c93f63c2hding} 2448e9a21e730449c10cac6e6f69d255611c93f63c2hding 2458e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp__VPP_check_legal_picture(object_context_p obj_context, object_config_p obj_config) 2468e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2478e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 2488e9a21e730449c10cac6e6f69d255611c93f63c2hding 2498e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 2508e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 2518e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 2528e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2538e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2548e9a21e730449c10cac6e6f69d255611c93f63c2hding 2558e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 2568e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 2578e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 2588e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2598e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2608e9a21e730449c10cac6e6f69d255611c93f63c2hding 2618e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2628e9a21e730449c10cac6e6f69d255611c93f63c2hding} 2638e9a21e730449c10cac6e6f69d255611c93f63c2hding 2648e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_CreateContext( 2658e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context, 2668e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config) 2678e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2688e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 2698e9a21e730449c10cac6e6f69d255611c93f63c2hding context_VPP_p ctx; 2708e9a21e730449c10cac6e6f69d255611c93f63c2hding int i; 2718e9a21e730449c10cac6e6f69d255611c93f63c2hding 2728e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Validate flag */ 2738e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Validate picture dimensions */ 2748e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = vsp__VPP_check_legal_picture(obj_context, obj_config); 2758e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VA_STATUS_SUCCESS != vaStatus) { 2768e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 2778e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2788e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2798e9a21e730449c10cac6e6f69d255611c93f63c2hding 2808e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx = (context_VPP_p) calloc(1, sizeof(struct context_VPP_s)); 2818e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == ctx) { 2828e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 2838e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 2848e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2858e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2868e9a21e730449c10cac6e6f69d255611c93f63c2hding 2878e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filters = NULL; 2888e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->num_filters = 0; 2898e9a21e730449c10cac6e6f69d255611c93f63c2hding 2908e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_buf = NULL; 2918e9a21e730449c10cac6e6f69d255611c93f63c2hding 2928e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set size */ 2938e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz = 0; 2948e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pic_param_sz = ALIGN_TO_128(sizeof(struct VssProcPictureParameterBuffer)); 2958e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->pic_param_sz; 2968e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->end_param_sz = ALIGN_TO_128(sizeof(struct VssProcPictureParameterBuffer)); 2978e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->end_param_sz; 2988e9a21e730449c10cac6e6f69d255611c93f63c2hding 2998e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pipeline_param_sz = ALIGN_TO_128(sizeof(struct VssProcPipelineParameterBuffer)); 3008e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->pipeline_param_sz; 3018e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->denoise_param_sz = ALIGN_TO_128(sizeof(struct VssProcDenoiseParameterBuffer)); 3028e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->denoise_param_sz; 3038e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->enhancer_param_sz = ALIGN_TO_128(sizeof(struct VssProcColorEnhancementParameterBuffer)); 3048e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->enhancer_param_sz; 3058e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->sharpen_param_sz = ALIGN_TO_128(sizeof(struct VssProcSharpenParameterBuffer)); 3068e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->sharpen_param_sz; 3078e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_param_sz = ALIGN_TO_128(sizeof(struct VssProcFrcParameterBuffer)); 3088e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->param_sz += ctx->frc_param_sz; 3098e9a21e730449c10cac6e6f69d255611c93f63c2hding 3108e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set offset */ 3118e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pic_param_offset = 0; 3128e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->end_param_offset = ctx->pic_param_offset + ctx->pic_param_sz; 3138e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pipeline_param_offset = ctx->end_param_offset + ctx->end_param_sz; 3148e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->denoise_param_offset = ctx->pipeline_param_offset + ctx->pipeline_param_sz; 3158e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->enhancer_param_offset = ctx->denoise_param_offset + ctx->denoise_param_sz; 3168e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->sharpen_param_offset = ctx->enhancer_param_offset + ctx->enhancer_param_sz; 3178e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_param_offset = ctx->sharpen_param_offset + ctx->sharpen_param_sz; 3188e9a21e730449c10cac6e6f69d255611c93f63c2hding 3193a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun /* create intermediate buffer */ 3203a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun ctx->intermediate_buf = (psb_buffer_p) calloc(1, sizeof(struct psb_buffer_s)); 3213a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun if (NULL == ctx->intermediate_buf) { 3223a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 3233a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun DEBUG_FAILURE; 3243a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun goto out; 3253a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun } 3263a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun vaStatus = psb_buffer_create(obj_context->driver_data, VSP_INTERMEDIATE_BUF_SIZE, psb_bt_vpu_only, ctx->intermediate_buf); 3278e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VA_STATUS_SUCCESS != vaStatus) { 3288e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 3298e9a21e730449c10cac6e6f69d255611c93f63c2hding } 330c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 3318e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context->format_data = (void*) ctx; 3328e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->obj_context = obj_context; 3338e9a21e730449c10cac6e6f69d255611c93f63c2hding 3348e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < obj_config->attrib_count; ++i) { 3358e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VAConfigAttribRTFormat == obj_config->attrib_list[i].type) { 3368e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (obj_config->attrib_list[i].value) { 3378e9a21e730449c10cac6e6f69d255611c93f63c2hding case VA_RT_FORMAT_YUV420: 3388e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->format = VSP_NV12; 3398e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 3408e9a21e730449c10cac6e6f69d255611c93f63c2hding case VA_RT_FORMAT_YUV422: 3418e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->format = VSP_NV16; 3428e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 3438e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->format = VSP_NV12; 3448e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 3458e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3468e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 3478e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3488e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3498e9a21e730449c10cac6e6f69d255611c93f63c2hding 35066304487373cf4ed335ba2614f00102dca837832Wang Kun bzero(&ctx->denoise_deblock_param, sizeof(ctx->denoise_deblock_param)); 35166304487373cf4ed335ba2614f00102dca837832Wang Kun bzero(&ctx->enhancer_param, sizeof(ctx->enhancer_param)); 35266304487373cf4ed335ba2614f00102dca837832Wang Kun bzero(&ctx->sharpen_param, sizeof(ctx->sharpen_param)); 35366304487373cf4ed335ba2614f00102dca837832Wang Kun 3548e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 3558e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 3568e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_VPP_DestroyContext(obj_context); 3578e9a21e730449c10cac6e6f69d255611c93f63c2hding 358c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (ctx) 359c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding free(ctx); 360c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 3618e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 3628e9a21e730449c10cac6e6f69d255611c93f63c2hding} 3638e9a21e730449c10cac6e6f69d255611c93f63c2hding 3648e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic void vsp_VPP_DestroyContext( 3658e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context) 3668e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 3678e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 3688e9a21e730449c10cac6e6f69d255611c93f63c2hding 3693a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun if (ctx->intermediate_buf) { 3703a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun psb_buffer_destroy(ctx->intermediate_buf); 3713a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun 3723a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun free(ctx->intermediate_buf); 3733a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun ctx->intermediate_buf = NULL; 3743a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun } 3753a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun 3768e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->filters) { 3778e9a21e730449c10cac6e6f69d255611c93f63c2hding free(ctx->filters); 3788e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->num_filters = 0; 3798e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3808e9a21e730449c10cac6e6f69d255611c93f63c2hding 3818e9a21e730449c10cac6e6f69d255611c93f63c2hding free(obj_context->format_data); 3828e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context->format_data = NULL; 3838e9a21e730449c10cac6e6f69d255611c93f63c2hding} 3848e9a21e730449c10cac6e6f69d255611c93f63c2hding 385208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kunstatic VAStatus vsp__VPP_process_pipeline_param(context_VPP_p ctx, object_context_p obj_context, object_buffer_p obj_buffer) 3868e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 3878e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 3888e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; 3898e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int i = 0; 3908e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcPipelineParameterBuffer *pipeline_param = (VAProcPipelineParameterBuffer *) obj_buffer->buffer_data; 3918e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcPictureParameterBuffer *cell_proc_picture_param = (struct VssProcPictureParameterBuffer *)cmdbuf->pic_param_p; 3928e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcPictureParameterBuffer *cell_end_param = (struct VssProcPictureParameterBuffer *)cmdbuf->end_param_p; 3938e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferFrameRateConversion *frc_param; 3948e9a21e730449c10cac6e6f69d255611c93f63c2hding object_surface_p input_surface = NULL; 3958e9a21e730449c10cac6e6f69d255611c93f63c2hding object_surface_p cur_output_surf = NULL; 396208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun unsigned int rotation_angle = 0, vsp_rotation_angle = 0; 397208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun int tiled = 0, width = 0, height = 0, stride = 0; 398208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun unsigned char *src_addr, *dest_addr; 399208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun struct psb_surface_s *output_surface; 400208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun psb_driver_data_p driver_data = obj_context->driver_data; 4018e9a21e730449c10cac6e6f69d255611c93f63c2hding 4028e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->surface_region != NULL) { 4038e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't scale\n"); 4048e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4058e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4068e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4078e9a21e730449c10cac6e6f69d255611c93f63c2hding 4088e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->output_region != NULL) { 4098e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't scale\n"); 4108e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4118e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4128e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4138e9a21e730449c10cac6e6f69d255611c93f63c2hding 414c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (pipeline_param->output_background_color != 0) { 415c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't support background color here\n"); 416c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 417c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto out; 418c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 4198e9a21e730449c10cac6e6f69d255611c93f63c2hding 4208e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->filters == NULL) { 4218e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filter setting filters = %p\n", pipeline_param->filters); 4228e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4238e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4248e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4258e9a21e730449c10cac6e6f69d255611c93f63c2hding 4268e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0 4278e9a21e730449c10cac6e6f69d255611c93f63c2hding /* for pass filter */ 4288e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->num_filters == 0 || pipeline_param->num_filters > VssProcPipelineMaxNumFilters) { 4298e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filter number = %d\n", pipeline_param->num_filters); 4308e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4318e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4328e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4338e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif 4348e9a21e730449c10cac6e6f69d255611c93f63c2hding 4358e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->forward_references == NULL) { 4368e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid forward_refereces %p setting\n", pipeline_param->forward_references); 4378e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4388e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4398e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4408e9a21e730449c10cac6e6f69d255611c93f63c2hding 4418e9a21e730449c10cac6e6f69d255611c93f63c2hding /* should we check it? since the begining it's not VSP_FORWARD_REF_NUM */ 4428e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->num_forward_references != VSP_FORWARD_REF_NUM) { 4438e9a21e730449c10cac6e6f69d255611c93f63c2hding 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); 4448e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4458e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4468e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4478e9a21e730449c10cac6e6f69d255611c93f63c2hding 4488e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: no backward reference checking */ 4498e9a21e730449c10cac6e6f69d255611c93f63c2hding if (!(pipeline_param->pipeline_flags & VA_PIPELINE_FLAG_END)) { 4508e9a21e730449c10cac6e6f69d255611c93f63c2hding input_surface = SURFACE(pipeline_param->surface); 4518e9a21e730449c10cac6e6f69d255611c93f63c2hding if (input_surface == NULL) { 4528e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input surface %x\n", pipeline_param->surface); 4538e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4548e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4558e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4568e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4578e9a21e730449c10cac6e6f69d255611c93f63c2hding input_surface = NULL; 4588e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4598e9a21e730449c10cac6e6f69d255611c93f63c2hding 4608e9a21e730449c10cac6e6f69d255611c93f63c2hding /* if it is the first pipeline command */ 4618e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->num_filters != ctx->num_filters || pipeline_param->num_filters == 0) { 4628e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->num_filters != 0) { 4638e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n"); 4648e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4658e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4668e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4678e9a21e730449c10cac6e6f69d255611c93f63c2hding /* save filters */ 4688e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->num_filters = pipeline_param->num_filters; 4698e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->num_filters == 0) { 4708e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filters = NULL; 4718e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4728e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filters = (VABufferID *) calloc(ctx->num_filters, sizeof(*ctx->filters)); 4738e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->filters == NULL) { 4748e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n"); 4758e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 4768e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4778e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4788e9a21e730449c10cac6e6f69d255611c93f63c2hding memcpy(ctx->filters, pipeline_param->filters, ctx->num_filters * sizeof(*ctx->filters)); 4798e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4808e9a21e730449c10cac6e6f69d255611c93f63c2hding 4818e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set pipeline command to FW */ 4828e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = vsp_set_pipeline(ctx); 4838e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus) { 4848e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to set pipeline\n"); 4858e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4868e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4878e9a21e730449c10cac6e6f69d255611c93f63c2hding 4888e9a21e730449c10cac6e6f69d255611c93f63c2hding /* set filter parameter to FW, record frc parameter buffer */ 4898e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = vsp_set_filter_param(ctx); 4908e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus) { 4918e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to set filter parameter\n"); 4928e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 4938e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4948e9a21e730449c10cac6e6f69d255611c93f63c2hding } 4958e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 4968e9a21e730449c10cac6e6f69d255611c93f63c2hding /* else ignore pipeline/filter setting */ 4978e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0 4988e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: we can save these check for PnP */ 4998e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < pipeline_param->num_filters; i++) { 5008e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->filters[i] != ctx->filters[i]) { 5018e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n"); 5028e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 5038e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 5048e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5058e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5068e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif 5078e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5088e9a21e730449c10cac6e6f69d255611c93f63c2hding 5098e9a21e730449c10cac6e6f69d255611c93f63c2hding /* fill picture command to FW */ 5108e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->frc_buf != NULL) 5118e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_param = (VAProcFilterParameterBufferFrameRateConversion *)ctx->frc_buf->buffer_data; 5128e9a21e730449c10cac6e6f69d255611c93f63c2hding else 5138e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_param = NULL; 5148e9a21e730449c10cac6e6f69d255611c93f63c2hding 5158e9a21e730449c10cac6e6f69d255611c93f63c2hding /* end picture command */ 5168e9a21e730449c10cac6e6f69d255611c93f63c2hding if (pipeline_param->pipeline_flags & VA_PIPELINE_FLAG_END) { 5178e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_end_param->num_input_pictures = 0; 5188e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_end_param->num_output_pictures = 0; 5198672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VPP_ID, &cmdbuf->param_mem, VssProcPictureCommand, 5208e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->end_param_offset, sizeof(struct VssProcPictureParameterBuffer)); 521d8c30d116941527fe7c43c89052741ec6ee913ebWang Kun /* Destory the VSP context */ 522d8c30d116941527fe7c43c89052741ec6ee913ebWang Kun vsp_cmdbuf_vpp_context(cmdbuf, VssGenDestroyContext, CONTEXT_VPP_ID, 0); 5238e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 5248e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5258e9a21e730449c10cac6e6f69d255611c93f63c2hding 52646a74932d7ffe581e724385891c0aa26df9b48a9Li Zeng#ifdef PSBVIDEO_VPP_TILING 527e6042d7a5abe6944724bc103e8fbf85082debdeeWang Kun /* get the tiling flag*/ 528e6042d7a5abe6944724bc103e8fbf85082debdeeWang Kun tiled = GET_SURFACE_INFO_tiling(input_surface->psb_surface); 5297009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun#endif 53076777b6108cd39192cba113f96b04b98eee39c73Wang Kun /* According to VIED's design, the width must be multiple of 16 */ 53176777b6108cd39192cba113f96b04b98eee39c73Wang Kun width = ALIGN_TO_16(input_surface->width); 53276777b6108cd39192cba113f96b04b98eee39c73Wang Kun if (width > input_surface->psb_surface->stride) 53376777b6108cd39192cba113f96b04b98eee39c73Wang Kun width = input_surface->psb_surface->stride; 53476777b6108cd39192cba113f96b04b98eee39c73Wang Kun 5357009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun /* Setup input surface */ 5368e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->num_input_pictures = 1; 5378e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->input_picture[0].surface_id = pipeline_param->surface; 5388e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_reloc_pic_param(&(cell_proc_picture_param->input_picture[0].base), ctx->pic_param_offset, &(input_surface->psb_surface->buf), 5398e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->param_mem_loc, cell_proc_picture_param); 5408e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->input_picture[0].height = input_surface->height_origin; 54176777b6108cd39192cba113f96b04b98eee39c73Wang Kun cell_proc_picture_param->input_picture[0].width = width; 5428e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->input_picture[0].irq = 0; 543c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding cell_proc_picture_param->input_picture[0].stride = input_surface->psb_surface->stride; 544c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding cell_proc_picture_param->input_picture[0].format = ctx->format; 5457009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun cell_proc_picture_param->input_picture[0].tiled = tiled; 5465d69fca537b4dd301c586b988129305fa60f1c06Wang Kun cell_proc_picture_param->input_picture[0].rot_angle = 0; 5478e9a21e730449c10cac6e6f69d255611c93f63c2hding 5487009de6747301310514dcdb7c286d0d0790a0ae5Wang Kun /* Setup output surfaces */ 5498e9a21e730449c10cac6e6f69d255611c93f63c2hding if (frc_param == NULL) 5508e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->num_output_pictures = 1; 5518e9a21e730449c10cac6e6f69d255611c93f63c2hding else 5528e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->num_output_pictures = frc_param->num_output_frames + 1; 553208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 5548e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < cell_proc_picture_param->num_output_pictures; ++i) { 5558e9a21e730449c10cac6e6f69d255611c93f63c2hding if (i == 0) { 5568e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_output_surf = ctx->obj_context->current_render_target; 557208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 558208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun /* The rotation info is saved in the first frame */ 559208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun rotation_angle = GET_SURFACE_INFO_rotate(cur_output_surf->psb_surface); 560208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun switch (rotation_angle) { 561208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun case VA_ROTATION_90: 562208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_90; 563208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun break; 564208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun case VA_ROTATION_180: 565208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_180; 566208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun break; 567208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun case VA_ROTATION_270: 568208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_270; 569208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun break; 570208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun default: 571208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_NONE; 572208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun } 5738e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 574c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (frc_param == NULL) { 575c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid output surface numbers %x\n", 576c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding cell_proc_picture_param->num_output_pictures); 577c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 578c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto out; 579c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 580c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 5818e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_output_surf = SURFACE(frc_param->output_frames[i-1]); 5828e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cur_output_surf == NULL) { 5838e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input surface %x\n", frc_param->output_frames[i-1]); 5848e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 5858e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 5868e9a21e730449c10cac6e6f69d255611c93f63c2hding } 587208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 588208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun /* VPP rotation is just for 1080P */ 589208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (tiled && rotation_angle != VA_ROTATION_NONE) { 590208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (VA_STATUS_SUCCESS != psb_CreateRotateSurface(obj_context, cur_output_surf, rotation_angle)) { 591208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc rotation surface!\n"); 592208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vaStatus = VA_STATUS_ERROR_UNKNOWN; 593208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun goto out; 594208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun } 595208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun } 596208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun } 597208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 598208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (tiled && rotation_angle != VA_ROTATION_NONE) { 599208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun /* For 90d and 270d, we need to alloc rotation buff and 600208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun * copy the 0d data from input to output 601208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun */ 602208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun psb_buffer_map(&(input_surface->psb_surface->buf), &src_addr); 603208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun psb_buffer_map(&(cur_output_surf->psb_surface->buf), &dest_addr); 604208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun memcpy(dest_addr, src_addr, cur_output_surf->psb_surface->size); 605208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun psb_buffer_unmap(&(cur_output_surf->psb_surface->buf)); 606208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun psb_buffer_unmap(&(input_surface->psb_surface->buf)); 607208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 608208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun output_surface = cur_output_surf->out_loop_surface; 609208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 610208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun /* According to VIED's design, the width must be multiple of 16 */ 611208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun width = ALIGN_TO_16(cur_output_surf->height_origin); 612208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (width > cur_output_surf->out_loop_surface->stride) 613208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun width = cur_output_surf->out_loop_surface->stride; 614208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun height = cur_output_surf->width; 615208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun stride = cur_output_surf->out_loop_surface->stride; 616208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun } else { 617208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun output_surface = cur_output_surf->psb_surface; 618208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 619208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun /* According to VIED's design, the width must be multiple of 16 */ 620208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun width = ALIGN_TO_16(cur_output_surf->width); 621208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (width > cur_output_surf->psb_surface->stride) 622208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun width = cur_output_surf->psb_surface->stride; 623208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun height = cur_output_surf->height_origin; 624208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun stride = cur_output_surf->psb_surface->stride; 625208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun 626208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun /* If the rotate bit is set by test tool */ 627208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if (pipeline_param->rotation_state == VA_ROTATION_90) 628208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_90; 629208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun else if (pipeline_param->rotation_state == VA_ROTATION_180) 630208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_180; 631208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun else if (pipeline_param->rotation_state == VA_ROTATION_270) 632208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_270; 633208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun else 634208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vsp_rotation_angle = VSP_ROTATION_NONE; 6358e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6368e9a21e730449c10cac6e6f69d255611c93f63c2hding 637208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cell_proc_picture_param->output_picture[i].surface_id = wsbmKBufHandle(wsbmKBuf(output_surface->buf.drm_buf)); 6388e9a21e730449c10cac6e6f69d255611c93f63c2hding 6398e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_reloc_pic_param(&(cell_proc_picture_param->output_picture[i].base), 640208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun ctx->pic_param_offset, &(output_surface->buf), 6418e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->param_mem_loc, cell_proc_picture_param); 642208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cell_proc_picture_param->output_picture[i].height = height; 64376777b6108cd39192cba113f96b04b98eee39c73Wang Kun cell_proc_picture_param->output_picture[i].width = width; 644208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cell_proc_picture_param->output_picture[i].stride = stride; 6458e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->output_picture[i].irq = 1; 6468e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_picture_param->output_picture[i].format = ctx->format; 647208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cell_proc_picture_param->output_picture[i].rot_angle = vsp_rotation_angle; 648208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cell_proc_picture_param->output_picture[i].tiled = tiled; 6494b8982ecb6744203ae0b5381942d72a518539661Wang Kun 650208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun#if 0 651208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun if(cur_output_surf->share_info) { 652208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "##### share_info[%d]: width=%d, height=%d, out_loop_khandler=%x, meta_rotate=%d, surface_rotate=%d\n", i, 653208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cur_output_surf->share_info->width_r, cur_output_surf->share_info->height_r, 654208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cur_output_surf->share_info->out_loop_khandle, 655208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cur_output_surf->share_info->metadata_rotate, cur_output_surf->share_info->surface_rotate); 6564b8982ecb6744203ae0b5381942d72a518539661Wang Kun } 657208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "##### surface_id=%x, width=%d, height=%d, stride=%d, rotation_angle=%d, tiled=%d\n", 658208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun cell_proc_picture_param->output_picture[i].surface_id, 659208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun width, height, stride, vsp_rotation_angle, tiled); 660208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun#endif 6618e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6628e9a21e730449c10cac6e6f69d255611c93f63c2hding 6638672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VPP_ID, &cmdbuf->param_mem, VssProcPictureCommand, 6648e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pic_param_offset, sizeof(struct VssProcPictureParameterBuffer)); 6658e9a21e730449c10cac6e6f69d255611c93f63c2hding 6668e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_fence_pic_param(cmdbuf, wsbmKBufHandle(wsbmKBuf(cmdbuf->param_mem.drm_buf))); 6678e9a21e730449c10cac6e6f69d255611c93f63c2hding 668208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun#if 0 6698e9a21e730449c10cac6e6f69d255611c93f63c2hding /* handle reference frames, ignore backward reference */ 6708e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < pipeline_param->num_forward_references; ++i) { 6718e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_output_surf = SURFACE(pipeline_param->forward_references[i]); 6728e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cur_output_surf == NULL) 6738e9a21e730449c10cac6e6f69d255611c93f63c2hding continue; 674d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (vsp_cmdbuf_buffer_ref(cmdbuf, &cur_output_surf->psb_surface->buf) < 0) { 675d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "vsp_cmdbuf_buffer_ref() failed\n"); 676d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_UNKNOWN; 677d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto out; 678d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 6798e9a21e730449c10cac6e6f69d255611c93f63c2hding } 680208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun#endif 6818e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 6828e9a21e730449c10cac6e6f69d255611c93f63c2hding free(pipeline_param); 6838e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_buffer->buffer_data = NULL; 6848e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_buffer->size = 0; 6858e9a21e730449c10cac6e6f69d255611c93f63c2hding 6868e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 6878e9a21e730449c10cac6e6f69d255611c93f63c2hding} 6888e9a21e730449c10cac6e6f69d255611c93f63c2hding 6898e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_RenderPicture( 6908e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context, 6918e9a21e730449c10cac6e6f69d255611c93f63c2hding object_buffer_p *buffers, 6928e9a21e730449c10cac6e6f69d255611c93f63c2hding int num_buffers) 6938e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 6948e9a21e730449c10cac6e6f69d255611c93f63c2hding int i; 6958e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 6968e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 6978e9a21e730449c10cac6e6f69d255611c93f63c2hding 6988e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < num_buffers; i++) { 6998e9a21e730449c10cac6e6f69d255611c93f63c2hding object_buffer_p obj_buffer = buffers[i]; 7008e9a21e730449c10cac6e6f69d255611c93f63c2hding 7018e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (obj_buffer->type) { 7028e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcPipelineParameterBufferType: 703208fdf0dfa4973738828afe4c0fee995d1c5079cWang Kun vaStatus = vsp__VPP_process_pipeline_param(ctx, obj_context, obj_buffer); 7048e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 7058e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 7068e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 7078e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 7088e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE; 7098e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7108e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus != VA_STATUS_SUCCESS) { 7118e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 7128e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7138e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7148e9a21e730449c10cac6e6f69d255611c93f63c2hding 7158e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 7168e9a21e730449c10cac6e6f69d255611c93f63c2hding} 7178e9a21e730449c10cac6e6f69d255611c93f63c2hding 7188e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_BeginPicture( 7198e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context) 7208e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 7218e9a21e730449c10cac6e6f69d255611c93f63c2hding int ret; 7228e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 7238e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 7248e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf; 7258e9a21e730449c10cac6e6f69d255611c93f63c2hding 7268e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Initialise the command buffer */ 7278e9a21e730449c10cac6e6f69d255611c93f63c2hding ret = vsp_context_get_next_cmdbuf(ctx->obj_context); 7288e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ret) { 7298e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "get next cmdbuf fail\n"); 7308e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 7318e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 7328e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7338e9a21e730449c10cac6e6f69d255611c93f63c2hding 7348e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf = obj_context->vsp_cmdbuf; 7358e9a21e730449c10cac6e6f69d255611c93f63c2hding 736d8c30d116941527fe7c43c89052741ec6ee913ebWang Kun /* first picture, need to setup the VSP context */ 737d8c30d116941527fe7c43c89052741ec6ee913ebWang Kun if (ctx->obj_context->frame_count == 0) 738d8c30d116941527fe7c43c89052741ec6ee913ebWang Kun vsp_cmdbuf_vpp_context(cmdbuf, VssGenInitializeContext, CONTEXT_VPP_ID, VSP_APP_ID_FRC_VPP); 739c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 7408e9a21e730449c10cac6e6f69d255611c93f63c2hding /* map param mem */ 7418e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = psb_buffer_map(&cmdbuf->param_mem, &cmdbuf->param_mem_p); 7428e9a21e730449c10cac6e6f69d255611c93f63c2hding if (vaStatus) { 7438e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 7448e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7458e9a21e730449c10cac6e6f69d255611c93f63c2hding 7468e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pic_param_p = cmdbuf->param_mem_p + ctx->pic_param_offset; 7478e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->end_param_p = cmdbuf->param_mem_p + ctx->end_param_offset; 7488e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pipeline_param_p = cmdbuf->param_mem_p + ctx->pipeline_param_offset; 7498e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->denoise_param_p = cmdbuf->param_mem_p + ctx->denoise_param_offset; 7508e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->enhancer_param_p = cmdbuf->param_mem_p + ctx->enhancer_param_offset; 7518e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->sharpen_param_p = cmdbuf->param_mem_p + ctx->sharpen_param_offset; 7528e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->frc_param_p = cmdbuf->param_mem_p + ctx->frc_param_offset; 7538e9a21e730449c10cac6e6f69d255611c93f63c2hding 7548e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_SUCCESS; 7558e9a21e730449c10cac6e6f69d255611c93f63c2hding} 7568e9a21e730449c10cac6e6f69d255611c93f63c2hding 7578e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_EndPicture( 7588e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context) 7598e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 7608e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_CONTEXT_VPP; 7618e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_driver_data_p driver_data = obj_context->driver_data; 7628e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = obj_context->vsp_cmdbuf; 7638e9a21e730449c10cac6e6f69d255611c93f63c2hding 7648e9a21e730449c10cac6e6f69d255611c93f63c2hding if(cmdbuf->param_mem_p != NULL) { 7658e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_unmap(&cmdbuf->param_mem); 7668e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->param_mem_p = NULL; 7678e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pic_param_p = NULL; 7688e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->end_param_p = NULL; 7698e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->pipeline_param_p = NULL; 7708e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->denoise_param_p = NULL; 7718e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->enhancer_param_p = NULL; 7728e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->sharpen_param_p = NULL; 7738e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->frc_param_p = NULL; 7748e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7758e9a21e730449c10cac6e6f69d255611c93f63c2hding 776d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (vsp_context_flush_cmdbuf(ctx->obj_context)) { 7778e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VPP: flush deblock cmdbuf error\n"); 778d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun return VA_STATUS_ERROR_UNKNOWN; 779d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 7808e9a21e730449c10cac6e6f69d255611c93f63c2hding 7818e9a21e730449c10cac6e6f69d255611c93f63c2hding return VA_STATUS_SUCCESS; 7828e9a21e730449c10cac6e6f69d255611c93f63c2hding} 7838e9a21e730449c10cac6e6f69d255611c93f63c2hding 7848e9a21e730449c10cac6e6f69d255611c93f63c2hdingstruct format_vtable_s vsp_VPP_vtable = { 7858e9a21e730449c10cac6e6f69d255611c93f63c2hdingqueryConfigAttributes: 7868e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_QueryConfigAttributes, 7878e9a21e730449c10cac6e6f69d255611c93f63c2hdingvalidateConfig: 7888e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_ValidateConfig, 7898e9a21e730449c10cac6e6f69d255611c93f63c2hdingcreateContext: 7908e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_CreateContext, 7918e9a21e730449c10cac6e6f69d255611c93f63c2hdingdestroyContext: 7928e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_DestroyContext, 7938e9a21e730449c10cac6e6f69d255611c93f63c2hdingbeginPicture: 7948e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_BeginPicture, 7958e9a21e730449c10cac6e6f69d255611c93f63c2hdingrenderPicture: 7968e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_RenderPicture, 7978e9a21e730449c10cac6e6f69d255611c93f63c2hdingendPicture: 7988e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_EndPicture 7998e9a21e730449c10cac6e6f69d255611c93f63c2hding}; 8008e9a21e730449c10cac6e6f69d255611c93f63c2hding 8018e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcFilters( 8028e9a21e730449c10cac6e6f69d255611c93f63c2hding VADriverContextP ctx, 8038e9a21e730449c10cac6e6f69d255611c93f63c2hding VAContextID context, 8048e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterType *filters, 8058e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int *num_filters 8068e9a21e730449c10cac6e6f69d255611c93f63c2hding ) 8078e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 8088e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_DRIVER_DATA; 8098e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 8108e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context; 8118e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config; 8128e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint tmp; 8138e9a21e730449c10cac6e6f69d255611c93f63c2hding int count; 8148e9a21e730449c10cac6e6f69d255611c93f63c2hding 8158e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if ctx is right */ 8168e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context = CONTEXT(context); 8178e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 8188e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 81938cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 8208e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8218e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8228e9a21e730449c10cac6e6f69d255611c93f63c2hding 8238e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_config = CONFIG(obj_context->config_id); 8248e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 8258e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 82638cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 8278e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8288e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8298e9a21e730449c10cac6e6f69d255611c93f63c2hding 8308e9a21e730449c10cac6e6f69d255611c93f63c2hding tmp = obj_config->entrypoint; 8318e9a21e730449c10cac6e6f69d255611c93f63c2hding if (tmp != VAEntrypointVideoProc) { 8328e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "current entrypoint is %d, not VAEntrypointVideoProc\n", tmp); 8338e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 8348e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8358e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8368e9a21e730449c10cac6e6f69d255611c93f63c2hding 837d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check if filters and num_filters is valid */ 8388e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == num_filters || NULL == filters) { 8398e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters %p, filters %p\n", num_filters, filters); 84038cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 8418e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8428e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8438e9a21e730449c10cac6e6f69d255611c93f63c2hding 844d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check if the filter array size is valid */ 845d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (*num_filters < VSP_SUPPORTED_FILTERS_NUM) { 846d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The filters array size(%d) is NOT valid! Supported filters num is %d\n", 847d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun *num_filters, VSP_SUPPORTED_FILTERS_NUM); 848d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 849d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun *num_filters = VSP_SUPPORTED_FILTERS_NUM; 850d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto err; 851d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 852d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun 8538e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if current HW support Video proc */ 8548e9a21e730449c10cac6e6f69d255611c93f63c2hding if (IS_MRFL(driver_data)) { 8558e9a21e730449c10cac6e6f69d255611c93f63c2hding count = 0; 856c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding filters[count++] = VAProcFilterDeblocking; 8578e9a21e730449c10cac6e6f69d255611c93f63c2hding filters[count++] = VAProcFilterNoiseReduction; 8588e9a21e730449c10cac6e6f69d255611c93f63c2hding filters[count++] = VAProcFilterSharpening; 859c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding filters[count++] = VAProcFilterColorBalance; 8608e9a21e730449c10cac6e6f69d255611c93f63c2hding filters[count++] = VAProcFilterFrameRateConversion; 8618e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filters = count; 8628e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 8638e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filters = 0; 8648e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8658e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr: 8668e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 8678e9a21e730449c10cac6e6f69d255611c93f63c2hding} 8688e9a21e730449c10cac6e6f69d255611c93f63c2hding 8698e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcFilterCaps( 8708e9a21e730449c10cac6e6f69d255611c93f63c2hding VADriverContextP ctx, 8718e9a21e730449c10cac6e6f69d255611c93f63c2hding VAContextID context, 8728e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterType type, 8738e9a21e730449c10cac6e6f69d255611c93f63c2hding void *filter_caps, 8748e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int *num_filter_caps 8758e9a21e730449c10cac6e6f69d255611c93f63c2hding ) 8768e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 8778e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_DRIVER_DATA; 8788e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 8798e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context; 8808e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config; 8818e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint tmp; 882fc84bd8b6852aff0a3f70c4f21533ce36e1937behding VAProcFilterCap *denoise_cap, *deblock_cap; 8838e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterCap *sharpen_cap; 884c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterCapColorBalance *color_balance_cap; 8858e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterCap *frc_cap; 8868e9a21e730449c10cac6e6f69d255611c93f63c2hding 8878e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if context is right */ 8888e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context = CONTEXT(context); 8898e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 8908e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 89138cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 8928e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 8938e9a21e730449c10cac6e6f69d255611c93f63c2hding } 8948e9a21e730449c10cac6e6f69d255611c93f63c2hding 8958e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_config = CONFIG(obj_context->config_id); 8968e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 8978e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 89838cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 8998e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9008e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9018e9a21e730449c10cac6e6f69d255611c93f63c2hding 9028e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if filter_caps and num_filter_caps is right */ 9038e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == num_filter_caps || NULL == filter_caps){ 9048e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters %p, filters %p\n", num_filter_caps, filter_caps); 90538cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 9068e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9078e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9088e9a21e730449c10cac6e6f69d255611c93f63c2hding 9098e9a21e730449c10cac6e6f69d255611c93f63c2hding if (*num_filter_caps < 1) { 9108e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters == %d (> 1)\n", *num_filter_caps); 91138cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 9128e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9138e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9148e9a21e730449c10cac6e6f69d255611c93f63c2hding 9158e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if curent HW support and return corresponding caps */ 9168e9a21e730449c10cac6e6f69d255611c93f63c2hding if (IS_MRFL(driver_data)) { 9178e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: we should use a constant table to return caps */ 9188e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (type) { 9198e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNoiseReduction: 9208e9a21e730449c10cac6e6f69d255611c93f63c2hding denoise_cap = filter_caps; 92166304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.min_value = MIN_VPP_PARAM; 92266304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.max_value = MAX_VPP_PARAM; 92366304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.default_value = MIN_VPP_PARAM; 92466304487373cf4ed335ba2614f00102dca837832Wang Kun denoise_cap->range.step = STEP_VPP_PARAM; 925c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 9268e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 927fc84bd8b6852aff0a3f70c4f21533ce36e1937behding case VAProcFilterDeblocking: 928fc84bd8b6852aff0a3f70c4f21533ce36e1937behding deblock_cap = filter_caps; 92966304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.min_value = MIN_VPP_PARAM; 93066304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.max_value = MAX_VPP_PARAM; 93166304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.default_value = MIN_VPP_PARAM; 93266304487373cf4ed335ba2614f00102dca837832Wang Kun deblock_cap->range.step = STEP_VPP_PARAM; 933c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 934fc84bd8b6852aff0a3f70c4f21533ce36e1937behding break; 9358e9a21e730449c10cac6e6f69d255611c93f63c2hding 9368e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterSharpening: 9378e9a21e730449c10cac6e6f69d255611c93f63c2hding sharpen_cap = filter_caps; 93866304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.min_value = MIN_VPP_PARAM; 93966304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.max_value = MAX_VPP_PARAM; 94066304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.default_value = MIN_VPP_PARAM; 94166304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen_cap->range.step = STEP_VPP_PARAM; 942c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 9438e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 9448e9a21e730449c10cac6e6f69d255611c93f63c2hding 945c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 946c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding if (*num_filter_caps < VSP_COLOR_ENHANCE_FEATURES) { 947c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding drv_debug_msg(VIDEO_DEBUG_ERROR, "filter cap num is should big than %d(%d)\n", 948c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VSP_COLOR_ENHANCE_FEATURES, *num_filter_caps); 949d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 950d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun *num_filter_caps = VSP_COLOR_ENHANCE_FEATURES; 951c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 952c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 953c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap = filter_caps; 954c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap->type = VAProcColorBalanceAutoSaturation; 95566304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.min_value = MIN_VPP_AUTO_PARAM; 95666304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.max_value = MAX_VPP_AUTO_PARAM; 95766304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.default_value = MIN_VPP_AUTO_PARAM; 95866304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.step = STEP_VPP_AUTO_PARAM; 959c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 960c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap++; 961c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding color_balance_cap->type = VAProcColorBalanceAutoBrightness; 96266304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.min_value = MIN_VPP_AUTO_PARAM; 96366304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.max_value = MAX_VPP_AUTO_PARAM; 96466304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.default_value = MIN_VPP_AUTO_PARAM; 96566304487373cf4ed335ba2614f00102dca837832Wang Kun color_balance_cap->range.step = STEP_VPP_AUTO_PARAM; 966c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 967c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 2; 9688e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 9698e9a21e730449c10cac6e6f69d255611c93f63c2hding 9708e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterFrameRateConversion: 9718e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap = filter_caps; 9728e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.min_value = 2; 9738e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.max_value = 4; 9748e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.default_value = 2; 9758e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: it's a set, step is helpless */ 9768e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_cap->range.step = 0.5; 977c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding *num_filter_caps = 1; 9788e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 9798e9a21e730449c10cac6e6f69d255611c93f63c2hding 9808e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 9818e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide filter type %d\n", type); 98238cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 9838e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filter_caps = 0; 9848e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 9858e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9868e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 9878e9a21e730449c10cac6e6f69d255611c93f63c2hding *num_filter_caps = 0; 9888e9a21e730449c10cac6e6f69d255611c93f63c2hding } 9898e9a21e730449c10cac6e6f69d255611c93f63c2hding 9908e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr: 9918e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 9928e9a21e730449c10cac6e6f69d255611c93f63c2hding} 9938e9a21e730449c10cac6e6f69d255611c93f63c2hding 9948e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcPipelineCaps( 9958e9a21e730449c10cac6e6f69d255611c93f63c2hding VADriverContextP ctx, 9968e9a21e730449c10cac6e6f69d255611c93f63c2hding VAContextID context, 9978e9a21e730449c10cac6e6f69d255611c93f63c2hding VABufferID *filters, 9988e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int num_filters, 9998e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcPipelineCaps *pipeline_caps 10008e9a21e730449c10cac6e6f69d255611c93f63c2hding ) 10018e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 10028e9a21e730449c10cac6e6f69d255611c93f63c2hding INIT_DRIVER_DATA; 10038e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 10048e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context; 10058e9a21e730449c10cac6e6f69d255611c93f63c2hding object_config_p obj_config; 10068e9a21e730449c10cac6e6f69d255611c93f63c2hding VAEntrypoint tmp; 1007c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding unsigned int i, j; 1008c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBuffer *deblock, *denoise, *sharpen; 1009c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBufferFrameRateConversion *frc; 1010c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBufferColorBalance *balance; 1011c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding VAProcFilterParameterBufferBase *base; 1012c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding object_buffer_p buf; 1013c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding uint32_t enabled_brightness, enabled_saturation; 1014c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding float ratio; 1015c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding int res_set; 101666304487373cf4ed335ba2614f00102dca837832Wang Kun int strength; 101766304487373cf4ed335ba2614f00102dca837832Wang Kun context_VPP_p vpp_ctx; 101836b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun int combination_check; 10198e9a21e730449c10cac6e6f69d255611c93f63c2hding 10208e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check if ctx is right */ 10218e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context = CONTEXT(context); 10228e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_context) { 10238e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n"); 102438cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT; 10258e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10268e9a21e730449c10cac6e6f69d255611c93f63c2hding } 10278e9a21e730449c10cac6e6f69d255611c93f63c2hding 102866304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_ctx = (context_VPP_p) obj_context->format_data; 102966304487373cf4ed335ba2614f00102dca837832Wang Kun 10308e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_config = CONFIG(obj_context->config_id); 10318e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == obj_config) { 10328e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n"); 103338cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_CONFIG; 10348e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10358e9a21e730449c10cac6e6f69d255611c93f63c2hding } 10368e9a21e730449c10cac6e6f69d255611c93f63c2hding 103776777b6108cd39192cba113f96b04b98eee39c73Wang Kun /* Don't check the filter number. 103876777b6108cd39192cba113f96b04b98eee39c73Wang Kun * According to VIED's design, without any filter, HW will just copy input data 103976777b6108cd39192cba113f96b04b98eee39c73Wang Kun */ 104076777b6108cd39192cba113f96b04b98eee39c73Wang Kun#if 0 10418e9a21e730449c10cac6e6f69d255611c93f63c2hding if (num_filters == 0) { 10428e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_filters %d\n", num_filters); 104338cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 10448e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10458e9a21e730449c10cac6e6f69d255611c93f63c2hding } 104676777b6108cd39192cba113f96b04b98eee39c73Wang Kun#endif 10478e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == filters || pipeline_caps == NULL) { 10488e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filters %p or pipeline_caps %p\n", filters, pipeline_caps); 104938cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 10508e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10518e9a21e730449c10cac6e6f69d255611c93f63c2hding } 10528e9a21e730449c10cac6e6f69d255611c93f63c2hding 10538e9a21e730449c10cac6e6f69d255611c93f63c2hding /* base on HW capability check the filters and return pipeline caps */ 10548e9a21e730449c10cac6e6f69d255611c93f63c2hding if (IS_MRFL(driver_data)) { 10558e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->pipeline_flags = 0; 10568e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->filter_flags = 0; 10578e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->num_forward_references = VSP_FORWARD_REF_NUM; 10588e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->num_backward_references = 0; 10598e9a21e730449c10cac6e6f69d255611c93f63c2hding 1060d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check the input color standard */ 1061d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->input_color_standards == NULL){ 1062d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input color standard array!\n"); 106338cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 10648e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10658e9a21e730449c10cac6e6f69d255611c93f63c2hding } 1066d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->num_input_color_standards < COLOR_STANDARDS_NUM) { 1067d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_input_color_standards %d\n", pipeline_caps->num_input_color_standards); 1068d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 1069d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_input_color_standards = COLOR_STANDARDS_NUM; 1070d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto err; 1071d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 10728e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->input_color_standards[0] = VAProcColorStandardNone; 1073d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_input_color_standards = COLOR_STANDARDS_NUM; 10748e9a21e730449c10cac6e6f69d255611c93f63c2hding 1075d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun /* check the output color standard */ 1076d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->output_color_standards == NULL){ 1077d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid output color standard array!\n"); 107838cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 10798e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 10808e9a21e730449c10cac6e6f69d255611c93f63c2hding } 1081d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun if (pipeline_caps->num_output_color_standards < COLOR_STANDARDS_NUM) { 1082d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_output_color_standards %d\n", pipeline_caps->num_output_color_standards); 1083d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED; 1084d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_output_color_standards = COLOR_STANDARDS_NUM; 1085d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun goto err; 1086d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun } 10878e9a21e730449c10cac6e6f69d255611c93f63c2hding pipeline_caps->output_color_standards[0] = VAProcColorStandardNone; 1088d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun pipeline_caps->num_output_color_standards = COLOR_STANDARDS_NUM; 10898e9a21e730449c10cac6e6f69d255611c93f63c2hding 109066304487373cf4ed335ba2614f00102dca837832Wang Kun /* check the resolution */ 109166304487373cf4ed335ba2614f00102dca837832Wang Kun res_set = check_resolution(obj_context->picture_width, 109266304487373cf4ed335ba2614f00102dca837832Wang Kun obj_context->picture_height); 109366304487373cf4ed335ba2614f00102dca837832Wang Kun if (res_set == NOT_SUPPORTED_RESOLUTION) { 1094c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED; 1095c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1096c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1097c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 109836b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (getenv("VSP_PIPELINE_CHECK") != NULL) 109936b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun combination_check = 1; 110066304487373cf4ed335ba2614f00102dca837832Wang Kun else 110136b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun combination_check = 0; 1102c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 11038e9a21e730449c10cac6e6f69d255611c93f63c2hding /* FIXME: should check filter value settings here */ 11048e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < num_filters; ++i) { 11058e9a21e730449c10cac6e6f69d255611c93f63c2hding /* find buffer */ 1106c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding buf = BUFFER(*(filters + i)); 11070b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun if (!buf) { 11080b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun vaStatus = VA_STATUS_ERROR_UNKNOWN; 11090b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun goto err; 11100b79338c7b34af6f2baade29264bcf27cab80e83Wang Kun } 1111c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1112c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding base = (VAProcFilterParameterBufferBase *)buf->buffer_data; 11138e9a21e730449c10cac6e6f69d255611c93f63c2hding /* check filter buffer setting */ 1114c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding switch (base->type) { 1115c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterDeblocking: 111666304487373cf4ed335ba2614f00102dca837832Wang Kun deblock = (VAProcFilterParameterBuffer *)base; 111766304487373cf4ed335ba2614f00102dca837832Wang Kun 111836b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 111966304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].deblock_enabled != FILTER_ENABLED) { 1120d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The deblock is DISABLE for %d format\n", res_set); 1121c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1122c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 112366304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 112466304487373cf4ed335ba2614f00102dca837832Wang Kun /* check if the value is right */ 112566304487373cf4ed335ba2614f00102dca837832Wang Kun strength = check_vpp_strength(deblock->value); 112666304487373cf4ed335ba2614f00102dca837832Wang Kun if (strength == INVALID_STRENGTH) { 112766304487373cf4ed335ba2614f00102dca837832Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_VALUE; 112866304487373cf4ed335ba2614f00102dca837832Wang Kun goto err; 112966304487373cf4ed335ba2614f00102dca837832Wang Kun } 113066304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->denoise_deblock_param, 113166304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].denoise_deblock[res_set], 113266304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->denoise_deblock_param)); 1133c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1134c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1135c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1136c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterNoiseReduction: 113766304487373cf4ed335ba2614f00102dca837832Wang Kun denoise = (VAProcFilterParameterBuffer *)base; 113866304487373cf4ed335ba2614f00102dca837832Wang Kun 113936b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 114066304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].denoise_enabled != FILTER_ENABLED) { 1141d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The denoise is DISABLE for %d format\n", res_set); 1142c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1143c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 114466304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 114566304487373cf4ed335ba2614f00102dca837832Wang Kun strength = check_vpp_strength(denoise->value); 114666304487373cf4ed335ba2614f00102dca837832Wang Kun if (strength == INVALID_STRENGTH) { 114766304487373cf4ed335ba2614f00102dca837832Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_VALUE; 114866304487373cf4ed335ba2614f00102dca837832Wang Kun goto err; 114966304487373cf4ed335ba2614f00102dca837832Wang Kun } 115066304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->denoise_deblock_param, 115166304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].denoise_deblock[res_set], 115266304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->denoise_deblock_param)); 1153c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1154c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1155c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1156c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterSharpening: 115766304487373cf4ed335ba2614f00102dca837832Wang Kun sharpen = (VAProcFilterParameterBuffer *)base; 115866304487373cf4ed335ba2614f00102dca837832Wang Kun 115936b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 116066304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].sharpen_enabled != FILTER_ENABLED) { 1161d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The sharpen is DISABLE for %d format\n", res_set); 1162c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1163c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 116466304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 116566304487373cf4ed335ba2614f00102dca837832Wang Kun strength = check_vpp_strength(sharpen->value); 116666304487373cf4ed335ba2614f00102dca837832Wang Kun if (strength == INVALID_STRENGTH) { 116766304487373cf4ed335ba2614f00102dca837832Wang Kun vaStatus = VA_STATUS_ERROR_INVALID_VALUE; 116866304487373cf4ed335ba2614f00102dca837832Wang Kun goto err; 116966304487373cf4ed335ba2614f00102dca837832Wang Kun } 117066304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->sharpen_param, 117166304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].sharpen[res_set], 117266304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->sharpen_param)); 1173c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1174c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1175c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1176c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 1177c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding balance = (VAProcFilterParameterBufferColorBalance *)base; 1178c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1179c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_brightness = 0; 1180c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_saturation = 0; 1181c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1182c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding for (j = 0; j < buf->num_elements; ++j, ++balance) { 118366304487373cf4ed335ba2614f00102dca837832Wang Kun if (balance->attrib == VAProcColorBalanceAutoSaturation && 118466304487373cf4ed335ba2614f00102dca837832Wang Kun balance->value == MAX_VPP_AUTO_PARAM) { 1185c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_saturation = 1; 118666304487373cf4ed335ba2614f00102dca837832Wang Kun } else if (balance->attrib == VAProcColorBalanceAutoBrightness && 118766304487373cf4ed335ba2614f00102dca837832Wang Kun balance->value == MAX_VPP_AUTO_PARAM) { 1188c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding enabled_brightness = 1; 1189c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } else { 1190d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The color_banlance do NOT support this attrib %d\n", 1191d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun balance->attrib); 1192c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 1193c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1194c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1195c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1196c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1197c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding /* check filter chain */ 119836b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 119966304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].color_balance_enabled != FILTER_ENABLED) { 1200d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The color_balance is DISABLE for %d format\n", res_set); 1201c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1202c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 120366304487373cf4ed335ba2614f00102dca837832Wang Kun } else { 120466304487373cf4ed335ba2614f00102dca837832Wang Kun strength = MEDIUM_STRENGTH; 120566304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(&vpp_ctx->enhancer_param, 120666304487373cf4ed335ba2614f00102dca837832Wang Kun &vpp_strength[strength].enhancer[res_set], 120766304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(vpp_ctx->enhancer_param)); 120866304487373cf4ed335ba2614f00102dca837832Wang Kun if (!enabled_saturation) 120966304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_ctx->enhancer_param.chroma_amm = 0; 121066304487373cf4ed335ba2614f00102dca837832Wang Kun if (!enabled_brightness) 121166304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_ctx->enhancer_param.luma_amm = 0; 1212c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1213c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1214c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1215c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1216c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterFrameRateConversion: 1217c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding frc = (VAProcFilterParameterBufferFrameRateConversion *)base; 1218c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1219c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding /* check frame rate */ 1220c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding ratio = frc->output_fps / (float)frc->input_fps; 1221c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 12220e1ed1e239c04f2c34edd6252ed1b16f11980aabYu, Linda if (!((ratio == 2 || ratio == 2.5 || ratio == 4) && frc->output_fps <= 60)) { 1223d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The FRC do NOT support the ration(%f) and fps(%d)\n", 1224d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun ratio, frc->output_fps); 1225c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER; 1226c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1227c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1228c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1229c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding /* check the chain */ 123036b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun if (combination_check && 123166304487373cf4ed335ba2614f00102dca837832Wang Kun vpp_chain_caps[res_set].frc_enabled != FILTER_ENABLED) { 1232d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "The FRC is DISABLE for %d format\n", res_set); 1233c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN; 1234c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1235c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 1236c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding 1237c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding break; 1238c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding default: 1239d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun drv_debug_msg(VIDEO_DEBUG_ERROR, "Do NOT support the filter type %d\n", base->type); 1240c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 1241c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding goto err; 1242c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding } 12438e9a21e730449c10cac6e6f69d255611c93f63c2hding } 12448e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 12458e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "no HW support\n"); 12468e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 12478e9a21e730449c10cac6e6f69d255611c93f63c2hding goto err; 12488e9a21e730449c10cac6e6f69d255611c93f63c2hding } 12498e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr: 12508e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 12518e9a21e730449c10cac6e6f69d255611c93f63c2hding} 12528e9a21e730449c10cac6e6f69d255611c93f63c2hding 12538e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_pipeline(context_VPP_p ctx) 12548e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 12558e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 12568e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; 12578e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcPipelineParameterBuffer *cell_pipeline_param = (struct VssProcPipelineParameterBuffer *)cmdbuf->pipeline_param_p; 1258fc84bd8b6852aff0a3f70c4f21533ce36e1937behding unsigned int i, j, filter_count, check_filter = 0; 12598e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferBase *cur_param; 12608e9a21e730449c10cac6e6f69d255611c93f63c2hding enum VssProcFilterType tmp; 12618e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_driver_data_p driver_data = ctx->obj_context->driver_data; 12628e9a21e730449c10cac6e6f69d255611c93f63c2hding 12633a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun /* set intermediate buffer */ 12643a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun cell_pipeline_param->intermediate_buffer_size = VSP_INTERMEDIATE_BUF_SIZE; 12653a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun cell_pipeline_param->intermediate_buffer_base = wsbmBOOffsetHint(ctx->intermediate_buf->drm_buf); 12663a06cac9739f834b59d88bbcfb9c95229117a204Wang Kun 12678e9a21e730449c10cac6e6f69d255611c93f63c2hding /* init pipeline cmd */ 12688e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < VssProcPipelineMaxNumFilters; ++i) 12698e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[i] = -1; 12708e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->num_filters = 0; 12718e9a21e730449c10cac6e6f69d255611c93f63c2hding 12728e9a21e730449c10cac6e6f69d255611c93f63c2hding filter_count = 0; 12738e9a21e730449c10cac6e6f69d255611c93f63c2hding 12748e9a21e730449c10cac6e6f69d255611c93f63c2hding /* store filter buffer object */ 12758e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ctx->num_filters != 0) { 12768e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < ctx->num_filters; ++i) 12778e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->filter_buf[i] = BUFFER(ctx->filters[i]); 12788e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 12798e9a21e730449c10cac6e6f69d255611c93f63c2hding goto finished; 12808e9a21e730449c10cac6e6f69d255611c93f63c2hding } 12818e9a21e730449c10cac6e6f69d255611c93f63c2hding 12828e9a21e730449c10cac6e6f69d255611c93f63c2hding /* loop the filter, set correct pipeline param for FW */ 12838e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < ctx->num_filters; ++i) { 12848e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_param = (VAProcFilterParameterBufferBase *)ctx->filter_buf[i]->buffer_data; 12858e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (cur_param->type) { 12868e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNone: 12878e9a21e730449c10cac6e6f69d255611c93f63c2hding goto finished; 12888e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 12898e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNoiseReduction: 1290fc84bd8b6852aff0a3f70c4f21533ce36e1937behding case VAProcFilterDeblocking: 12918e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterDenoise; 1292fc84bd8b6852aff0a3f70c4f21533ce36e1937behding check_filter++; 12938e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 12948e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterSharpening: 12958e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterSharpening; 12968e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 1297c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 12988e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterColorEnhancement; 12998e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13008e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterFrameRateConversion: 13018e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterFrameRateConversion; 13028e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13038e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 13048e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[filter_count++] = -1; 13058e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 13068e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 13078e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13088e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13098e9a21e730449c10cac6e6f69d255611c93f63c2hding 1310fc84bd8b6852aff0a3f70c4f21533ce36e1937behding /* Denoise and Deblock is alternative */ 1311fc84bd8b6852aff0a3f70c4f21533ce36e1937behding if (check_filter >= 2) { 1312fc84bd8b6852aff0a3f70c4f21533ce36e1937behding drv_debug_msg(VIDEO_DEBUG_ERROR, "Denoise and Deblock is alternative!\n"); 1313fc84bd8b6852aff0a3f70c4f21533ce36e1937behding cell_pipeline_param->filter_pipeline[filter_count++] = -1; 1314fc84bd8b6852aff0a3f70c4f21533ce36e1937behding vaStatus = VA_STATUS_ERROR_UNKNOWN; 1315fc84bd8b6852aff0a3f70c4f21533ce36e1937behding goto out; 1316fc84bd8b6852aff0a3f70c4f21533ce36e1937behding } 1317fc84bd8b6852aff0a3f70c4f21533ce36e1937behding 13188e9a21e730449c10cac6e6f69d255611c93f63c2hdingfinished: 13198e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->num_filters = filter_count; 13208e9a21e730449c10cac6e6f69d255611c93f63c2hding 13218e9a21e730449c10cac6e6f69d255611c93f63c2hding /* reorder */ 13228e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 1; i < filter_count; ++i) 13238e9a21e730449c10cac6e6f69d255611c93f63c2hding for (j = i; j > 0; --j) 13248e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cell_pipeline_param->filter_pipeline[j] < cell_pipeline_param->filter_pipeline[j - 1]) { 13258e9a21e730449c10cac6e6f69d255611c93f63c2hding /* swap */ 13268e9a21e730449c10cac6e6f69d255611c93f63c2hding tmp = cell_pipeline_param->filter_pipeline[j]; 13278e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[j] = cell_pipeline_param->filter_pipeline[j - 1]; 13288e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_pipeline_param->filter_pipeline[j - 1] = tmp; 13298e9a21e730449c10cac6e6f69d255611c93f63c2hding } 13308e9a21e730449c10cac6e6f69d255611c93f63c2hding 13318672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo vsp_cmdbuf_insert_command(cmdbuf, CONTEXT_VPP_ID, &cmdbuf->param_mem, VssProcPipelineParameterCommand, 13328e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->pipeline_param_offset, sizeof(struct VssProcPipelineParameterBuffer)); 13338e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 13348e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 13358e9a21e730449c10cac6e6f69d255611c93f63c2hding} 13368e9a21e730449c10cac6e6f69d255611c93f63c2hding 13378e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_filter_param(context_VPP_p ctx) 13388e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 13398e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 13408e9a21e730449c10cac6e6f69d255611c93f63c2hding vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf; 13418e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcDenoiseParameterBuffer *cell_denoiser_param = (struct VssProcDenoiseParameterBuffer *)cmdbuf->denoise_param_p; 13428e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcColorEnhancementParameterBuffer *cell_enhancer_param = (struct VssProcColorEnhancementParameterBuffer *)cmdbuf->enhancer_param_p; 13438e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcSharpenParameterBuffer *cell_sharpen_param = (struct VssProcSharpenParameterBuffer *)cmdbuf->sharpen_param_p; 13448e9a21e730449c10cac6e6f69d255611c93f63c2hding struct VssProcFrcParameterBuffer *cell_proc_frc_param = (struct VssProcFrcParameterBuffer *)cmdbuf->frc_param_p; 13458e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferBase *cur_param = NULL; 13468e9a21e730449c10cac6e6f69d255611c93f63c2hding VAProcFilterParameterBufferFrameRateConversion *frc_param = NULL; 13478e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int i; 13488e9a21e730449c10cac6e6f69d255611c93f63c2hding float ratio; 13498e9a21e730449c10cac6e6f69d255611c93f63c2hding 13508e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < ctx->num_filters; ++i) { 13518e9a21e730449c10cac6e6f69d255611c93f63c2hding cur_param = (VAProcFilterParameterBufferBase *)ctx->filter_buf[i]->buffer_data; 13528e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (cur_param->type) { 13538e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterDeblocking: 135466304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_denoiser_param, 135566304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->denoise_deblock_param, 135666304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->denoise_deblock_param)); 13578e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_denoiser_param->type = VssProcDeblock; 135866304487373cf4ed335ba2614f00102dca837832Wang Kun 135966304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 13608672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo CONTEXT_VPP_ID, 136166304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 136266304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcDenoiseParameterCommand, 136366304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->denoise_param_offset, 136466304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcDenoiseParameterBuffer)); 13658e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13668e9a21e730449c10cac6e6f69d255611c93f63c2hding 13678e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterNoiseReduction: 136866304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_denoiser_param, 136966304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->denoise_deblock_param, 137066304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->denoise_deblock_param)); 13718e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_denoiser_param->type = VssProcDegrain; 137266304487373cf4ed335ba2614f00102dca837832Wang Kun 137366304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 13748672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo CONTEXT_VPP_ID, 137566304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 137666304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcDenoiseParameterCommand, 137766304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->denoise_param_offset, 137866304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcDenoiseParameterBuffer)); 13798e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13808e9a21e730449c10cac6e6f69d255611c93f63c2hding 13818e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterSharpening: 138266304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_sharpen_param, 138366304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->sharpen_param, 138466304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->sharpen_param)); 138566304487373cf4ed335ba2614f00102dca837832Wang Kun 138666304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 13878672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo CONTEXT_VPP_ID, 138866304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 138966304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcSharpenParameterCommand, 139066304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->sharpen_param_offset, 139166304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcSharpenParameterBuffer)); 13928e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 13938e9a21e730449c10cac6e6f69d255611c93f63c2hding 1394c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding case VAProcFilterColorBalance: 139566304487373cf4ed335ba2614f00102dca837832Wang Kun memcpy(cell_enhancer_param, 139666304487373cf4ed335ba2614f00102dca837832Wang Kun &ctx->enhancer_param, 139766304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(ctx->enhancer_param)); 13985d69fca537b4dd301c586b988129305fa60f1c06Wang Kun 139966304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 14008672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo CONTEXT_VPP_ID, 140166304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 140266304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcColorEnhancementParameterCommand, 140366304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->enhancer_param_offset, 140466304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcColorEnhancementParameterBuffer)); 14058e9a21e730449c10cac6e6f69d255611c93f63c2hding 14068e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 14078e9a21e730449c10cac6e6f69d255611c93f63c2hding 14088e9a21e730449c10cac6e6f69d255611c93f63c2hding case VAProcFilterFrameRateConversion: 14098e9a21e730449c10cac6e6f69d255611c93f63c2hding ctx->frc_buf = ctx->filter_buf[i]; 14108e9a21e730449c10cac6e6f69d255611c93f63c2hding 14118e9a21e730449c10cac6e6f69d255611c93f63c2hding frc_param = (VAProcFilterParameterBufferFrameRateConversion *)ctx->filter_buf[i]->buffer_data; 14128e9a21e730449c10cac6e6f69d255611c93f63c2hding ratio = frc_param->output_fps / (float)frc_param->input_fps; 14138e9a21e730449c10cac6e6f69d255611c93f63c2hding 1414c8e206f338238963120ea9f3f0515329cb791d11Wang Kun /* set the FRC quality */ 1415c8e206f338238963120ea9f3f0515329cb791d11Wang Kun /* cell_proc_frc_param->quality = VssFrcMediumQuality; */ 1416c8e206f338238963120ea9f3f0515329cb791d11Wang Kun cell_proc_frc_param->quality = VssFrcHighQuality; 14178e9a21e730449c10cac6e6f69d255611c93f63c2hding 141866304487373cf4ed335ba2614f00102dca837832Wang Kun /* check if the input fps is in the range of HW capability */ 14198e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ratio == 2) 14208e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->conversion_rate = VssFrc2xConversionRate; 14210e1ed1e239c04f2c34edd6252ed1b16f11980aabYu, Linda else if (ratio == 2.5) 14228e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->conversion_rate = VssFrc2_5xConversionRate; 14238e9a21e730449c10cac6e6f69d255611c93f63c2hding else if (ratio == 4) 14248e9a21e730449c10cac6e6f69d255611c93f63c2hding cell_proc_frc_param->conversion_rate = VssFrc4xConversionRate; 14255d69fca537b4dd301c586b988129305fa60f1c06Wang Kun else if (ratio == 1.25) 14265d69fca537b4dd301c586b988129305fa60f1c06Wang Kun cell_proc_frc_param->conversion_rate = VssFrc1_25xConversionRate; 14278e9a21e730449c10cac6e6f69d255611c93f63c2hding else { 14288e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid frame rate conversion ratio %f \n", ratio); 14298e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 14308e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 14318e9a21e730449c10cac6e6f69d255611c93f63c2hding } 14328e9a21e730449c10cac6e6f69d255611c93f63c2hding 143366304487373cf4ed335ba2614f00102dca837832Wang Kun vsp_cmdbuf_insert_command(cmdbuf, 14348672be7b10df4af6bd6e0902f6588ab4f7599176Sun, Mingruo CONTEXT_VPP_ID, 143566304487373cf4ed335ba2614f00102dca837832Wang Kun &cmdbuf->param_mem, 143666304487373cf4ed335ba2614f00102dca837832Wang Kun VssProcFrcParameterCommand, 143766304487373cf4ed335ba2614f00102dca837832Wang Kun ctx->frc_param_offset, 143866304487373cf4ed335ba2614f00102dca837832Wang Kun sizeof(struct VssProcFrcParameterBuffer)); 14398e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 14408e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 14418e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_UNKNOWN; 14428e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 14438e9a21e730449c10cac6e6f69d255611c93f63c2hding } 14448e9a21e730449c10cac6e6f69d255611c93f63c2hding } 14458e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 14468e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 14478e9a21e730449c10cac6e6f69d255611c93f63c2hding} 144866304487373cf4ed335ba2614f00102dca837832Wang Kun 144966304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_resolution(int width, int height) 145066304487373cf4ed335ba2614f00102dca837832Wang Kun{ 145166304487373cf4ed335ba2614f00102dca837832Wang Kun int ret; 145266304487373cf4ed335ba2614f00102dca837832Wang Kun int image_area; 145366304487373cf4ed335ba2614f00102dca837832Wang Kun 145476777b6108cd39192cba113f96b04b98eee39c73Wang Kun if (height < MIN_SUPPORTED_HEIGHT || height > MAX_SUPPORTED_HEIGHT) 145566304487373cf4ed335ba2614f00102dca837832Wang Kun return NOT_SUPPORTED_RESOLUTION; 145666304487373cf4ed335ba2614f00102dca837832Wang Kun 145766304487373cf4ed335ba2614f00102dca837832Wang Kun image_area = height * width; 145866304487373cf4ed335ba2614f00102dca837832Wang Kun 145966304487373cf4ed335ba2614f00102dca837832Wang Kun if (image_area <= QVGA_AREA) 146066304487373cf4ed335ba2614f00102dca837832Wang Kun ret = QCIF_TO_QVGA; 146166304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= VGA_AREA) 146266304487373cf4ed335ba2614f00102dca837832Wang Kun ret = QVGA_TO_VGA; 146366304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= SD_AREA) 146466304487373cf4ed335ba2614f00102dca837832Wang Kun ret = VGA_TO_SD; 146566304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= HD720P_AREA) 146666304487373cf4ed335ba2614f00102dca837832Wang Kun ret = SD_TO_720P; 146766304487373cf4ed335ba2614f00102dca837832Wang Kun else if (image_area <= HD1080P_AREA) 146866304487373cf4ed335ba2614f00102dca837832Wang Kun ret = HD720P_TO_1080P; 146966304487373cf4ed335ba2614f00102dca837832Wang Kun else 147066304487373cf4ed335ba2614f00102dca837832Wang Kun ret = NOT_SUPPORTED_RESOLUTION; 147166304487373cf4ed335ba2614f00102dca837832Wang Kun 147266304487373cf4ed335ba2614f00102dca837832Wang Kun return ret; 147366304487373cf4ed335ba2614f00102dca837832Wang Kun} 147466304487373cf4ed335ba2614f00102dca837832Wang Kun 147566304487373cf4ed335ba2614f00102dca837832Wang Kun/* 147666304487373cf4ed335ba2614f00102dca837832Wang Kun * The strength area is: 147766304487373cf4ed335ba2614f00102dca837832Wang Kun * 147866304487373cf4ed335ba2614f00102dca837832Wang Kun * 0______33______66______100 147966304487373cf4ed335ba2614f00102dca837832Wang Kun * LOW MED HIGH 148066304487373cf4ed335ba2614f00102dca837832Wang Kun * 148166304487373cf4ed335ba2614f00102dca837832Wang Kun * MIN=0; MAX=100; STEP=33 148266304487373cf4ed335ba2614f00102dca837832Wang Kun */ 148366304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_vpp_strength(int value) 148466304487373cf4ed335ba2614f00102dca837832Wang Kun{ 148566304487373cf4ed335ba2614f00102dca837832Wang Kun if (value < MIN_VPP_PARAM || value > MAX_VPP_PARAM) 148666304487373cf4ed335ba2614f00102dca837832Wang Kun return INVALID_STRENGTH; 148766304487373cf4ed335ba2614f00102dca837832Wang Kun 148866304487373cf4ed335ba2614f00102dca837832Wang Kun if (value >= MIN_VPP_PARAM && 148966304487373cf4ed335ba2614f00102dca837832Wang Kun value < MIN_VPP_PARAM + STEP_VPP_PARAM) 149066304487373cf4ed335ba2614f00102dca837832Wang Kun return LOW_STRENGTH; 149166304487373cf4ed335ba2614f00102dca837832Wang Kun else if (value >= MIN_VPP_PARAM + STEP_VPP_PARAM && 149266304487373cf4ed335ba2614f00102dca837832Wang Kun value < MIN_VPP_PARAM + 2 * STEP_VPP_PARAM) 149366304487373cf4ed335ba2614f00102dca837832Wang Kun return MEDIUM_STRENGTH; 149466304487373cf4ed335ba2614f00102dca837832Wang Kun else 149566304487373cf4ed335ba2614f00102dca837832Wang Kun return HIGH_STRENGTH; 149666304487373cf4ed335ba2614f00102dca837832Wang Kun} 1497