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