1c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan/*
2c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan * Copyright 2018 The Android Open Source Project
3c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan *
4c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan * Licensed under the Apache License, Version 2.0 (the "License");
5c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan * you may not use this file except in compliance with the License.
6c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan * You may obtain a copy of the License at
7c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan *
8c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan *      http://www.apache.org/licenses/LICENSE-2.0
9c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan *
10c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan * Unless required by applicable law or agreed to in writing, software
11c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan * distributed under the License is distributed on an "AS IS" BASIS,
12c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan * See the License for the specific language governing permissions and
14c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan * limitations under the License.
15c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan */
16c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
17d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar//#define LOG_NDEBUG 0
18c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan#define LOG_TAG "C2SoftVp8Enc"
19c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan#include <utils/Log.h>
20c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan#include <utils/misc.h>
21c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
22c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan#include "C2SoftVp8Enc.h"
23c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
24c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohannamespace android {
25c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
265c2c3d46fc95a4e08dbd7a7a3304e389d85faa86Lajos Molnarconstexpr char COMPONENT_NAME[] = "c2.android.vp8.encoder";
27c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
28d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha JajooC2SoftVp8Enc::C2SoftVp8Enc(const char* name, c2_node_id_t id,
29d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo                           const std::shared_ptr<IntfImpl>& intfImpl)
30d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo    : C2SoftVpxEnc(name, id, intfImpl), mDCTPartitions(0), mProfile(1) {}
31c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
32c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohanvoid C2SoftVp8Enc::setCodecSpecificInterface() {
33c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan    mCodecInterface = vpx_codec_vp8_cx();
34c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan}
35c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
36c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohanvoid C2SoftVp8Enc::setCodecSpecificConfiguration() {
37c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan    switch (mProfile) {
38c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan        case 1:
39c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan            mCodecConfiguration->g_profile = 0;
40c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan            break;
41c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
42c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan        case 2:
43c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan            mCodecConfiguration->g_profile = 1;
44c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan            break;
45c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
46c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan        case 4:
47c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan            mCodecConfiguration->g_profile = 2;
48c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan            break;
49c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
50c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan        case 8:
51c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan            mCodecConfiguration->g_profile = 3;
52c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan            break;
53c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
54c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan        default:
55c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan            mCodecConfiguration->g_profile = 0;
56c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan    }
57c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan}
58c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
59c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohanvpx_codec_err_t C2SoftVp8Enc::setCodecSpecificControls() {
60c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan    vpx_codec_err_t codec_return = vpx_codec_control(mCodecContext,
61c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan                                                     VP8E_SET_TOKEN_PARTITIONS,
62c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan                                                     mDCTPartitions);
63c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan    if (codec_return != VPX_CODEC_OK) {
64c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan        ALOGE("Error setting dct partitions for vpx encoder.");
65c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan    }
66c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan    return codec_return;
67c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan}
68c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
69c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohanclass C2SoftVp8EncFactory : public C2ComponentFactory {
70c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohanpublic:
71d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo    C2SoftVp8EncFactory()
72d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo        : mHelper(std::static_pointer_cast<C2ReflectorHelper>(
73d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo              GetCodec2PlatformComponentStore()->getParamReflector())) {}
74d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo
75c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan    virtual c2_status_t createComponent(
76c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan            c2_node_id_t id,
77c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan            std::shared_ptr<C2Component>* const component,
78c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan            std::function<void(C2Component*)> deleter) override {
79d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo        *component = std::shared_ptr<C2Component>(
80d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo            new C2SoftVp8Enc(COMPONENT_NAME, id,
81d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo                             std::make_shared<C2SoftVpxEnc::IntfImpl>(mHelper)),
82d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo            deleter);
83c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan        return C2_OK;
84c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan    }
85c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
86c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan    virtual c2_status_t createInterface(
87c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan            c2_node_id_t id,
88c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan            std::shared_ptr<C2ComponentInterface>* const interface,
89c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan            std::function<void(C2ComponentInterface*)> deleter) override {
90d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo        *interface = std::shared_ptr<C2ComponentInterface>(
91d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo            new SimpleInterface<C2SoftVpxEnc::IntfImpl>(
92d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo                COMPONENT_NAME, id,
93d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo                std::make_shared<C2SoftVpxEnc::IntfImpl>(mHelper)),
94d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo            deleter);
95c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan        return C2_OK;
96c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan    }
97c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
98c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan    virtual ~C2SoftVp8EncFactory() override = default;
99d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo
100d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajooprivate:
101d4f662ce5357d600c68d21310a1a00fa4faf6cdfManisha Jajoo    std::shared_ptr<C2ReflectorHelper> mHelper;
102c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan};
103c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
104c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan}  // namespace android
105c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
106c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohanextern "C" ::C2ComponentFactory* CreateCodec2Factory() {
107c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan    ALOGV("in %s", __func__);
108c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan    return new ::android::C2SoftVp8EncFactory();
109c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan}
110c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan
111c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohanextern "C" void DestroyCodec2Factory(::C2ComponentFactory* factory) {
112c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan    ALOGV("in %s", __func__);
113c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan    delete factory;
114c7bf475e4d7217919954338e2522ef53a55dea9cRam Mohan}
115