18f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani/* 28f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * Copyright 2015 The Android Open Source Project 38f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * 48f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * Licensed under the Apache License, Version 2.0 (the "License"); 58f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * you may not use this file except in compliance with the License. 68f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * You may obtain a copy of the License at 78f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * 88f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * http://www.apache.org/licenses/LICENSE-2.0 98f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * 108f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * Unless required by applicable law or agreed to in writing, software 118f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * distributed under the License is distributed on an "AS IS" BASIS, 128f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * See the License for the specific language governing permissions and 148f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * limitations under the License. 158f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani */ 168f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 178f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani//#define LOG_NDEBUG 0 188f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define LOG_TAG "SoftMPEG2" 198f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#include <utils/Log.h> 208f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 218f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#include "iv_datatypedef.h" 228f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#include "iv.h" 238f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#include "ivd.h" 248f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#include "impeg2d.h" 258f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#include "SoftMPEG2.h" 268f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 278f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#include <media/stagefright/foundation/ADebug.h> 288f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#include <media/stagefright/MediaDefs.h> 298f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#include <OMX_VideoExt.h> 308f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 318f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhaninamespace android { 328f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 338f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define componentName "video_decoder.mpeg2" 348f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define codingType OMX_VIDEO_CodingMPEG2 358f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define CODEC_MIME_TYPE MEDIA_MIMETYPE_VIDEO_MPEG2 368f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 378f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani/** Function and structure definitions to keep code similar for each codec */ 388f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define ivdec_api_function impeg2d_api_function 398f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define ivdext_init_ip_t impeg2d_init_ip_t 408f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define ivdext_init_op_t impeg2d_init_op_t 418f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define ivdext_fill_mem_rec_ip_t impeg2d_fill_mem_rec_ip_t 428f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define ivdext_fill_mem_rec_op_t impeg2d_fill_mem_rec_op_t 438f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define ivdext_ctl_set_num_cores_ip_t impeg2d_ctl_set_num_cores_ip_t 448f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define ivdext_ctl_set_num_cores_op_t impeg2d_ctl_set_num_cores_op_t 458f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 468f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define IVDEXT_CMD_CTL_SET_NUM_CORES \ 478f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani (IVD_CONTROL_API_COMMAND_TYPE_T)IMPEG2D_CMD_CTL_SET_NUM_CORES 488f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 498f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistatic const CodecProfileLevel kProfileLevels[] = { 508f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani { OMX_VIDEO_MPEG2ProfileSimple, OMX_VIDEO_MPEG2LevelHL }, 518f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 528f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani { OMX_VIDEO_MPEG2ProfileMain , OMX_VIDEO_MPEG2LevelHL }, 538f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}; 548f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama AvadhaniSoftMPEG2::SoftMPEG2( 568f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani const char *name, 578f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani const OMX_CALLBACKTYPE *callbacks, 588f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani OMX_PTR appData, 598f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani OMX_COMPONENTTYPE **component) 608f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani : SoftVideoDecoderOMXComponent( 618f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani name, componentName, codingType, 628f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani kProfileLevels, ARRAY_SIZE(kProfileLevels), 638f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 320 /* width */, 240 /* height */, callbacks, 648f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani appData, component), 65eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani mCodecCtx(NULL), 668f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mMemRecords(NULL), 678f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mFlushOutBuffer(NULL), 688f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mOmxColorFormat(OMX_COLOR_FormatYUV420Planar), 698f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mIvColorFormat(IV_YUV_420P), 708f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mNewWidth(mWidth), 718f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mNewHeight(mHeight), 721ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar mChangingResolution(false), 73eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani mSignalledError(false), 741ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar mStride(mWidth) { 758f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani initPorts(kNumBuffers, INPUT_BUF_SIZE, kNumBuffers, CODEC_MIME_TYPE); 768f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 778f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // If input dump is enabled, then open create an empty file 788f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani GENERATE_FILE_NAMES(); 798f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani CREATE_DUMP_FILE(mInFile); 808f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 818f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 828f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama AvadhaniSoftMPEG2::~SoftMPEG2() { 83eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani if (OK != deInitDecoder()) { 84eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani ALOGE("Failed to deinit decoder"); 85eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); 86eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani mSignalledError = true; 87eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani return; 88eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani } 898f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 908f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 918f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 92069c97e06521035e81ead2eeff8960613fed9254Chong Zhangstatic ssize_t getMinTimestampIdx(OMX_S64 *pNTimeStamp, bool *pIsTimeStampValid) { 938f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani OMX_S64 minTimeStamp = LLONG_MAX; 94069c97e06521035e81ead2eeff8960613fed9254Chong Zhang ssize_t idx = -1; 95069c97e06521035e81ead2eeff8960613fed9254Chong Zhang for (ssize_t i = 0; i < MAX_TIME_STAMPS; i++) { 968f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (pIsTimeStampValid[i]) { 978f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (pNTimeStamp[i] < minTimeStamp) { 988f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani minTimeStamp = pNTimeStamp[i]; 998f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani idx = i; 1008f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 1018f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 1028f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 1038f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return idx; 1048f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 1058f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1068f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistatic size_t GetCPUCoreCount() { 1078f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani long cpuCoreCount = 1; 1088f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#if defined(_SC_NPROCESSORS_ONLN) 1098f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN); 1108f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#else 1118f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // _SC_NPROC_ONLN must be defined... 1128f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani cpuCoreCount = sysconf(_SC_NPROC_ONLN); 1138f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#endif 1148f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani CHECK(cpuCoreCount >= 1); 1158f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGV("Number of CPU cores: %ld", cpuCoreCount); 1168f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return (size_t)cpuCoreCount; 1178f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 1188f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1198f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanivoid SoftMPEG2::logVersion() { 1208f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_ctl_getversioninfo_ip_t s_ctl_ip; 1218f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_ctl_getversioninfo_op_t s_ctl_op; 1228f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani UWORD8 au1_buf[512]; 1238f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani IV_API_CALL_STATUS_T status; 1248f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1258f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; 1268f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETVERSION; 1278f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_ip.u4_size = sizeof(ivd_ctl_getversioninfo_ip_t); 1288f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_op.u4_size = sizeof(ivd_ctl_getversioninfo_op_t); 1298f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_ip.pv_version_buffer = au1_buf; 1308f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_ip.u4_version_buffer_size = sizeof(au1_buf); 1318f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1328f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op); 1338f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1348f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (status != IV_SUCCESS) { 1358f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGE("Error in getting version number: 0x%x", 1368f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_op.u4_error_code); 1378f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } else { 1388f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGV("Ittiam decoder version number: %s", 1398f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani (char *)s_ctl_ip.pv_version_buffer); 1408f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 1418f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return; 1428f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 1438f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1448f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistatus_t SoftMPEG2::setParams(size_t stride) { 1458f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_ctl_set_config_ip_t s_ctl_ip; 1468f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_ctl_set_config_op_t s_ctl_op; 1478f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani IV_API_CALL_STATUS_T status; 1488f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_ip.u4_disp_wd = (UWORD32)stride; 1498f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_ip.e_frm_skip_mode = IVD_SKIP_NONE; 1508f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1518f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT; 1528f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_ip.e_vid_dec_mode = IVD_DECODE_FRAME; 1538f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; 1548f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS; 1558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_ip.u4_size = sizeof(ivd_ctl_set_config_ip_t); 1568f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_op.u4_size = sizeof(ivd_ctl_set_config_op_t); 1578f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 158ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("Set the run-time (dynamic) parameters stride = %zu", stride); 1598f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op); 1608f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1618f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (status != IV_SUCCESS) { 1628f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGE("Error in setting the run-time parameters: 0x%x", 1638f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_op.u4_error_code); 1648f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1658f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return UNKNOWN_ERROR; 1668f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 1678f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return OK; 1688f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 1698f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1708f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistatus_t SoftMPEG2::resetPlugin() { 1718f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mIsInFlush = false; 1728f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mReceivedEOS = false; 1738f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani memset(mTimeStamps, 0, sizeof(mTimeStamps)); 1748f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani memset(mTimeStampsValid, 0, sizeof(mTimeStampsValid)); 1758f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1768f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* Initialize both start and end times */ 1778f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani gettimeofday(&mTimeStart, NULL); 1788f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani gettimeofday(&mTimeEnd, NULL); 1798f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1808f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return OK; 1818f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 1828f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1838f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistatus_t SoftMPEG2::resetDecoder() { 1848f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_ctl_reset_ip_t s_ctl_ip; 1858f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_ctl_reset_op_t s_ctl_op; 1868f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani IV_API_CALL_STATUS_T status; 1878f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1888f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; 1898f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_RESET; 1908f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_ip.u4_size = sizeof(ivd_ctl_reset_ip_t); 1918f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_ctl_op.u4_size = sizeof(ivd_ctl_reset_op_t); 1928f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1938f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op); 1948f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (IV_SUCCESS != status) { 1958f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGE("Error in reset: 0x%x", s_ctl_op.u4_error_code); 1968f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return UNKNOWN_ERROR; 1978f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 1988f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1998f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* Set the run-time (dynamic) parameters */ 2008f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani setParams(outputBufferWidth()); 2018f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2028f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* Set number of cores/threads to be used by the codec */ 2038f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani setNumCores(); 2048f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2051ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar mStride = 0; 206eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani mSignalledError = false; 2071ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar 2088f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return OK; 2098f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 2108f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2118f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistatus_t SoftMPEG2::setNumCores() { 2128f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivdext_ctl_set_num_cores_ip_t s_set_cores_ip; 2138f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivdext_ctl_set_num_cores_op_t s_set_cores_op; 2148f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani IV_API_CALL_STATUS_T status; 2158f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_set_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL; 2168f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_set_cores_ip.e_sub_cmd = IVDEXT_CMD_CTL_SET_NUM_CORES; 2178f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_set_cores_ip.u4_num_cores = MIN(mNumCores, CODEC_MAX_NUM_CORES); 2188f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_set_cores_ip.u4_size = sizeof(ivdext_ctl_set_num_cores_ip_t); 2198f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_set_cores_op.u4_size = sizeof(ivdext_ctl_set_num_cores_op_t); 2208f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2218f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status = ivdec_api_function(mCodecCtx, (void *)&s_set_cores_ip, (void *)&s_set_cores_op); 2228f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (IV_SUCCESS != status) { 2238f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGE("Error in setting number of cores: 0x%x", 2248f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_set_cores_op.u4_error_code); 2258f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return UNKNOWN_ERROR; 2268f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 2278f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return OK; 2288f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 2298f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2308f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistatus_t SoftMPEG2::setFlushMode() { 2318f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani IV_API_CALL_STATUS_T status; 2328f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_ctl_flush_ip_t s_video_flush_ip; 2338f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_ctl_flush_op_t s_video_flush_op; 2348f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2358f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_video_flush_ip.e_cmd = IVD_CMD_VIDEO_CTL; 2368f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_video_flush_ip.e_sub_cmd = IVD_CMD_CTL_FLUSH; 2378f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_video_flush_ip.u4_size = sizeof(ivd_ctl_flush_ip_t); 2388f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_video_flush_op.u4_size = sizeof(ivd_ctl_flush_op_t); 2398f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2408f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* Set the decoder in Flush mode, subsequent decode() calls will flush */ 2418f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status = ivdec_api_function( 2428f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mCodecCtx, (void *)&s_video_flush_ip, (void *)&s_video_flush_op); 2438f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2448f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (status != IV_SUCCESS) { 2458f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGE("Error in setting the decoder in flush mode: (%d) 0x%x", status, 2468f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_video_flush_op.u4_error_code); 2478f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return UNKNOWN_ERROR; 2488f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 2498f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2508f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani mWaitForI = true; 2518f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mIsInFlush = true; 2528f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return OK; 2538f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 2548f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistatus_t SoftMPEG2::initDecoder() { 2568f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani IV_API_CALL_STATUS_T status; 2578f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2588f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani UWORD32 u4_num_reorder_frames; 2598f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani UWORD32 u4_num_ref_frames; 2608f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani UWORD32 u4_share_disp_buf; 2618f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2628f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mNumCores = GetCPUCoreCount(); 2638f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani mWaitForI = true; 2648f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2658f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* Initialize number of ref and reorder modes (for MPEG2) */ 2668f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani u4_num_reorder_frames = 16; 2678f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani u4_num_ref_frames = 16; 2688f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani u4_share_disp_buf = 0; 2698f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2708f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani uint32_t displayStride = outputBufferWidth(); 2718f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani uint32_t displayHeight = outputBufferHeight(); 2728f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani uint32_t displaySizeY = displayStride * displayHeight; 2738f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2748f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani { 2758f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani iv_num_mem_rec_ip_t s_num_mem_rec_ip; 2768f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani iv_num_mem_rec_op_t s_num_mem_rec_op; 2778f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2788f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_num_mem_rec_ip.u4_size = sizeof(s_num_mem_rec_ip); 2798f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_num_mem_rec_op.u4_size = sizeof(s_num_mem_rec_op); 2808f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_num_mem_rec_ip.e_cmd = IV_CMD_GET_NUM_MEM_REC; 2818f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2828f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status = ivdec_api_function( 2838f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mCodecCtx, (void *)&s_num_mem_rec_ip, (void *)&s_num_mem_rec_op); 2848f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (IV_SUCCESS != status) { 2858f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGE("Error in getting mem records: 0x%x", 2868f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_num_mem_rec_op.u4_error_code); 2878f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return UNKNOWN_ERROR; 2888f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 2898f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2908f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mNumMemRecords = s_num_mem_rec_op.u4_num_mem_rec; 2918f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 2928f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 2938f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mMemRecords = (iv_mem_rec_t *)ivd_aligned_malloc( 2948f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 128, mNumMemRecords * sizeof(iv_mem_rec_t)); 2958f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (mMemRecords == NULL) { 2968f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGE("Allocation failure"); 2978f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return NO_MEMORY; 2988f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 2998f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3008f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani memset(mMemRecords, 0, mNumMemRecords * sizeof(iv_mem_rec_t)); 3018f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3028f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani { 3038f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani size_t i; 3048f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivdext_fill_mem_rec_ip_t s_fill_mem_ip; 3058f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivdext_fill_mem_rec_op_t s_fill_mem_op; 3068f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani iv_mem_rec_t *ps_mem_rec; 3078f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3088f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.u4_size = 3098f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani sizeof(ivdext_fill_mem_rec_ip_t); 3108f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3118f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_fill_mem_ip.u4_share_disp_buf = u4_share_disp_buf; 3128f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_fill_mem_ip.e_output_format = mIvColorFormat; 31353766eb16e1e98bd101a7f8942fc16270febc0c6Harish Mahendrakar s_fill_mem_ip.u4_deinterlace = 1; 3148f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.e_cmd = IV_CMD_FILL_NUM_MEM_REC; 3158f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location = mMemRecords; 3168f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd = displayStride; 3178f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht = displayHeight; 3188f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_fill_mem_op.s_ivd_fill_mem_rec_op_t.u4_size = 3198f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani sizeof(ivdext_fill_mem_rec_op_t); 3208f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3218f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_mem_rec = mMemRecords; 3228f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani for (i = 0; i < mNumMemRecords; i++) { 3238f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_mem_rec[i].u4_size = sizeof(iv_mem_rec_t); 3248f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 3258f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3268f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status = ivdec_api_function( 3278f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mCodecCtx, (void *)&s_fill_mem_ip, (void *)&s_fill_mem_op); 3288f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3298f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (IV_SUCCESS != status) { 3308f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGE("Error in filling mem records: 0x%x", 3318f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_fill_mem_op.s_ivd_fill_mem_rec_op_t.u4_error_code); 3328f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return UNKNOWN_ERROR; 3338f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 3348f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mNumMemRecords = 3358f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_fill_mem_op.s_ivd_fill_mem_rec_op_t.u4_num_mem_rec_filled; 3368f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3378f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_mem_rec = mMemRecords; 3388f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3398f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani for (i = 0; i < mNumMemRecords; i++) { 3408f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_mem_rec->pv_base = ivd_aligned_malloc( 3418f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_mem_rec->u4_mem_alignment, ps_mem_rec->u4_mem_size); 3428f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (ps_mem_rec->pv_base == NULL) { 3438f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGE("Allocation failure for memory record #%zu of size %u", 3448f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani i, ps_mem_rec->u4_mem_size); 3458f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status = IV_FAIL; 3468f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return NO_MEMORY; 3478f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 3488f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3498f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_mem_rec++; 3508f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 3518f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 3528f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3538f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* Initialize the decoder */ 3548f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani { 3558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivdext_init_ip_t s_init_ip; 3568f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivdext_init_op_t s_init_op; 3578f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3588f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani void *dec_fxns = (void *)ivdec_api_function; 3598f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3608f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_init_ip.s_ivd_init_ip_t.u4_size = sizeof(ivdext_init_ip_t); 3618f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_init_ip.s_ivd_init_ip_t.e_cmd = (IVD_API_COMMAND_TYPE_T)IV_CMD_INIT; 3628f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_init_ip.s_ivd_init_ip_t.pv_mem_rec_location = mMemRecords; 3638f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_init_ip.s_ivd_init_ip_t.u4_frm_max_wd = displayStride; 3648f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_init_ip.s_ivd_init_ip_t.u4_frm_max_ht = displayHeight; 3658f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3668f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_init_ip.u4_share_disp_buf = u4_share_disp_buf; 36753766eb16e1e98bd101a7f8942fc16270febc0c6Harish Mahendrakar s_init_ip.u4_deinterlace = 1; 3688f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3698f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_init_op.s_ivd_init_op_t.u4_size = sizeof(s_init_op); 3708f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3718f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_init_ip.s_ivd_init_ip_t.u4_num_mem_rec = mNumMemRecords; 3728f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_init_ip.s_ivd_init_ip_t.e_output_format = mIvColorFormat; 3738f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3748f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mCodecCtx = (iv_obj_t *)mMemRecords[0].pv_base; 3758f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mCodecCtx->pv_fxns = dec_fxns; 3768f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mCodecCtx->u4_size = sizeof(iv_obj_t); 3778f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3788f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status = ivdec_api_function(mCodecCtx, (void *)&s_init_ip, (void *)&s_init_op); 3798f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (status != IV_SUCCESS) { 3808f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGE("Error in init: 0x%x", 3818f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_init_op.s_ivd_init_op_t.u4_error_code); 3828f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return UNKNOWN_ERROR; 3838f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 3848f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 3858f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3868f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* Reset the plugin state */ 3878f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani resetPlugin(); 3888f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3898f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* Set the run time (dynamic) parameters */ 3901ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar mStride = outputBufferWidth(); 3911ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar setParams(mStride); 3928f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3938f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* Set number of cores/threads to be used by the codec */ 3948f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani setNumCores(); 3958f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3968f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* Get codec version */ 3978f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani logVersion(); 3988f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 3998f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* Allocate internal picture buffer */ 4008f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani uint32_t bufferSize = displaySizeY * 3 / 2; 4018f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mFlushOutBuffer = (uint8_t *)ivd_aligned_malloc(128, bufferSize); 4028f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (NULL == mFlushOutBuffer) { 403ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGE("Could not allocate flushOutputBuffer of size %u", bufferSize); 4048f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return NO_MEMORY; 4058f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 4068f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 4078f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mInitNeeded = false; 4088f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mFlushNeeded = false; 4098f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return OK; 4108f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 4118f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 4128f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistatus_t SoftMPEG2::deInitDecoder() { 4138f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani size_t i; 4148f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 4158f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (mMemRecords) { 4168f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani iv_mem_rec_t *ps_mem_rec; 4178f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 4188f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_mem_rec = mMemRecords; 4198f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani for (i = 0; i < mNumMemRecords; i++) { 4208f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (ps_mem_rec->pv_base) { 4218f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_aligned_free(ps_mem_rec->pv_base); 4228f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 4238f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_mem_rec++; 4248f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 4258f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_aligned_free(mMemRecords); 4268f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mMemRecords = NULL; 4278f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 4288f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 4298f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (mFlushOutBuffer) { 4308f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_aligned_free(mFlushOutBuffer); 4318f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mFlushOutBuffer = NULL; 4328f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 4338f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 4348f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mInitNeeded = true; 4358f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mChangingResolution = false; 436eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani mCodecCtx = NULL; 4378f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 4388f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return OK; 4398f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 4408f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 4418f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistatus_t SoftMPEG2::reInitDecoder() { 4428f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status_t ret; 4438f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 4448f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani deInitDecoder(); 4458f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 4468f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ret = initDecoder(); 4478f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (OK != ret) { 448eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani ALOGE("Failed to initialize decoder"); 4498f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani deInitDecoder(); 450eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani return ret; 4518f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 452eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani mSignalledError = false; 4538f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return OK; 4548f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 4558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 4568f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanivoid SoftMPEG2::onReset() { 4578f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani SoftVideoDecoderOMXComponent::onReset(); 4588f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 4598f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani mWaitForI = true; 4608f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani 4618f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani resetDecoder(); 4628f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani resetPlugin(); 4638f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 4648f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 4656a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuangbool SoftMPEG2::getSeqInfo() { 4666a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang IV_API_CALL_STATUS_T status; 4676a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang impeg2d_ctl_get_seq_info_ip_t s_ctl_get_seq_info_ip; 4686a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang impeg2d_ctl_get_seq_info_op_t s_ctl_get_seq_info_op; 4696a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang 4706a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang s_ctl_get_seq_info_ip.e_cmd = IVD_CMD_VIDEO_CTL; 4716a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang s_ctl_get_seq_info_ip.e_sub_cmd = 4726a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang (IVD_CONTROL_API_COMMAND_TYPE_T)IMPEG2D_CMD_CTL_GET_SEQ_INFO; 4736a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang 4746a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang s_ctl_get_seq_info_ip.u4_size = sizeof(impeg2d_ctl_get_seq_info_ip_t); 4756a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang s_ctl_get_seq_info_op.u4_size = sizeof(impeg2d_ctl_get_seq_info_op_t); 4766a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang 4776a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang status = ivdec_api_function( 4786a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang (iv_obj_t *)mCodecCtx, (void *)&s_ctl_get_seq_info_ip, 4796a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang (void *)&s_ctl_get_seq_info_op); 4806a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang 4816a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang if (status != IV_SUCCESS) { 4826a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang ALOGW("Error in getting Sequence info: 0x%x", 4836a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang s_ctl_get_seq_info_op.u4_error_code); 4846a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang return false; 4856a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang } 4866a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang 4876a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang 4886a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang int32_t primaries = s_ctl_get_seq_info_op.u1_colour_primaries; 4896a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang int32_t transfer = s_ctl_get_seq_info_op.u1_transfer_characteristics; 4906a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang int32_t coeffs = s_ctl_get_seq_info_op.u1_matrix_coefficients; 4916a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang bool fullRange = false; // mpeg2 video has limited range. 4926a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang 4936a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang ColorAspects colorAspects; 4946a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang ColorUtils::convertIsoColorAspectsToCodecAspects( 4956a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang primaries, transfer, coeffs, fullRange, colorAspects); 4966a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang 4976a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang // Update color aspects if necessary. 4986a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang if (colorAspectsDiffer(colorAspects, mBitstreamColorAspects)) { 4996a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang mBitstreamColorAspects = colorAspects; 5006a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang status_t err = handleColorAspectsChange(); 5016a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang CHECK(err == OK); 5026a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang } 5036a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang return true; 5046a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang} 5056a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang 5068f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama AvadhaniOMX_ERRORTYPE SoftMPEG2::internalSetParameter(OMX_INDEXTYPE index, const OMX_PTR params) { 5078f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani const uint32_t oldWidth = mWidth; 5088f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani const uint32_t oldHeight = mHeight; 5098f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani OMX_ERRORTYPE ret = SoftVideoDecoderOMXComponent::internalSetParameter(index, params); 5108f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (mWidth != oldWidth || mHeight != oldHeight) { 5118f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani reInitDecoder(); 5128f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 5138f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return ret; 5148f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 5158f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 51687fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kimbool SoftMPEG2::setDecodeArgs( 5178f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_video_decode_ip_t *ps_dec_ip, 5188f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_video_decode_op_t *ps_dec_op, 5198f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani OMX_BUFFERHEADERTYPE *inHeader, 5208f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani OMX_BUFFERHEADERTYPE *outHeader, 5218f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani size_t timeStampIx) { 5228f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani size_t sizeY = outputBufferWidth() * outputBufferHeight(); 5238f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani size_t sizeUV; 5248f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 5258f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_dec_ip->u4_size = sizeof(ivd_video_decode_ip_t); 5268f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_dec_op->u4_size = sizeof(ivd_video_decode_op_t); 5278f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 5288f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_dec_ip->e_cmd = IVD_CMD_VIDEO_DECODE; 5298f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 5308f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* When in flush and after EOS with zero byte input, 5318f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * inHeader is set to zero. Hence check for non-null */ 5328f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (inHeader) { 5338f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_dec_ip->u4_ts = timeStampIx; 5348f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_dec_ip->pv_stream_buffer = inHeader->pBuffer 5358f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani + inHeader->nOffset; 5368f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_dec_ip->u4_num_Bytes = inHeader->nFilledLen; 5378f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } else { 5388f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_dec_ip->u4_ts = 0; 5398f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_dec_ip->pv_stream_buffer = NULL; 5408f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_dec_ip->u4_num_Bytes = 0; 5418f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 5428f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 54387fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim sizeUV = sizeY / 4; 54487fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ps_dec_ip->s_out_buffer.u4_min_out_buf_size[0] = sizeY; 54587fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ps_dec_ip->s_out_buffer.u4_min_out_buf_size[1] = sizeUV; 54687fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ps_dec_ip->s_out_buffer.u4_min_out_buf_size[2] = sizeUV; 54787fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim 54887fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim uint8_t *pBuf; 5498f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (outHeader) { 55087fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim if (outHeader->nAllocLen < sizeY + (sizeUV * 2)) { 551ff64ea33382081f46d4b1061df00298bbbe3dd65Wonsik Kim android_errorWriteLog(0x534e4554, "27833616"); 55287fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim return false; 55387fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim } 5548f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani pBuf = outHeader->pBuffer; 5558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } else { 55687fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim // mFlushOutBuffer always has the right size. 5578f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani pBuf = mFlushOutBuffer; 5588f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 5598f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 5608f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_dec_ip->s_out_buffer.pu1_bufs[0] = pBuf; 5618f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_dec_ip->s_out_buffer.pu1_bufs[1] = pBuf + sizeY; 5628f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_dec_ip->s_out_buffer.pu1_bufs[2] = pBuf + sizeY + sizeUV; 5638f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ps_dec_ip->s_out_buffer.u4_num_bufs = 3; 56487fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim return true; 5658f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 5668f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanivoid SoftMPEG2::onPortFlushCompleted(OMX_U32 portIndex) { 5678f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* Once the output buffers are flushed, ignore any buffers that are held in decoder */ 5688f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (kOutputPortIndex == portIndex) { 5698f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani setFlushMode(); 5708f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 5718f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani while (true) { 5728f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_video_decode_ip_t s_dec_ip; 5738f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_video_decode_op_t s_dec_op; 5748f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani IV_API_CALL_STATUS_T status; 5758f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani size_t sizeY, sizeUV; 5768f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 5778f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani setDecodeArgs(&s_dec_ip, &s_dec_op, NULL, NULL, 0); 5788f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 5798f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op); 5808f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (0 == s_dec_op.u4_output_present) { 5818f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani resetPlugin(); 5828f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani break; 5838f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 5848f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 5858f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 5868f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 5878f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 5888f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanivoid SoftMPEG2::onQueueFilled(OMX_U32 portIndex) { 5898f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani UNUSED(portIndex); 5908f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 591eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani if (mSignalledError) { 592eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani return; 593eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani } 5948f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (mOutputPortSettingsChange != NONE) { 5958f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return; 5968f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 5978f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 598a67eacace769095eb04b01681c99d931e68a4b08Venkatarama Avadhani if (NULL == mCodecCtx) { 599a67eacace769095eb04b01681c99d931e68a4b08Venkatarama Avadhani if (OK != initDecoder()) { 600a67eacace769095eb04b01681c99d931e68a4b08Venkatarama Avadhani ALOGE("Failed to initialize decoder"); 601a67eacace769095eb04b01681c99d931e68a4b08Venkatarama Avadhani notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); 602a67eacace769095eb04b01681c99d931e68a4b08Venkatarama Avadhani mSignalledError = true; 603a67eacace769095eb04b01681c99d931e68a4b08Venkatarama Avadhani return; 604a67eacace769095eb04b01681c99d931e68a4b08Venkatarama Avadhani } 605a67eacace769095eb04b01681c99d931e68a4b08Venkatarama Avadhani } 606a67eacace769095eb04b01681c99d931e68a4b08Venkatarama Avadhani 6078f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani List<BufferInfo *> &inQueue = getPortQueue(kInputPortIndex); 6088f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani List<BufferInfo *> &outQueue = getPortQueue(kOutputPortIndex); 6098f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 6101ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar if (outputBufferWidth() != mStride) { 6111ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar /* Set the run-time (dynamic) parameters */ 6121ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar mStride = outputBufferWidth(); 6131ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar setParams(mStride); 6141ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar } 6151ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar 6168f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani while (!outQueue.empty()) { 6178f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani BufferInfo *inInfo; 6188f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani OMX_BUFFERHEADERTYPE *inHeader; 6198f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 6208f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani BufferInfo *outInfo; 6218f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani OMX_BUFFERHEADERTYPE *outHeader; 6228f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani size_t timeStampIx; 6238f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 6248f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani inInfo = NULL; 6258f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani inHeader = NULL; 6268f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 6278f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (!mIsInFlush) { 6288f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (!inQueue.empty()) { 6298f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani inInfo = *inQueue.begin(); 6308f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani inHeader = inInfo->mHeader; 6318f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } else { 6328f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani break; 6338f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 6348f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 6358f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 6368f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani outInfo = *outQueue.begin(); 6378f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani outHeader = outInfo->mHeader; 6388f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani outHeader->nFlags = 0; 6398f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani outHeader->nTimeStamp = 0; 6408f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani outHeader->nOffset = 0; 6418f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 6428f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (inHeader != NULL && (inHeader->nFlags & OMX_BUFFERFLAG_EOS)) { 6438f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mReceivedEOS = true; 6448f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (inHeader->nFilledLen == 0) { 6458f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani inQueue.erase(inQueue.begin()); 6468f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani inInfo->mOwnedByUs = false; 6478f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani notifyEmptyBufferDone(inHeader); 6488f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani inHeader = NULL; 6498f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani setFlushMode(); 6508f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 6518f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 6528f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 6538f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // When there is an init required and the decoder is not in flush mode, 6548f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // update output port's definition and reinitialize decoder. 6558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (mInitNeeded && !mIsInFlush) { 6568f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani bool portWillReset = false; 6578f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani handlePortSettingsChange(&portWillReset, mNewWidth, mNewHeight); 6588f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 659eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani if (OK != reInitDecoder()) { 660eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani ALOGE("Failed to reinitialize decoder"); 661eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani } 6628f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return; 6638f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 6648f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 6658f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* Get a free slot in timestamp array to hold input timestamp */ 6668f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani { 6678f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani size_t i; 6688f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani timeStampIx = 0; 6698f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani for (i = 0; i < MAX_TIME_STAMPS; i++) { 6708f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (!mTimeStampsValid[i]) { 6718f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani timeStampIx = i; 6728f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani break; 6738f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 6748f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 6758f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (inHeader != NULL) { 6768f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mTimeStampsValid[timeStampIx] = true; 6778f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mTimeStamps[timeStampIx] = inHeader->nTimeStamp; 6788f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 6798f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 6808f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 6818f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani { 6828f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_video_decode_ip_t s_dec_ip; 6838f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_video_decode_op_t s_dec_op; 6848f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani WORD32 timeDelay, timeTaken; 6858f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani size_t sizeY, sizeUV; 6868f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 68787fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim if (!setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx)) { 68887fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ALOGE("Decoder arg setup failed"); 68987fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL); 69087fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim return; 69187fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim } 6928f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // If input dump is enabled, then write to file 6938f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani DUMP_TO_FILE(mInFile, s_dec_ip.pv_stream_buffer, s_dec_ip.u4_num_Bytes); 6948f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 6958f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (s_dec_ip.u4_num_Bytes > 0) { 6968f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani char *ptr = (char *)s_dec_ip.pv_stream_buffer; 6978f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 6988f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 6998f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani GETTIME(&mTimeStart, NULL); 7008f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* Compute time elapsed between end of previous decode() 7018f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * to start of current decode() */ 7028f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani TIME_DIFF(mTimeEnd, mTimeStart, timeDelay); 7038f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 7048f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani IV_API_CALL_STATUS_T status; 7058f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op); 7068f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 7078f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani bool unsupportedDimensions = (IMPEG2D_UNSUPPORTED_DIMENSIONS == s_dec_op.u4_error_code); 7088f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani bool resChanged = (IVD_RES_CHANGED == (s_dec_op.u4_error_code & 0xFF)); 7098f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 7106a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang getSeqInfo(); 7116a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang 7128f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani GETTIME(&mTimeEnd, NULL); 7138f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* Compute time taken for decode() */ 7148f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani TIME_DIFF(mTimeStart, mTimeEnd, timeTaken); 7158f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 7168f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGV("timeTaken=%6d delay=%6d numBytes=%6d", timeTaken, timeDelay, 7178f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani s_dec_op.u4_num_bytes_consumed); 7188f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (s_dec_op.u4_frame_decoded_flag && !mFlushNeeded) { 7198f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mFlushNeeded = true; 7208f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 7218f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 7228f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if ((inHeader != NULL) && (1 != s_dec_op.u4_frame_decoded_flag)) { 7238f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* If the input did not contain picture data, then ignore 7248f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * the associated timestamp */ 7258f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mTimeStampsValid[timeStampIx] = false; 7268f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 7278f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 7288f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // This is needed to handle CTS DecoderTest testCodecResetsMPEG2WithoutSurface, 7298f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // which is not sending SPS/PPS after port reconfiguration and flush to the codec. 7308f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (unsupportedDimensions && !mFlushNeeded) { 7318f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani bool portWillReset = false; 7328f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani handlePortSettingsChange(&portWillReset, s_dec_op.u4_pic_wd, s_dec_op.u4_pic_ht); 7338f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 734eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani if (OK != reInitDecoder()) { 735eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani ALOGE("Failed to reinitialize decoder"); 736eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani return; 737eae3ad0585d17bab12bbd831b58407c122732a1cVenkatarama Avadhani } 7388f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 73987fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim if (setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx)) { 74087fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op); 74187fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim } 7428f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return; 7438f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 7448f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 7458f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // If the decoder is in the changing resolution mode and there is no output present, 7468f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // that means the switching is done and it's ready to reset the decoder and the plugin. 7478f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (mChangingResolution && !s_dec_op.u4_output_present) { 7488f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mChangingResolution = false; 7498f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani resetDecoder(); 7508f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani resetPlugin(); 7511ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar mStride = outputBufferWidth(); 7521ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar setParams(mStride); 7538f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani continue; 7548f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 7558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 7568f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (unsupportedDimensions || resChanged) { 7578f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mChangingResolution = true; 7588f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (mFlushNeeded) { 7598f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani setFlushMode(); 7608f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 7618f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 7628f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (unsupportedDimensions) { 7638f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mNewWidth = s_dec_op.u4_pic_wd; 7648f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mNewHeight = s_dec_op.u4_pic_ht; 7658f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mInitNeeded = true; 7668f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 7678f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani continue; 7688f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 7698f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 7706a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang // Combine the resolution change and coloraspects change in one PortSettingChange event 7716a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang // if necessary. 7728f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if ((0 < s_dec_op.u4_pic_wd) && (0 < s_dec_op.u4_pic_ht)) { 7738f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani uint32_t width = s_dec_op.u4_pic_wd; 7748f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani uint32_t height = s_dec_op.u4_pic_ht; 7758f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani bool portWillReset = false; 7768f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani handlePortSettingsChange(&portWillReset, width, height); 7778f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 7788f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (portWillReset) { 7798f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani resetDecoder(); 7808437f4e9094567affaa72ba7bfab654e12e78399Ram Mohan M resetPlugin(); 7818f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return; 7828f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 7836a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang } else if (mUpdateColorAspects) { 7846a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang notify(OMX_EventPortSettingsChanged, kOutputPortIndex, 7856a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang kDescribeColorAspectsIndex, NULL); 7866a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang mUpdateColorAspects = false; 7876a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang return; 7888f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 7898f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 7908f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (s_dec_op.u4_output_present) { 791069c97e06521035e81ead2eeff8960613fed9254Chong Zhang ssize_t timeStampIdx; 792ed31e32afc3c0b3883e7dcb7f3fbfee7af2c7df2Ram Mohan outHeader->nFilledLen = (outputBufferWidth() * outputBufferHeight() * 3) / 2; 7938f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 7948f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani timeStampIdx = getMinTimestampIdx(mTimeStamps, mTimeStampsValid); 795069c97e06521035e81ead2eeff8960613fed9254Chong Zhang if (timeStampIdx < 0) { 796069c97e06521035e81ead2eeff8960613fed9254Chong Zhang ALOGE("b/62872863, Invalid timestamp index!"); 797069c97e06521035e81ead2eeff8960613fed9254Chong Zhang android_errorWriteLog(0x534e4554, "62872863"); 798069c97e06521035e81ead2eeff8960613fed9254Chong Zhang return; 799069c97e06521035e81ead2eeff8960613fed9254Chong Zhang } 8008f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani outHeader->nTimeStamp = mTimeStamps[timeStampIdx]; 8018f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mTimeStampsValid[timeStampIdx] = false; 8028f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 8038f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani /* mWaitForI waits for the first I picture. Once made FALSE, it 8048f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani has to remain false till explicitly set to TRUE. */ 8058f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani mWaitForI = mWaitForI && !(IV_I_FRAME == s_dec_op.e_pic_type); 8068f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani 8078f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani if (mWaitForI) { 8088f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani s_dec_op.u4_output_present = false; 8098f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani } else { 8108f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani ALOGV("Output timestamp: %lld, res: %ux%u", 8118f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani (long long)outHeader->nTimeStamp, mWidth, mHeight); 8128f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani DUMP_TO_FILE(mOutFile, outHeader->pBuffer, outHeader->nFilledLen); 8138f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani outInfo->mOwnedByUs = false; 8148f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani outQueue.erase(outQueue.begin()); 8158f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani outInfo = NULL; 8168f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani notifyFillBufferDone(outHeader); 8178f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani outHeader = NULL; 8188f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani } 819d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar } else if (mIsInFlush) { 8208f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* If in flush mode and no output is returned by the codec, 8218f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * then come out of flush mode */ 8228f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mIsInFlush = false; 8238f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 8248f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani /* If EOS was recieved on input port and there is no output 8258f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * from the codec, then signal EOS on output port */ 8268f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (mReceivedEOS) { 8278f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani outHeader->nFilledLen = 0; 8288f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani outHeader->nFlags |= OMX_BUFFERFLAG_EOS; 8298f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 8308f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani outInfo->mOwnedByUs = false; 8318f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani outQueue.erase(outQueue.begin()); 8328f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani outInfo = NULL; 8338f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani notifyFillBufferDone(outHeader); 8348f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani outHeader = NULL; 8358f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani resetPlugin(); 8368f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 8378f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 8388f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 8398f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 840d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar /* If input EOS is seen and decoder is not in flush mode, 841d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar * set the decoder in flush mode. 842d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar * There can be a case where EOS is sent along with last picture data 843d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar * In that case, only after decoding that input data, decoder has to be 844d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar * put in flush. This case is handled here */ 845d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar 846d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar if (mReceivedEOS && !mIsInFlush) { 847d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar setFlushMode(); 848d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar } 849d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar 8508f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // TODO: Handle more than one picture data 8518f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (inHeader != NULL) { 8528f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani inInfo->mOwnedByUs = false; 8538f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani inQueue.erase(inQueue.begin()); 8548f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani inInfo = NULL; 8558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani notifyEmptyBufferDone(inHeader); 8568f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani inHeader = NULL; 8578f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 8588f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } 8598f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 8608f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 8616a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuangint SoftMPEG2::getColorAspectPreference() { 8626a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang return kPreferBitstream; 8636a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang} 8646a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang 8658f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} // namespace android 8668f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 8678f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhaniandroid::SoftOMXComponent *createSoftOMXComponent( 8688f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani const char *name, const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData, 8698f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani OMX_COMPONENTTYPE **component) { 8708f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani return new android::SoftMPEG2(name, callbacks, appData, component); 8718f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 872