1bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber/*
2bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * Copyright (C) 2011 The Android Open Source Project
3bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber *
4bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * you may not use this file except in compliance with the License.
6bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * You may obtain a copy of the License at
7bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber *
8bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber *
10bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * Unless required by applicable law or agreed to in writing, software
11bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * See the License for the specific language governing permissions and
14bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * limitations under the License.
15bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber */
16bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
17bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#ifndef SOFT_MP3_H_
18bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
19bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#define SOFT_MP3_H_
20bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
21255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/SimpleSoftOMXComponent.h>
22bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
23bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberstruct tPVMP3DecoderExternal;
24bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
25bbba88cb1bdc34705d1477208990a06904c022e7Andreas Hubernamespace android {
26bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
27bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberstruct SoftMP3 : public SimpleSoftOMXComponent {
28bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    SoftMP3(const char *name,
29bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            const OMX_CALLBACKTYPE *callbacks,
30bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_PTR appData,
31bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_COMPONENTTYPE **component);
32bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
33bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberprotected:
34bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual ~SoftMP3();
35bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
36bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE internalGetParameter(
37bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_INDEXTYPE index, OMX_PTR params);
38bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
39bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE internalSetParameter(
40bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_INDEXTYPE index, const OMX_PTR params);
41bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
42bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual void onQueueFilled(OMX_U32 portIndex);
43bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual void onPortFlushCompleted(OMX_U32 portIndex);
44bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual void onPortEnableCompleted(OMX_U32 portIndex, bool enabled);
456fc72b01a3b67903b52f1d33b1ad5c960b5365f1Marco Nelissen    virtual void onReset();
46bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
47bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberprivate:
48bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    enum {
49bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        kNumBuffers = 4,
50a98478bfbcc0f7fb4b164d3dce40ca96df75667dMarco Nelissen        kOutputBufferSize = 4608 * 2,
51a98478bfbcc0f7fb4b164d3dce40ca96df75667dMarco Nelissen        kPVMP3DecoderDelay = 529 // frames
52bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    };
53bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
54bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    tPVMP3DecoderExternal *mConfig;
55bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void *mDecoderBuf;
56bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    int64_t mAnchorTimeUs;
57bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    int64_t mNumFramesOutput;
58bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
59bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    int32_t mNumChannels;
60bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    int32_t mSamplingRate;
61bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
62a98478bfbcc0f7fb4b164d3dce40ca96df75667dMarco Nelissen    bool mIsFirst;
63bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    bool mSignalledError;
64d089c2540e4f0897c166693f4f13e2023241720eMarco Nelissen    bool mSawInputEos;
65d089c2540e4f0897c166693f4f13e2023241720eMarco Nelissen    bool mSignalledOutputEos;
66bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
67bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    enum {
68bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        NONE,
69bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        AWAITING_DISABLED,
70bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        AWAITING_ENABLED
71bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    } mOutputPortSettingsChange;
72bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
73bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void initPorts();
74bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void initDecoder();
75b856ef5c45c9e17a3529b1bbc6e349a2902b3317Robert Shih    void *memsetSafe(OMX_BUFFERHEADERTYPE *outHeader, int c, size_t len);
76bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
77bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(SoftMP3);
78bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber};
79bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
80bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber}  // namespace android
81bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
82bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#endif  // SOFT_MP3_H_
83bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
84bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
85