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