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