1bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian/*
2bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian * Copyright (C) 2014 The Android Open Source Project
3bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian *
4bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian * Licensed under the Apache License, Version 2.0 (the "License");
5bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian * you may not use this file except in compliance with the License.
6bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian * You may obtain a copy of the License at
7bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian *
8bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian *      http://www.apache.org/licenses/LICENSE-2.0
9bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian *
10bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian * Unless required by applicable law or agreed to in writing, software
11bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian * distributed under the License is distributed on an "AS IS" BASIS,
12bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian * See the License for the specific language governing permissions and
14bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian * limitations under the License.
15bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian */
16bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
17bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian/*
18bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian * The Opus specification is part of IETF RFC 6716:
19bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian * http://tools.ietf.org/html/rfc6716
20bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian */
21bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
22bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian#ifndef SOFT_OPUS_H_
23bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
24bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian#define SOFT_OPUS_H_
25bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
26bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian#include "SimpleSoftOMXComponent.h"
27bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
28bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanianstruct OpusMSDecoder;
29bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
30bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramaniannamespace android {
31bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
32bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanianstruct OpusHeader {
33bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian  int channels;
34bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian  int skip_samples;
35bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian  int channel_mapping;
36bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian  int num_streams;
37bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian  int num_coupled;
38bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian  int16_t gain_db;
39bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian  uint8_t stream_map[8];
40bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian};
41bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
42bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanianstruct SoftOpus : public SimpleSoftOMXComponent {
43bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    SoftOpus(const char *name,
44bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian             const OMX_CALLBACKTYPE *callbacks,
45bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian             OMX_PTR appData,
46bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian             OMX_COMPONENTTYPE **component);
47bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
48bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanianprotected:
49bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    virtual ~SoftOpus();
50bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
51bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    virtual OMX_ERRORTYPE internalGetParameter(
52bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian            OMX_INDEXTYPE index, OMX_PTR params);
53bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
54bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    virtual OMX_ERRORTYPE internalSetParameter(
55bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian            OMX_INDEXTYPE index, const OMX_PTR params);
56bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
57bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    virtual void onQueueFilled(OMX_U32 portIndex);
58bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    virtual void onPortFlushCompleted(OMX_U32 portIndex);
59bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    virtual void onPortEnableCompleted(OMX_U32 portIndex, bool enabled);
60bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    virtual void onReset();
61bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
62bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanianprivate:
63bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    enum {
64bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian        kNumBuffers = 4,
65bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian        kMaxNumSamplesPerBuffer = 960 * 6
66bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    };
67bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
68bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    size_t mInputBufferCount;
69bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
70bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    OpusMSDecoder *mDecoder;
71bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    OpusHeader *mHeader;
72bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
73bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    int64_t mCodecDelay;
74bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    int64_t mSeekPreRoll;
75bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    int64_t mSamplesToDiscard;
76bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    int64_t mAnchorTimeUs;
77bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    int64_t mNumFramesOutput;
78bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
79bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    enum {
80bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian        NONE,
81bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian        AWAITING_DISABLED,
82bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian        AWAITING_ENABLED
83bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    } mOutputPortSettingsChange;
84bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
85bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    void initPorts();
86bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    status_t initDecoder();
87bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    bool isConfigured() const;
88bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
89bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    DISALLOW_EVIL_CONSTRUCTORS(SoftOpus);
90bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian};
91bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
92bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian}  // namespace android
93bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian
94bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian#endif  // SOFT_OPUS_H_
95