13e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar/* 23e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * Copyright (C) 2014 The Android Open Source Project 33e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * 43e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * Licensed under the Apache License, Version 2.0 (the "License"); 53e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * you may not use this file except in compliance with the License. 63e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * You may obtain a copy of the License at 73e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * 83e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * http://www.apache.org/licenses/LICENSE-2.0 93e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * 103e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * Unless required by applicable law or agreed to in writing, software 113e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * distributed under the License is distributed on an "AS IS" BASIS, 123e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * See the License for the specific language governing permissions and 143e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * limitations under the License. 153e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar */ 163e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 173e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar//#define LOG_NDEBUG 0 183e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#define LOG_TAG "SoftHEVC" 193e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#include <utils/Log.h> 203e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 213e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#include "ihevc_typedefs.h" 223e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#include "iv.h" 233e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#include "ivd.h" 243e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#include "ihevcd_cxa.h" 253e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#include "SoftHEVC.h" 263e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 273e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#include <media/stagefright/foundation/ADebug.h> 28a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar#include <media/stagefright/foundation/AUtils.h> 293e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#include <media/stagefright/MediaDefs.h> 303e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#include <OMX_VideoExt.h> 313e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 323e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarnamespace android { 333e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 343e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#define componentName "video_decoder.hevc" 353e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#define codingType OMX_VIDEO_CodingHEVC 363e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#define CODEC_MIME_TYPE MEDIA_MIMETYPE_VIDEO_HEVC 373e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 383e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar/** Function and structure definitions to keep code similar for each codec */ 393e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#define ivdec_api_function ihevcd_cxa_api_function 408e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar#define ivdext_create_ip_t ihevcd_cxa_create_ip_t 418e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar#define ivdext_create_op_t ihevcd_cxa_create_op_t 428e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar#define ivdext_delete_ip_t ihevcd_cxa_delete_ip_t 438e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar#define ivdext_delete_op_t ihevcd_cxa_delete_op_t 443e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#define ivdext_ctl_set_num_cores_ip_t ihevcd_cxa_ctl_set_num_cores_ip_t 453e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#define ivdext_ctl_set_num_cores_op_t ihevcd_cxa_ctl_set_num_cores_op_t 463e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 473e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#define IVDEXT_CMD_CTL_SET_NUM_CORES \ 483e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar (IVD_CONTROL_API_COMMAND_TYPE_T)IHEVCD_CXA_CMD_CTL_SET_NUM_CORES 493e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 503e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarstatic const CodecProfileLevel kProfileLevels[] = { 513e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar { OMX_VIDEO_HEVCProfileMain, OMX_VIDEO_HEVCMainTierLevel51 }, 523e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar}; 533e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 543e648747e7e40752580ae7fd0ff2e803623680cdLajos MolnarSoftHEVC::SoftHEVC( 553e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar const char *name, 563e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar const OMX_CALLBACKTYPE *callbacks, 573e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar OMX_PTR appData, 583e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar OMX_COMPONENTTYPE **component) 593e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar : SoftVideoDecoderOMXComponent(name, componentName, codingType, 603e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar kProfileLevels, ARRAY_SIZE(kProfileLevels), 61f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy 320 /* width */, 240 /* height */, callbacks, 621aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu appData, component), 638e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mCodecCtx(NULL), 641aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mFlushOutBuffer(NULL), 651aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mOmxColorFormat(OMX_COLOR_FormatYUV420Planar), 661aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mIvColorFormat(IV_YUV_420P), 678e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mChangingResolution(false), 688e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mSignalledError(false), 698e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mStride(mWidth) { 70a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const size_t kMinCompressionRatio = 4 /* compressionRatio (for Level 4+) */; 71a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const size_t kMaxOutputBufferSize = 2048 * 2048 * 3 / 2; 72a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar // INPUT_BUF_SIZE is given by HEVC codec as minimum input size 73a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar initPorts( 74a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar kNumBuffers, max(kMaxOutputBufferSize / kMinCompressionRatio, (size_t)INPUT_BUF_SIZE), 75a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar kNumBuffers, CODEC_MIME_TYPE, kMinCompressionRatio); 761640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu} 771640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu 781640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wustatus_t SoftHEVC::init() { 791640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu return initDecoder(); 803e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 813e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 823e648747e7e40752580ae7fd0ff2e803623680cdLajos MolnarSoftHEVC::~SoftHEVC() { 838e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ALOGV("In SoftHEVC::~SoftHEVC"); 843e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar CHECK_EQ(deInitDecoder(), (status_t)OK); 853e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 863e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 878e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakarstatic void *ivd_aligned_malloc(void *ctxt, WORD32 alignment, WORD32 size) { 888e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar UNUSED(ctxt); 898e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar return memalign(alignment, size); 908e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar} 918e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 928e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakarstatic void ivd_aligned_free(void *ctxt, void *buf) { 938e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar UNUSED(ctxt); 948e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar free(buf); 958e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar return; 968e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar} 978e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 983e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarstatic size_t GetCPUCoreCount() { 993e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar long cpuCoreCount = 1; 1003e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#if defined(_SC_NPROCESSORS_ONLN) 1013e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN); 1023e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#else 1033e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar // _SC_NPROC_ONLN must be defined... 1043e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar cpuCoreCount = sysconf(_SC_NPROC_ONLN); 1053e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#endif 1063e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar CHECK(cpuCoreCount >= 1); 1078e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ALOGV("Number of CPU cores: %ld", cpuCoreCount); 1083e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return (size_t)cpuCoreCount; 1093e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 1103e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 111f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamyvoid SoftHEVC::logVersion() { 1123e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_ctl_getversioninfo_ip_t s_ctl_ip; 1133e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_ctl_getversioninfo_op_t s_ctl_op; 1143e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar UWORD8 au1_buf[512]; 1153e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar IV_API_CALL_STATUS_T status; 1163e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1173e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; 1183e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETVERSION; 1193e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.u4_size = sizeof(ivd_ctl_getversioninfo_ip_t); 1203e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_op.u4_size = sizeof(ivd_ctl_getversioninfo_op_t); 1213e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.pv_version_buffer = au1_buf; 1223e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.u4_version_buffer_size = sizeof(au1_buf); 1233e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1243e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, 1253e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar (void *)&s_ctl_op); 1263e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1273e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (status != IV_SUCCESS) { 1283e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ALOGE("Error in getting version number: 0x%x", 1293e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_op.u4_error_code); 1303e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } else { 1318e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ALOGV("Ittiam decoder version number: %s", 1323e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar (char *)s_ctl_ip.pv_version_buffer); 1333e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 134f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy return; 1353e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 1363e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 137f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamystatus_t SoftHEVC::setParams(size_t stride) { 1383e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_ctl_set_config_ip_t s_ctl_ip; 1393e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_ctl_set_config_op_t s_ctl_op; 1403e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar IV_API_CALL_STATUS_T status; 141f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy s_ctl_ip.u4_disp_wd = (UWORD32)stride; 1423e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.e_frm_skip_mode = IVD_SKIP_NONE; 1433e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1443e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT; 145f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy s_ctl_ip.e_vid_dec_mode = IVD_DECODE_FRAME; 1463e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; 1473e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS; 1483e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.u4_size = sizeof(ivd_ctl_set_config_ip_t); 1493e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_op.u4_size = sizeof(ivd_ctl_set_config_op_t); 1503e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 151ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("Set the run-time (dynamic) parameters stride = %zu", stride); 1523e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, 1533e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar (void *)&s_ctl_op); 1543e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1553e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (status != IV_SUCCESS) { 1563e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ALOGE("Error in setting the run-time parameters: 0x%x", 1573e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_op.u4_error_code); 1583e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1593e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return UNKNOWN_ERROR; 1603e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 1613e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return OK; 1623e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 1633e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1643e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarstatus_t SoftHEVC::resetPlugin() { 1653e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mIsInFlush = false; 1663e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mReceivedEOS = false; 1673e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar memset(mTimeStamps, 0, sizeof(mTimeStamps)); 1683e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar memset(mTimeStampsValid, 0, sizeof(mTimeStampsValid)); 1693e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1703e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Initialize both start and end times */ 1713e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar gettimeofday(&mTimeStart, NULL); 1723e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar gettimeofday(&mTimeEnd, NULL); 1733e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1743e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return OK; 1753e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 1763e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 177af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuangbool SoftHEVC::getVUIParams() { 178af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang IV_API_CALL_STATUS_T status; 179af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang ihevcd_cxa_ctl_get_vui_params_ip_t s_ctl_get_vui_params_ip; 180af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang ihevcd_cxa_ctl_get_vui_params_op_t s_ctl_get_vui_params_op; 181af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang 182af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang s_ctl_get_vui_params_ip.e_cmd = IVD_CMD_VIDEO_CTL; 183af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang s_ctl_get_vui_params_ip.e_sub_cmd = 184af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang (IVD_CONTROL_API_COMMAND_TYPE_T)IHEVCD_CXA_CMD_CTL_GET_VUI_PARAMS; 185af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang 186af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang s_ctl_get_vui_params_ip.u4_size = 187af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang sizeof(ihevcd_cxa_ctl_get_vui_params_ip_t); 188af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang 189af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang s_ctl_get_vui_params_op.u4_size = sizeof(ihevcd_cxa_ctl_get_vui_params_op_t); 190af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang 191af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang status = ivdec_api_function( 192af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang (iv_obj_t *)mCodecCtx, (void *)&s_ctl_get_vui_params_ip, 193af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang (void *)&s_ctl_get_vui_params_op); 194af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang 195af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang if (status != IV_SUCCESS) { 196af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang ALOGW("Error in getting VUI params: 0x%x", 197af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang s_ctl_get_vui_params_op.u4_error_code); 198af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang return false; 199af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang } 200af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang 201af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang int32_t primaries = s_ctl_get_vui_params_op.u1_colour_primaries; 202af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang int32_t transfer = s_ctl_get_vui_params_op.u1_transfer_characteristics; 203af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang int32_t coeffs = s_ctl_get_vui_params_op.u1_matrix_coefficients; 204af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang bool fullRange = s_ctl_get_vui_params_op.u1_video_full_range_flag; 205af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang 206af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang ColorAspects colorAspects; 207af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang ColorUtils::convertIsoColorAspectsToCodecAspects( 208af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang primaries, transfer, coeffs, fullRange, colorAspects); 209af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang 210af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang // Update color aspects if necessary. 211af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang if (colorAspectsDiffer(colorAspects, mBitstreamColorAspects)) { 212af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang mBitstreamColorAspects = colorAspects; 213af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang status_t err = handleColorAspectsChange(); 214af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang CHECK(err == OK); 215af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang } 216af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang return true; 217af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang} 218af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang 2193e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarstatus_t SoftHEVC::resetDecoder() { 2203e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_ctl_reset_ip_t s_ctl_ip; 2213e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_ctl_reset_op_t s_ctl_op; 2223e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar IV_API_CALL_STATUS_T status; 2233e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2243e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; 2253e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_RESET; 2263e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.u4_size = sizeof(ivd_ctl_reset_ip_t); 2273e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_op.u4_size = sizeof(ivd_ctl_reset_op_t); 2283e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2293e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, 2303e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar (void *)&s_ctl_op); 2313e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (IV_SUCCESS != status) { 2323e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ALOGE("Error in reset: 0x%x", s_ctl_op.u4_error_code); 2333e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return UNKNOWN_ERROR; 2343e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 2358e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mSignalledError = false; 2363e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2373e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Set number of cores/threads to be used by the codec */ 2383e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar setNumCores(); 2393e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2408e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mStride = 0; 2413e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return OK; 2423e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 2433e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2443e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarstatus_t SoftHEVC::setNumCores() { 2453e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivdext_ctl_set_num_cores_ip_t s_set_cores_ip; 2463e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivdext_ctl_set_num_cores_op_t s_set_cores_op; 2473e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar IV_API_CALL_STATUS_T status; 2483e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_set_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL; 2493e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_set_cores_ip.e_sub_cmd = IVDEXT_CMD_CTL_SET_NUM_CORES; 2503e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_set_cores_ip.u4_num_cores = MIN(mNumCores, CODEC_MAX_NUM_CORES); 2513e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_set_cores_ip.u4_size = sizeof(ivdext_ctl_set_num_cores_ip_t); 2523e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_set_cores_op.u4_size = sizeof(ivdext_ctl_set_num_cores_op_t); 2538e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ALOGV("Set number of cores to %u", s_set_cores_ip.u4_num_cores); 2543e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar status = ivdec_api_function(mCodecCtx, (void *)&s_set_cores_ip, 2553e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar (void *)&s_set_cores_op); 2563e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (IV_SUCCESS != status) { 2573e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ALOGE("Error in setting number of cores: 0x%x", 2583e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_set_cores_op.u4_error_code); 2593e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return UNKNOWN_ERROR; 2603e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 2613e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return OK; 2623e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 2633e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2643e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarstatus_t SoftHEVC::setFlushMode() { 2653e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar IV_API_CALL_STATUS_T status; 2663e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_ctl_flush_ip_t s_video_flush_ip; 2673e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_ctl_flush_op_t s_video_flush_op; 2683e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2693e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_video_flush_ip.e_cmd = IVD_CMD_VIDEO_CTL; 2703e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_video_flush_ip.e_sub_cmd = IVD_CMD_CTL_FLUSH; 2713e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_video_flush_ip.u4_size = sizeof(ivd_ctl_flush_ip_t); 2723e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_video_flush_op.u4_size = sizeof(ivd_ctl_flush_op_t); 2738e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ALOGV("Set the decoder in flush mode "); 2743e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2753e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Set the decoder in Flush mode, subsequent decode() calls will flush */ 2763e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar status = ivdec_api_function(mCodecCtx, (void *)&s_video_flush_ip, 2773e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar (void *)&s_video_flush_op); 2783e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2793e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (status != IV_SUCCESS) { 2803e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ALOGE("Error in setting the decoder in flush mode: (%d) 0x%x", status, 2813e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_video_flush_op.u4_error_code); 2823e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return UNKNOWN_ERROR; 2833e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 2843e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2853e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mIsInFlush = true; 2863e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return OK; 2873e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 2883e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2893e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarstatus_t SoftHEVC::initDecoder() { 2903e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar IV_API_CALL_STATUS_T status; 2913e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2923e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mNumCores = GetCPUCoreCount(); 2938e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mCodecCtx = NULL; 2943e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2958e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mStride = outputBufferWidth(); 2963e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2973e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Initialize the decoder */ 2983e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar { 2998e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ivdext_create_ip_t s_create_ip; 3008e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ivdext_create_op_t s_create_op; 3013e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3023e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar void *dec_fxns = (void *)ivdec_api_function; 3033e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3048e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_ip.s_ivd_create_ip_t.u4_size = sizeof(ivdext_create_ip_t); 3058e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_ip.s_ivd_create_ip_t.e_cmd = IVD_CMD_CREATE; 3068e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_ip.s_ivd_create_ip_t.u4_share_disp_buf = 0; 3078e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_op.s_ivd_create_op_t.u4_size = sizeof(ivdext_create_op_t); 3088e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_ip.s_ivd_create_ip_t.e_output_format = mIvColorFormat; 3098e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_ip.s_ivd_create_ip_t.pf_aligned_alloc = ivd_aligned_malloc; 3108e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_ip.s_ivd_create_ip_t.pf_aligned_free = ivd_aligned_free; 3118e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_ip.s_ivd_create_ip_t.pv_mem_ctxt = NULL; 3123e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3138e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar status = ivdec_api_function(mCodecCtx, (void *)&s_create_ip, (void *)&s_create_op); 3143e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3158e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mCodecCtx = (iv_obj_t*)s_create_op.s_ivd_create_op_t.pv_handle; 3163e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mCodecCtx->pv_fxns = dec_fxns; 3173e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mCodecCtx->u4_size = sizeof(iv_obj_t); 3183e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3193e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (status != IV_SUCCESS) { 3208e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ALOGE("Error in create: 0x%x", 3218e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_op.s_ivd_create_op_t.u4_error_code); 3228e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar deInitDecoder(); 3238e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mCodecCtx = NULL; 3243e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return UNKNOWN_ERROR; 3253e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 3263e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 3273e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3283e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Reset the plugin state */ 3293e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar resetPlugin(); 3303e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3313e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Set the run time (dynamic) parameters */ 3328e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar setParams(mStride); 3333e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3343e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Set number of cores/threads to be used by the codec */ 3353e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar setNumCores(); 3363e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3373e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Get codec version */ 338f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy logVersion(); 3393e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3401aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mFlushNeeded = false; 3413e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return OK; 3423e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 3433e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3443e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarstatus_t SoftHEVC::deInitDecoder() { 3453e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar size_t i; 3468e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar IV_API_CALL_STATUS_T status; 347f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy 3488e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (mCodecCtx) { 3498e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ivdext_delete_ip_t s_delete_ip; 3508e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ivdext_delete_op_t s_delete_op; 351f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy 3528e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_delete_ip.s_ivd_delete_ip_t.u4_size = sizeof(ivdext_delete_ip_t); 3538e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_delete_ip.s_ivd_delete_ip_t.e_cmd = IVD_CMD_DELETE; 3548e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 3558e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_delete_op.s_ivd_delete_op_t.u4_size = sizeof(ivdext_delete_op_t); 3568e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 3578e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar status = ivdec_api_function(mCodecCtx, (void *)&s_delete_ip, (void *)&s_delete_op); 3588e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (status != IV_SUCCESS) { 3598e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ALOGE("Error in delete: 0x%x", 3608e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_delete_op.s_ivd_delete_op_t.u4_error_code); 3618e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar return UNKNOWN_ERROR; 362f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy } 3633e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 3643e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3651aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu 3661aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mChangingResolution = false; 3671aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu 3683e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return OK; 3693e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 3703e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3713e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarvoid SoftHEVC::onReset() { 3728e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ALOGV("onReset called"); 3733e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar SoftVideoDecoderOMXComponent::onReset(); 3743e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3758e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mSignalledError = false; 3763e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar resetDecoder(); 3773e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar resetPlugin(); 3783e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 3793e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 38087fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kimbool SoftHEVC::setDecodeArgs(ivd_video_decode_ip_t *ps_dec_ip, 381f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ivd_video_decode_op_t *ps_dec_op, 382f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy OMX_BUFFERHEADERTYPE *inHeader, 383f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy OMX_BUFFERHEADERTYPE *outHeader, 384f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy size_t timeStampIx) { 3851aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu size_t sizeY = outputBufferWidth() * outputBufferHeight(); 386f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy size_t sizeUV; 387f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy 388f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->u4_size = sizeof(ivd_video_decode_ip_t); 389f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_op->u4_size = sizeof(ivd_video_decode_op_t); 390f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy 391f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->e_cmd = IVD_CMD_VIDEO_DECODE; 392f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy 393f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy /* When in flush and after EOS with zero byte input, 394f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy * inHeader is set to zero. Hence check for non-null */ 395f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy if (inHeader) { 396f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->u4_ts = timeStampIx; 397f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->pv_stream_buffer = inHeader->pBuffer 398f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy + inHeader->nOffset; 399f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->u4_num_Bytes = inHeader->nFilledLen; 400f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy } else { 401f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->u4_ts = 0; 402f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->pv_stream_buffer = NULL; 403f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->u4_num_Bytes = 0; 404f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy } 405f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy 40687fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim sizeUV = sizeY / 4; 40787fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ps_dec_ip->s_out_buffer.u4_min_out_buf_size[0] = sizeY; 40887fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ps_dec_ip->s_out_buffer.u4_min_out_buf_size[1] = sizeUV; 40987fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ps_dec_ip->s_out_buffer.u4_min_out_buf_size[2] = sizeUV; 41087fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim 41187fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim uint8_t *pBuf; 412f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy if (outHeader) { 41387fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim if (outHeader->nAllocLen < sizeY + (sizeUV * 2)) { 414ff64ea33382081f46d4b1061df00298bbbe3dd65Wonsik Kim android_errorWriteLog(0x534e4554, "27833616"); 41587fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim return false; 41687fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim } 417f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy pBuf = outHeader->pBuffer; 418f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy } else { 41987fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim // mFlushOutBuffer always has the right size. 420f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy pBuf = mFlushOutBuffer; 421f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy } 422f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy 423f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->s_out_buffer.pu1_bufs[0] = pBuf; 424f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->s_out_buffer.pu1_bufs[1] = pBuf + sizeY; 425f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->s_out_buffer.pu1_bufs[2] = pBuf + sizeY + sizeUV; 426f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->s_out_buffer.u4_num_bufs = 3; 42787fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim return true; 428f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy} 4293e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarvoid SoftHEVC::onPortFlushCompleted(OMX_U32 portIndex) { 4303e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Once the output buffers are flushed, ignore any buffers that are held in decoder */ 4313e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (kOutputPortIndex == portIndex) { 4323e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar setFlushMode(); 4333e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4348e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar /* Allocate a picture buffer to flushed data */ 4358e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar uint32_t displayStride = outputBufferWidth(); 4368e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar uint32_t displayHeight = outputBufferHeight(); 4378e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 4388e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar uint32_t bufferSize = displayStride * displayHeight * 3 / 2; 4398e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mFlushOutBuffer = (uint8_t *)memalign(128, bufferSize); 4408e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (NULL == mFlushOutBuffer) { 4412720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen ALOGE("Could not allocate flushOutputBuffer of size %u", bufferSize); 4428e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar return; 4438e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar } 4448e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 4453e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar while (true) { 4463e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_video_decode_ip_t s_dec_ip; 4473e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_video_decode_op_t s_dec_op; 4483e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar IV_API_CALL_STATUS_T status; 4493e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar size_t sizeY, sizeUV; 4503e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4511aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu setDecodeArgs(&s_dec_ip, &s_dec_op, NULL, NULL, 0); 4523e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4533e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, 4543e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar (void *)&s_dec_op); 4553e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (0 == s_dec_op.u4_output_present) { 4563e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar resetPlugin(); 4573e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar break; 4583e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 4593e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 4608e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 4618e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (mFlushOutBuffer) { 4628e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar free(mFlushOutBuffer); 4638e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mFlushOutBuffer = NULL; 4648e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar } 4658e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 4663e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 4673e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 4683e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4693e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarvoid SoftHEVC::onQueueFilled(OMX_U32 portIndex) { 4703e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar UNUSED(portIndex); 4713e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4728e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (mSignalledError) { 4738e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar return; 4748e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar } 4753e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (mOutputPortSettingsChange != NONE) { 4763e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return; 4773e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 4783e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4798e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (NULL == mCodecCtx) { 4808e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (OK != initDecoder()) { 4814cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar ALOGE("Failed to initialize decoder"); 4824cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); 4834cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar mSignalledError = true; 4848e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar return; 4858e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar } 4868e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar } 4878e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (outputBufferWidth() != mStride) { 4888e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar /* Set the run-time (dynamic) parameters */ 4898e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mStride = outputBufferWidth(); 4908e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar setParams(mStride); 4918e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar } 4928e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 4933e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar List<BufferInfo *> &inQueue = getPortQueue(kInputPortIndex); 4943e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar List<BufferInfo *> &outQueue = getPortQueue(kOutputPortIndex); 4953e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4961aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu while (!outQueue.empty()) { 4973e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar BufferInfo *inInfo; 4983e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar OMX_BUFFERHEADERTYPE *inHeader; 4993e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5003e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar BufferInfo *outInfo; 5013e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar OMX_BUFFERHEADERTYPE *outHeader; 5023e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar size_t timeStampIx; 5033e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5043e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inInfo = NULL; 5053e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inHeader = NULL; 5063e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5073e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (!mIsInFlush) { 5083e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (!inQueue.empty()) { 5093e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inInfo = *inQueue.begin(); 5103e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inHeader = inInfo->mHeader; 5113e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } else { 5123e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar break; 5133e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 5143e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 5153e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5163e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outInfo = *outQueue.begin(); 5173e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader = outInfo->mHeader; 5183e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader->nFlags = 0; 5193e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader->nTimeStamp = 0; 5203e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader->nOffset = 0; 5213e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5223e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (inHeader != NULL && (inHeader->nFlags & OMX_BUFFERFLAG_EOS)) { 5233e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mReceivedEOS = true; 5243e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (inHeader->nFilledLen == 0) { 5253e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inQueue.erase(inQueue.begin()); 5263e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inInfo->mOwnedByUs = false; 5273e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar notifyEmptyBufferDone(inHeader); 5283e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inHeader = NULL; 5293e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar setFlushMode(); 5303e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 5313e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 5323e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5333e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Get a free slot in timestamp array to hold input timestamp */ 5343e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar { 5353e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar size_t i; 5363e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar timeStampIx = 0; 5373e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar for (i = 0; i < MAX_TIME_STAMPS; i++) { 5383e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (!mTimeStampsValid[i]) { 5393e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar timeStampIx = i; 5403e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar break; 5413e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 5423e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 5433e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (inHeader != NULL) { 5443e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mTimeStampsValid[timeStampIx] = true; 5453e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mTimeStamps[timeStampIx] = inHeader->nTimeStamp; 5463e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 5473e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 5483e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5493e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar { 5503e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_video_decode_ip_t s_dec_ip; 5513e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_video_decode_op_t s_dec_op; 5523e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar WORD32 timeDelay, timeTaken; 5533e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar size_t sizeY, sizeUV; 5543e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 55587fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim if (!setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx)) { 55687fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ALOGE("Decoder arg setup failed"); 55787fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL); 55887fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim mSignalledError = true; 55987fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim return; 56087fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim } 5613e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5623e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar GETTIME(&mTimeStart, NULL); 5633e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Compute time elapsed between end of previous decode() 5643e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * to start of current decode() */ 5653e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar TIME_DIFF(mTimeEnd, mTimeStart, timeDelay); 5663e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5671aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu IV_API_CALL_STATUS_T status; 5681aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op); 5698e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 5704cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar bool unsupportedResolution = 5714cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar (IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED == (s_dec_op.u4_error_code & 0xFF)); 5724cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar 5734cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar /* Check for unsupported dimensions */ 5744cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar if (unsupportedResolution) { 5754cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar ALOGE("Unsupported resolution : %dx%d", mWidth, mHeight); 5764cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); 5774cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar mSignalledError = true; 5784cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar return; 5794cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar } 5804cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar 5814cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar bool allocationFailed = (IVD_MEM_ALLOC_FAILED == (s_dec_op.u4_error_code & 0xFF)); 5824cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar if (allocationFailed) { 5834cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar ALOGE("Allocation failure in decoder"); 5844cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); 5854cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar mSignalledError = true; 5864cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar return; 5874cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar } 5884cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar 5891aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu bool resChanged = (IVD_RES_CHANGED == (s_dec_op.u4_error_code & 0xFF)); 5903e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 591af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang getVUIParams(); 592af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang 5933e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar GETTIME(&mTimeEnd, NULL); 5943e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Compute time taken for decode() */ 5953e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar TIME_DIFF(mTimeStart, mTimeEnd, timeTaken); 5963e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5971aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu ALOGV("timeTaken=%6d delay=%6d numBytes=%6d", timeTaken, timeDelay, 5981aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu s_dec_op.u4_num_bytes_consumed); 5991aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu if (s_dec_op.u4_frame_decoded_flag && !mFlushNeeded) { 6001aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mFlushNeeded = true; 6011aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu } 6021aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu 6031aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu if ((inHeader != NULL) && (1 != s_dec_op.u4_frame_decoded_flag)) { 6041aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu /* If the input did not contain picture data, then ignore 6051aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu * the associated timestamp */ 6061aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mTimeStampsValid[timeStampIx] = false; 6071aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu } 6083e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 6091aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu // If the decoder is in the changing resolution mode and there is no output present, 6101aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu // that means the switching is done and it's ready to reset the decoder and the plugin. 6111aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu if (mChangingResolution && !s_dec_op.u4_output_present) { 6121aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mChangingResolution = false; 6131aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu resetDecoder(); 6141aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu resetPlugin(); 61502fd609b7fd54c471ab1f5e77567d60c98e943d1Wonsik Kim mStride = outputBufferWidth(); 61602fd609b7fd54c471ab1f5e77567d60c98e943d1Wonsik Kim setParams(mStride); 6171aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu continue; 6181aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu } 6191aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu 6208e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (resChanged) { 6211aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mChangingResolution = true; 6221aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu if (mFlushNeeded) { 6231aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu setFlushMode(); 6241aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu } 6251aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu continue; 6263e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 6273e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 628af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang // Combine the resolution change and coloraspects change in one PortSettingChange event 629af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang // if necessary. 6303e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if ((0 < s_dec_op.u4_pic_wd) && (0 < s_dec_op.u4_pic_ht)) { 6313e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar uint32_t width = s_dec_op.u4_pic_wd; 6323e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar uint32_t height = s_dec_op.u4_pic_ht; 6331aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu bool portWillReset = false; 6341aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu handlePortSettingsChange(&portWillReset, width, height); 6353e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 6361aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu if (portWillReset) { 6371aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu resetDecoder(); 6388437f4e9094567affaa72ba7bfab654e12e78399Ram Mohan M resetPlugin(); 6393e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return; 6403e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 641af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang } else if (mUpdateColorAspects) { 642af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang notify(OMX_EventPortSettingsChanged, kOutputPortIndex, 643af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang kDescribeColorAspectsIndex, NULL); 644af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang mUpdateColorAspects = false; 645af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang return; 6463e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 6473e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 6483e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (s_dec_op.u4_output_present) { 6498e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar outHeader->nFilledLen = (outputBufferWidth() * outputBufferHeight() * 3) / 2; 6503e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 6513e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader->nTimeStamp = mTimeStamps[s_dec_op.u4_ts]; 6523e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mTimeStampsValid[s_dec_op.u4_ts] = false; 6533e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 6543e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outInfo->mOwnedByUs = false; 6553e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outQueue.erase(outQueue.begin()); 6563e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outInfo = NULL; 6573e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar notifyFillBufferDone(outHeader); 6583e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader = NULL; 659d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar } else if (mIsInFlush) { 6603e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* If in flush mode and no output is returned by the codec, 6613e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * then come out of flush mode */ 6623e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mIsInFlush = false; 6633e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 6643e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* If EOS was recieved on input port and there is no output 6653e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * from the codec, then signal EOS on output port */ 6663e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (mReceivedEOS) { 6673e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader->nFilledLen = 0; 6683e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader->nFlags |= OMX_BUFFERFLAG_EOS; 6693e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 6703e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outInfo->mOwnedByUs = false; 6713e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outQueue.erase(outQueue.begin()); 6723e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outInfo = NULL; 6733e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar notifyFillBufferDone(outHeader); 6743e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader = NULL; 6753e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar resetPlugin(); 6763e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 6773e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 6783e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 6793e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 680d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar /* If input EOS is seen and decoder is not in flush mode, 681d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar * set the decoder in flush mode. 682d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar * There can be a case where EOS is sent along with last picture data 683d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar * In that case, only after decoding that input data, decoder has to be 684d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar * put in flush. This case is handled here */ 685d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar 686d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar if (mReceivedEOS && !mIsInFlush) { 687d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar setFlushMode(); 688d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar } 689d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar 6903e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar // TODO: Handle more than one picture data 6913e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (inHeader != NULL) { 6923e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inInfo->mOwnedByUs = false; 6933e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inQueue.erase(inQueue.begin()); 6943e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inInfo = NULL; 6953e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar notifyEmptyBufferDone(inHeader); 6963e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inHeader = NULL; 6973e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 6983e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 6993e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 7003e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 701af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuangint SoftHEVC::getColorAspectPreference() { 702af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang return kPreferBitstream; 703af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang} 704af9e7c44f14dcb5b9e1c4e24273ca48fca817b53Hangyu Kuang 7051aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu} // namespace android 7063e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 7073e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarandroid::SoftOMXComponent *createSoftOMXComponent(const char *name, 7083e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData, 7093e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar OMX_COMPONENTTYPE **component) { 7101640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu android::SoftHEVC *codec = new android::SoftHEVC(name, callbacks, appData, component); 7111640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu if (codec->init() != android::OK) { 7121640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu android::sp<android::SoftOMXComponent> release = codec; 7131640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu return NULL; 7141640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu } 7151640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu return codec; 7163e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 717