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