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