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[] = { 5105e712d3be03291627eb40e9c7f6c08a9874bd23Lajos Molnar { OMX_VIDEO_AVCProfileConstrainedBaseline, OMX_VIDEO_AVCLevel52 }, 5205e712d3be03291627eb40e9c7f6c08a9874bd23Lajos Molnar 53e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel52 }, 54e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 55e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani { OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel52 }, 56e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 5705e712d3be03291627eb40e9c7f6c08a9874bd23Lajos Molnar { OMX_VIDEO_AVCProfileConstrainedHigh, OMX_VIDEO_AVCLevel52 }, 5805e712d3be03291627eb40e9c7f6c08a9874bd23Lajos Molnar 59e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani { OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel52 }, 60e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}; 61e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 62e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama AvadhaniSoftAVC::SoftAVC( 63e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani const char *name, 64e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani const OMX_CALLBACKTYPE *callbacks, 65e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani OMX_PTR appData, 66e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani OMX_COMPONENTTYPE **component) 67e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani : SoftVideoDecoderOMXComponent( 68e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani name, componentName, codingType, 69e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani kProfileLevels, ARRAY_SIZE(kProfileLevels), 70e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 320 /* width */, 240 /* height */, callbacks, 71e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani appData, component), 7290599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S mCodecCtx(NULL), 73e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mFlushOutBuffer(NULL), 74e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mOmxColorFormat(OMX_COLOR_FormatYUV420Planar), 75e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mIvColorFormat(IV_YUV_420P), 7690599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S mChangingResolution(false), 774d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar mSignalledError(false), 78dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar mStride(mWidth), 79dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar mInputOffset(0){ 80e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani initPorts( 81a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang 1 /* numMinInputBuffers */, kNumBuffers, INPUT_BUF_SIZE, 82a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang 1 /* numMinOutputBuffers */, kNumBuffers, CODEC_MIME_TYPE); 83e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 84f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen mTimeStart = mTimeEnd = systemTime(); 85e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 86e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani // If input dump is enabled, then open create an empty file 87e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani GENERATE_FILE_NAMES(); 88e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani CREATE_DUMP_FILE(mInFile); 89e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 90e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 91e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama AvadhaniSoftAVC::~SoftAVC() { 92e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani CHECK_EQ(deInitDecoder(), (status_t)OK); 93e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 94e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 954d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakarstatic void *ivd_aligned_malloc(void *ctxt, WORD32 alignment, WORD32 size) { 964d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar UNUSED(ctxt); 974d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar return memalign(alignment, size); 984d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar} 994d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 1004d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakarstatic void ivd_aligned_free(void *ctxt, void *buf) { 1014d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar UNUSED(ctxt); 1024d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar free(buf); 1034d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar return; 1044d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar} 1054d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 106e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatic size_t GetCPUCoreCount() { 107e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani long cpuCoreCount = 1; 108e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#if defined(_SC_NPROCESSORS_ONLN) 109e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN); 110e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#else 111e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani // _SC_NPROC_ONLN must be defined... 112e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani cpuCoreCount = sysconf(_SC_NPROC_ONLN); 113e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#endif 114e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani CHECK(cpuCoreCount >= 1); 1154d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar ALOGV("Number of CPU cores: %ld", cpuCoreCount); 116e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return (size_t)cpuCoreCount; 117e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 118e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 119e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanivoid SoftAVC::logVersion() { 120e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_ctl_getversioninfo_ip_t s_ctl_ip; 121e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_ctl_getversioninfo_op_t s_ctl_op; 122e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani UWORD8 au1_buf[512]; 123e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani IV_API_CALL_STATUS_T status; 124e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 125e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; 126e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETVERSION; 127e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.u4_size = sizeof(ivd_ctl_getversioninfo_ip_t); 128e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_op.u4_size = sizeof(ivd_ctl_getversioninfo_op_t); 129e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.pv_version_buffer = au1_buf; 130e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.u4_version_buffer_size = sizeof(au1_buf); 131e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 132e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani status = 133e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op); 134e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 135e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (status != IV_SUCCESS) { 136e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ALOGE("Error in getting version number: 0x%x", 137e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_op.u4_error_code); 138e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } else { 139e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ALOGV("Ittiam decoder version number: %s", 140e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani (char *)s_ctl_ip.pv_version_buffer); 141e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 142e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return; 143e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 144e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 145e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::setParams(size_t stride) { 146e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_ctl_set_config_ip_t s_ctl_ip; 147e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_ctl_set_config_op_t s_ctl_op; 148e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani IV_API_CALL_STATUS_T status; 149e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.u4_disp_wd = (UWORD32)stride; 150e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_frm_skip_mode = IVD_SKIP_NONE; 151e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 152e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT; 153e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_vid_dec_mode = IVD_DECODE_FRAME; 154e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; 155e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS; 156e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.u4_size = sizeof(ivd_ctl_set_config_ip_t); 157e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_op.u4_size = sizeof(ivd_ctl_set_config_op_t); 158e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 159ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("Set the run-time (dynamic) parameters stride = %zu", stride); 160e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op); 161e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 162e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (status != IV_SUCCESS) { 163e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ALOGE("Error in setting the run-time parameters: 0x%x", 164e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_op.u4_error_code); 165e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 166e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return UNKNOWN_ERROR; 167e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 168e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return OK; 169e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 170e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 171e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::resetPlugin() { 172e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mIsInFlush = false; 173e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mReceivedEOS = false; 174dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar mInputOffset = 0; 175e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani memset(mTimeStamps, 0, sizeof(mTimeStamps)); 176e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani memset(mTimeStampsValid, 0, sizeof(mTimeStampsValid)); 177e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 178e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Initialize both start and end times */ 179f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen mTimeStart = mTimeEnd = systemTime(); 180e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 181e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return OK; 182e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 183e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 184e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::resetDecoder() { 185e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_ctl_reset_ip_t s_ctl_ip; 186e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_ctl_reset_op_t s_ctl_op; 187e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani IV_API_CALL_STATUS_T status; 188e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 189e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; 190e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_RESET; 191e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_ip.u4_size = sizeof(ivd_ctl_reset_ip_t); 192e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_ctl_op.u4_size = sizeof(ivd_ctl_reset_op_t); 193e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 194e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op); 195e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (IV_SUCCESS != status) { 196e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ALOGE("Error in reset: 0x%x", s_ctl_op.u4_error_code); 197e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return UNKNOWN_ERROR; 198e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 19990599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S mSignalledError = false; 200e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 201e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Set number of cores/threads to be used by the codec */ 202e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani setNumCores(); 203e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 2044d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar mStride = 0; 205e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return OK; 206e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 207e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 208e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::setNumCores() { 209e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivdext_ctl_set_num_cores_ip_t s_set_cores_ip; 210e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivdext_ctl_set_num_cores_op_t s_set_cores_op; 211e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani IV_API_CALL_STATUS_T status; 212e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_set_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL; 213e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_set_cores_ip.e_sub_cmd = IVDEXT_CMD_CTL_SET_NUM_CORES; 214e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_set_cores_ip.u4_num_cores = MIN(mNumCores, CODEC_MAX_NUM_CORES); 215e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_set_cores_ip.u4_size = sizeof(ivdext_ctl_set_num_cores_ip_t); 216e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_set_cores_op.u4_size = sizeof(ivdext_ctl_set_num_cores_op_t); 217e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani status = ivdec_api_function( 218e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mCodecCtx, (void *)&s_set_cores_ip, (void *)&s_set_cores_op); 219e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (IV_SUCCESS != status) { 220e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ALOGE("Error in setting number of cores: 0x%x", 221e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_set_cores_op.u4_error_code); 222e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return UNKNOWN_ERROR; 223e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 224e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return OK; 225e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 226e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 227e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::setFlushMode() { 228e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani IV_API_CALL_STATUS_T status; 229e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_ctl_flush_ip_t s_video_flush_ip; 230e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_ctl_flush_op_t s_video_flush_op; 231e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 232e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_video_flush_ip.e_cmd = IVD_CMD_VIDEO_CTL; 233e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_video_flush_ip.e_sub_cmd = IVD_CMD_CTL_FLUSH; 234e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_video_flush_ip.u4_size = sizeof(ivd_ctl_flush_ip_t); 235e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_video_flush_op.u4_size = sizeof(ivd_ctl_flush_op_t); 236e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 237e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Set the decoder in Flush mode, subsequent decode() calls will flush */ 238e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani status = ivdec_api_function( 239e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mCodecCtx, (void *)&s_video_flush_ip, (void *)&s_video_flush_op); 240e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 241e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (status != IV_SUCCESS) { 242e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ALOGE("Error in setting the decoder in flush mode: (%d) 0x%x", status, 243e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_video_flush_op.u4_error_code); 244e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return UNKNOWN_ERROR; 245e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 246e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 247e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mIsInFlush = true; 248e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return OK; 249e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 250e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 2514d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakarstatus_t SoftAVC::initDecoder() { 252e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani IV_API_CALL_STATUS_T status; 253e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 254e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mNumCores = GetCPUCoreCount(); 25590599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S mCodecCtx = NULL; 256e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 2574d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar mStride = outputBufferWidth(); 258e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 259e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Initialize the decoder */ 260e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani { 2614d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar ivdext_create_ip_t s_create_ip; 2624d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar ivdext_create_op_t s_create_op; 263e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 264e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani void *dec_fxns = (void *)ivdec_api_function; 265e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 2664d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_ip.s_ivd_create_ip_t.u4_size = sizeof(ivdext_create_ip_t); 2674d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_ip.s_ivd_create_ip_t.e_cmd = IVD_CMD_CREATE; 2684d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_ip.s_ivd_create_ip_t.u4_share_disp_buf = 0; 2694d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_op.s_ivd_create_op_t.u4_size = sizeof(ivdext_create_op_t); 2704d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_ip.s_ivd_create_ip_t.e_output_format = mIvColorFormat; 2714d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_ip.s_ivd_create_ip_t.pf_aligned_alloc = ivd_aligned_malloc; 2724d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_ip.s_ivd_create_ip_t.pf_aligned_free = ivd_aligned_free; 2734d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_create_ip.s_ivd_create_ip_t.pv_mem_ctxt = NULL; 274e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 2754d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar status = ivdec_api_function(mCodecCtx, (void *)&s_create_ip, (void *)&s_create_op); 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 } 284646a18fef28d19ba5beb6a2e1c00ac4c2663a10bNaveen Kumar P 285646a18fef28d19ba5beb6a2e1c00ac4c2663a10bNaveen Kumar P mCodecCtx = (iv_obj_t*)s_create_op.s_ivd_create_op_t.pv_handle; 286646a18fef28d19ba5beb6a2e1c00ac4c2663a10bNaveen Kumar P mCodecCtx->pv_fxns = dec_fxns; 287646a18fef28d19ba5beb6a2e1c00ac4c2663a10bNaveen Kumar P mCodecCtx->u4_size = sizeof(iv_obj_t); 288e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 289e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 290e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Reset the plugin state */ 291e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani resetPlugin(); 292e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 293e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Set the run time (dynamic) parameters */ 2944d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar setParams(mStride); 295e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 296e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Set number of cores/threads to be used by the codec */ 297e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani setNumCores(); 298e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 299e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Get codec version */ 300e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani logVersion(); 301e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 302e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mFlushNeeded = false; 303e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return OK; 304e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 305e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 306e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::deInitDecoder() { 307e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani size_t i; 3084d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar IV_API_CALL_STATUS_T status; 309e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 3104d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar if (mCodecCtx) { 3114d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar ivdext_delete_ip_t s_delete_ip; 3124d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar ivdext_delete_op_t s_delete_op; 313e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 3144d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_delete_ip.s_ivd_delete_ip_t.u4_size = sizeof(ivdext_delete_ip_t); 3154d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_delete_ip.s_ivd_delete_ip_t.e_cmd = IVD_CMD_DELETE; 3164d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 3174d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_delete_op.s_ivd_delete_op_t.u4_size = sizeof(ivdext_delete_op_t); 3184d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 3194d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar status = ivdec_api_function(mCodecCtx, (void *)&s_delete_ip, (void *)&s_delete_op); 3204d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar if (status != IV_SUCCESS) { 3214d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar ALOGE("Error in delete: 0x%x", 3224d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar s_delete_op.s_ivd_delete_op_t.u4_error_code); 3234d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar return UNKNOWN_ERROR; 324e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 325e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 326e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 327e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 328e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mChangingResolution = false; 329e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 330e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return OK; 331e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 332e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 333e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanivoid SoftAVC::onReset() { 334e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani SoftVideoDecoderOMXComponent::onReset(); 335e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 33690599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S mSignalledError = false; 337e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani resetDecoder(); 338e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani resetPlugin(); 339e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 340e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 341c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuangbool SoftAVC::getVUIParams() { 342c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang IV_API_CALL_STATUS_T status; 343c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang ih264d_ctl_get_vui_params_ip_t s_ctl_get_vui_params_ip; 344c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang ih264d_ctl_get_vui_params_op_t s_ctl_get_vui_params_op; 345c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 346c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang s_ctl_get_vui_params_ip.e_cmd = IVD_CMD_VIDEO_CTL; 347c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang s_ctl_get_vui_params_ip.e_sub_cmd = 348c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_GET_VUI_PARAMS; 349c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 350c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang s_ctl_get_vui_params_ip.u4_size = 351c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang sizeof(ih264d_ctl_get_vui_params_ip_t); 352c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 353c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang s_ctl_get_vui_params_op.u4_size = sizeof(ih264d_ctl_get_vui_params_op_t); 354c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 355c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang status = ivdec_api_function( 356c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang (iv_obj_t *)mCodecCtx, (void *)&s_ctl_get_vui_params_ip, 357c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang (void *)&s_ctl_get_vui_params_op); 358c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 359c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang if (status != IV_SUCCESS) { 360c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang ALOGW("Error in getting VUI params: 0x%x", 361c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang s_ctl_get_vui_params_op.u4_error_code); 362c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang return false; 363c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang } 364c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 365c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang int32_t primaries = s_ctl_get_vui_params_op.u1_colour_primaries; 366c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang int32_t transfer = s_ctl_get_vui_params_op.u1_tfr_chars; 367c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang int32_t coeffs = s_ctl_get_vui_params_op.u1_matrix_coeffs; 368c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang bool fullRange = s_ctl_get_vui_params_op.u1_video_full_range_flag; 369c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 370c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang ColorAspects colorAspects; 371c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang ColorUtils::convertIsoColorAspectsToCodecAspects( 372c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang primaries, transfer, coeffs, fullRange, colorAspects); 373c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 374c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // Update color aspects if necessary. 375c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang if (colorAspectsDiffer(colorAspects, mBitstreamColorAspects)) { 376c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang mBitstreamColorAspects = colorAspects; 377c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang status_t err = handleColorAspectsChange(); 378c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang CHECK(err == OK); 379c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang } 380c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang return true; 381c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang} 382c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 38387fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kimbool SoftAVC::setDecodeArgs( 384e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_video_decode_ip_t *ps_dec_ip, 385e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_video_decode_op_t *ps_dec_op, 386e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani OMX_BUFFERHEADERTYPE *inHeader, 387e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani OMX_BUFFERHEADERTYPE *outHeader, 388e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani size_t timeStampIx) { 389e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani size_t sizeY = outputBufferWidth() * outputBufferHeight(); 390e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani size_t sizeUV; 391e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 392e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->u4_size = sizeof(ivd_video_decode_ip_t); 393e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_op->u4_size = sizeof(ivd_video_decode_op_t); 394e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 395e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->e_cmd = IVD_CMD_VIDEO_DECODE; 396e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 397e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* When in flush and after EOS with zero byte input, 398e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * inHeader is set to zero. Hence check for non-null */ 399e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (inHeader) { 400e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->u4_ts = timeStampIx; 401e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->pv_stream_buffer = 402dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar inHeader->pBuffer + inHeader->nOffset + mInputOffset; 403dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar ps_dec_ip->u4_num_Bytes = inHeader->nFilledLen - mInputOffset; 404e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } else { 405e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->u4_ts = 0; 406e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->pv_stream_buffer = NULL; 407e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->u4_num_Bytes = 0; 408e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 409e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 41087fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim sizeUV = sizeY / 4; 41187fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ps_dec_ip->s_out_buffer.u4_min_out_buf_size[0] = sizeY; 41287fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ps_dec_ip->s_out_buffer.u4_min_out_buf_size[1] = sizeUV; 41387fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ps_dec_ip->s_out_buffer.u4_min_out_buf_size[2] = sizeUV; 41487fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim 41587fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim uint8_t *pBuf; 416e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (outHeader) { 41787fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim if (outHeader->nAllocLen < sizeY + (sizeUV * 2)) { 418ff64ea33382081f46d4b1061df00298bbbe3dd65Wonsik Kim android_errorWriteLog(0x534e4554, "27833616"); 41987fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim return false; 42087fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim } 421e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani pBuf = outHeader->pBuffer; 422e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } else { 42387fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim // mFlushOutBuffer always has the right size. 424e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani pBuf = mFlushOutBuffer; 425e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 426e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 427e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->s_out_buffer.pu1_bufs[0] = pBuf; 428e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->s_out_buffer.pu1_bufs[1] = pBuf + sizeY; 429e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->s_out_buffer.pu1_bufs[2] = pBuf + sizeY + sizeUV; 430e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ps_dec_ip->s_out_buffer.u4_num_bufs = 3; 43187fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim return true; 432e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 433e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanivoid SoftAVC::onPortFlushCompleted(OMX_U32 portIndex) { 434e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Once the output buffers are flushed, ignore any buffers that are held in decoder */ 435e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (kOutputPortIndex == portIndex) { 436e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani setFlushMode(); 437e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 4384d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar /* Allocate a picture buffer to flushed data */ 4394d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar uint32_t displayStride = outputBufferWidth(); 4404d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar uint32_t displayHeight = outputBufferHeight(); 4414d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 4424d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar uint32_t bufferSize = displayStride * displayHeight * 3 / 2; 4434d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar mFlushOutBuffer = (uint8_t *)memalign(128, bufferSize); 4444d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar if (NULL == mFlushOutBuffer) { 4452720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen ALOGE("Could not allocate flushOutputBuffer of size %u", bufferSize); 4464d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar return; 4474d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar } 4484d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 449e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani while (true) { 450e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_video_decode_ip_t s_dec_ip; 451e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_video_decode_op_t s_dec_op; 452e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani IV_API_CALL_STATUS_T status; 453e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani size_t sizeY, sizeUV; 454e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 455e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani setDecodeArgs(&s_dec_ip, &s_dec_op, NULL, NULL, 0); 456e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 457e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op); 458e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (0 == s_dec_op.u4_output_present) { 459e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani resetPlugin(); 460e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani break; 461e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 462e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 4634d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 4644d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar if (mFlushOutBuffer) { 4654d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar free(mFlushOutBuffer); 4664d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar mFlushOutBuffer = NULL; 4674d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar } 4684d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 469e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 470e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 471e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 472e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanivoid SoftAVC::onQueueFilled(OMX_U32 portIndex) { 473e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani UNUSED(portIndex); 474dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar OMX_BUFFERHEADERTYPE *inHeader = NULL; 475dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar BufferInfo *inInfo = NULL; 476e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 47790599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S if (mSignalledError) { 47890599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S return; 47990599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S } 480e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (mOutputPortSettingsChange != NONE) { 481e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return; 482e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 483e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 4844d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar if (NULL == mCodecCtx) { 4854d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar if (OK != initDecoder()) { 486c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar ALOGE("Failed to initialize decoder"); 487c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); 488c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar mSignalledError = true; 4894d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar return; 4904d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar } 4914d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar } 4924d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar if (outputBufferWidth() != mStride) { 4934d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar /* Set the run-time (dynamic) parameters */ 4944d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar mStride = outputBufferWidth(); 4954d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar setParams(mStride); 4964d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar } 4974d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar 498e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani List<BufferInfo *> &inQueue = getPortQueue(kInputPortIndex); 499e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani List<BufferInfo *> &outQueue = getPortQueue(kOutputPortIndex); 500e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 501e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani while (!outQueue.empty()) { 502e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani BufferInfo *outInfo; 503e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani OMX_BUFFERHEADERTYPE *outHeader; 504dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar size_t timeStampIx = 0; 505e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 506dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar if (!mIsInFlush && (NULL == inHeader)) { 507e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (!inQueue.empty()) { 508e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inInfo = *inQueue.begin(); 509e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inHeader = inInfo->mHeader; 510fd866b3aa0d97375de08f8888b95669026c83361Wei Jia if (inHeader == NULL) { 511fd866b3aa0d97375de08f8888b95669026c83361Wei Jia inQueue.erase(inQueue.begin()); 512fd866b3aa0d97375de08f8888b95669026c83361Wei Jia inInfo->mOwnedByUs = false; 513fd866b3aa0d97375de08f8888b95669026c83361Wei Jia continue; 514fd866b3aa0d97375de08f8888b95669026c83361Wei Jia } 515e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } else { 516e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani break; 517e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 518e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 519e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 520e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outInfo = *outQueue.begin(); 521e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader = outInfo->mHeader; 522e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader->nFlags = 0; 523e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader->nTimeStamp = 0; 524e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader->nOffset = 0; 525e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 526fd866b3aa0d97375de08f8888b95669026c83361Wei Jia if (inHeader != NULL) { 527e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (inHeader->nFilledLen == 0) { 528e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inQueue.erase(inQueue.begin()); 529e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inInfo->mOwnedByUs = false; 530e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani notifyEmptyBufferDone(inHeader); 531fd866b3aa0d97375de08f8888b95669026c83361Wei Jia 532fd866b3aa0d97375de08f8888b95669026c83361Wei Jia if (!(inHeader->nFlags & OMX_BUFFERFLAG_EOS)) { 533cf1e36f93fc8776e3a8109149424babeee7f8382Harish Mahendrakar return; 534fd866b3aa0d97375de08f8888b95669026c83361Wei Jia } 535fd866b3aa0d97375de08f8888b95669026c83361Wei Jia 536fd866b3aa0d97375de08f8888b95669026c83361Wei Jia mReceivedEOS = true; 537e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inHeader = NULL; 538e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani setFlushMode(); 539fd866b3aa0d97375de08f8888b95669026c83361Wei Jia } else if (inHeader->nFlags & OMX_BUFFERFLAG_EOS) { 540fd866b3aa0d97375de08f8888b95669026c83361Wei Jia mReceivedEOS = true; 541e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 542e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 543e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 544e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Get a free slot in timestamp array to hold input timestamp */ 545e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani { 546e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani size_t i; 547e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani timeStampIx = 0; 548e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani for (i = 0; i < MAX_TIME_STAMPS; i++) { 549e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (!mTimeStampsValid[i]) { 550e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani timeStampIx = i; 551e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani break; 552e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 553e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 554e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (inHeader != NULL) { 555e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mTimeStampsValid[timeStampIx] = true; 556e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mTimeStamps[timeStampIx] = inHeader->nTimeStamp; 557e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 558e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 559e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 560e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani { 561e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_video_decode_ip_t s_dec_ip; 562e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani ivd_video_decode_op_t s_dec_op; 563f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen nsecs_t timeDelay, timeTaken; 564e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani size_t sizeY, sizeUV; 565e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 56687fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim if (!setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx)) { 56787fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ALOGE("Decoder arg setup failed"); 56887fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL); 56987fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim mSignalledError = true; 57087fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim return; 57187fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim } 572e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani // If input dump is enabled, then write to file 573dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar DUMP_TO_FILE(mInFile, s_dec_ip.pv_stream_buffer, s_dec_ip.u4_num_Bytes, mInputOffset); 574e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 575f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen mTimeStart = systemTime(); 576e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Compute time elapsed between end of previous decode() 577e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * to start of current decode() */ 578f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen timeDelay = mTimeStart - mTimeEnd; 579e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 580e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani IV_API_CALL_STATUS_T status; 581e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op); 582e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 58399e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar bool unsupportedResolution = 58499e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar (IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED == (s_dec_op.u4_error_code & 0xFF)); 58599e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar 58699e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar /* Check for unsupported dimensions */ 58799e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar if (unsupportedResolution) { 58899e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar ALOGE("Unsupported resolution : %dx%d", mWidth, mHeight); 58999e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); 59099e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar mSignalledError = true; 59199e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar return; 59299e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar } 59399e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar 594c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar bool allocationFailed = (IVD_MEM_ALLOC_FAILED == (s_dec_op.u4_error_code & 0xFF)); 595c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar if (allocationFailed) { 596c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar ALOGE("Allocation failure in decoder"); 597c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); 598c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar mSignalledError = true; 599c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar return; 600c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar } 601c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar 602e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani bool resChanged = (IVD_RES_CHANGED == (s_dec_op.u4_error_code & 0xFF)); 603e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 604c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang getVUIParams(); 605c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 606f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen mTimeEnd = systemTime(); 607e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* Compute time taken for decode() */ 608f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen timeTaken = mTimeEnd - mTimeStart; 609e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 610f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen ALOGV("timeTaken=%6lldus delay=%6lldus numBytes=%6d", 611f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen (long long) (timeTaken / 1000ll), (long long) (timeDelay / 1000ll), 612e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani s_dec_op.u4_num_bytes_consumed); 613e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (s_dec_op.u4_frame_decoded_flag && !mFlushNeeded) { 614e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mFlushNeeded = true; 615e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 616e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 617e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if ((inHeader != NULL) && (1 != s_dec_op.u4_frame_decoded_flag)) { 618e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* If the input did not contain picture data, then ignore 619e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * the associated timestamp */ 620e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mTimeStampsValid[timeStampIx] = false; 621e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 622e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 623e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani // If the decoder is in the changing resolution mode and there is no output present, 624e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani // that means the switching is done and it's ready to reset the decoder and the plugin. 625e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (mChangingResolution && !s_dec_op.u4_output_present) { 626e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mChangingResolution = false; 627e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani resetDecoder(); 628e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani resetPlugin(); 629a34a5cca7791d80bdbfe0ef9659e1f991ad23e78Harish Mahendrakar mStride = outputBufferWidth(); 630a34a5cca7791d80bdbfe0ef9659e1f991ad23e78Harish Mahendrakar setParams(mStride); 631e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani continue; 632e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 633e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 6344d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar if (resChanged) { 635e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mChangingResolution = true; 636e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (mFlushNeeded) { 637e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani setFlushMode(); 638e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 63911aaefb57fdd0076eb5484c3c5bd3bff5f6cb5e0Marco Nelissen continue; 64011aaefb57fdd0076eb5484c3c5bd3bff5f6cb5e0Marco Nelissen } 64111aaefb57fdd0076eb5484c3c5bd3bff5f6cb5e0Marco Nelissen 642c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // Combine the resolution change and coloraspects change in one PortSettingChange event 643c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang // if necessary. 644e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if ((0 < s_dec_op.u4_pic_wd) && (0 < s_dec_op.u4_pic_ht)) { 645e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani uint32_t width = s_dec_op.u4_pic_wd; 646e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani uint32_t height = s_dec_op.u4_pic_ht; 647e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani bool portWillReset = false; 648e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani handlePortSettingsChange(&portWillReset, width, height); 649e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (portWillReset) { 650e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani resetDecoder(); 6518437f4e9094567affaa72ba7bfab654e12e78399Ram Mohan M resetPlugin(); 652e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return; 653e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 654c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang } else if (mUpdateColorAspects) { 655c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang notify(OMX_EventPortSettingsChanged, kOutputPortIndex, 656c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang kDescribeColorAspectsIndex, NULL); 657c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang mUpdateColorAspects = false; 658c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang return; 659e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 660e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 661e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (s_dec_op.u4_output_present) { 6623ecc9db40b1fb9c7f807a5892e5c9625aac1fb06Marco Nelissen outHeader->nFilledLen = (outputBufferWidth() * outputBufferHeight() * 3) / 2; 663e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 664e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader->nTimeStamp = mTimeStamps[s_dec_op.u4_ts]; 665e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mTimeStampsValid[s_dec_op.u4_ts] = false; 666e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 667e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outInfo->mOwnedByUs = false; 668e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outQueue.erase(outQueue.begin()); 669e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outInfo = NULL; 670e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani notifyFillBufferDone(outHeader); 671e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader = NULL; 672d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar } else if (mIsInFlush) { 673e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* If in flush mode and no output is returned by the codec, 674e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * then come out of flush mode */ 675e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani mIsInFlush = false; 676e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 677e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani /* If EOS was recieved on input port and there is no output 678e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * from the codec, then signal EOS on output port */ 679e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani if (mReceivedEOS) { 680e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader->nFilledLen = 0; 681e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader->nFlags |= OMX_BUFFERFLAG_EOS; 682e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 683e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outInfo->mOwnedByUs = false; 684e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outQueue.erase(outQueue.begin()); 685e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outInfo = NULL; 686e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani notifyFillBufferDone(outHeader); 687e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani outHeader = NULL; 688e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani resetPlugin(); 689e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 690e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 691dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar mInputOffset += s_dec_op.u4_num_bytes_consumed; 692e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 693dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar // If more than 4 bytes are remaining in input, then do not release it 694dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar if (inHeader != NULL && ((inHeader->nFilledLen - mInputOffset) <= 4)) { 695e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inInfo->mOwnedByUs = false; 696e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inQueue.erase(inQueue.begin()); 697e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inInfo = NULL; 698e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani notifyEmptyBufferDone(inHeader); 699e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani inHeader = NULL; 700dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar mInputOffset = 0; 701dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar 702dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar /* If input EOS is seen and decoder is not in flush mode, 703dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar * set the decoder in flush mode. 704dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar * There can be a case where EOS is sent along with last picture data 705dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar * In that case, only after decoding that input data, decoder has to be 706dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar * put in flush. This case is handled here */ 707dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar 708dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar if (mReceivedEOS && !mIsInFlush) { 709dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar setFlushMode(); 710dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar } 711e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 712e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani } 713e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 714e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 715c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuangint SoftAVC::getColorAspectPreference() { 716c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang return kPreferBitstream; 717c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang} 718c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang 719e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} // namespace android 720e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani 721e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhaniandroid::SoftOMXComponent *createSoftOMXComponent( 722e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani const char *name, const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData, 723e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani OMX_COMPONENTTYPE **component) { 724e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani return new android::SoftAVC(name, callbacks, appData, component); 725e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} 726