1b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin/* 2b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin * Copyright (C) 2013 The Android Open Source Project 3b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin * 4b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin * Licensed under the Apache License, Version 2.0 (the "License"); 5b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin * you may not use this file except in compliance with the License. 6b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin * You may obtain a copy of the License at 7b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin * 8b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin * http://www.apache.org/licenses/LICENSE-2.0 9b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin * 10b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin * Unless required by applicable law or agreed to in writing, software 11b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin * distributed under the License is distributed on an "AS IS" BASIS, 12b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin * See the License for the specific language governing permissions and 14b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin * limitations under the License. 15b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin */ 16b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 17b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// #define LOG_NDEBUG 0 18b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#define LOG_TAG "SoftVPXEncoder" 19b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#include "SoftVPXEncoder.h" 20b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 21b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#include <utils/Log.h> 22a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar#include <utils/misc.h> 23b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 24a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber#include <media/hardware/HardwareAPI.h> 25a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber#include <media/hardware/MetadataBufferType.h> 26b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#include <media/stagefright/foundation/ADebug.h> 27b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#include <media/stagefright/MediaDefs.h> 28b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 29b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekinnamespace android { 30b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 31b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekintemplate<class T> 32b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekinstatic void InitOMXParams(T *params) { 33b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin params->nSize = sizeof(T); 34b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // OMX IL 1.1.2 35b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin params->nVersion.s.nVersionMajor = 1; 36b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin params->nVersion.s.nVersionMinor = 1; 37b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin params->nVersion.s.nRevision = 2; 38b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin params->nVersion.s.nStep = 0; 39b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin} 40b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 41b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 42b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekinstatic int GetCPUCoreCount() { 43b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin int cpuCoreCount = 1; 44b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#if defined(_SC_NPROCESSORS_ONLN) 45b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN); 46b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#else 47b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // _SC_NPROC_ONLN must be defined... 48b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin cpuCoreCount = sysconf(_SC_NPROC_ONLN); 49b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#endif 50b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin CHECK_GE(cpuCoreCount, 1); 51b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return cpuCoreCount; 52b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin} 53b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 54a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnarstatic const CodecProfileLevel kProfileLevels[] = { 55a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar { OMX_VIDEO_VP8ProfileMain, OMX_VIDEO_VP8Level_Version0 }, 56a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar { OMX_VIDEO_VP8ProfileMain, OMX_VIDEO_VP8Level_Version1 }, 57a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar { OMX_VIDEO_VP8ProfileMain, OMX_VIDEO_VP8Level_Version2 }, 58a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar { OMX_VIDEO_VP8ProfileMain, OMX_VIDEO_VP8Level_Version3 }, 59a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar}; 60a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 61b4698f79230bbee15936641d951d49655f9e6da5Kunter GultekinSoftVPXEncoder::SoftVPXEncoder(const char *name, 62b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const OMX_CALLBACKTYPE *callbacks, 63b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_PTR appData, 64b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_COMPONENTTYPE **component) 65a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar : SoftVideoEncoderOMXComponent( 66a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar name, "video_encoder.vp8", OMX_VIDEO_CodingVP8, 67a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar kProfileLevels, NELEM(kProfileLevels), 68a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar 176 /* width */, 144 /* height */, 69a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar callbacks, appData, component), 70b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecContext(NULL), 71b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration(NULL), 72b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecInterface(NULL), 7330c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann mBitrateUpdated(false), 74b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mBitrateControlMode(VPX_VBR), // variable bitrate 75b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mDCTPartitions(0), 76b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mErrorResilience(OMX_FALSE), 77b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mLevel(OMX_VIDEO_VP8Level_Version0), 784154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mKeyFrameInterval(0), 794154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mMinQuantizer(0), 804154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mMaxQuantizer(0), 814154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalLayers(0), 824154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPatternType(OMX_VIDEO_VPXTemporalLayerPatternNone), 834154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPatternLength(0), 844154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPatternIdx(0), 854154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mLastTimestamp(0x7FFFFFFFFFFFFFFFLL), 86a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber mConversionBuffer(NULL), 87336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber mKeyFrameRequested(false) { 884154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev memset(mTemporalLayerBitrateRatio, 0, sizeof(mTemporalLayerBitrateRatio)); 894154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalLayerBitrateRatio[0] = 100; 90b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 91a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar const size_t kMinOutputBufferSize = 1024 * 1024; // arbitrary 92b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 93a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar initPorts( 94a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar kNumBuffers, kNumBuffers, kMinOutputBufferSize, 95a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar MEDIA_MIMETYPE_VIDEO_VP8, 2 /* minCompressionRatio */); 96b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin} 97b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 98b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 99a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos MolnarSoftVPXEncoder::~SoftVPXEncoder() { 100a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar releaseEncoder(); 101b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin} 102b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 103b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekinstatus_t SoftVPXEncoder::initEncoder() { 104b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vpx_codec_err_t codec_return; 105b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 106b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecContext = new vpx_codec_ctx_t; 107b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration = new vpx_codec_enc_cfg_t; 108b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecInterface = vpx_codec_vp8_cx(); 109b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 110b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (mCodecInterface == NULL) { 111b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return UNKNOWN_ERROR; 112b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 1134154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev ALOGD("VP8: initEncoder. BRMode: %u. TSLayers: %zu. KF: %u. QP: %u - %u", 1144154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev (uint32_t)mBitrateControlMode, mTemporalLayers, mKeyFrameInterval, 1154154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mMinQuantizer, mMaxQuantizer); 116b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin codec_return = vpx_codec_enc_config_default(mCodecInterface, 117b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration, 118b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 0); // Codec specific flags 119b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 120b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (codec_return != VPX_CODEC_OK) { 121b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin ALOGE("Error populating default configuration for vpx encoder."); 122b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return UNKNOWN_ERROR; 123b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 124b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 125b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration->g_w = mWidth; 126b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration->g_h = mHeight; 127b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration->g_threads = GetCPUCoreCount(); 128b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration->g_error_resilient = mErrorResilience; 129b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 130b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin switch (mLevel) { 131b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin case OMX_VIDEO_VP8Level_Version0: 132b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration->g_profile = 0; 133b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin break; 134b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 135b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin case OMX_VIDEO_VP8Level_Version1: 136b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration->g_profile = 1; 137b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin break; 138b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 139b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin case OMX_VIDEO_VP8Level_Version2: 140b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration->g_profile = 2; 141b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin break; 142b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 143b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin case OMX_VIDEO_VP8Level_Version3: 144b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration->g_profile = 3; 145b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin break; 146b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 147b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin default: 148b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration->g_profile = 0; 149b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 150b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 151b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // OMX timebase unit is microsecond 152b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // g_timebase is in seconds (i.e. 1/1000000 seconds) 153b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration->g_timebase.num = 1; 154b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration->g_timebase.den = 1000000; 155b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // rc_target_bitrate is in kbps, mBitrate in bps 1564154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->rc_target_bitrate = (mBitrate + 500) / 1000; 157b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration->rc_end_usage = mBitrateControlMode; 1580d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev // Disable frame drop - not allowed in MediaCodec now. 1590d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev mCodecConfiguration->rc_dropframe_thresh = 0; 1600d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev if (mBitrateControlMode == VPX_CBR) { 1610d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev // Disable spatial resizing. 1620d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev mCodecConfiguration->rc_resize_allowed = 0; 1630d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev // Single-pass mode. 1640d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev mCodecConfiguration->g_pass = VPX_RC_ONE_PASS; 1650d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev // Maximum amount of bits that can be subtracted from the target 1660d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev // bitrate - expressed as percentage of the target bitrate. 1670d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev mCodecConfiguration->rc_undershoot_pct = 100; 1680d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev // Maximum amount of bits that can be added to the target 1690d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev // bitrate - expressed as percentage of the target bitrate. 1700d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev mCodecConfiguration->rc_overshoot_pct = 15; 1710d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev // Initial value of the buffer level in ms. 1720d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev mCodecConfiguration->rc_buf_initial_sz = 500; 1730d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev // Amount of data that the encoder should try to maintain in ms. 1740d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev mCodecConfiguration->rc_buf_optimal_sz = 600; 1750d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev // The amount of data that may be buffered by the decoding 1760d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev // application in ms. 1770d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev mCodecConfiguration->rc_buf_sz = 1000; 1780d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev // Enable error resilience - needed for packet loss. 1790d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev mCodecConfiguration->g_error_resilient = 1; 1800d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev // Disable lagged encoding. 1810d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev mCodecConfiguration->g_lag_in_frames = 0; 1824154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Maximum key frame interval - for CBR boost to 3000 1834154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->kf_max_dist = 3000; 1840d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev // Encoder determines optimal key frame placement automatically. 1850d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev mCodecConfiguration->kf_mode = VPX_KF_AUTO; 1860d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev } 187b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 1884154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Frames temporal pattern - for now WebRTC like pattern is only supported. 1894154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev switch (mTemporalLayers) { 1904154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case 0: 1914154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 1924154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPatternLength = 0; 1934154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev break; 1944154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 1954154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case 1: 1964154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 1974154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_number_layers = 1; 1984154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_rate_decimator[0] = 1; 1994154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_periodicity = 1; 2004154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_layer_id[0] = 0; 2014154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[0] = kTemporalUpdateLastRefAll; 2024154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPatternLength = 1; 2034154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev break; 2044154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 2054154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case 2: 2064154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 2074154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_number_layers = 2; 2084154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_rate_decimator[0] = 2; 2094154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_rate_decimator[1] = 1; 2104154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_periodicity = 2; 2114154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_layer_id[0] = 0; 2124154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_layer_id[1] = 1; 2134154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[0] = kTemporalUpdateLastAndGoldenRefAltRef; 2144154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[1] = kTemporalUpdateGoldenWithoutDependencyRefAltRef; 2154154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[2] = kTemporalUpdateLastRefAltRef; 2164154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[3] = kTemporalUpdateGoldenRefAltRef; 2174154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[4] = kTemporalUpdateLastRefAltRef; 2184154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[5] = kTemporalUpdateGoldenRefAltRef; 2194154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[6] = kTemporalUpdateLastRefAltRef; 2204154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[7] = kTemporalUpdateNone; 2214154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPatternLength = 8; 2224154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev break; 2234154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 2244154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case 3: 2254154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 2264154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_number_layers = 3; 2274154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_rate_decimator[0] = 4; 2284154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_rate_decimator[1] = 2; 2294154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_rate_decimator[2] = 1; 2304154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_periodicity = 4; 2314154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_layer_id[0] = 0; 2324154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_layer_id[1] = 2; 2334154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_layer_id[2] = 1; 2344154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_layer_id[3] = 2; 2354154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[0] = kTemporalUpdateLastAndGoldenRefAltRef; 2364154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[1] = kTemporalUpdateNoneNoRefGoldenRefAltRef; 2374154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[2] = kTemporalUpdateGoldenWithoutDependencyRefAltRef; 2384154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[3] = kTemporalUpdateNone; 2394154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[4] = kTemporalUpdateLastRefAltRef; 2404154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[5] = kTemporalUpdateNone; 2414154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[6] = kTemporalUpdateGoldenRefAltRef; 2424154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPattern[7] = kTemporalUpdateNone; 2434154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPatternLength = 8; 2444154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev break; 2454154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 2464154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev default: 2474154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 248a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn ALOGE("Wrong number of temporal layers %zu", mTemporalLayers); 2494154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return UNKNOWN_ERROR; 2504154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 2514154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 2524154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 2534154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Set bitrate values for each layer 2544154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev for (size_t i = 0; i < mCodecConfiguration->ts_number_layers; i++) { 2554154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->ts_target_bitrate[i] = 2564154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->rc_target_bitrate * 2574154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalLayerBitrateRatio[i] / 100; 2584154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 2594154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (mKeyFrameInterval > 0) { 2604154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->kf_max_dist = mKeyFrameInterval; 2614154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->kf_min_dist = mKeyFrameInterval; 2624154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->kf_mode = VPX_KF_AUTO; 2634154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 2644154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (mMinQuantizer > 0) { 2654154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->rc_min_quantizer = mMinQuantizer; 2664154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 2674154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (mMaxQuantizer > 0) { 2684154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mCodecConfiguration->rc_max_quantizer = mMaxQuantizer; 2694154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 2704154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 271b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin codec_return = vpx_codec_enc_init(mCodecContext, 272b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecInterface, 273b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration, 274b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 0); // flags 275b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 276b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (codec_return != VPX_CODEC_OK) { 277b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin ALOGE("Error initializing vpx encoder"); 278b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return UNKNOWN_ERROR; 279b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 280b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 281b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin codec_return = vpx_codec_control(mCodecContext, 282b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin VP8E_SET_TOKEN_PARTITIONS, 283b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mDCTPartitions); 284b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (codec_return != VPX_CODEC_OK) { 285b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin ALOGE("Error setting dct partitions for vpx encoder."); 286b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return UNKNOWN_ERROR; 287b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 288b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 2890d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev // Extra CBR settings 2900d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev if (mBitrateControlMode == VPX_CBR) { 2910d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev codec_return = vpx_codec_control(mCodecContext, 2920d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev VP8E_SET_STATIC_THRESHOLD, 2930d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev 1); 2940d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev if (codec_return == VPX_CODEC_OK) { 2950d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev uint32_t rc_max_intra_target = 2960d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev mCodecConfiguration->rc_buf_optimal_sz * (mFramerate >> 17) / 10; 2970d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev // Don't go below 3 times per frame bandwidth. 2980d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev if (rc_max_intra_target < 300) { 2990d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev rc_max_intra_target = 300; 3000d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev } 3010d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev codec_return = vpx_codec_control(mCodecContext, 3020d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev VP8E_SET_MAX_INTRA_BITRATE_PCT, 3030d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev rc_max_intra_target); 3040d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev } 3050d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev if (codec_return == VPX_CODEC_OK) { 3060d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev codec_return = vpx_codec_control(mCodecContext, 3070d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev VP8E_SET_CPUUSED, 3080d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev -8); 3090d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev } 3100d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev if (codec_return != VPX_CODEC_OK) { 3110d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev ALOGE("Error setting cbr parameters for vpx encoder."); 3120d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev return UNKNOWN_ERROR; 3130d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev } 3140d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev } 3150d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev 3162edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar if (mColorFormat != OMX_COLOR_FormatYUV420Planar || mInputDataIsMeta) { 3172edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar free(mConversionBuffer); 3182edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar mConversionBuffer = (uint8_t *)malloc(mWidth * mHeight * 3 / 2); 319b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (mConversionBuffer == NULL) { 3202edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar ALOGE("Allocating conversion buffer failed."); 3212edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar return UNKNOWN_ERROR; 322b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 323b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 324b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return OK; 325b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin} 326b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 327b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 328b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekinstatus_t SoftVPXEncoder::releaseEncoder() { 329b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (mCodecContext != NULL) { 330b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vpx_codec_destroy(mCodecContext); 331b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin delete mCodecContext; 332b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecContext = NULL; 333b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 334b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 335b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (mCodecConfiguration != NULL) { 336b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin delete mCodecConfiguration; 337b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecConfiguration = NULL; 338b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 339b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 340b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (mConversionBuffer != NULL) { 3412edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar free(mConversionBuffer); 342b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mConversionBuffer = NULL; 343b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 344b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 345b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // this one is not allocated by us 346b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mCodecInterface = NULL; 347b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 348b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return OK; 349b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin} 350b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 351b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 352b4698f79230bbee15936641d951d49655f9e6da5Kunter GultekinOMX_ERRORTYPE SoftVPXEncoder::internalGetParameter(OMX_INDEXTYPE index, 353b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_PTR param) { 354b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // can include extension index OMX_INDEXEXTTYPE 355b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const int32_t indexFull = index; 356b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 357b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin switch (indexFull) { 358b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin case OMX_IndexParamVideoBitrate: { 359b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_VIDEO_PARAM_BITRATETYPE *bitrate = 360b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin (OMX_VIDEO_PARAM_BITRATETYPE *)param; 361b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 362b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (bitrate->nPortIndex != kOutputPortIndex) { 363b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return OMX_ErrorUnsupportedIndex; 364b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 365b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 366b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin bitrate->nTargetBitrate = mBitrate; 367b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 368b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (mBitrateControlMode == VPX_VBR) { 369b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin bitrate->eControlRate = OMX_Video_ControlRateVariable; 370b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } else if (mBitrateControlMode == VPX_CBR) { 371b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin bitrate->eControlRate = OMX_Video_ControlRateConstant; 372b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } else { 373b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return OMX_ErrorUnsupportedSetting; 374b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 375b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return OMX_ErrorNone; 376b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 377b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 378b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // VP8 specific parameters that use extension headers 379b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin case OMX_IndexParamVideoVp8: { 380b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_VIDEO_PARAM_VP8TYPE *vp8Params = 381b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin (OMX_VIDEO_PARAM_VP8TYPE *)param; 382b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 383b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (vp8Params->nPortIndex != kOutputPortIndex) { 384b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return OMX_ErrorUnsupportedIndex; 385b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 386b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 387b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vp8Params->eProfile = OMX_VIDEO_VP8ProfileMain; 388b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vp8Params->eLevel = mLevel; 389b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vp8Params->nDCTPartitions = mDCTPartitions; 390b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vp8Params->bErrorResilientMode = mErrorResilience; 391b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return OMX_ErrorNone; 392b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 393b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 3944154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case OMX_IndexParamVideoAndroidVp8Encoder: { 3954154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE *vp8AndroidParams = 3964154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev (OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE *)param; 3974154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 3984154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (vp8AndroidParams->nPortIndex != kOutputPortIndex) { 3994154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return OMX_ErrorUnsupportedIndex; 4004154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 4014154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 4024154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8AndroidParams->nKeyFrameInterval = mKeyFrameInterval; 4034154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8AndroidParams->eTemporalPattern = mTemporalPatternType; 4044154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8AndroidParams->nTemporalLayerCount = mTemporalLayers; 4054154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8AndroidParams->nMinQuantizer = mMinQuantizer; 4064154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8AndroidParams->nMaxQuantizer = mMaxQuantizer; 4074154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev memcpy(vp8AndroidParams->nTemporalLayerBitrateRatio, 4084154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalLayerBitrateRatio, sizeof(mTemporalLayerBitrateRatio)); 4094154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return OMX_ErrorNone; 4104154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 4114154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 412b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin default: 413a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar return SoftVideoEncoderOMXComponent::internalGetParameter(index, param); 414b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 415b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin} 416b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 417b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 418b4698f79230bbee15936641d951d49655f9e6da5Kunter GultekinOMX_ERRORTYPE SoftVPXEncoder::internalSetParameter(OMX_INDEXTYPE index, 419b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const OMX_PTR param) { 420b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // can include extension index OMX_INDEXEXTTYPE 421b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const int32_t indexFull = index; 422b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 423b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin switch (indexFull) { 424b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin case OMX_IndexParamVideoBitrate: 425b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return internalSetBitrateParams( 426b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin (const OMX_VIDEO_PARAM_BITRATETYPE *)param); 427b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 428b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin case OMX_IndexParamVideoVp8: 429b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return internalSetVp8Params( 430b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin (const OMX_VIDEO_PARAM_VP8TYPE *)param); 431b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 4324154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case OMX_IndexParamVideoAndroidVp8Encoder: 4334154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return internalSetAndroidVp8Params( 4344154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev (const OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE *)param); 4354154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 436b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin default: 437a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar return SoftVideoEncoderOMXComponent::internalSetParameter(index, param); 438b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 439b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin} 440b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 441336da16a12423c496efba6ca9813d5d42a1f70f6Andreas HuberOMX_ERRORTYPE SoftVPXEncoder::setConfig( 442336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber OMX_INDEXTYPE index, const OMX_PTR _params) { 443336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber switch (index) { 444336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber case OMX_IndexConfigVideoIntraVOPRefresh: 445336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber { 446336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber OMX_CONFIG_INTRAREFRESHVOPTYPE *params = 447336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber (OMX_CONFIG_INTRAREFRESHVOPTYPE *)_params; 448336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber 449336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber if (params->nPortIndex != kOutputPortIndex) { 450336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber return OMX_ErrorBadPortIndex; 451336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber } 452336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber 453336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber mKeyFrameRequested = params->IntraRefreshVOP; 454336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber return OMX_ErrorNone; 455336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber } 456336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber 45730c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann case OMX_IndexConfigVideoBitrate: 45830c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann { 45930c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann OMX_VIDEO_CONFIG_BITRATETYPE *params = 46030c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann (OMX_VIDEO_CONFIG_BITRATETYPE *)_params; 46130c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann 46230c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann if (params->nPortIndex != kOutputPortIndex) { 46330c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann return OMX_ErrorBadPortIndex; 46430c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann } 46530c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann 46630c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann if (mBitrate != params->nEncodeBitrate) { 46730c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann mBitrate = params->nEncodeBitrate; 46830c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann mBitrateUpdated = true; 46930c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann } 47030c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann return OMX_ErrorNone; 47130c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann } 47230c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann 473336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber default: 474336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber return SimpleSoftOMXComponent::setConfig(index, _params); 475336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber } 476336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber} 477336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber 478b4698f79230bbee15936641d951d49655f9e6da5Kunter GultekinOMX_ERRORTYPE SoftVPXEncoder::internalSetVp8Params( 479b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const OMX_VIDEO_PARAM_VP8TYPE* vp8Params) { 480b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (vp8Params->nPortIndex != kOutputPortIndex) { 481b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return OMX_ErrorUnsupportedIndex; 482b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 483b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 484b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (vp8Params->eProfile != OMX_VIDEO_VP8ProfileMain) { 485b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return OMX_ErrorBadParameter; 486b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 487b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 488b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (vp8Params->eLevel == OMX_VIDEO_VP8Level_Version0 || 489b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vp8Params->eLevel == OMX_VIDEO_VP8Level_Version1 || 490b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vp8Params->eLevel == OMX_VIDEO_VP8Level_Version2 || 491b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vp8Params->eLevel == OMX_VIDEO_VP8Level_Version3) { 492b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mLevel = vp8Params->eLevel; 493b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } else { 494b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return OMX_ErrorBadParameter; 495b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 496b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 497b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (vp8Params->nDCTPartitions <= kMaxDCTPartitions) { 498b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mDCTPartitions = vp8Params->nDCTPartitions; 499b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } else { 500b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return OMX_ErrorBadParameter; 501b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 502b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 503b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mErrorResilience = vp8Params->bErrorResilientMode; 504b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return OMX_ErrorNone; 505b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin} 506b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 5074154795d5526750b7aec5f774831a9e1ba0a3f15Alex GlaznevOMX_ERRORTYPE SoftVPXEncoder::internalSetAndroidVp8Params( 5084154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev const OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE* vp8AndroidParams) { 5094154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (vp8AndroidParams->nPortIndex != kOutputPortIndex) { 5104154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return OMX_ErrorUnsupportedIndex; 5114154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 5124154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (vp8AndroidParams->eTemporalPattern != OMX_VIDEO_VPXTemporalLayerPatternNone && 5134154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8AndroidParams->eTemporalPattern != OMX_VIDEO_VPXTemporalLayerPatternWebRTC) { 5144154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return OMX_ErrorBadParameter; 5154154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 5164154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (vp8AndroidParams->nTemporalLayerCount > OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS) { 5174154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return OMX_ErrorBadParameter; 5184154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 5194154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (vp8AndroidParams->nMinQuantizer > vp8AndroidParams->nMaxQuantizer) { 5204154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return OMX_ErrorBadParameter; 5214154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 5224154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 5234154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPatternType = vp8AndroidParams->eTemporalPattern; 5244154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (vp8AndroidParams->eTemporalPattern == OMX_VIDEO_VPXTemporalLayerPatternWebRTC) { 5254154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalLayers = vp8AndroidParams->nTemporalLayerCount; 5264154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else if (vp8AndroidParams->eTemporalPattern == OMX_VIDEO_VPXTemporalLayerPatternNone) { 5274154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalLayers = 0; 5284154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 5294154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Check the bitrate distribution between layers is in increasing order 5304154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (mTemporalLayers > 1) { 5314154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev for (size_t i = 0; i < mTemporalLayers - 1; i++) { 5324154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (vp8AndroidParams->nTemporalLayerBitrateRatio[i + 1] <= 5334154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8AndroidParams->nTemporalLayerBitrateRatio[i]) { 5344154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev ALOGE("Wrong bitrate ratio - should be in increasing order."); 5354154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return OMX_ErrorBadParameter; 5364154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 5374154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 5384154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 5394154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mKeyFrameInterval = vp8AndroidParams->nKeyFrameInterval; 5404154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mMinQuantizer = vp8AndroidParams->nMinQuantizer; 5414154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mMaxQuantizer = vp8AndroidParams->nMaxQuantizer; 5424154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev memcpy(mTemporalLayerBitrateRatio, vp8AndroidParams->nTemporalLayerBitrateRatio, 5434154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev sizeof(mTemporalLayerBitrateRatio)); 5444154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev ALOGD("VP8: internalSetAndroidVp8Params. BRMode: %u. TS: %zu. KF: %u." 5454154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev " QP: %u - %u BR0: %u. BR1: %u. BR2: %u", 5464154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev (uint32_t)mBitrateControlMode, mTemporalLayers, mKeyFrameInterval, 5474154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mMinQuantizer, mMaxQuantizer, mTemporalLayerBitrateRatio[0], 5484154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalLayerBitrateRatio[1], mTemporalLayerBitrateRatio[2]); 5494154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return OMX_ErrorNone; 5504154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev} 551b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 552b4698f79230bbee15936641d951d49655f9e6da5Kunter GultekinOMX_ERRORTYPE SoftVPXEncoder::internalSetBitrateParams( 553b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const OMX_VIDEO_PARAM_BITRATETYPE* bitrate) { 554b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (bitrate->nPortIndex != kOutputPortIndex) { 555b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return OMX_ErrorUnsupportedIndex; 556b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 557b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 558b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mBitrate = bitrate->nTargetBitrate; 559b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 560b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (bitrate->eControlRate == OMX_Video_ControlRateVariable) { 561b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mBitrateControlMode = VPX_VBR; 562b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } else if (bitrate->eControlRate == OMX_Video_ControlRateConstant) { 563b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin mBitrateControlMode = VPX_CBR; 564b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } else { 565b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return OMX_ErrorUnsupportedSetting; 566b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 567b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 568b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return OMX_ErrorNone; 569b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin} 570b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 5714154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznevvpx_enc_frame_flags_t SoftVPXEncoder::getEncodeFlags() { 5724154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vpx_enc_frame_flags_t flags = 0; 5734154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev int patternIdx = mTemporalPatternIdx % mTemporalPatternLength; 5744154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mTemporalPatternIdx++; 5754154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev switch (mTemporalPattern[patternIdx]) { 5764154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case kTemporalUpdateLast: 5774154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_GF; 5784154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_ARF; 5794154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_REF_GF; 5804154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_REF_ARF; 5814154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev break; 5824154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case kTemporalUpdateGoldenWithoutDependency: 5834154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_REF_GF; 5844154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Deliberately no break here. 5854154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case kTemporalUpdateGolden: 5864154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_REF_ARF; 5874154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_ARF; 5884154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_LAST; 5894154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev break; 5904154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case kTemporalUpdateAltrefWithoutDependency: 5914154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_REF_ARF; 5924154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_REF_GF; 5934154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Deliberately no break here. 5944154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case kTemporalUpdateAltref: 5954154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_GF; 5964154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_LAST; 5974154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev break; 5984154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case kTemporalUpdateNoneNoRefAltref: 5994154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_REF_ARF; 6004154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Deliberately no break here. 6014154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case kTemporalUpdateNone: 6024154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_GF; 6034154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_ARF; 6044154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_LAST; 6054154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_ENTROPY; 6064154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev break; 6074154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case kTemporalUpdateNoneNoRefGoldenRefAltRef: 6084154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_REF_GF; 6094154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_GF; 6104154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_ARF; 6114154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_LAST; 6124154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_ENTROPY; 6134154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev break; 6144154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case kTemporalUpdateGoldenWithoutDependencyRefAltRef: 6154154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_REF_GF; 6164154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_ARF; 6174154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_LAST; 6184154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev break; 6194154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case kTemporalUpdateLastRefAltRef: 6204154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_GF; 6214154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_ARF; 6224154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_REF_GF; 6234154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev break; 6244154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case kTemporalUpdateGoldenRefAltRef: 6254154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_ARF; 6264154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_LAST; 6274154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev break; 6284154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case kTemporalUpdateLastAndGoldenRefAltRef: 6294154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_ARF; 6304154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_REF_GF; 6314154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev break; 6324154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev case kTemporalUpdateLastRefAll: 6334154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_ARF; 6344154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags |= VP8_EFLAG_NO_UPD_GF; 6354154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev break; 6364154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 6374154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return flags; 6384154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev} 639b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 640a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnarvoid SoftVPXEncoder::onQueueFilled(OMX_U32 /* portIndex */) { 641b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Initialize encoder if not already 642b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (mCodecContext == NULL) { 643b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (OK != initEncoder()) { 644b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin ALOGE("Failed to initialize encoder"); 645b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin notify(OMX_EventError, 646b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_ErrorUndefined, 647b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 0, // Extra notification data 648b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin NULL); // Notification data pointer 649b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return; 650b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 651b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 652b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 653b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vpx_codec_err_t codec_return; 654b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin List<BufferInfo *> &inputBufferInfoQueue = getPortQueue(kInputPortIndex); 655b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin List<BufferInfo *> &outputBufferInfoQueue = getPortQueue(kOutputPortIndex); 656b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 657b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin while (!inputBufferInfoQueue.empty() && !outputBufferInfoQueue.empty()) { 658b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin BufferInfo *inputBufferInfo = *inputBufferInfoQueue.begin(); 659b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_BUFFERHEADERTYPE *inputBufferHeader = inputBufferInfo->mHeader; 660b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 661b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin BufferInfo *outputBufferInfo = *outputBufferInfoQueue.begin(); 662b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_BUFFERHEADERTYPE *outputBufferHeader = outputBufferInfo->mHeader; 663b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 664b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (inputBufferHeader->nFlags & OMX_BUFFERFLAG_EOS) { 665b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin inputBufferInfoQueue.erase(inputBufferInfoQueue.begin()); 666b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin inputBufferInfo->mOwnedByUs = false; 667b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin notifyEmptyBufferDone(inputBufferHeader); 668b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 669b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin outputBufferHeader->nFilledLen = 0; 670b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin outputBufferHeader->nFlags = OMX_BUFFERFLAG_EOS; 671b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 672b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin outputBufferInfoQueue.erase(outputBufferInfoQueue.begin()); 673b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin outputBufferInfo->mOwnedByUs = false; 674b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin notifyFillBufferDone(outputBufferHeader); 675b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return; 676b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 677b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 6782edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar const uint8_t *source = 679a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber inputBufferHeader->pBuffer + inputBufferHeader->nOffset; 680a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber 681a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber if (mInputDataIsMeta) { 6822edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar source = extractGraphicBuffer( 6832edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar mConversionBuffer, mWidth * mHeight * 3 / 2, 6842edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar source, inputBufferHeader->nFilledLen, 6852edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar mWidth, mHeight); 6862edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar if (source == NULL) { 6872edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar ALOGE("Unable to extract gralloc buffer in metadata mode"); 6882edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); 6892edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar return; 690a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber } 691a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber } else if (mColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) { 6922edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar ConvertYUV420SemiPlanarToYUV420Planar( 693a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber source, mConversionBuffer, mWidth, mHeight); 694b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 695b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin source = mConversionBuffer; 696b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 697b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vpx_image_t raw_frame; 698b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vpx_img_wrap(&raw_frame, VPX_IMG_FMT_I420, mWidth, mHeight, 6992edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar kInputBufferAlignment, (uint8_t *)source); 700336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber 701336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber vpx_enc_frame_flags_t flags = 0; 7024154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (mTemporalPatternLength > 0) { 7034154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev flags = getEncodeFlags(); 7044154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 705336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber if (mKeyFrameRequested) { 706336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber flags |= VPX_EFLAG_FORCE_KF; 707336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber mKeyFrameRequested = false; 708336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber } 709336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber 71030c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann if (mBitrateUpdated) { 71130c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann mCodecConfiguration->rc_target_bitrate = mBitrate/1000; 71230c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann vpx_codec_err_t res = vpx_codec_enc_config_set(mCodecContext, 71330c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann mCodecConfiguration); 71430c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann if (res != VPX_CODEC_OK) { 71530c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann ALOGE("vp8 encoder failed to update bitrate: %s", 71630c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann vpx_codec_err_to_string(res)); 71730c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann notify(OMX_EventError, 71830c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann OMX_ErrorUndefined, 71930c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann 0, // Extra notification data 72030c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann NULL); // Notification data pointer 72130c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann } 72230c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann mBitrateUpdated = false; 72330c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann } 72430c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann 7254154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev uint32_t frameDuration; 7264154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (inputBufferHeader->nTimeStamp > mLastTimestamp) { 7274154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev frameDuration = (uint32_t)(inputBufferHeader->nTimeStamp - mLastTimestamp); 7284154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else { 7294154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev frameDuration = (uint32_t)(((uint64_t)1000000 << 16) / mFramerate); 7304154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 7314154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mLastTimestamp = inputBufferHeader->nTimeStamp; 732a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber codec_return = vpx_codec_encode( 733a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber mCodecContext, 734a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber &raw_frame, 735a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber inputBufferHeader->nTimeStamp, // in timebase units 7360d6abe8cdadde6f9ad7ac989042f725668233bdbAlex Glaznev frameDuration, // frame duration in timebase units 737336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber flags, // frame flags 738a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber VPX_DL_REALTIME); // encoding deadline 739b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (codec_return != VPX_CODEC_OK) { 740b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin ALOGE("vpx encoder failed to encode frame"); 741b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin notify(OMX_EventError, 742b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_ErrorUndefined, 743b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 0, // Extra notification data 744b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin NULL); // Notification data pointer 745b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return; 746b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 747b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 748b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vpx_codec_iter_t encoded_packet_iterator = NULL; 749b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const vpx_codec_cx_pkt_t* encoded_packet; 750b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 751a5761dcb5f9f017ca9b83ec868565d7ce54a92acAndreas Huber while ((encoded_packet = vpx_codec_get_cx_data( 752a5761dcb5f9f017ca9b83ec868565d7ce54a92acAndreas Huber mCodecContext, &encoded_packet_iterator))) { 753b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin if (encoded_packet->kind == VPX_CODEC_CX_FRAME_PKT) { 754b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin outputBufferHeader->nTimeStamp = encoded_packet->data.frame.pts; 755b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin outputBufferHeader->nFlags = 0; 756465da60d885c8fa4e7cea4626478574ce17a54a9Johann if (encoded_packet->data.frame.flags & VPX_FRAME_IS_KEY) 757465da60d885c8fa4e7cea4626478574ce17a54a9Johann outputBufferHeader->nFlags |= OMX_BUFFERFLAG_SYNCFRAME; 758b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin outputBufferHeader->nOffset = 0; 759b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin outputBufferHeader->nFilledLen = encoded_packet->data.frame.sz; 760b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin memcpy(outputBufferHeader->pBuffer, 761b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin encoded_packet->data.frame.buf, 762b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin encoded_packet->data.frame.sz); 763b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin outputBufferInfo->mOwnedByUs = false; 764b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin outputBufferInfoQueue.erase(outputBufferInfoQueue.begin()); 765b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin notifyFillBufferDone(outputBufferHeader); 766b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 767b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 768b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 769b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin inputBufferInfo->mOwnedByUs = false; 770b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin inputBufferInfoQueue.erase(inputBufferInfoQueue.begin()); 771b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin notifyEmptyBufferDone(inputBufferHeader); 772b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin } 773b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin} 774a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber 775b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin} // namespace android 776b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 777b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 778b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekinandroid::SoftOMXComponent *createSoftOMXComponent( 779b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const char *name, const OMX_CALLBACKTYPE *callbacks, 780b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_PTR appData, OMX_COMPONENTTYPE **component) { 781b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin return new android::SoftVPXEncoder(name, callbacks, appData, component); 782b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin} 783