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_HEVCMainTierLevel1 }, 523e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar { OMX_VIDEO_HEVCProfileMain, OMX_VIDEO_HEVCMainTierLevel2 }, 533e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar { OMX_VIDEO_HEVCProfileMain, OMX_VIDEO_HEVCMainTierLevel21 }, 543e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar { OMX_VIDEO_HEVCProfileMain, OMX_VIDEO_HEVCMainTierLevel3 }, 553e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar { OMX_VIDEO_HEVCProfileMain, OMX_VIDEO_HEVCMainTierLevel31 }, 563e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar { OMX_VIDEO_HEVCProfileMain, OMX_VIDEO_HEVCMainTierLevel4 }, 573e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar { OMX_VIDEO_HEVCProfileMain, OMX_VIDEO_HEVCMainTierLevel41 }, 583e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar { OMX_VIDEO_HEVCProfileMain, OMX_VIDEO_HEVCMainTierLevel5 }, 593e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar { OMX_VIDEO_HEVCProfileMain, OMX_VIDEO_HEVCMainTierLevel51 }, 603e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar}; 613e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 623e648747e7e40752580ae7fd0ff2e803623680cdLajos MolnarSoftHEVC::SoftHEVC( 633e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar const char *name, 643e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar const OMX_CALLBACKTYPE *callbacks, 653e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar OMX_PTR appData, 663e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar OMX_COMPONENTTYPE **component) 673e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar : SoftVideoDecoderOMXComponent(name, componentName, codingType, 683e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar kProfileLevels, ARRAY_SIZE(kProfileLevels), 69f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy 320 /* width */, 240 /* height */, callbacks, 701aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu appData, component), 718e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mCodecCtx(NULL), 721aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mFlushOutBuffer(NULL), 731aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mOmxColorFormat(OMX_COLOR_FormatYUV420Planar), 741aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mIvColorFormat(IV_YUV_420P), 758e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mChangingResolution(false), 768e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mSignalledError(false), 778e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mStride(mWidth) { 78a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const size_t kMinCompressionRatio = 4 /* compressionRatio (for Level 4+) */; 79a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const size_t kMaxOutputBufferSize = 2048 * 2048 * 3 / 2; 80a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar // INPUT_BUF_SIZE is given by HEVC codec as minimum input size 81a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar initPorts( 82a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar kNumBuffers, max(kMaxOutputBufferSize / kMinCompressionRatio, (size_t)INPUT_BUF_SIZE), 83a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar kNumBuffers, CODEC_MIME_TYPE, kMinCompressionRatio); 841640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu} 851640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu 861640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wustatus_t SoftHEVC::init() { 871640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu return initDecoder(); 883e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 893e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 903e648747e7e40752580ae7fd0ff2e803623680cdLajos MolnarSoftHEVC::~SoftHEVC() { 918e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ALOGV("In SoftHEVC::~SoftHEVC"); 923e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar CHECK_EQ(deInitDecoder(), (status_t)OK); 933e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 943e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 958e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakarstatic void *ivd_aligned_malloc(void *ctxt, WORD32 alignment, WORD32 size) { 968e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar UNUSED(ctxt); 978e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar return memalign(alignment, size); 988e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar} 998e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 1008e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakarstatic void ivd_aligned_free(void *ctxt, void *buf) { 1018e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar UNUSED(ctxt); 1028e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar free(buf); 1038e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar return; 1048e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar} 1058e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 1063e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarstatic size_t GetCPUCoreCount() { 1073e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar long cpuCoreCount = 1; 1083e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#if defined(_SC_NPROCESSORS_ONLN) 1093e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN); 1103e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#else 1113e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar // _SC_NPROC_ONLN must be defined... 1123e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar cpuCoreCount = sysconf(_SC_NPROC_ONLN); 1133e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar#endif 1143e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar CHECK(cpuCoreCount >= 1); 1158e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ALOGV("Number of CPU cores: %ld", cpuCoreCount); 1163e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return (size_t)cpuCoreCount; 1173e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 1183e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 119f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamyvoid SoftHEVC::logVersion() { 1203e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_ctl_getversioninfo_ip_t s_ctl_ip; 1213e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_ctl_getversioninfo_op_t s_ctl_op; 1223e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar UWORD8 au1_buf[512]; 1233e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar IV_API_CALL_STATUS_T status; 1243e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1253e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; 1263e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETVERSION; 1273e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.u4_size = sizeof(ivd_ctl_getversioninfo_ip_t); 1283e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_op.u4_size = sizeof(ivd_ctl_getversioninfo_op_t); 1293e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.pv_version_buffer = au1_buf; 1303e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.u4_version_buffer_size = sizeof(au1_buf); 1313e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1323e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, 1333e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar (void *)&s_ctl_op); 1343e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1353e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (status != IV_SUCCESS) { 1363e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ALOGE("Error in getting version number: 0x%x", 1373e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_op.u4_error_code); 1383e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } else { 1398e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ALOGV("Ittiam decoder version number: %s", 1403e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar (char *)s_ctl_ip.pv_version_buffer); 1413e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 142f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy return; 1433e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 1443e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 145f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamystatus_t SoftHEVC::setParams(size_t stride) { 1463e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_ctl_set_config_ip_t s_ctl_ip; 1473e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_ctl_set_config_op_t s_ctl_op; 1483e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar IV_API_CALL_STATUS_T status; 149f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy s_ctl_ip.u4_disp_wd = (UWORD32)stride; 1503e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.e_frm_skip_mode = IVD_SKIP_NONE; 1513e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1523e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT; 153f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy s_ctl_ip.e_vid_dec_mode = IVD_DECODE_FRAME; 1543e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; 1553e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS; 1563e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.u4_size = sizeof(ivd_ctl_set_config_ip_t); 1573e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_op.u4_size = sizeof(ivd_ctl_set_config_op_t); 1583e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 159ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("Set the run-time (dynamic) parameters stride = %zu", stride); 1603e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, 1613e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar (void *)&s_ctl_op); 1623e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1633e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (status != IV_SUCCESS) { 1643e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ALOGE("Error in setting the run-time parameters: 0x%x", 1653e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_op.u4_error_code); 1663e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1673e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return UNKNOWN_ERROR; 1683e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 1693e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return OK; 1703e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 1713e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1723e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarstatus_t SoftHEVC::resetPlugin() { 1733e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mIsInFlush = false; 1743e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mReceivedEOS = false; 1753e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar memset(mTimeStamps, 0, sizeof(mTimeStamps)); 1763e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar memset(mTimeStampsValid, 0, sizeof(mTimeStampsValid)); 1773e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1783e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Initialize both start and end times */ 1793e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar gettimeofday(&mTimeStart, NULL); 1803e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar gettimeofday(&mTimeEnd, NULL); 1813e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1823e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return OK; 1833e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 1843e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1853e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarstatus_t SoftHEVC::resetDecoder() { 1863e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_ctl_reset_ip_t s_ctl_ip; 1873e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_ctl_reset_op_t s_ctl_op; 1883e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar IV_API_CALL_STATUS_T status; 1893e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1903e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; 1913e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_RESET; 1923e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_ip.u4_size = sizeof(ivd_ctl_reset_ip_t); 1933e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_ctl_op.u4_size = sizeof(ivd_ctl_reset_op_t); 1943e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 1953e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, 1963e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar (void *)&s_ctl_op); 1973e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (IV_SUCCESS != status) { 1983e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ALOGE("Error in reset: 0x%x", s_ctl_op.u4_error_code); 1993e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return UNKNOWN_ERROR; 2003e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 2018e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mSignalledError = false; 2023e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2033e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Set number of cores/threads to be used by the codec */ 2043e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar setNumCores(); 2053e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2068e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mStride = 0; 2073e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return OK; 2083e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 2093e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2103e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarstatus_t SoftHEVC::setNumCores() { 2113e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivdext_ctl_set_num_cores_ip_t s_set_cores_ip; 2123e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivdext_ctl_set_num_cores_op_t s_set_cores_op; 2133e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar IV_API_CALL_STATUS_T status; 2143e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_set_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL; 2153e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_set_cores_ip.e_sub_cmd = IVDEXT_CMD_CTL_SET_NUM_CORES; 2163e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_set_cores_ip.u4_num_cores = MIN(mNumCores, CODEC_MAX_NUM_CORES); 2173e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_set_cores_ip.u4_size = sizeof(ivdext_ctl_set_num_cores_ip_t); 2183e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_set_cores_op.u4_size = sizeof(ivdext_ctl_set_num_cores_op_t); 2198e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ALOGV("Set number of cores to %u", s_set_cores_ip.u4_num_cores); 2203e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar status = ivdec_api_function(mCodecCtx, (void *)&s_set_cores_ip, 2213e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar (void *)&s_set_cores_op); 2223e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (IV_SUCCESS != status) { 2233e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ALOGE("Error in setting number of cores: 0x%x", 2243e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_set_cores_op.u4_error_code); 2253e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return UNKNOWN_ERROR; 2263e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 2273e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return OK; 2283e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 2293e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2303e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarstatus_t SoftHEVC::setFlushMode() { 2313e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar IV_API_CALL_STATUS_T status; 2323e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_ctl_flush_ip_t s_video_flush_ip; 2333e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_ctl_flush_op_t s_video_flush_op; 2343e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2353e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_video_flush_ip.e_cmd = IVD_CMD_VIDEO_CTL; 2363e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_video_flush_ip.e_sub_cmd = IVD_CMD_CTL_FLUSH; 2373e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_video_flush_ip.u4_size = sizeof(ivd_ctl_flush_ip_t); 2383e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_video_flush_op.u4_size = sizeof(ivd_ctl_flush_op_t); 2398e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ALOGV("Set the decoder in flush mode "); 2403e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2413e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Set the decoder in Flush mode, subsequent decode() calls will flush */ 2423e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar status = ivdec_api_function(mCodecCtx, (void *)&s_video_flush_ip, 2433e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar (void *)&s_video_flush_op); 2443e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2453e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (status != IV_SUCCESS) { 2463e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ALOGE("Error in setting the decoder in flush mode: (%d) 0x%x", status, 2473e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar s_video_flush_op.u4_error_code); 2483e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return UNKNOWN_ERROR; 2493e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 2503e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2513e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mIsInFlush = true; 2523e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return OK; 2533e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 2543e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2553e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarstatus_t SoftHEVC::initDecoder() { 2563e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar IV_API_CALL_STATUS_T status; 2573e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2583e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mNumCores = GetCPUCoreCount(); 2598e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mCodecCtx = NULL; 2603e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2618e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mStride = outputBufferWidth(); 2623e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2633e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Initialize the decoder */ 2643e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar { 2658e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ivdext_create_ip_t s_create_ip; 2668e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ivdext_create_op_t s_create_op; 2673e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2683e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar void *dec_fxns = (void *)ivdec_api_function; 2693e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2708e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_ip.s_ivd_create_ip_t.u4_size = sizeof(ivdext_create_ip_t); 2718e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_ip.s_ivd_create_ip_t.e_cmd = IVD_CMD_CREATE; 2728e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_ip.s_ivd_create_ip_t.u4_share_disp_buf = 0; 2738e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_op.s_ivd_create_op_t.u4_size = sizeof(ivdext_create_op_t); 2748e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_ip.s_ivd_create_ip_t.e_output_format = mIvColorFormat; 2758e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_ip.s_ivd_create_ip_t.pf_aligned_alloc = ivd_aligned_malloc; 2768e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_ip.s_ivd_create_ip_t.pf_aligned_free = ivd_aligned_free; 2778e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_ip.s_ivd_create_ip_t.pv_mem_ctxt = NULL; 2783e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2798e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar status = ivdec_api_function(mCodecCtx, (void *)&s_create_ip, (void *)&s_create_op); 2803e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2818e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mCodecCtx = (iv_obj_t*)s_create_op.s_ivd_create_op_t.pv_handle; 2823e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mCodecCtx->pv_fxns = dec_fxns; 2833e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mCodecCtx->u4_size = sizeof(iv_obj_t); 2843e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2853e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (status != IV_SUCCESS) { 2868e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ALOGE("Error in create: 0x%x", 2878e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_create_op.s_ivd_create_op_t.u4_error_code); 2888e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar deInitDecoder(); 2898e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mCodecCtx = NULL; 2903e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return UNKNOWN_ERROR; 2913e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 2923e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 2933e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2943e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Reset the plugin state */ 2953e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar resetPlugin(); 2963e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 2973e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Set the run time (dynamic) parameters */ 2988e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar setParams(mStride); 2993e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3003e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Set number of cores/threads to be used by the codec */ 3013e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar setNumCores(); 3023e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3033e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Get codec version */ 304f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy logVersion(); 3053e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3061aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mFlushNeeded = false; 3073e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return OK; 3083e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 3093e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3103e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarstatus_t SoftHEVC::deInitDecoder() { 3113e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar size_t i; 3128e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar IV_API_CALL_STATUS_T status; 313f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy 3148e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (mCodecCtx) { 3158e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ivdext_delete_ip_t s_delete_ip; 3168e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ivdext_delete_op_t s_delete_op; 317f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy 3188e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_delete_ip.s_ivd_delete_ip_t.u4_size = sizeof(ivdext_delete_ip_t); 3198e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_delete_ip.s_ivd_delete_ip_t.e_cmd = IVD_CMD_DELETE; 3208e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 3218e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_delete_op.s_ivd_delete_op_t.u4_size = sizeof(ivdext_delete_op_t); 3228e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 3238e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar status = ivdec_api_function(mCodecCtx, (void *)&s_delete_ip, (void *)&s_delete_op); 3248e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (status != IV_SUCCESS) { 3258e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ALOGE("Error in delete: 0x%x", 3268e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar s_delete_op.s_ivd_delete_op_t.u4_error_code); 3278e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar return UNKNOWN_ERROR; 328f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy } 3293e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 3303e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3311aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu 3321aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mChangingResolution = false; 3331aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu 3343e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return OK; 3353e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 3363e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3373e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarvoid SoftHEVC::onReset() { 3388e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar ALOGV("onReset called"); 3393e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar SoftVideoDecoderOMXComponent::onReset(); 3403e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 3418e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mSignalledError = false; 3423e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar resetDecoder(); 3433e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar resetPlugin(); 3443e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 3453e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 34687fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kimbool SoftHEVC::setDecodeArgs(ivd_video_decode_ip_t *ps_dec_ip, 347f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ivd_video_decode_op_t *ps_dec_op, 348f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy OMX_BUFFERHEADERTYPE *inHeader, 349f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy OMX_BUFFERHEADERTYPE *outHeader, 350f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy size_t timeStampIx) { 3511aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu size_t sizeY = outputBufferWidth() * outputBufferHeight(); 352f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy size_t sizeUV; 353f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy 354f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->u4_size = sizeof(ivd_video_decode_ip_t); 355f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_op->u4_size = sizeof(ivd_video_decode_op_t); 356f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy 357f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->e_cmd = IVD_CMD_VIDEO_DECODE; 358f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy 359f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy /* When in flush and after EOS with zero byte input, 360f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy * inHeader is set to zero. Hence check for non-null */ 361f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy if (inHeader) { 362f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->u4_ts = timeStampIx; 363f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->pv_stream_buffer = inHeader->pBuffer 364f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy + inHeader->nOffset; 365f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->u4_num_Bytes = inHeader->nFilledLen; 366f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy } else { 367f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->u4_ts = 0; 368f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->pv_stream_buffer = NULL; 369f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->u4_num_Bytes = 0; 370f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy } 371f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy 37287fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim sizeUV = sizeY / 4; 37387fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ps_dec_ip->s_out_buffer.u4_min_out_buf_size[0] = sizeY; 37487fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ps_dec_ip->s_out_buffer.u4_min_out_buf_size[1] = sizeUV; 37587fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ps_dec_ip->s_out_buffer.u4_min_out_buf_size[2] = sizeUV; 37687fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim 37787fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim uint8_t *pBuf; 378f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy if (outHeader) { 37987fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim if (outHeader->nAllocLen < sizeY + (sizeUV * 2)) { 380ff64ea33382081f46d4b1061df00298bbbe3dd65Wonsik Kim android_errorWriteLog(0x534e4554, "27833616"); 38187fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim return false; 38287fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim } 383f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy pBuf = outHeader->pBuffer; 384f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy } else { 38587fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim // mFlushOutBuffer always has the right size. 386f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy pBuf = mFlushOutBuffer; 387f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy } 388f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy 389f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->s_out_buffer.pu1_bufs[0] = pBuf; 390f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->s_out_buffer.pu1_bufs[1] = pBuf + sizeY; 391f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->s_out_buffer.pu1_bufs[2] = pBuf + sizeY + sizeUV; 392f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy ps_dec_ip->s_out_buffer.u4_num_bufs = 3; 39387fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim return true; 394f6ef963fecde3b63696028fadce4bcfb5b998db0Naveen Kumar Ponnusamy} 3953e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarvoid SoftHEVC::onPortFlushCompleted(OMX_U32 portIndex) { 3963e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Once the output buffers are flushed, ignore any buffers that are held in decoder */ 3973e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (kOutputPortIndex == portIndex) { 3983e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar setFlushMode(); 3993e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4008e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar /* Allocate a picture buffer to flushed data */ 4018e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar uint32_t displayStride = outputBufferWidth(); 4028e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar uint32_t displayHeight = outputBufferHeight(); 4038e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 4048e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar uint32_t bufferSize = displayStride * displayHeight * 3 / 2; 4058e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mFlushOutBuffer = (uint8_t *)memalign(128, bufferSize); 4068e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (NULL == mFlushOutBuffer) { 4072720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen ALOGE("Could not allocate flushOutputBuffer of size %u", bufferSize); 4088e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar return; 4098e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar } 4108e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 4113e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar while (true) { 4123e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_video_decode_ip_t s_dec_ip; 4133e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_video_decode_op_t s_dec_op; 4143e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar IV_API_CALL_STATUS_T status; 4153e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar size_t sizeY, sizeUV; 4163e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4171aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu setDecodeArgs(&s_dec_ip, &s_dec_op, NULL, NULL, 0); 4183e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4193e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, 4203e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar (void *)&s_dec_op); 4213e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (0 == s_dec_op.u4_output_present) { 4223e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar resetPlugin(); 4233e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar break; 4243e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 4253e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 4268e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 4278e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (mFlushOutBuffer) { 4288e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar free(mFlushOutBuffer); 4298e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mFlushOutBuffer = NULL; 4308e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar } 4318e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 4323e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 4333e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 4343e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4353e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarvoid SoftHEVC::onQueueFilled(OMX_U32 portIndex) { 4363e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar UNUSED(portIndex); 4373e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4388e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (mSignalledError) { 4398e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar return; 4408e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar } 4413e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (mOutputPortSettingsChange != NONE) { 4423e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return; 4433e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 4443e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4458e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (NULL == mCodecCtx) { 4468e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (OK != initDecoder()) { 4474cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar ALOGE("Failed to initialize decoder"); 4484cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); 4494cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar mSignalledError = true; 4508e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar return; 4518e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar } 4528e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar } 4538e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (outputBufferWidth() != mStride) { 4548e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar /* Set the run-time (dynamic) parameters */ 4558e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar mStride = outputBufferWidth(); 4568e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar setParams(mStride); 4578e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar } 4588e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 4593e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar List<BufferInfo *> &inQueue = getPortQueue(kInputPortIndex); 4603e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar List<BufferInfo *> &outQueue = getPortQueue(kOutputPortIndex); 4613e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4621aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu while (!outQueue.empty()) { 4633e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar BufferInfo *inInfo; 4643e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar OMX_BUFFERHEADERTYPE *inHeader; 4653e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4663e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar BufferInfo *outInfo; 4673e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar OMX_BUFFERHEADERTYPE *outHeader; 4683e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar size_t timeStampIx; 4693e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4703e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inInfo = NULL; 4713e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inHeader = NULL; 4723e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4733e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (!mIsInFlush) { 4743e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (!inQueue.empty()) { 4753e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inInfo = *inQueue.begin(); 4763e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inHeader = inInfo->mHeader; 4773e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } else { 4783e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar break; 4793e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 4803e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 4813e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4823e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outInfo = *outQueue.begin(); 4833e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader = outInfo->mHeader; 4843e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader->nFlags = 0; 4853e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader->nTimeStamp = 0; 4863e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader->nOffset = 0; 4873e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4883e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (inHeader != NULL && (inHeader->nFlags & OMX_BUFFERFLAG_EOS)) { 4893e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mReceivedEOS = true; 4903e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (inHeader->nFilledLen == 0) { 4913e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inQueue.erase(inQueue.begin()); 4923e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inInfo->mOwnedByUs = false; 4933e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar notifyEmptyBufferDone(inHeader); 4943e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inHeader = NULL; 4953e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar setFlushMode(); 4963e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 4973e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 4983e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 4993e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Get a free slot in timestamp array to hold input timestamp */ 5003e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar { 5013e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar size_t i; 5023e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar timeStampIx = 0; 5033e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar for (i = 0; i < MAX_TIME_STAMPS; i++) { 5043e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (!mTimeStampsValid[i]) { 5053e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar timeStampIx = i; 5063e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar break; 5073e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 5083e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 5093e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (inHeader != NULL) { 5103e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mTimeStampsValid[timeStampIx] = true; 5113e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mTimeStamps[timeStampIx] = inHeader->nTimeStamp; 5123e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 5133e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 5143e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5153e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar { 5163e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_video_decode_ip_t s_dec_ip; 5173e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar ivd_video_decode_op_t s_dec_op; 5183e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar WORD32 timeDelay, timeTaken; 5193e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar size_t sizeY, sizeUV; 5203e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 52187fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim if (!setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx)) { 52287fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ALOGE("Decoder arg setup failed"); 52387fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL); 52487fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim mSignalledError = true; 52587fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim return; 52687fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim } 5273e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5283e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar GETTIME(&mTimeStart, NULL); 5293e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Compute time elapsed between end of previous decode() 5303e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * to start of current decode() */ 5313e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar TIME_DIFF(mTimeEnd, mTimeStart, timeDelay); 5323e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5331aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu IV_API_CALL_STATUS_T status; 5341aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op); 5358e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar 5364cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar bool unsupportedResolution = 5374cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar (IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED == (s_dec_op.u4_error_code & 0xFF)); 5384cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar 5394cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar /* Check for unsupported dimensions */ 5404cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar if (unsupportedResolution) { 5414cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar ALOGE("Unsupported resolution : %dx%d", mWidth, mHeight); 5424cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); 5434cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar mSignalledError = true; 5444cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar return; 5454cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar } 5464cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar 5474cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar bool allocationFailed = (IVD_MEM_ALLOC_FAILED == (s_dec_op.u4_error_code & 0xFF)); 5484cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar if (allocationFailed) { 5494cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar ALOGE("Allocation failure in decoder"); 5504cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); 5514cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar mSignalledError = true; 5524cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar return; 5534cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar } 5544cd06c8f3507e3dc4a732fb4cefe3d135fe69e68Harish Mahendrakar 5551aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu bool resChanged = (IVD_RES_CHANGED == (s_dec_op.u4_error_code & 0xFF)); 5563e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5573e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar GETTIME(&mTimeEnd, NULL); 5583e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* Compute time taken for decode() */ 5593e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar TIME_DIFF(mTimeStart, mTimeEnd, timeTaken); 5603e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5611aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu ALOGV("timeTaken=%6d delay=%6d numBytes=%6d", timeTaken, timeDelay, 5621aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu s_dec_op.u4_num_bytes_consumed); 5631aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu if (s_dec_op.u4_frame_decoded_flag && !mFlushNeeded) { 5641aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mFlushNeeded = true; 5651aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu } 5661aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu 5671aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu if ((inHeader != NULL) && (1 != s_dec_op.u4_frame_decoded_flag)) { 5681aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu /* If the input did not contain picture data, then ignore 5691aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu * the associated timestamp */ 5701aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mTimeStampsValid[timeStampIx] = false; 5711aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu } 5723e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5731aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu // If the decoder is in the changing resolution mode and there is no output present, 5741aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu // that means the switching is done and it's ready to reset the decoder and the plugin. 5751aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu if (mChangingResolution && !s_dec_op.u4_output_present) { 5761aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mChangingResolution = false; 5771aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu resetDecoder(); 5781aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu resetPlugin(); 57902fd609b7fd54c471ab1f5e77567d60c98e943d1Wonsik Kim mStride = outputBufferWidth(); 58002fd609b7fd54c471ab1f5e77567d60c98e943d1Wonsik Kim setParams(mStride); 5811aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu continue; 5821aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu } 5831aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu 5848e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar if (resChanged) { 5851aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu mChangingResolution = true; 5861aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu if (mFlushNeeded) { 5871aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu setFlushMode(); 5881aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu } 5891aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu continue; 5903e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 5913e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5923e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if ((0 < s_dec_op.u4_pic_wd) && (0 < s_dec_op.u4_pic_ht)) { 5933e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar uint32_t width = s_dec_op.u4_pic_wd; 5943e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar uint32_t height = s_dec_op.u4_pic_ht; 5951aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu bool portWillReset = false; 5961aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu handlePortSettingsChange(&portWillReset, width, height); 5973e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 5981aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu if (portWillReset) { 5991aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu resetDecoder(); 6003e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar return; 6013e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 6023e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 6033e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 6043e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (s_dec_op.u4_output_present) { 6058e43919f1f65f4cd3d98fc3cd2b83bf3cd666d39Harish Mahendrakar outHeader->nFilledLen = (outputBufferWidth() * outputBufferHeight() * 3) / 2; 6063e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 6073e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader->nTimeStamp = mTimeStamps[s_dec_op.u4_ts]; 6083e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mTimeStampsValid[s_dec_op.u4_ts] = false; 6093e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 6103e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outInfo->mOwnedByUs = false; 6113e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outQueue.erase(outQueue.begin()); 6123e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outInfo = NULL; 6133e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar notifyFillBufferDone(outHeader); 6143e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader = NULL; 615d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar } else if (mIsInFlush) { 6163e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* If in flush mode and no output is returned by the codec, 6173e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * then come out of flush mode */ 6183e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar mIsInFlush = false; 6193e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 6203e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar /* If EOS was recieved on input port and there is no output 6213e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar * from the codec, then signal EOS on output port */ 6223e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (mReceivedEOS) { 6233e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader->nFilledLen = 0; 6243e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader->nFlags |= OMX_BUFFERFLAG_EOS; 6253e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 6263e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outInfo->mOwnedByUs = false; 6273e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outQueue.erase(outQueue.begin()); 6283e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outInfo = NULL; 6293e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar notifyFillBufferDone(outHeader); 6303e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar outHeader = NULL; 6313e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar resetPlugin(); 6323e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 6333e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 6343e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 6353e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 636d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar /* If input EOS is seen and decoder is not in flush mode, 637d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar * set the decoder in flush mode. 638d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar * There can be a case where EOS is sent along with last picture data 639d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar * In that case, only after decoding that input data, decoder has to be 640d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar * put in flush. This case is handled here */ 641d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar 642d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar if (mReceivedEOS && !mIsInFlush) { 643d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar setFlushMode(); 644d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar } 645d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar 6463e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar // TODO: Handle more than one picture data 6473e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar if (inHeader != NULL) { 6483e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inInfo->mOwnedByUs = false; 6493e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inQueue.erase(inQueue.begin()); 6503e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inInfo = NULL; 6513e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar notifyEmptyBufferDone(inHeader); 6523e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar inHeader = NULL; 6533e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 6543e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar } 6553e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 6563e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 6571aa26f787afc525e0deae31d856dce74a4b28a0fRonghua Wu} // namespace android 6583e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar 6593e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnarandroid::SoftOMXComponent *createSoftOMXComponent(const char *name, 6603e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData, 6613e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar OMX_COMPONENTTYPE **component) { 6621640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu android::SoftHEVC *codec = new android::SoftHEVC(name, callbacks, appData, component); 6631640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu if (codec->init() != android::OK) { 6641640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu android::sp<android::SoftOMXComponent> release = codec; 6651640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu return NULL; 6661640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu } 6671640bd2d959432ce2b06a99e2a14e8c5c74efce2Ronghua Wu return codec; 6683e648747e7e40752580ae7fd0ff2e803623680cdLajos Molnar} 669