HLSDemuxer.h (4135B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim:set ts=2 sw=2 sts=2 et cindent: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #if !defined(HLSDemuxer_h_) 8 # define HLSDemuxer_h_ 9 10 # include "MediaCodec.h" 11 # include "MediaDataDemuxer.h" 12 # include "MediaDecoder.h" 13 # include "VideoUtils.h" 14 # include "mozilla/Maybe.h" 15 # include "mozilla/Mutex.h" 16 # include "mozilla/TaskQueue.h" 17 # include "mozilla/java/GeckoHLSDemuxerWrapperWrappers.h" 18 # include "mozilla/java/GeckoHLSSampleWrappers.h" 19 20 namespace mozilla { 21 22 class AbstractThread; 23 class MediaResult; 24 class HLSTrackDemuxer; 25 26 DDLoggedTypeDeclNameAndBase(HLSDemuxer, MediaDataDemuxer); 27 DDLoggedTypeNameAndBase(HLSTrackDemuxer, MediaTrackDemuxer); 28 29 class HLSDemuxer final : public MediaDataDemuxer, 30 public DecoderDoctorLifeLogger<HLSDemuxer> { 31 class HLSDemuxerCallbacksSupport; 32 33 public: 34 explicit HLSDemuxer(int aPlayerId); 35 36 RefPtr<InitPromise> Init() override; 37 38 uint32_t GetNumberTracks(TrackInfo::TrackType aType) const override; 39 40 already_AddRefed<MediaTrackDemuxer> GetTrackDemuxer( 41 TrackInfo::TrackType aType, uint32_t aTrackNumber) override; 42 43 bool IsSeekable() const override; 44 45 UniquePtr<EncryptionInfo> GetCrypto() override; 46 47 bool ShouldComputeStartTime() const override { return true; } 48 49 void NotifyDataArrived() override; 50 51 TaskQueue* GetTaskQueue() const { return mTaskQueue; } 52 void OnInitialized(bool aHasAudio, bool aHasVideo); 53 void OnError(int aErrorCode); 54 55 private: 56 media::TimeUnit GetNextKeyFrameTime(); 57 58 bool OnTaskQueue() const; 59 ~HLSDemuxer(); 60 friend class HLSTrackDemuxer; 61 62 const RefPtr<TaskQueue> mTaskQueue; 63 RefPtr<HLSTrackDemuxer> mAudioDemuxer; 64 RefPtr<HLSTrackDemuxer> mVideoDemuxer; 65 66 MozPromiseHolder<InitPromise> mInitPromise; 67 RefPtr<HLSDemuxerCallbacksSupport> mCallbackSupport; 68 69 java::GeckoHLSDemuxerWrapper::Callbacks::GlobalRef mJavaCallbacks; 70 java::GeckoHLSDemuxerWrapper::GlobalRef mHLSDemuxerWrapper; 71 }; 72 73 class HLSTrackDemuxer : public MediaTrackDemuxer, 74 public DecoderDoctorLifeLogger<HLSTrackDemuxer> { 75 public: 76 HLSTrackDemuxer(HLSDemuxer* aParent, TrackInfo::TrackType aType, 77 UniquePtr<TrackInfo> aTrackInfo); 78 ~HLSTrackDemuxer(); 79 UniquePtr<TrackInfo> GetInfo() const override; 80 81 RefPtr<SeekPromise> Seek(const media::TimeUnit& aTime) override; 82 83 RefPtr<SamplesPromise> GetSamples(int32_t aNumSamples = 1) override; 84 85 void UpdateMediaInfo(int index); 86 87 void Reset() override; 88 89 nsresult GetNextRandomAccessPoint(media::TimeUnit* aTime) override; 90 91 RefPtr<SkipAccessPointPromise> SkipToNextRandomAccessPoint( 92 const media::TimeUnit& aTimeThreshold) override; 93 94 media::TimeIntervals GetBuffered() override; 95 96 void BreakCycles() override; 97 98 bool GetSamplesMayBlock() const override { return false; } 99 100 bool IsTrackValid() const { 101 MutexAutoLock lock(mMutex); 102 return mTrackInfo->IsValid(); 103 } 104 105 private: 106 // Update the timestamp of the next keyframe if there's one. 107 void UpdateNextKeyFrameTime(); 108 109 // Runs on HLSDemuxer's task queue. 110 RefPtr<SeekPromise> DoSeek(const media::TimeUnit& aTime); 111 RefPtr<SamplesPromise> DoGetSamples(int32_t aNumSamples); 112 RefPtr<SkipAccessPointPromise> DoSkipToNextRandomAccessPoint( 113 const media::TimeUnit& aTimeThreshold); 114 115 CryptoSample ExtractCryptoSample( 116 size_t aSampleSize, 117 java::sdk::MediaCodec::CryptoInfo::LocalRef aCryptoInfo); 118 RefPtr<MediaRawData> ConvertToMediaRawData( 119 java::GeckoHLSSample::LocalRef aSample); 120 121 RefPtr<HLSDemuxer> mParent; 122 TrackInfo::TrackType mType; 123 Maybe<media::TimeUnit> mNextKeyframeTime; 124 int32_t mLastFormatIndex = -1; 125 // Queued samples extracted by the demuxer, but not yet returned. 126 RefPtr<MediaRawData> mQueuedSample; 127 128 // Mutex to protect members below across multiple threads. 129 mutable Mutex mMutex MOZ_UNANNOTATED; 130 UniquePtr<TrackInfo> mTrackInfo; 131 }; 132 133 } // namespace mozilla 134 135 #endif