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[] = {
51e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel52 },
52e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
53e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel52 },
54e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
55e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel52 },
56e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani};
57e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
58e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama AvadhaniSoftAVC::SoftAVC(
59e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        const char *name,
60e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        const OMX_CALLBACKTYPE *callbacks,
61e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        OMX_PTR appData,
62e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        OMX_COMPONENTTYPE **component)
63e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    : SoftVideoDecoderOMXComponent(
64e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            name, componentName, codingType,
65e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            kProfileLevels, ARRAY_SIZE(kProfileLevels),
66e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            320 /* width */, 240 /* height */, callbacks,
67e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            appData, component),
6890599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S      mCodecCtx(NULL),
69e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani      mFlushOutBuffer(NULL),
70e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani      mOmxColorFormat(OMX_COLOR_FormatYUV420Planar),
71e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani      mIvColorFormat(IV_YUV_420P),
7290599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S      mChangingResolution(false),
734d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar      mSignalledError(false),
74dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar      mStride(mWidth),
75dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar      mInputOffset(0){
76e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    initPorts(
77a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang            1 /* numMinInputBuffers */, kNumBuffers, INPUT_BUF_SIZE,
78a6bfb5060824f01041f956c733fec141504c280bHangyu Kuang            1 /* numMinOutputBuffers */, kNumBuffers, CODEC_MIME_TYPE);
79e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
80f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen    mTimeStart = mTimeEnd = systemTime();
81e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
82e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    // If input dump is enabled, then open create an empty file
83e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    GENERATE_FILE_NAMES();
84e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    CREATE_DUMP_FILE(mInFile);
85e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
86e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
87e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama AvadhaniSoftAVC::~SoftAVC() {
88e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    CHECK_EQ(deInitDecoder(), (status_t)OK);
89e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
90e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
914d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakarstatic void *ivd_aligned_malloc(void *ctxt, WORD32 alignment, WORD32 size) {
924d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    UNUSED(ctxt);
934d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    return memalign(alignment, size);
944d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar}
954d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar
964d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakarstatic void ivd_aligned_free(void *ctxt, void *buf) {
974d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    UNUSED(ctxt);
984d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    free(buf);
994d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    return;
1004d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar}
1014d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar
102e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatic size_t GetCPUCoreCount() {
103e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    long cpuCoreCount = 1;
104e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#if defined(_SC_NPROCESSORS_ONLN)
105e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN);
106e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#else
107e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    // _SC_NPROC_ONLN must be defined...
108e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    cpuCoreCount = sysconf(_SC_NPROC_ONLN);
109e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#endif
110e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    CHECK(cpuCoreCount >= 1);
1114d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    ALOGV("Number of CPU cores: %ld", cpuCoreCount);
112e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    return (size_t)cpuCoreCount;
113e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
114e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
115e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanivoid SoftAVC::logVersion() {
116e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ivd_ctl_getversioninfo_ip_t s_ctl_ip;
117e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ivd_ctl_getversioninfo_op_t s_ctl_op;
118e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    UWORD8 au1_buf[512];
119e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    IV_API_CALL_STATUS_T status;
120e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
121e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
122e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETVERSION;
123e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_ip.u4_size = sizeof(ivd_ctl_getversioninfo_ip_t);
124e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_op.u4_size = sizeof(ivd_ctl_getversioninfo_op_t);
125e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_ip.pv_version_buffer = au1_buf;
126e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_ip.u4_version_buffer_size = sizeof(au1_buf);
127e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
128e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    status =
129e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op);
130e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
131e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    if (status != IV_SUCCESS) {
132e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ALOGE("Error in getting version number: 0x%x",
133e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                s_ctl_op.u4_error_code);
134e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    } else {
135e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ALOGV("Ittiam decoder version number: %s",
136e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                (char *)s_ctl_ip.pv_version_buffer);
137e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    }
138e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    return;
139e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
140e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
141e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::setParams(size_t stride) {
142e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ivd_ctl_set_config_ip_t s_ctl_ip;
143e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ivd_ctl_set_config_op_t s_ctl_op;
144e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    IV_API_CALL_STATUS_T status;
145e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_ip.u4_disp_wd = (UWORD32)stride;
146e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_ip.e_frm_skip_mode = IVD_SKIP_NONE;
147e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
148e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
149e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_ip.e_vid_dec_mode = IVD_DECODE_FRAME;
150e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
151e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
152e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_ip.u4_size = sizeof(ivd_ctl_set_config_ip_t);
153e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_op.u4_size = sizeof(ivd_ctl_set_config_op_t);
154e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
155ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar    ALOGV("Set the run-time (dynamic) parameters stride = %zu", stride);
156e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op);
157e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
158e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    if (status != IV_SUCCESS) {
159e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ALOGE("Error in setting the run-time parameters: 0x%x",
160e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                s_ctl_op.u4_error_code);
161e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
162e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        return UNKNOWN_ERROR;
163e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    }
164e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    return OK;
165e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
166e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
167e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::resetPlugin() {
168e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    mIsInFlush = false;
169e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    mReceivedEOS = false;
170dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar    mInputOffset = 0;
171e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    memset(mTimeStamps, 0, sizeof(mTimeStamps));
172e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    memset(mTimeStampsValid, 0, sizeof(mTimeStampsValid));
173e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
174e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    /* Initialize both start and end times */
175f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen    mTimeStart = mTimeEnd = systemTime();
176e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
177e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    return OK;
178e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
179e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
180e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::resetDecoder() {
181e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ivd_ctl_reset_ip_t s_ctl_ip;
182e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ivd_ctl_reset_op_t s_ctl_op;
183e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    IV_API_CALL_STATUS_T status;
184e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
185e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
186e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_RESET;
187e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_ip.u4_size = sizeof(ivd_ctl_reset_ip_t);
188e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_ctl_op.u4_size = sizeof(ivd_ctl_reset_op_t);
189e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
190e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op);
191e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    if (IV_SUCCESS != status) {
192e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ALOGE("Error in reset: 0x%x", s_ctl_op.u4_error_code);
193e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        return UNKNOWN_ERROR;
194e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    }
19590599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S    mSignalledError = false;
196e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
197e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    /* Set number of cores/threads to be used by the codec */
198e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    setNumCores();
199e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
2004d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    mStride = 0;
201e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    return OK;
202e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
203e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
204e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::setNumCores() {
205e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ivdext_ctl_set_num_cores_ip_t s_set_cores_ip;
206e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ivdext_ctl_set_num_cores_op_t s_set_cores_op;
207e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    IV_API_CALL_STATUS_T status;
208e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_set_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL;
209e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_set_cores_ip.e_sub_cmd = IVDEXT_CMD_CTL_SET_NUM_CORES;
210e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_set_cores_ip.u4_num_cores = MIN(mNumCores, CODEC_MAX_NUM_CORES);
211e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_set_cores_ip.u4_size = sizeof(ivdext_ctl_set_num_cores_ip_t);
212e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_set_cores_op.u4_size = sizeof(ivdext_ctl_set_num_cores_op_t);
213e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    status = ivdec_api_function(
214e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            mCodecCtx, (void *)&s_set_cores_ip, (void *)&s_set_cores_op);
215e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    if (IV_SUCCESS != status) {
216e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ALOGE("Error in setting number of cores: 0x%x",
217e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                s_set_cores_op.u4_error_code);
218e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        return UNKNOWN_ERROR;
219e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    }
220e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    return OK;
221e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
222e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
223e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::setFlushMode() {
224e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    IV_API_CALL_STATUS_T status;
225e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ivd_ctl_flush_ip_t s_video_flush_ip;
226e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ivd_ctl_flush_op_t s_video_flush_op;
227e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
228e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_video_flush_ip.e_cmd = IVD_CMD_VIDEO_CTL;
229e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_video_flush_ip.e_sub_cmd = IVD_CMD_CTL_FLUSH;
230e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_video_flush_ip.u4_size = sizeof(ivd_ctl_flush_ip_t);
231e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    s_video_flush_op.u4_size = sizeof(ivd_ctl_flush_op_t);
232e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
233e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    /* Set the decoder in Flush mode, subsequent decode() calls will flush */
234e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    status = ivdec_api_function(
235e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            mCodecCtx, (void *)&s_video_flush_ip, (void *)&s_video_flush_op);
236e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
237e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    if (status != IV_SUCCESS) {
238e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ALOGE("Error in setting the decoder in flush mode: (%d) 0x%x", status,
239e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                s_video_flush_op.u4_error_code);
240e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        return UNKNOWN_ERROR;
241e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    }
242e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
243e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    mIsInFlush = true;
244e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    return OK;
245e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
246e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
2474d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakarstatus_t SoftAVC::initDecoder() {
248e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    IV_API_CALL_STATUS_T status;
249e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
250e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    mNumCores = GetCPUCoreCount();
25190599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S    mCodecCtx = NULL;
252e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
2534d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    mStride = outputBufferWidth();
254e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
255e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    /* Initialize the decoder */
256e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    {
2574d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        ivdext_create_ip_t s_create_ip;
2584d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        ivdext_create_op_t s_create_op;
259e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
260e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        void *dec_fxns = (void *)ivdec_api_function;
261e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
2624d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        s_create_ip.s_ivd_create_ip_t.u4_size = sizeof(ivdext_create_ip_t);
2634d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        s_create_ip.s_ivd_create_ip_t.e_cmd = IVD_CMD_CREATE;
2644d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        s_create_ip.s_ivd_create_ip_t.u4_share_disp_buf = 0;
2654d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        s_create_op.s_ivd_create_op_t.u4_size = sizeof(ivdext_create_op_t);
2664d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        s_create_ip.s_ivd_create_ip_t.e_output_format = mIvColorFormat;
2674d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        s_create_ip.s_ivd_create_ip_t.pf_aligned_alloc = ivd_aligned_malloc;
2684d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        s_create_ip.s_ivd_create_ip_t.pf_aligned_free = ivd_aligned_free;
2694d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        s_create_ip.s_ivd_create_ip_t.pv_mem_ctxt = NULL;
270e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
2714d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        status = ivdec_api_function(mCodecCtx, (void *)&s_create_ip, (void *)&s_create_op);
272e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
2734d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        mCodecCtx = (iv_obj_t*)s_create_op.s_ivd_create_op_t.pv_handle;
274e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        mCodecCtx->pv_fxns = dec_fxns;
275e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        mCodecCtx->u4_size = sizeof(iv_obj_t);
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        }
284e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    }
285e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
286e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    /* Reset the plugin state */
287e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    resetPlugin();
288e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
289e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    /* Set the run time (dynamic) parameters */
2904d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    setParams(mStride);
291e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
292e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    /* Set number of cores/threads to be used by the codec */
293e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    setNumCores();
294e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
295e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    /* Get codec version */
296e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    logVersion();
297e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
298e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    mFlushNeeded = false;
299e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    return OK;
300e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
301e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
302e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistatus_t SoftAVC::deInitDecoder() {
303e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    size_t i;
3044d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    IV_API_CALL_STATUS_T status;
305e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
3064d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    if (mCodecCtx) {
3074d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        ivdext_delete_ip_t s_delete_ip;
3084d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        ivdext_delete_op_t s_delete_op;
309e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
3104d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        s_delete_ip.s_ivd_delete_ip_t.u4_size = sizeof(ivdext_delete_ip_t);
3114d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        s_delete_ip.s_ivd_delete_ip_t.e_cmd = IVD_CMD_DELETE;
3124d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar
3134d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        s_delete_op.s_ivd_delete_op_t.u4_size = sizeof(ivdext_delete_op_t);
3144d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar
3154d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        status = ivdec_api_function(mCodecCtx, (void *)&s_delete_ip, (void *)&s_delete_op);
3164d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        if (status != IV_SUCCESS) {
3174d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar            ALOGE("Error in delete: 0x%x",
3184d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar                    s_delete_op.s_ivd_delete_op_t.u4_error_code);
3194d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar            return UNKNOWN_ERROR;
320e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        }
321e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    }
322e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
323e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
324e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    mChangingResolution = false;
325e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
326e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    return OK;
327e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
328e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
329e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanivoid SoftAVC::onReset() {
330e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    SoftVideoDecoderOMXComponent::onReset();
331e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
33290599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S    mSignalledError = false;
333e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    resetDecoder();
334e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    resetPlugin();
335e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
336e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
337c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuangbool SoftAVC::getVUIParams() {
338c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    IV_API_CALL_STATUS_T status;
339c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    ih264d_ctl_get_vui_params_ip_t s_ctl_get_vui_params_ip;
340c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    ih264d_ctl_get_vui_params_op_t s_ctl_get_vui_params_op;
341c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
342c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    s_ctl_get_vui_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
343c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    s_ctl_get_vui_params_ip.e_sub_cmd =
344c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang        (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_GET_VUI_PARAMS;
345c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
346c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    s_ctl_get_vui_params_ip.u4_size =
347c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang        sizeof(ih264d_ctl_get_vui_params_ip_t);
348c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
349c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    s_ctl_get_vui_params_op.u4_size = sizeof(ih264d_ctl_get_vui_params_op_t);
350c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
351c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    status = ivdec_api_function(
352c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang            (iv_obj_t *)mCodecCtx, (void *)&s_ctl_get_vui_params_ip,
353c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang            (void *)&s_ctl_get_vui_params_op);
354c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
355c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    if (status != IV_SUCCESS) {
356c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang        ALOGW("Error in getting VUI params: 0x%x",
357c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang                s_ctl_get_vui_params_op.u4_error_code);
358c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang        return false;
359c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    }
360c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
361c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    int32_t primaries = s_ctl_get_vui_params_op.u1_colour_primaries;
362c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    int32_t transfer = s_ctl_get_vui_params_op.u1_tfr_chars;
363c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    int32_t coeffs = s_ctl_get_vui_params_op.u1_matrix_coeffs;
364c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    bool fullRange = s_ctl_get_vui_params_op.u1_video_full_range_flag;
365c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
366c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    ColorAspects colorAspects;
367c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    ColorUtils::convertIsoColorAspectsToCodecAspects(
368c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang            primaries, transfer, coeffs, fullRange, colorAspects);
369c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
370c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    // Update color aspects if necessary.
371c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    if (colorAspectsDiffer(colorAspects, mBitstreamColorAspects)) {
372c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang        mBitstreamColorAspects = colorAspects;
373c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang        status_t err = handleColorAspectsChange();
374c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang        CHECK(err == OK);
375c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    }
376c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    return true;
377c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang}
378c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
37987fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kimbool SoftAVC::setDecodeArgs(
380e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ivd_video_decode_ip_t *ps_dec_ip,
381e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ivd_video_decode_op_t *ps_dec_op,
382e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        OMX_BUFFERHEADERTYPE *inHeader,
383e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        OMX_BUFFERHEADERTYPE *outHeader,
384e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        size_t timeStampIx) {
385e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    size_t sizeY = outputBufferWidth() * outputBufferHeight();
386e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    size_t sizeUV;
387e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
388e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ps_dec_ip->u4_size = sizeof(ivd_video_decode_ip_t);
389e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ps_dec_op->u4_size = sizeof(ivd_video_decode_op_t);
390e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
391e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ps_dec_ip->e_cmd = IVD_CMD_VIDEO_DECODE;
392e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
393e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    /* When in flush and after EOS with zero byte input,
394e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani     * inHeader is set to zero. Hence check for non-null */
395e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    if (inHeader) {
396e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ps_dec_ip->u4_ts = timeStampIx;
397e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ps_dec_ip->pv_stream_buffer =
398dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar            inHeader->pBuffer + inHeader->nOffset + mInputOffset;
399dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar        ps_dec_ip->u4_num_Bytes = inHeader->nFilledLen - mInputOffset;
400e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    } else {
401e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ps_dec_ip->u4_ts = 0;
402e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ps_dec_ip->pv_stream_buffer = NULL;
403e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ps_dec_ip->u4_num_Bytes = 0;
404e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    }
405e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
40687fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim    sizeUV = sizeY / 4;
40787fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[0] = sizeY;
40887fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[1] = sizeUV;
40987fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[2] = sizeUV;
41087fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim
41187fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim    uint8_t *pBuf;
412e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    if (outHeader) {
41387fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim        if (outHeader->nAllocLen < sizeY + (sizeUV * 2)) {
414ff64ea33382081f46d4b1061df00298bbbe3dd65Wonsik Kim            android_errorWriteLog(0x534e4554, "27833616");
41587fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim            return false;
41687fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim        }
417e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        pBuf = outHeader->pBuffer;
418e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    } else {
41987fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim        // mFlushOutBuffer always has the right size.
420e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        pBuf = mFlushOutBuffer;
421e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    }
422e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
423e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ps_dec_ip->s_out_buffer.pu1_bufs[0] = pBuf;
424e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ps_dec_ip->s_out_buffer.pu1_bufs[1] = pBuf + sizeY;
425e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ps_dec_ip->s_out_buffer.pu1_bufs[2] = pBuf + sizeY + sizeUV;
426e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    ps_dec_ip->s_out_buffer.u4_num_bufs = 3;
42787fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim    return true;
428e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
429e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanivoid SoftAVC::onPortFlushCompleted(OMX_U32 portIndex) {
430e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    /* Once the output buffers are flushed, ignore any buffers that are held in decoder */
431e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    if (kOutputPortIndex == portIndex) {
432e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        setFlushMode();
433e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
4344d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        /* Allocate a picture buffer to flushed data */
4354d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        uint32_t displayStride = outputBufferWidth();
4364d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        uint32_t displayHeight = outputBufferHeight();
4374d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar
4384d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        uint32_t bufferSize = displayStride * displayHeight * 3 / 2;
4394d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        mFlushOutBuffer = (uint8_t *)memalign(128, bufferSize);
4404d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        if (NULL == mFlushOutBuffer) {
4412720c8b094cfa58de314daa8e5e4fb4fa81fe3b2Marco Nelissen            ALOGE("Could not allocate flushOutputBuffer of size %u", bufferSize);
4424d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar            return;
4434d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        }
4444d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar
445e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        while (true) {
446e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            ivd_video_decode_ip_t s_dec_ip;
447e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            ivd_video_decode_op_t s_dec_op;
448e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            IV_API_CALL_STATUS_T status;
449e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            size_t sizeY, sizeUV;
450e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
451e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            setDecodeArgs(&s_dec_ip, &s_dec_op, NULL, NULL, 0);
452e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
453e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op);
454e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            if (0 == s_dec_op.u4_output_present) {
455e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                resetPlugin();
456e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                break;
457e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            }
458e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        }
4594d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar
4604d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        if (mFlushOutBuffer) {
4614d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar            free(mFlushOutBuffer);
4624d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar            mFlushOutBuffer = NULL;
4634d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        }
4644d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar
465e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    }
466e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
467e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
468e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanivoid SoftAVC::onQueueFilled(OMX_U32 portIndex) {
469e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    UNUSED(portIndex);
470dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar    OMX_BUFFERHEADERTYPE *inHeader = NULL;
471dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar    BufferInfo *inInfo = NULL;
472e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
47390599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S    if (mSignalledError) {
47490599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S        return;
47590599b61289fbeda8312e6633c551a6e3d1a0adaHamsalekha S    }
476e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    if (mOutputPortSettingsChange != NONE) {
477e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        return;
478e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    }
479e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
4804d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    if (NULL == mCodecCtx) {
4814d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        if (OK != initDecoder()) {
482c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar            ALOGE("Failed to initialize decoder");
483c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar            notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL);
484c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar            mSignalledError = true;
4854d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar            return;
4864d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        }
4874d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    }
4884d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    if (outputBufferWidth() != mStride) {
4894d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        /* Set the run-time (dynamic) parameters */
4904d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        mStride = outputBufferWidth();
4914d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar        setParams(mStride);
4924d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    }
4934d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar
494e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    List<BufferInfo *> &inQueue = getPortQueue(kInputPortIndex);
495e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    List<BufferInfo *> &outQueue = getPortQueue(kOutputPortIndex);
496e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
497e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    while (!outQueue.empty()) {
498e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        BufferInfo *outInfo;
499e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        OMX_BUFFERHEADERTYPE *outHeader;
500dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar        size_t timeStampIx = 0;
501e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
502dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar        if (!mIsInFlush && (NULL == inHeader)) {
503e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            if (!inQueue.empty()) {
504e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                inInfo = *inQueue.begin();
505e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                inHeader = inInfo->mHeader;
506fd866b3aa0d97375de08f8888b95669026c83361Wei Jia                if (inHeader == NULL) {
507fd866b3aa0d97375de08f8888b95669026c83361Wei Jia                    inQueue.erase(inQueue.begin());
508fd866b3aa0d97375de08f8888b95669026c83361Wei Jia                    inInfo->mOwnedByUs = false;
509fd866b3aa0d97375de08f8888b95669026c83361Wei Jia                    continue;
510fd866b3aa0d97375de08f8888b95669026c83361Wei Jia                }
511e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            } else {
512e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                break;
513e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            }
514e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        }
515e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
516e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        outInfo = *outQueue.begin();
517e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        outHeader = outInfo->mHeader;
518e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        outHeader->nFlags = 0;
519e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        outHeader->nTimeStamp = 0;
520e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        outHeader->nOffset = 0;
521e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
522fd866b3aa0d97375de08f8888b95669026c83361Wei Jia        if (inHeader != NULL) {
523e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            if (inHeader->nFilledLen == 0) {
524e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                inQueue.erase(inQueue.begin());
525e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                inInfo->mOwnedByUs = false;
526e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                notifyEmptyBufferDone(inHeader);
527fd866b3aa0d97375de08f8888b95669026c83361Wei Jia
528fd866b3aa0d97375de08f8888b95669026c83361Wei Jia                if (!(inHeader->nFlags & OMX_BUFFERFLAG_EOS)) {
529fd866b3aa0d97375de08f8888b95669026c83361Wei Jia                    continue;
530fd866b3aa0d97375de08f8888b95669026c83361Wei Jia                }
531fd866b3aa0d97375de08f8888b95669026c83361Wei Jia
532fd866b3aa0d97375de08f8888b95669026c83361Wei Jia                mReceivedEOS = true;
533e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                inHeader = NULL;
534e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                setFlushMode();
535fd866b3aa0d97375de08f8888b95669026c83361Wei Jia            } else if (inHeader->nFlags & OMX_BUFFERFLAG_EOS) {
536fd866b3aa0d97375de08f8888b95669026c83361Wei Jia                mReceivedEOS = true;
537e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            }
538e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        }
539e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
540e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        /* Get a free slot in timestamp array to hold input timestamp */
541e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        {
542e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            size_t i;
543e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            timeStampIx = 0;
544e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            for (i = 0; i < MAX_TIME_STAMPS; i++) {
545e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                if (!mTimeStampsValid[i]) {
546e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                    timeStampIx = i;
547e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                    break;
548e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                }
549e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            }
550e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            if (inHeader != NULL) {
551e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                mTimeStampsValid[timeStampIx] = true;
552e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                mTimeStamps[timeStampIx] = inHeader->nTimeStamp;
553e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            }
554e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        }
555e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
556e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        {
557e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            ivd_video_decode_ip_t s_dec_ip;
558e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            ivd_video_decode_op_t s_dec_op;
559f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen            nsecs_t timeDelay, timeTaken;
560e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            size_t sizeY, sizeUV;
561e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
56287fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim            if (!setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx)) {
56387fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim                ALOGE("Decoder arg setup failed");
56487fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim                notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
56587fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim                mSignalledError = true;
56687fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim                return;
56787fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim            }
568e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            // If input dump is enabled, then write to file
569dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar            DUMP_TO_FILE(mInFile, s_dec_ip.pv_stream_buffer, s_dec_ip.u4_num_Bytes, mInputOffset);
570e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
571f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen            mTimeStart = systemTime();
572e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            /* Compute time elapsed between end of previous decode()
573e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani             * to start of current decode() */
574f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen            timeDelay = mTimeStart - mTimeEnd;
575e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
576e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            IV_API_CALL_STATUS_T status;
577e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op);
578e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
57999e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar            bool unsupportedResolution =
58099e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar                (IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED == (s_dec_op.u4_error_code & 0xFF));
58199e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar
58299e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar            /* Check for unsupported dimensions */
58399e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar            if (unsupportedResolution) {
58499e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar                ALOGE("Unsupported resolution : %dx%d", mWidth, mHeight);
58599e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar                notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL);
58699e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar                mSignalledError = true;
58799e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar                return;
58899e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar            }
58999e5e3b00291f2f7010a96dcdf014f4aa337ee23Harish Mahendrakar
590c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar            bool allocationFailed = (IVD_MEM_ALLOC_FAILED == (s_dec_op.u4_error_code & 0xFF));
591c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar            if (allocationFailed) {
592c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar                ALOGE("Allocation failure in decoder");
593c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar                notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL);
594c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar                mSignalledError = true;
595c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar                return;
596c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar            }
597c7e892937448915a89d3aaef369ecfe3999bd4ebHarish Mahendrakar
598e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            bool resChanged = (IVD_RES_CHANGED == (s_dec_op.u4_error_code & 0xFF));
599e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
600c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang            getVUIParams();
601c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
602f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen            mTimeEnd = systemTime();
603e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            /* Compute time taken for decode() */
604f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen            timeTaken = mTimeEnd - mTimeStart;
605e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
606f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen            ALOGV("timeTaken=%6lldus delay=%6lldus numBytes=%6d",
607f293e928dcd53a0bba40865698864d45ea214015Marco Nelissen                    (long long) (timeTaken / 1000ll), (long long) (timeDelay / 1000ll),
608e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                   s_dec_op.u4_num_bytes_consumed);
609e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            if (s_dec_op.u4_frame_decoded_flag && !mFlushNeeded) {
610e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                mFlushNeeded = true;
611e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            }
612e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
613e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            if ((inHeader != NULL) && (1 != s_dec_op.u4_frame_decoded_flag)) {
614e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                /* If the input did not contain picture data, then ignore
615e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                 * the associated timestamp */
616e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                mTimeStampsValid[timeStampIx] = false;
617e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            }
618e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
619e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            // If the decoder is in the changing resolution mode and there is no output present,
620e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            // that means the switching is done and it's ready to reset the decoder and the plugin.
621e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            if (mChangingResolution && !s_dec_op.u4_output_present) {
622e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                mChangingResolution = false;
623e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                resetDecoder();
624e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                resetPlugin();
625a34a5cca7791d80bdbfe0ef9659e1f991ad23e78Harish Mahendrakar                mStride = outputBufferWidth();
626a34a5cca7791d80bdbfe0ef9659e1f991ad23e78Harish Mahendrakar                setParams(mStride);
627e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                continue;
628e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            }
629e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
6304d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar            if (resChanged) {
631e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                mChangingResolution = true;
632e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                if (mFlushNeeded) {
633e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                    setFlushMode();
634e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                }
63511aaefb57fdd0076eb5484c3c5bd3bff5f6cb5e0Marco Nelissen                continue;
63611aaefb57fdd0076eb5484c3c5bd3bff5f6cb5e0Marco Nelissen            }
63711aaefb57fdd0076eb5484c3c5bd3bff5f6cb5e0Marco Nelissen
638c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang            // Combine the resolution change and coloraspects change in one PortSettingChange event
639c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang            // if necessary.
640e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            if ((0 < s_dec_op.u4_pic_wd) && (0 < s_dec_op.u4_pic_ht)) {
641e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                uint32_t width = s_dec_op.u4_pic_wd;
642e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                uint32_t height = s_dec_op.u4_pic_ht;
643e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                bool portWillReset = false;
644e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                handlePortSettingsChange(&portWillReset, width, height);
645e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                if (portWillReset) {
646e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                    resetDecoder();
6478437f4e9094567affaa72ba7bfab654e12e78399Ram Mohan M                    resetPlugin();
648e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                    return;
649e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                }
650c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang            } else if (mUpdateColorAspects) {
651c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang                notify(OMX_EventPortSettingsChanged, kOutputPortIndex,
652c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang                    kDescribeColorAspectsIndex, NULL);
653c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang                mUpdateColorAspects = false;
654c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang                return;
655e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            }
656e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
657e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            if (s_dec_op.u4_output_present) {
6583ecc9db40b1fb9c7f807a5892e5c9625aac1fb06Marco Nelissen                outHeader->nFilledLen = (outputBufferWidth() * outputBufferHeight() * 3) / 2;
659e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
660e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                outHeader->nTimeStamp = mTimeStamps[s_dec_op.u4_ts];
661e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                mTimeStampsValid[s_dec_op.u4_ts] = false;
662e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
663e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                outInfo->mOwnedByUs = false;
664e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                outQueue.erase(outQueue.begin());
665e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                outInfo = NULL;
666e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                notifyFillBufferDone(outHeader);
667e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                outHeader = NULL;
668d971f83dda9605b1dcd05746b94d2800ebd8595cHarish Mahendrakar            } else if (mIsInFlush) {
669e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                /* If in flush mode and no output is returned by the codec,
670e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                 * then come out of flush mode */
671e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                mIsInFlush = false;
672e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
673e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                /* If EOS was recieved on input port and there is no output
674e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                 * from the codec, then signal EOS on output port */
675e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                if (mReceivedEOS) {
676e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                    outHeader->nFilledLen = 0;
677e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                    outHeader->nFlags |= OMX_BUFFERFLAG_EOS;
678e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
679e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                    outInfo->mOwnedByUs = false;
680e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                    outQueue.erase(outQueue.begin());
681e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                    outInfo = NULL;
682e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                    notifyFillBufferDone(outHeader);
683e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                    outHeader = NULL;
684e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                    resetPlugin();
685e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani                }
686e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            }
687dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar            mInputOffset += s_dec_op.u4_num_bytes_consumed;
688e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        }
689dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar        // If more than 4 bytes are remaining in input, then do not release it
690dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar        if (inHeader != NULL && ((inHeader->nFilledLen - mInputOffset) <= 4)) {
691e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            inInfo->mOwnedByUs = false;
692e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            inQueue.erase(inQueue.begin());
693e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            inInfo = NULL;
694e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            notifyEmptyBufferDone(inHeader);
695e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            inHeader = NULL;
696dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar            mInputOffset = 0;
697dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar
698dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar            /* If input EOS is seen and decoder is not in flush mode,
699dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar             * set the decoder in flush mode.
700dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar             * There can be a case where EOS is sent along with last picture data
701dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar             * In that case, only after decoding that input data, decoder has to be
702dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar             * put in flush. This case is handled here  */
703dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar
704dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar            if (mReceivedEOS && !mIsInFlush) {
705dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar                setFlushMode();
706dd6e6a250846653a7661219fe7033b87d1181eb5Harish Mahendrakar            }
707e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        }
708e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    }
709e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
710e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
711c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuangint SoftAVC::getColorAspectPreference() {
712c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang    return kPreferBitstream;
713c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang}
714c2e98f5f60460890195b33abe40e376f800b242eHangyu Kuang
715e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}  // namespace android
716e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
717e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhaniandroid::SoftOMXComponent *createSoftOMXComponent(
718e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        const char *name, const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData,
719e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        OMX_COMPONENTTYPE **component) {
720e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    return new android::SoftAVC(name, callbacks, appData, component);
721e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
722