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_MPEG2LevelLL  },
518f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    { OMX_VIDEO_MPEG2ProfileSimple, OMX_VIDEO_MPEG2LevelML  },
528f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    { OMX_VIDEO_MPEG2ProfileSimple, OMX_VIDEO_MPEG2LevelH14 },
538f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    { OMX_VIDEO_MPEG2ProfileSimple, OMX_VIDEO_MPEG2LevelHL  },
548f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    { OMX_VIDEO_MPEG2ProfileMain  , OMX_VIDEO_MPEG2LevelLL  },
568f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    { OMX_VIDEO_MPEG2ProfileMain  , OMX_VIDEO_MPEG2LevelML  },
578f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    { OMX_VIDEO_MPEG2ProfileMain  , OMX_VIDEO_MPEG2LevelH14 },
588f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    { OMX_VIDEO_MPEG2ProfileMain  , OMX_VIDEO_MPEG2LevelHL  },
598f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani};
608f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
618f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama AvadhaniSoftMPEG2::SoftMPEG2(
628f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        const char *name,
638f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        const OMX_CALLBACKTYPE *callbacks,
648f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        OMX_PTR appData,
658f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        OMX_COMPONENTTYPE **component)
668f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    : SoftVideoDecoderOMXComponent(
678f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            name, componentName, codingType,
688f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            kProfileLevels, ARRAY_SIZE(kProfileLevels),
698f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            320 /* width */, 240 /* height */, callbacks,
708f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            appData, component),
718f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani      mMemRecords(NULL),
728f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani      mFlushOutBuffer(NULL),
738f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani      mOmxColorFormat(OMX_COLOR_FormatYUV420Planar),
748f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani      mIvColorFormat(IV_YUV_420P),
758f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani      mNewWidth(mWidth),
768f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani      mNewHeight(mHeight),
771ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar      mChangingResolution(false),
781ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar      mStride(mWidth) {
798f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    initPorts(kNumBuffers, INPUT_BUF_SIZE, kNumBuffers, CODEC_MIME_TYPE);
808f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
818f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    // If input dump is enabled, then open create an empty file
828f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    GENERATE_FILE_NAMES();
838f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    CREATE_DUMP_FILE(mInFile);
848f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
858f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    CHECK_EQ(initDecoder(), (status_t)OK);
868f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}
878f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
888f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama AvadhaniSoftMPEG2::~SoftMPEG2() {
898f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    CHECK_EQ(deInitDecoder(), (status_t)OK);
908f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}
918f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
928f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
938f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistatic size_t getMinTimestampIdx(OMX_S64 *pNTimeStamp, bool *pIsTimeStampValid) {
948f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    OMX_S64 minTimeStamp = LLONG_MAX;
958f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    int idx = -1;
968f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    for (size_t i = 0; i < MAX_TIME_STAMPS; i++) {
978f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        if (pIsTimeStampValid[i]) {
988f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            if (pNTimeStamp[i] < minTimeStamp) {
998f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                minTimeStamp = pNTimeStamp[i];
1008f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                idx = i;
1018f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            }
1028f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        }
1038f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    }
1048f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    return idx;
1058f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}
1068f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
1078f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistatic size_t GetCPUCoreCount() {
1088f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    long cpuCoreCount = 1;
1098f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#if defined(_SC_NPROCESSORS_ONLN)
1108f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN);
1118f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#else
1128f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    // _SC_NPROC_ONLN must be defined...
1138f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    cpuCoreCount = sysconf(_SC_NPROC_ONLN);
1148f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#endif
1158f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    CHECK(cpuCoreCount >= 1);
1168f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    ALOGV("Number of CPU cores: %ld", cpuCoreCount);
1178f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    return (size_t)cpuCoreCount;
1188f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}
1198f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
1208f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanivoid SoftMPEG2::logVersion() {
1218f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    ivd_ctl_getversioninfo_ip_t s_ctl_ip;
1228f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    ivd_ctl_getversioninfo_op_t s_ctl_op;
1238f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    UWORD8 au1_buf[512];
1248f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    IV_API_CALL_STATUS_T status;
1258f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
1268f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
1278f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETVERSION;
1288f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_ip.u4_size = sizeof(ivd_ctl_getversioninfo_ip_t);
1298f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_op.u4_size = sizeof(ivd_ctl_getversioninfo_op_t);
1308f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_ip.pv_version_buffer = au1_buf;
1318f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_ip.u4_version_buffer_size = sizeof(au1_buf);
1328f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
1338f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op);
1348f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
1358f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    if (status != IV_SUCCESS) {
1368f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        ALOGE("Error in getting version number: 0x%x",
1378f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                s_ctl_op.u4_error_code);
1388f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    } else {
1398f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        ALOGV("Ittiam decoder version number: %s",
1408f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                (char *)s_ctl_ip.pv_version_buffer);
1418f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    }
1428f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    return;
1438f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}
1448f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
1458f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistatus_t SoftMPEG2::setParams(size_t stride) {
1468f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    ivd_ctl_set_config_ip_t s_ctl_ip;
1478f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    ivd_ctl_set_config_op_t s_ctl_op;
1488f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    IV_API_CALL_STATUS_T status;
1498f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_ip.u4_disp_wd = (UWORD32)stride;
1508f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_ip.e_frm_skip_mode = IVD_SKIP_NONE;
1518f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
1528f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
1538f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_ip.e_vid_dec_mode = IVD_DECODE_FRAME;
1548f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
1558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
1568f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_ip.u4_size = sizeof(ivd_ctl_set_config_ip_t);
1578f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_op.u4_size = sizeof(ivd_ctl_set_config_op_t);
1588f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
159ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar    ALOGV("Set the run-time (dynamic) parameters stride = %zu", stride);
1608f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op);
1618f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
1628f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    if (status != IV_SUCCESS) {
1638f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        ALOGE("Error in setting the run-time parameters: 0x%x",
1648f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                s_ctl_op.u4_error_code);
1658f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
1668f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        return UNKNOWN_ERROR;
1678f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    }
1688f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    return OK;
1698f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}
1708f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
1718f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistatus_t SoftMPEG2::resetPlugin() {
1728f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    mIsInFlush = false;
1738f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    mReceivedEOS = false;
1748f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    memset(mTimeStamps, 0, sizeof(mTimeStamps));
1758f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    memset(mTimeStampsValid, 0, sizeof(mTimeStampsValid));
1768f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
1778f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    /* Initialize both start and end times */
1788f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    gettimeofday(&mTimeStart, NULL);
1798f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    gettimeofday(&mTimeEnd, NULL);
1808f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
1818f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    return OK;
1828f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}
1838f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
1848f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistatus_t SoftMPEG2::resetDecoder() {
1858f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    ivd_ctl_reset_ip_t s_ctl_ip;
1868f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    ivd_ctl_reset_op_t s_ctl_op;
1878f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    IV_API_CALL_STATUS_T status;
1888f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
1898f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
1908f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_RESET;
1918f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_ip.u4_size = sizeof(ivd_ctl_reset_ip_t);
1928f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    s_ctl_op.u4_size = sizeof(ivd_ctl_reset_op_t);
1938f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
1948f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op);
1958f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    if (IV_SUCCESS != status) {
1968f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        ALOGE("Error in reset: 0x%x", s_ctl_op.u4_error_code);
1978f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        return UNKNOWN_ERROR;
1988f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    }
1998f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
2008f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    /* Set the run-time (dynamic) parameters */
2018f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    setParams(outputBufferWidth());
2028f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
2038f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    /* Set number of cores/threads to be used by the codec */
2048f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    setNumCores();
2058f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
2061ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar    mStride = 0;
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;
4368f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
4378f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    return OK;
4388f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}
4398f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
4408f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistatus_t SoftMPEG2::reInitDecoder() {
4418f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    status_t ret;
4428f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
4438f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    deInitDecoder();
4448f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
4458f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    ret = initDecoder();
4468f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    if (OK != ret) {
4478f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        ALOGE("Create failure");
4488f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        deInitDecoder();
4498f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        return NO_MEMORY;
4508f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    }
4518f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    return OK;
4528f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}
4538f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
4548f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanivoid SoftMPEG2::onReset() {
4558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    SoftVideoDecoderOMXComponent::onReset();
4568f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
4578f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani    mWaitForI = true;
4588f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani
4598f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    resetDecoder();
4608f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    resetPlugin();
4618f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}
4628f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
4636a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuangbool SoftMPEG2::getSeqInfo() {
4646a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    IV_API_CALL_STATUS_T status;
4656a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    impeg2d_ctl_get_seq_info_ip_t s_ctl_get_seq_info_ip;
4666a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    impeg2d_ctl_get_seq_info_op_t s_ctl_get_seq_info_op;
4676a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang
4686a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    s_ctl_get_seq_info_ip.e_cmd = IVD_CMD_VIDEO_CTL;
4696a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    s_ctl_get_seq_info_ip.e_sub_cmd =
4706a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang        (IVD_CONTROL_API_COMMAND_TYPE_T)IMPEG2D_CMD_CTL_GET_SEQ_INFO;
4716a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang
4726a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    s_ctl_get_seq_info_ip.u4_size = sizeof(impeg2d_ctl_get_seq_info_ip_t);
4736a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    s_ctl_get_seq_info_op.u4_size = sizeof(impeg2d_ctl_get_seq_info_op_t);
4746a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang
4756a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    status = ivdec_api_function(
4766a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang            (iv_obj_t *)mCodecCtx, (void *)&s_ctl_get_seq_info_ip,
4776a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang            (void *)&s_ctl_get_seq_info_op);
4786a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang
4796a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    if (status != IV_SUCCESS) {
4806a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang        ALOGW("Error in getting Sequence info: 0x%x",
4816a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang                s_ctl_get_seq_info_op.u4_error_code);
4826a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang        return false;
4836a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    }
4846a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang
4856a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang
4866a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    int32_t primaries = s_ctl_get_seq_info_op.u1_colour_primaries;
4876a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    int32_t transfer = s_ctl_get_seq_info_op.u1_transfer_characteristics;
4886a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    int32_t coeffs = s_ctl_get_seq_info_op.u1_matrix_coefficients;
4896a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    bool fullRange = false;  // mpeg2 video has limited range.
4906a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang
4916a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    ColorAspects colorAspects;
4926a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    ColorUtils::convertIsoColorAspectsToCodecAspects(
4936a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang            primaries, transfer, coeffs, fullRange, colorAspects);
4946a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang
4956a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    // Update color aspects if necessary.
4966a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    if (colorAspectsDiffer(colorAspects, mBitstreamColorAspects)) {
4976a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang        mBitstreamColorAspects = colorAspects;
4986a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang        status_t err = handleColorAspectsChange();
4996a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang        CHECK(err == OK);
5006a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    }
5016a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    return true;
5026a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang}
5036a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang
5048f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama AvadhaniOMX_ERRORTYPE SoftMPEG2::internalSetParameter(OMX_INDEXTYPE index, const OMX_PTR params) {
5058f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    const uint32_t oldWidth = mWidth;
5068f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    const uint32_t oldHeight = mHeight;
5078f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    OMX_ERRORTYPE ret = SoftVideoDecoderOMXComponent::internalSetParameter(index, params);
5088f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    if (mWidth != oldWidth || mHeight != oldHeight) {
5098f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        reInitDecoder();
5108f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    }
5118f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    return ret;
5128f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}
5138f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
51487fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kimbool SoftMPEG2::setDecodeArgs(
5158f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        ivd_video_decode_ip_t *ps_dec_ip,
5168f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        ivd_video_decode_op_t *ps_dec_op,
5178f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        OMX_BUFFERHEADERTYPE *inHeader,
5188f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        OMX_BUFFERHEADERTYPE *outHeader,
5198f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        size_t timeStampIx) {
5208f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    size_t sizeY = outputBufferWidth() * outputBufferHeight();
5218f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    size_t sizeUV;
5228f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
5238f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    ps_dec_ip->u4_size = sizeof(ivd_video_decode_ip_t);
5248f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    ps_dec_op->u4_size = sizeof(ivd_video_decode_op_t);
5258f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
5268f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    ps_dec_ip->e_cmd = IVD_CMD_VIDEO_DECODE;
5278f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
5288f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    /* When in flush and after EOS with zero byte input,
5298f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani     * inHeader is set to zero. Hence check for non-null */
5308f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    if (inHeader) {
5318f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        ps_dec_ip->u4_ts = timeStampIx;
5328f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        ps_dec_ip->pv_stream_buffer = inHeader->pBuffer
5338f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                + inHeader->nOffset;
5348f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        ps_dec_ip->u4_num_Bytes = inHeader->nFilledLen;
5358f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    } else {
5368f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        ps_dec_ip->u4_ts = 0;
5378f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        ps_dec_ip->pv_stream_buffer = NULL;
5388f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        ps_dec_ip->u4_num_Bytes = 0;
5398f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    }
5408f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
54187fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim    sizeUV = sizeY / 4;
54287fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[0] = sizeY;
54387fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[1] = sizeUV;
54487fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[2] = sizeUV;
54587fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim
54687fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim    uint8_t *pBuf;
5478f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    if (outHeader) {
54887fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim        if (outHeader->nAllocLen < sizeY + (sizeUV * 2)) {
549ff64ea33382081f46d4b1061df00298bbbe3dd65Wonsik Kim            android_errorWriteLog(0x534e4554, "27833616");
55087fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim            return false;
55187fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim        }
5528f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        pBuf = outHeader->pBuffer;
5538f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    } else {
55487fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim        // mFlushOutBuffer always has the right size.
5558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        pBuf = mFlushOutBuffer;
5568f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    }
5578f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
5588f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    ps_dec_ip->s_out_buffer.pu1_bufs[0] = pBuf;
5598f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    ps_dec_ip->s_out_buffer.pu1_bufs[1] = pBuf + sizeY;
5608f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    ps_dec_ip->s_out_buffer.pu1_bufs[2] = pBuf + sizeY + sizeUV;
5618f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    ps_dec_ip->s_out_buffer.u4_num_bufs = 3;
56287fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim    return true;
5638f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}
5648f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanivoid SoftMPEG2::onPortFlushCompleted(OMX_U32 portIndex) {
5658f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    /* Once the output buffers are flushed, ignore any buffers that are held in decoder */
5668f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    if (kOutputPortIndex == portIndex) {
5678f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        setFlushMode();
5688f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
5698f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        while (true) {
5708f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            ivd_video_decode_ip_t s_dec_ip;
5718f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            ivd_video_decode_op_t s_dec_op;
5728f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            IV_API_CALL_STATUS_T status;
5738f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            size_t sizeY, sizeUV;
5748f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
5758f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            setDecodeArgs(&s_dec_ip, &s_dec_op, NULL, NULL, 0);
5768f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
5778f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op);
5788f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            if (0 == s_dec_op.u4_output_present) {
5798f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                resetPlugin();
5808f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                break;
5818f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            }
5828f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        }
5838f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    }
5848f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}
5858f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
5868f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanivoid SoftMPEG2::onQueueFilled(OMX_U32 portIndex) {
5878f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    UNUSED(portIndex);
5888f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
5898f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    if (mOutputPortSettingsChange != NONE) {
5908f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        return;
5918f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    }
5928f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
5938f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    List<BufferInfo *> &inQueue = getPortQueue(kInputPortIndex);
5948f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    List<BufferInfo *> &outQueue = getPortQueue(kOutputPortIndex);
5958f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
5961ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar    if (outputBufferWidth() != mStride) {
5971ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar        /* Set the run-time (dynamic) parameters */
5981ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar        mStride = outputBufferWidth();
5991ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar        setParams(mStride);
6001ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar    }
6011ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar
6028f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    while (!outQueue.empty()) {
6038f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        BufferInfo *inInfo;
6048f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        OMX_BUFFERHEADERTYPE *inHeader;
6058f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
6068f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        BufferInfo *outInfo;
6078f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        OMX_BUFFERHEADERTYPE *outHeader;
6088f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        size_t timeStampIx;
6098f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
6108f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        inInfo = NULL;
6118f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        inHeader = NULL;
6128f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
6138f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        if (!mIsInFlush) {
6148f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            if (!inQueue.empty()) {
6158f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                inInfo = *inQueue.begin();
6168f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                inHeader = inInfo->mHeader;
6178f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            } else {
6188f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                break;
6198f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            }
6208f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        }
6218f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
6228f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        outInfo = *outQueue.begin();
6238f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        outHeader = outInfo->mHeader;
6248f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        outHeader->nFlags = 0;
6258f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        outHeader->nTimeStamp = 0;
6268f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        outHeader->nOffset = 0;
6278f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
6288f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        if (inHeader != NULL && (inHeader->nFlags & OMX_BUFFERFLAG_EOS)) {
6298f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            mReceivedEOS = true;
6308f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            if (inHeader->nFilledLen == 0) {
6318f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                inQueue.erase(inQueue.begin());
6328f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                inInfo->mOwnedByUs = false;
6338f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                notifyEmptyBufferDone(inHeader);
6348f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                inHeader = NULL;
6358f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                setFlushMode();
6368f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            }
6378f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        }
6388f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
6398f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        // When there is an init required and the decoder is not in flush mode,
6408f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        // update output port's definition and reinitialize decoder.
6418f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        if (mInitNeeded && !mIsInFlush) {
6428f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            bool portWillReset = false;
6438f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            handlePortSettingsChange(&portWillReset, mNewWidth, mNewHeight);
6448f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
6458f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            CHECK_EQ(reInitDecoder(), (status_t)OK);
6468f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            return;
6478f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        }
6488f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
6498f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        /* Get a free slot in timestamp array to hold input timestamp */
6508f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        {
6518f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            size_t i;
6528f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            timeStampIx = 0;
6538f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            for (i = 0; i < MAX_TIME_STAMPS; i++) {
6548f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                if (!mTimeStampsValid[i]) {
6558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                    timeStampIx = i;
6568f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                    break;
6578f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                }
6588f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            }
6598f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            if (inHeader != NULL) {
6608f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                mTimeStampsValid[timeStampIx] = true;
6618f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                mTimeStamps[timeStampIx] = inHeader->nTimeStamp;
6628f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            }
6638f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        }
6648f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
6658f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        {
6668f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            ivd_video_decode_ip_t s_dec_ip;
6678f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            ivd_video_decode_op_t s_dec_op;
6688f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            WORD32 timeDelay, timeTaken;
6698f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            size_t sizeY, sizeUV;
6708f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
67187fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim            if (!setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx)) {
67287fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim                ALOGE("Decoder arg setup failed");
67387fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim                notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
67487fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim                return;
67587fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim            }
6768f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            // If input dump is enabled, then write to file
6778f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            DUMP_TO_FILE(mInFile, s_dec_ip.pv_stream_buffer, s_dec_ip.u4_num_Bytes);
6788f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
6798f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            if (s_dec_ip.u4_num_Bytes > 0) {
6808f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                char *ptr = (char *)s_dec_ip.pv_stream_buffer;
6818f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            }
6828f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
6838f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            GETTIME(&mTimeStart, NULL);
6848f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            /* Compute time elapsed between end of previous decode()
6858f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani             * to start of current decode() */
6868f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            TIME_DIFF(mTimeEnd, mTimeStart, timeDelay);
6878f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
6888f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            IV_API_CALL_STATUS_T status;
6898f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op);
6908f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
6918f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            bool unsupportedDimensions = (IMPEG2D_UNSUPPORTED_DIMENSIONS == s_dec_op.u4_error_code);
6928f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            bool resChanged = (IVD_RES_CHANGED == (s_dec_op.u4_error_code & 0xFF));
6938f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
6946a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang            getSeqInfo();
6956a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang
6968f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            GETTIME(&mTimeEnd, NULL);
6978f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            /* Compute time taken for decode() */
6988f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            TIME_DIFF(mTimeStart, mTimeEnd, timeTaken);
6998f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
7008f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            ALOGV("timeTaken=%6d delay=%6d numBytes=%6d", timeTaken, timeDelay,
7018f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                   s_dec_op.u4_num_bytes_consumed);
7028f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            if (s_dec_op.u4_frame_decoded_flag && !mFlushNeeded) {
7038f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                mFlushNeeded = true;
7048f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            }
7058f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
7068f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            if ((inHeader != NULL) && (1 != s_dec_op.u4_frame_decoded_flag)) {
7078f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                /* If the input did not contain picture data, then ignore
7088f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                 * the associated timestamp */
7098f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                mTimeStampsValid[timeStampIx] = false;
7108f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            }
7118f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
7128f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            // This is needed to handle CTS DecoderTest testCodecResetsMPEG2WithoutSurface,
7138f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            // which is not sending SPS/PPS after port reconfiguration and flush to the codec.
7148f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            if (unsupportedDimensions && !mFlushNeeded) {
7158f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                bool portWillReset = false;
7168f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                handlePortSettingsChange(&portWillReset, s_dec_op.u4_pic_wd, s_dec_op.u4_pic_ht);
7178f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
7188f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                CHECK_EQ(reInitDecoder(), (status_t)OK);
7198f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
72087fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim                if (setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx)) {
72187fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim                    ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op);
72287fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim                }
7238f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                return;
7248f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            }
7258f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
7268f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            // If the decoder is in the changing resolution mode and there is no output present,
7278f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            // that means the switching is done and it's ready to reset the decoder and the plugin.
7288f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            if (mChangingResolution && !s_dec_op.u4_output_present) {
7298f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                mChangingResolution = false;
7308f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                resetDecoder();
7318f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                resetPlugin();
7321ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar                mStride = outputBufferWidth();
7331ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar                setParams(mStride);
7348f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                continue;
7358f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            }
7368f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
7378f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            if (unsupportedDimensions || resChanged) {
7388f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                mChangingResolution = true;
7398f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                if (mFlushNeeded) {
7408f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                    setFlushMode();
7418f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                }
7428f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
7438f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                if (unsupportedDimensions) {
7448f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                    mNewWidth = s_dec_op.u4_pic_wd;
7458f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                    mNewHeight = s_dec_op.u4_pic_ht;
7468f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                    mInitNeeded = true;
7478f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                }
7488f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                continue;
7498f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            }
7508f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
7516a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang            // Combine the resolution change and coloraspects change in one PortSettingChange event
7526a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang            // if necessary.
7538f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            if ((0 < s_dec_op.u4_pic_wd) && (0 < s_dec_op.u4_pic_ht)) {
7548f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                uint32_t width = s_dec_op.u4_pic_wd;
7558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                uint32_t height = s_dec_op.u4_pic_ht;
7568f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                bool portWillReset = false;
7578f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                handlePortSettingsChange(&portWillReset, width, height);
7588f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
7598f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                if (portWillReset) {
7608f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                    resetDecoder();
7618f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                    return;
7628f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                }
7636a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang            } else if (mUpdateColorAspects) {
7646a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang                notify(OMX_EventPortSettingsChanged, kOutputPortIndex,
7656a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang                    kDescribeColorAspectsIndex, NULL);
7666a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang                mUpdateColorAspects = false;
7676a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang                return;
7688f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            }
7698f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
7708f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            if (s_dec_op.u4_output_present) {
7718f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                size_t timeStampIdx;
7728f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                outHeader->nFilledLen = (mWidth * mHeight * 3) / 2;
7738f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
7748f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                timeStampIdx = getMinTimestampIdx(mTimeStamps, mTimeStampsValid);
7758f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                outHeader->nTimeStamp = mTimeStamps[timeStampIdx];
7768f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                mTimeStampsValid[timeStampIdx] = false;
7778f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
7788f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani                /* mWaitForI waits for the first I picture. Once made FALSE, it
7798f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani                   has to remain false till explicitly set to TRUE. */
7808f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani                mWaitForI = mWaitForI && !(IV_I_FRAME == s_dec_op.e_pic_type);
7818f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani
7828f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani                if (mWaitForI) {
7838f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani                    s_dec_op.u4_output_present = false;
7848f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani                } else {
7858f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani                    ALOGV("Output timestamp: %lld, res: %ux%u",
7868f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani                            (long long)outHeader->nTimeStamp, mWidth, mHeight);
7878f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani                    DUMP_TO_FILE(mOutFile, outHeader->pBuffer, outHeader->nFilledLen);
7888f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani                    outInfo->mOwnedByUs = false;
7898f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani                    outQueue.erase(outQueue.begin());
7908f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani                    outInfo = NULL;
7918f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani                    notifyFillBufferDone(outHeader);
7928f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani                    outHeader = NULL;
7938f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani                }
794d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar            } else if (mIsInFlush) {
7958f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                /* If in flush mode and no output is returned by the codec,
7968f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                 * then come out of flush mode */
7978f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                mIsInFlush = false;
7988f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
7998f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                /* If EOS was recieved on input port and there is no output
8008f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                 * from the codec, then signal EOS on output port */
8018f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                if (mReceivedEOS) {
8028f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                    outHeader->nFilledLen = 0;
8038f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                    outHeader->nFlags |= OMX_BUFFERFLAG_EOS;
8048f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
8058f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                    outInfo->mOwnedByUs = false;
8068f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                    outQueue.erase(outQueue.begin());
8078f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                    outInfo = NULL;
8088f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                    notifyFillBufferDone(outHeader);
8098f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                    outHeader = NULL;
8108f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                    resetPlugin();
8118f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani                }
8128f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            }
8138f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        }
8148f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
815d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar        /* If input EOS is seen and decoder is not in flush mode,
816d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar         * set the decoder in flush mode.
817d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar         * There can be a case where EOS is sent along with last picture data
818d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar         * In that case, only after decoding that input data, decoder has to be
819d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar         * put in flush. This case is handled here  */
820d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar
821d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar        if (mReceivedEOS && !mIsInFlush) {
822d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar            setFlushMode();
823d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar        }
824d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar
8258f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        // TODO: Handle more than one picture data
8268f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        if (inHeader != NULL) {
8278f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            inInfo->mOwnedByUs = false;
8288f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            inQueue.erase(inQueue.begin());
8298f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            inInfo = NULL;
8308f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            notifyEmptyBufferDone(inHeader);
8318f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani            inHeader = NULL;
8328f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        }
8338f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    }
8348f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}
8358f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
8366a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuangint SoftMPEG2::getColorAspectPreference() {
8376a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang    return kPreferBitstream;
8386a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang}
8396a9e943d353cfed56017d46aebc2ccdb39fc1d57Hangyu Kuang
8408f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}  // namespace android
8418f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani
8428f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhaniandroid::SoftOMXComponent *createSoftOMXComponent(
8438f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        const char *name, const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData,
8448f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani        OMX_COMPONENTTYPE **component) {
8458f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani    return new android::SoftMPEG2(name, callbacks, appData, component);
8468f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}
847