1e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani/* 2e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * Copyright 2015 The Android Open Source Project 3e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * 4e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * Licensed under the Apache License, Version 2.0 (the "License"); 5e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * you may not use this file except in compliance with the License. 6e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * You may obtain a copy of the License at 7e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * 8e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * http://www.apache.org/licenses/LICENSE-2.0 9e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * 10e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * Unless required by applicable law or agreed to in writing, software 11e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * distributed under the License is distributed on an "AS IS" BASIS, 12e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * See the License for the specific language governing permissions and 14e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * limitations under the License. 15e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani */ 16e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 17e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani//#define LOG_NDEBUG 0 18e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define LOG_TAG "SoftAVCDec" 19e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#include <utils/Log.h> 20e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 21e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#include "ih264_typedefs.h" 22e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#include "iv.h" 23e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#include "ivd.h" 24e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#include "ih264d.h" 25e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#include "SoftAVCDec.h" 26e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 27e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#include <media/stagefright/foundation/ADebug.h> 28e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#include <media/stagefright/MediaDefs.h> 29e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#include <OMX_VideoExt.h> 30f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen#include <inttypes.h> 31e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 32e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhaninamespace android { 33e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 34e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define componentName "video_decoder.avc" 35e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define codingType OMX_VIDEO_CodingAVC 36e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define CODEC_MIME_TYPE MEDIA_MIMETYPE_VIDEO_AVC 37e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 38e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani/** Function and structure definitions to keep code similar for each codec */ 39e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define ivdec_api_function ih264d_api_function 404d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar#define ivdext_create_ip_t ih264d_create_ip_t 414d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar#define ivdext_create_op_t ih264d_create_op_t 424d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar#define ivdext_delete_ip_t ih264d_delete_ip_t 434d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar#define ivdext_delete_op_t ih264d_delete_op_t 44e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define ivdext_ctl_set_num_cores_ip_t ih264d_ctl_set_num_cores_ip_t 45e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define ivdext_ctl_set_num_cores_op_t ih264d_ctl_set_num_cores_op_t 46e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 47e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define IVDEXT_CMD_CTL_SET_NUM_CORES \ 48e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_SET_NUM_CORES 49e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 50e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatic const CodecProfileLevel kProfileLevels[] = { 51e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel52 }, 52e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 53e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani { OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel52 }, 54e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 55e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani { OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel52 }, 56e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}; 57e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 58e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama AvadhaniSoftAVC::SoftAVC( 59e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani const char *name, 60e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani const OMX_CALLBACKTYPE *callbacks, 61e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani OMX_PTR appData, 62e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani OMX_COMPONENTTYPE **component) 63e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani : SoftVideoDecoderOMXComponent( 64e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani name, componentName, codingType, 65e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani kProfileLevels, ARRAY_SIZE(kProfileLevels), 66e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 320 /* width */, 240 /* height */, callbacks, 67e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani appData, component), 6890599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S mCodecCtx(NULL), 69e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mFlushOutBuffer(NULL), 70e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mOmxColorFormat(OMX_COLOR_FormatYUV420Planar), 71e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mIvColorFormat(IV_YUV_420P), 7290599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S mChangingResolution(false), 734d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar mSignalledError(false), 74dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar mStride(mWidth), 75dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar mInputOffset(0){ 76e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani initPorts( 77a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang 1 /* numMinInputBuffers */, kNumBuffers, INPUT_BUF_SIZE, 78a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang 1 /* numMinOutputBuffers */, kNumBuffers, CODEC_MIME_TYPE); 79e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 80f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen mTimeStart = mTimeEnd = systemTime(); 81e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 82e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani // If input dump is enabled, then open create an empty file 83e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani GENERATE_FILE_NAMES(); 84e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani CREATE_DUMP_FILE(mInFile); 85e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 86e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 87e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama AvadhaniSoftAVC::~SoftAVC() { 88e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani CHECK_EQ(deInitDecoder(), (status_t)OK); 89e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 90e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 914d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakarstatic void *ivd_aligned_malloc(void *ctxt, WORD32 alignment, WORD32 size) { 924d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar UNUSED(ctxt); 934d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar return memalign(alignment, size); 944d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar} 954d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 964d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakarstatic void ivd_aligned_free(void *ctxt, void *buf) { 974d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar UNUSED(ctxt); 984d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar free(buf); 994d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar return; 1004d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar} 1014d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 102e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatic size_t GetCPUCoreCount() { 103e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani long cpuCoreCount = 1; 104e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#if defined(_SC_NPROCESSORS_ONLN) 105e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN); 106e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#else 107e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani // _SC_NPROC_ONLN must be defined... 108e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani cpuCoreCount = sysconf(_SC_NPROC_ONLN); 109e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#endif 110e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani CHECK(cpuCoreCount >= 1); 1114d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar ALOGV("Number of CPU cores: %ld", cpuCoreCount); 112e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return (size_t)cpuCoreCount; 113e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 114e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 115e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanivoid SoftAVC::logVersion() { 116e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_ctl_getversioninfo_ip_t s_ctl_ip; 117e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_ctl_getversioninfo_op_t s_ctl_op; 118e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani UWORD8 au1_buf[512]; 119e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani IV_API_CALL_STATUS_T status; 120e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 121e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; 122e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETVERSION; 123e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.u4_size = sizeof(ivd_ctl_getversioninfo_ip_t); 124e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_op.u4_size = sizeof(ivd_ctl_getversioninfo_op_t); 125e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.pv_version_buffer = au1_buf; 126e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.u4_version_buffer_size = sizeof(au1_buf); 127e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 128e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani status = 129e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op); 130e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 131e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (status != IV_SUCCESS) { 132e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ALOGE("Error in getting version number: 0x%x", 133e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_op.u4_error_code); 134e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } else { 135e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ALOGV("Ittiam decoder version number: %s", 136e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani (char *)s_ctl_ip.pv_version_buffer); 137e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 138e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return; 139e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 140e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 141e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::setParams(size_t stride) { 142e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_ctl_set_config_ip_t s_ctl_ip; 143e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_ctl_set_config_op_t s_ctl_op; 144e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani IV_API_CALL_STATUS_T status; 145e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.u4_disp_wd = (UWORD32)stride; 146e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_frm_skip_mode = IVD_SKIP_NONE; 147e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 148e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT; 149e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_vid_dec_mode = IVD_DECODE_FRAME; 150e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; 151e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS; 152e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.u4_size = sizeof(ivd_ctl_set_config_ip_t); 153e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_op.u4_size = sizeof(ivd_ctl_set_config_op_t); 154e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 155ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("Set the run-time (dynamic) parameters stride = %zu", stride); 156e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op); 157e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 158e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (status != IV_SUCCESS) { 159e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ALOGE("Error in setting the run-time parameters: 0x%x", 160e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_op.u4_error_code); 161e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 162e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return UNKNOWN_ERROR; 163e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 164e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return OK; 165e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 166e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 167e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::resetPlugin() { 168e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mIsInFlush = false; 169e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mReceivedEOS = false; 170dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar mInputOffset = 0; 171e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani memset(mTimeStamps, 0, sizeof(mTimeStamps)); 172e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani memset(mTimeStampsValid, 0, sizeof(mTimeStampsValid)); 173e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 174e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Initialize both start and end times */ 175f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen mTimeStart = mTimeEnd = systemTime(); 176e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 177e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return OK; 178e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 179e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 180e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::resetDecoder() { 181e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_ctl_reset_ip_t s_ctl_ip; 182e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_ctl_reset_op_t s_ctl_op; 183e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani IV_API_CALL_STATUS_T status; 184e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 185e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; 186e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_RESET; 187e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.u4_size = sizeof(ivd_ctl_reset_ip_t); 188e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_op.u4_size = sizeof(ivd_ctl_reset_op_t); 189e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 190e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op); 191e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (IV_SUCCESS != status) { 192e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ALOGE("Error in reset: 0x%x", s_ctl_op.u4_error_code); 193e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return UNKNOWN_ERROR; 194e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 19590599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S mSignalledError = false; 196e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 197e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Set number of cores/threads to be used by the codec */ 198e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani setNumCores(); 199e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 2004d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar mStride = 0; 201e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return OK; 202e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 203e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 204e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::setNumCores() { 205e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivdext_ctl_set_num_cores_ip_t s_set_cores_ip; 206e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivdext_ctl_set_num_cores_op_t s_set_cores_op; 207e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani IV_API_CALL_STATUS_T status; 208e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_set_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL; 209e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_set_cores_ip.e_sub_cmd = IVDEXT_CMD_CTL_SET_NUM_CORES; 210e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_set_cores_ip.u4_num_cores = MIN(mNumCores, CODEC_MAX_NUM_CORES); 211e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_set_cores_ip.u4_size = sizeof(ivdext_ctl_set_num_cores_ip_t); 212e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_set_cores_op.u4_size = sizeof(ivdext_ctl_set_num_cores_op_t); 213e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani status = ivdec_api_function( 214e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mCodecCtx, (void *)&s_set_cores_ip, (void *)&s_set_cores_op); 215e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (IV_SUCCESS != status) { 216e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ALOGE("Error in setting number of cores: 0x%x", 217e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_set_cores_op.u4_error_code); 218e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return UNKNOWN_ERROR; 219e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 220e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return OK; 221e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 222e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 223e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::setFlushMode() { 224e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani IV_API_CALL_STATUS_T status; 225e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_ctl_flush_ip_t s_video_flush_ip; 226e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_ctl_flush_op_t s_video_flush_op; 227e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 228e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_video_flush_ip.e_cmd = IVD_CMD_VIDEO_CTL; 229e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_video_flush_ip.e_sub_cmd = IVD_CMD_CTL_FLUSH; 230e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_video_flush_ip.u4_size = sizeof(ivd_ctl_flush_ip_t); 231e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_video_flush_op.u4_size = sizeof(ivd_ctl_flush_op_t); 232e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 233e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Set the decoder in Flush mode, subsequent decode() calls will flush */ 234e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani status = ivdec_api_function( 235e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mCodecCtx, (void *)&s_video_flush_ip, (void *)&s_video_flush_op); 236e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 237e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (status != IV_SUCCESS) { 238e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ALOGE("Error in setting the decoder in flush mode: (%d) 0x%x", status, 239e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_video_flush_op.u4_error_code); 240e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return UNKNOWN_ERROR; 241e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 242e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 243e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mIsInFlush = true; 244e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return OK; 245e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 246e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 2474d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakarstatus_t SoftAVC::initDecoder() { 248e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani IV_API_CALL_STATUS_T status; 249e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 250e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mNumCores = GetCPUCoreCount(); 25190599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S mCodecCtx = NULL; 252e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 2534d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar mStride = outputBufferWidth(); 254e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 255e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Initialize the decoder */ 256e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani { 2574d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar ivdext_create_ip_t s_create_ip; 2584d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar ivdext_create_op_t s_create_op; 259e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 260e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani void *dec_fxns = (void *)ivdec_api_function; 261e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 2624d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_ip.s_ivd_create_ip_t.u4_size = sizeof(ivdext_create_ip_t); 2634d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_ip.s_ivd_create_ip_t.e_cmd = IVD_CMD_CREATE; 2644d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_ip.s_ivd_create_ip_t.u4_share_disp_buf = 0; 2654d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_op.s_ivd_create_op_t.u4_size = sizeof(ivdext_create_op_t); 2664d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_ip.s_ivd_create_ip_t.e_output_format = mIvColorFormat; 2674d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_ip.s_ivd_create_ip_t.pf_aligned_alloc = ivd_aligned_malloc; 2684d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_ip.s_ivd_create_ip_t.pf_aligned_free = ivd_aligned_free; 2694d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_ip.s_ivd_create_ip_t.pv_mem_ctxt = NULL; 270e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 2714d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar status = ivdec_api_function(mCodecCtx, (void *)&s_create_ip, (void *)&s_create_op); 272e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 2734d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar mCodecCtx = (iv_obj_t*)s_create_op.s_ivd_create_op_t.pv_handle; 274e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mCodecCtx->pv_fxns = dec_fxns; 275e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mCodecCtx->u4_size = sizeof(iv_obj_t); 276e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 277e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (status != IV_SUCCESS) { 2784d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar ALOGE("Error in create: 0x%x", 2794d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_op.s_ivd_create_op_t.u4_error_code); 2804d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar deInitDecoder(); 28190599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S mCodecCtx = NULL; 282e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return UNKNOWN_ERROR; 283e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 284e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 285e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 286e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Reset the plugin state */ 287e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani resetPlugin(); 288e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 289e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Set the run time (dynamic) parameters */ 2904d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar setParams(mStride); 291e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 292e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Set number of cores/threads to be used by the codec */ 293e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani setNumCores(); 294e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 295e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Get codec version */ 296e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani logVersion(); 297e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 298e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mFlushNeeded = false; 299e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return OK; 300e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 301e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 302e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::deInitDecoder() { 303e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani size_t i; 3044d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar IV_API_CALL_STATUS_T status; 305e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 3064d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar if (mCodecCtx) { 3074d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar ivdext_delete_ip_t s_delete_ip; 3084d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar ivdext_delete_op_t s_delete_op; 309e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 3104d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_delete_ip.s_ivd_delete_ip_t.u4_size = sizeof(ivdext_delete_ip_t); 3114d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_delete_ip.s_ivd_delete_ip_t.e_cmd = IVD_CMD_DELETE; 3124d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 3134d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_delete_op.s_ivd_delete_op_t.u4_size = sizeof(ivdext_delete_op_t); 3144d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 3154d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar status = ivdec_api_function(mCodecCtx, (void *)&s_delete_ip, (void *)&s_delete_op); 3164d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar if (status != IV_SUCCESS) { 3174d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar ALOGE("Error in delete: 0x%x", 3184d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_delete_op.s_ivd_delete_op_t.u4_error_code); 3194d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar return UNKNOWN_ERROR; 320e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 321e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 322e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 323e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 324e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mChangingResolution = false; 325e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 326e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return OK; 327e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 328e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 329e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanivoid SoftAVC::onReset() { 330e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani SoftVideoDecoderOMXComponent::onReset(); 331e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 33290599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S mSignalledError = false; 333e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani resetDecoder(); 334e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani resetPlugin(); 335e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 336e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 337c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuangbool SoftAVC::getVUIParams() { 338c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang IV_API_CALL_STATUS_T status; 339c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang ih264d_ctl_get_vui_params_ip_t s_ctl_get_vui_params_ip; 340c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang ih264d_ctl_get_vui_params_op_t s_ctl_get_vui_params_op; 341c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 342c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang s_ctl_get_vui_params_ip.e_cmd = IVD_CMD_VIDEO_CTL; 343c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang s_ctl_get_vui_params_ip.e_sub_cmd = 344c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_GET_VUI_PARAMS; 345c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 346c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang s_ctl_get_vui_params_ip.u4_size = 347c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang sizeof(ih264d_ctl_get_vui_params_ip_t); 348c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 349c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang s_ctl_get_vui_params_op.u4_size = sizeof(ih264d_ctl_get_vui_params_op_t); 350c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 351c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang status = ivdec_api_function( 352c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang (iv_obj_t *)mCodecCtx, (void *)&s_ctl_get_vui_params_ip, 353c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang (void *)&s_ctl_get_vui_params_op); 354c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 355c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang if (status != IV_SUCCESS) { 356c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang ALOGW("Error in getting VUI params: 0x%x", 357c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang s_ctl_get_vui_params_op.u4_error_code); 358c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang return false; 359c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang } 360c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 361c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang int32_t primaries = s_ctl_get_vui_params_op.u1_colour_primaries; 362c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang int32_t transfer = s_ctl_get_vui_params_op.u1_tfr_chars; 363c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang int32_t coeffs = s_ctl_get_vui_params_op.u1_matrix_coeffs; 364c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang bool fullRange = s_ctl_get_vui_params_op.u1_video_full_range_flag; 365c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 366c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang ColorAspects colorAspects; 367c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang ColorUtils::convertIsoColorAspectsToCodecAspects( 368c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang primaries, transfer, coeffs, fullRange, colorAspects); 369c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 370c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // Update color aspects if necessary. 371c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang if (colorAspectsDiffer(colorAspects, mBitstreamColorAspects)) { 372c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang mBitstreamColorAspects = colorAspects; 373c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang status_t err = handleColorAspectsChange(); 374c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang CHECK(err == OK); 375c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang } 376c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang return true; 377c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang} 378c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 37987fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kimbool SoftAVC::setDecodeArgs( 380e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_video_decode_ip_t *ps_dec_ip, 381e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_video_decode_op_t *ps_dec_op, 382e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani OMX_BUFFERHEADERTYPE *inHeader, 383e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani OMX_BUFFERHEADERTYPE *outHeader, 384e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani size_t timeStampIx) { 385e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani size_t sizeY = outputBufferWidth() * outputBufferHeight(); 386e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani size_t sizeUV; 387e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 388e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->u4_size = sizeof(ivd_video_decode_ip_t); 389e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_op->u4_size = sizeof(ivd_video_decode_op_t); 390e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 391e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->e_cmd = IVD_CMD_VIDEO_DECODE; 392e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 393e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* When in flush and after EOS with zero byte input, 394e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * inHeader is set to zero. Hence check for non-null */ 395e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (inHeader) { 396e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->u4_ts = timeStampIx; 397e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->pv_stream_buffer = 398dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar inHeader->pBuffer + inHeader->nOffset + mInputOffset; 399dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar ps_dec_ip->u4_num_Bytes = inHeader->nFilledLen - mInputOffset; 400e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } else { 401e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->u4_ts = 0; 402e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->pv_stream_buffer = NULL; 403e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->u4_num_Bytes = 0; 404e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 405e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 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; 412e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (outHeader) { 41387fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim if (outHeader->nAllocLen < sizeY + (sizeUV * 2)) { 414ff64ea33382081f46d4b1061df00298bbbe3dd65Wonsik Kim android_errorWriteLog(0x534e4554, "27833616"); 41587fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim return false; 41687fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim } 417e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani pBuf = outHeader->pBuffer; 418e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } else { 41987fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim // mFlushOutBuffer always has the right size. 420e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani pBuf = mFlushOutBuffer; 421e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 422e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 423e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->s_out_buffer.pu1_bufs[0] = pBuf; 424e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->s_out_buffer.pu1_bufs[1] = pBuf + sizeY; 425e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->s_out_buffer.pu1_bufs[2] = pBuf + sizeY + sizeUV; 426e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->s_out_buffer.u4_num_bufs = 3; 42787fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim return true; 428e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 429e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanivoid SoftAVC::onPortFlushCompleted(OMX_U32 portIndex) { 430e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Once the output buffers are flushed, ignore any buffers that are held in decoder */ 431e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (kOutputPortIndex == portIndex) { 432e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani setFlushMode(); 433e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 4344d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar /* Allocate a picture buffer to flushed data */ 4354d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar uint32_t displayStride = outputBufferWidth(); 4364d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar uint32_t displayHeight = outputBufferHeight(); 4374d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 4384d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar uint32_t bufferSize = displayStride * displayHeight * 3 / 2; 4394d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar mFlushOutBuffer = (uint8_t *)memalign(128, bufferSize); 4404d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar if (NULL == mFlushOutBuffer) { 4412720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen ALOGE("Could not allocate flushOutputBuffer of size %u", bufferSize); 4424d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar return; 4434d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar } 4444d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 445e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani while (true) { 446e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_video_decode_ip_t s_dec_ip; 447e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_video_decode_op_t s_dec_op; 448e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani IV_API_CALL_STATUS_T status; 449e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani size_t sizeY, sizeUV; 450e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 451e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani setDecodeArgs(&s_dec_ip, &s_dec_op, NULL, NULL, 0); 452e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 453e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op); 454e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (0 == s_dec_op.u4_output_present) { 455e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani resetPlugin(); 456e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani break; 457e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 458e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 4594d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 4604d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar if (mFlushOutBuffer) { 4614d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar free(mFlushOutBuffer); 4624d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar mFlushOutBuffer = NULL; 4634d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar } 4644d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 465e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 466e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 467e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 468e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanivoid SoftAVC::onQueueFilled(OMX_U32 portIndex) { 469e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani UNUSED(portIndex); 470dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar OMX_BUFFERHEADERTYPE *inHeader = NULL; 471dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar BufferInfo *inInfo = NULL; 472e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 47390599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S if (mSignalledError) { 47490599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S return; 47590599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S } 476e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (mOutputPortSettingsChange != NONE) { 477e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return; 478e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 479e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 4804d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar if (NULL == mCodecCtx) { 4814d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar if (OK != initDecoder()) { 482c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar ALOGE("Failed to initialize decoder"); 483c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); 484c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar mSignalledError = true; 4854d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar return; 4864d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar } 4874d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar } 4884d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar if (outputBufferWidth() != mStride) { 4894d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar /* Set the run-time (dynamic) parameters */ 4904d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar mStride = outputBufferWidth(); 4914d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar setParams(mStride); 4924d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar } 4934d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 494e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani List<BufferInfo *> &inQueue = getPortQueue(kInputPortIndex); 495e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani List<BufferInfo *> &outQueue = getPortQueue(kOutputPortIndex); 496e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 497e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani while (!outQueue.empty()) { 498e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani BufferInfo *outInfo; 499e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani OMX_BUFFERHEADERTYPE *outHeader; 500dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar size_t timeStampIx = 0; 501e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 502dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar if (!mIsInFlush && (NULL == inHeader)) { 503e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (!inQueue.empty()) { 504e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inInfo = *inQueue.begin(); 505e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inHeader = inInfo->mHeader; 506fd866b3aa0d97375de08f8888b95669026c83361Wei Jia if (inHeader == NULL) { 507fd866b3aa0d97375de08f8888b95669026c83361Wei Jia inQueue.erase(inQueue.begin()); 508fd866b3aa0d97375de08f8888b95669026c83361Wei Jia inInfo->mOwnedByUs = false; 509fd866b3aa0d97375de08f8888b95669026c83361Wei Jia continue; 510fd866b3aa0d97375de08f8888b95669026c83361Wei Jia } 511e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } else { 512e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani break; 513e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 514e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 515e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 516e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outInfo = *outQueue.begin(); 517e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader = outInfo->mHeader; 518e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader->nFlags = 0; 519e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader->nTimeStamp = 0; 520e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader->nOffset = 0; 521e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 522fd866b3aa0d97375de08f8888b95669026c83361Wei Jia if (inHeader != NULL) { 523e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (inHeader->nFilledLen == 0) { 524e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inQueue.erase(inQueue.begin()); 525e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inInfo->mOwnedByUs = false; 526e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani notifyEmptyBufferDone(inHeader); 527fd866b3aa0d97375de08f8888b95669026c83361Wei Jia 528fd866b3aa0d97375de08f8888b95669026c83361Wei Jia if (!(inHeader->nFlags & OMX_BUFFERFLAG_EOS)) { 529fd866b3aa0d97375de08f8888b95669026c83361Wei Jia continue; 530fd866b3aa0d97375de08f8888b95669026c83361Wei Jia } 531fd866b3aa0d97375de08f8888b95669026c83361Wei Jia 532fd866b3aa0d97375de08f8888b95669026c83361Wei Jia mReceivedEOS = true; 533e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inHeader = NULL; 534e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani setFlushMode(); 535fd866b3aa0d97375de08f8888b95669026c83361Wei Jia } else if (inHeader->nFlags & OMX_BUFFERFLAG_EOS) { 536fd866b3aa0d97375de08f8888b95669026c83361Wei Jia mReceivedEOS = true; 537e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 538e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 539e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 540e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Get a free slot in timestamp array to hold input timestamp */ 541e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani { 542e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani size_t i; 543e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani timeStampIx = 0; 544e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani for (i = 0; i < MAX_TIME_STAMPS; i++) { 545e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (!mTimeStampsValid[i]) { 546e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani timeStampIx = i; 547e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani break; 548e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 549e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 550e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (inHeader != NULL) { 551e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mTimeStampsValid[timeStampIx] = true; 552e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mTimeStamps[timeStampIx] = inHeader->nTimeStamp; 553e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 554e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 555e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 556e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani { 557e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_video_decode_ip_t s_dec_ip; 558e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_video_decode_op_t s_dec_op; 559f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen nsecs_t timeDelay, timeTaken; 560e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani size_t sizeY, sizeUV; 561e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 56287fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim if (!setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx)) { 56387fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ALOGE("Decoder arg setup failed"); 56487fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL); 56587fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim mSignalledError = true; 56687fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim return; 56787fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim } 568e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani // If input dump is enabled, then write to file 569dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar DUMP_TO_FILE(mInFile, s_dec_ip.pv_stream_buffer, s_dec_ip.u4_num_Bytes, mInputOffset); 570e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 571f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen mTimeStart = systemTime(); 572e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Compute time elapsed between end of previous decode() 573e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * to start of current decode() */ 574f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen timeDelay = mTimeStart - mTimeEnd; 575e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 576e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani IV_API_CALL_STATUS_T status; 577e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op); 578e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 57999e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar bool unsupportedResolution = 58099e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar (IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED == (s_dec_op.u4_error_code & 0xFF)); 58199e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar 58299e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar /* Check for unsupported dimensions */ 58399e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar if (unsupportedResolution) { 58499e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar ALOGE("Unsupported resolution : %dx%d", mWidth, mHeight); 58599e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); 58699e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar mSignalledError = true; 58799e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar return; 58899e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar } 58999e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar 590c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar bool allocationFailed = (IVD_MEM_ALLOC_FAILED == (s_dec_op.u4_error_code & 0xFF)); 591c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar if (allocationFailed) { 592c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar ALOGE("Allocation failure in decoder"); 593c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); 594c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar mSignalledError = true; 595c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar return; 596c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar } 597c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar 598e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani bool resChanged = (IVD_RES_CHANGED == (s_dec_op.u4_error_code & 0xFF)); 599e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 600c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang getVUIParams(); 601c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 602f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen mTimeEnd = systemTime(); 603e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Compute time taken for decode() */ 604f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen timeTaken = mTimeEnd - mTimeStart; 605e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 606f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen ALOGV("timeTaken=%6lldus delay=%6lldus numBytes=%6d", 607f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen (long long) (timeTaken / 1000ll), (long long) (timeDelay / 1000ll), 608e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_dec_op.u4_num_bytes_consumed); 609e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (s_dec_op.u4_frame_decoded_flag && !mFlushNeeded) { 610e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mFlushNeeded = true; 611e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 612e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 613e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if ((inHeader != NULL) && (1 != s_dec_op.u4_frame_decoded_flag)) { 614e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* If the input did not contain picture data, then ignore 615e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * the associated timestamp */ 616e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mTimeStampsValid[timeStampIx] = false; 617e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 618e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 619e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani // If the decoder is in the changing resolution mode and there is no output present, 620e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani // that means the switching is done and it's ready to reset the decoder and the plugin. 621e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (mChangingResolution && !s_dec_op.u4_output_present) { 622e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mChangingResolution = false; 623e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani resetDecoder(); 624e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani resetPlugin(); 625a34a5cca7791d80bdbfe0ef9659e1f991ad23e78Harish Mahendrakar mStride = outputBufferWidth(); 626a34a5cca7791d80bdbfe0ef9659e1f991ad23e78Harish Mahendrakar setParams(mStride); 627e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani continue; 628e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 629e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 6304d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar if (resChanged) { 631e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mChangingResolution = true; 632e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (mFlushNeeded) { 633e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani setFlushMode(); 634e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 63511aaefb57fdd0076eb5484c3c5bd3bff5f6cb5e0Marco Nelissen continue; 63611aaefb57fdd0076eb5484c3c5bd3bff5f6cb5e0Marco Nelissen } 63711aaefb57fdd0076eb5484c3c5bd3bff5f6cb5e0Marco Nelissen 638c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // Combine the resolution change and coloraspects change in one PortSettingChange event 639c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // if necessary. 640e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if ((0 < s_dec_op.u4_pic_wd) && (0 < s_dec_op.u4_pic_ht)) { 641e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani uint32_t width = s_dec_op.u4_pic_wd; 642e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani uint32_t height = s_dec_op.u4_pic_ht; 643e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani bool portWillReset = false; 644e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani handlePortSettingsChange(&portWillReset, width, height); 645e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (portWillReset) { 646e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani resetDecoder(); 6478437f4e9094567affaa72ba7bfab654e12e78399Ram Mohan M resetPlugin(); 648e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return; 649e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 650c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang } else if (mUpdateColorAspects) { 651c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang notify(OMX_EventPortSettingsChanged, kOutputPortIndex, 652c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang kDescribeColorAspectsIndex, NULL); 653c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang mUpdateColorAspects = false; 654c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang return; 655e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 656e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 657e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (s_dec_op.u4_output_present) { 6583ecc9db40b1fb9c7f807a5892e5c9625aac1fb06Marco Nelissen outHeader->nFilledLen = (outputBufferWidth() * outputBufferHeight() * 3) / 2; 659e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 660e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader->nTimeStamp = mTimeStamps[s_dec_op.u4_ts]; 661e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mTimeStampsValid[s_dec_op.u4_ts] = false; 662e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 663e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outInfo->mOwnedByUs = false; 664e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outQueue.erase(outQueue.begin()); 665e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outInfo = NULL; 666e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani notifyFillBufferDone(outHeader); 667e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader = NULL; 668d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar } else if (mIsInFlush) { 669e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* If in flush mode and no output is returned by the codec, 670e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * then come out of flush mode */ 671e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mIsInFlush = false; 672e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 673e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* If EOS was recieved on input port and there is no output 674e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * from the codec, then signal EOS on output port */ 675e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (mReceivedEOS) { 676e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader->nFilledLen = 0; 677e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader->nFlags |= OMX_BUFFERFLAG_EOS; 678e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 679e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outInfo->mOwnedByUs = false; 680e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outQueue.erase(outQueue.begin()); 681e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outInfo = NULL; 682e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani notifyFillBufferDone(outHeader); 683e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader = NULL; 684e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani resetPlugin(); 685e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 686e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 687dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar mInputOffset += s_dec_op.u4_num_bytes_consumed; 688e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 689dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar // If more than 4 bytes are remaining in input, then do not release it 690dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar if (inHeader != NULL && ((inHeader->nFilledLen - mInputOffset) <= 4)) { 691e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inInfo->mOwnedByUs = false; 692e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inQueue.erase(inQueue.begin()); 693e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inInfo = NULL; 694e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani notifyEmptyBufferDone(inHeader); 695e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inHeader = NULL; 696dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar mInputOffset = 0; 697dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar 698dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar /* If input EOS is seen and decoder is not in flush mode, 699dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar * set the decoder in flush mode. 700dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar * There can be a case where EOS is sent along with last picture data 701dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar * In that case, only after decoding that input data, decoder has to be 702dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar * put in flush. This case is handled here */ 703dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar 704dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar if (mReceivedEOS && !mIsInFlush) { 705dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar setFlushMode(); 706dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar } 707e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 708e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 709e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 710e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 711c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuangint SoftAVC::getColorAspectPreference() { 712c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang return kPreferBitstream; 713c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang} 714c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 715e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} // namespace android 716e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 717e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhaniandroid::SoftOMXComponent *createSoftOMXComponent( 718e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani const char *name, const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData, 719e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani OMX_COMPONENTTYPE **component) { 720e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return new android::SoftAVC(name, callbacks, appData, component); 721e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 722