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