vsp_VPP.c revision 4b8982ecb6744203ae0b5381942d72a518539661
18e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
28e9a21e730449c10cac6e6f69d255611c93f63c2hding * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
38e9a21e730449c10cac6e6f69d255611c93f63c2hding *
48e9a21e730449c10cac6e6f69d255611c93f63c2hding * Permission is hereby granted, free of charge, to any person obtaining a
58e9a21e730449c10cac6e6f69d255611c93f63c2hding * copy of this software and associated documentation files (the
68e9a21e730449c10cac6e6f69d255611c93f63c2hding * "Software"), to deal in the Software without restriction, including
78e9a21e730449c10cac6e6f69d255611c93f63c2hding * without limitation the rights to use, copy, modify, merge, publish,
88e9a21e730449c10cac6e6f69d255611c93f63c2hding * distribute, sub license, and/or sell copies of the Software, and to
98e9a21e730449c10cac6e6f69d255611c93f63c2hding * permit persons to whom the Software is furnished to do so, subject to
108e9a21e730449c10cac6e6f69d255611c93f63c2hding * the following conditions:
118e9a21e730449c10cac6e6f69d255611c93f63c2hding *
128e9a21e730449c10cac6e6f69d255611c93f63c2hding * The above copyright notice and this permission notice (including the
138e9a21e730449c10cac6e6f69d255611c93f63c2hding * next paragraph) shall be included in all copies or substantial portions
148e9a21e730449c10cac6e6f69d255611c93f63c2hding * of the Software.
158e9a21e730449c10cac6e6f69d255611c93f63c2hding *
168e9a21e730449c10cac6e6f69d255611c93f63c2hding * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
178e9a21e730449c10cac6e6f69d255611c93f63c2hding * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
188e9a21e730449c10cac6e6f69d255611c93f63c2hding * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
198e9a21e730449c10cac6e6f69d255611c93f63c2hding * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
208e9a21e730449c10cac6e6f69d255611c93f63c2hding * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
218e9a21e730449c10cac6e6f69d255611c93f63c2hding * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
228e9a21e730449c10cac6e6f69d255611c93f63c2hding * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
238e9a21e730449c10cac6e6f69d255611c93f63c2hding *
248e9a21e730449c10cac6e6f69d255611c93f63c2hding * Authors:
258e9a21e730449c10cac6e6f69d255611c93f63c2hding *    Binglin Chen <binglin.chen@intel.com>
268e9a21e730449c10cac6e6f69d255611c93f63c2hding *
278e9a21e730449c10cac6e6f69d255611c93f63c2hding */
288e9a21e730449c10cac6e6f69d255611c93f63c2hding
298e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "vsp_VPP.h"
308e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_buffer.h"
318e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_surface.h"
328e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "vsp_cmdbuf.h"
338e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_drv_debug.h"
348e9a21e730449c10cac6e6f69d255611c93f63c2hding
358e9a21e730449c10cac6e6f69d255611c93f63c2hding#define INIT_DRIVER_DATA    psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData;
368e9a21e730449c10cac6e6f69d255611c93f63c2hding#define INIT_CONTEXT_VPP    context_VPP_p ctx = (context_VPP_p) obj_context->format_data;
378e9a21e730449c10cac6e6f69d255611c93f63c2hding#define CONFIG(id)  ((object_config_p) object_heap_lookup( &driver_data->config_heap, id ))
388e9a21e730449c10cac6e6f69d255611c93f63c2hding#define CONTEXT(id) ((object_context_p) object_heap_lookup( &driver_data->context_heap, id ))
398e9a21e730449c10cac6e6f69d255611c93f63c2hding#define BUFFER(id)  ((object_buffer_p) object_heap_lookup( &driver_data->buffer_heap, id ))
408e9a21e730449c10cac6e6f69d255611c93f63c2hding
418e9a21e730449c10cac6e6f69d255611c93f63c2hding#define SURFACE(id)    ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id ))
428e9a21e730449c10cac6e6f69d255611c93f63c2hding
438e9a21e730449c10cac6e6f69d255611c93f63c2hding#define KB 1024
448e9a21e730449c10cac6e6f69d255611c93f63c2hding#define MB (KB * KB)
454b8982ecb6744203ae0b5381942d72a518539661Wang Kun#define VSP_PROC_CONTEXT_SIZE (30*MB)
468e9a21e730449c10cac6e6f69d255611c93f63c2hding
4766304487373cf4ed335ba2614f00102dca837832Wang Kun#define MAX_VPP_PARAM (100)
4866304487373cf4ed335ba2614f00102dca837832Wang Kun#define MIN_VPP_PARAM (0)
4966304487373cf4ed335ba2614f00102dca837832Wang Kun#define STEP_VPP_PARAM (33)
5066304487373cf4ed335ba2614f00102dca837832Wang Kun#define MAX_VPP_AUTO_PARAM (1)
5166304487373cf4ed335ba2614f00102dca837832Wang Kun#define MIN_VPP_AUTO_PARAM (0)
5266304487373cf4ed335ba2614f00102dca837832Wang Kun#define STEP_VPP_AUTO_PARAM (1)
5366304487373cf4ed335ba2614f00102dca837832Wang Kun
548e9a21e730449c10cac6e6f69d255611c93f63c2hding#define VSP_FORWARD_REF_NUM 3
558e9a21e730449c10cac6e6f69d255611c93f63c2hding
56c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding#define VSP_COLOR_ENHANCE_FEATURES 2
57c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
588e9a21e730449c10cac6e6f69d255611c93f63c2hding#define ALIGN_TO_128(value) ((value + 128 - 1) & ~(128 - 1))
598e9a21e730449c10cac6e6f69d255611c93f63c2hding
6066304487373cf4ed335ba2614f00102dca837832Wang Kun#define QVGA_AREA (320 * 240)
6166304487373cf4ed335ba2614f00102dca837832Wang Kun#define VGA_AREA (640 * 480)
6266304487373cf4ed335ba2614f00102dca837832Wang Kun#define SD_AREA (720 * 576)
6366304487373cf4ed335ba2614f00102dca837832Wang Kun#define HD720P_AREA (1280 * 720)
6466304487373cf4ed335ba2614f00102dca837832Wang Kun#define HD1080P_AREA (1920 * 1080)
6566304487373cf4ed335ba2614f00102dca837832Wang Kun
66d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun/**
67d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * The number of supported filter is 5:
68d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterDeblocking
69d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterNoiseReduction
70d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterSharpening
71d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterColorBalance
72d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun * VAProcFilterFrameRateConversion
73d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun */
74d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun#define VSP_SUPPORTED_FILTERS_NUM 5
75d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun
76d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun/* The size of supported color standard */
77d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun#define COLOR_STANDARDS_NUM 1
78d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun
79c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingenum resolution_set {
8066304487373cf4ed335ba2614f00102dca837832Wang Kun	NOT_SUPPORTED_RESOLUTION = -1,
8166304487373cf4ed335ba2614f00102dca837832Wang Kun	QCIF_TO_QVGA = 0,
8266304487373cf4ed335ba2614f00102dca837832Wang Kun	QVGA_TO_VGA,
8366304487373cf4ed335ba2614f00102dca837832Wang Kun	VGA_TO_SD,
8466304487373cf4ed335ba2614f00102dca837832Wang Kun	SD_TO_720P,
8566304487373cf4ed335ba2614f00102dca837832Wang Kun	HD720P_TO_1080P,
86c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	RESOLUTION_SET_NUM
87c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding};
88c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
89c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingstruct vpp_chain_capability {
90c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	int frc_enabled;
91c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	int sharpen_enabled;
92c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	int color_balance_enabled;
93c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	int denoise_enabled;
94c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	int deblock_enabled;
95c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding};
96c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
97c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingenum filter_status {
98c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	FILTER_DISABLED = 0,
99c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	FILTER_ENABLED
100c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding};
101c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
102c7434a3fdc05f13a1817b6f32f499c9c7fee0045hdingstruct vpp_chain_capability vpp_chain_caps[RESOLUTION_SET_NUM] = {
10366304487373cf4ed335ba2614f00102dca837832Wang Kun	[HD720P_TO_1080P] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_DISABLED, FILTER_DISABLED},
10466304487373cf4ed335ba2614f00102dca837832Wang Kun	[SD_TO_720P] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_DISABLED, FILTER_DISABLED},
10566304487373cf4ed335ba2614f00102dca837832Wang Kun	[VGA_TO_SD] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_DISABLED, FILTER_DISABLED},
10666304487373cf4ed335ba2614f00102dca837832Wang Kun	[QVGA_TO_VGA] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED},
10766304487373cf4ed335ba2614f00102dca837832Wang Kun	[QCIF_TO_QVGA] = {FILTER_ENABLED, FILTER_ENABLED, FILTER_ENABLED, FILTER_DISABLED, FILTER_ENABLED}
10866304487373cf4ed335ba2614f00102dca837832Wang Kun};
10966304487373cf4ed335ba2614f00102dca837832Wang Kun
11066304487373cf4ed335ba2614f00102dca837832Wang Kunstruct filter_strength {
11166304487373cf4ed335ba2614f00102dca837832Wang Kun	struct VssProcDenoiseParameterBuffer denoise_deblock[RESOLUTION_SET_NUM];
11266304487373cf4ed335ba2614f00102dca837832Wang Kun	struct VssProcColorEnhancementParameterBuffer enhancer[RESOLUTION_SET_NUM];
11366304487373cf4ed335ba2614f00102dca837832Wang Kun	struct VssProcSharpenParameterBuffer sharpen[RESOLUTION_SET_NUM];
11466304487373cf4ed335ba2614f00102dca837832Wang Kun};
11566304487373cf4ed335ba2614f00102dca837832Wang Kun
11666304487373cf4ed335ba2614f00102dca837832Wang Kunenum filter_strength_type {
11766304487373cf4ed335ba2614f00102dca837832Wang Kun	INVALID_STRENGTH = -1,
11866304487373cf4ed335ba2614f00102dca837832Wang Kun	LOW_STRENGTH = 0,
11966304487373cf4ed335ba2614f00102dca837832Wang Kun	MEDIUM_STRENGTH,
12066304487373cf4ed335ba2614f00102dca837832Wang Kun	HIGH_STRENGTH,
12166304487373cf4ed335ba2614f00102dca837832Wang Kun	STRENGTH_NUM
12266304487373cf4ed335ba2614f00102dca837832Wang Kun};
12366304487373cf4ed335ba2614f00102dca837832Wang Kun
12466304487373cf4ed335ba2614f00102dca837832Wang Kun#define SHARPEN_ON (1)
12566304487373cf4ed335ba2614f00102dca837832Wang Kun
12666304487373cf4ed335ba2614f00102dca837832Wang Kunstruct filter_strength vpp_strength[STRENGTH_NUM] = {
12766304487373cf4ed335ba2614f00102dca837832Wang Kun	[LOW_STRENGTH] = {
1284b8982ecb6744203ae0b5381942d72a518539661Wang Kun		/* structure:
1294b8982ecb6744203ae0b5381942d72a518539661Wang Kun		 * type(0-Denoise,1-Deblock), value_thr, cnt_thr, coef, temp_thr1, temp_thr2, _pad[2]
1304b8982ecb6744203ae0b5381942d72a518539661Wang Kun		 */
13166304487373cf4ed335ba2614f00102dca837832Wang Kun		.denoise_deblock = {
1324b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QCIF_TO_QVGA]    = {1, 15, 47, 35, 0, 0, 0, 0},
1334b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QVGA_TO_VGA]     = {1, 7,  48, 47, 0, 0, 0, 0},
1344b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[VGA_TO_SD]       = {1, 10, 8,  9,  1, 3, 0, 0},
1354b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[SD_TO_720P]      = {0, 10, 48, 47, 0, 0, 0, 0},
1364b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[HD720P_TO_1080P] = {0, 10, 48, 47, 0, 0, 0, 0}
13766304487373cf4ed335ba2614f00102dca837832Wang Kun		},
1384b8982ecb6744203ae0b5381942d72a518539661Wang Kun		/* structure:
1394b8982ecb6744203ae0b5381942d72a518539661Wang Kun		 * temp_detect, temp_correct, clip_thr, mid_thr, luma_amm, chroma_amm, _pad[2]
1404b8982ecb6744203ae0b5381942d72a518539661Wang Kun		 */
14166304487373cf4ed335ba2614f00102dca837832Wang Kun		.enhancer = {
1424b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QCIF_TO_QVGA]    = {200, 100, 1, 42, 40, 60, 0, 0},
1434b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QVGA_TO_VGA]     = {220, 180, 1, 42, 40, 60, 0, 0},
1444b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[VGA_TO_SD]       = {220, 200, 1, 42, 40, 60, 0, 0},
1454b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[SD_TO_720P]      = {100, 100, 5, 33, 0,  0,  0, 0},
1464b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[HD720P_TO_1080P] = {100, 100, 5, 33, 0,  0,  0, 0}
14766304487373cf4ed335ba2614f00102dca837832Wang Kun		},
14866304487373cf4ed335ba2614f00102dca837832Wang Kun		.sharpen = {
1494b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QCIF_TO_QVGA]    = { .quality = SHARPEN_ON },
1504b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QVGA_TO_VGA]     = { .quality = SHARPEN_ON },
1514b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[VGA_TO_SD]       = { .quality = SHARPEN_ON },
1524b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[SD_TO_720P]      = { .quality = SHARPEN_ON },
15366304487373cf4ed335ba2614f00102dca837832Wang Kun			[HD720P_TO_1080P] = { .quality = SHARPEN_ON }
15466304487373cf4ed335ba2614f00102dca837832Wang Kun		}
15566304487373cf4ed335ba2614f00102dca837832Wang Kun	},
15666304487373cf4ed335ba2614f00102dca837832Wang Kun	[MEDIUM_STRENGTH] = {
15766304487373cf4ed335ba2614f00102dca837832Wang Kun		.denoise_deblock = {
1584b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QCIF_TO_QVGA]    = {1, 25, 47, 12, 0, 0, 0, 0},
1594b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QVGA_TO_VGA]     = {1, 10, 48, 47, 0, 0, 0, 0},
1604b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[VGA_TO_SD]       = {1, 20, 8,  9,  2, 4, 0, 0},
1614b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[SD_TO_720P]      = {0, 10, 48, 47, 0, 0, 0, 0},
1624b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[HD720P_TO_1080P] = {0, 10, 48, 47, 0, 0, 0, 0}
16366304487373cf4ed335ba2614f00102dca837832Wang Kun		},
16466304487373cf4ed335ba2614f00102dca837832Wang Kun		.enhancer = {
1654b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QCIF_TO_QVGA]    = {100, 100, 1, 33, 100, 100, 0, 0},
1664b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QVGA_TO_VGA]     = {100, 180, 1, 33, 100, 100, 0, 0},
1674b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[VGA_TO_SD]       = {100, 200, 1, 33, 100, 100, 0, 0},
1684b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[SD_TO_720P]      = {100, 100, 5, 33, 0,   0,   0, 0},
1694b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[HD720P_TO_1080P] = {100, 100, 5, 33, 0,   0,   0, 0}
17066304487373cf4ed335ba2614f00102dca837832Wang Kun		},
17166304487373cf4ed335ba2614f00102dca837832Wang Kun		.sharpen = {
1724b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QCIF_TO_QVGA]    = { .quality = SHARPEN_ON },
1734b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QVGA_TO_VGA]     = { .quality = SHARPEN_ON },
1744b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[VGA_TO_SD]       = { .quality = SHARPEN_ON },
1754b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[SD_TO_720P]      = { .quality = SHARPEN_ON },
17666304487373cf4ed335ba2614f00102dca837832Wang Kun			[HD720P_TO_1080P] = { .quality = SHARPEN_ON }
17766304487373cf4ed335ba2614f00102dca837832Wang Kun		}
17866304487373cf4ed335ba2614f00102dca837832Wang Kun	},
17966304487373cf4ed335ba2614f00102dca837832Wang Kun	[HIGH_STRENGTH] = {
18066304487373cf4ed335ba2614f00102dca837832Wang Kun		.denoise_deblock = {
1814b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QCIF_TO_QVGA]    = {1, 30, 40, 10, 0, 0, 0, 0},
1824b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QVGA_TO_VGA]     = {1, 15, 45, 25, 0, 0, 0, 0},
1834b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[VGA_TO_SD]       = {1, 20, 7,  5,  3, 6, 0, 0},
1844b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[SD_TO_720P]      = {0, 10, 48, 47, 0, 0, 0, 0},
1854b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[HD720P_TO_1080P] = {0, 10, 48, 47, 0, 0, 0, 0}
18666304487373cf4ed335ba2614f00102dca837832Wang Kun		},
18766304487373cf4ed335ba2614f00102dca837832Wang Kun		.enhancer = {
1884b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QCIF_TO_QVGA]    = {100, 100, 5, 33, 150, 200, 0, 0},
1894b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QVGA_TO_VGA]     = {100, 180, 5, 33, 150, 200, 0, 0},
1904b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[VGA_TO_SD]       = {100, 200, 5, 33, 100, 150, 0, 0},
1914b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[SD_TO_720P]      = {100, 100, 5, 33, 0,   0,   0, 0},
1924b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[HD720P_TO_1080P] = {100, 100, 5, 33, 0,   0,   0, 0}
19366304487373cf4ed335ba2614f00102dca837832Wang Kun		},
19466304487373cf4ed335ba2614f00102dca837832Wang Kun		.sharpen = {
1954b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QCIF_TO_QVGA]    = { .quality = SHARPEN_ON },
1964b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[QVGA_TO_VGA]     = { .quality = SHARPEN_ON },
1974b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[VGA_TO_SD]       = { .quality = SHARPEN_ON },
1984b8982ecb6744203ae0b5381942d72a518539661Wang Kun			[SD_TO_720P]      = { .quality = SHARPEN_ON },
19966304487373cf4ed335ba2614f00102dca837832Wang Kun			[HD720P_TO_1080P] = { .quality = SHARPEN_ON }
20066304487373cf4ed335ba2614f00102dca837832Wang Kun		}
20166304487373cf4ed335ba2614f00102dca837832Wang Kun	}
202c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding};
203c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
2048e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic void vsp_VPP_DestroyContext(object_context_p obj_context);
2058e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_pipeline(context_VPP_p ctx);
2068e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_filter_param(context_VPP_p ctx);
2078e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp__VPP_check_legal_picture(object_context_p obj_context, object_config_p obj_config);
20866304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_resolution(int width, int height);
20966304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_vpp_strength(int value);
2108e9a21e730449c10cac6e6f69d255611c93f63c2hding
2118e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic void vsp_VPP_QueryConfigAttributes(
2128e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAProfile profile,
2138e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAEntrypoint entrypoint,
2148e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAConfigAttrib *attrib_list,
2158e9a21e730449c10cac6e6f69d255611c93f63c2hding	int num_attribs)
2168e9a21e730449c10cac6e6f69d255611c93f63c2hding{
2178e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* No VPP specific attributes */
2188e9a21e730449c10cac6e6f69d255611c93f63c2hding	return;
2198e9a21e730449c10cac6e6f69d255611c93f63c2hding}
2208e9a21e730449c10cac6e6f69d255611c93f63c2hding
2218e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_ValidateConfig(
2228e9a21e730449c10cac6e6f69d255611c93f63c2hding	object_config_p obj_config)
2238e9a21e730449c10cac6e6f69d255611c93f63c2hding{
2248e9a21e730449c10cac6e6f69d255611c93f63c2hding	int i;
2258e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* Check all attributes */
2268e9a21e730449c10cac6e6f69d255611c93f63c2hding	for (i = 0; i < obj_config->attrib_count; i++) {
2278e9a21e730449c10cac6e6f69d255611c93f63c2hding		switch (obj_config->attrib_list[i].type) {
2288e9a21e730449c10cac6e6f69d255611c93f63c2hding		case VAConfigAttribRTFormat:
2298e9a21e730449c10cac6e6f69d255611c93f63c2hding			/* Ignore */
2308e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
2318e9a21e730449c10cac6e6f69d255611c93f63c2hding
2328e9a21e730449c10cac6e6f69d255611c93f63c2hding		default:
2338e9a21e730449c10cac6e6f69d255611c93f63c2hding			return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
2348e9a21e730449c10cac6e6f69d255611c93f63c2hding		}
2358e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
2368e9a21e730449c10cac6e6f69d255611c93f63c2hding
2378e9a21e730449c10cac6e6f69d255611c93f63c2hding	return VA_STATUS_SUCCESS;
2388e9a21e730449c10cac6e6f69d255611c93f63c2hding}
2398e9a21e730449c10cac6e6f69d255611c93f63c2hding
2408e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp__VPP_check_legal_picture(object_context_p obj_context, object_config_p obj_config)
2418e9a21e730449c10cac6e6f69d255611c93f63c2hding{
2428e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAStatus vaStatus = VA_STATUS_SUCCESS;
2438e9a21e730449c10cac6e6f69d255611c93f63c2hding
2448e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (NULL == obj_context) {
2458e9a21e730449c10cac6e6f69d255611c93f63c2hding		vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT;
2468e9a21e730449c10cac6e6f69d255611c93f63c2hding		DEBUG_FAILURE;
2478e9a21e730449c10cac6e6f69d255611c93f63c2hding		return vaStatus;
2488e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
2498e9a21e730449c10cac6e6f69d255611c93f63c2hding
2508e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (NULL == obj_config) {
2518e9a21e730449c10cac6e6f69d255611c93f63c2hding		vaStatus = VA_STATUS_ERROR_INVALID_CONFIG;
2528e9a21e730449c10cac6e6f69d255611c93f63c2hding		DEBUG_FAILURE;
2538e9a21e730449c10cac6e6f69d255611c93f63c2hding		return vaStatus;
2548e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
2558e9a21e730449c10cac6e6f69d255611c93f63c2hding
2568e9a21e730449c10cac6e6f69d255611c93f63c2hding	return vaStatus;
2578e9a21e730449c10cac6e6f69d255611c93f63c2hding}
2588e9a21e730449c10cac6e6f69d255611c93f63c2hding
2598e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_CreateContext(
2608e9a21e730449c10cac6e6f69d255611c93f63c2hding	object_context_p obj_context,
2618e9a21e730449c10cac6e6f69d255611c93f63c2hding	object_config_p obj_config)
2628e9a21e730449c10cac6e6f69d255611c93f63c2hding{
2638e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAStatus vaStatus = VA_STATUS_SUCCESS;
2648e9a21e730449c10cac6e6f69d255611c93f63c2hding	context_VPP_p ctx;
2658e9a21e730449c10cac6e6f69d255611c93f63c2hding	int i;
2668e9a21e730449c10cac6e6f69d255611c93f63c2hding
2678e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* Validate flag */
2688e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* Validate picture dimensions */
2698e9a21e730449c10cac6e6f69d255611c93f63c2hding	vaStatus = vsp__VPP_check_legal_picture(obj_context, obj_config);
2708e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (VA_STATUS_SUCCESS != vaStatus) {
2718e9a21e730449c10cac6e6f69d255611c93f63c2hding		DEBUG_FAILURE;
2728e9a21e730449c10cac6e6f69d255611c93f63c2hding		return vaStatus;
2738e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
2748e9a21e730449c10cac6e6f69d255611c93f63c2hding
2758e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx = (context_VPP_p) calloc(1, sizeof(struct context_VPP_s));
2768e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (NULL == ctx) {
2778e9a21e730449c10cac6e6f69d255611c93f63c2hding		vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
2788e9a21e730449c10cac6e6f69d255611c93f63c2hding		DEBUG_FAILURE;
2798e9a21e730449c10cac6e6f69d255611c93f63c2hding		return vaStatus;
2808e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
2818e9a21e730449c10cac6e6f69d255611c93f63c2hding
2828e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->filters = NULL;
2838e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->num_filters = 0;
2848e9a21e730449c10cac6e6f69d255611c93f63c2hding
2858e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->frc_buf = NULL;
2868e9a21e730449c10cac6e6f69d255611c93f63c2hding
2878e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* set size */
2888e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->param_sz = 0;
2898e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->pic_param_sz = ALIGN_TO_128(sizeof(struct VssProcPictureParameterBuffer));
2908e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->param_sz += ctx->pic_param_sz;
2918e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->end_param_sz = ALIGN_TO_128(sizeof(struct VssProcPictureParameterBuffer));
2928e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->param_sz += ctx->end_param_sz;
2938e9a21e730449c10cac6e6f69d255611c93f63c2hding
2948e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->pipeline_param_sz = ALIGN_TO_128(sizeof(struct VssProcPipelineParameterBuffer));
2958e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->param_sz += ctx->pipeline_param_sz;
2968e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->denoise_param_sz = ALIGN_TO_128(sizeof(struct VssProcDenoiseParameterBuffer));
2978e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->param_sz += ctx->denoise_param_sz;
2988e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->enhancer_param_sz = ALIGN_TO_128(sizeof(struct VssProcColorEnhancementParameterBuffer));
2998e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->param_sz += ctx->enhancer_param_sz;
3008e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->sharpen_param_sz = ALIGN_TO_128(sizeof(struct VssProcSharpenParameterBuffer));
3018e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->param_sz += ctx->sharpen_param_sz;
3028e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->frc_param_sz = ALIGN_TO_128(sizeof(struct VssProcFrcParameterBuffer));
3038e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->param_sz += ctx->frc_param_sz;
3048e9a21e730449c10cac6e6f69d255611c93f63c2hding
3058e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* set offset */
3068e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->pic_param_offset = 0;
3078e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->end_param_offset = ctx->pic_param_offset + ctx->pic_param_sz;
3088e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->pipeline_param_offset = ctx->end_param_offset + ctx->end_param_sz;
3098e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->denoise_param_offset = ctx->pipeline_param_offset + ctx->pipeline_param_sz;
3108e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->enhancer_param_offset = ctx->denoise_param_offset + ctx->denoise_param_sz;
3118e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->sharpen_param_offset = ctx->enhancer_param_offset + ctx->enhancer_param_sz;
3128e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->frc_param_offset = ctx->sharpen_param_offset + ctx->sharpen_param_sz;
3138e9a21e730449c10cac6e6f69d255611c93f63c2hding
3148e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->context_buf = (psb_buffer_p) calloc(1, sizeof(struct psb_buffer_s));
3158e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (NULL == ctx->context_buf) {
3168e9a21e730449c10cac6e6f69d255611c93f63c2hding		vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
3178e9a21e730449c10cac6e6f69d255611c93f63c2hding		DEBUG_FAILURE;
3188e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto out;
3198e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
3208e9a21e730449c10cac6e6f69d255611c93f63c2hding
3218e9a21e730449c10cac6e6f69d255611c93f63c2hding	vaStatus = psb_buffer_create(obj_context->driver_data, VSP_PROC_CONTEXT_SIZE, psb_bt_vpu_only, ctx->context_buf);
3228e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (VA_STATUS_SUCCESS != vaStatus) {
3238e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto out;
3248e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
325c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
3268e9a21e730449c10cac6e6f69d255611c93f63c2hding	obj_context->format_data = (void*) ctx;
3278e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->obj_context = obj_context;
3288e9a21e730449c10cac6e6f69d255611c93f63c2hding
3298e9a21e730449c10cac6e6f69d255611c93f63c2hding	for (i = 0; i < obj_config->attrib_count; ++i) {
3308e9a21e730449c10cac6e6f69d255611c93f63c2hding		if (VAConfigAttribRTFormat == obj_config->attrib_list[i].type) {
3318e9a21e730449c10cac6e6f69d255611c93f63c2hding			switch (obj_config->attrib_list[i].value) {
3328e9a21e730449c10cac6e6f69d255611c93f63c2hding			case VA_RT_FORMAT_YUV420:
3338e9a21e730449c10cac6e6f69d255611c93f63c2hding				ctx->format = VSP_NV12;
3348e9a21e730449c10cac6e6f69d255611c93f63c2hding				break;
3358e9a21e730449c10cac6e6f69d255611c93f63c2hding			case VA_RT_FORMAT_YUV422:
3368e9a21e730449c10cac6e6f69d255611c93f63c2hding				ctx->format = VSP_NV16;
3378e9a21e730449c10cac6e6f69d255611c93f63c2hding			default:
3388e9a21e730449c10cac6e6f69d255611c93f63c2hding				ctx->format = VSP_NV12;
3398e9a21e730449c10cac6e6f69d255611c93f63c2hding				break;
3408e9a21e730449c10cac6e6f69d255611c93f63c2hding			}
3418e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
3428e9a21e730449c10cac6e6f69d255611c93f63c2hding		}
3438e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
3448e9a21e730449c10cac6e6f69d255611c93f63c2hding
34566304487373cf4ed335ba2614f00102dca837832Wang Kun	bzero(&ctx->denoise_deblock_param, sizeof(ctx->denoise_deblock_param));
34666304487373cf4ed335ba2614f00102dca837832Wang Kun	bzero(&ctx->enhancer_param, sizeof(ctx->enhancer_param));
34766304487373cf4ed335ba2614f00102dca837832Wang Kun	bzero(&ctx->sharpen_param, sizeof(ctx->sharpen_param));
34866304487373cf4ed335ba2614f00102dca837832Wang Kun
3498e9a21e730449c10cac6e6f69d255611c93f63c2hding	return vaStatus;
3508e9a21e730449c10cac6e6f69d255611c93f63c2hdingout:
3518e9a21e730449c10cac6e6f69d255611c93f63c2hding	vsp_VPP_DestroyContext(obj_context);
3528e9a21e730449c10cac6e6f69d255611c93f63c2hding
353c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	if (ctx)
354c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding		free(ctx);
355c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
3568e9a21e730449c10cac6e6f69d255611c93f63c2hding	return vaStatus;
3578e9a21e730449c10cac6e6f69d255611c93f63c2hding}
3588e9a21e730449c10cac6e6f69d255611c93f63c2hding
3598e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic void vsp_VPP_DestroyContext(
3608e9a21e730449c10cac6e6f69d255611c93f63c2hding	object_context_p obj_context)
3618e9a21e730449c10cac6e6f69d255611c93f63c2hding{
3628e9a21e730449c10cac6e6f69d255611c93f63c2hding	INIT_CONTEXT_VPP;
3638e9a21e730449c10cac6e6f69d255611c93f63c2hding
3648e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (ctx->context_buf) {
3658e9a21e730449c10cac6e6f69d255611c93f63c2hding		psb_buffer_destroy(ctx->context_buf);
3668e9a21e730449c10cac6e6f69d255611c93f63c2hding
3678e9a21e730449c10cac6e6f69d255611c93f63c2hding		free(ctx->context_buf);
3688e9a21e730449c10cac6e6f69d255611c93f63c2hding		ctx->context_buf = NULL;
3698e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
3708e9a21e730449c10cac6e6f69d255611c93f63c2hding
3718e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (ctx->filters) {
3728e9a21e730449c10cac6e6f69d255611c93f63c2hding		free(ctx->filters);
3738e9a21e730449c10cac6e6f69d255611c93f63c2hding		ctx->num_filters = 0;
3748e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
3758e9a21e730449c10cac6e6f69d255611c93f63c2hding
3768e9a21e730449c10cac6e6f69d255611c93f63c2hding	free(obj_context->format_data);
3778e9a21e730449c10cac6e6f69d255611c93f63c2hding	obj_context->format_data = NULL;
3788e9a21e730449c10cac6e6f69d255611c93f63c2hding}
3798e9a21e730449c10cac6e6f69d255611c93f63c2hding
3808e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp__VPP_process_pipeline_param(context_VPP_p ctx, object_buffer_p obj_buffer)
3818e9a21e730449c10cac6e6f69d255611c93f63c2hding{
3828e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAStatus vaStatus = VA_STATUS_SUCCESS;
3838e9a21e730449c10cac6e6f69d255611c93f63c2hding	vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf;
3848e9a21e730449c10cac6e6f69d255611c93f63c2hding	unsigned int i = 0;
3858e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAProcPipelineParameterBuffer *pipeline_param = (VAProcPipelineParameterBuffer *) obj_buffer->buffer_data;
3868e9a21e730449c10cac6e6f69d255611c93f63c2hding	struct VssProcPictureParameterBuffer *cell_proc_picture_param = (struct VssProcPictureParameterBuffer *)cmdbuf->pic_param_p;
3878e9a21e730449c10cac6e6f69d255611c93f63c2hding	struct VssProcPictureParameterBuffer *cell_end_param = (struct VssProcPictureParameterBuffer *)cmdbuf->end_param_p;
3888e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAProcFilterParameterBufferFrameRateConversion *frc_param;
3898e9a21e730449c10cac6e6f69d255611c93f63c2hding	object_surface_p input_surface = NULL;
3908e9a21e730449c10cac6e6f69d255611c93f63c2hding	object_surface_p cur_output_surf = NULL;
3914b8982ecb6744203ae0b5381942d72a518539661Wang Kun	unsigned int rotation_angle;
3928e9a21e730449c10cac6e6f69d255611c93f63c2hding
3938e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* FIXME: ignore output input color standard */
3948e9a21e730449c10cac6e6f69d255611c93f63c2hding
3958e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (pipeline_param->surface_region != NULL) {
3968e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't scale\n");
3978e9a21e730449c10cac6e6f69d255611c93f63c2hding		vaStatus = VA_STATUS_ERROR_UNKNOWN;
3988e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto out;
3998e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
4008e9a21e730449c10cac6e6f69d255611c93f63c2hding
4018e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (pipeline_param->output_region != NULL) {
4028e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't scale\n");
4038e9a21e730449c10cac6e6f69d255611c93f63c2hding		vaStatus = VA_STATUS_ERROR_UNKNOWN;
4048e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto out;
4058e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
4068e9a21e730449c10cac6e6f69d255611c93f63c2hding
407c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	if (pipeline_param->output_background_color != 0) {
408c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "Cann't support background color here\n");
409c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding		vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
410c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding		goto out;
411c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	}
4128e9a21e730449c10cac6e6f69d255611c93f63c2hding
4138e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (pipeline_param->filters == NULL) {
4148e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filter setting filters = %p\n", pipeline_param->filters);
4158e9a21e730449c10cac6e6f69d255611c93f63c2hding		vaStatus = VA_STATUS_ERROR_UNKNOWN;
4168e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto out;
4178e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
4188e9a21e730449c10cac6e6f69d255611c93f63c2hding
4198e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0
4208e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* for pass filter */
4218e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (pipeline_param->num_filters == 0 || pipeline_param->num_filters > VssProcPipelineMaxNumFilters) {
4228e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filter number = %d\n", pipeline_param->num_filters);
4238e9a21e730449c10cac6e6f69d255611c93f63c2hding		vaStatus = VA_STATUS_ERROR_UNKNOWN;
4248e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto out;
4258e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
4268e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif
4278e9a21e730449c10cac6e6f69d255611c93f63c2hding
4288e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (pipeline_param->forward_references == NULL) {
4298e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid forward_refereces %p setting\n", pipeline_param->forward_references);
4308e9a21e730449c10cac6e6f69d255611c93f63c2hding		vaStatus = VA_STATUS_ERROR_UNKNOWN;
4318e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto out;
4328e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
4338e9a21e730449c10cac6e6f69d255611c93f63c2hding
4348e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* should we check it? since the begining it's not VSP_FORWARD_REF_NUM */
4358e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (pipeline_param->num_forward_references != VSP_FORWARD_REF_NUM) {
4368e9a21e730449c10cac6e6f69d255611c93f63c2hding		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);
4378e9a21e730449c10cac6e6f69d255611c93f63c2hding		vaStatus = VA_STATUS_ERROR_UNKNOWN;
4388e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto out;
4398e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
4408e9a21e730449c10cac6e6f69d255611c93f63c2hding
4418e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* FIXME: no backward reference checking */
4428e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (!(pipeline_param->pipeline_flags & VA_PIPELINE_FLAG_END)) {
4438e9a21e730449c10cac6e6f69d255611c93f63c2hding		input_surface = SURFACE(pipeline_param->surface);
4448e9a21e730449c10cac6e6f69d255611c93f63c2hding		if (input_surface == NULL) {
4458e9a21e730449c10cac6e6f69d255611c93f63c2hding			drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input surface %x\n", pipeline_param->surface);
4468e9a21e730449c10cac6e6f69d255611c93f63c2hding			vaStatus = VA_STATUS_ERROR_UNKNOWN;
4478e9a21e730449c10cac6e6f69d255611c93f63c2hding			goto out;
4488e9a21e730449c10cac6e6f69d255611c93f63c2hding		}
4498e9a21e730449c10cac6e6f69d255611c93f63c2hding	} else {
4508e9a21e730449c10cac6e6f69d255611c93f63c2hding		input_surface = NULL;
4518e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
4528e9a21e730449c10cac6e6f69d255611c93f63c2hding
4538e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* IGNORE backward references setting */
4548e9a21e730449c10cac6e6f69d255611c93f63c2hding
4558e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* if it is the first pipeline command */
4568e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (pipeline_param->num_filters != ctx->num_filters || pipeline_param->num_filters == 0) {
4578e9a21e730449c10cac6e6f69d255611c93f63c2hding		if (ctx->num_filters != 0) {
4588e9a21e730449c10cac6e6f69d255611c93f63c2hding			drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n");
4598e9a21e730449c10cac6e6f69d255611c93f63c2hding			vaStatus = VA_STATUS_ERROR_UNKNOWN;
4608e9a21e730449c10cac6e6f69d255611c93f63c2hding			goto out;
4618e9a21e730449c10cac6e6f69d255611c93f63c2hding		} else {
4628e9a21e730449c10cac6e6f69d255611c93f63c2hding			/* save filters */
4638e9a21e730449c10cac6e6f69d255611c93f63c2hding			ctx->num_filters = pipeline_param->num_filters;
4648e9a21e730449c10cac6e6f69d255611c93f63c2hding			if (ctx->num_filters == 0) {
4658e9a21e730449c10cac6e6f69d255611c93f63c2hding				ctx->filters = NULL;
4668e9a21e730449c10cac6e6f69d255611c93f63c2hding			} else {
4678e9a21e730449c10cac6e6f69d255611c93f63c2hding				ctx->filters = (VABufferID *) calloc(ctx->num_filters, sizeof(*ctx->filters));
4688e9a21e730449c10cac6e6f69d255611c93f63c2hding				if (ctx->filters == NULL) {
4698e9a21e730449c10cac6e6f69d255611c93f63c2hding					drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n");
4708e9a21e730449c10cac6e6f69d255611c93f63c2hding					vaStatus = VA_STATUS_ERROR_UNKNOWN;
4718e9a21e730449c10cac6e6f69d255611c93f63c2hding					goto out;
4728e9a21e730449c10cac6e6f69d255611c93f63c2hding				}
4738e9a21e730449c10cac6e6f69d255611c93f63c2hding				memcpy(ctx->filters, pipeline_param->filters, ctx->num_filters * sizeof(*ctx->filters));
4748e9a21e730449c10cac6e6f69d255611c93f63c2hding			}
4758e9a21e730449c10cac6e6f69d255611c93f63c2hding
4768e9a21e730449c10cac6e6f69d255611c93f63c2hding			/* set pipeline command to FW */
4778e9a21e730449c10cac6e6f69d255611c93f63c2hding			vaStatus = vsp_set_pipeline(ctx);
4788e9a21e730449c10cac6e6f69d255611c93f63c2hding			if (vaStatus) {
4798e9a21e730449c10cac6e6f69d255611c93f63c2hding				drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to set pipeline\n");
4808e9a21e730449c10cac6e6f69d255611c93f63c2hding				goto out;
4818e9a21e730449c10cac6e6f69d255611c93f63c2hding			}
4828e9a21e730449c10cac6e6f69d255611c93f63c2hding
4838e9a21e730449c10cac6e6f69d255611c93f63c2hding			/* set filter parameter to FW, record frc parameter buffer */
4848e9a21e730449c10cac6e6f69d255611c93f63c2hding			vaStatus = vsp_set_filter_param(ctx);
4858e9a21e730449c10cac6e6f69d255611c93f63c2hding			if (vaStatus) {
4868e9a21e730449c10cac6e6f69d255611c93f63c2hding				drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to set filter parameter\n");
4878e9a21e730449c10cac6e6f69d255611c93f63c2hding				goto out;
4888e9a21e730449c10cac6e6f69d255611c93f63c2hding			}
4898e9a21e730449c10cac6e6f69d255611c93f63c2hding		}
4908e9a21e730449c10cac6e6f69d255611c93f63c2hding	} else {
4918e9a21e730449c10cac6e6f69d255611c93f63c2hding		/* else ignore pipeline/filter setting  */
4928e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0
4938e9a21e730449c10cac6e6f69d255611c93f63c2hding		/* FIXME: we can save these check for PnP */
4948e9a21e730449c10cac6e6f69d255611c93f63c2hding		for (i = 0; i < pipeline_param->num_filters; i++) {
4958e9a21e730449c10cac6e6f69d255611c93f63c2hding			if (pipeline_param->filters[i] != ctx->filters[i]) {
4968e9a21e730449c10cac6e6f69d255611c93f63c2hding				drv_debug_msg(VIDEO_DEBUG_ERROR, "can not reset pipeline in the mid of post-processing or without create a new context\n");
4978e9a21e730449c10cac6e6f69d255611c93f63c2hding				vaStatus = VA_STATUS_ERROR_UNKNOWN;
4988e9a21e730449c10cac6e6f69d255611c93f63c2hding				goto out;
4998e9a21e730449c10cac6e6f69d255611c93f63c2hding			}
5008e9a21e730449c10cac6e6f69d255611c93f63c2hding		}
5018e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif
5028e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
5038e9a21e730449c10cac6e6f69d255611c93f63c2hding
5048e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* fill picture command to FW */
5058e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (ctx->frc_buf != NULL)
5068e9a21e730449c10cac6e6f69d255611c93f63c2hding		frc_param = (VAProcFilterParameterBufferFrameRateConversion *)ctx->frc_buf->buffer_data;
5078e9a21e730449c10cac6e6f69d255611c93f63c2hding	else
5088e9a21e730449c10cac6e6f69d255611c93f63c2hding		frc_param = NULL;
5098e9a21e730449c10cac6e6f69d255611c93f63c2hding
5108e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* end picture command */
5118e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* FIXME: how to acknowledge driver to send end command */
5128e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (pipeline_param->pipeline_flags & VA_PIPELINE_FLAG_END) {
5138e9a21e730449c10cac6e6f69d255611c93f63c2hding		cell_end_param->num_input_pictures = 0;
5148e9a21e730449c10cac6e6f69d255611c93f63c2hding		cell_end_param->num_output_pictures = 0;
5158e9a21e730449c10cac6e6f69d255611c93f63c2hding		vsp_cmdbuf_insert_command(cmdbuf, &cmdbuf->param_mem, VssProcPictureCommand,
5168e9a21e730449c10cac6e6f69d255611c93f63c2hding					  ctx->end_param_offset, sizeof(struct VssProcPictureParameterBuffer));
5178e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto out;
5188e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
5198e9a21e730449c10cac6e6f69d255611c93f63c2hding
5208e9a21e730449c10cac6e6f69d255611c93f63c2hding	cell_proc_picture_param->num_input_pictures  = 1;
5218e9a21e730449c10cac6e6f69d255611c93f63c2hding	cell_proc_picture_param->input_picture[0].surface_id = pipeline_param->surface;
5228e9a21e730449c10cac6e6f69d255611c93f63c2hding	vsp_cmdbuf_reloc_pic_param(&(cell_proc_picture_param->input_picture[0].base), ctx->pic_param_offset, &(input_surface->psb_surface->buf),
5238e9a21e730449c10cac6e6f69d255611c93f63c2hding				   cmdbuf->param_mem_loc, cell_proc_picture_param);
5248e9a21e730449c10cac6e6f69d255611c93f63c2hding	cell_proc_picture_param->input_picture[0].height = input_surface->height_origin;
5258e9a21e730449c10cac6e6f69d255611c93f63c2hding	cell_proc_picture_param->input_picture[0].width = input_surface->width;
5268e9a21e730449c10cac6e6f69d255611c93f63c2hding	cell_proc_picture_param->input_picture[0].irq = 0;
527c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	cell_proc_picture_param->input_picture[0].stride = input_surface->psb_surface->stride;
528c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	cell_proc_picture_param->input_picture[0].format = ctx->format;
5298e9a21e730449c10cac6e6f69d255611c93f63c2hding
5308e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (frc_param == NULL)
5318e9a21e730449c10cac6e6f69d255611c93f63c2hding		cell_proc_picture_param->num_output_pictures = 1;
5328e9a21e730449c10cac6e6f69d255611c93f63c2hding	else
5338e9a21e730449c10cac6e6f69d255611c93f63c2hding		cell_proc_picture_param->num_output_pictures = frc_param->num_output_frames + 1;
5348e9a21e730449c10cac6e6f69d255611c93f63c2hding	for (i = 0; i < cell_proc_picture_param->num_output_pictures; ++i) {
5358e9a21e730449c10cac6e6f69d255611c93f63c2hding		if (i == 0) {
5368e9a21e730449c10cac6e6f69d255611c93f63c2hding			cur_output_surf = ctx->obj_context->current_render_target;
5378e9a21e730449c10cac6e6f69d255611c93f63c2hding		} else {
538c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			if (frc_param == NULL) {
539c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid output surface numbers %x\n",
540c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					      cell_proc_picture_param->num_output_pictures);
541c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
542c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				goto out;
543c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			}
544c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
5458e9a21e730449c10cac6e6f69d255611c93f63c2hding			cur_output_surf = SURFACE(frc_param->output_frames[i-1]);
5468e9a21e730449c10cac6e6f69d255611c93f63c2hding			if (cur_output_surf == NULL) {
5478e9a21e730449c10cac6e6f69d255611c93f63c2hding				drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input surface %x\n", frc_param->output_frames[i-1]);
5488e9a21e730449c10cac6e6f69d255611c93f63c2hding				vaStatus = VA_STATUS_ERROR_UNKNOWN;
5498e9a21e730449c10cac6e6f69d255611c93f63c2hding				goto out;
5508e9a21e730449c10cac6e6f69d255611c93f63c2hding			}
5518e9a21e730449c10cac6e6f69d255611c93f63c2hding		}
5528e9a21e730449c10cac6e6f69d255611c93f63c2hding
5538e9a21e730449c10cac6e6f69d255611c93f63c2hding		cell_proc_picture_param->output_picture[i].surface_id = wsbmKBufHandle(wsbmKBuf(cur_output_surf->psb_surface->buf.drm_buf));
5548e9a21e730449c10cac6e6f69d255611c93f63c2hding
5558e9a21e730449c10cac6e6f69d255611c93f63c2hding		vsp_cmdbuf_reloc_pic_param(&(cell_proc_picture_param->output_picture[i].base),
5568e9a21e730449c10cac6e6f69d255611c93f63c2hding					   ctx->pic_param_offset, &(cur_output_surf->psb_surface->buf),
5578e9a21e730449c10cac6e6f69d255611c93f63c2hding					   cmdbuf->param_mem_loc, cell_proc_picture_param);
5588e9a21e730449c10cac6e6f69d255611c93f63c2hding		cell_proc_picture_param->output_picture[i].height = cur_output_surf->height_origin;
5598e9a21e730449c10cac6e6f69d255611c93f63c2hding		cell_proc_picture_param->output_picture[i].width = cur_output_surf->width;
560c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding		cell_proc_picture_param->output_picture[i].stride = cur_output_surf->psb_surface->stride;
5618e9a21e730449c10cac6e6f69d255611c93f63c2hding		cell_proc_picture_param->output_picture[i].irq = 1;
5628e9a21e730449c10cac6e6f69d255611c93f63c2hding		/* keep the same first, modify to dest format when feature's avaliable */
5638e9a21e730449c10cac6e6f69d255611c93f63c2hding		cell_proc_picture_param->output_picture[i].format = ctx->format;
5644b8982ecb6744203ae0b5381942d72a518539661Wang Kun
5654b8982ecb6744203ae0b5381942d72a518539661Wang Kun		/* Set the rotation angle info */
5664b8982ecb6744203ae0b5381942d72a518539661Wang Kun		switch (GET_SURFACE_INFO_rotate(cur_output_surf->psb_surface)) {
5674b8982ecb6744203ae0b5381942d72a518539661Wang Kun			case VA_ROTATION_90:
5684b8982ecb6744203ae0b5381942d72a518539661Wang Kun				rotation_angle = VSP_ROTATION_90;
5694b8982ecb6744203ae0b5381942d72a518539661Wang Kun				break;
5704b8982ecb6744203ae0b5381942d72a518539661Wang Kun			case VA_ROTATION_180:
5714b8982ecb6744203ae0b5381942d72a518539661Wang Kun				rotation_angle = VSP_ROTATION_180;
5724b8982ecb6744203ae0b5381942d72a518539661Wang Kun				break;
5734b8982ecb6744203ae0b5381942d72a518539661Wang Kun			case VA_ROTATION_270:
5744b8982ecb6744203ae0b5381942d72a518539661Wang Kun				rotation_angle = VSP_ROTATION_270;
5754b8982ecb6744203ae0b5381942d72a518539661Wang Kun				break;
5764b8982ecb6744203ae0b5381942d72a518539661Wang Kun			default:
5774b8982ecb6744203ae0b5381942d72a518539661Wang Kun				rotation_angle = VSP_ROTATION_NONE;
5784b8982ecb6744203ae0b5381942d72a518539661Wang Kun		}
5794b8982ecb6744203ae0b5381942d72a518539661Wang Kun		/* FIXME: The rotation design is still on going, set it to default value */
5804b8982ecb6744203ae0b5381942d72a518539661Wang Kun		cell_proc_picture_param->output_picture[i].rot_angle = 0;
5818e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
5828e9a21e730449c10cac6e6f69d255611c93f63c2hding
5838e9a21e730449c10cac6e6f69d255611c93f63c2hding	vsp_cmdbuf_insert_command(cmdbuf, &cmdbuf->param_mem, VssProcPictureCommand,
5848e9a21e730449c10cac6e6f69d255611c93f63c2hding				  ctx->pic_param_offset, sizeof(struct VssProcPictureParameterBuffer));
5858e9a21e730449c10cac6e6f69d255611c93f63c2hding
5868e9a21e730449c10cac6e6f69d255611c93f63c2hding
5878e9a21e730449c10cac6e6f69d255611c93f63c2hding	vsp_cmdbuf_fence_pic_param(cmdbuf, wsbmKBufHandle(wsbmKBuf(cmdbuf->param_mem.drm_buf)));
5888e9a21e730449c10cac6e6f69d255611c93f63c2hding
5898e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* handle reference frames, ignore backward reference */
5908e9a21e730449c10cac6e6f69d255611c93f63c2hding	for (i = 0; i < pipeline_param->num_forward_references; ++i) {
5918e9a21e730449c10cac6e6f69d255611c93f63c2hding		cur_output_surf = SURFACE(pipeline_param->forward_references[i]);
5928e9a21e730449c10cac6e6f69d255611c93f63c2hding		if (cur_output_surf == NULL)
5938e9a21e730449c10cac6e6f69d255611c93f63c2hding			continue;
594d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		if (vsp_cmdbuf_buffer_ref(cmdbuf, &cur_output_surf->psb_surface->buf) < 0) {
595d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun			drv_debug_msg(VIDEO_DEBUG_ERROR, "vsp_cmdbuf_buffer_ref() failed\n");
596d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun			vaStatus = VA_STATUS_ERROR_UNKNOWN;
597d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun			goto out;
598d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		}
5998e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
6008e9a21e730449c10cac6e6f69d255611c93f63c2hding
6018e9a21e730449c10cac6e6f69d255611c93f63c2hdingout:
6028e9a21e730449c10cac6e6f69d255611c93f63c2hding	free(pipeline_param);
6038e9a21e730449c10cac6e6f69d255611c93f63c2hding	obj_buffer->buffer_data = NULL;
6048e9a21e730449c10cac6e6f69d255611c93f63c2hding	obj_buffer->size = 0;
6058e9a21e730449c10cac6e6f69d255611c93f63c2hding
6068e9a21e730449c10cac6e6f69d255611c93f63c2hding	return vaStatus;
6078e9a21e730449c10cac6e6f69d255611c93f63c2hding}
6088e9a21e730449c10cac6e6f69d255611c93f63c2hding
6098e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_RenderPicture(
6108e9a21e730449c10cac6e6f69d255611c93f63c2hding	object_context_p obj_context,
6118e9a21e730449c10cac6e6f69d255611c93f63c2hding	object_buffer_p *buffers,
6128e9a21e730449c10cac6e6f69d255611c93f63c2hding	int num_buffers)
6138e9a21e730449c10cac6e6f69d255611c93f63c2hding{
6148e9a21e730449c10cac6e6f69d255611c93f63c2hding	int i;
6158e9a21e730449c10cac6e6f69d255611c93f63c2hding	INIT_CONTEXT_VPP;
6168e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAStatus vaStatus = VA_STATUS_SUCCESS;
6178e9a21e730449c10cac6e6f69d255611c93f63c2hding
6188e9a21e730449c10cac6e6f69d255611c93f63c2hding	for (i = 0; i < num_buffers; i++) {
6198e9a21e730449c10cac6e6f69d255611c93f63c2hding		object_buffer_p obj_buffer = buffers[i];
6208e9a21e730449c10cac6e6f69d255611c93f63c2hding
6218e9a21e730449c10cac6e6f69d255611c93f63c2hding		switch (obj_buffer->type) {
6228e9a21e730449c10cac6e6f69d255611c93f63c2hding		case VAProcPipelineParameterBufferType:
6238e9a21e730449c10cac6e6f69d255611c93f63c2hding			vaStatus = vsp__VPP_process_pipeline_param(ctx, obj_buffer);
6248e9a21e730449c10cac6e6f69d255611c93f63c2hding			DEBUG_FAILURE;
6258e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
6268e9a21e730449c10cac6e6f69d255611c93f63c2hding		default:
6278e9a21e730449c10cac6e6f69d255611c93f63c2hding			vaStatus = VA_STATUS_ERROR_UNKNOWN;
6288e9a21e730449c10cac6e6f69d255611c93f63c2hding			DEBUG_FAILURE;
6298e9a21e730449c10cac6e6f69d255611c93f63c2hding		}
6308e9a21e730449c10cac6e6f69d255611c93f63c2hding		if (vaStatus != VA_STATUS_SUCCESS) {
6318e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
6328e9a21e730449c10cac6e6f69d255611c93f63c2hding		}
6338e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
6348e9a21e730449c10cac6e6f69d255611c93f63c2hding
6358e9a21e730449c10cac6e6f69d255611c93f63c2hding	return vaStatus;
6368e9a21e730449c10cac6e6f69d255611c93f63c2hding}
6378e9a21e730449c10cac6e6f69d255611c93f63c2hding
6388e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_BeginPicture(
6398e9a21e730449c10cac6e6f69d255611c93f63c2hding	object_context_p obj_context)
6408e9a21e730449c10cac6e6f69d255611c93f63c2hding{
6418e9a21e730449c10cac6e6f69d255611c93f63c2hding	int ret;
6428e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAStatus vaStatus = VA_STATUS_SUCCESS;
6438e9a21e730449c10cac6e6f69d255611c93f63c2hding	INIT_CONTEXT_VPP;
6448e9a21e730449c10cac6e6f69d255611c93f63c2hding	vsp_cmdbuf_p cmdbuf;
6458e9a21e730449c10cac6e6f69d255611c93f63c2hding
6468e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* Initialise the command buffer */
6478e9a21e730449c10cac6e6f69d255611c93f63c2hding	ret = vsp_context_get_next_cmdbuf(ctx->obj_context);
6488e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (ret) {
6498e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_GENERAL, "get next cmdbuf fail\n");
6508e9a21e730449c10cac6e6f69d255611c93f63c2hding		vaStatus = VA_STATUS_ERROR_UNKNOWN;
6518e9a21e730449c10cac6e6f69d255611c93f63c2hding		return vaStatus;
6528e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
6538e9a21e730449c10cac6e6f69d255611c93f63c2hding
6548e9a21e730449c10cac6e6f69d255611c93f63c2hding	cmdbuf = obj_context->vsp_cmdbuf;
6558e9a21e730449c10cac6e6f69d255611c93f63c2hding
656c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	if (ctx->obj_context->frame_count == 0) /* first picture */
657c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding		vsp_cmdbuf_insert_command(cmdbuf, ctx->context_buf, VspSetContextCommand,
658c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					  0, VSP_PROC_CONTEXT_SIZE);
659c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
6608e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* map param mem */
6618e9a21e730449c10cac6e6f69d255611c93f63c2hding	vaStatus = psb_buffer_map(&cmdbuf->param_mem, &cmdbuf->param_mem_p);
6628e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (vaStatus) {
6638e9a21e730449c10cac6e6f69d255611c93f63c2hding		return vaStatus;
6648e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
6658e9a21e730449c10cac6e6f69d255611c93f63c2hding
6668e9a21e730449c10cac6e6f69d255611c93f63c2hding	cmdbuf->pic_param_p = cmdbuf->param_mem_p + ctx->pic_param_offset;
6678e9a21e730449c10cac6e6f69d255611c93f63c2hding	cmdbuf->end_param_p = cmdbuf->param_mem_p + ctx->end_param_offset;
6688e9a21e730449c10cac6e6f69d255611c93f63c2hding	cmdbuf->pipeline_param_p = cmdbuf->param_mem_p + ctx->pipeline_param_offset;
6698e9a21e730449c10cac6e6f69d255611c93f63c2hding	cmdbuf->denoise_param_p = cmdbuf->param_mem_p + ctx->denoise_param_offset;
6708e9a21e730449c10cac6e6f69d255611c93f63c2hding	cmdbuf->enhancer_param_p = cmdbuf->param_mem_p + ctx->enhancer_param_offset;
6718e9a21e730449c10cac6e6f69d255611c93f63c2hding	cmdbuf->sharpen_param_p = cmdbuf->param_mem_p + ctx->sharpen_param_offset;
6728e9a21e730449c10cac6e6f69d255611c93f63c2hding	cmdbuf->frc_param_p = cmdbuf->param_mem_p + ctx->frc_param_offset;
6738e9a21e730449c10cac6e6f69d255611c93f63c2hding
6748e9a21e730449c10cac6e6f69d255611c93f63c2hding	return VA_STATUS_SUCCESS;
6758e9a21e730449c10cac6e6f69d255611c93f63c2hding}
6768e9a21e730449c10cac6e6f69d255611c93f63c2hding
6778e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_VPP_EndPicture(
6788e9a21e730449c10cac6e6f69d255611c93f63c2hding	object_context_p obj_context)
6798e9a21e730449c10cac6e6f69d255611c93f63c2hding{
6808e9a21e730449c10cac6e6f69d255611c93f63c2hding	INIT_CONTEXT_VPP;
6818e9a21e730449c10cac6e6f69d255611c93f63c2hding	psb_driver_data_p driver_data = obj_context->driver_data;
6828e9a21e730449c10cac6e6f69d255611c93f63c2hding	vsp_cmdbuf_p cmdbuf = obj_context->vsp_cmdbuf;
6838e9a21e730449c10cac6e6f69d255611c93f63c2hding
6848e9a21e730449c10cac6e6f69d255611c93f63c2hding	if(cmdbuf->param_mem_p != NULL) {
6858e9a21e730449c10cac6e6f69d255611c93f63c2hding		psb_buffer_unmap(&cmdbuf->param_mem);
6868e9a21e730449c10cac6e6f69d255611c93f63c2hding		cmdbuf->param_mem_p = NULL;
6878e9a21e730449c10cac6e6f69d255611c93f63c2hding		cmdbuf->pic_param_p = NULL;
6888e9a21e730449c10cac6e6f69d255611c93f63c2hding		cmdbuf->end_param_p = NULL;
6898e9a21e730449c10cac6e6f69d255611c93f63c2hding		cmdbuf->pipeline_param_p = NULL;
6908e9a21e730449c10cac6e6f69d255611c93f63c2hding		cmdbuf->denoise_param_p = NULL;
6918e9a21e730449c10cac6e6f69d255611c93f63c2hding		cmdbuf->enhancer_param_p = NULL;
6928e9a21e730449c10cac6e6f69d255611c93f63c2hding		cmdbuf->sharpen_param_p = NULL;
6938e9a21e730449c10cac6e6f69d255611c93f63c2hding		cmdbuf->frc_param_p = NULL;
6948e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
6958e9a21e730449c10cac6e6f69d255611c93f63c2hding
696d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun	if (vsp_context_flush_cmdbuf(ctx->obj_context)) {
6978e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VPP: flush deblock cmdbuf error\n");
698d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		return VA_STATUS_ERROR_UNKNOWN;
699d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun	}
7008e9a21e730449c10cac6e6f69d255611c93f63c2hding
7018e9a21e730449c10cac6e6f69d255611c93f63c2hding	return VA_STATUS_SUCCESS;
7028e9a21e730449c10cac6e6f69d255611c93f63c2hding}
7038e9a21e730449c10cac6e6f69d255611c93f63c2hding
7048e9a21e730449c10cac6e6f69d255611c93f63c2hdingstruct format_vtable_s vsp_VPP_vtable = {
7058e9a21e730449c10cac6e6f69d255611c93f63c2hdingqueryConfigAttributes:
7068e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_QueryConfigAttributes,
7078e9a21e730449c10cac6e6f69d255611c93f63c2hdingvalidateConfig:
7088e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_ValidateConfig,
7098e9a21e730449c10cac6e6f69d255611c93f63c2hdingcreateContext:
7108e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_CreateContext,
7118e9a21e730449c10cac6e6f69d255611c93f63c2hdingdestroyContext:
7128e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_DestroyContext,
7138e9a21e730449c10cac6e6f69d255611c93f63c2hdingbeginPicture:
7148e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_BeginPicture,
7158e9a21e730449c10cac6e6f69d255611c93f63c2hdingrenderPicture:
7168e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_RenderPicture,
7178e9a21e730449c10cac6e6f69d255611c93f63c2hdingendPicture:
7188e9a21e730449c10cac6e6f69d255611c93f63c2hdingvsp_VPP_EndPicture
7198e9a21e730449c10cac6e6f69d255611c93f63c2hding};
7208e9a21e730449c10cac6e6f69d255611c93f63c2hding
7218e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcFilters(
7228e9a21e730449c10cac6e6f69d255611c93f63c2hding        VADriverContextP    ctx,
7238e9a21e730449c10cac6e6f69d255611c93f63c2hding        VAContextID         context,
7248e9a21e730449c10cac6e6f69d255611c93f63c2hding        VAProcFilterType   *filters,
7258e9a21e730449c10cac6e6f69d255611c93f63c2hding        unsigned int       *num_filters
7268e9a21e730449c10cac6e6f69d255611c93f63c2hding	)
7278e9a21e730449c10cac6e6f69d255611c93f63c2hding{
7288e9a21e730449c10cac6e6f69d255611c93f63c2hding	INIT_DRIVER_DATA;
7298e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAStatus vaStatus = VA_STATUS_SUCCESS;
7308e9a21e730449c10cac6e6f69d255611c93f63c2hding	object_context_p obj_context;
7318e9a21e730449c10cac6e6f69d255611c93f63c2hding	object_config_p obj_config;
7328e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAEntrypoint tmp;
7338e9a21e730449c10cac6e6f69d255611c93f63c2hding	int count;
7348e9a21e730449c10cac6e6f69d255611c93f63c2hding
7358e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* check if ctx is right */
7368e9a21e730449c10cac6e6f69d255611c93f63c2hding	obj_context = CONTEXT(context);
7378e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (NULL == obj_context) {
7388e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n");
73938cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun		vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT;
7408e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto err;
7418e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
7428e9a21e730449c10cac6e6f69d255611c93f63c2hding
7438e9a21e730449c10cac6e6f69d255611c93f63c2hding	obj_config = CONFIG(obj_context->config_id);
7448e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (NULL == obj_config) {
7458e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n");
74638cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun		vaStatus = VA_STATUS_ERROR_INVALID_CONFIG;
7478e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto err;
7488e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
7498e9a21e730449c10cac6e6f69d255611c93f63c2hding
7508e9a21e730449c10cac6e6f69d255611c93f63c2hding	tmp = obj_config->entrypoint;
7518e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (tmp != VAEntrypointVideoProc) {
7528e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "current entrypoint is %d, not VAEntrypointVideoProc\n", tmp);
7538e9a21e730449c10cac6e6f69d255611c93f63c2hding		vaStatus = VA_STATUS_ERROR_UNKNOWN;
7548e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto err;
7558e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
7568e9a21e730449c10cac6e6f69d255611c93f63c2hding
757d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun	/* check if filters and num_filters is valid */
7588e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (NULL == num_filters || NULL == filters) {
7598e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters %p, filters %p\n", num_filters, filters);
76038cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun		vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
7618e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto err;
7628e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
7638e9a21e730449c10cac6e6f69d255611c93f63c2hding
764d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun	/* check if the filter array size is valid */
765d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun	if (*num_filters < VSP_SUPPORTED_FILTERS_NUM) {
766d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		drv_debug_msg(VIDEO_DEBUG_ERROR, "The filters array size(%d) is NOT valid! Supported filters num is %d\n",
767d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun				*num_filters, VSP_SUPPORTED_FILTERS_NUM);
768d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
769d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		*num_filters = VSP_SUPPORTED_FILTERS_NUM;
770d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		goto err;
771d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun	}
772d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun
7738e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* check if current HW support Video proc */
7748e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (IS_MRFL(driver_data)) {
7758e9a21e730449c10cac6e6f69d255611c93f63c2hding		count = 0;
776c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding		filters[count++] = VAProcFilterDeblocking;
7778e9a21e730449c10cac6e6f69d255611c93f63c2hding		filters[count++] = VAProcFilterNoiseReduction;
7788e9a21e730449c10cac6e6f69d255611c93f63c2hding		filters[count++] = VAProcFilterSharpening;
779c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding		filters[count++] = VAProcFilterColorBalance;
7808e9a21e730449c10cac6e6f69d255611c93f63c2hding		filters[count++] = VAProcFilterFrameRateConversion;
7818e9a21e730449c10cac6e6f69d255611c93f63c2hding		*num_filters = count;
7828e9a21e730449c10cac6e6f69d255611c93f63c2hding	} else {
7838e9a21e730449c10cac6e6f69d255611c93f63c2hding		*num_filters = 0;
7848e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
7858e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr:
7868e9a21e730449c10cac6e6f69d255611c93f63c2hding	return vaStatus;
7878e9a21e730449c10cac6e6f69d255611c93f63c2hding}
7888e9a21e730449c10cac6e6f69d255611c93f63c2hding
7898e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcFilterCaps(
7908e9a21e730449c10cac6e6f69d255611c93f63c2hding        VADriverContextP    ctx,
7918e9a21e730449c10cac6e6f69d255611c93f63c2hding        VAContextID         context,
7928e9a21e730449c10cac6e6f69d255611c93f63c2hding        VAProcFilterType    type,
7938e9a21e730449c10cac6e6f69d255611c93f63c2hding        void               *filter_caps,
7948e9a21e730449c10cac6e6f69d255611c93f63c2hding        unsigned int       *num_filter_caps
7958e9a21e730449c10cac6e6f69d255611c93f63c2hding	)
7968e9a21e730449c10cac6e6f69d255611c93f63c2hding{
7978e9a21e730449c10cac6e6f69d255611c93f63c2hding	INIT_DRIVER_DATA;
7988e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAStatus vaStatus = VA_STATUS_SUCCESS;
7998e9a21e730449c10cac6e6f69d255611c93f63c2hding	object_context_p obj_context;
8008e9a21e730449c10cac6e6f69d255611c93f63c2hding	object_config_p obj_config;
8018e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAEntrypoint tmp;
802fc84bd8b6852aff0a3f70c4f21533ce36e1937behding	VAProcFilterCap *denoise_cap, *deblock_cap;
8038e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAProcFilterCap *sharpen_cap;
804c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	VAProcFilterCapColorBalance *color_balance_cap;
8058e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAProcFilterCap *frc_cap;
8068e9a21e730449c10cac6e6f69d255611c93f63c2hding
8078e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* check if context is right */
8088e9a21e730449c10cac6e6f69d255611c93f63c2hding	obj_context = CONTEXT(context);
8098e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (NULL == obj_context) {
8108e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n");
81138cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun		vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT;
8128e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto err;
8138e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
8148e9a21e730449c10cac6e6f69d255611c93f63c2hding
8158e9a21e730449c10cac6e6f69d255611c93f63c2hding	obj_config = CONFIG(obj_context->config_id);
8168e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (NULL == obj_config) {
8178e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n");
81838cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun		vaStatus = VA_STATUS_ERROR_INVALID_CONFIG;
8198e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto err;
8208e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
8218e9a21e730449c10cac6e6f69d255611c93f63c2hding
8228e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* check if filter_caps and num_filter_caps is right */
8238e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (NULL == num_filter_caps || NULL == filter_caps){
8248e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters %p, filters %p\n", num_filter_caps, filter_caps);
82538cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun		vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
8268e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto err;
8278e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
8288e9a21e730449c10cac6e6f69d255611c93f63c2hding
8298e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (*num_filter_caps < 1) {
8308e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide input parameter num_filters == %d (> 1)\n", *num_filter_caps);
83138cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun		vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
8328e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto err;
8338e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
8348e9a21e730449c10cac6e6f69d255611c93f63c2hding
8358e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* check if curent HW support and return corresponding caps */
8368e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (IS_MRFL(driver_data)) {
8378e9a21e730449c10cac6e6f69d255611c93f63c2hding		/* FIXME: we should use a constant table to return caps */
8388e9a21e730449c10cac6e6f69d255611c93f63c2hding		switch (type) {
8398e9a21e730449c10cac6e6f69d255611c93f63c2hding		case VAProcFilterNoiseReduction:
8408e9a21e730449c10cac6e6f69d255611c93f63c2hding			denoise_cap = filter_caps;
84166304487373cf4ed335ba2614f00102dca837832Wang Kun			denoise_cap->range.min_value = MIN_VPP_PARAM;
84266304487373cf4ed335ba2614f00102dca837832Wang Kun			denoise_cap->range.max_value = MAX_VPP_PARAM;
84366304487373cf4ed335ba2614f00102dca837832Wang Kun			denoise_cap->range.default_value = MIN_VPP_PARAM;
84466304487373cf4ed335ba2614f00102dca837832Wang Kun			denoise_cap->range.step = STEP_VPP_PARAM;
845c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			*num_filter_caps = 1;
8468e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
847fc84bd8b6852aff0a3f70c4f21533ce36e1937behding		case VAProcFilterDeblocking:
848fc84bd8b6852aff0a3f70c4f21533ce36e1937behding			deblock_cap = filter_caps;
84966304487373cf4ed335ba2614f00102dca837832Wang Kun			deblock_cap->range.min_value = MIN_VPP_PARAM;
85066304487373cf4ed335ba2614f00102dca837832Wang Kun			deblock_cap->range.max_value = MAX_VPP_PARAM;
85166304487373cf4ed335ba2614f00102dca837832Wang Kun			deblock_cap->range.default_value = MIN_VPP_PARAM;
85266304487373cf4ed335ba2614f00102dca837832Wang Kun			deblock_cap->range.step = STEP_VPP_PARAM;
853c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			*num_filter_caps = 1;
854fc84bd8b6852aff0a3f70c4f21533ce36e1937behding			break;
8558e9a21e730449c10cac6e6f69d255611c93f63c2hding
8568e9a21e730449c10cac6e6f69d255611c93f63c2hding		case VAProcFilterSharpening:
8578e9a21e730449c10cac6e6f69d255611c93f63c2hding			sharpen_cap = filter_caps;
85866304487373cf4ed335ba2614f00102dca837832Wang Kun			sharpen_cap->range.min_value = MIN_VPP_PARAM;
85966304487373cf4ed335ba2614f00102dca837832Wang Kun			sharpen_cap->range.max_value = MAX_VPP_PARAM;
86066304487373cf4ed335ba2614f00102dca837832Wang Kun			sharpen_cap->range.default_value = MIN_VPP_PARAM;
86166304487373cf4ed335ba2614f00102dca837832Wang Kun			sharpen_cap->range.step = STEP_VPP_PARAM;
862c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			*num_filter_caps = 1;
8638e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
8648e9a21e730449c10cac6e6f69d255611c93f63c2hding
865c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding		case VAProcFilterColorBalance:
866c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			if (*num_filter_caps < VSP_COLOR_ENHANCE_FEATURES) {
867c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				drv_debug_msg(VIDEO_DEBUG_ERROR, "filter cap num is should big than %d(%d)\n",
868c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					      VSP_COLOR_ENHANCE_FEATURES, *num_filter_caps);
869d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun				vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
870d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun				*num_filter_caps = VSP_COLOR_ENHANCE_FEATURES;
871c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				goto err;
872c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			}
873c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			color_balance_cap = filter_caps;
874c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			color_balance_cap->type = VAProcColorBalanceAutoSaturation;
87566304487373cf4ed335ba2614f00102dca837832Wang Kun			color_balance_cap->range.min_value = MIN_VPP_AUTO_PARAM;
87666304487373cf4ed335ba2614f00102dca837832Wang Kun			color_balance_cap->range.max_value = MAX_VPP_AUTO_PARAM;
87766304487373cf4ed335ba2614f00102dca837832Wang Kun			color_balance_cap->range.default_value = MIN_VPP_AUTO_PARAM;
87866304487373cf4ed335ba2614f00102dca837832Wang Kun			color_balance_cap->range.step = STEP_VPP_AUTO_PARAM;
879c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
880c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			color_balance_cap++;
881c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			color_balance_cap->type = VAProcColorBalanceAutoBrightness;
88266304487373cf4ed335ba2614f00102dca837832Wang Kun			color_balance_cap->range.min_value = MIN_VPP_AUTO_PARAM;
88366304487373cf4ed335ba2614f00102dca837832Wang Kun			color_balance_cap->range.max_value = MAX_VPP_AUTO_PARAM;
88466304487373cf4ed335ba2614f00102dca837832Wang Kun			color_balance_cap->range.default_value = MIN_VPP_AUTO_PARAM;
88566304487373cf4ed335ba2614f00102dca837832Wang Kun			color_balance_cap->range.step = STEP_VPP_AUTO_PARAM;
886c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
887c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			*num_filter_caps = 2;
8888e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
8898e9a21e730449c10cac6e6f69d255611c93f63c2hding
8908e9a21e730449c10cac6e6f69d255611c93f63c2hding		case VAProcFilterFrameRateConversion:
8918e9a21e730449c10cac6e6f69d255611c93f63c2hding			frc_cap = filter_caps;
8928e9a21e730449c10cac6e6f69d255611c93f63c2hding			frc_cap->range.min_value = 2;
8938e9a21e730449c10cac6e6f69d255611c93f63c2hding			frc_cap->range.max_value = 4;
8948e9a21e730449c10cac6e6f69d255611c93f63c2hding			frc_cap->range.default_value = 2;
8958e9a21e730449c10cac6e6f69d255611c93f63c2hding			/* FIXME: it's a set, step is helpless */
8968e9a21e730449c10cac6e6f69d255611c93f63c2hding			frc_cap->range.step = 0.5;
897c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			*num_filter_caps = 1;
8988e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
8998e9a21e730449c10cac6e6f69d255611c93f63c2hding
9008e9a21e730449c10cac6e6f69d255611c93f63c2hding		default:
9018e9a21e730449c10cac6e6f69d255611c93f63c2hding			drv_debug_msg(VIDEO_DEBUG_ERROR, "invalide filter type %d\n", type);
90238cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun			vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER;
9038e9a21e730449c10cac6e6f69d255611c93f63c2hding			*num_filter_caps = 0;
9048e9a21e730449c10cac6e6f69d255611c93f63c2hding			goto err;
9058e9a21e730449c10cac6e6f69d255611c93f63c2hding		}
9068e9a21e730449c10cac6e6f69d255611c93f63c2hding	} else {
9078e9a21e730449c10cac6e6f69d255611c93f63c2hding		*num_filter_caps = 0;
9088e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
9098e9a21e730449c10cac6e6f69d255611c93f63c2hding
9108e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr:
9118e9a21e730449c10cac6e6f69d255611c93f63c2hding	return vaStatus;
9128e9a21e730449c10cac6e6f69d255611c93f63c2hding}
9138e9a21e730449c10cac6e6f69d255611c93f63c2hding
9148e9a21e730449c10cac6e6f69d255611c93f63c2hdingVAStatus vsp_QueryVideoProcPipelineCaps(
9158e9a21e730449c10cac6e6f69d255611c93f63c2hding	VADriverContextP    ctx,
9168e9a21e730449c10cac6e6f69d255611c93f63c2hding        VAContextID         context,
9178e9a21e730449c10cac6e6f69d255611c93f63c2hding        VABufferID         *filters,
9188e9a21e730449c10cac6e6f69d255611c93f63c2hding        unsigned int        num_filters,
9198e9a21e730449c10cac6e6f69d255611c93f63c2hding        VAProcPipelineCaps *pipeline_caps
9208e9a21e730449c10cac6e6f69d255611c93f63c2hding    )
9218e9a21e730449c10cac6e6f69d255611c93f63c2hding{
9228e9a21e730449c10cac6e6f69d255611c93f63c2hding	INIT_DRIVER_DATA;
9238e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAStatus vaStatus = VA_STATUS_SUCCESS;
9248e9a21e730449c10cac6e6f69d255611c93f63c2hding	object_context_p obj_context;
9258e9a21e730449c10cac6e6f69d255611c93f63c2hding	object_config_p obj_config;
9268e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAEntrypoint tmp;
927c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	unsigned int i, j;
928c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	VAProcFilterParameterBuffer *deblock, *denoise, *sharpen;
929c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	VAProcFilterParameterBufferFrameRateConversion *frc;
930c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	VAProcFilterParameterBufferColorBalance *balance;
931c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	VAProcFilterParameterBufferBase *base;
932c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	object_buffer_p buf;
933c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	uint32_t enabled_brightness, enabled_saturation;
934c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	float ratio;
935c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding	int res_set;
93666304487373cf4ed335ba2614f00102dca837832Wang Kun	int strength;
93766304487373cf4ed335ba2614f00102dca837832Wang Kun	context_VPP_p vpp_ctx;
93836b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun	int combination_check;
9398e9a21e730449c10cac6e6f69d255611c93f63c2hding
9408e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* check if ctx is right */
9418e9a21e730449c10cac6e6f69d255611c93f63c2hding	obj_context = CONTEXT(context);
9428e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (NULL == obj_context) {
9438e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find context\n");
94438cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun		vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT;
9458e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto err;
9468e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
9478e9a21e730449c10cac6e6f69d255611c93f63c2hding
94866304487373cf4ed335ba2614f00102dca837832Wang Kun	vpp_ctx = (context_VPP_p) obj_context->format_data;
94966304487373cf4ed335ba2614f00102dca837832Wang Kun
9508e9a21e730449c10cac6e6f69d255611c93f63c2hding	obj_config = CONFIG(obj_context->config_id);
9518e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (NULL == obj_config) {
9528e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to find config\n");
95338cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun		vaStatus = VA_STATUS_ERROR_INVALID_CONFIG;
9548e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto err;
9558e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
9568e9a21e730449c10cac6e6f69d255611c93f63c2hding
9578e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* check if filters and num_filters and pipeline-caps are right */
9588e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (num_filters == 0) {
9598e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_filters %d\n", num_filters);
96038cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun		vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
9618e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto err;
9628e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
9638e9a21e730449c10cac6e6f69d255611c93f63c2hding
9648e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (NULL == filters || pipeline_caps == NULL) {
9658e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid filters %p or pipeline_caps %p\n", filters, pipeline_caps);
96638cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun		vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
9678e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto err;
9688e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
9698e9a21e730449c10cac6e6f69d255611c93f63c2hding
9708e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* base on HW capability check the filters and return pipeline caps */
9718e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (IS_MRFL(driver_data)) {
9728e9a21e730449c10cac6e6f69d255611c93f63c2hding		pipeline_caps->pipeline_flags = 0;
9738e9a21e730449c10cac6e6f69d255611c93f63c2hding		pipeline_caps->filter_flags = 0;
9748e9a21e730449c10cac6e6f69d255611c93f63c2hding		pipeline_caps->num_forward_references = VSP_FORWARD_REF_NUM;
9758e9a21e730449c10cac6e6f69d255611c93f63c2hding		pipeline_caps->num_backward_references = 0;
9768e9a21e730449c10cac6e6f69d255611c93f63c2hding
977d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		/* check the input color standard */
978d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		if (pipeline_caps->input_color_standards == NULL){
979d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun			drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid input color standard array!\n");
98038cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun			vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
9818e9a21e730449c10cac6e6f69d255611c93f63c2hding			goto err;
9828e9a21e730449c10cac6e6f69d255611c93f63c2hding		}
983d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		if (pipeline_caps->num_input_color_standards < COLOR_STANDARDS_NUM) {
984d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun			drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_input_color_standards %d\n", pipeline_caps->num_input_color_standards);
985d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun			vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
986d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun			pipeline_caps->num_input_color_standards = COLOR_STANDARDS_NUM;
987d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun			goto err;
988d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		}
9898e9a21e730449c10cac6e6f69d255611c93f63c2hding		pipeline_caps->input_color_standards[0] = VAProcColorStandardNone;
990d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		pipeline_caps->num_input_color_standards = COLOR_STANDARDS_NUM;
9918e9a21e730449c10cac6e6f69d255611c93f63c2hding
992d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		/* check the output color standard */
993d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		if (pipeline_caps->output_color_standards == NULL){
994d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun			drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid output color standard array!\n");
99538cd6d452193ef0f00bc831464af672aa8fed3b9Wang Kun			vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
9968e9a21e730449c10cac6e6f69d255611c93f63c2hding			goto err;
9978e9a21e730449c10cac6e6f69d255611c93f63c2hding		}
998d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		if (pipeline_caps->num_output_color_standards < COLOR_STANDARDS_NUM) {
999d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun			drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid num_output_color_standards %d\n", pipeline_caps->num_output_color_standards);
1000d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun			vaStatus = VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
1001d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun			pipeline_caps->num_output_color_standards = COLOR_STANDARDS_NUM;
1002d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun			goto err;
1003d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		}
10048e9a21e730449c10cac6e6f69d255611c93f63c2hding		pipeline_caps->output_color_standards[0] = VAProcColorStandardNone;
1005d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun		pipeline_caps->num_output_color_standards = COLOR_STANDARDS_NUM;
10068e9a21e730449c10cac6e6f69d255611c93f63c2hding
100766304487373cf4ed335ba2614f00102dca837832Wang Kun		/* check the resolution */
100866304487373cf4ed335ba2614f00102dca837832Wang Kun		res_set = check_resolution(obj_context->picture_width,
100966304487373cf4ed335ba2614f00102dca837832Wang Kun					   obj_context->picture_height);
101066304487373cf4ed335ba2614f00102dca837832Wang Kun		if (res_set == NOT_SUPPORTED_RESOLUTION) {
1011c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED;
1012c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			goto err;
1013c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding		}
1014c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
101536b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun		if (getenv("VSP_PIPELINE_CHECK") != NULL)
101636b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun			combination_check = 1;
101766304487373cf4ed335ba2614f00102dca837832Wang Kun		else
101836b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun			combination_check = 0;
1019c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
10208e9a21e730449c10cac6e6f69d255611c93f63c2hding		/* FIXME: should check filter value settings here */
10218e9a21e730449c10cac6e6f69d255611c93f63c2hding		for (i = 0; i < num_filters; ++i) {
10228e9a21e730449c10cac6e6f69d255611c93f63c2hding			/* find buffer */
1023c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			buf = BUFFER(*(filters + i));
1024c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
1025c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			base = (VAProcFilterParameterBufferBase *)buf->buffer_data;
10268e9a21e730449c10cac6e6f69d255611c93f63c2hding			/* check filter buffer setting */
1027c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			switch (base->type) {
1028c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			case VAProcFilterDeblocking:
102966304487373cf4ed335ba2614f00102dca837832Wang Kun				deblock = (VAProcFilterParameterBuffer *)base;
103066304487373cf4ed335ba2614f00102dca837832Wang Kun
103136b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun				if (combination_check &&
103266304487373cf4ed335ba2614f00102dca837832Wang Kun				    vpp_chain_caps[res_set].deblock_enabled != FILTER_ENABLED) {
1033d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun					drv_debug_msg(VIDEO_DEBUG_ERROR, "The deblock is DISABLE for %d format\n", res_set);
1034c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN;
1035c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					goto err;
103666304487373cf4ed335ba2614f00102dca837832Wang Kun				} else {
103766304487373cf4ed335ba2614f00102dca837832Wang Kun					/* check if the value is right */
103866304487373cf4ed335ba2614f00102dca837832Wang Kun					strength = check_vpp_strength(deblock->value);
103966304487373cf4ed335ba2614f00102dca837832Wang Kun					if (strength == INVALID_STRENGTH) {
104066304487373cf4ed335ba2614f00102dca837832Wang Kun						vaStatus = VA_STATUS_ERROR_INVALID_VALUE;
104166304487373cf4ed335ba2614f00102dca837832Wang Kun						goto err;
104266304487373cf4ed335ba2614f00102dca837832Wang Kun					}
104366304487373cf4ed335ba2614f00102dca837832Wang Kun					memcpy(&vpp_ctx->denoise_deblock_param,
104466304487373cf4ed335ba2614f00102dca837832Wang Kun					       &vpp_strength[strength].denoise_deblock[res_set],
104566304487373cf4ed335ba2614f00102dca837832Wang Kun					       sizeof(vpp_ctx->denoise_deblock_param));
1046c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				}
1047c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				break;
1048c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
1049c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			case VAProcFilterNoiseReduction:
105066304487373cf4ed335ba2614f00102dca837832Wang Kun				denoise = (VAProcFilterParameterBuffer *)base;
105166304487373cf4ed335ba2614f00102dca837832Wang Kun
105236b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun				if (combination_check &&
105366304487373cf4ed335ba2614f00102dca837832Wang Kun				    vpp_chain_caps[res_set].denoise_enabled != FILTER_ENABLED) {
1054d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun					drv_debug_msg(VIDEO_DEBUG_ERROR, "The denoise is DISABLE for %d format\n", res_set);
1055c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN;
1056c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					goto err;
105766304487373cf4ed335ba2614f00102dca837832Wang Kun				} else {
105866304487373cf4ed335ba2614f00102dca837832Wang Kun					strength = check_vpp_strength(denoise->value);
105966304487373cf4ed335ba2614f00102dca837832Wang Kun					if (strength == INVALID_STRENGTH) {
106066304487373cf4ed335ba2614f00102dca837832Wang Kun						vaStatus = VA_STATUS_ERROR_INVALID_VALUE;
106166304487373cf4ed335ba2614f00102dca837832Wang Kun						goto err;
106266304487373cf4ed335ba2614f00102dca837832Wang Kun					}
106366304487373cf4ed335ba2614f00102dca837832Wang Kun					memcpy(&vpp_ctx->denoise_deblock_param,
106466304487373cf4ed335ba2614f00102dca837832Wang Kun					       &vpp_strength[strength].denoise_deblock[res_set],
106566304487373cf4ed335ba2614f00102dca837832Wang Kun					       sizeof(vpp_ctx->denoise_deblock_param));
1066c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				}
1067c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				break;
1068c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
1069c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			case VAProcFilterSharpening:
107066304487373cf4ed335ba2614f00102dca837832Wang Kun				sharpen = (VAProcFilterParameterBuffer *)base;
107166304487373cf4ed335ba2614f00102dca837832Wang Kun
107236b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun				if (combination_check &&
107366304487373cf4ed335ba2614f00102dca837832Wang Kun				    vpp_chain_caps[res_set].sharpen_enabled != FILTER_ENABLED) {
1074d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun					drv_debug_msg(VIDEO_DEBUG_ERROR, "The sharpen is DISABLE for %d format\n", res_set);
1075c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN;
1076c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					goto err;
107766304487373cf4ed335ba2614f00102dca837832Wang Kun				} else {
107866304487373cf4ed335ba2614f00102dca837832Wang Kun					strength = check_vpp_strength(sharpen->value);
107966304487373cf4ed335ba2614f00102dca837832Wang Kun					if (strength == INVALID_STRENGTH) {
108066304487373cf4ed335ba2614f00102dca837832Wang Kun						vaStatus = VA_STATUS_ERROR_INVALID_VALUE;
108166304487373cf4ed335ba2614f00102dca837832Wang Kun						goto err;
108266304487373cf4ed335ba2614f00102dca837832Wang Kun					}
108366304487373cf4ed335ba2614f00102dca837832Wang Kun					memcpy(&vpp_ctx->sharpen_param,
108466304487373cf4ed335ba2614f00102dca837832Wang Kun					      &vpp_strength[strength].sharpen[res_set],
108566304487373cf4ed335ba2614f00102dca837832Wang Kun					       sizeof(vpp_ctx->sharpen_param));
1086c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				}
1087c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				break;
1088c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
1089c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			case VAProcFilterColorBalance:
1090c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				balance = (VAProcFilterParameterBufferColorBalance *)base;
1091c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
1092c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				enabled_brightness = 0;
1093c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				enabled_saturation = 0;
1094c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
1095c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				for (j = 0; j < buf->num_elements; ++j, ++balance) {
109666304487373cf4ed335ba2614f00102dca837832Wang Kun					if (balance->attrib == VAProcColorBalanceAutoSaturation &&
109766304487373cf4ed335ba2614f00102dca837832Wang Kun					    balance->value == MAX_VPP_AUTO_PARAM) {
1098c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding						enabled_saturation = 1;
109966304487373cf4ed335ba2614f00102dca837832Wang Kun					} else if (balance->attrib == VAProcColorBalanceAutoBrightness &&
110066304487373cf4ed335ba2614f00102dca837832Wang Kun						   balance->value == MAX_VPP_AUTO_PARAM) {
1101c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding						enabled_brightness = 1;
1102c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					} else {
1103d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun						drv_debug_msg(VIDEO_DEBUG_ERROR, "The color_banlance do NOT support this attrib %d\n",
1104d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun							      balance->attrib);
1105c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding						vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER;
1106c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding						goto err;
1107c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					}
1108c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				}
1109c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
1110c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				/* check filter chain */
111136b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun				if (combination_check &&
111266304487373cf4ed335ba2614f00102dca837832Wang Kun				    vpp_chain_caps[res_set].color_balance_enabled != FILTER_ENABLED) {
1113d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun					drv_debug_msg(VIDEO_DEBUG_ERROR, "The color_balance is DISABLE for %d format\n", res_set);
1114c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN;
1115c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					goto err;
111666304487373cf4ed335ba2614f00102dca837832Wang Kun				} else {
111766304487373cf4ed335ba2614f00102dca837832Wang Kun					strength = MEDIUM_STRENGTH;
111866304487373cf4ed335ba2614f00102dca837832Wang Kun					memcpy(&vpp_ctx->enhancer_param,
111966304487373cf4ed335ba2614f00102dca837832Wang Kun					       &vpp_strength[strength].enhancer[res_set],
112066304487373cf4ed335ba2614f00102dca837832Wang Kun					       sizeof(vpp_ctx->enhancer_param));
112166304487373cf4ed335ba2614f00102dca837832Wang Kun					if (!enabled_saturation)
112266304487373cf4ed335ba2614f00102dca837832Wang Kun						vpp_ctx->enhancer_param.chroma_amm = 0;
112366304487373cf4ed335ba2614f00102dca837832Wang Kun					if (!enabled_brightness)
112466304487373cf4ed335ba2614f00102dca837832Wang Kun						vpp_ctx->enhancer_param.luma_amm = 0;
1125c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				}
1126c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
1127c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				break;
1128c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
1129c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			case VAProcFilterFrameRateConversion:
1130c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				frc = (VAProcFilterParameterBufferFrameRateConversion *)base;
1131c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
1132c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				/* check frame rate */
1133c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				ratio = frc->output_fps / (float)frc->input_fps;
1134c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
1135c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				if (!((ratio == 2 || ratio == 2.5 || ratio == 4) && frc->output_fps <= 60)) {
1136d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun					drv_debug_msg(VIDEO_DEBUG_ERROR, "The FRC do NOT support the ration(%f) and fps(%d)\n",
1137d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun						      ratio, frc->output_fps);
1138c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					vaStatus = VA_STATUS_ERROR_UNSUPPORTED_FILTER;
1139c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					goto err;
1140c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				}
1141c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
1142c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				/* check the chain */
114336b2fec53dda9155f2a93eb75f7fe2b7c63d3941Wang Kun				if (combination_check &&
114466304487373cf4ed335ba2614f00102dca837832Wang Kun				    vpp_chain_caps[res_set].frc_enabled != FILTER_ENABLED) {
1145d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun					drv_debug_msg(VIDEO_DEBUG_ERROR, "The FRC is DISABLE for %d format\n", res_set);
1146c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					vaStatus = VA_STATUS_ERROR_INVALID_FILTER_CHAIN;
1147c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding					goto err;
1148c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				}
1149c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding
1150c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				break;
1151c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			default:
1152d9dce27af5a91d19aaf1f2113a4a8ac4a9f9540bWang Kun				drv_debug_msg(VIDEO_DEBUG_ERROR, "Do NOT support the filter type %d\n", base->type);
1153c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				vaStatus = VA_STATUS_ERROR_UNKNOWN;
1154c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding				goto err;
1155c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding			}
11568e9a21e730449c10cac6e6f69d255611c93f63c2hding		}
11578e9a21e730449c10cac6e6f69d255611c93f63c2hding	} else {
11588e9a21e730449c10cac6e6f69d255611c93f63c2hding		drv_debug_msg(VIDEO_DEBUG_ERROR, "no HW support\n");
11598e9a21e730449c10cac6e6f69d255611c93f63c2hding		vaStatus = VA_STATUS_ERROR_UNKNOWN;
11608e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto err;
11618e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
11628e9a21e730449c10cac6e6f69d255611c93f63c2hdingerr:
11638e9a21e730449c10cac6e6f69d255611c93f63c2hding	return vaStatus;
11648e9a21e730449c10cac6e6f69d255611c93f63c2hding}
11658e9a21e730449c10cac6e6f69d255611c93f63c2hding
11668e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_pipeline(context_VPP_p ctx)
11678e9a21e730449c10cac6e6f69d255611c93f63c2hding{
11688e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAStatus vaStatus = VA_STATUS_SUCCESS;
11698e9a21e730449c10cac6e6f69d255611c93f63c2hding	vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf;
11708e9a21e730449c10cac6e6f69d255611c93f63c2hding	struct VssProcPipelineParameterBuffer *cell_pipeline_param = (struct VssProcPipelineParameterBuffer *)cmdbuf->pipeline_param_p;
1171fc84bd8b6852aff0a3f70c4f21533ce36e1937behding	unsigned int i, j, filter_count, check_filter = 0;
11728e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAProcFilterParameterBufferBase *cur_param;
11738e9a21e730449c10cac6e6f69d255611c93f63c2hding	enum VssProcFilterType tmp;
11748e9a21e730449c10cac6e6f69d255611c93f63c2hding	psb_driver_data_p driver_data = ctx->obj_context->driver_data;
11758e9a21e730449c10cac6e6f69d255611c93f63c2hding
11768e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* init pipeline cmd */
11778e9a21e730449c10cac6e6f69d255611c93f63c2hding	for (i = 0; i < VssProcPipelineMaxNumFilters; ++i)
11788e9a21e730449c10cac6e6f69d255611c93f63c2hding		cell_pipeline_param->filter_pipeline[i] = -1;
11798e9a21e730449c10cac6e6f69d255611c93f63c2hding	cell_pipeline_param->num_filters = 0;
11808e9a21e730449c10cac6e6f69d255611c93f63c2hding
11818e9a21e730449c10cac6e6f69d255611c93f63c2hding	filter_count = 0;
11828e9a21e730449c10cac6e6f69d255611c93f63c2hding
11838e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* store filter buffer object */
11848e9a21e730449c10cac6e6f69d255611c93f63c2hding	if (ctx->num_filters != 0) {
11858e9a21e730449c10cac6e6f69d255611c93f63c2hding		for (i = 0; i < ctx->num_filters; ++i)
11868e9a21e730449c10cac6e6f69d255611c93f63c2hding			ctx->filter_buf[i] = BUFFER(ctx->filters[i]);
11878e9a21e730449c10cac6e6f69d255611c93f63c2hding	} else {
11888e9a21e730449c10cac6e6f69d255611c93f63c2hding		goto finished;
11898e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
11908e9a21e730449c10cac6e6f69d255611c93f63c2hding
11918e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* loop the filter, set correct pipeline param for FW */
11928e9a21e730449c10cac6e6f69d255611c93f63c2hding	for (i = 0; i < ctx->num_filters; ++i) {
11938e9a21e730449c10cac6e6f69d255611c93f63c2hding		cur_param = (VAProcFilterParameterBufferBase *)ctx->filter_buf[i]->buffer_data;
11948e9a21e730449c10cac6e6f69d255611c93f63c2hding		switch (cur_param->type) {
11958e9a21e730449c10cac6e6f69d255611c93f63c2hding		case VAProcFilterNone:
11968e9a21e730449c10cac6e6f69d255611c93f63c2hding			goto finished;
11978e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
11988e9a21e730449c10cac6e6f69d255611c93f63c2hding		case VAProcFilterNoiseReduction:
1199fc84bd8b6852aff0a3f70c4f21533ce36e1937behding		case VAProcFilterDeblocking:
12008e9a21e730449c10cac6e6f69d255611c93f63c2hding			cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterDenoise;
1201fc84bd8b6852aff0a3f70c4f21533ce36e1937behding			check_filter++;
12028e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
12038e9a21e730449c10cac6e6f69d255611c93f63c2hding		case VAProcFilterSharpening:
12048e9a21e730449c10cac6e6f69d255611c93f63c2hding			cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterSharpening;
12058e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
1206c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding		case VAProcFilterColorBalance:
12078e9a21e730449c10cac6e6f69d255611c93f63c2hding			cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterColorEnhancement;
12088e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
12098e9a21e730449c10cac6e6f69d255611c93f63c2hding		case VAProcFilterFrameRateConversion:
12108e9a21e730449c10cac6e6f69d255611c93f63c2hding			cell_pipeline_param->filter_pipeline[filter_count++] = VssProcFilterFrameRateConversion;
12118e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
12128e9a21e730449c10cac6e6f69d255611c93f63c2hding		default:
12138e9a21e730449c10cac6e6f69d255611c93f63c2hding			cell_pipeline_param->filter_pipeline[filter_count++] = -1;
12148e9a21e730449c10cac6e6f69d255611c93f63c2hding			vaStatus = VA_STATUS_ERROR_UNKNOWN;
12158e9a21e730449c10cac6e6f69d255611c93f63c2hding			goto out;
12168e9a21e730449c10cac6e6f69d255611c93f63c2hding		}
12178e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
12188e9a21e730449c10cac6e6f69d255611c93f63c2hding
1219fc84bd8b6852aff0a3f70c4f21533ce36e1937behding	/* Denoise and Deblock is alternative */
1220fc84bd8b6852aff0a3f70c4f21533ce36e1937behding	if (check_filter >= 2) {
1221fc84bd8b6852aff0a3f70c4f21533ce36e1937behding		drv_debug_msg(VIDEO_DEBUG_ERROR, "Denoise and Deblock is alternative!\n");
1222fc84bd8b6852aff0a3f70c4f21533ce36e1937behding		cell_pipeline_param->filter_pipeline[filter_count++] = -1;
1223fc84bd8b6852aff0a3f70c4f21533ce36e1937behding		vaStatus = VA_STATUS_ERROR_UNKNOWN;
1224fc84bd8b6852aff0a3f70c4f21533ce36e1937behding		goto out;
1225fc84bd8b6852aff0a3f70c4f21533ce36e1937behding	}
1226fc84bd8b6852aff0a3f70c4f21533ce36e1937behding
12278e9a21e730449c10cac6e6f69d255611c93f63c2hdingfinished:
12288e9a21e730449c10cac6e6f69d255611c93f63c2hding	cell_pipeline_param->num_filters = filter_count;
12298e9a21e730449c10cac6e6f69d255611c93f63c2hding
12308e9a21e730449c10cac6e6f69d255611c93f63c2hding	/* reorder */
12318e9a21e730449c10cac6e6f69d255611c93f63c2hding	for (i = 1; i < filter_count; ++i)
12328e9a21e730449c10cac6e6f69d255611c93f63c2hding		for (j = i; j > 0; --j)
12338e9a21e730449c10cac6e6f69d255611c93f63c2hding			if (cell_pipeline_param->filter_pipeline[j] < cell_pipeline_param->filter_pipeline[j - 1]) {
12348e9a21e730449c10cac6e6f69d255611c93f63c2hding				/* swap */
12358e9a21e730449c10cac6e6f69d255611c93f63c2hding				tmp = cell_pipeline_param->filter_pipeline[j];
12368e9a21e730449c10cac6e6f69d255611c93f63c2hding				cell_pipeline_param->filter_pipeline[j] = cell_pipeline_param->filter_pipeline[j - 1];
12378e9a21e730449c10cac6e6f69d255611c93f63c2hding				cell_pipeline_param->filter_pipeline[j - 1] = tmp;
12388e9a21e730449c10cac6e6f69d255611c93f63c2hding			}
12398e9a21e730449c10cac6e6f69d255611c93f63c2hding
12408e9a21e730449c10cac6e6f69d255611c93f63c2hding	vsp_cmdbuf_insert_command(cmdbuf, &cmdbuf->param_mem, VssProcPipelineParameterCommand,
12418e9a21e730449c10cac6e6f69d255611c93f63c2hding				  ctx->pipeline_param_offset, sizeof(struct VssProcPipelineParameterBuffer));
12428e9a21e730449c10cac6e6f69d255611c93f63c2hdingout:
12438e9a21e730449c10cac6e6f69d255611c93f63c2hding	return vaStatus;
12448e9a21e730449c10cac6e6f69d255611c93f63c2hding}
12458e9a21e730449c10cac6e6f69d255611c93f63c2hding
12468e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic VAStatus vsp_set_filter_param(context_VPP_p ctx)
12478e9a21e730449c10cac6e6f69d255611c93f63c2hding{
12488e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAStatus vaStatus = VA_STATUS_SUCCESS;
12498e9a21e730449c10cac6e6f69d255611c93f63c2hding	vsp_cmdbuf_p cmdbuf = ctx->obj_context->vsp_cmdbuf;
12508e9a21e730449c10cac6e6f69d255611c93f63c2hding	struct VssProcDenoiseParameterBuffer *cell_denoiser_param = (struct VssProcDenoiseParameterBuffer *)cmdbuf->denoise_param_p;
12518e9a21e730449c10cac6e6f69d255611c93f63c2hding	struct VssProcColorEnhancementParameterBuffer *cell_enhancer_param = (struct VssProcColorEnhancementParameterBuffer *)cmdbuf->enhancer_param_p;
12528e9a21e730449c10cac6e6f69d255611c93f63c2hding	struct VssProcSharpenParameterBuffer *cell_sharpen_param = (struct VssProcSharpenParameterBuffer *)cmdbuf->sharpen_param_p;
12538e9a21e730449c10cac6e6f69d255611c93f63c2hding	struct VssProcFrcParameterBuffer *cell_proc_frc_param = (struct VssProcFrcParameterBuffer *)cmdbuf->frc_param_p;
12548e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAProcFilterParameterBufferBase *cur_param = NULL;
12558e9a21e730449c10cac6e6f69d255611c93f63c2hding	VAProcFilterParameterBufferFrameRateConversion *frc_param = NULL;
12568e9a21e730449c10cac6e6f69d255611c93f63c2hding	unsigned int i;
12578e9a21e730449c10cac6e6f69d255611c93f63c2hding	float ratio;
12588e9a21e730449c10cac6e6f69d255611c93f63c2hding
12598e9a21e730449c10cac6e6f69d255611c93f63c2hding	for (i = 0; i < ctx->num_filters; ++i) {
12608e9a21e730449c10cac6e6f69d255611c93f63c2hding		cur_param = (VAProcFilterParameterBufferBase *)ctx->filter_buf[i]->buffer_data;
12618e9a21e730449c10cac6e6f69d255611c93f63c2hding		switch (cur_param->type) {
12628e9a21e730449c10cac6e6f69d255611c93f63c2hding		case VAProcFilterDeblocking:
126366304487373cf4ed335ba2614f00102dca837832Wang Kun			memcpy(cell_denoiser_param,
126466304487373cf4ed335ba2614f00102dca837832Wang Kun			       &ctx->denoise_deblock_param,
126566304487373cf4ed335ba2614f00102dca837832Wang Kun			       sizeof(ctx->denoise_deblock_param));
12668e9a21e730449c10cac6e6f69d255611c93f63c2hding			cell_denoiser_param->type = VssProcDeblock;
126766304487373cf4ed335ba2614f00102dca837832Wang Kun
126866304487373cf4ed335ba2614f00102dca837832Wang Kun			vsp_cmdbuf_insert_command(cmdbuf,
126966304487373cf4ed335ba2614f00102dca837832Wang Kun						  &cmdbuf->param_mem,
127066304487373cf4ed335ba2614f00102dca837832Wang Kun						  VssProcDenoiseParameterCommand,
127166304487373cf4ed335ba2614f00102dca837832Wang Kun						  ctx->denoise_param_offset,
127266304487373cf4ed335ba2614f00102dca837832Wang Kun						  sizeof(struct VssProcDenoiseParameterBuffer));
12738e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
12748e9a21e730449c10cac6e6f69d255611c93f63c2hding
12758e9a21e730449c10cac6e6f69d255611c93f63c2hding		case VAProcFilterNoiseReduction:
127666304487373cf4ed335ba2614f00102dca837832Wang Kun			memcpy(cell_denoiser_param,
127766304487373cf4ed335ba2614f00102dca837832Wang Kun			       &ctx->denoise_deblock_param,
127866304487373cf4ed335ba2614f00102dca837832Wang Kun			       sizeof(ctx->denoise_deblock_param));
12798e9a21e730449c10cac6e6f69d255611c93f63c2hding			cell_denoiser_param->type = VssProcDegrain;
128066304487373cf4ed335ba2614f00102dca837832Wang Kun
128166304487373cf4ed335ba2614f00102dca837832Wang Kun			vsp_cmdbuf_insert_command(cmdbuf,
128266304487373cf4ed335ba2614f00102dca837832Wang Kun						  &cmdbuf->param_mem,
128366304487373cf4ed335ba2614f00102dca837832Wang Kun						  VssProcDenoiseParameterCommand,
128466304487373cf4ed335ba2614f00102dca837832Wang Kun						  ctx->denoise_param_offset,
128566304487373cf4ed335ba2614f00102dca837832Wang Kun						  sizeof(struct VssProcDenoiseParameterBuffer));
12868e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
12878e9a21e730449c10cac6e6f69d255611c93f63c2hding
12888e9a21e730449c10cac6e6f69d255611c93f63c2hding		case VAProcFilterSharpening:
128966304487373cf4ed335ba2614f00102dca837832Wang Kun			memcpy(cell_sharpen_param,
129066304487373cf4ed335ba2614f00102dca837832Wang Kun			       &ctx->sharpen_param,
129166304487373cf4ed335ba2614f00102dca837832Wang Kun			       sizeof(ctx->sharpen_param));
129266304487373cf4ed335ba2614f00102dca837832Wang Kun
129366304487373cf4ed335ba2614f00102dca837832Wang Kun			vsp_cmdbuf_insert_command(cmdbuf,
129466304487373cf4ed335ba2614f00102dca837832Wang Kun						  &cmdbuf->param_mem,
129566304487373cf4ed335ba2614f00102dca837832Wang Kun						  VssProcSharpenParameterCommand,
129666304487373cf4ed335ba2614f00102dca837832Wang Kun						  ctx->sharpen_param_offset,
129766304487373cf4ed335ba2614f00102dca837832Wang Kun						  sizeof(struct VssProcSharpenParameterBuffer));
12988e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
12998e9a21e730449c10cac6e6f69d255611c93f63c2hding
1300c7434a3fdc05f13a1817b6f32f499c9c7fee0045hding		case VAProcFilterColorBalance:
130166304487373cf4ed335ba2614f00102dca837832Wang Kun			memcpy(cell_enhancer_param,
130266304487373cf4ed335ba2614f00102dca837832Wang Kun			       &ctx->enhancer_param,
130366304487373cf4ed335ba2614f00102dca837832Wang Kun			       sizeof(ctx->enhancer_param));
130466304487373cf4ed335ba2614f00102dca837832Wang Kun			vsp_cmdbuf_insert_command(cmdbuf,
130566304487373cf4ed335ba2614f00102dca837832Wang Kun						  &cmdbuf->param_mem,
130666304487373cf4ed335ba2614f00102dca837832Wang Kun						  VssProcColorEnhancementParameterCommand,
130766304487373cf4ed335ba2614f00102dca837832Wang Kun						  ctx->enhancer_param_offset,
130866304487373cf4ed335ba2614f00102dca837832Wang Kun						  sizeof(struct VssProcColorEnhancementParameterBuffer));
13098e9a21e730449c10cac6e6f69d255611c93f63c2hding
13108e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
13118e9a21e730449c10cac6e6f69d255611c93f63c2hding
13128e9a21e730449c10cac6e6f69d255611c93f63c2hding		case VAProcFilterFrameRateConversion:
13138e9a21e730449c10cac6e6f69d255611c93f63c2hding			ctx->frc_buf = ctx->filter_buf[i];
13148e9a21e730449c10cac6e6f69d255611c93f63c2hding
13158e9a21e730449c10cac6e6f69d255611c93f63c2hding			frc_param = (VAProcFilterParameterBufferFrameRateConversion *)ctx->filter_buf[i]->buffer_data;
13168e9a21e730449c10cac6e6f69d255611c93f63c2hding			ratio = frc_param->output_fps / (float)frc_param->input_fps;
13178e9a21e730449c10cac6e6f69d255611c93f63c2hding
13188e9a21e730449c10cac6e6f69d255611c93f63c2hding			/* fixed to use medium quality */
13198e9a21e730449c10cac6e6f69d255611c93f63c2hding			cell_proc_frc_param->quality = VssFrcMediumQuality;
13208e9a21e730449c10cac6e6f69d255611c93f63c2hding			/* cell_proc_frc_param->quality = VssFrcHighQuality; */
13218e9a21e730449c10cac6e6f69d255611c93f63c2hding
132266304487373cf4ed335ba2614f00102dca837832Wang Kun			/* check if the input fps is in the range of HW capability */
13238e9a21e730449c10cac6e6f69d255611c93f63c2hding			if (ratio == 2)
13248e9a21e730449c10cac6e6f69d255611c93f63c2hding				cell_proc_frc_param->conversion_rate = VssFrc2xConversionRate;
13258e9a21e730449c10cac6e6f69d255611c93f63c2hding			else if (ratio == 2.5)
13268e9a21e730449c10cac6e6f69d255611c93f63c2hding				cell_proc_frc_param->conversion_rate = VssFrc2_5xConversionRate;
13278e9a21e730449c10cac6e6f69d255611c93f63c2hding			else if (ratio == 4)
13288e9a21e730449c10cac6e6f69d255611c93f63c2hding				cell_proc_frc_param->conversion_rate = VssFrc4xConversionRate;
13298e9a21e730449c10cac6e6f69d255611c93f63c2hding			else {
13308e9a21e730449c10cac6e6f69d255611c93f63c2hding				drv_debug_msg(VIDEO_DEBUG_ERROR, "invalid frame rate conversion ratio %f \n", ratio);
13318e9a21e730449c10cac6e6f69d255611c93f63c2hding				vaStatus = VA_STATUS_ERROR_UNKNOWN;
13328e9a21e730449c10cac6e6f69d255611c93f63c2hding				goto out;
13338e9a21e730449c10cac6e6f69d255611c93f63c2hding			}
13348e9a21e730449c10cac6e6f69d255611c93f63c2hding
133566304487373cf4ed335ba2614f00102dca837832Wang Kun			vsp_cmdbuf_insert_command(cmdbuf,
133666304487373cf4ed335ba2614f00102dca837832Wang Kun						  &cmdbuf->param_mem,
133766304487373cf4ed335ba2614f00102dca837832Wang Kun						  VssProcFrcParameterCommand,
133866304487373cf4ed335ba2614f00102dca837832Wang Kun						  ctx->frc_param_offset,
133966304487373cf4ed335ba2614f00102dca837832Wang Kun						  sizeof(struct VssProcFrcParameterBuffer));
13408e9a21e730449c10cac6e6f69d255611c93f63c2hding			break;
13418e9a21e730449c10cac6e6f69d255611c93f63c2hding		default:
13428e9a21e730449c10cac6e6f69d255611c93f63c2hding			vaStatus = VA_STATUS_ERROR_UNKNOWN;
13438e9a21e730449c10cac6e6f69d255611c93f63c2hding			goto out;
13448e9a21e730449c10cac6e6f69d255611c93f63c2hding		}
13458e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
13468e9a21e730449c10cac6e6f69d255611c93f63c2hdingout:
13478e9a21e730449c10cac6e6f69d255611c93f63c2hding	return vaStatus;
13488e9a21e730449c10cac6e6f69d255611c93f63c2hding}
134966304487373cf4ed335ba2614f00102dca837832Wang Kun
135066304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_resolution(int width, int height)
135166304487373cf4ed335ba2614f00102dca837832Wang Kun{
135266304487373cf4ed335ba2614f00102dca837832Wang Kun	int ret;
135366304487373cf4ed335ba2614f00102dca837832Wang Kun	int image_area;
135466304487373cf4ed335ba2614f00102dca837832Wang Kun
135566304487373cf4ed335ba2614f00102dca837832Wang Kun	if (height < 96 || height > 1080)
135666304487373cf4ed335ba2614f00102dca837832Wang Kun		return NOT_SUPPORTED_RESOLUTION;
135766304487373cf4ed335ba2614f00102dca837832Wang Kun
135866304487373cf4ed335ba2614f00102dca837832Wang Kun	image_area = height * width;
135966304487373cf4ed335ba2614f00102dca837832Wang Kun
136066304487373cf4ed335ba2614f00102dca837832Wang Kun	if (image_area <= QVGA_AREA)
136166304487373cf4ed335ba2614f00102dca837832Wang Kun		ret = QCIF_TO_QVGA;
136266304487373cf4ed335ba2614f00102dca837832Wang Kun	else if (image_area <= VGA_AREA)
136366304487373cf4ed335ba2614f00102dca837832Wang Kun		ret = QVGA_TO_VGA;
136466304487373cf4ed335ba2614f00102dca837832Wang Kun	else if (image_area <= SD_AREA)
136566304487373cf4ed335ba2614f00102dca837832Wang Kun		ret = VGA_TO_SD;
136666304487373cf4ed335ba2614f00102dca837832Wang Kun	else if (image_area <= HD720P_AREA)
136766304487373cf4ed335ba2614f00102dca837832Wang Kun		ret = SD_TO_720P;
136866304487373cf4ed335ba2614f00102dca837832Wang Kun	else if (image_area <= HD1080P_AREA)
136966304487373cf4ed335ba2614f00102dca837832Wang Kun		ret = HD720P_TO_1080P;
137066304487373cf4ed335ba2614f00102dca837832Wang Kun	else
137166304487373cf4ed335ba2614f00102dca837832Wang Kun		ret = NOT_SUPPORTED_RESOLUTION;
137266304487373cf4ed335ba2614f00102dca837832Wang Kun
137366304487373cf4ed335ba2614f00102dca837832Wang Kun	return ret;
137466304487373cf4ed335ba2614f00102dca837832Wang Kun}
137566304487373cf4ed335ba2614f00102dca837832Wang Kun
137666304487373cf4ed335ba2614f00102dca837832Wang Kun/*
137766304487373cf4ed335ba2614f00102dca837832Wang Kun * The strength area is:
137866304487373cf4ed335ba2614f00102dca837832Wang Kun *
137966304487373cf4ed335ba2614f00102dca837832Wang Kun * 0______33______66______100
138066304487373cf4ed335ba2614f00102dca837832Wang Kun *   LOW     MED     HIGH
138166304487373cf4ed335ba2614f00102dca837832Wang Kun *
138266304487373cf4ed335ba2614f00102dca837832Wang Kun * MIN=0; MAX=100; STEP=33
138366304487373cf4ed335ba2614f00102dca837832Wang Kun */
138466304487373cf4ed335ba2614f00102dca837832Wang Kunstatic int check_vpp_strength(int value)
138566304487373cf4ed335ba2614f00102dca837832Wang Kun{
138666304487373cf4ed335ba2614f00102dca837832Wang Kun	if (value < MIN_VPP_PARAM || value > MAX_VPP_PARAM)
138766304487373cf4ed335ba2614f00102dca837832Wang Kun		return INVALID_STRENGTH;
138866304487373cf4ed335ba2614f00102dca837832Wang Kun
138966304487373cf4ed335ba2614f00102dca837832Wang Kun	if (value >= MIN_VPP_PARAM &&
139066304487373cf4ed335ba2614f00102dca837832Wang Kun	    value < MIN_VPP_PARAM + STEP_VPP_PARAM)
139166304487373cf4ed335ba2614f00102dca837832Wang Kun		return LOW_STRENGTH;
139266304487373cf4ed335ba2614f00102dca837832Wang Kun	else if (value >= MIN_VPP_PARAM + STEP_VPP_PARAM &&
139366304487373cf4ed335ba2614f00102dca837832Wang Kun		 value < MIN_VPP_PARAM + 2 * STEP_VPP_PARAM)
139466304487373cf4ed335ba2614f00102dca837832Wang Kun		return MEDIUM_STRENGTH;
139566304487373cf4ed335ba2614f00102dca837832Wang Kun	else
139666304487373cf4ed335ba2614f00102dca837832Wang Kun		return HIGH_STRENGTH;
139766304487373cf4ed335ba2614f00102dca837832Wang Kun}
1398