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