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