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