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#ifndef SOFT_VPX_ENCODER_H_ 18b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 19b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#define SOFT_VPX_ENCODER_H_ 20b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 212edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#include "SoftVideoEncoderOMXComponent.h" 22b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 23b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#include <OMX_VideoExt.h> 24b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#include <OMX_IndexExt.h> 25b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 26a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber#include <hardware/gralloc.h> 27a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber 28b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#include "vpx/vpx_encoder.h" 29b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#include "vpx/vpx_codec.h" 30b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#include "vpx/vp8cx.h" 31b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 32b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekinnamespace android { 33b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 34b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// Exposes a vpx encoder as an OMX Component 35b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// 36b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// Boilerplate for callback bindings are taken care 37b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// by the base class SimpleSoftOMXComponent and its 38b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// parent SoftOMXComponent. 39b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// 40b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// Only following encoder settings are available 41b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// - target bitrate 42b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// - rate control (constant / variable) 43b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// - frame rate 44b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// - error resilience 45b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// - token partitioning 46b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// - reconstruction & loop filters (g_profile) 47b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// 48b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// Only following color formats are recognized 49b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// - YUV420Planar 50b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// - YUV420SemiPlanar 51b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// - AndroidOpaque 52b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// 53b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// Following settings are not configurable by the client 54b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// - encoding deadline is realtime 55b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// - multithreaded encoding utilizes a number of threads equal 56b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// to online cpu's available 57b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// - the algorithm interface for encoder is vp8 58b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// - fractional bits of frame rate is discarded 59b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// - OMX timestamps are in microseconds, therefore 60b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin// encoder timebase is fixed to 1/1000000 61b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 622edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnarstruct SoftVPXEncoder : public SoftVideoEncoderOMXComponent { 63b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin SoftVPXEncoder(const char *name, 64b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const OMX_CALLBACKTYPE *callbacks, 65b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_PTR appData, 66b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_COMPONENTTYPE **component); 67b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 68a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huberprotected: 69b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin virtual ~SoftVPXEncoder(); 70b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 71b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Returns current values for requested OMX 72b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // parameters 73b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin virtual OMX_ERRORTYPE internalGetParameter( 74b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_INDEXTYPE index, OMX_PTR param); 75b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 76b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Validates, extracts and stores relevant OMX 77b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // parameters 78b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin virtual OMX_ERRORTYPE internalSetParameter( 79b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_INDEXTYPE index, const OMX_PTR param); 80b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 81336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber virtual OMX_ERRORTYPE setConfig( 82336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber OMX_INDEXTYPE index, const OMX_PTR params); 83336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber 84b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // OMX callback when buffers available 85b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Note that both an input and output buffer 86b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // is expected to be available to carry out 87b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // encoding of the frame 88b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin virtual void onQueueFilled(OMX_U32 portIndex); 89b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 905443b57cc54f2e46b35246637be26a69e9f493e1Wonsik Kim virtual void onReset(); 915443b57cc54f2e46b35246637be26a69e9f493e1Wonsik Kim 92a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huberprivate: 934154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev enum TemporalReferences { 944154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // For 1 layer case: reference all (last, golden, and alt ref), but only 954154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // update last. 964154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kTemporalUpdateLastRefAll = 12, 974154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // First base layer frame for 3 temporal layers, which updates last and 984154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // golden with alt ref dependency. 994154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kTemporalUpdateLastAndGoldenRefAltRef = 11, 1004154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // First enhancement layer with alt ref dependency. 1014154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kTemporalUpdateGoldenRefAltRef = 10, 1024154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // First enhancement layer with alt ref dependency. 1034154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kTemporalUpdateGoldenWithoutDependencyRefAltRef = 9, 1044154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Base layer with alt ref dependency. 1054154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kTemporalUpdateLastRefAltRef = 8, 1064154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Highest enhacement layer without dependency on golden with alt ref 1074154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // dependency. 1084154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kTemporalUpdateNoneNoRefGoldenRefAltRef = 7, 1094154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Second layer and last frame in cycle, for 2 layers. 1104154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kTemporalUpdateNoneNoRefAltref = 6, 1114154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Highest enhancement layer. 1124154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kTemporalUpdateNone = 5, 1134154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Second enhancement layer. 1144154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kTemporalUpdateAltref = 4, 1154154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Second enhancement layer without dependency on previous frames in 1164154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // the second enhancement layer. 1174154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kTemporalUpdateAltrefWithoutDependency = 3, 1184154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // First enhancement layer. 1194154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kTemporalUpdateGolden = 2, 1204154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // First enhancement layer without dependency on previous frames in 1214154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // the first enhancement layer. 1224154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kTemporalUpdateGoldenWithoutDependency = 1, 1234154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Base layer. 1244154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kTemporalUpdateLast = 0, 1254154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev }; 1264154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev enum { 1274154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kMaxTemporalPattern = 8 1284154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev }; 1294154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 130b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // number of buffers allocated per port 131b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin static const uint32_t kNumBuffers = 4; 132b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 133b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // OMX port indexes that refer to input and 134b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // output ports respectively 135b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin static const uint32_t kInputPortIndex = 0; 136b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin static const uint32_t kOutputPortIndex = 1; 137b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 138b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Byte-alignment required for buffers 139b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin static const uint32_t kInputBufferAlignment = 1; 140b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin static const uint32_t kOutputBufferAlignment = 2; 141b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 142b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Max value supported for DCT partitions 143b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin static const uint32_t kMaxDCTPartitions = 3; 144b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 145b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Number of supported input color formats 146b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin static const uint32_t kNumberOfSupportedColorFormats = 3; 147b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 148b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // vpx specific opaque data structure that 149b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // stores encoder state 150b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vpx_codec_ctx_t* mCodecContext; 151b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 152b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // vpx specific data structure that 153b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // stores encoder configuration 154b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vpx_codec_enc_cfg_t* mCodecConfiguration; 155b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 156b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // vpx specific read-only data structure 157b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // that specifies algorithm interface (e.g. vp8) 158b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vpx_codec_iface_t* mCodecInterface; 159b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 16030c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann // If a request for a change it bitrate has been received. 16130c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann bool mBitrateUpdated; 162b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 163b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Bitrate control mode, either constant or variable 164b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vpx_rc_mode mBitrateControlMode; 165b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 166b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // vp8 specific configuration parameter 167b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // that enables token partitioning of 168b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // the stream into substreams 169b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin int32_t mDCTPartitions; 170b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 171b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Parameter that denotes whether error resilience 172b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // is enabled in encoder 173b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_BOOL mErrorResilience; 174b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 175b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Encoder profile corresponding to OMX level parameter 176b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // 177b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // The inconsistency in the naming is caused by 178b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // OMX spec referring vpx profiles (g_profile) 179b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // as "levels" whereas using the name "profile" for 180b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // something else. 181b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_VIDEO_VP8LEVELTYPE mLevel; 182b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 1834154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Key frame interval in frames 1844154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev uint32_t mKeyFrameInterval; 1854154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 1864154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Minimum (best quality) quantizer 1874154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev uint32_t mMinQuantizer; 1884154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 1894154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Maximum (worst quality) quantizer 1904154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev uint32_t mMaxQuantizer; 1914154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 1924154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Number of coding temporal layers to be used. 1934154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev size_t mTemporalLayers; 1944154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 1954154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Temporal layer bitrare ratio in percentage 1964154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev uint32_t mTemporalLayerBitrateRatio[OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS]; 1974154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 1984154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Temporal pattern type 1994154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_ANDROID_VPXTEMPORALLAYERPATTERNTYPE mTemporalPatternType; 2004154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 2014154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Temporal pattern length 2024154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev size_t mTemporalPatternLength; 2034154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 2044154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Temporal pattern current index 2054154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev size_t mTemporalPatternIdx; 2064154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 2074154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Frame type temporal pattern 2084154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev TemporalReferences mTemporalPattern[kMaxTemporalPattern]; 2094154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 2104154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Last input buffer timestamp 2114154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_TICKS mLastTimestamp; 2124154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 213b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Conversion buffer is needed to convert semi 214b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // planar yuv420 to planar format 215b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // It is only allocated if input format is 216b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // indeed YUV420SemiPlanar. 217b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin uint8_t* mConversionBuffer; 218b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 219336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber bool mKeyFrameRequested; 220336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber 221b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Initializes vpx encoder with available settings. 222b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin status_t initEncoder(); 223b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 224b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Releases vpx encoder instance, with it's associated 225b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // data structures. 226b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // 227b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Unless called earlier, this is handled by the 228b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // dtor. 229b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin status_t releaseEncoder(); 230b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 2314154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Get current encode flags 2324154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vpx_enc_frame_flags_t getEncodeFlags(); 2334154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 234b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Updates bitrate to reflect port settings. 235b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_ERRORTYPE internalSetBitrateParams( 236b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const OMX_VIDEO_PARAM_BITRATETYPE* bitrate); 237b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 238b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Handles vp8 specific parameters. 239b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_ERRORTYPE internalSetVp8Params( 240b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const OMX_VIDEO_PARAM_VP8TYPE* vp8Params); 241b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 2424154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev // Handles Android vp8 specific parameters. 2434154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_ERRORTYPE internalSetAndroidVp8Params( 2444154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev const OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE* vp8AndroidParams); 2454154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 246b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin DISALLOW_EVIL_CONSTRUCTORS(SoftVPXEncoder); 247b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin}; 248b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 249b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin} // namespace android 250b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 251b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#endif // SOFT_VPX_ENCODER_H_ 252