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