MediaPlayer2: move MediaPlayer2 native code to libmediaplayer2
Test: MediaPlayer2 plays
Bug: 63934228
Change-Id: Ibec6d15524510a4d8618d1f684456c6c24b79828
diff --git a/media/libmediaplayer2/nuplayer2/GenericSource2.h b/media/libmediaplayer2/nuplayer2/GenericSource2.h
new file mode 100644
index 0000000..bc13eb7
--- /dev/null
+++ b/media/libmediaplayer2/nuplayer2/GenericSource2.h
@@ -0,0 +1,248 @@
+/*
+ * Copyright 2017 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_SOURCE2_H_
+
+#define GENERIC_SOURCE2_H_
+
+#include "NuPlayer2.h"
+#include "NuPlayer2Source.h"
+
+#include "ATSParser.h"
+
+#include <media/stagefright/MediaBuffer.h>
+#include <mediaplayer2/mediaplayer2.h>
+
+namespace android {
+
+class DecryptHandle;
+struct AnotherPacketSource;
+struct ARTSPController;
+class DataSource;
+class IDataSource;
+class IMediaSource;
+struct MediaHTTPService;
+struct MediaSource;
+class MediaBuffer;
+struct MediaClock;
+struct NuCachedSource2;
+
+struct NuPlayer2::GenericSource2 : public NuPlayer2::Source,
+ public MediaBufferObserver // Modular DRM
+{
+ GenericSource2(const sp<AMessage> ¬ify, bool uidValid, uid_t uid,
+ const sp<MediaClock> &mediaClock);
+
+ status_t setDataSource(
+ const sp<MediaHTTPService> &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,
+ MediaPlayer2SeekMode mode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC) override;
+
+ virtual bool isStreaming() const;
+
+ // Modular DRM
+ virtual void signalBufferReturned(MediaBuffer *buffer);
+
+ virtual status_t prepareDrm(
+ const uint8_t uuid[16],
+ const Vector<uint8_t> &drmSessionId,
+ sp<AMediaCryptoWrapper> *outCrypto);
+
+ virtual status_t releaseDrm();
+
+
+protected:
+ virtual ~GenericSource2();
+
+ 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<MediaHTTPService> 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;
+
+ 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, MediaPlayer2SeekMode 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(
+ MediaBuffer *mbuf,
+ media_track_type trackType);
+
+ void postReadBuffer(media_track_type trackType);
+ void onReadBuffer(const sp<AMessage>& msg);
+ // When |mode| is MediaPlayer2SeekMode::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,
+ MediaPlayer2SeekMode mode = MediaPlayer2SeekMode::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(GenericSource2);
+};
+
+} // namespace android
+
+#endif // GENERIC_SOURCE2_H_