xref: /aosp_15_r20/frameworks/wilhelm/src/android/android_AudioSfDecoder.h (revision bebae9c0e76121f8312ccb50385c080b3a0b023c)
1*bebae9c0SAndroid Build Coastguard Worker /*
2*bebae9c0SAndroid Build Coastguard Worker  * Copyright (C) 2011 The Android Open Source Project
3*bebae9c0SAndroid Build Coastguard Worker  *
4*bebae9c0SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*bebae9c0SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*bebae9c0SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*bebae9c0SAndroid Build Coastguard Worker  *
8*bebae9c0SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*bebae9c0SAndroid Build Coastguard Worker  *
10*bebae9c0SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*bebae9c0SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*bebae9c0SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*bebae9c0SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*bebae9c0SAndroid Build Coastguard Worker  * limitations under the License.
15*bebae9c0SAndroid Build Coastguard Worker  */
16*bebae9c0SAndroid Build Coastguard Worker 
17*bebae9c0SAndroid Build Coastguard Worker #ifndef AUDIO_SF_DECODER_H_
18*bebae9c0SAndroid Build Coastguard Worker #define AUDIO_SF_DECODER_H_
19*bebae9c0SAndroid Build Coastguard Worker 
20*bebae9c0SAndroid Build Coastguard Worker #include <media/DataSource.h>
21*bebae9c0SAndroid Build Coastguard Worker #include <media/stagefright/MediaSource.h>
22*bebae9c0SAndroid Build Coastguard Worker 
23*bebae9c0SAndroid Build Coastguard Worker #include "android_GenericPlayer.h"
24*bebae9c0SAndroid Build Coastguard Worker 
25*bebae9c0SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------
26*bebae9c0SAndroid Build Coastguard Worker namespace android {
27*bebae9c0SAndroid Build Coastguard Worker 
28*bebae9c0SAndroid Build Coastguard Worker // keep in sync with the entries of kPcmDecodeMetadataKeys[]
29*bebae9c0SAndroid Build Coastguard Worker #define ANDROID_KEY_INDEX_PCMFORMAT_NUMCHANNELS   0
30*bebae9c0SAndroid Build Coastguard Worker #define ANDROID_KEY_INDEX_PCMFORMAT_SAMPLERATE    1
31*bebae9c0SAndroid Build Coastguard Worker #define ANDROID_KEY_INDEX_PCMFORMAT_BITSPERSAMPLE 2
32*bebae9c0SAndroid Build Coastguard Worker #define ANDROID_KEY_INDEX_PCMFORMAT_CONTAINERSIZE 3
33*bebae9c0SAndroid Build Coastguard Worker #define ANDROID_KEY_INDEX_PCMFORMAT_CHANNELMASK   4
34*bebae9c0SAndroid Build Coastguard Worker #define ANDROID_KEY_INDEX_PCMFORMAT_ENDIANNESS    5
35*bebae9c0SAndroid Build Coastguard Worker 
36*bebae9c0SAndroid Build Coastguard Worker // to keep in sync with the ANDROID_KEY_INDEX_PCMFORMAT_* constants in android_AudioSfDecoder.cpp
37*bebae9c0SAndroid Build Coastguard Worker static const char* const kPcmDecodeMetadataKeys[] = {
38*bebae9c0SAndroid Build Coastguard Worker         ANDROID_KEY_PCMFORMAT_NUMCHANNELS, ANDROID_KEY_PCMFORMAT_SAMPLERATE,
39*bebae9c0SAndroid Build Coastguard Worker         ANDROID_KEY_PCMFORMAT_BITSPERSAMPLE, ANDROID_KEY_PCMFORMAT_CONTAINERSIZE,
40*bebae9c0SAndroid Build Coastguard Worker         ANDROID_KEY_PCMFORMAT_CHANNELMASK, ANDROID_KEY_PCMFORMAT_ENDIANNESS };
41*bebae9c0SAndroid Build Coastguard Worker #define NB_PCMMETADATA_KEYS (sizeof(kPcmDecodeMetadataKeys)/sizeof(kPcmDecodeMetadataKeys[0]))
42*bebae9c0SAndroid Build Coastguard Worker 
43*bebae9c0SAndroid Build Coastguard Worker // abstract base class for AudioToCbRenderer and it's subclasses
44*bebae9c0SAndroid Build Coastguard Worker class AudioSfDecoder : public GenericPlayer
45*bebae9c0SAndroid Build Coastguard Worker {
46*bebae9c0SAndroid Build Coastguard Worker public:
47*bebae9c0SAndroid Build Coastguard Worker 
48*bebae9c0SAndroid Build Coastguard Worker     explicit AudioSfDecoder(const AudioPlayback_Parameters* params);
49*bebae9c0SAndroid Build Coastguard Worker     virtual ~AudioSfDecoder();
50*bebae9c0SAndroid Build Coastguard Worker 
51*bebae9c0SAndroid Build Coastguard Worker     virtual void preDestroy();
52*bebae9c0SAndroid Build Coastguard Worker 
53*bebae9c0SAndroid Build Coastguard Worker     // overridden from GenericPlayer
54*bebae9c0SAndroid Build Coastguard Worker     virtual void play();
55*bebae9c0SAndroid Build Coastguard Worker     virtual void getPositionMsec(int* msec); //msec != NULL, ANDROID_UNKNOWN_TIME if unknown
56*bebae9c0SAndroid Build Coastguard Worker 
57*bebae9c0SAndroid Build Coastguard Worker     uint32_t getPcmFormatKeyCount() const;
58*bebae9c0SAndroid Build Coastguard Worker     bool     getPcmFormatKeySize(uint32_t index, uint32_t* pKeySize);
59*bebae9c0SAndroid Build Coastguard Worker     bool     getPcmFormatKeyName(uint32_t index, uint32_t keySize, char* keyName);
60*bebae9c0SAndroid Build Coastguard Worker     bool     getPcmFormatValueSize(uint32_t index, uint32_t* pValueSize);
61*bebae9c0SAndroid Build Coastguard Worker     bool     getPcmFormatKeyValue(uint32_t index, uint32_t size, uint32_t* pValue);
62*bebae9c0SAndroid Build Coastguard Worker 
63*bebae9c0SAndroid Build Coastguard Worker protected:
64*bebae9c0SAndroid Build Coastguard Worker 
65*bebae9c0SAndroid Build Coastguard Worker     enum {
66*bebae9c0SAndroid Build Coastguard Worker         kWhatDecode       = 'deco',
67*bebae9c0SAndroid Build Coastguard Worker         kWhatRender       = 'rend',
68*bebae9c0SAndroid Build Coastguard Worker         kWhatCheckCache   = 'cach'
69*bebae9c0SAndroid Build Coastguard Worker     };
70*bebae9c0SAndroid Build Coastguard Worker 
71*bebae9c0SAndroid Build Coastguard Worker     // Async event handlers (called from the AudioSfDecoder's event loop)
72*bebae9c0SAndroid Build Coastguard Worker     void onDecode();
73*bebae9c0SAndroid Build Coastguard Worker     void onCheckCache(const sp<AMessage> &msg);
74*bebae9c0SAndroid Build Coastguard Worker     virtual void onRender() = 0;
75*bebae9c0SAndroid Build Coastguard Worker 
76*bebae9c0SAndroid Build Coastguard Worker     // Async event handlers (called from GenericPlayer's event loop)
77*bebae9c0SAndroid Build Coastguard Worker     virtual void onPrepare();
78*bebae9c0SAndroid Build Coastguard Worker     virtual void onPlay();
79*bebae9c0SAndroid Build Coastguard Worker     virtual void onPause();
80*bebae9c0SAndroid Build Coastguard Worker     virtual void onSeek(const sp<AMessage> &msg);
81*bebae9c0SAndroid Build Coastguard Worker     virtual void onLoop(const sp<AMessage> &msg);
82*bebae9c0SAndroid Build Coastguard Worker 
83*bebae9c0SAndroid Build Coastguard Worker     // overridden from GenericPlayer
84*bebae9c0SAndroid Build Coastguard Worker     virtual void onNotify(const sp<AMessage> &msg);
85*bebae9c0SAndroid Build Coastguard Worker     virtual void onMessageReceived(const sp<AMessage> &msg);
86*bebae9c0SAndroid Build Coastguard Worker 
87*bebae9c0SAndroid Build Coastguard Worker     // to be implemented by subclasses of AudioSfDecoder to do something with the audio samples
88*bebae9c0SAndroid Build Coastguard Worker     // (called from GenericPlayer's event loop)
89*bebae9c0SAndroid Build Coastguard Worker     virtual void createAudioSink() = 0;
90*bebae9c0SAndroid Build Coastguard Worker     virtual void updateAudioSink() = 0; // called with mBufferSourceLock held
91*bebae9c0SAndroid Build Coastguard Worker     virtual void startAudioSink() = 0;
92*bebae9c0SAndroid Build Coastguard Worker     virtual void pauseAudioSink() = 0;
93*bebae9c0SAndroid Build Coastguard Worker 
94*bebae9c0SAndroid Build Coastguard Worker     sp<DataSource>  mDataSource; // where the raw data comes from
95*bebae9c0SAndroid Build Coastguard Worker     sp<MediaSource> mAudioSource;// the decoder reading from the data source
96*bebae9c0SAndroid Build Coastguard Worker     // used to indicate mAudioSource was successfully started, but wasn't stopped
97*bebae9c0SAndroid Build Coastguard Worker     bool            mAudioSourceStarted;
98*bebae9c0SAndroid Build Coastguard Worker 
99*bebae9c0SAndroid Build Coastguard Worker     // negative values indicate invalid value
100*bebae9c0SAndroid Build Coastguard Worker     int64_t mBitrate;  // in bits/sec
101*bebae9c0SAndroid Build Coastguard Worker     int64_t mDurationUsec; // ANDROID_UNKNOWN_TIME if unknown
102*bebae9c0SAndroid Build Coastguard Worker 
103*bebae9c0SAndroid Build Coastguard Worker     // buffer passed from decoder to renderer
104*bebae9c0SAndroid Build Coastguard Worker     MediaBufferBase *mDecodeBuffer;
105*bebae9c0SAndroid Build Coastguard Worker 
106*bebae9c0SAndroid Build Coastguard Worker     // mutex used to protect the decode buffer, the audio source and its running state
107*bebae9c0SAndroid Build Coastguard Worker     Mutex       mBufferSourceLock;
108*bebae9c0SAndroid Build Coastguard Worker 
109*bebae9c0SAndroid Build Coastguard Worker     void notifyPrepared(status_t prepareRes);
110*bebae9c0SAndroid Build Coastguard Worker 
111*bebae9c0SAndroid Build Coastguard Worker     int64_t mSeekTimeMsec;
112*bebae9c0SAndroid Build Coastguard Worker     int64_t mLastDecodedPositionUs; // ANDROID_UNKNOWN_TIME if unknown
113*bebae9c0SAndroid Build Coastguard Worker     // mutex used for seek flag, seek time (mSeekTimeMsec),
114*bebae9c0SAndroid Build Coastguard Worker     //   and last decoded position (mLastDecodedPositionUs)
115*bebae9c0SAndroid Build Coastguard Worker     Mutex mTimeLock;
116*bebae9c0SAndroid Build Coastguard Worker 
117*bebae9c0SAndroid Build Coastguard Worker     // informations that can be retrieved in the PCM format queries
118*bebae9c0SAndroid Build Coastguard Worker     //  these values are only written in the event loop
119*bebae9c0SAndroid Build Coastguard Worker     uint32_t mPcmFormatValues[NB_PCMMETADATA_KEYS];
120*bebae9c0SAndroid Build Coastguard Worker     // protects mPcmFormatValues
121*bebae9c0SAndroid Build Coastguard Worker     Mutex    mPcmFormatLock;
122*bebae9c0SAndroid Build Coastguard Worker 
advancesPositionInRealTime()123*bebae9c0SAndroid Build Coastguard Worker     virtual bool advancesPositionInRealTime() const { return false; }
124*bebae9c0SAndroid Build Coastguard Worker 
125*bebae9c0SAndroid Build Coastguard Worker private:
126*bebae9c0SAndroid Build Coastguard Worker     bool wantPrefetch();
127*bebae9c0SAndroid Build Coastguard Worker     CacheStatus_t getCacheRemaining(bool *eos);
128*bebae9c0SAndroid Build Coastguard Worker     int64_t getPositionUsec(); // ANDROID_UNKNOWN_TIME if unknown
129*bebae9c0SAndroid Build Coastguard Worker 
130*bebae9c0SAndroid Build Coastguard Worker     // convenience function to update internal state when decoding parameters have changed,
131*bebae9c0SAndroid Build Coastguard Worker     // called with a lock on mBufferSourceLock
132*bebae9c0SAndroid Build Coastguard Worker     void hasNewDecodeParams();
133*bebae9c0SAndroid Build Coastguard Worker 
134*bebae9c0SAndroid Build Coastguard Worker     static bool isSupportedCodec(const char* mime);
135*bebae9c0SAndroid Build Coastguard Worker 
136*bebae9c0SAndroid Build Coastguard Worker private:
137*bebae9c0SAndroid Build Coastguard Worker     DISALLOW_EVIL_CONSTRUCTORS(AudioSfDecoder);
138*bebae9c0SAndroid Build Coastguard Worker 
139*bebae9c0SAndroid Build Coastguard Worker };
140*bebae9c0SAndroid Build Coastguard Worker 
141*bebae9c0SAndroid Build Coastguard Worker } // namespace android
142*bebae9c0SAndroid Build Coastguard Worker 
143*bebae9c0SAndroid Build Coastguard Worker #endif // AUDIO_SF_DECODER_H_
144