Home | History | Annotate | Download | only in libmediaplayerservice
      1 /*
      2 **
      3 ** Copyright 2008, The Android Open Source Project
      4 **
      5 ** Licensed under the Apache License, Version 2.0 (the "License");
      6 ** you may not use this file except in compliance with the License.
      7 ** You may obtain a copy of the License at
      8 **
      9 **     http://www.apache.org/licenses/LICENSE-2.0
     10 **
     11 ** Unless required by applicable law or agreed to in writing, software
     12 ** distributed under the License is distributed on an "AS IS" BASIS,
     13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 ** See the License for the specific language governing permissions and
     15 ** limitations under the License.
     16 */
     17 
     18 #ifndef ANDROID_MEDIAPLAYERSERVICE_H
     19 #define ANDROID_MEDIAPLAYERSERVICE_H
     20 
     21 #include <arpa/inet.h>
     22 
     23 #include <utils/threads.h>
     24 #include <utils/Errors.h>
     25 #include <utils/KeyedVector.h>
     26 #include <utils/String8.h>
     27 #include <utils/Vector.h>
     28 
     29 #include <media/MediaPlayerInterface.h>
     30 #include <media/Metadata.h>
     31 #include <media/stagefright/foundation/ABase.h>
     32 
     33 #include <android/hardware/media/omx/1.0/IOmx.h>
     34 
     35 #include <system/audio.h>
     36 
     37 namespace android {
     38 
     39 struct AudioPlaybackRate;
     40 class AudioTrack;
     41 struct AVSyncSettings;
     42 class IDataSource;
     43 class IMediaRecorder;
     44 class IMediaMetadataRetriever;
     45 class IOMX;
     46 class IRemoteDisplay;
     47 class IRemoteDisplayClient;
     48 class MediaRecorderClient;
     49 
     50 #define CALLBACK_ANTAGONIZER 0
     51 #if CALLBACK_ANTAGONIZER
     52 class Antagonizer {
     53 public:
     54     Antagonizer(notify_callback_f cb, void* client);
     55     void start() { mActive = true; }
     56     void stop() { mActive = false; }
     57     void kill();
     58 private:
     59     static const int interval;
     60     Antagonizer();
     61     static int callbackThread(void* cookie);
     62     Mutex               mLock;
     63     Condition           mCondition;
     64     bool                mExit;
     65     bool                mActive;
     66     void*               mClient;
     67     notify_callback_f   mCb;
     68 };
     69 #endif
     70 
     71 class MediaPlayerService : public BnMediaPlayerService
     72 {
     73     class Client;
     74     typedef ::android::hardware::media::omx::V1_0::IOmx IOmx;
     75 
     76     class AudioOutput : public MediaPlayerBase::AudioSink
     77     {
     78         class CallbackData;
     79 
     80      public:
     81                                 AudioOutput(audio_session_t sessionId, uid_t uid, int pid,
     82                                         const audio_attributes_t * attr);
     83         virtual                 ~AudioOutput();
     84 
     85         virtual bool            ready() const { return mTrack != 0; }
     86         virtual ssize_t         bufferSize() const;
     87         virtual ssize_t         frameCount() const;
     88         virtual ssize_t         channelCount() const;
     89         virtual ssize_t         frameSize() const;
     90         virtual uint32_t        latency() const;
     91         virtual float           msecsPerFrame() const;
     92         virtual status_t        getPosition(uint32_t *position) const;
     93         virtual status_t        getTimestamp(AudioTimestamp &ts) const;
     94         virtual int64_t         getPlayedOutDurationUs(int64_t nowUs) const;
     95         virtual status_t        getFramesWritten(uint32_t *frameswritten) const;
     96         virtual audio_session_t getSessionId() const;
     97         virtual uint32_t        getSampleRate() const;
     98         virtual int64_t         getBufferDurationInUs() const;
     99 
    100         virtual status_t        open(
    101                 uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask,
    102                 audio_format_t format, int bufferCount,
    103                 AudioCallback cb, void *cookie,
    104                 audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE,
    105                 const audio_offload_info_t *offloadInfo = NULL,
    106                 bool doNotReconnect = false,
    107                 uint32_t suggestedFrameCount = 0);
    108 
    109         virtual status_t        start();
    110         virtual ssize_t         write(const void* buffer, size_t size, bool blocking = true);
    111         virtual void            stop();
    112         virtual void            flush();
    113         virtual void            pause();
    114         virtual void            close();
    115                 void            setAudioStreamType(audio_stream_type_t streamType);
    116         virtual audio_stream_type_t getAudioStreamType() const { return mStreamType; }
    117                 void            setAudioAttributes(const audio_attributes_t * attributes);
    118 
    119                 void            setVolume(float left, float right);
    120         virtual status_t        setPlaybackRate(const AudioPlaybackRate& rate);
    121         virtual status_t        getPlaybackRate(AudioPlaybackRate* rate /* nonnull */);
    122 
    123                 status_t        setAuxEffectSendLevel(float level);
    124                 status_t        attachAuxEffect(int effectId);
    125         virtual status_t        dump(int fd, const Vector<String16>& args) const;
    126 
    127         static bool             isOnEmulator();
    128         static int              getMinBufferCount();
    129                 void            setNextOutput(const sp<AudioOutput>& nextOutput);
    130                 void            switchToNextOutput();
    131         virtual bool            needsTrailingPadding() { return mNextOutput == NULL; }
    132         virtual status_t        setParameters(const String8& keyValuePairs);
    133         virtual String8         getParameters(const String8& keys);
    134 
    135         virtual VolumeShaper::Status applyVolumeShaper(
    136                                         const sp<VolumeShaper::Configuration>& configuration,
    137                                         const sp<VolumeShaper::Operation>& operation) override;
    138         virtual sp<VolumeShaper::State> getVolumeShaperState(int id) override;
    139 
    140     private:
    141         static void             setMinBufferCount();
    142         static void             CallbackWrapper(
    143                 int event, void *me, void *info);
    144                void             deleteRecycledTrack_l();
    145                void             close_l();
    146            status_t             updateTrack();
    147 
    148         sp<AudioTrack>          mTrack;
    149         sp<AudioTrack>          mRecycledTrack;
    150         sp<AudioOutput>         mNextOutput;
    151         AudioCallback           mCallback;
    152         void *                  mCallbackCookie;
    153         CallbackData *          mCallbackData;
    154         audio_stream_type_t     mStreamType;
    155         audio_attributes_t *    mAttributes;
    156         float                   mLeftVolume;
    157         float                   mRightVolume;
    158         AudioPlaybackRate       mPlaybackRate;
    159         uint32_t                mSampleRateHz; // sample rate of the content, as set in open()
    160         float                   mMsecsPerFrame;
    161         size_t                  mFrameSize;
    162         audio_session_t         mSessionId;
    163         uid_t                   mUid;
    164         int                     mPid;
    165         float                   mSendLevel;
    166         int                     mAuxEffectId;
    167         audio_output_flags_t    mFlags;
    168         sp<VolumeHandler>       mVolumeHandler;
    169         mutable Mutex           mLock;
    170 
    171         // static variables below not protected by mutex
    172         static bool             mIsOnEmulator;
    173         static int              mMinBufferCount;  // 12 for emulator; otherwise 4
    174 
    175         // CallbackData is what is passed to the AudioTrack as the "user" data.
    176         // We need to be able to target this to a different Output on the fly,
    177         // so we can't use the Output itself for this.
    178         class CallbackData {
    179             friend AudioOutput;
    180         public:
    181             explicit CallbackData(AudioOutput *cookie) {
    182                 mData = cookie;
    183                 mSwitching = false;
    184             }
    185             AudioOutput *   getOutput() const { return mData; }
    186             void            setOutput(AudioOutput* newcookie) { mData = newcookie; }
    187             // lock/unlock are used by the callback before accessing the payload of this object
    188             void            lock() const { mLock.lock(); }
    189             void            unlock() const { mLock.unlock(); }
    190 
    191             // tryBeginTrackSwitch/endTrackSwitch are used when the CallbackData is handed over
    192             // to the next sink.
    193 
    194             // tryBeginTrackSwitch() returns true only if it obtains the lock.
    195             bool            tryBeginTrackSwitch() {
    196                 LOG_ALWAYS_FATAL_IF(mSwitching, "tryBeginTrackSwitch() already called");
    197                 if (mLock.tryLock() != OK) {
    198                     return false;
    199                 }
    200                 mSwitching = true;
    201                 return true;
    202             }
    203             void            endTrackSwitch() {
    204                 if (mSwitching) {
    205                     mLock.unlock();
    206                 }
    207                 mSwitching = false;
    208             }
    209         private:
    210             AudioOutput *   mData;
    211             mutable Mutex   mLock; // a recursive mutex might make this unnecessary.
    212             bool            mSwitching;
    213             DISALLOW_EVIL_CONSTRUCTORS(CallbackData);
    214         };
    215 
    216     }; // AudioOutput
    217 
    218 
    219 public:
    220     static  void                instantiate();
    221 
    222     // IMediaPlayerService interface
    223     virtual sp<IMediaRecorder>  createMediaRecorder(const String16 &opPackageName);
    224     void    removeMediaRecorderClient(const wp<MediaRecorderClient>& client);
    225     virtual sp<IMediaMetadataRetriever> createMetadataRetriever();
    226 
    227     virtual sp<IMediaPlayer>    create(const sp<IMediaPlayerClient>& client,
    228                                        audio_session_t audioSessionId);
    229 
    230     virtual sp<IMediaCodecList> getCodecList() const;
    231     virtual sp<IOMX>            getOMX();
    232     virtual sp<IHDCP>           makeHDCP(bool createEncryptionModule);
    233 
    234     virtual sp<IRemoteDisplay> listenForRemoteDisplay(const String16 &opPackageName,
    235             const sp<IRemoteDisplayClient>& client, const String8& iface);
    236     virtual status_t            dump(int fd, const Vector<String16>& args);
    237 
    238             void                removeClient(const wp<Client>& client);
    239             bool                hasClient(wp<Client> client);
    240 
    241     enum {
    242         MEDIASERVER_PROCESS_DEATH = 0,
    243         MEDIAEXTRACTOR_PROCESS_DEATH = 1,
    244         MEDIACODEC_PROCESS_DEATH = 2,
    245         AUDIO_PROCESS_DEATH = 3,   // currently no need to track this
    246         CAMERA_PROCESS_DEATH = 4
    247     };
    248 
    249     // Collect info of the codec usage from media player and media recorder
    250     virtual void                addBatteryData(uint32_t params);
    251     // API for the Battery app to pull the data of codecs usage
    252     virtual status_t            pullBatteryData(Parcel* reply);
    253 private:
    254     struct BatteryTracker {
    255         BatteryTracker();
    256         // Collect info of the codec usage from media player and media recorder
    257         void addBatteryData(uint32_t params);
    258         // API for the Battery app to pull the data of codecs usage
    259         status_t pullBatteryData(Parcel* reply);
    260 
    261     private:
    262         // For battery usage tracking purpose
    263         struct BatteryUsageInfo {
    264             // how many streams are being played by one UID
    265             int     refCount;
    266             // a temp variable to store the duration(ms) of audio codecs
    267             // when we start a audio codec, we minus the system time from audioLastTime
    268             // when we pause it, we add the system time back to the audioLastTime
    269             // so after the pause, audioLastTime = pause time - start time
    270             // if multiple audio streams are played (or recorded), then audioLastTime
    271             // = the total playing time of all the streams
    272             int32_t audioLastTime;
    273             // when all the audio streams are being paused, we assign audioLastTime to
    274             // this variable, so this value could be provided to the battery app
    275             // in the next pullBatteryData call
    276             int32_t audioTotalTime;
    277 
    278             int32_t videoLastTime;
    279             int32_t videoTotalTime;
    280         };
    281         KeyedVector<int, BatteryUsageInfo>    mBatteryData;
    282 
    283         enum {
    284             SPEAKER,
    285             OTHER_AUDIO_DEVICE,
    286             SPEAKER_AND_OTHER,
    287             NUM_AUDIO_DEVICES
    288         };
    289 
    290         struct BatteryAudioFlingerUsageInfo {
    291             int refCount; // how many audio streams are being played
    292             int deviceOn[NUM_AUDIO_DEVICES]; // whether the device is currently used
    293             int32_t lastTime[NUM_AUDIO_DEVICES]; // in ms
    294             // totalTime[]: total time of audio output devices usage
    295             int32_t totalTime[NUM_AUDIO_DEVICES]; // in ms
    296         };
    297 
    298         // This varialble is used to record the usage of audio output device
    299         // for battery app
    300         BatteryAudioFlingerUsageInfo mBatteryAudio;
    301 
    302         mutable Mutex mLock;
    303     };
    304     BatteryTracker mBatteryTracker;
    305 
    306     class Client : public BnMediaPlayer {
    307         // IMediaPlayer interface
    308         virtual void            disconnect();
    309         virtual status_t        setVideoSurfaceTexture(
    310                                         const sp<IGraphicBufferProducer>& bufferProducer);
    311         virtual status_t        setBufferingSettings(const BufferingSettings& buffering) override;
    312         virtual status_t        getDefaultBufferingSettings(
    313                                         BufferingSettings* buffering /* nonnull */) override;
    314         virtual status_t        prepareAsync();
    315         virtual status_t        start();
    316         virtual status_t        stop();
    317         virtual status_t        pause();
    318         virtual status_t        isPlaying(bool* state);
    319         virtual status_t        setPlaybackSettings(const AudioPlaybackRate& rate);
    320         virtual status_t        getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */);
    321         virtual status_t        setSyncSettings(const AVSyncSettings& rate, float videoFpsHint);
    322         virtual status_t        getSyncSettings(AVSyncSettings* rate /* nonnull */,
    323                                                 float* videoFps /* nonnull */);
    324         virtual status_t        seekTo(
    325                 int msec,
    326                 MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC);
    327         virtual status_t        getCurrentPosition(int* msec);
    328         virtual status_t        getDuration(int* msec);
    329         virtual status_t        reset();
    330         virtual status_t        setAudioStreamType(audio_stream_type_t type);
    331         virtual status_t        setLooping(int loop);
    332         virtual status_t        setVolume(float leftVolume, float rightVolume);
    333         virtual status_t        invoke(const Parcel& request, Parcel *reply);
    334         virtual status_t        setMetadataFilter(const Parcel& filter);
    335         virtual status_t        getMetadata(bool update_only,
    336                                             bool apply_filter,
    337                                             Parcel *reply);
    338         virtual status_t        setAuxEffectSendLevel(float level);
    339         virtual status_t        attachAuxEffect(int effectId);
    340         virtual status_t        setParameter(int key, const Parcel &request);
    341         virtual status_t        getParameter(int key, Parcel *reply);
    342         virtual status_t        setRetransmitEndpoint(const struct sockaddr_in* endpoint);
    343         virtual status_t        getRetransmitEndpoint(struct sockaddr_in* endpoint);
    344         virtual status_t        setNextPlayer(const sp<IMediaPlayer>& player);
    345 
    346         virtual VolumeShaper::Status applyVolumeShaper(
    347                                         const sp<VolumeShaper::Configuration>& configuration,
    348                                         const sp<VolumeShaper::Operation>& operation) override;
    349         virtual sp<VolumeShaper::State> getVolumeShaperState(int id) override;
    350 
    351         sp<MediaPlayerBase>     createPlayer(player_type playerType);
    352 
    353         virtual status_t        setDataSource(
    354                         const sp<IMediaHTTPService> &httpService,
    355                         const char *url,
    356                         const KeyedVector<String8, String8> *headers);
    357 
    358         virtual status_t        setDataSource(int fd, int64_t offset, int64_t length);
    359 
    360         virtual status_t        setDataSource(const sp<IStreamSource> &source);
    361         virtual status_t        setDataSource(const sp<IDataSource> &source);
    362 
    363 
    364         sp<MediaPlayerBase>     setDataSource_pre(player_type playerType);
    365         void                    setDataSource_post(const sp<MediaPlayerBase>& p,
    366                                                    status_t status);
    367 
    368         static  void            notify(void* cookie, int msg,
    369                                        int ext1, int ext2, const Parcel *obj);
    370 
    371                 pid_t           pid() const { return mPid; }
    372         virtual status_t        dump(int fd, const Vector<String16>& args);
    373 
    374                 audio_session_t getAudioSessionId() { return mAudioSessionId; }
    375         // Modular DRM
    376         virtual status_t prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId);
    377         virtual status_t releaseDrm();
    378 
    379     private:
    380         class ServiceDeathNotifier:
    381                 public IBinder::DeathRecipient,
    382                 public ::android::hardware::hidl_death_recipient
    383         {
    384         public:
    385             ServiceDeathNotifier(
    386                     const sp<IBinder>& service,
    387                     const sp<MediaPlayerBase>& listener,
    388                     int which);
    389             ServiceDeathNotifier(
    390                     const sp<IOmx>& omx,
    391                     const sp<MediaPlayerBase>& listener,
    392                     int which);
    393             virtual ~ServiceDeathNotifier();
    394             virtual void binderDied(const wp<IBinder>& who);
    395             virtual void serviceDied(
    396                     uint64_t cookie,
    397                     const wp<::android::hidl::base::V1_0::IBase>& who);
    398             void unlinkToDeath();
    399 
    400         private:
    401             int mWhich;
    402             sp<IBinder> mService;
    403             sp<IOmx> mOmx;
    404             wp<MediaPlayerBase> mListener;
    405         };
    406 
    407         void clearDeathNotifiers();
    408 
    409         friend class MediaPlayerService;
    410                                 Client( const sp<MediaPlayerService>& service,
    411                                         pid_t pid,
    412                                         int32_t connId,
    413                                         const sp<IMediaPlayerClient>& client,
    414                                         audio_session_t audioSessionId,
    415                                         uid_t uid);
    416                                 Client();
    417         virtual                 ~Client();
    418 
    419                 void            deletePlayer();
    420 
    421         sp<MediaPlayerBase>     getPlayer() const { Mutex::Autolock lock(mLock); return mPlayer; }
    422 
    423 
    424 
    425         // @param type Of the metadata to be tested.
    426         // @return true if the metadata should be dropped according to
    427         //              the filters.
    428         bool shouldDropMetadata(media::Metadata::Type type) const;
    429 
    430         // Add a new element to the set of metadata updated. Noop if
    431         // the element exists already.
    432         // @param type Of the metadata to be recorded.
    433         void addNewMetadataUpdate(media::Metadata::Type type);
    434 
    435         // Disconnect from the currently connected ANativeWindow.
    436         void disconnectNativeWindow();
    437 
    438         status_t setAudioAttributes_l(const Parcel &request);
    439 
    440         mutable     Mutex                       mLock;
    441                     sp<MediaPlayerBase>         mPlayer;
    442                     sp<MediaPlayerService>      mService;
    443                     sp<IMediaPlayerClient>      mClient;
    444                     sp<AudioOutput>             mAudioOutput;
    445                     pid_t                       mPid;
    446                     status_t                    mStatus;
    447                     bool                        mLoop;
    448                     int32_t                     mConnId;
    449                     audio_session_t             mAudioSessionId;
    450                     audio_attributes_t *        mAudioAttributes;
    451                     uid_t                       mUid;
    452                     sp<ANativeWindow>           mConnectedWindow;
    453                     sp<IBinder>                 mConnectedWindowBinder;
    454                     struct sockaddr_in          mRetransmitEndpoint;
    455                     bool                        mRetransmitEndpointValid;
    456                     sp<Client>                  mNextClient;
    457 
    458         // Metadata filters.
    459         media::Metadata::Filter mMetadataAllow;  // protected by mLock
    460         media::Metadata::Filter mMetadataDrop;  // protected by mLock
    461 
    462         // Metadata updated. For each MEDIA_INFO_METADATA_UPDATE
    463         // notification we try to update mMetadataUpdated which is a
    464         // set: no duplicate.
    465         // getMetadata clears this set.
    466         media::Metadata::Filter mMetadataUpdated;  // protected by mLock
    467 
    468         sp<ServiceDeathNotifier> mExtractorDeathListener;
    469         sp<ServiceDeathNotifier> mCodecDeathListener;
    470 #if CALLBACK_ANTAGONIZER
    471                     Antagonizer*                mAntagonizer;
    472 #endif
    473     }; // Client
    474 
    475 // ----------------------------------------------------------------------------
    476 
    477                             MediaPlayerService();
    478     virtual                 ~MediaPlayerService();
    479 
    480     mutable     Mutex                       mLock;
    481                 SortedVector< wp<Client> >  mClients;
    482                 SortedVector< wp<MediaRecorderClient> > mMediaRecorderClients;
    483                 int32_t                     mNextConnId;
    484                 sp<IOMX>                    mOMX;
    485 };
    486 
    487 // ----------------------------------------------------------------------------
    488 
    489 }; // namespace android
    490 
    491 #endif // ANDROID_MEDIAPLAYERSERVICE_H
    492