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
21255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/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
34d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian// Base class for a VPX Encoder 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//
40d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian// Only following encoder settings are available (codec specific settings might
41d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian// be available in the sub-classes):
42b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin//    - target bitrate
43b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin//    - rate control (constant / variable)
44b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin//    - frame rate
45b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin//    - error resilience
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
57d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian//    - the algorithm interface for encoder is decided by the sub-class in use
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,
66d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian                   OMX_COMPONENTTYPE **component,
67d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian                   const char* role,
68d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian                   OMX_VIDEO_CODINGTYPE codingType,
69d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian                   const char* mimeType,
70d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian                   int32_t minCompressionRatio,
71d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian                   const CodecProfileLevel *profileLevels,
72d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian                   size_t numProfileLevels);
73b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
74a0a63e13788a77bc502da0c72269d82c4779ac91Andreas Huberprotected:
75b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    virtual ~SoftVPXEncoder();
76b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
77b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // Returns current values for requested OMX
78b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // parameters
79b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    virtual OMX_ERRORTYPE internalGetParameter(
80b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin            OMX_INDEXTYPE index, OMX_PTR param);
81b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
82b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // Validates, extracts and stores relevant OMX
83b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // parameters
84b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    virtual OMX_ERRORTYPE internalSetParameter(
85b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin            OMX_INDEXTYPE index, const OMX_PTR param);
86b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
87336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber    virtual OMX_ERRORTYPE setConfig(
88336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber            OMX_INDEXTYPE index, const OMX_PTR params);
89336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber
90b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // OMX callback when buffers available
91b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // Note that both an input and output buffer
92b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // is expected to be available to carry out
93b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // encoding of the frame
94b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    virtual void onQueueFilled(OMX_U32 portIndex);
95b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
965443b57cc54f2e46b35246637be26a69e9f493e1Wonsik Kim    virtual void onReset();
975443b57cc54f2e46b35246637be26a69e9f493e1Wonsik Kim
98d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian    // Initializes vpx encoder with available settings.
99d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian    status_t initEncoder();
100d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian
101d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian    // Populates mCodecInterface with codec specific settings.
102d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian    virtual void setCodecSpecificInterface() = 0;
103d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian
1044f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian    // Sets codec specific configuration.
105328597abaecff9722dcfb4bb4c67964bd82a072aVignesh Venkatasubramanian    virtual void setCodecSpecificConfiguration() = 0;
1064f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian
107d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian    // Sets codec specific encoder controls.
108d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian    virtual vpx_codec_err_t setCodecSpecificControls() = 0;
109d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian
1104f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian    // Get current encode flags.
1114f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian    virtual vpx_enc_frame_flags_t getEncodeFlags();
1124f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian
113d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian    // Releases vpx encoder instance, with it's associated
114d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian    // data structures.
115d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian    //
116d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian    // Unless called earlier, this is handled by the
117d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian    // dtor.
118d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian    status_t releaseEncoder();
119d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian
120d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian    // Get bitrate parameters.
121d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian    virtual OMX_ERRORTYPE internalGetBitrateParams(
122d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian        OMX_VIDEO_PARAM_BITRATETYPE* bitrate);
123d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian
124d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian    // Updates bitrate to reflect port settings.
125d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian    virtual OMX_ERRORTYPE internalSetBitrateParams(
126d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian        const OMX_VIDEO_PARAM_BITRATETYPE* bitrate);
127d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian
128328597abaecff9722dcfb4bb4c67964bd82a072aVignesh Venkatasubramanian    // Gets Android vpx specific parameters.
129328597abaecff9722dcfb4bb4c67964bd82a072aVignesh Venkatasubramanian    OMX_ERRORTYPE internalGetAndroidVpxParams(
130328597abaecff9722dcfb4bb4c67964bd82a072aVignesh Venkatasubramanian            OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE *vpxAndroidParams);
131328597abaecff9722dcfb4bb4c67964bd82a072aVignesh Venkatasubramanian
132328597abaecff9722dcfb4bb4c67964bd82a072aVignesh Venkatasubramanian    // Handles Android vpx specific parameters.
133328597abaecff9722dcfb4bb4c67964bd82a072aVignesh Venkatasubramanian    OMX_ERRORTYPE internalSetAndroidVpxParams(
134328597abaecff9722dcfb4bb4c67964bd82a072aVignesh Venkatasubramanian            const OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE *vpxAndroidParams);
135328597abaecff9722dcfb4bb4c67964bd82a072aVignesh Venkatasubramanian
1364154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    enum TemporalReferences {
1374154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // For 1 layer case: reference all (last, golden, and alt ref), but only
1384154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // update last.
1394154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        kTemporalUpdateLastRefAll = 12,
1404154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // First base layer frame for 3 temporal layers, which updates last and
1414154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // golden with alt ref dependency.
1424154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        kTemporalUpdateLastAndGoldenRefAltRef = 11,
1434154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // First enhancement layer with alt ref dependency.
1444154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        kTemporalUpdateGoldenRefAltRef = 10,
1454154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // First enhancement layer with alt ref dependency.
1464154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        kTemporalUpdateGoldenWithoutDependencyRefAltRef = 9,
1474154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // Base layer with alt ref dependency.
1484154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        kTemporalUpdateLastRefAltRef = 8,
1494154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // Highest enhacement layer without dependency on golden with alt ref
1504154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // dependency.
1514154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        kTemporalUpdateNoneNoRefGoldenRefAltRef = 7,
1524154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // Second layer and last frame in cycle, for 2 layers.
1534154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        kTemporalUpdateNoneNoRefAltref = 6,
1544154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // Highest enhancement layer.
1554154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        kTemporalUpdateNone = 5,
1564154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // Second enhancement layer.
1574154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        kTemporalUpdateAltref = 4,
1584154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // Second enhancement layer without dependency on previous frames in
1594154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // the second enhancement layer.
1604154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        kTemporalUpdateAltrefWithoutDependency = 3,
1614154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // First enhancement layer.
1624154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        kTemporalUpdateGolden = 2,
1634154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // First enhancement layer without dependency on previous frames in
1644154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // the first enhancement layer.
1654154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        kTemporalUpdateGoldenWithoutDependency = 1,
1664154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        // Base layer.
1674154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        kTemporalUpdateLast = 0,
1684154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    };
1694154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    enum {
1704154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev        kMaxTemporalPattern = 8
1714154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    };
1724154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev
173b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // number of buffers allocated per port
174b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    static const uint32_t kNumBuffers = 4;
175b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
176b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // OMX port indexes that refer to input and
177b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // output ports respectively
178b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    static const uint32_t kInputPortIndex = 0;
179b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    static const uint32_t kOutputPortIndex = 1;
180b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
181b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // Byte-alignment required for buffers
182b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    static const uint32_t kInputBufferAlignment = 1;
183b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    static const uint32_t kOutputBufferAlignment = 2;
184b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
185b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // Number of supported input color formats
186b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    static const uint32_t kNumberOfSupportedColorFormats = 3;
187b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
188b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // vpx specific opaque data structure that
189b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // stores encoder state
190b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    vpx_codec_ctx_t* mCodecContext;
191b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
192b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // vpx specific data structure that
193b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // stores encoder configuration
194b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    vpx_codec_enc_cfg_t* mCodecConfiguration;
195b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
196b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // vpx specific read-only data structure
197b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // that specifies algorithm interface (e.g. vp8)
198b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    vpx_codec_iface_t* mCodecInterface;
199b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
20030c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann    // If a request for a change it bitrate has been received.
20130c08634416a99a0f627e4de3a5f49dcf0a72fd3Johann    bool mBitrateUpdated;
202b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
203b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // Bitrate control mode, either constant or variable
204b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    vpx_rc_mode mBitrateControlMode;
205b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
206b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // Parameter that denotes whether error resilience
207b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // is enabled in encoder
208b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    OMX_BOOL mErrorResilience;
209b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
2104154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    // Key frame interval in frames
2114154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    uint32_t mKeyFrameInterval;
2124154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev
2134154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    // Minimum (best quality) quantizer
2144154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    uint32_t mMinQuantizer;
2154154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev
2164154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    // Maximum (worst quality) quantizer
2174154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    uint32_t mMaxQuantizer;
2184154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev
2194154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    // Number of coding temporal layers to be used.
2204154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    size_t mTemporalLayers;
2214154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev
2224154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    // Temporal layer bitrare ratio in percentage
2234154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    uint32_t mTemporalLayerBitrateRatio[OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS];
2244154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev
2254154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    // Temporal pattern type
2264154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    OMX_VIDEO_ANDROID_VPXTEMPORALLAYERPATTERNTYPE mTemporalPatternType;
2274154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev
2284154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    // Temporal pattern length
2294154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    size_t mTemporalPatternLength;
2304154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev
2314154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    // Temporal pattern current index
2324154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    size_t mTemporalPatternIdx;
2334154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev
2344154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    // Frame type temporal pattern
2354154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    TemporalReferences mTemporalPattern[kMaxTemporalPattern];
2364154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev
2374154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    // Last input buffer timestamp
2384154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev    OMX_TICKS mLastTimestamp;
2394154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev
240b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // Conversion buffer is needed to convert semi
241b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // planar yuv420 to planar format
242b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // It is only allocated if input format is
243b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    // indeed YUV420SemiPlanar.
244b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    uint8_t* mConversionBuffer;
245b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
246336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber    bool mKeyFrameRequested;
247336da16a12423c496efba6ca9813d5d42a1f70f6Andreas Huber
248b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin    DISALLOW_EVIL_CONSTRUCTORS(SoftVPXEncoder);
249b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin};
250b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
251b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin}  // namespace android
252b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin
253b4698f79230bbee15936641d951d49655f9e6da5Kunter Gultekin#endif  // SOFT_VPX_ENCODER_H_
254