| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef GENERIC_SOURCE_H_ |
| |
| #define GENERIC_SOURCE_H_ |
| |
| #include "NuPlayer.h" |
| #include "NuPlayerSource.h" |
| |
| #include "ATSParser.h" |
| |
| #include <media/mediaplayer.h> |
| #include <media/stagefright/MediaBuffer.h> |
| |
| namespace android { |
| |
| class DecryptHandle; |
| struct AnotherPacketSource; |
| struct ARTSPController; |
| class DataSource; |
| class IDataSource; |
| struct IMediaHTTPService; |
| struct MediaSource; |
| class IMediaSource; |
| class MediaBuffer; |
| struct MediaClock; |
| struct NuCachedSource2; |
| |
| struct NuPlayer::GenericSource : public NuPlayer::Source, |
| public MediaBufferObserver // Modular DRM |
| { |
| GenericSource(const sp<AMessage> ¬ify, bool uidValid, uid_t uid, |
| const sp<MediaClock> &mediaClock); |
| |
| status_t setDataSource( |
| const sp<IMediaHTTPService> &httpService, |
| const char *url, |
| const KeyedVector<String8, String8> *headers); |
| |
| status_t setDataSource(int fd, int64_t offset, int64_t length); |
| |
| status_t setDataSource(const sp<DataSource>& dataSource); |
| |
| virtual status_t getBufferingSettings( |
| BufferingSettings* buffering /* nonnull */) override; |
| virtual status_t setBufferingSettings(const BufferingSettings& buffering) override; |
| |
| virtual void prepareAsync(); |
| |
| virtual void start(); |
| virtual void stop(); |
| virtual void pause(); |
| virtual void resume(); |
| |
| virtual void disconnect(); |
| |
| virtual status_t feedMoreTSData(); |
| |
| virtual sp<MetaData> getFileFormatMeta() const; |
| |
| virtual status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit); |
| |
| virtual status_t getDuration(int64_t *durationUs); |
| virtual size_t getTrackCount() const; |
| virtual sp<AMessage> getTrackInfo(size_t trackIndex) const; |
| virtual ssize_t getSelectedTrack(media_track_type type) const; |
| virtual status_t selectTrack(size_t trackIndex, bool select, int64_t timeUs); |
| virtual status_t seekTo( |
| int64_t seekTimeUs, |
| MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC) override; |
| |
| virtual bool isStreaming() const; |
| |
| // Modular DRM |
| virtual void signalBufferReturned(MediaBufferBase *buffer); |
| |
| virtual status_t prepareDrm( |
| const uint8_t uuid[16], const Vector<uint8_t> &drmSessionId, sp<ICrypto> *outCrypto); |
| |
| virtual status_t releaseDrm(); |
| |
| |
| protected: |
| virtual ~GenericSource(); |
| |
| virtual void onMessageReceived(const sp<AMessage> &msg); |
| |
| virtual sp<MetaData> getFormatMeta(bool audio); |
| |
| private: |
| enum { |
| kWhatPrepareAsync, |
| kWhatFetchSubtitleData, |
| kWhatFetchTimedTextData, |
| kWhatSendSubtitleData, |
| kWhatSendGlobalTimedTextData, |
| kWhatSendTimedTextData, |
| kWhatChangeAVSource, |
| kWhatPollBuffering, |
| kWhatSeek, |
| kWhatReadBuffer, |
| kWhatStart, |
| kWhatResume, |
| kWhatSecureDecodersInstantiated, |
| }; |
| |
| struct Track { |
| size_t mIndex; |
| sp<IMediaSource> mSource; |
| sp<AnotherPacketSource> mPackets; |
| }; |
| |
| Vector<sp<IMediaSource> > mSources; |
| Track mAudioTrack; |
| int64_t mAudioTimeUs; |
| int64_t mAudioLastDequeueTimeUs; |
| Track mVideoTrack; |
| int64_t mVideoTimeUs; |
| int64_t mVideoLastDequeueTimeUs; |
| Track mSubtitleTrack; |
| Track mTimedTextTrack; |
| |
| BufferingSettings mBufferingSettings; |
| int32_t mPrevBufferPercentage; |
| int32_t mPollBufferingGeneration; |
| bool mSentPauseOnBuffering; |
| |
| int32_t mAudioDataGeneration; |
| int32_t mVideoDataGeneration; |
| int32_t mFetchSubtitleDataGeneration; |
| int32_t mFetchTimedTextDataGeneration; |
| int64_t mDurationUs; |
| bool mAudioIsVorbis; |
| // Secure codec is required. |
| bool mIsSecure; |
| bool mIsStreaming; |
| bool mUIDValid; |
| uid_t mUID; |
| const sp<MediaClock> mMediaClock; |
| sp<IMediaHTTPService> mHTTPService; |
| AString mUri; |
| KeyedVector<String8, String8> mUriHeaders; |
| int mFd; |
| int64_t mOffset; |
| int64_t mLength; |
| |
| bool mDisconnected; |
| sp<DataSource> mDataSource; |
| sp<NuCachedSource2> mCachedSource; |
| sp<DataSource> mHttpSource; |
| sp<MetaData> mFileMeta; |
| bool mStarted; |
| bool mPreparing; |
| int64_t mBitrate; |
| uint32_t mPendingReadBufferTypes; |
| sp<ABuffer> mGlobalTimedText; |
| |
| mutable Mutex mLock; |
| mutable Mutex mDisconnectLock; // Protects mDataSource, mHttpSource and mDisconnected |
| |
| sp<ALooper> mLooper; |
| |
| void resetDataSource(); |
| |
| status_t initFromDataSource(); |
| int64_t getLastReadPosition(); |
| |
| void notifyPreparedAndCleanup(status_t err); |
| void onSecureDecodersInstantiated(status_t err); |
| void finishPrepareAsync(); |
| status_t startSources(); |
| |
| void onSeek(const sp<AMessage>& msg); |
| status_t doSeek(int64_t seekTimeUs, MediaPlayerSeekMode mode); |
| |
| void onPrepareAsync(); |
| |
| void fetchTextData( |
| uint32_t what, media_track_type type, |
| int32_t curGen, const sp<AnotherPacketSource>& packets, const sp<AMessage>& msg); |
| |
| void sendGlobalTextData( |
| uint32_t what, |
| int32_t curGen, sp<AMessage> msg); |
| |
| void sendTextData( |
| uint32_t what, media_track_type type, |
| int32_t curGen, const sp<AnotherPacketSource>& packets, const sp<AMessage>& msg); |
| |
| sp<ABuffer> mediaBufferToABuffer( |
| MediaBufferBase *mbuf, |
| media_track_type trackType); |
| |
| void postReadBuffer(media_track_type trackType); |
| void onReadBuffer(const sp<AMessage>& msg); |
| // When |mode| is MediaPlayerSeekMode::SEEK_CLOSEST, the buffer read shall |
| // include an item indicating skipping rendering all buffers with timestamp |
| // earlier than |seekTimeUs|. |
| // For other modes, the buffer read will not include the item as above in order |
| // to facilitate fast seek operation. |
| void readBuffer( |
| media_track_type trackType, |
| int64_t seekTimeUs = -1ll, |
| MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC, |
| int64_t *actualTimeUs = NULL, bool formatChange = false); |
| |
| void queueDiscontinuityIfNeeded( |
| bool seeking, bool formatChange, media_track_type trackType, Track *track); |
| |
| void schedulePollBuffering(); |
| void onPollBuffering(); |
| void notifyBufferingUpdate(int32_t percentage); |
| |
| void sendCacheStats(); |
| |
| sp<MetaData> getFormatMeta_l(bool audio); |
| int32_t getDataGeneration(media_track_type type) const; |
| |
| // Modular DRM |
| // The source is DRM protected and is prepared for DRM. |
| bool mIsDrmProtected; |
| // releaseDrm has been processed. |
| bool mIsDrmReleased; |
| Vector<String8> mMimes; |
| |
| status_t checkDrmInfo(); |
| |
| DISALLOW_EVIL_CONSTRUCTORS(GenericSource); |
| }; |
| |
| } // namespace android |
| |
| #endif // GENERIC_SOURCE_H_ |