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