• 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 <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);
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     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 
ready()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);
getAudioStreamType()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();
needsTrailingPadding()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:
CallbackData(AudioOutput * cookie)181             explicit CallbackData(AudioOutput *cookie) {
182                 mData = cookie;
183                 mSwitching = false;
184             }
getOutput()185             AudioOutput *   getOutput() const { return mData; }
setOutput(AudioOutput * newcookie)186             void            setOutput(AudioOutput* newcookie) { mData = newcookie; }
187             // lock/unlock are used by the callback before accessing the payload of this object
lock()188             void            lock() const { mLock.lock(); }
unlock()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.
tryBeginTrackSwitch()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             }
endTrackSwitch()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 
pid()371                 pid_t           pid() const { return mPid; }
372         virtual status_t        dump(int fd, const Vector<String16>& args);
373 
getAudioSessionId()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 
getPlayer()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