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