1437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK
4437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *
5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a
6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the
7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including
8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish,
9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to
10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to
11f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions:
123f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang *
13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the
14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions
15f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software.
163f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang *
17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *
25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors:
26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Elaine Wang <elaine.wang@intel.com>
27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *
28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
31437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdlib.h>
32437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdint.h>
33437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <string.h>
34437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
35437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_def.h"
36c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h"
37437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_surface.h"
38437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_cmdbuf.h"
39437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_jpeg.h"
40437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_hostcode.h"
41437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_hostheader.h"
42437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_hostjpeg.h"
43437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
44bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define INIT_CONTEXT_JPEG       context_ENC_p ctx = (context_ENC_p) obj_context->format_data
45437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define SURFACE(id)    ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id ))
46437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define BUFFER(id)  ((object_buffer_p) object_heap_lookup( &ctx->obj_context->driver_data->buffer_heap, id ))
47437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
48203fb45de1ddd2df6cbb12102adba4e2e77b727eSUN,Jing/*
49203fb45de1ddd2df6cbb12102adba4e2e77b727eSUN,Jing  Balancing the workloads of executing MTX_CMDID_ISSUEBUFF commands to 2-cores:
50203fb45de1ddd2df6cbb12102adba4e2e77b727eSUN,Jing  1 commands: 0 (0b/0x0)
51203fb45de1ddd2df6cbb12102adba4e2e77b727eSUN,Jing  2 commands: 1-0 (01b/0x1)
52203fb45de1ddd2df6cbb12102adba4e2e77b727eSUN,Jing  3 commands: 1-0-0 (001b/0x1)
53203fb45de1ddd2df6cbb12102adba4e2e77b727eSUN,Jing  4 commands: 1-0-1-0 (0101b/0x5)
54203fb45de1ddd2df6cbb12102adba4e2e77b727eSUN,Jing  5 commands: 1-0-1-0-0 (00101b/0x5)
55203fb45de1ddd2df6cbb12102adba4e2e77b727eSUN,Jing  6 commands: 1-0-1-0-1-0 (010101b/0x15)
56203fb45de1ddd2df6cbb12102adba4e2e77b727eSUN,Jing  7 commands: 1-0-1-0-1-0-0 (0010101b/0x15)
57203fb45de1ddd2df6cbb12102adba4e2e77b727eSUN,Jing*/
58203fb45de1ddd2df6cbb12102adba4e2e77b727eSUN,Jingstatic const uint32_t aui32_jpg_mtx_num[PNW_JPEG_MAX_SCAN_NUM] = {0x0, 0x1, 0x1, 0x5, 0x5, 0x15, 0x15};
59437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
60437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void pnw_jpeg_QueryConfigAttributes(
61cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    VAProfile __maybe_unused profile,
62cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    VAEntrypoint __maybe_unused entrypoint,
63437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAConfigAttrib *attrib_list,
64dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int num_attribs)
65437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
66437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
67437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
68c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_jpeg_QueryConfigAttributes\n");
69437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
70437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* RateControl attributes */
71437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    for (i = 0; i < num_attribs; i++) {
72437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        switch (attrib_list[i].type) {
73437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAConfigAttribRTFormat:
74578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing            /* Already handled in psb_GetConfigAttributes */
75578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing            break;
76578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing        case VAConfigAttribEncJPEG:
77578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing            /* The below JPEG ENC capabilities are fixed by TopazSC and not changable. */
78578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing            {
79578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing                VAConfigAttribValEncJPEG* ptr = (VAConfigAttribValEncJPEG *)&(attrib_list[i].value);
80578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing                (ptr->bits).arithmatic_coding_mode = 0; /* Unsupported */
81578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing                (ptr->bits).progressive_dct_mode = 0; /* Unsupported */
82578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing                (ptr->bits).non_interleaved_mode = 1; /* Supported */
83578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing                (ptr->bits).differential_mode = 0; /* Unsupported */
84578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing                (ptr->bits).max_num_components = PNW_JPEG_COMPONENTS_NUM; /* Only 3 is supported */
85578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing                (ptr->bits).max_num_scans = PNW_JPEG_MAX_SCAN_NUM;
86578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing                (ptr->bits).max_num_huffman_tables = 4; /* Only 4 is supported */
87578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing                (ptr->bits).max_num_huffman_tables = 2; /* Only 2 is supported */
88578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing            }
89578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing            break;
90578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing        case VAConfigAttribMaxPictureWidth:
91578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing        case VAConfigAttribMaxPictureHeight:
92578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing            /* No pure limitation on an image's width or height seperately,
93578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing               as long as the image's MCUs need less than max_num_scans rounds of encoding
94578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing               and a surface of that source size is allocatable. */
95578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing            attrib_list[i].value = 0; /* No pure limitation */
96437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
97437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        default:
98437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
99437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
100437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
101437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
102dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
103437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return;
104437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
105437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
106437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
107437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_jpeg_ValidateConfig(
108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_config_p obj_config)
109437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
110242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    int i;
111242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    /* Check all attributes */
112242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    for (i = 0; i < obj_config->attrib_count; i++) {
1133f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        switch (obj_config->attrib_list[i].type) {
1143f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        case VAConfigAttribRTFormat:
1153f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            /* Ignore */
1163f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            break;
1173f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        case VAConfigAttribRateControl:
1183f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            break;
1193f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        default:
1203f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang            return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
1213f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        }
1223f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    }
123437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
124242b3ae871185c4759e8c4276cf8f2f8c1a48357Kun Wang    return VA_STATUS_SUCCESS;
125437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
126437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
127437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
128437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*Init JPEG context. Ported from IMG_JPEG_EncoderInitialise*/
129437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_jpeg_CreateContext(
130437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context,
131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_config_p obj_config)
132437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
133437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
134437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    context_ENC_p ctx;
135437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    TOPAZSC_JPEG_ENCODER_CONTEXT *jpeg_ctx_p;
1362f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    int i;
137437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
138c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_jpeg_CreateContext\n");
139437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
140437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    vaStatus = pnw_CreateContext(obj_context, obj_config, 1);
141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS != vaStatus)
142437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
143437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
144437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx = (context_ENC_p) obj_context->format_data;
145437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ctx->eCodec = IMG_CODEC_JPEG;
147437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1482f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    for (i = 0; i < obj_config->attrib_count; i++) {
1492f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        if (VAConfigAttribRTFormat ==  obj_config->attrib_list[i].type) {
150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            switch (obj_config->attrib_list[i].value) {
151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            case VA_RT_FORMAT_YUV420:
1523c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                if (obj_context->render_targets != NULL) {
1533c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                    object_surface_p surface_p = SURFACE(obj_context->render_targets[0]);
1543c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                    if (NULL == surface_p) {
1553c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                        ctx->eFormat = IMG_CODEC_PL12;
1563c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                        drv_debug_msg(VIDEO_DEBUG_ERROR, "JPEG encoding: Unsupported format and set to NV12\n");
1573c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                        break;
1583c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                    }
1593c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix
1603c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                    if ((surface_p->psb_surface)->extra_info[4] == VA_FOURCC_NV12) {
1613c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                        ctx->eFormat = IMG_CODEC_PL12;
1623c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                        drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG encoding: Choose NV12 format\n");
1633c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                    }
1643c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                    else if ((surface_p->psb_surface)->extra_info[4] == VA_FOURCC_IYUV) {
1653c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                        ctx->eFormat = IMG_CODEC_IYUV;
1663c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                        drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG encoding: Choose IYUV format\n");
1673c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                    }
1683c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                    else {
1693c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                        ctx->eFormat = IMG_CODEC_PL12;
1703c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                        drv_debug_msg(VIDEO_DEBUG_ERROR, "JPEG encoding: Unsupported format and set to NV12\n");
1713c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                    }
1723c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                }
1733c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                else {
1743c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                    ctx->eFormat = IMG_CODEC_PL12;
1753c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                    drv_debug_msg(VIDEO_DEBUG_ERROR, "JPEG encoding: Unsupported format and set to NV12\n");
1763c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                }
177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            case VA_RT_FORMAT_YUV422:
179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->eFormat = IMG_CODEC_YV16;
1803c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG encoding: Choose YUV422 format\n");
181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            default:
183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->eFormat = IMG_CODEC_PL12;
1843c3026ce2dadc43cf23137ca55a2461af4e27b7fpingshix                drv_debug_msg(VIDEO_DEBUG_ERROR, "JPEG encoding: Unsupported format and set to NV12\n");
185dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
186dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
1882f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang        }
1892f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    }
190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
191437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->Slices = 2;
192437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->ParallelCores = 2;
193437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->NumCores = 2;
194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ctx->jpeg_ctx = (TOPAZSC_JPEG_ENCODER_CONTEXT *)calloc(1, sizeof(TOPAZSC_JPEG_ENCODER_CONTEXT));
1956d37ae34fcae80f2e898b61e2506ed8e887bd16anguo    CHECK_ALLOCATION(ctx->jpeg_ctx);
196437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
197437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    jpeg_ctx_p = ctx->jpeg_ctx;
198437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    jpeg_ctx_p->eFormat = ctx->eFormat;
199437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
2002f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    /*Chroma sampling step x_step X y_step*/
2012f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang    jpeg_ctx_p->ui8ScanNum = JPEG_SCANNING_COUNT(ctx->Width, ctx->Height, ctx->NumCores, jpeg_ctx_p->eFormat);
2022befccec034c13d34746a9e87149889d59ac767bFei Jiang
203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (jpeg_ctx_p->ui8ScanNum < 2 || jpeg_ctx_p->ui8ScanNum > PNW_JPEG_MAX_SCAN_NUM) {
204c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "JPEG MCU scanning number(%d) is wrong!\n", jpeg_ctx_p->ui8ScanNum);
205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        free(ctx->jpeg_ctx);
206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->jpeg_ctx = NULL;
207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
2082befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
2092befccec034c13d34746a9e87149889d59ac767bFei Jiang
2102befccec034c13d34746a9e87149889d59ac767bFei Jiang    jpeg_ctx_p->sScan_Encode_Info.ui8NumberOfCodedBuffers = jpeg_ctx_p->ui8ScanNum;
211dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
212c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, " JPEG Scanning Number %d\n", jpeg_ctx_p->ui8ScanNum);
213dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    jpeg_ctx_p->sScan_Encode_Info.aBufferTable =
214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (TOPAZSC_JPEG_BUFFER_INFO *)calloc(1, sizeof(TOPAZSC_JPEG_BUFFER_INFO)
215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                           * jpeg_ctx_p->sScan_Encode_Info.ui8NumberOfCodedBuffers);
216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
217437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (NULL == jpeg_ctx_p->sScan_Encode_Info.aBufferTable)
218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_ALLOCATION_FAILED;
2194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2202befccec034c13d34746a9e87149889d59ac767bFei Jiang    /*It will be figured out when known the size of whole coded buffer.*/
2212befccec034c13d34746a9e87149889d59ac767bFei Jiang    jpeg_ctx_p->ui32SizePerCodedBuffer = 0;
222437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
223e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    jpeg_ctx_p->ctx = (unsigned char *)ctx;
224437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /*Reuse header_mem(76*4 bytes) and pic_params_size(256 bytes)
225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     *  as pMemInfoMTXSetup(JPEG_MTX_DMA_SETUP 24x4 bytes) and
226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     *  pMemInfoTableBlock JPEG_MTX_QUANT_TABLE(128byes)*/
227437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
228437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
229437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
230437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
231437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void pnw_jpeg_DestroyContext(
232437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context)
233437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
234437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    context_ENC_p ctx;
235437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
236c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_jpeg_DestroyPicture\n");
237437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
238437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx = (context_ENC_p)(obj_context->format_data);
239437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
240dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->jpeg_ctx) {
241dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->jpeg_ctx->sScan_Encode_Info.aBufferTable) {
242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            free(ctx->jpeg_ctx->sScan_Encode_Info.aBufferTable);
243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->jpeg_ctx->sScan_Encode_Info.aBufferTable = NULL;
244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
245437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
246dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        free(ctx->jpeg_ctx);
247437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
248437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_DestroyContext(obj_context);
249437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
250437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
251437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
252437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_jpeg_BeginPicture(
253437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context)
254437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
255437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_CONTEXT_JPEG;
256437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
257437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int ret;
258437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_cmdbuf_p cmdbuf;
259437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
260c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_jpeg_BeginPicture: Frame %d\n", ctx->obj_context->frame_count);
261437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
262437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->src_surface = ctx->obj_context->current_render_target;
263437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
264437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Initialise the command buffer */
265437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ret = pnw_context_get_next_cmdbuf(ctx->obj_context);
266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
267c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "get next cmdbuf fail\n");
268437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_UNKNOWN;
269437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
270437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
271437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf = ctx->obj_context->pnw_cmdbuf;
272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
273437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* map start_pic param */
274437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    vaStatus = psb_buffer_map(&cmdbuf->pic_params, &cmdbuf->pic_params_p);
275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus) {
276437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
277437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
278437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    vaStatus = psb_buffer_map(&cmdbuf->header_mem, &cmdbuf->header_mem_p);
279437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (vaStatus) {
280437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb_buffer_unmap(&cmdbuf->pic_params);
281437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
282437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
2834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    memset(ctx->jpeg_ctx->sScan_Encode_Info.aBufferTable, 0,
285dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun           sizeof(TOPAZSC_JPEG_BUFFER_INFO) * ctx->jpeg_ctx->sScan_Encode_Info.ui8NumberOfCodedBuffers);
286437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
287437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /*Store the QMatrix data*/
288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ctx->jpeg_ctx->pMemInfoTableBlock = cmdbuf->pic_params_p;
289437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->jpeg_ctx->psTablesBlock = (JPEG_MTX_QUANT_TABLE *)ctx->jpeg_ctx->pMemInfoTableBlock;
290437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
291437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /*Store MTX_SETUP data*/
292437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->jpeg_ctx->pMemInfoMTXSetup = cmdbuf->header_mem_p;
293437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->jpeg_ctx->pMTXSetup = (JPEG_MTX_DMA_SETUP*)ctx->jpeg_ctx->pMemInfoMTXSetup;
294437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ctx->jpeg_ctx->pMTXSetup->ui32ComponentsInScan = PNW_JPEG_COMPONENTS_NUM;
296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->obj_context->frame_count == 0) { /* first picture */
298437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_driver_data_p driver_data = ctx->obj_context->driver_data;
300437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
301437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        *cmdbuf->cmd_idx++ = ((MTX_CMDID_SW_NEW_CODEC & MTX_CMDWORD_ID_MASK) << MTX_CMDWORD_ID_SHIFT) |
302437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                             (((driver_data->drm_context & MTX_CMDWORD_COUNT_MASK) << MTX_CMDWORD_COUNT_SHIFT));
303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pnw_cmdbuf_insert_command_param(ctx->eCodec);
304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pnw_cmdbuf_insert_command_param((ctx->Width << 16) | ctx->Height);
305437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
306437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
307437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_jpeg_set_default_qmatix(ctx->jpeg_ctx->pMemInfoTableBlock);
308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
309437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
310437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
311437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
312437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw__jpeg_process_picture_param(context_ENC_p ctx, object_buffer_p obj_buffer)
313437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
314437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
315437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAEncPictureParameterBufferJPEG *pBuffer;
316437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_cmdbuf_p cmdbuf = ctx->obj_context->pnw_cmdbuf;
317437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    BUFFER_HEADER *pBufHeader;
318437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    //unsigned long *pPictureHeaderMem;
319437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    //MTX_HEADER_PARAMS *psPicHeader;
320437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
321437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    TOPAZSC_JPEG_ENCODER_CONTEXT *jpeg_ctx = ctx->jpeg_ctx;
322578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing    JPEG_MTX_QUANT_TABLE* pQMatrix = (JPEG_MTX_QUANT_TABLE *)
323578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing                                     (ctx->jpeg_ctx->pMemInfoTableBlock);
324437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    IMG_ERRORCODE rc;
325437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
326437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->type == VAEncPictureParameterBufferType);
327437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
328dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((obj_buffer->num_elements != 1) ||
329bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (obj_buffer->size != sizeof(VAEncPictureParameterBufferJPEG))) {
330437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return VA_STATUS_ERROR_UNKNOWN;
331437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
332437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
333437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Transfer ownership of VAEncPictureParameterBufferMPEG4 data */
334437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pBuffer = (VAEncPictureParameterBufferJPEG *) obj_buffer->buffer_data;
335437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_buffer->buffer_data = NULL;
336437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_buffer->size = 0;
337437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
338578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing    /* Parameters checking */
339578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing    if (((pBuffer->pic_flags).bits.profile != 0) || /* Only "0 - Baseline" is supported */
340578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing       ((pBuffer->pic_flags).bits.progressive != 0) || /* Only "0 - sequential" is supported */
341578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing       ((pBuffer->pic_flags).bits.huffman != 1) || /* Only "1 - huffman" is supported */
342578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing       ((pBuffer->pic_flags).bits.interleaved != 0) || /* Only "0 - non interleaved" is supported */
343578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing       ((pBuffer->pic_flags).bits.differential != 0)) /* Only "0 - non differential" is supported */
344578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing        return VA_STATUS_ERROR_INVALID_PARAMETER;
345578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing
346578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing    if ((pBuffer->sample_bit_depth != 8) || /* Only 8-bits sample depth is supported */
347578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing       (pBuffer->num_components != PNW_JPEG_COMPONENTS_NUM) || /* Only 3 components setting is supported */
348578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing       (pBuffer->quality > 100))
349578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing        return VA_STATUS_ERROR_INVALID_PARAMETER;
350578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing
351578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing    /* Set quality */
352578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing    if (pBuffer->quality != 0) { /* Quality value is set */
353578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing        customize_quantization_tables(pQMatrix->aui8LumaQuantParams,
354578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing                                      pQMatrix->aui8ChromaQuantParams,
355578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing                                      pBuffer->quality);
356578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing    }
357578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing
358578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing    /* Get the width and height of encode destination */
359b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding    jpeg_ctx->ui32OutputWidth = (unsigned short)(~0x1 & (pBuffer->picture_width + 0x1));
360b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding    jpeg_ctx->ui32OutputHeight = (unsigned short)(~0x1 & (pBuffer->picture_height + 0x1));
361437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
362b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding    ASSERT(ctx->Width >= jpeg_ctx->ui32OutputWidth);
363b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding    ASSERT(ctx->Height >= jpeg_ctx->ui32OutputHeight);
364b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding
365b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding    /*Overwrite the scan info if destination's sizes are different from source's */
366b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding    if ((ctx->Width!=jpeg_ctx->ui32OutputWidth) || (ctx->Height!=jpeg_ctx->ui32OutputHeight)) {
367b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Overwriting the scan info...\n");
368b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding
369b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding        jpeg_ctx->ui8ScanNum = JPEG_SCANNING_COUNT(jpeg_ctx->ui32OutputWidth, jpeg_ctx->ui32OutputHeight, ctx->NumCores, jpeg_ctx->eFormat);
370b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding
371b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding        if (jpeg_ctx->ui8ScanNum < 2 || jpeg_ctx->ui8ScanNum > PNW_JPEG_MAX_SCAN_NUM) {
372b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding            drv_debug_msg(VIDEO_DEBUG_ERROR, "JPEG MCU scanning number(%d) is wrong!\n", jpeg_ctx->ui8ScanNum);
373b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding            free(ctx->jpeg_ctx);
374b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding            ctx->jpeg_ctx = NULL;
375b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding            return VA_STATUS_ERROR_UNKNOWN;
376b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding    	}
377437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
378b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding        drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG Scanning Number %d\n", jpeg_ctx->ui8ScanNum);
379b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding        jpeg_ctx->sScan_Encode_Info.ui8NumberOfCodedBuffers = jpeg_ctx->ui8ScanNum;
380b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding    }
381b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding
382b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding    ctx->coded_buf = BUFFER(pBuffer->coded_buf);
383437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    free(pBuffer);
384437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == ctx->coded_buf) {
386c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "%s L%d Invalid coded buffer handle\n", __FUNCTION__, __LINE__);
387dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_INVALID_BUFFER;
388437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
389437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
390c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Set Quant Tables\n");
391437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /*Set Quant Tables*/
392437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    for (i = ctx->NumCores - 1; i >= 0; i--)
393dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pnw_cmdbuf_insert_command_package(ctx->obj_context,
394dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                          i,
395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                          MTX_CMDID_SETQUANT,
396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                          &cmdbuf->pic_params,
397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                          0);
398dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
399c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Quant Table \n");
400dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
401c79caccb602f74ef23c5b82d194bf005a7009551SUN,Jing    for (i=0; i<128; i+=8) {
402c79caccb602f74ef23c5b82d194bf005a7009551SUN,Jing        if (0 == i) {
403c79caccb602f74ef23c5b82d194bf005a7009551SUN,Jing            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Table 0:\n");
404c79caccb602f74ef23c5b82d194bf005a7009551SUN,Jing        }
405c79caccb602f74ef23c5b82d194bf005a7009551SUN,Jing        else if (64 == i) {
406c79caccb602f74ef23c5b82d194bf005a7009551SUN,Jing            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Table 1:\n");
407c79caccb602f74ef23c5b82d194bf005a7009551SUN,Jing        }
408c79caccb602f74ef23c5b82d194bf005a7009551SUN,Jing        drv_debug_msg(VIDEO_DEBUG_GENERAL, "%d %d %d %d %d %d %d %d\n",
409c79caccb602f74ef23c5b82d194bf005a7009551SUN,Jing                      *((unsigned char *)cmdbuf->pic_params_p+i),
410c79caccb602f74ef23c5b82d194bf005a7009551SUN,Jing                      *((unsigned char *)cmdbuf->pic_params_p+i+1),
411c79caccb602f74ef23c5b82d194bf005a7009551SUN,Jing                      *((unsigned char *)cmdbuf->pic_params_p+i+2),
412c79caccb602f74ef23c5b82d194bf005a7009551SUN,Jing                      *((unsigned char *)cmdbuf->pic_params_p+i+3),
413c79caccb602f74ef23c5b82d194bf005a7009551SUN,Jing                      *((unsigned char *)cmdbuf->pic_params_p+i+4),
414c79caccb602f74ef23c5b82d194bf005a7009551SUN,Jing                      *((unsigned char *)cmdbuf->pic_params_p+i+5),
415c79caccb602f74ef23c5b82d194bf005a7009551SUN,Jing                      *((unsigned char *)cmdbuf->pic_params_p+i+6),
416c79caccb602f74ef23c5b82d194bf005a7009551SUN,Jing                      *((unsigned char *)cmdbuf->pic_params_p+i+7));
4172befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
4182befccec034c13d34746a9e87149889d59ac767bFei Jiang
419dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    jpeg_ctx->ui32SizePerCodedBuffer =
420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        JPEG_CODED_BUF_SEGMENT_SIZE(ctx->coded_buf->size,
421b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding                                    jpeg_ctx->ui32OutputWidth, jpeg_ctx->ui32OutputHeight,
422b0bdca543d797b3c3ce9565299f4bf33bca8fd30hding                                    ctx->NumCores, jpeg_ctx->eFormat);
423c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Coded buffer total size is %d,"
424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             "coded segment size per scan is %d\n",
425dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             ctx->coded_buf->size, jpeg_ctx->ui32SizePerCodedBuffer);
426437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
427e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    vaStatus = psb_buffer_map(ctx->coded_buf->psb_buffer, (unsigned char **)&jpeg_ctx->jpeg_coded_buf.pMemInfo);
428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus) {
429c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "ERROR: Map coded_buf failed!");
430437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
431437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
432437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    jpeg_ctx->jpeg_coded_buf.ui32Size = ctx->coded_buf->size;
433437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    jpeg_ctx->jpeg_coded_buf.sLock = BUFFER_FREE;
434437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    jpeg_ctx->jpeg_coded_buf.ui32BytesWritten = 0;
435437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
436c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Setup JPEG Tables\n");
437dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    rc = SetupJPEGTables(ctx->jpeg_ctx, &jpeg_ctx->jpeg_coded_buf,  ctx->src_surface);
438437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (rc != IMG_ERR_OK)
440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
441437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
442c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Write JPEG Headers to coded buf\n");
443437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
444437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pBufHeader = (BUFFER_HEADER *)jpeg_ctx->jpeg_coded_buf.pMemInfo;
445437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pBufHeader->ui32BytesUsed = 0; /* Not include BUFFER_HEADER*/
446dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    rc = PrepareHeader(jpeg_ctx, &jpeg_ctx->jpeg_coded_buf, sizeof(BUFFER_HEADER), IMG_TRUE);
447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (rc != IMG_ERR_OK)
448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
449437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
450437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pBufHeader->ui32Reserved3 = PNW_JPEG_HEADER_MAX_SIZE;//Next coded buffer offset
451437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pBufHeader->ui32BytesUsed = jpeg_ctx->jpeg_coded_buf.ui32BytesWritten - sizeof(BUFFER_HEADER);
452437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
453c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG Buffer Header size: %d, File Header size :%d, next codef buffer offset: %d\n",
454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             sizeof(BUFFER_HEADER), pBufHeader->ui32BytesUsed, pBufHeader->ui32Reserved3);
455437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
456437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
457437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
458437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw__jpeg_process_qmatrix_param(context_ENC_p ctx, object_buffer_p obj_buffer)
459437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
460437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
461437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAQMatrixBufferJPEG *pBuffer;
462437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    JPEG_MTX_QUANT_TABLE* pQMatrix = (JPEG_MTX_QUANT_TABLE *)
463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     (ctx->jpeg_ctx->pMemInfoTableBlock);
464bd16679767c401f15c980db157057d9458db8f06Elaine Wang    int i;
465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
466437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->type == VAQMatrixBufferType);
467437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pBuffer = (VAQMatrixBufferJPEG *) obj_buffer->buffer_data;
469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
470bd16679767c401f15c980db157057d9458db8f06Elaine Wang    /* Zero value isn't allowed. It will cause JPEG firmware time out */
471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (0 != pBuffer->load_lum_quantiser_matrix) {
4724985c4c7c4894dc1feb6b8d678e2f9b9d2f05543SUN,Jing        for (i=0; i<QUANT_TABLE_SIZE_BYTES; ++i)
473bd16679767c401f15c980db157057d9458db8f06Elaine Wang            if (pBuffer->lum_quantiser_matrix[i] != 0)
474bd16679767c401f15c980db157057d9458db8f06Elaine Wang                pQMatrix->aui8LumaQuantParams[i] =
475bd16679767c401f15c980db157057d9458db8f06Elaine Wang                    pBuffer->lum_quantiser_matrix[i];
476437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
477437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
478dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (0 != pBuffer->load_chroma_quantiser_matrix) {
4794985c4c7c4894dc1feb6b8d678e2f9b9d2f05543SUN,Jing        for (i=0; i<QUANT_TABLE_SIZE_BYTES; ++i)
480bd16679767c401f15c980db157057d9458db8f06Elaine Wang            if (pBuffer->chroma_quantiser_matrix[i] != 0)
481bd16679767c401f15c980db157057d9458db8f06Elaine Wang                pQMatrix->aui8ChromaQuantParams[i] =
482bd16679767c401f15c980db157057d9458db8f06Elaine Wang                    pBuffer->chroma_quantiser_matrix[i];
483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
484437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
485437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    free(obj_buffer->buffer_data);
486437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_buffer->buffer_data = NULL;
487dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
488437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
489437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
490437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
491437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
492437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_jpeg_RenderPicture(
493437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context,
494437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_buffer_p *buffers,
495437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int num_buffers)
496437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
497437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_CONTEXT_JPEG;
498437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
499437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
500dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
501c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_jpeg_RenderPicture\n");
502437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < num_buffers; i++) {
504dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        object_buffer_p obj_buffer = buffers[i];
505dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
506dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        switch (obj_buffer->type) {
507dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAQMatrixBufferType:
5084985c4c7c4894dc1feb6b8d678e2f9b9d2f05543SUN,Jing            drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_jpeg_RenderPicture got VAQMatrixBufferType\n");
509dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = pnw__jpeg_process_qmatrix_param(ctx, obj_buffer);
510dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
511dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
512dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAEncPictureParameterBufferType:
513c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_jpeg_RenderPicture got VAEncPictureParameterBufferType\n");
514dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = pnw__jpeg_process_picture_param(ctx, obj_buffer);
515dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
516dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
517578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing        case VAEncSliceParameterBufferType:
518578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing            drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_jpeg_RenderPicture got VAEncSliceParameterBufferJPEG\n");
519578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing            drv_debug_msg(VIDEO_DEBUG_WARNING, "VAEncSliceParameterBufferJPEG is ignored on TopazSC\n");
520578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing            vaStatus = VA_STATUS_SUCCESS;
521578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing            DEBUG_FAILURE;
522578d2ad7e1ef903d817be99a1aac92bd68b5ee53SUN,Jing            break;
523dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        default:
524dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = VA_STATUS_ERROR_UNKNOWN;
525dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
526dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
527437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
528437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
529437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
530437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
531437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
532437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* Add Restart interval termination (RSTm)to coded buf 1 ~ NumCores-1*/
533437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic inline VAStatus pnw_OutputResetIntervalToCB(IMG_UINT8 *pui8Buf, IMG_UINT8 ui8_marker)
534437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == pui8Buf)
536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
537dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*Refer to CCITT Rec. T.81 (1992 E), B.2.1*/
538dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*RSTm: Restart marker conditional marker which is placed between
539dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * entropy-coded segments only if restartis enabled. There are 8 unique
540dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * restart markers (m = 0 - 7) which repeat in sequence from 0 to 7, starting with
541dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * zero for each scan, to provide a modulo 8 restart interval count*/
542dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    *pui8Buf++ = 0xff;
543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    *pui8Buf = (ui8_marker | 0xd0);
544dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return 0;
545437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
546437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
547dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
548437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_jpeg_EndPicture(
549437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context)
550437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
551437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_CONTEXT_JPEG;
552437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    IMG_UINT16 ui16BCnt;
553437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    TOPAZSC_JPEG_ENCODER_CONTEXT *pContext = ctx->jpeg_ctx;
554437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    IMG_UINT32 rc = 0;
555437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_cmdbuf_p cmdbuf = (pnw_cmdbuf_p)ctx->obj_context->pnw_cmdbuf;
5562befccec034c13d34746a9e87149889d59ac767bFei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
5572befccec034c13d34746a9e87149889d59ac767bFei Jiang    IMG_UINT32 ui32NoMCUsToEncode;
5582befccec034c13d34746a9e87149889d59ac767bFei Jiang    IMG_UINT32 ui32RemainMCUs;
559437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
560c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_jpeg_EndPicture\n");
561437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
5622befccec034c13d34746a9e87149889d59ac767bFei Jiang    ui32RemainMCUs = pContext->sScan_Encode_Info.ui32NumberMCUsToEncode;
5632befccec034c13d34746a9e87149889d59ac767bFei Jiang
564437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    for (ui16BCnt = 0; ui16BCnt < pContext->sScan_Encode_Info.ui8NumberOfCodedBuffers
565bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang         && pContext->sScan_Encode_Info.ui16SScan > 0; ui16BCnt++) {
566dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pContext->sScan_Encode_Info.aBufferTable[ui16BCnt].ui16ScanNumber =
567dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pContext->sScan_Encode_Info.ui16SScan--;
56867612a448651896b2557796ff98d46c5e0dbbdc6hding	if (pContext->sScan_Encode_Info.ui8NumberOfCodedBuffers < 2 ||
5699bce84b451a52a186f4d3ea81f51225629a2287fSUN,Jing		pContext->sScan_Encode_Info.ui8NumberOfCodedBuffers > PNW_JPEG_MAX_SCAN_NUM) {
57067612a448651896b2557796ff98d46c5e0dbbdc6hding	    vaStatus = VA_STATUS_ERROR_UNKNOWN;
57167612a448651896b2557796ff98d46c5e0dbbdc6hding            DEBUG_FAILURE;
57267612a448651896b2557796ff98d46c5e0dbbdc6hding            return vaStatus;
57367612a448651896b2557796ff98d46c5e0dbbdc6hding	}
574dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /*i8MTXNumber is the core number.*/
575dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pContext->sScan_Encode_Info.aBufferTable[ui16BCnt].i8MTXNumber =
576203fb45de1ddd2df6cbb12102adba4e2e77b727eSUN,Jing            (aui32_jpg_mtx_num[pContext->sScan_Encode_Info.ui8NumberOfCodedBuffers - 1]
577dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun             >> ui16BCnt) & 0x1;
578dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
579dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pContext->sScan_Encode_Info.ui16SScan == 0) {
580dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ui32NoMCUsToEncode = ui32RemainMCUs;
581dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            // Final scan, may need fewer MCUs than buffer size, calculate the remainder
582dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else
583dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ui32NoMCUsToEncode = pContext->sScan_Encode_Info.ui32NumberMCUsToEncodePerScan;
584dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
585dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pContext->sScan_Encode_Info.ui32CurMCUsOffset =
586dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pContext->sScan_Encode_Info.ui32NumberMCUsToEncode - ui32RemainMCUs;
587dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
588dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        rc = SubmitScanToMTX(pContext, ui16BCnt,
589dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             pContext->sScan_Encode_Info.aBufferTable[ui16BCnt].i8MTXNumber, ui32NoMCUsToEncode);
590dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (rc != IMG_ERR_OK) {
591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = VA_STATUS_ERROR_UNKNOWN;
592dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
593dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return vaStatus;
594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
595dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
596dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ui32RemainMCUs -= ui32NoMCUsToEncode;
597437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
5985b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang    pnw_cmdbuf_insert_command_package(ctx->obj_context,
5995b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang                                      1 ,
6005b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang                                      MTX_CMDID_NULL,
6015b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang                                      NULL,
6025b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang                                      0);
6035b25aaf457f3ba02a4ff2a6243fa7c0f84f1e016Kun Wang
604437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
605437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_buffer_unmap(&cmdbuf->pic_params);
606437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->pic_params_p = NULL;
607437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_buffer_unmap(&cmdbuf->header_mem);
608437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->header_mem_p = NULL;
609437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /*psb_buffer_unmap(&cmdbuf->slice_params);
610437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->slice_params_p = NULL;*/
611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_unmap(ctx->coded_buf->psb_buffer);
612437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pContext->jpeg_coded_buf.pMemInfo = NULL;
613437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (pnw_context_flush_cmdbuf(ctx->obj_context)) {
614dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = VA_STATUS_ERROR_UNKNOWN;
615dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return vaStatus;
616437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
617437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
6184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->obj_context->frame_count++;
619dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return VA_STATUS_SUCCESS;
6202befccec034c13d34746a9e87149889d59ac767bFei Jiang}
621437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
622e9f11f100c212e9aeb194337ae43bbfea6a130dbKun WangVAStatus pnw_jpeg_AppendMarkers(object_context_p obj_context, unsigned char *raw_coded_buf)
6232befccec034c13d34746a9e87149889d59ac767bFei Jiang{
6242befccec034c13d34746a9e87149889d59ac767bFei Jiang    INIT_CONTEXT_JPEG;
6252befccec034c13d34746a9e87149889d59ac767bFei Jiang    IMG_UINT16 ui16BCnt;
6262befccec034c13d34746a9e87149889d59ac767bFei Jiang    TOPAZSC_JPEG_ENCODER_CONTEXT *pContext = ctx->jpeg_ctx;
6272befccec034c13d34746a9e87149889d59ac767bFei Jiang    BUFFER_HEADER* pBufHeader;
6282befccec034c13d34746a9e87149889d59ac767bFei Jiang    STREAMTYPEW s_streamW;
629e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned char *pSegStart = raw_coded_buf;
630437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
631dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pSegStart == NULL) {
632dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
633437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
634dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6352befccec034c13d34746a9e87149889d59ac767bFei Jiang    pBufHeader = (BUFFER_HEADER *)pSegStart;
636dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
637c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Number of Coded buffers %d, Per Coded Buffer size : %d\n",
638dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             pContext->sScan_Encode_Info.ui8NumberOfCodedBuffers, pContext->ui32SizePerCodedBuffer);
639437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
640437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /*The first part of coded buffer contains JPEG headers*/
641437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pBufHeader->ui32Reserved3 = PNW_JPEG_HEADER_MAX_SIZE;
642437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
643dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pContext->jpeg_coded_buf.ui32BytesWritten = 0;
644dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
645dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (ui16BCnt = 0;
646bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang         ui16BCnt < pContext->sScan_Encode_Info.ui8NumberOfCodedBuffers;
647bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang         ui16BCnt++) {
648dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pBufHeader = (BUFFER_HEADER *)pSegStart;
649dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pBufHeader->ui32Reserved3 =
650dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            PNW_JPEG_HEADER_MAX_SIZE + pContext->ui32SizePerCodedBuffer * ui16BCnt ;
651dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
652c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Coded Buffer Part %d, size %d, next part offset: %d\n",
653dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 ui16BCnt, pBufHeader->ui32BytesUsed, pBufHeader->ui32Reserved3);
654dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
655dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ui16BCnt > 0 && pContext->sScan_Encode_Info.ui8NumberOfCodedBuffers > 1) {
656c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Append 2 bytes Reset Interval %d "
657dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     "to Coded Buffer Part %d\n", ui16BCnt - 1, ui16BCnt);
658dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
659ce48ad222fbb9f0c3b47b2b663694afde6180d3fhding            while(*(pSegStart +sizeof(BUFFER_HEADER) + pBufHeader->ui32BytesUsed - 1) == 0xff)
660ce48ad222fbb9f0c3b47b2b663694afde6180d3fhding                pBufHeader->ui32BytesUsed--;
661ce48ad222fbb9f0c3b47b2b663694afde6180d3fhding
662dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_OutputResetIntervalToCB(
663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                (IMG_UINT8 *)(pSegStart +
664dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                              sizeof(BUFFER_HEADER) + pBufHeader->ui32BytesUsed),
665dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ui16BCnt - 1);
666dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
667dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pBufHeader->ui32BytesUsed += 2;
668dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
669dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
670dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pContext->jpeg_coded_buf.ui32BytesWritten += pBufHeader->ui32BytesUsed;
671dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pSegStart = raw_coded_buf + pBufHeader->ui32Reserved3;
672dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
6732befccec034c13d34746a9e87149889d59ac767bFei Jiang    pBufHeader = (BUFFER_HEADER *)pSegStart;
674437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pBufHeader->ui32Reserved3 = 0; /*Last Part of Coded Buffer*/
675437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pContext->jpeg_coded_buf.ui32BytesWritten += pBufHeader->ui32BytesUsed;
676437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
677c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Coded Buffer Part %d, size %d, next part offset: %d\n",
678dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             ui16BCnt, pBufHeader->ui32BytesUsed, pBufHeader->ui32Reserved3);
679437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
6801310b1bf5d83c3ca7010ef491067cd79e4af448dSUN,Jing    while(*(pSegStart +sizeof(BUFFER_HEADER) + pBufHeader->ui32BytesUsed - 1) == 0xff)
6811310b1bf5d83c3ca7010ef491067cd79e4af448dSUN,Jing        pBufHeader->ui32BytesUsed--;
6821310b1bf5d83c3ca7010ef491067cd79e4af448dSUN,Jing
6832befccec034c13d34746a9e87149889d59ac767bFei Jiang    s_streamW.Buffer = pSegStart;
684dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    s_streamW.Offset = (sizeof(BUFFER_HEADER) + pBufHeader->ui32BytesUsed);
6852befccec034c13d34746a9e87149889d59ac767bFei Jiang
686437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    fPutBitsToBuffer(&s_streamW, 2, END_OF_IMAGE);
6872befccec034c13d34746a9e87149889d59ac767bFei Jiang
688437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pBufHeader->ui32BytesUsed += 2;
689437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pContext->jpeg_coded_buf.ui32BytesWritten += 2;
690dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
691c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Add two bytes to last part of coded buffer,"
692dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             " total: %d\n", pContext->jpeg_coded_buf.ui32BytesWritten);
693dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return VA_STATUS_SUCCESS;
694437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
695437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
696437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstruct format_vtable_s pnw_JPEG_vtable = {
697dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunqueryConfigAttributes:
698dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_jpeg_QueryConfigAttributes,
699dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvalidateConfig:
700dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_jpeg_ValidateConfig,
701dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuncreateContext:
702dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_jpeg_CreateContext,
703dc1209519284865899ca8d990b3a2c7dbca8ae08wangkundestroyContext:
704dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_jpeg_DestroyContext,
705dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunbeginPicture:
706dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_jpeg_BeginPicture,
707dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunrenderPicture:
708dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_jpeg_RenderPicture,
709dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunendPicture:
710dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_jpeg_EndPicture
711437b3eda28a4bf098efa80598cab67f190275266Fei Jiang};
712