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 21b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#include "SimpleSoftOMXComponent.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 62a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huberstruct SoftVPXEncoder : public SimpleSoftOMXComponent { 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 90a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber virtual OMX_ERRORTYPE getExtensionIndex( 91a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber const char *name, OMX_INDEXTYPE *index); 92a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber 93a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huberprivate: 94b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // number of buffers allocated per port 95b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin static const uint32_t kNumBuffers = 4; 96b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 97b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // OMX port indexes that refer to input and 98b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // output ports respectively 99b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin static const uint32_t kInputPortIndex = 0; 100b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin static const uint32_t kOutputPortIndex = 1; 101b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 102b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Byte-alignment required for buffers 103b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin static const uint32_t kInputBufferAlignment = 1; 104b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin static const uint32_t kOutputBufferAlignment = 2; 105b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 106b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Max value supported for DCT partitions 107b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin static const uint32_t kMaxDCTPartitions = 3; 108b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 109b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Number of supported input color formats 110b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin static const uint32_t kNumberOfSupportedColorFormats = 3; 111b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 112b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // vpx specific opaque data structure that 113b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // stores encoder state 114b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vpx_codec_ctx_t* mCodecContext; 115b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 116b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // vpx specific data structure that 117b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // stores encoder configuration 118b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vpx_codec_enc_cfg_t* mCodecConfiguration; 119b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 120b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // vpx specific read-only data structure 121b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // that specifies algorithm interface (e.g. vp8) 122b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vpx_codec_iface_t* mCodecInterface; 123b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 124b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Width of the input frames 125b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin int32_t mWidth; 126b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 127b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Height of the input frames 128b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin int32_t mHeight; 129b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 130b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Target bitrate set for the encoder, in bits per second. 13130c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann uint32_t mBitrate; 13230c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann 13330c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann // If a request for a change it bitrate has been received. 13430c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann bool mBitrateUpdated; 135b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 136b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Bitrate control mode, either constant or variable 137b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin vpx_rc_mode mBitrateControlMode; 138b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 139b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Frame duration is the reciprocal of framerate, denoted 140b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // in microseconds 141b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin uint64_t mFrameDurationUs; 142b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 143b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // vp8 specific configuration parameter 144b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // that enables token partitioning of 145b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // the stream into substreams 146b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin int32_t mDCTPartitions; 147b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 148b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Parameter that denotes whether error resilience 149b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // is enabled in encoder 150b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_BOOL mErrorResilience; 151b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 152b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Color format for the input port 153b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_COLOR_FORMATTYPE mColorFormat; 154b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 155b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Encoder profile corresponding to OMX level parameter 156b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // 157b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // The inconsistency in the naming is caused by 158b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // OMX spec referring vpx profiles (g_profile) 159b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // as "levels" whereas using the name "profile" for 160b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // something else. 161b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_VIDEO_VP8LEVELTYPE mLevel; 162b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 163b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Conversion buffer is needed to convert semi 164b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // planar yuv420 to planar format 165b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // It is only allocated if input format is 166b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // indeed YUV420SemiPlanar. 167b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin uint8_t* mConversionBuffer; 168b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 169a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber bool mInputDataIsMeta; 170a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber const hw_module_t *mGrallocModule; 171a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huber 172336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber bool mKeyFrameRequested; 173336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber 174b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Initializes input and output OMX ports with sensible 175b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // default values. 176b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin void initPorts(); 177b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 178b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Initializes vpx encoder with available settings. 179b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin status_t initEncoder(); 180b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 181b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Releases vpx encoder instance, with it's associated 182b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // data structures. 183b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // 184b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Unless called earlier, this is handled by the 185b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // dtor. 186b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin status_t releaseEncoder(); 187b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 188b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Handles port changes with respect to color formats 189b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_ERRORTYPE internalSetFormatParams( 190b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const OMX_VIDEO_PARAM_PORTFORMATTYPE* format); 191b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 192b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Verifies the component role tried to be set to this OMX component is 19394705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang // strictly video_encoder.vp8 194b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_ERRORTYPE internalSetRoleParams( 195b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const OMX_PARAM_COMPONENTROLETYPE* role); 196b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 197b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Updates bitrate to reflect port settings. 198b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_ERRORTYPE internalSetBitrateParams( 199b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const OMX_VIDEO_PARAM_BITRATETYPE* bitrate); 200b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 201b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Handles port definition changes. 202b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_ERRORTYPE internalSetPortParams( 203b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const OMX_PARAM_PORTDEFINITIONTYPE* port); 204b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 205b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Handles vp8 specific parameters. 206b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_ERRORTYPE internalSetVp8Params( 207b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const OMX_VIDEO_PARAM_VP8TYPE* vp8Params); 208b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 209b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin // Updates encoder profile 210b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin OMX_ERRORTYPE internalSetProfileLevel( 211b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin const OMX_VIDEO_PARAM_PROFILELEVELTYPE* profileAndLevel); 212b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 213b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin DISALLOW_EVIL_CONSTRUCTORS(SoftVPXEncoder); 214b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin}; 215b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 216b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin} // namespace android 217b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin 218b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#endif // SOFT_VPX_ENCODER_H_ 219