1033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim/*
2033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * Copyright 2018 The Android Open Source Project
3033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim *
4033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * Licensed under the Apache License, Version 2.0 (the "License");
5033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * you may not use this file except in compliance with the License.
6033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * You may obtain a copy of the License at
7033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim *
8033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim *      http://www.apache.org/licenses/LICENSE-2.0
9033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim *
10033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * Unless required by applicable law or agreed to in writing, software
11033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * distributed under the License is distributed on an "AS IS" BASIS,
12033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * See the License for the specific language governing permissions and
14033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * limitations under the License.
15033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim */
16033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
17d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar//#define LOG_NDEBUG 0
18033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define LOG_TAG "C2SoftAvcEnc"
19d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include <log/log.h>
20033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include <utils/misc.h>
21033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
225d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar#include <media/hardware/VideoAPI.h>
23033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include <media/stagefright/MediaDefs.h>
24033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include <media/stagefright/MediaErrors.h>
25033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include <media/stagefright/MetaData.h>
265d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar#include <media/stagefright/foundation/AUtils.h>
279fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim
28d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include <C2Debug.h>
29033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include <C2PlatformSupport.h>
305d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar#include <Codec2BufferUtils.h>
3172dc0b6eea5a305d58537dcd2ee28e23c72b6e44Lajos Molnar#include <SimpleC2Interface.h>
329fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim#include <util/C2InterfaceHelper.h>
33033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
34d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include "C2SoftAvcEnc.h"
35033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include "ih264e.h"
36033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include "ih264e_error.h"
37033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
38033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimnamespace android {
39033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
409fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kimclass C2SoftAvcEnc::IntfImpl : public C2InterfaceHelper {
419fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kimpublic:
429fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    explicit IntfImpl(const std::shared_ptr<C2ReflectorHelper> &helper)
439fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        : C2InterfaceHelper(helper) {
449fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim
459fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        setDerivedInstance(this);
469fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim
479fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        addParameter(
489fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                DefineParam(mInputFormat, C2_NAME_INPUT_STREAM_FORMAT_SETTING)
499fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .withConstValue(new C2StreamFormatConfig::input(0u, C2FormatVideo))
509fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .build());
519fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim
529fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        addParameter(
539fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                DefineParam(mOutputFormat, C2_NAME_OUTPUT_STREAM_FORMAT_SETTING)
549fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .withConstValue(new C2StreamFormatConfig::output(0u, C2FormatCompressed))
559fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .build());
569fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim
579fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        addParameter(
589fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                DefineParam(mInputMediaType, C2_NAME_INPUT_PORT_MIME_SETTING)
599fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .withConstValue(AllocSharedString<C2PortMimeConfig::input>(
609fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                        MEDIA_MIMETYPE_VIDEO_RAW))
619fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .build());
629fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim
639fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        addParameter(
64e15da79378e753bbd20f1c0f5c6858cc89bd4141Wonsik Kim                DefineParam(mOutputMediaType, C2_NAME_OUTPUT_PORT_MIME_SETTING)
659fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .withConstValue(AllocSharedString<C2PortMimeConfig::output>(
669fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                        MEDIA_MIMETYPE_VIDEO_AVC))
679fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .build());
689fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim
699fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        addParameter(
70e15da79378e753bbd20f1c0f5c6858cc89bd4141Wonsik Kim                DefineParam(mUsage, C2_NAME_INPUT_STREAM_USAGE_SETTING)
719fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .withConstValue(new C2StreamUsageTuning::input(
729fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                        0u, (uint64_t)C2MemoryUsage::CPU_READ))
739fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .build());
749fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim
759fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        addParameter(
769fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                DefineParam(mSize, C2_NAME_STREAM_VIDEO_SIZE_SETTING)
779fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .withDefault(new C2VideoSizeStreamTuning::input(0u, 320, 240))
789fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .withFields({
798f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim                    C2F(mSize, width).inRange(2, 2560, 2),
808f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim                    C2F(mSize, height).inRange(2, 2560, 2),
819fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                })
829fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .withSetter(SizeSetter)
839fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .build());
849fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim
859fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        addParameter(
869fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                DefineParam(mFrameRate, C2_NAME_STREAM_FRAME_RATE_SETTING)
879fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .withDefault(new C2StreamFrameRateInfo::output(0u, 30.))
889fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                // TODO: More restriction?
899fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .withFields({C2F(mFrameRate, value).greaterThan(0.)})
909fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .withSetter(Setter<decltype(*mFrameRate)>::StrictValueWithNoDeps)
919fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .build());
929fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim
939fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        addParameter(
949fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                DefineParam(mBitrate, C2_NAME_STREAM_BITRATE_SETTING)
959fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .withDefault(new C2BitrateTuning::output(0u, 64000))
969fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .withFields({C2F(mBitrate, value).inRange(1, 12000000)})
979fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .withSetter(Setter<decltype(*mBitrate)>::NonStrictValueWithNoDeps)
989fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                .build());
999fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    }
1009fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim
1019fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    static C2R SizeSetter(bool mayBlock, C2P<C2VideoSizeStreamTuning::input> &me) {
1029fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        (void)mayBlock;
1039fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        // TODO: maybe apply block limit?
1048f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim        C2R res = C2R::Ok();
1058f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim        if (!me.F(me.v.width).supportsAtAll(me.v.width)) {
1068f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim            res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.width)));
1078f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim        }
1088f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim        if (!me.F(me.v.height).supportsAtAll(me.v.height)) {
1098f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim            res = res.plus(C2SettingResultBuilder::BadValue(me.F(me.v.height)));
1108f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim        }
1118f591386a913c5aaf23b4f6bb824f43b7b8a0b7eWonsik Kim        return res;
1129fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    }
1139fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim
1149fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    uint32_t getWidth() const { return mSize->width; }
1159fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    uint32_t getHeight() const { return mSize->height; }
1169fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    float getFrameRate() const { return mFrameRate->value; }
1179fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    uint32_t getBitrate() const { return mBitrate->value; }
1189fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim
1199fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kimprivate:
1209fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    std::shared_ptr<C2StreamFormatConfig::input> mInputFormat;
1219fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    std::shared_ptr<C2StreamFormatConfig::output> mOutputFormat;
1229fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    std::shared_ptr<C2PortMimeConfig::input> mInputMediaType;
1239fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    std::shared_ptr<C2PortMimeConfig::output> mOutputMediaType;
1249fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    std::shared_ptr<C2StreamUsageTuning::input> mUsage;
1259fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    std::shared_ptr<C2VideoSizeStreamTuning::input> mSize;
1269fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    std::shared_ptr<C2StreamFrameRateInfo::output> mFrameRate;
1279fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    std::shared_ptr<C2BitrateTuning::output> mBitrate;
1289fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim};
1299fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim
130033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ive_api_function  ih264e_api_function
131033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1325c2c3d46fc95a4e08dbd7a7a3304e389d85faa86Lajos Molnarconstexpr char COMPONENT_NAME[] = "c2.android.avc.encoder";
133033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
134033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimnamespace {
135033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
136033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim// From external/libavc/encoder/ih264e_bitstream.h
137033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimconstexpr uint32_t MIN_STREAM_SIZE = 0x800;
138033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
139033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimstatic size_t GetCPUCoreCount() {
140033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    long cpuCoreCount = 1;
141033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#if defined(_SC_NPROCESSORS_ONLN)
142033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN);
143033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#else
144033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // _SC_NPROC_ONLN must be defined...
145033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    cpuCoreCount = sysconf(_SC_NPROC_ONLN);
146033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#endif
147033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    CHECK(cpuCoreCount >= 1);
148033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ALOGV("Number of CPU cores: %ld", cpuCoreCount);
149033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return (size_t)cpuCoreCount;
150033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
151033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
152033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}  // namespace
153033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1549fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik KimC2SoftAvcEnc::C2SoftAvcEnc(
1559fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        const char *name, c2_node_id_t id, const std::shared_ptr<IntfImpl> &intfImpl)
1569fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    : SimpleC2Component(std::make_shared<SimpleInterface<IntfImpl>>(name, id, intfImpl)),
1579fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim      mIntf(intfImpl),
158033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim      mUpdateFlag(0),
159033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim      mIvVideoColorFormat(IV_YUV_420P),
160033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim      mAVCEncProfile(IV_PROFILE_BASE),
161033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim      mAVCEncLevel(41),
162033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim      mStarted(false),
163033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim      mSawInputEOS(false),
164033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim      mSawOutputEOS(false),
165033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim      mSignalledError(false),
166033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim      mCodecCtx(NULL),
167033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim      // TODO: output buffer size
168033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim      mOutBufferSize(524288) {
169033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
170033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // If dump is enabled, then open create an empty file
171033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    GENERATE_FILE_NAMES();
172033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    CREATE_DUMP_FILE(mInFile);
173033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    CREATE_DUMP_FILE(mOutFile);
174033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
175033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    initEncParams();
176033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
177033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
178033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik KimC2SoftAvcEnc::~C2SoftAvcEnc() {
179033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    releaseEncoder();
180033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
181033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
182033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::onInit() {
183033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
184033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
185033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
186033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::onStop() {
187033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
188033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
189033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
190033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimvoid C2SoftAvcEnc::onReset() {
191033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // TODO: use IVE_CMD_CTL_RESET?
192033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    releaseEncoder();
193033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    initEncParams();
194033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
195033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
196033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimvoid C2SoftAvcEnc::onRelease() {
197033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    releaseEncoder();
198033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
199033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
200033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::onFlush_sm() {
201033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // TODO: use IVE_CMD_CTL_FLUSH?
202033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
203033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
204033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
205033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimvoid  C2SoftAvcEnc::initEncParams() {
206033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mCodecCtx = NULL;
207033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mMemRecords = NULL;
208033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mNumMemRecords = DEFAULT_MEM_REC_CNT;
209033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mHeaderGenerated = 0;
210033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mNumCores = GetCPUCoreCount();
211033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mArch = DEFAULT_ARCH;
212033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mSliceMode = DEFAULT_SLICE_MODE;
213033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mSliceParam = DEFAULT_SLICE_PARAM;
214033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mHalfPelEnable = DEFAULT_HPEL;
215033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mIInterval = DEFAULT_I_INTERVAL;
216033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mIDRInterval = DEFAULT_IDR_INTERVAL;
217033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mDisableDeblkLevel = DEFAULT_DISABLE_DEBLK_LEVEL;
218033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mEnableFastSad = DEFAULT_ENABLE_FAST_SAD;
219033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mEnableAltRef = DEFAULT_ENABLE_ALT_REF;
220033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mEncSpeed = DEFAULT_ENC_SPEED;
221033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mIntra4x4 = DEFAULT_INTRA4x4;
222033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mConstrainedIntraFlag = DEFAULT_CONSTRAINED_INTRA;
223033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mAIRMode = DEFAULT_AIR;
224033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mAIRRefreshPeriod = DEFAULT_AIR_REFRESH_PERIOD;
225033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mPSNREnable = DEFAULT_PSNR_ENABLE;
226033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mReconEnable = DEFAULT_RECON_ENABLE;
227033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mEntropyMode = DEFAULT_ENTROPY_MODE;
228033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mBframes = DEFAULT_B_FRAMES;
229033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
230033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    gettimeofday(&mTimeStart, NULL);
231033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    gettimeofday(&mTimeEnd, NULL);
232033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
233033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
234033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setDimensions() {
235033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_dimensions_ip_t s_dimensions_ip;
236033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_dimensions_op_t s_dimensions_op;
237033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
238033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
239033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_dimensions_ip.e_cmd = IVE_CMD_VIDEO_CTL;
240033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_dimensions_ip.e_sub_cmd = IVE_CMD_CTL_SET_DIMENSIONS;
2419fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    s_dimensions_ip.u4_ht = mIntf->getHeight();
2429fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    s_dimensions_ip.u4_wd = mIntf->getWidth();
243033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
244033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_dimensions_ip.u4_timestamp_high = -1;
245033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_dimensions_ip.u4_timestamp_low = -1;
246033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
247033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_dimensions_ip.u4_size = sizeof(ive_ctl_set_dimensions_ip_t);
248033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_dimensions_op.u4_size = sizeof(ive_ctl_set_dimensions_op_t);
249033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
250033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status = ive_api_function(mCodecCtx, &s_dimensions_ip, &s_dimensions_op);
251033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (status != IV_SUCCESS) {
252033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Unable to set frame dimensions = 0x%x\n",
253033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                s_dimensions_op.u4_error_code);
254033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
255033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
256033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
257033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
258033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
259033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setNumCores() {
260033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
261033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_num_cores_ip_t s_num_cores_ip;
262033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_num_cores_op_t s_num_cores_op;
263033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_num_cores_ip.e_cmd = IVE_CMD_VIDEO_CTL;
264033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_num_cores_ip.e_sub_cmd = IVE_CMD_CTL_SET_NUM_CORES;
265033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_num_cores_ip.u4_num_cores = MIN(mNumCores, CODEC_MAX_CORES);
266033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_num_cores_ip.u4_timestamp_high = -1;
267033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_num_cores_ip.u4_timestamp_low = -1;
268033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_num_cores_ip.u4_size = sizeof(ive_ctl_set_num_cores_ip_t);
269033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
270033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_num_cores_op.u4_size = sizeof(ive_ctl_set_num_cores_op_t);
271033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
272033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status = ive_api_function(
273033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            mCodecCtx, (void *) &s_num_cores_ip, (void *) &s_num_cores_op);
274033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (status != IV_SUCCESS) {
275033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Unable to set processor params = 0x%x\n",
276033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                s_num_cores_op.u4_error_code);
277033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
278033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
279033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
280033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
281033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
282033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setFrameRate() {
283033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_frame_rate_ip_t s_frame_rate_ip;
284033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_frame_rate_op_t s_frame_rate_op;
285033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
286033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
287033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_frame_rate_ip.e_cmd = IVE_CMD_VIDEO_CTL;
288033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_frame_rate_ip.e_sub_cmd = IVE_CMD_CTL_SET_FRAMERATE;
289033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
2909fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    s_frame_rate_ip.u4_src_frame_rate = mIntf->getFrameRate();
2919fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    s_frame_rate_ip.u4_tgt_frame_rate = mIntf->getFrameRate();
292033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
293033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_frame_rate_ip.u4_timestamp_high = -1;
294033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_frame_rate_ip.u4_timestamp_low = -1;
295033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
296033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_frame_rate_ip.u4_size = sizeof(ive_ctl_set_frame_rate_ip_t);
297033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_frame_rate_op.u4_size = sizeof(ive_ctl_set_frame_rate_op_t);
298033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
299033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status = ive_api_function(mCodecCtx, &s_frame_rate_ip, &s_frame_rate_op);
300033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (status != IV_SUCCESS) {
301033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Unable to set frame rate = 0x%x\n",
302033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                s_frame_rate_op.u4_error_code);
303033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
304033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
305033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
306033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
307033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
308033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setIpeParams() {
309033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_ipe_params_ip_t s_ipe_params_ip;
310033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_ipe_params_op_t s_ipe_params_op;
311033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
312033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
313033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_ipe_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
314033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_ipe_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_IPE_PARAMS;
315033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
316033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_ipe_params_ip.u4_enable_intra_4x4 = mIntra4x4;
317033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_ipe_params_ip.u4_enc_speed_preset = mEncSpeed;
318033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_ipe_params_ip.u4_constrained_intra_pred = mConstrainedIntraFlag;
319033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
320033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_ipe_params_ip.u4_timestamp_high = -1;
321033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_ipe_params_ip.u4_timestamp_low = -1;
322033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
323033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_ipe_params_ip.u4_size = sizeof(ive_ctl_set_ipe_params_ip_t);
324033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_ipe_params_op.u4_size = sizeof(ive_ctl_set_ipe_params_op_t);
325033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
326033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status = ive_api_function(mCodecCtx, &s_ipe_params_ip, &s_ipe_params_op);
327033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (status != IV_SUCCESS) {
328033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Unable to set ipe params = 0x%x\n",
329033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                s_ipe_params_op.u4_error_code);
330033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
331033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
332033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
333033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
334033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
335033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setBitRate() {
336033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_bitrate_ip_t s_bitrate_ip;
337033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_bitrate_op_t s_bitrate_op;
338033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
339033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
340033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_bitrate_ip.e_cmd = IVE_CMD_VIDEO_CTL;
341033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_bitrate_ip.e_sub_cmd = IVE_CMD_CTL_SET_BITRATE;
342033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
3439fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    s_bitrate_ip.u4_target_bitrate = mIntf->getBitrate();
344033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
345033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_bitrate_ip.u4_timestamp_high = -1;
346033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_bitrate_ip.u4_timestamp_low = -1;
347033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
348033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_bitrate_ip.u4_size = sizeof(ive_ctl_set_bitrate_ip_t);
349033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_bitrate_op.u4_size = sizeof(ive_ctl_set_bitrate_op_t);
350033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
351033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status = ive_api_function(mCodecCtx, &s_bitrate_ip, &s_bitrate_op);
352033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (status != IV_SUCCESS) {
353033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Unable to set bit rate = 0x%x\n", s_bitrate_op.u4_error_code);
354033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
355033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
356033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
357033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
358033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
359033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setFrameType(IV_PICTURE_CODING_TYPE_T e_frame_type) {
360033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_frame_type_ip_t s_frame_type_ip;
361033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_frame_type_op_t s_frame_type_op;
362033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
363033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_frame_type_ip.e_cmd = IVE_CMD_VIDEO_CTL;
364033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_frame_type_ip.e_sub_cmd = IVE_CMD_CTL_SET_FRAMETYPE;
365033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
366033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_frame_type_ip.e_frame_type = e_frame_type;
367033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
368033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_frame_type_ip.u4_timestamp_high = -1;
369033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_frame_type_ip.u4_timestamp_low = -1;
370033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
371033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_frame_type_ip.u4_size = sizeof(ive_ctl_set_frame_type_ip_t);
372033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_frame_type_op.u4_size = sizeof(ive_ctl_set_frame_type_op_t);
373033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
374033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status = ive_api_function(mCodecCtx, &s_frame_type_ip, &s_frame_type_op);
375033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (status != IV_SUCCESS) {
376033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Unable to set frame type = 0x%x\n",
377033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                s_frame_type_op.u4_error_code);
378033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
379033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
380033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
381033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
382033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
383033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setQp() {
384033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_qp_ip_t s_qp_ip;
385033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_qp_op_t s_qp_op;
386033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
387033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
388033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_qp_ip.e_cmd = IVE_CMD_VIDEO_CTL;
389033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_qp_ip.e_sub_cmd = IVE_CMD_CTL_SET_QP;
390033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
391033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_qp_ip.u4_i_qp = DEFAULT_I_QP;
392033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_qp_ip.u4_i_qp_max = DEFAULT_QP_MAX;
393033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_qp_ip.u4_i_qp_min = DEFAULT_QP_MIN;
394033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
395033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_qp_ip.u4_p_qp = DEFAULT_P_QP;
396033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_qp_ip.u4_p_qp_max = DEFAULT_QP_MAX;
397033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_qp_ip.u4_p_qp_min = DEFAULT_QP_MIN;
398033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
399033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_qp_ip.u4_b_qp = DEFAULT_P_QP;
400033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_qp_ip.u4_b_qp_max = DEFAULT_QP_MAX;
401033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_qp_ip.u4_b_qp_min = DEFAULT_QP_MIN;
402033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
403033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_qp_ip.u4_timestamp_high = -1;
404033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_qp_ip.u4_timestamp_low = -1;
405033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
406033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_qp_ip.u4_size = sizeof(ive_ctl_set_qp_ip_t);
407033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_qp_op.u4_size = sizeof(ive_ctl_set_qp_op_t);
408033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
409033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status = ive_api_function(mCodecCtx, &s_qp_ip, &s_qp_op);
410033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (status != IV_SUCCESS) {
411033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Unable to set qp 0x%x\n", s_qp_op.u4_error_code);
412033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
413033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
414033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
415033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
416033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
417033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setEncMode(IVE_ENC_MODE_T e_enc_mode) {
418033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
419033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_enc_mode_ip_t s_enc_mode_ip;
420033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_enc_mode_op_t s_enc_mode_op;
421033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
422033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_enc_mode_ip.e_cmd = IVE_CMD_VIDEO_CTL;
423033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_enc_mode_ip.e_sub_cmd = IVE_CMD_CTL_SET_ENC_MODE;
424033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
425033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_enc_mode_ip.e_enc_mode = e_enc_mode;
426033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
427033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_enc_mode_ip.u4_timestamp_high = -1;
428033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_enc_mode_ip.u4_timestamp_low = -1;
429033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
430033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_enc_mode_ip.u4_size = sizeof(ive_ctl_set_enc_mode_ip_t);
431033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_enc_mode_op.u4_size = sizeof(ive_ctl_set_enc_mode_op_t);
432033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
433033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status = ive_api_function(mCodecCtx, &s_enc_mode_ip, &s_enc_mode_op);
434033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (status != IV_SUCCESS) {
435033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Unable to set in header encode mode = 0x%x\n",
436033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                s_enc_mode_op.u4_error_code);
437033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
438033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
439033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
440033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
441033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
442033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setVbvParams() {
443033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_vbv_params_ip_t s_vbv_ip;
444033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_vbv_params_op_t s_vbv_op;
445033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
446033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
447033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_vbv_ip.e_cmd = IVE_CMD_VIDEO_CTL;
448033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_vbv_ip.e_sub_cmd = IVE_CMD_CTL_SET_VBV_PARAMS;
449033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
450033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_vbv_ip.u4_vbv_buf_size = 0;
451033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_vbv_ip.u4_vbv_buffer_delay = 1000;
452033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
453033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_vbv_ip.u4_timestamp_high = -1;
454033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_vbv_ip.u4_timestamp_low = -1;
455033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
456033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_vbv_ip.u4_size = sizeof(ive_ctl_set_vbv_params_ip_t);
457033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_vbv_op.u4_size = sizeof(ive_ctl_set_vbv_params_op_t);
458033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
459033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status = ive_api_function(mCodecCtx, &s_vbv_ip, &s_vbv_op);
460033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (status != IV_SUCCESS) {
461033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Unable to set VBV params = 0x%x\n", s_vbv_op.u4_error_code);
462033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
463033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
464033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
465033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
466033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
467033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setAirParams() {
468033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_air_params_ip_t s_air_ip;
469033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_air_params_op_t s_air_op;
470033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
471033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
472033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_air_ip.e_cmd = IVE_CMD_VIDEO_CTL;
473033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_air_ip.e_sub_cmd = IVE_CMD_CTL_SET_AIR_PARAMS;
474033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
475033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_air_ip.e_air_mode = mAIRMode;
476033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_air_ip.u4_air_refresh_period = mAIRRefreshPeriod;
477033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
478033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_air_ip.u4_timestamp_high = -1;
479033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_air_ip.u4_timestamp_low = -1;
480033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
481033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_air_ip.u4_size = sizeof(ive_ctl_set_air_params_ip_t);
482033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_air_op.u4_size = sizeof(ive_ctl_set_air_params_op_t);
483033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
484033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status = ive_api_function(mCodecCtx, &s_air_ip, &s_air_op);
485033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (status != IV_SUCCESS) {
486033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Unable to set air params = 0x%x\n", s_air_op.u4_error_code);
487033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
488033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
489033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
490033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
491033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
492033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setMeParams() {
493033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
494033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_me_params_ip_t s_me_params_ip;
495033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_me_params_op_t s_me_params_op;
496033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
497033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_me_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
498033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_me_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_ME_PARAMS;
499033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
500033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_me_params_ip.u4_enable_fast_sad = mEnableFastSad;
501033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_me_params_ip.u4_enable_alt_ref = mEnableAltRef;
502033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
503033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_me_params_ip.u4_enable_hpel = mHalfPelEnable;
504033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_me_params_ip.u4_enable_qpel = DEFAULT_QPEL;
505033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_me_params_ip.u4_me_speed_preset = DEFAULT_ME_SPEED;
506033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_me_params_ip.u4_srch_rng_x = DEFAULT_SRCH_RNG_X;
507033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_me_params_ip.u4_srch_rng_y = DEFAULT_SRCH_RNG_Y;
508033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
509033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_me_params_ip.u4_timestamp_high = -1;
510033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_me_params_ip.u4_timestamp_low = -1;
511033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
512033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_me_params_ip.u4_size = sizeof(ive_ctl_set_me_params_ip_t);
513033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_me_params_op.u4_size = sizeof(ive_ctl_set_me_params_op_t);
514033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
515033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status = ive_api_function(mCodecCtx, &s_me_params_ip, &s_me_params_op);
516033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (status != IV_SUCCESS) {
517033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Unable to set me params = 0x%x\n", s_me_params_op.u4_error_code);
518033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
519033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
520033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
521033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
522033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
523033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setGopParams() {
524033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
525033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_gop_params_ip_t s_gop_params_ip;
526033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_gop_params_op_t s_gop_params_op;
527033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
528033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_gop_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
529033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_gop_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_GOP_PARAMS;
530033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
531033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_gop_params_ip.u4_i_frm_interval = mIInterval;
532033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_gop_params_ip.u4_idr_frm_interval = mIDRInterval;
533033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
534033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_gop_params_ip.u4_timestamp_high = -1;
535033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_gop_params_ip.u4_timestamp_low = -1;
536033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
537033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_gop_params_ip.u4_size = sizeof(ive_ctl_set_gop_params_ip_t);
538033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_gop_params_op.u4_size = sizeof(ive_ctl_set_gop_params_op_t);
539033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
540033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status = ive_api_function(mCodecCtx, &s_gop_params_ip, &s_gop_params_op);
541033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (status != IV_SUCCESS) {
542033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Unable to set GOP params = 0x%x\n",
543033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                s_gop_params_op.u4_error_code);
544033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
545033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
546033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
547033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
548033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
549033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setProfileParams() {
550033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
551033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_profile_params_ip_t s_profile_params_ip;
552033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_profile_params_op_t s_profile_params_op;
553033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
554033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_profile_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
555033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_profile_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_PROFILE_PARAMS;
556033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
557033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_profile_params_ip.e_profile = DEFAULT_EPROFILE;
558033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_profile_params_ip.u4_entropy_coding_mode = mEntropyMode;
559033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_profile_params_ip.u4_timestamp_high = -1;
560033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_profile_params_ip.u4_timestamp_low = -1;
561033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
562033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_profile_params_ip.u4_size = sizeof(ive_ctl_set_profile_params_ip_t);
563033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_profile_params_op.u4_size = sizeof(ive_ctl_set_profile_params_op_t);
564033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
565033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status = ive_api_function(mCodecCtx, &s_profile_params_ip, &s_profile_params_op);
566033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (status != IV_SUCCESS) {
567033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Unable to set profile params = 0x%x\n",
568033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                s_profile_params_op.u4_error_code);
569033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
570033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
571033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
572033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
573033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
574033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setDeblockParams() {
575033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
576033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_deblock_params_ip_t s_deblock_params_ip;
577033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_set_deblock_params_op_t s_deblock_params_op;
578033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
579033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_deblock_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
580033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_deblock_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_DEBLOCK_PARAMS;
581033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
582033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_deblock_params_ip.u4_disable_deblock_level = mDisableDeblkLevel;
583033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
584033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_deblock_params_ip.u4_timestamp_high = -1;
585033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_deblock_params_ip.u4_timestamp_low = -1;
586033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
587033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_deblock_params_ip.u4_size = sizeof(ive_ctl_set_deblock_params_ip_t);
588033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_deblock_params_op.u4_size = sizeof(ive_ctl_set_deblock_params_op_t);
589033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
590033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status = ive_api_function(mCodecCtx, &s_deblock_params_ip, &s_deblock_params_op);
591033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (status != IV_SUCCESS) {
592033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Unable to enable/disable deblock params = 0x%x\n",
593033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                s_deblock_params_op.u4_error_code);
594033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
595033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
596033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
597033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
598033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
599033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimvoid C2SoftAvcEnc::logVersion() {
600033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_getversioninfo_ip_t s_ctl_ip;
601033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_ctl_getversioninfo_op_t s_ctl_op;
602033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    UWORD8 au1_buf[512];
603033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
604033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
605033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_ctl_ip.e_cmd = IVE_CMD_VIDEO_CTL;
606033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_ctl_ip.e_sub_cmd = IVE_CMD_CTL_GETVERSION;
607033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_ctl_ip.u4_size = sizeof(ive_ctl_getversioninfo_ip_t);
608033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_ctl_op.u4_size = sizeof(ive_ctl_getversioninfo_op_t);
609033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_ctl_ip.pu1_version = au1_buf;
610033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_ctl_ip.u4_version_bufsize = sizeof(au1_buf);
611033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
612033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status = ive_api_function(mCodecCtx, (void *) &s_ctl_ip, (void *) &s_ctl_op);
613033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
614033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (status != IV_SUCCESS) {
615033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Error in getting version: 0x%x", s_ctl_op.u4_error_code);
616033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    } else {
617033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGV("Ittiam encoder version: %s", (char *)s_ctl_ip.pu1_version);
618033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
619033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return;
620033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
621033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
622033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::initEncoder() {
623033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
624033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    WORD32 level;
625033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    uint32_t displaySizeY;
626033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
627033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    CHECK(!mStarted);
628033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
629033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t errType = C2_OK;
630033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
6319fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    uint32_t width = mIntf->getWidth();
6329fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    uint32_t height = mIntf->getHeight();
6339fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    displaySizeY = width * height;
634033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (displaySizeY > (1920 * 1088)) {
635033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        level = 50;
636033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    } else if (displaySizeY > (1280 * 720)) {
637033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        level = 40;
638033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    } else if (displaySizeY > (720 * 576)) {
639033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        level = 31;
640033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    } else if (displaySizeY > (624 * 320)) {
641033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        level = 30;
642033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    } else if (displaySizeY > (352 * 288)) {
643033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        level = 21;
644033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    } else if (displaySizeY > (176 * 144)) {
645033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        level = 20;
646033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    } else {
647033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        level = 10;
648033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
649033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mAVCEncLevel = MAX(level, mAVCEncLevel);
650033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
6519fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    mStride = width;
652033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
653033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // TODO
654033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mIvVideoColorFormat = IV_YUV_420P;
655033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
6569fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    ALOGD("Params width %d height %d level %d colorFormat %d", width,
6579fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim            height, mAVCEncLevel, mIvVideoColorFormat);
658033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
659033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Getting Number of MemRecords */
660033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    {
661033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        iv_num_mem_rec_ip_t s_num_mem_rec_ip;
662033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        iv_num_mem_rec_op_t s_num_mem_rec_op;
663033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
664033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_num_mem_rec_ip.u4_size = sizeof(iv_num_mem_rec_ip_t);
665033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_num_mem_rec_op.u4_size = sizeof(iv_num_mem_rec_op_t);
666033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
667033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_num_mem_rec_ip.e_cmd = IV_CMD_GET_NUM_MEM_REC;
668033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
669033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        status = ive_api_function(0, &s_num_mem_rec_ip, &s_num_mem_rec_op);
670033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
671033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (status != IV_SUCCESS) {
672033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ALOGE("Get number of memory records failed = 0x%x\n",
673033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                    s_num_mem_rec_op.u4_error_code);
674033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            return C2_CORRUPTED;
675033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
676033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
677033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        mNumMemRecords = s_num_mem_rec_op.u4_num_mem_rec;
678033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
679033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
680033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Allocate array to hold memory records */
681033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (mNumMemRecords > SIZE_MAX / sizeof(iv_mem_rec_t)) {
682033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("requested memory size is too big.");
683033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
684033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
685033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mMemRecords = (iv_mem_rec_t *)malloc(mNumMemRecords * sizeof(iv_mem_rec_t));
686033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (NULL == mMemRecords) {
687033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Unable to allocate memory for hold memory records: Size %zu",
688033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                mNumMemRecords * sizeof(iv_mem_rec_t));
689033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        mSignalledError = true;
690033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
691033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
692033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
693033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    {
694033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        iv_mem_rec_t *ps_mem_rec;
695033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ps_mem_rec = mMemRecords;
696033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        for (size_t i = 0; i < mNumMemRecords; i++) {
697033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_mem_rec->u4_size = sizeof(iv_mem_rec_t);
698033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_mem_rec->pv_base = NULL;
699033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_mem_rec->u4_mem_size = 0;
700033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_mem_rec->u4_mem_alignment = 0;
701033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_mem_rec->e_mem_type = IV_NA_MEM_TYPE;
702033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
703033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_mem_rec++;
704033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
705033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
706033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
707033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Getting MemRecords Attributes */
708033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    {
709033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        iv_fill_mem_rec_ip_t s_fill_mem_rec_ip;
710033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        iv_fill_mem_rec_op_t s_fill_mem_rec_op;
711033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
712033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_fill_mem_rec_ip.u4_size = sizeof(iv_fill_mem_rec_ip_t);
713033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_fill_mem_rec_op.u4_size = sizeof(iv_fill_mem_rec_op_t);
714033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
715033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_fill_mem_rec_ip.e_cmd = IV_CMD_FILL_NUM_MEM_REC;
716033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_fill_mem_rec_ip.ps_mem_rec = mMemRecords;
717033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_fill_mem_rec_ip.u4_num_mem_rec = mNumMemRecords;
7189fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        s_fill_mem_rec_ip.u4_max_wd = width;
7199fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        s_fill_mem_rec_ip.u4_max_ht = height;
720033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_fill_mem_rec_ip.u4_max_level = mAVCEncLevel;
721033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_fill_mem_rec_ip.e_color_format = DEFAULT_INP_COLOR_FORMAT;
722033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_fill_mem_rec_ip.u4_max_ref_cnt = DEFAULT_MAX_REF_FRM;
723033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_fill_mem_rec_ip.u4_max_reorder_cnt = DEFAULT_MAX_REORDER_FRM;
724033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_fill_mem_rec_ip.u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X;
725033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_fill_mem_rec_ip.u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y;
726033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
727033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        status = ive_api_function(0, &s_fill_mem_rec_ip, &s_fill_mem_rec_op);
728033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
729033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (status != IV_SUCCESS) {
730033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ALOGE("Fill memory records failed = 0x%x\n",
731033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                    s_fill_mem_rec_op.u4_error_code);
732033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            return C2_CORRUPTED;
733033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
734033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
735033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
736033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Allocating Memory for Mem Records */
737033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    {
738033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        WORD32 total_size;
739033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        iv_mem_rec_t *ps_mem_rec;
740033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        total_size = 0;
741033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ps_mem_rec = mMemRecords;
742033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
743033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        for (size_t i = 0; i < mNumMemRecords; i++) {
744033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_mem_rec->pv_base = ive_aligned_malloc(
745033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                    ps_mem_rec->u4_mem_alignment, ps_mem_rec->u4_mem_size);
746033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            if (ps_mem_rec->pv_base == NULL) {
747033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                ALOGE("Allocation failure for mem record id %zu size %u\n", i,
748033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                        ps_mem_rec->u4_mem_size);
749033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                return C2_CORRUPTED;
750033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
751033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            }
752033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            total_size += ps_mem_rec->u4_mem_size;
753033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
754033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_mem_rec++;
755033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
756033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
757033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
758033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Codec Instance Creation */
759033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    {
760033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ive_init_ip_t s_init_ip;
761033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ive_init_op_t s_init_op;
762033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
763033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        mCodecCtx = (iv_obj_t *)mMemRecords[0].pv_base;
764033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        mCodecCtx->u4_size = sizeof(iv_obj_t);
765033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        mCodecCtx->pv_fxns = (void *)ive_api_function;
766033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
767033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.u4_size = sizeof(ive_init_ip_t);
768033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_op.u4_size = sizeof(ive_init_op_t);
769033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
770033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.e_cmd = IV_CMD_INIT;
771033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.u4_num_mem_rec = mNumMemRecords;
772033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.ps_mem_rec = mMemRecords;
7739fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        s_init_ip.u4_max_wd = width;
7749fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        s_init_ip.u4_max_ht = height;
775033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.u4_max_ref_cnt = DEFAULT_MAX_REF_FRM;
776033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.u4_max_reorder_cnt = DEFAULT_MAX_REORDER_FRM;
777033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.u4_max_level = mAVCEncLevel;
778033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.e_inp_color_fmt = mIvVideoColorFormat;
779033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
780033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (mReconEnable || mPSNREnable) {
781033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            s_init_ip.u4_enable_recon = 1;
782033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        } else {
783033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            s_init_ip.u4_enable_recon = 0;
784033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
785033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.e_recon_color_fmt = DEFAULT_RECON_COLOR_FORMAT;
786033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.e_rc_mode = DEFAULT_RC_MODE;
787033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.u4_max_framerate = DEFAULT_MAX_FRAMERATE;
788033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.u4_max_bitrate = DEFAULT_MAX_BITRATE;
789033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.u4_num_bframes = mBframes;
790033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.e_content_type = IV_PROGRESSIVE;
791033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X;
792033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y;
793033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.e_slice_mode = mSliceMode;
794033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.u4_slice_param = mSliceParam;
795033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.e_arch = mArch;
796033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        s_init_ip.e_soc = DEFAULT_SOC;
797033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
798033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        status = ive_api_function(mCodecCtx, &s_init_ip, &s_init_op);
799033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
800033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (status != IV_SUCCESS) {
801033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ALOGE("Init encoder failed = 0x%x\n", s_init_op.u4_error_code);
802033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            return C2_CORRUPTED;
803033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
804033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
805033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
806033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Get Codec Version */
807033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    logVersion();
808033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
809033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* set processor details */
810033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    setNumCores();
811033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
812033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Video control Set Frame dimensions */
813033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    setDimensions();
814033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
815033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Video control Set Frame rates */
816033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    setFrameRate();
817033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
818033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Video control Set IPE Params */
819033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    setIpeParams();
820033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
821033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Video control Set Bitrate */
822033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    setBitRate();
823033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
824033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Video control Set QP */
825033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    setQp();
826033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
827033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Video control Set AIR params */
828033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    setAirParams();
829033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
830033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Video control Set VBV params */
831033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    setVbvParams();
832033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
833033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Video control Set Motion estimation params */
834033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    setMeParams();
835033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
836033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Video control Set GOP params */
837033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    setGopParams();
838033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
839033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Video control Set Deblock params */
840033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    setDeblockParams();
841033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
842033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Video control Set Profile params */
843033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    setProfileParams();
844033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
845033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Video control Set in Encode header mode */
846033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    setEncMode(IVE_ENC_MODE_HEADER);
847033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
848033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ALOGV("init_codec successfull");
849033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
850033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mSpsPpsHeaderReceived = false;
851033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mStarted = true;
852033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
853033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
854033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
855033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
856033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::releaseEncoder() {
857033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status = IV_SUCCESS;
858033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    iv_retrieve_mem_rec_ip_t s_retrieve_mem_ip;
859033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    iv_retrieve_mem_rec_op_t s_retrieve_mem_op;
860033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    iv_mem_rec_t *ps_mem_rec;
861033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
862033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (!mStarted) {
863033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_OK;
864033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
865033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
866033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_retrieve_mem_ip.u4_size = sizeof(iv_retrieve_mem_rec_ip_t);
867033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_retrieve_mem_op.u4_size = sizeof(iv_retrieve_mem_rec_op_t);
868033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_retrieve_mem_ip.e_cmd = IV_CMD_RETRIEVE_MEMREC;
869033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    s_retrieve_mem_ip.ps_mem_rec = mMemRecords;
870033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
871033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status = ive_api_function(mCodecCtx, &s_retrieve_mem_ip, &s_retrieve_mem_op);
872033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
873033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (status != IV_SUCCESS) {
874033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ALOGE("Unable to retrieve memory records = 0x%x\n",
875033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                s_retrieve_mem_op.u4_error_code);
876033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_CORRUPTED;
877033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
878033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
879033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Free memory records */
880033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_mem_rec = mMemRecords;
881033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    for (size_t i = 0; i < s_retrieve_mem_op.u4_num_mem_rec_filled; i++) {
882033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ive_aligned_free(ps_mem_rec->pv_base);
883033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ps_mem_rec++;
884033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
885033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
886033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    free(mMemRecords);
887033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
888033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // clear other pointers into the space being free()d
889033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mCodecCtx = NULL;
890033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
891033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    mStarted = false;
892033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
893033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
894033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
895033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
896033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::setEncodeArgs(
897033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ive_video_encode_ip_t *ps_encode_ip,
898033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ive_video_encode_op_t *ps_encode_op,
899033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        const C2GraphicView *const input,
900033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        uint8_t *base,
901033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        uint32_t capacity,
902033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        uint64_t timestamp) {
903033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    iv_raw_buf_t *ps_inp_raw_buf;
904033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
905033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_inp_raw_buf = &ps_encode_ip->s_inp_buf;
906033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_encode_ip->s_out_buf.pv_buf = base;
907033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_encode_ip->s_out_buf.u4_bytes = 0;
908033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_encode_ip->s_out_buf.u4_bufsize = capacity;
909033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_encode_ip->u4_size = sizeof(ive_video_encode_ip_t);
910033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_encode_op->u4_size = sizeof(ive_video_encode_op_t);
911033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
912033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_encode_ip->e_cmd = IVE_CMD_VIDEO_ENCODE;
913033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_encode_ip->pv_bufs = NULL;
914033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_encode_ip->pv_mb_info = NULL;
915033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_encode_ip->pv_pic_info = NULL;
916033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_encode_ip->u4_mb_info_type = 0;
917033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_encode_ip->u4_pic_info_type = 0;
918033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_encode_ip->u4_is_last = 0;
919033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_encode_ip->u4_timestamp_high = timestamp >> 32;
920033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_encode_ip->u4_timestamp_low = timestamp & 0xFFFFFFFF;
921033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_encode_op->s_out_buf.pv_buf = NULL;
922033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
923033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Initialize color formats */
924033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    memset(ps_inp_raw_buf, 0, sizeof(iv_raw_buf_t));
925033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_inp_raw_buf->u4_size = sizeof(iv_raw_buf_t);
926033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ps_inp_raw_buf->e_color_fmt = mIvVideoColorFormat;
927033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (input == nullptr) {
928033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (mSawInputEOS){
929033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_encode_ip->u4_is_last = 1;
930033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
931033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_OK;
932033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
933033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
934033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ALOGV("width = %d, height = %d", input->width(), input->height());
935033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    const C2PlanarLayout &layout = input->layout();
936033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    uint8_t *yPlane = const_cast<uint8_t *>(input->data()[C2PlanarLayout::PLANE_Y]);
937033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    uint8_t *uPlane = const_cast<uint8_t *>(input->data()[C2PlanarLayout::PLANE_U]);
938033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    uint8_t *vPlane = const_cast<uint8_t *>(input->data()[C2PlanarLayout::PLANE_V]);
939033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    int32_t yStride = layout.planes[C2PlanarLayout::PLANE_Y].rowInc;
940033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    int32_t uStride = layout.planes[C2PlanarLayout::PLANE_U].rowInc;
941033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    int32_t vStride = layout.planes[C2PlanarLayout::PLANE_V].rowInc;
942033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
9435d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar    uint32_t width = mIntf->getWidth();
9445d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar    uint32_t height = mIntf->getHeight();
9455d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar    // width and height are always even (as block size is 16x16)
9465d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar    CHECK_EQ((width & 1u), 0u);
9475d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar    CHECK_EQ((height & 1u), 0u);
9485d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar    size_t yPlaneSize = width * height;
9495d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar
950033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    switch (layout.type) {
951033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        case C2PlanarLayout::TYPE_RGB:
952033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            // fall-through
953033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        case C2PlanarLayout::TYPE_RGBA: {
954f799956b4e3a9ac921363ac55afda212256f236fWonsik Kim            ALOGV("yPlaneSize = %zu", yPlaneSize);
9555d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            MemoryBlock conversionBuffer = mConversionBuffers.fetch(yPlaneSize * 3 / 2);
9565d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            mConversionBuffersInUse.emplace(conversionBuffer.data(), conversionBuffer);
9575d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            yPlane = conversionBuffer.data();
958033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            uPlane = yPlane + yPlaneSize;
959033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            vPlane = uPlane + yPlaneSize / 4;
9605d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            yStride = width;
961f799956b4e3a9ac921363ac55afda212256f236fWonsik Kim            uStride = vStride = yStride / 2;
9625d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            ConvertRGBToPlanarYUV(yPlane, yStride, height, conversionBuffer.size(), *input);
963033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            break;
964033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
9655d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar        case C2PlanarLayout::TYPE_YUV: {
9665d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            if (!IsYUV420(*input)) {
9675d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar                ALOGE("input is not YUV420");
9685d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar                return C2_BAD_VALUE;
9695d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            }
9705d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar
9715d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            if (layout.planes[layout.PLANE_Y].colInc == 1
9725d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar                    && layout.planes[layout.PLANE_U].colInc == 1
9735d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar                    && layout.planes[layout.PLANE_V].colInc == 1) {
9745d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar                // I420 compatible - already set up above
9755d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar                break;
9765d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            }
9775d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar
9785d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            // copy to I420
9795d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            yStride = width;
9805d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            uStride = vStride = yStride / 2;
9815d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            MemoryBlock conversionBuffer = mConversionBuffers.fetch(yPlaneSize * 3 / 2);
9825d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            mConversionBuffersInUse.emplace(conversionBuffer.data(), conversionBuffer);
9835d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            MediaImage2 img = CreateYUV420PlanarMediaImage2(width, height, yStride, height);
9845d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            status_t err = ImageCopy(conversionBuffer.data(), &img, *input);
9855d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            if (err != OK) {
9865d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar                ALOGE("Buffer conversion failed: %d", err);
9875d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar                return C2_BAD_VALUE;
9885d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            }
9895d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            yPlane = conversionBuffer.data();
9905d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            uPlane = yPlane + yPlaneSize;
9915d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            vPlane = uPlane + yPlaneSize / 4;
992033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            break;
9935d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar
9945d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar        }
9955d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar
9965d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar        case C2PlanarLayout::TYPE_YUVA:
9975d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            ALOGE("YUVA plane type is not supported");
9985d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            return C2_BAD_VALUE;
9995d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar
1000033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        default:
1001033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ALOGE("Unrecognized plane type: %d", layout.type);
1002033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            return C2_BAD_VALUE;
1003033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
1004033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1005033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    switch (mIvVideoColorFormat) {
1006033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        case IV_YUV_420P:
1007033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        {
1008033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            // input buffer is supposed to be const but Ittiam API wants bare pointer.
1009033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->apv_bufs[0] = yPlane;
1010033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->apv_bufs[1] = uPlane;
1011033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->apv_bufs[2] = vPlane;
1012033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1013033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->au4_wd[0] = input->width();
1014033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->au4_wd[1] = input->width() / 2;
1015033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->au4_wd[2] = input->width() / 2;
1016033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1017033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->au4_ht[0] = input->height();
1018033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->au4_ht[1] = input->height() / 2;
1019033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->au4_ht[2] = input->height() / 2;
1020033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1021033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->au4_strd[0] = yStride;
1022033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->au4_strd[1] = uStride;
1023033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->au4_strd[2] = vStride;
1024033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            break;
1025033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
1026033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1027033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        case IV_YUV_422ILE:
1028033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        {
1029033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            // TODO
1030033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            // ps_inp_raw_buf->apv_bufs[0] = pu1_buf;
1031033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            // ps_inp_raw_buf->au4_wd[0] = mWidth * 2;
1032033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            // ps_inp_raw_buf->au4_ht[0] = mHeight;
1033033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            // ps_inp_raw_buf->au4_strd[0] = mStride * 2;
1034033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            break;
1035033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
1036033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1037033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        case IV_YUV_420SP_UV:
1038033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        case IV_YUV_420SP_VU:
1039033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        default:
1040033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        {
1041033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->apv_bufs[0] = yPlane;
1042033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->apv_bufs[1] = uPlane;
1043033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1044033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->au4_wd[0] = input->width();
1045033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->au4_wd[1] = input->width();
1046033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1047033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->au4_ht[0] = input->height();
1048033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->au4_ht[1] = input->height() / 2;
1049033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1050033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->au4_strd[0] = yStride;
1051033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ps_inp_raw_buf->au4_strd[1] = uStride;
1052033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            break;
1053033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
1054033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
1055033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
1056033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
1057033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1058033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimvoid C2SoftAvcEnc::process(
1059033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        const std::unique_ptr<C2Work> &work,
1060033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        const std::shared_ptr<C2BlockPool> &pool) {
1061033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    work->result = C2_OK;
1062033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    work->workletsProcessed = 0u;
1063033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1064033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_STATUS_T status;
1065033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    WORD32 timeDelay, timeTaken;
1066033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    uint64_t timestamp = work->input.ordinal.timestamp.peekull();
1067033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1068033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // Initialize encoder if not already initialized
1069033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (mCodecCtx == NULL) {
1070033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (C2_OK != initEncoder()) {
1071033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ALOGE("Failed to initialize encoder");
1072033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            work->workletsProcessed = 1u;
1073033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            work->result = C2_CORRUPTED;
1074033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            return;
1075033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
1076033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
1077033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (mSignalledError) {
1078033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return;
1079033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
1080033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1081033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // while (!mSawOutputEOS && !outQueue.empty()) {
1082033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t error;
1083033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_video_encode_ip_t s_encode_ip;
1084033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ive_video_encode_op_t s_encode_op;
1085033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1086033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (!mSpsPpsHeaderReceived) {
1087033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        constexpr uint32_t kHeaderLength = MIN_STREAM_SIZE;
1088033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        uint8_t header[kHeaderLength];
1089033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        error = setEncodeArgs(
1090033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                &s_encode_ip, &s_encode_op, NULL, header, kHeaderLength, timestamp);
1091033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (error != C2_OK) {
1092fd2d387fc1ee7d3e2ebcf86abb39912b6754b65aWonsik Kim            ALOGE("setEncodeArgs failed: %d", error);
1093033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            mSignalledError = true;
1094033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            work->workletsProcessed = 1u;
1095033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            work->result = C2_CORRUPTED;
1096033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            return;
1097033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
1098033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        status = ive_api_function(mCodecCtx, &s_encode_ip, &s_encode_op);
1099033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1100033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (IV_SUCCESS != status) {
1101033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ALOGE("Encode header failed = 0x%x\n",
1102033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                    s_encode_op.u4_error_code);
1103033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            return;
1104033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        } else {
1105033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ALOGV("Bytes Generated in header %d\n",
1106033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                    s_encode_op.s_out_buf.u4_bytes);
1107033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
1108033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1109033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        mSpsPpsHeaderReceived = true;
1110033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1111033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        std::unique_ptr<C2StreamCsdInfo::output> csd =
1112033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            C2StreamCsdInfo::output::AllocUnique(s_encode_op.s_out_buf.u4_bytes, 0u);
1113033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        memcpy(csd->m.value, header, s_encode_op.s_out_buf.u4_bytes);
1114033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        work->worklets.front()->output.configUpdate.push_back(std::move(csd));
1115033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1116033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        DUMP_TO_FILE(
1117033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                mOutFile, csd->m.value, csd->flexCount());
1118033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
1119033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1120033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (mUpdateFlag) {
1121033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (mUpdateFlag & kUpdateBitrate) {
1122033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            setBitRate();
1123033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
1124033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (mUpdateFlag & kRequestKeyFrame) {
1125033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            setFrameType(IV_IDR_FRAME);
1126033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
1127033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (mUpdateFlag & kUpdateAIRMode) {
1128033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            setAirParams();
1129033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            // notify(OMX_EventPortSettingsChanged, kOutputPortIndex,
1130033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            //         OMX_IndexConfigAndroidIntraRefresh, NULL);
1131033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
1132033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        mUpdateFlag = 0;
1133033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
1134033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1135033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (work->input.flags & C2FrameData::FLAG_END_OF_STREAM) {
1136033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        mSawInputEOS = true;
1137033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
1138033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1139033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* In normal mode, store inputBufferInfo and this will be returned
1140033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim       when encoder consumes this input */
1141033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // if (!mInputDataIsMeta && (inputBufferInfo != NULL)) {
1142033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    //     for (size_t i = 0; i < MAX_INPUT_BUFFER_HEADERS; i++) {
1143033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    //         if (NULL == mInputBufferInfo[i]) {
1144033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    //             mInputBufferInfo[i] = inputBufferInfo;
1145033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    //             break;
1146033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    //         }
1147033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    //     }
1148033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // }
114984c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim    std::shared_ptr<const C2GraphicView> view;
115084c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim    std::shared_ptr<C2Buffer> inputBuffer;
115184c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim    if (!work->input.buffers.empty()) {
115284c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim        inputBuffer = work->input.buffers[0];
115384c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim        view = std::make_shared<const C2GraphicView>(
115484c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim                inputBuffer->data().graphicBlocks().front().map().get());
115584c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim        if (view->error() != C2_OK) {
115684c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim            ALOGE("graphic view map err = %d", view->error());
115784c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim            return;
115884c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim        }
1159033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
1160033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1161033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    std::shared_ptr<C2LinearBlock> block;
1162033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1163033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    do {
1164033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        C2MemoryUsage usage = { C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE };
1165033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        // TODO: error handling, proper usage, etc.
1166033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        c2_status_t err = pool->fetchLinearBlock(mOutBufferSize, usage, &block);
1167033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (err != C2_OK) {
1168033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ALOGE("fetch linear block err = %d", err);
1169033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            work->workletsProcessed = 1u;
1170033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            work->result = err;
1171033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            return;
1172033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
1173033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        C2WriteView wView = block->map().get();
1174033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (wView.error() != C2_OK) {
1175033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ALOGE("write view map err = %d", wView.error());
1176033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            work->workletsProcessed = 1u;
1177033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            work->result = wView.error();
1178033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            return;
1179033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
1180033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1181033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        error = setEncodeArgs(
118284c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim                &s_encode_ip, &s_encode_op, view.get(), wView.base(), wView.capacity(), timestamp);
1183033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (error != C2_OK) {
1184033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            mSignalledError = true;
1185033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ALOGE("setEncodeArgs failed : %d", error);
1186033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            work->workletsProcessed = 1u;
1187033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            work->result = error;
1188033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            return;
1189033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
1190033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1191033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        // DUMP_TO_FILE(
1192033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        //         mInFile, s_encode_ip.s_inp_buf.apv_bufs[0],
1193033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        //         (mHeight * mStride * 3 / 2));
1194033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1195033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        GETTIME(&mTimeStart, NULL);
1196033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        /* Compute time elapsed between end of previous decode()
1197033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim         * to start of current decode() */
1198033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        TIME_DIFF(mTimeEnd, mTimeStart, timeDelay);
1199033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        status = ive_api_function(mCodecCtx, &s_encode_ip, &s_encode_op);
1200033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1201033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (IV_SUCCESS != status) {
1202033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            if ((s_encode_op.u4_error_code & 0xFF) == IH264E_BITSTREAM_BUFFER_OVERFLOW) {
1203033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                // TODO: use IVE_CMD_CTL_GETBUFINFO for proper max input size?
1204033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                mOutBufferSize *= 2;
1205033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                continue;
1206033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            }
1207033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ALOGE("Encode Frame failed = 0x%x\n",
1208033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                    s_encode_op.u4_error_code);
1209033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            mSignalledError = true;
1210033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            work->workletsProcessed = 1u;
1211033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            work->result = C2_CORRUPTED;
1212033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            return;
1213033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
1214033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    } while (IV_SUCCESS != status);
1215033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1216033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // Hold input buffer reference
121784c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim    if (inputBuffer) {
121884c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim        mBuffers[s_encode_ip.s_inp_buf.apv_bufs[0]] = inputBuffer;
121984c3886c46b099258d95dbf1cc357934e113aa90Wonsik Kim    }
1220033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1221033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    GETTIME(&mTimeEnd, NULL);
1222033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* Compute time taken for decode() */
1223033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    TIME_DIFF(mTimeStart, mTimeEnd, timeTaken);
1224033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1225033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ALOGV("timeTaken=%6d delay=%6d numBytes=%6d", timeTaken, timeDelay,
1226033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            s_encode_op.s_out_buf.u4_bytes);
1227033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1228033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void *freed = s_encode_op.s_inp_buf.apv_bufs[0];
1229033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    /* If encoder frees up an input buffer, mark it as free */
1230033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (freed != NULL) {
1231033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (mBuffers.count(freed) == 0u) {
1232fd2d387fc1ee7d3e2ebcf86abb39912b6754b65aWonsik Kim            ALOGD("buffer not tracked");
1233fd2d387fc1ee7d3e2ebcf86abb39912b6754b65aWonsik Kim        } else {
1234fd2d387fc1ee7d3e2ebcf86abb39912b6754b65aWonsik Kim            // Release input buffer reference
1235fd2d387fc1ee7d3e2ebcf86abb39912b6754b65aWonsik Kim            mBuffers.erase(freed);
12365d68ad843c75e22a6163a9fe4941e8e861a1016eLajos Molnar            mConversionBuffersInUse.erase(freed);
1237033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }
1238033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
1239033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1240033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    work->worklets.front()->output.flags = work->input.flags;
1241033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    work->worklets.front()->output.ordinal = work->input.ordinal;
1242033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    work->worklets.front()->output.ordinal.timestamp =
1243033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        ((uint64_t)s_encode_op.u4_timestamp_high << 32) | s_encode_op.u4_timestamp_low;
1244033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    work->worklets.front()->output.buffers.clear();
1245033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    std::shared_ptr<C2Buffer> buffer =
1246033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        createLinearBuffer(block, 0, s_encode_op.s_out_buf.u4_bytes);
1247033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    work->worklets.front()->output.buffers.push_back(buffer);
1248033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    work->workletsProcessed = 1u;
1249033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1250033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (IV_IDR_FRAME == s_encode_op.u4_encoded_frame_type) {
1251033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        buffer->setInfo(std::make_shared<C2StreamPictureTypeMaskInfo::output>(
1252033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                0u /* stream id */, C2PictureTypeKeyFrame));
1253033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
1254033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1255033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    if (s_encode_op.u4_is_last) {
1256033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        // outputBufferHeader->nFlags |= OMX_BUFFERFLAG_EOS;
1257033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        mSawOutputEOS = true;
1258033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    } else {
1259033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        // outputBufferHeader->nFlags &= ~OMX_BUFFERFLAG_EOS;
1260033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
1261033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
1262033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1263033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimc2_status_t C2SoftAvcEnc::drain(
1264033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        uint32_t drainMode,
1265033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        const std::shared_ptr<C2BlockPool> &pool) {
1266033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // TODO: use IVE_CMD_CTL_FLUSH?
1267033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    (void)drainMode;
1268033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    (void)pool;
1269033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return C2_OK;
1270033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
1271033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1272033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1273033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimclass C2SoftAvcEncFactory : public C2ComponentFactory {
1274033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimpublic:
12759fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    C2SoftAvcEncFactory() : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
1276e15da79378e753bbd20f1c0f5c6858cc89bd4141Wonsik Kim        GetCodec2PlatformComponentStore()->getParamReflector())) {
12779fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    }
12789fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim
1279033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    virtual c2_status_t createComponent(
1280033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            c2_node_id_t id,
1281033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            std::shared_ptr<C2Component>* const component,
1282033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            std::function<void(C2Component*)> deleter) override {
12839fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        *component = std::shared_ptr<C2Component>(
12849fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                new C2SoftAvcEnc(COMPONENT_NAME,
12859fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                                 id,
12869fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                                 std::make_shared<C2SoftAvcEnc::IntfImpl>(mHelper)),
12879fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                deleter);
1288033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_OK;
1289033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
1290033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1291033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    virtual c2_status_t createInterface(
1292033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            c2_node_id_t id,
1293033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            std::shared_ptr<C2ComponentInterface>* const interface,
1294033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            std::function<void(C2ComponentInterface*)> deleter) override {
12959fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim        *interface = std::shared_ptr<C2ComponentInterface>(
12969fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                new SimpleInterface<C2SoftAvcEnc::IntfImpl>(
12979fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                        COMPONENT_NAME, id, std::make_shared<C2SoftAvcEnc::IntfImpl>(mHelper)),
12989fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim                deleter);
1299033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        return C2_OK;
1300033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
1301033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1302033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    virtual ~C2SoftAvcEncFactory() override = default;
13039fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim
13049fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kimprivate:
13059fca24013957d2dfe99b4291f9f9297f720c7fa8Wonsik Kim    std::shared_ptr<C2ReflectorHelper> mHelper;
1306033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim};
1307033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1308033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}  // namespace android
1309033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1310033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimextern "C" ::C2ComponentFactory* CreateCodec2Factory() {
1311033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ALOGV("in %s", __func__);
1312033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    return new ::android::C2SoftAvcEncFactory();
1313033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
1314033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1315033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimextern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
1316033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ALOGV("in %s", __func__);
1317033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    delete factory;
1318033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}
1319