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