MediaFormatReader.cpp 73 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392
  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. #ifdef MOZ_EME
  7. #include "mozilla/CDMProxy.h"
  8. #endif
  9. #include "mozilla/ClearOnShutdown.h"
  10. #include "mozilla/dom/HTMLMediaElement.h"
  11. #include "mozilla/Preferences.h"
  12. #include "mozilla/Telemetry.h"
  13. #include "nsContentUtils.h"
  14. #include "nsPrintfCString.h"
  15. #include "nsSize.h"
  16. #include "Layers.h"
  17. #include "MediaData.h"
  18. #include "MediaInfo.h"
  19. #include "MediaFormatReader.h"
  20. #include "MediaPrefs.h"
  21. #include "MediaResource.h"
  22. #include "mozilla/SharedThreadPool.h"
  23. #include "VideoUtils.h"
  24. #include "VideoFrameContainer.h"
  25. #include "mozilla/layers/ShadowLayers.h"
  26. #include <algorithm>
  27. #include <queue>
  28. using namespace mozilla::media;
  29. using mozilla::layers::Image;
  30. using mozilla::layers::LayerManager;
  31. using mozilla::layers::LayersBackend;
  32. // avoid redefined macro warning in unified builds
  33. #undef LOG
  34. #undef LOGV
  35. static mozilla::LazyLogModule sFormatDecoderLog("MediaFormatReader");
  36. mozilla::LazyLogModule gMediaDemuxerLog("MediaDemuxer");
  37. #define LOG(arg, ...) MOZ_LOG(sFormatDecoderLog, mozilla::LogLevel::Debug, ("MediaFormatReader(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
  38. #define LOGV(arg, ...) MOZ_LOG(sFormatDecoderLog, mozilla::LogLevel::Verbose, ("MediaFormatReader(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
  39. namespace mozilla {
  40. /**
  41. * This is a singleton which controls the number of decoders that can be
  42. * created concurrently. Before calling PDMFactory::CreateDecoder(), Alloc()
  43. * must be called to get a token object as a permission to create a decoder.
  44. * The token should stay alive until Shutdown() is called on the decoder.
  45. * The destructor of the token will restore the decoder count so it is available
  46. * for next calls of Alloc().
  47. */
  48. class DecoderAllocPolicy
  49. {
  50. using TrackType = TrackInfo::TrackType;
  51. public:
  52. class Token
  53. {
  54. NS_INLINE_DECL_THREADSAFE_REFCOUNTING(Token)
  55. protected:
  56. virtual ~Token() {}
  57. };
  58. using Promise = MozPromise<RefPtr<Token>, bool, true>;
  59. // Acquire a token for decoder creation. Thread-safe.
  60. auto Alloc() -> RefPtr<Promise>;
  61. // Called by ClearOnShutdown() to delete the singleton.
  62. void operator=(decltype(nullptr));
  63. // Get the singleton for the given track type. Thread-safe.
  64. static DecoderAllocPolicy& Instance(TrackType aTrack);
  65. private:
  66. class AutoDeallocToken;
  67. using PromisePrivate = Promise::Private;
  68. explicit DecoderAllocPolicy(TrackType aTrack);
  69. ~DecoderAllocPolicy();
  70. // Called by the destructor of TokenImpl to restore the decoder limit.
  71. void Dealloc();
  72. // Decrement the decoder limit and resolve a promise if available.
  73. void ResolvePromise(ReentrantMonitorAutoEnter& aProofOfLock);
  74. // Protect access to Instance().
  75. static StaticMutex sMutex;
  76. ReentrantMonitor mMonitor;
  77. // The number of decoders available for creation.
  78. int mDecoderLimit;
  79. // Track type.
  80. const TrackType mTrack;
  81. // Requests to acquire tokens.
  82. std::queue<RefPtr<PromisePrivate>> mPromises;
  83. };
  84. StaticMutex DecoderAllocPolicy::sMutex;
  85. class DecoderAllocPolicy::AutoDeallocToken : public Token
  86. {
  87. public:
  88. explicit AutoDeallocToken(TrackType aTrack)
  89. : mTrack(aTrack)
  90. {}
  91. private:
  92. ~AutoDeallocToken()
  93. {
  94. DecoderAllocPolicy::Instance(mTrack).Dealloc();
  95. }
  96. const TrackType mTrack;
  97. };
  98. DecoderAllocPolicy::DecoderAllocPolicy(TrackType aTrack)
  99. : mMonitor("DecoderAllocPolicy::mMonitor")
  100. , mDecoderLimit(MediaPrefs::MediaDecoderLimit())
  101. , mTrack(aTrack)
  102. {
  103. AbstractThread::MainThread()->Dispatch(NS_NewRunnableFunction([this] () {
  104. ClearOnShutdown(this, ShutdownPhase::ShutdownThreads);
  105. }));
  106. }
  107. DecoderAllocPolicy::~DecoderAllocPolicy()
  108. {
  109. while (!mPromises.empty()) {
  110. RefPtr<PromisePrivate> p = mPromises.front().forget();
  111. mPromises.pop();
  112. p->Reject(true, __func__);
  113. }
  114. }
  115. DecoderAllocPolicy&
  116. DecoderAllocPolicy::Instance(TrackType aTrack)
  117. {
  118. StaticMutexAutoLock lock(sMutex);
  119. if (aTrack == TrackType::kAudioTrack) {
  120. static auto sAudioPolicy = new DecoderAllocPolicy(TrackType::kAudioTrack);
  121. return *sAudioPolicy;
  122. } else {
  123. static auto sVideoPolicy = new DecoderAllocPolicy(TrackType::kVideoTrack);
  124. return *sVideoPolicy;
  125. }
  126. }
  127. auto
  128. DecoderAllocPolicy::Alloc() -> RefPtr<Promise>
  129. {
  130. // No decoder limit set.
  131. if (mDecoderLimit < 0) {
  132. return Promise::CreateAndResolve(new Token(), __func__);
  133. }
  134. ReentrantMonitorAutoEnter mon(mMonitor);
  135. RefPtr<PromisePrivate> p = new PromisePrivate(__func__);
  136. mPromises.push(p);
  137. ResolvePromise(mon);
  138. return p.forget();
  139. }
  140. void
  141. DecoderAllocPolicy::Dealloc()
  142. {
  143. ReentrantMonitorAutoEnter mon(mMonitor);
  144. ++mDecoderLimit;
  145. ResolvePromise(mon);
  146. }
  147. void
  148. DecoderAllocPolicy::ResolvePromise(ReentrantMonitorAutoEnter& aProofOfLock)
  149. {
  150. MOZ_ASSERT(mDecoderLimit >= 0);
  151. if (mDecoderLimit > 0 && !mPromises.empty()) {
  152. --mDecoderLimit;
  153. RefPtr<PromisePrivate> p = mPromises.front().forget();
  154. mPromises.pop();
  155. p->Resolve(new AutoDeallocToken(mTrack), __func__);
  156. }
  157. }
  158. void
  159. DecoderAllocPolicy::operator=(std::nullptr_t)
  160. {
  161. delete this;
  162. }
  163. class MediaFormatReader::DecoderFactory
  164. {
  165. using InitPromise = MediaDataDecoder::InitPromise;
  166. using TokenPromise = DecoderAllocPolicy::Promise;
  167. using Token = DecoderAllocPolicy::Token;
  168. public:
  169. explicit DecoderFactory(MediaFormatReader* aOwner) : mOwner(aOwner) {}
  170. void CreateDecoder(TrackType aTrack);
  171. private:
  172. class Wrapper;
  173. enum class Stage : int8_t
  174. {
  175. None,
  176. WaitForToken,
  177. CreateDecoder,
  178. WaitForInit
  179. };
  180. struct Data
  181. {
  182. Stage mStage = Stage::None;
  183. RefPtr<Token> mToken;
  184. RefPtr<MediaDataDecoder> mDecoder;
  185. MozPromiseRequestHolder<TokenPromise> mTokenPromise;
  186. MozPromiseRequestHolder<InitPromise> mInitPromise;
  187. ~Data()
  188. {
  189. mTokenPromise.DisconnectIfExists();
  190. mInitPromise.DisconnectIfExists();
  191. if (mDecoder) {
  192. mDecoder->Flush();
  193. mDecoder->Shutdown();
  194. }
  195. }
  196. } mAudio, mVideo;
  197. void RunStage(TrackType aTrack);
  198. MediaResult DoCreateDecoder(TrackType aTrack);
  199. void DoInitDecoder(TrackType aTrack);
  200. MediaFormatReader* const mOwner; // guaranteed to be valid by the owner.
  201. };
  202. void
  203. MediaFormatReader::DecoderFactory::CreateDecoder(TrackType aTrack)
  204. {
  205. MOZ_ASSERT(aTrack == TrackInfo::kAudioTrack ||
  206. aTrack == TrackInfo::kVideoTrack);
  207. RunStage(aTrack);
  208. }
  209. class MediaFormatReader::DecoderFactory::Wrapper : public MediaDataDecoder
  210. {
  211. using Token = DecoderAllocPolicy::Token;
  212. public:
  213. Wrapper(already_AddRefed<MediaDataDecoder> aDecoder,
  214. already_AddRefed<Token> aToken)
  215. : mDecoder(aDecoder), mToken(aToken) {}
  216. RefPtr<InitPromise> Init() override { return mDecoder->Init(); }
  217. void Input(MediaRawData* aSample) override { mDecoder->Input(aSample); }
  218. void Flush() override { mDecoder->Flush(); }
  219. void Drain() override { mDecoder->Drain(); }
  220. bool IsHardwareAccelerated(nsACString& aFailureReason) const override
  221. {
  222. return mDecoder->IsHardwareAccelerated(aFailureReason);
  223. }
  224. const char* GetDescriptionName() const override
  225. {
  226. return mDecoder->GetDescriptionName();
  227. }
  228. void SetSeekThreshold(const media::TimeUnit& aTime) override
  229. {
  230. mDecoder->SetSeekThreshold(aTime);
  231. }
  232. void Shutdown() override
  233. {
  234. mDecoder->Shutdown();
  235. mDecoder = nullptr;
  236. mToken = nullptr;
  237. }
  238. private:
  239. RefPtr<MediaDataDecoder> mDecoder;
  240. RefPtr<Token> mToken;
  241. };
  242. void
  243. MediaFormatReader::DecoderFactory::RunStage(TrackType aTrack)
  244. {
  245. auto& data = aTrack == TrackInfo::kAudioTrack ? mAudio : mVideo;
  246. switch (data.mStage) {
  247. case Stage::None: {
  248. MOZ_ASSERT(!data.mToken);
  249. data.mTokenPromise.Begin(DecoderAllocPolicy::Instance(aTrack).Alloc()->Then(
  250. mOwner->OwnerThread(), __func__,
  251. [this, &data, aTrack] (Token* aToken) {
  252. data.mTokenPromise.Complete();
  253. data.mToken = aToken;
  254. data.mStage = Stage::CreateDecoder;
  255. RunStage(aTrack);
  256. },
  257. [&data] () {
  258. data.mTokenPromise.Complete();
  259. data.mStage = Stage::None;
  260. }));
  261. data.mStage = Stage::WaitForToken;
  262. break;
  263. }
  264. case Stage::WaitForToken: {
  265. MOZ_ASSERT(!data.mToken);
  266. MOZ_ASSERT(data.mTokenPromise.Exists());
  267. break;
  268. }
  269. case Stage::CreateDecoder: {
  270. MOZ_ASSERT(data.mToken);
  271. MOZ_ASSERT(!data.mDecoder);
  272. MOZ_ASSERT(!data.mInitPromise.Exists());
  273. MediaResult rv = DoCreateDecoder(aTrack);
  274. if (NS_FAILED(rv)) {
  275. NS_WARNING("Error constructing decoders");
  276. data.mToken = nullptr;
  277. data.mStage = Stage::None;
  278. mOwner->NotifyError(aTrack, rv);
  279. return;
  280. }
  281. data.mDecoder = new Wrapper(data.mDecoder.forget(), data.mToken.forget());
  282. DoInitDecoder(aTrack);
  283. data.mStage = Stage::WaitForInit;
  284. break;
  285. }
  286. case Stage::WaitForInit: {
  287. MOZ_ASSERT(data.mDecoder);
  288. MOZ_ASSERT(data.mInitPromise.Exists());
  289. break;
  290. }
  291. }
  292. }
  293. MediaResult
  294. MediaFormatReader::DecoderFactory::DoCreateDecoder(TrackType aTrack)
  295. {
  296. auto& ownerData = mOwner->GetDecoderData(aTrack);
  297. auto& data = aTrack == TrackInfo::kAudioTrack ? mAudio : mVideo;
  298. auto decoderCreatingError = "error creating audio decoder";
  299. MediaResult result = MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, decoderCreatingError);
  300. if (!mOwner->mPlatform) {
  301. mOwner->mPlatform = new PDMFactory();
  302. if (mOwner->IsEncrypted()) {
  303. #ifdef MOZ_EME
  304. MOZ_ASSERT(mOwner->mCDMProxy);
  305. mOwner->mPlatform->SetCDMProxy(mOwner->mCDMProxy);
  306. #else
  307. return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, "EME not supported");
  308. #endif
  309. }
  310. }
  311. switch (aTrack) {
  312. case TrackInfo::kAudioTrack: {
  313. data.mDecoder = mOwner->mPlatform->CreateDecoder({
  314. ownerData.mInfo
  315. ? *ownerData.mInfo->GetAsAudioInfo()
  316. : *ownerData.mOriginalInfo->GetAsAudioInfo(),
  317. ownerData.mTaskQueue,
  318. ownerData.mCallback.get(),
  319. mOwner->mCrashHelper,
  320. ownerData.mIsBlankDecode,
  321. &result
  322. });
  323. break;
  324. }
  325. case TrackType::kVideoTrack: {
  326. // Decoders use the layers backend to decide if they can use hardware decoding,
  327. // so specify LAYERS_NONE if we want to forcibly disable it.
  328. data.mDecoder = mOwner->mPlatform->CreateDecoder({
  329. ownerData.mInfo
  330. ? *ownerData.mInfo->GetAsVideoInfo()
  331. : *ownerData.mOriginalInfo->GetAsVideoInfo(),
  332. ownerData.mTaskQueue,
  333. ownerData.mCallback.get(),
  334. mOwner->mKnowsCompositor,
  335. mOwner->GetImageContainer(),
  336. mOwner->mCrashHelper,
  337. ownerData.mIsBlankDecode,
  338. &result
  339. });
  340. break;
  341. }
  342. default:
  343. break;
  344. }
  345. if (data.mDecoder) {
  346. result = MediaResult(NS_OK);
  347. return result;
  348. }
  349. ownerData.mDescription = decoderCreatingError;
  350. return result;
  351. }
  352. void
  353. MediaFormatReader::DecoderFactory::DoInitDecoder(TrackType aTrack)
  354. {
  355. auto& ownerData = mOwner->GetDecoderData(aTrack);
  356. auto& data = aTrack == TrackInfo::kAudioTrack ? mAudio : mVideo;
  357. data.mInitPromise.Begin(data.mDecoder->Init()->Then(
  358. mOwner->OwnerThread(), __func__,
  359. [this, &data, &ownerData] (TrackType aTrack) {
  360. data.mInitPromise.Complete();
  361. data.mStage = Stage::None;
  362. MonitorAutoLock mon(ownerData.mMonitor);
  363. ownerData.mDecoder = data.mDecoder.forget();
  364. ownerData.mDescription = ownerData.mDecoder->GetDescriptionName();
  365. mOwner->SetVideoDecodeThreshold();
  366. mOwner->ScheduleUpdate(aTrack);
  367. },
  368. [this, &data, aTrack] (MediaResult aError) {
  369. data.mInitPromise.Complete();
  370. data.mStage = Stage::None;
  371. data.mDecoder->Shutdown();
  372. data.mDecoder = nullptr;
  373. mOwner->NotifyError(aTrack, aError);
  374. }));
  375. }
  376. static const char*
  377. TrackTypeToStr(TrackInfo::TrackType aTrack)
  378. {
  379. MOZ_ASSERT(aTrack == TrackInfo::kAudioTrack ||
  380. aTrack == TrackInfo::kVideoTrack ||
  381. aTrack == TrackInfo::kTextTrack);
  382. switch (aTrack) {
  383. case TrackInfo::kAudioTrack:
  384. return "Audio";
  385. case TrackInfo::kVideoTrack:
  386. return "Video";
  387. case TrackInfo::kTextTrack:
  388. return "Text";
  389. default:
  390. return "Unknown";
  391. }
  392. }
  393. MediaFormatReader::MediaFormatReader(AbstractMediaDecoder* aDecoder,
  394. MediaDataDemuxer* aDemuxer,
  395. VideoFrameContainer* aVideoFrameContainer)
  396. : MediaDecoderReader(aDecoder)
  397. , mAudio(this, MediaData::AUDIO_DATA,
  398. Preferences::GetUint("media.audio-max-decode-error", 3))
  399. , mVideo(this, MediaData::VIDEO_DATA,
  400. Preferences::GetUint("media.video-max-decode-error", 2))
  401. , mDemuxer(aDemuxer)
  402. , mDemuxerInitDone(false)
  403. , mLastReportedNumDecodedFrames(0)
  404. , mPreviousDecodedKeyframeTime_us(sNoPreviousDecodedKeyframe)
  405. , mInitDone(false)
  406. , mTrackDemuxersMayBlock(false)
  407. , mDemuxOnly(false)
  408. , mSeekScheduled(false)
  409. , mVideoFrameContainer(aVideoFrameContainer)
  410. , mDecoderFactory(new DecoderFactory(this))
  411. {
  412. MOZ_ASSERT(aDemuxer);
  413. MOZ_COUNT_CTOR(MediaFormatReader);
  414. if (aDecoder && aDecoder->CompositorUpdatedEvent()) {
  415. mCompositorUpdatedListener =
  416. aDecoder->CompositorUpdatedEvent()->Connect(
  417. mTaskQueue, this, &MediaFormatReader::NotifyCompositorUpdated);
  418. }
  419. }
  420. MediaFormatReader::~MediaFormatReader()
  421. {
  422. MOZ_COUNT_DTOR(MediaFormatReader);
  423. }
  424. RefPtr<ShutdownPromise>
  425. MediaFormatReader::Shutdown()
  426. {
  427. MOZ_ASSERT(OnTaskQueue());
  428. mDecoderFactory = nullptr;
  429. mDemuxerInitRequest.DisconnectIfExists();
  430. mMetadataPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
  431. mSeekPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
  432. mSkipRequest.DisconnectIfExists();
  433. if (mAudio.mDecoder) {
  434. Reset(TrackInfo::kAudioTrack);
  435. if (mAudio.HasPromise()) {
  436. mAudio.RejectPromise(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
  437. }
  438. mAudio.ShutdownDecoder();
  439. }
  440. if (mAudio.mTrackDemuxer) {
  441. mAudio.ResetDemuxer();
  442. mAudio.mTrackDemuxer->BreakCycles();
  443. mAudio.mTrackDemuxer = nullptr;
  444. }
  445. if (mAudio.mTaskQueue) {
  446. mAudio.mTaskQueue->BeginShutdown();
  447. mAudio.mTaskQueue->AwaitShutdownAndIdle();
  448. mAudio.mTaskQueue = nullptr;
  449. }
  450. MOZ_ASSERT(!mAudio.HasPromise());
  451. if (mVideo.mDecoder) {
  452. Reset(TrackInfo::kVideoTrack);
  453. if (mVideo.HasPromise()) {
  454. mVideo.RejectPromise(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
  455. }
  456. mVideo.ShutdownDecoder();
  457. }
  458. if (mVideo.mTrackDemuxer) {
  459. mVideo.ResetDemuxer();
  460. mVideo.mTrackDemuxer->BreakCycles();
  461. mVideo.mTrackDemuxer = nullptr;
  462. }
  463. if (mVideo.mTaskQueue) {
  464. mVideo.mTaskQueue->BeginShutdown();
  465. mVideo.mTaskQueue->AwaitShutdownAndIdle();
  466. mVideo.mTaskQueue = nullptr;
  467. }
  468. MOZ_ASSERT(!mVideo.HasPromise());
  469. mDemuxer = nullptr;
  470. mPlatform = nullptr;
  471. mVideoFrameContainer = nullptr;
  472. mCompositorUpdatedListener.DisconnectIfExists();
  473. return MediaDecoderReader::Shutdown();
  474. }
  475. void
  476. MediaFormatReader::InitLayersBackendType()
  477. {
  478. // Extract the layer manager backend type so that platform decoders
  479. // can determine whether it's worthwhile using hardware accelerated
  480. // video decoding.
  481. if (!mDecoder) {
  482. return;
  483. }
  484. MediaDecoderOwner* owner = mDecoder->GetOwner();
  485. if (!owner) {
  486. NS_WARNING("MediaFormatReader without a decoder owner, can't get HWAccel");
  487. return;
  488. }
  489. dom::HTMLMediaElement* element = owner->GetMediaElement();
  490. NS_ENSURE_TRUE_VOID(element);
  491. RefPtr<LayerManager> layerManager =
  492. nsContentUtils::LayerManagerForDocument(element->OwnerDoc());
  493. NS_ENSURE_TRUE_VOID(layerManager);
  494. mKnowsCompositor = layerManager->AsShadowForwarder();
  495. }
  496. nsresult
  497. MediaFormatReader::InitInternal()
  498. {
  499. MOZ_ASSERT(NS_IsMainThread(), "Must be on main thread.");
  500. InitLayersBackendType();
  501. mAudio.mTaskQueue =
  502. new TaskQueue(GetMediaThreadPool(MediaThreadType::PLATFORM_DECODER));
  503. mVideo.mTaskQueue =
  504. new TaskQueue(GetMediaThreadPool(MediaThreadType::PLATFORM_DECODER));
  505. // Note: GMPCrashHelper must be created on main thread, as it may use
  506. // weak references, which aren't threadsafe.
  507. mCrashHelper = mDecoder->GetCrashHelper();
  508. return NS_OK;
  509. }
  510. #ifdef MOZ_EME
  511. class DispatchKeyNeededEvent : public Runnable {
  512. public:
  513. DispatchKeyNeededEvent(AbstractMediaDecoder* aDecoder,
  514. nsTArray<uint8_t>& aInitData,
  515. const nsString& aInitDataType)
  516. : mDecoder(aDecoder)
  517. , mInitData(aInitData)
  518. , mInitDataType(aInitDataType)
  519. {
  520. }
  521. NS_IMETHOD Run() override {
  522. // Note: Null check the owner, as the decoder could have been shutdown
  523. // since this event was dispatched.
  524. MediaDecoderOwner* owner = mDecoder->GetOwner();
  525. if (owner) {
  526. owner->DispatchEncrypted(mInitData, mInitDataType);
  527. }
  528. mDecoder = nullptr;
  529. return NS_OK;
  530. }
  531. private:
  532. RefPtr<AbstractMediaDecoder> mDecoder;
  533. nsTArray<uint8_t> mInitData;
  534. nsString mInitDataType;
  535. };
  536. void
  537. MediaFormatReader::SetCDMProxy(CDMProxy* aProxy)
  538. {
  539. RefPtr<CDMProxy> proxy = aProxy;
  540. RefPtr<MediaFormatReader> self = this;
  541. nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([=] () {
  542. MOZ_ASSERT(self->OnTaskQueue());
  543. self->mCDMProxy = proxy;
  544. });
  545. OwnerThread()->Dispatch(r.forget());
  546. }
  547. #endif // MOZ_EME
  548. bool
  549. MediaFormatReader::IsWaitingOnCDMResource() {
  550. MOZ_ASSERT(OnTaskQueue());
  551. #ifdef MOZ_EME
  552. return IsEncrypted() && !mCDMProxy;
  553. #else
  554. return false;
  555. #endif
  556. }
  557. RefPtr<MediaDecoderReader::MetadataPromise>
  558. MediaFormatReader::AsyncReadMetadata()
  559. {
  560. MOZ_ASSERT(OnTaskQueue());
  561. MOZ_DIAGNOSTIC_ASSERT(mMetadataPromise.IsEmpty());
  562. if (mInitDone) {
  563. // We are returning from dormant.
  564. RefPtr<MetadataHolder> metadata = new MetadataHolder();
  565. metadata->mInfo = mInfo;
  566. metadata->mTags = nullptr;
  567. return MetadataPromise::CreateAndResolve(metadata, __func__);
  568. }
  569. RefPtr<MetadataPromise> p = mMetadataPromise.Ensure(__func__);
  570. mDemuxerInitRequest.Begin(mDemuxer->Init()
  571. ->Then(OwnerThread(), __func__, this,
  572. &MediaFormatReader::OnDemuxerInitDone,
  573. &MediaFormatReader::OnDemuxerInitFailed));
  574. return p;
  575. }
  576. void
  577. MediaFormatReader::OnDemuxerInitDone(nsresult)
  578. {
  579. MOZ_ASSERT(OnTaskQueue());
  580. mDemuxerInitRequest.Complete();
  581. mDemuxerInitDone = true;
  582. UniquePtr<MetadataTags> tags(MakeUnique<MetadataTags>());
  583. RefPtr<PDMFactory> platform;
  584. if (!IsWaitingOnCDMResource()) {
  585. platform = new PDMFactory();
  586. }
  587. // To decode, we need valid video and a place to put it.
  588. bool videoActive = !!mDemuxer->GetNumberTracks(TrackInfo::kVideoTrack) &&
  589. GetImageContainer();
  590. if (videoActive) {
  591. // We currently only handle the first video track.
  592. mVideo.mTrackDemuxer = mDemuxer->GetTrackDemuxer(TrackInfo::kVideoTrack, 0);
  593. if (!mVideo.mTrackDemuxer) {
  594. mMetadataPromise.Reject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
  595. return;
  596. }
  597. UniquePtr<TrackInfo> videoInfo = mVideo.mTrackDemuxer->GetInfo();
  598. videoActive = videoInfo && videoInfo->IsValid();
  599. if (videoActive) {
  600. if (platform && !platform->SupportsMimeType(videoInfo->mMimeType, nullptr)) {
  601. // We have no decoder for this track. Error.
  602. mMetadataPromise.Reject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
  603. return;
  604. }
  605. mInfo.mVideo = *videoInfo->GetAsVideoInfo();
  606. for (const MetadataTag& tag : videoInfo->mTags) {
  607. tags->Put(tag.mKey, tag.mValue);
  608. }
  609. mVideo.mOriginalInfo = Move(videoInfo);
  610. mVideo.mCallback = new DecoderCallback(this, TrackInfo::kVideoTrack);
  611. mVideo.mTimeRanges = mVideo.mTrackDemuxer->GetBuffered();
  612. mTrackDemuxersMayBlock |= mVideo.mTrackDemuxer->GetSamplesMayBlock();
  613. } else {
  614. mVideo.mTrackDemuxer->BreakCycles();
  615. mVideo.mTrackDemuxer = nullptr;
  616. }
  617. }
  618. bool audioActive = !!mDemuxer->GetNumberTracks(TrackInfo::kAudioTrack);
  619. if (audioActive) {
  620. mAudio.mTrackDemuxer = mDemuxer->GetTrackDemuxer(TrackInfo::kAudioTrack, 0);
  621. if (!mAudio.mTrackDemuxer) {
  622. mMetadataPromise.Reject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
  623. return;
  624. }
  625. UniquePtr<TrackInfo> audioInfo = mAudio.mTrackDemuxer->GetInfo();
  626. // We actively ignore audio tracks that we know we can't play.
  627. audioActive = audioInfo && audioInfo->IsValid() &&
  628. (!platform ||
  629. platform->SupportsMimeType(audioInfo->mMimeType, nullptr));
  630. if (audioActive) {
  631. mInfo.mAudio = *audioInfo->GetAsAudioInfo();
  632. for (const MetadataTag& tag : audioInfo->mTags) {
  633. tags->Put(tag.mKey, tag.mValue);
  634. }
  635. mAudio.mOriginalInfo = Move(audioInfo);
  636. mAudio.mCallback = new DecoderCallback(this, TrackInfo::kAudioTrack);
  637. mAudio.mTimeRanges = mAudio.mTrackDemuxer->GetBuffered();
  638. mTrackDemuxersMayBlock |= mAudio.mTrackDemuxer->GetSamplesMayBlock();
  639. } else {
  640. mAudio.mTrackDemuxer->BreakCycles();
  641. mAudio.mTrackDemuxer = nullptr;
  642. }
  643. }
  644. UniquePtr<EncryptionInfo> crypto = mDemuxer->GetCrypto();
  645. if (mDecoder && crypto && crypto->IsEncrypted()) {
  646. #ifdef MOZ_EME
  647. // Try and dispatch 'encrypted'. Won't go if ready state still HAVE_NOTHING.
  648. for (uint32_t i = 0; i < crypto->mInitDatas.Length(); i++) {
  649. NS_DispatchToMainThread(
  650. new DispatchKeyNeededEvent(mDecoder, crypto->mInitDatas[i].mInitData, crypto->mInitDatas[i].mType));
  651. }
  652. #endif
  653. mInfo.mCrypto = *crypto;
  654. }
  655. int64_t videoDuration = HasVideo() ? mInfo.mVideo.mDuration : 0;
  656. int64_t audioDuration = HasAudio() ? mInfo.mAudio.mDuration : 0;
  657. int64_t duration = std::max(videoDuration, audioDuration);
  658. if (duration != -1) {
  659. mInfo.mMetadataDuration = Some(TimeUnit::FromMicroseconds(duration));
  660. }
  661. mInfo.mMediaSeekable = mDemuxer->IsSeekable();
  662. mInfo.mMediaSeekableOnlyInBufferedRanges =
  663. mDemuxer->IsSeekableOnlyInBufferedRanges();
  664. if (!videoActive && !audioActive) {
  665. mMetadataPromise.Reject(NS_ERROR_DOM_MEDIA_METADATA_ERR, __func__);
  666. return;
  667. }
  668. mInitDone = true;
  669. RefPtr<MetadataHolder> metadata = new MetadataHolder();
  670. metadata->mInfo = mInfo;
  671. metadata->mTags = tags->Count() ? tags.release() : nullptr;
  672. mMetadataPromise.Resolve(metadata, __func__);
  673. }
  674. bool
  675. MediaFormatReader::IsEncrypted() const
  676. {
  677. return (HasAudio() && mInfo.mAudio.mCrypto.mValid) ||
  678. (HasVideo() && mInfo.mVideo.mCrypto.mValid);
  679. }
  680. void
  681. MediaFormatReader::OnDemuxerInitFailed(const MediaResult& aError)
  682. {
  683. mDemuxerInitRequest.Complete();
  684. mMetadataPromise.Reject(aError, __func__);
  685. }
  686. void
  687. MediaFormatReader::ReadUpdatedMetadata(MediaInfo* aInfo)
  688. {
  689. *aInfo = mInfo;
  690. }
  691. MediaFormatReader::DecoderData&
  692. MediaFormatReader::GetDecoderData(TrackType aTrack)
  693. {
  694. MOZ_ASSERT(aTrack == TrackInfo::kAudioTrack ||
  695. aTrack == TrackInfo::kVideoTrack);
  696. if (aTrack == TrackInfo::kAudioTrack) {
  697. return mAudio;
  698. }
  699. return mVideo;
  700. }
  701. bool
  702. MediaFormatReader::ShouldSkip(bool aSkipToNextKeyframe, media::TimeUnit aTimeThreshold)
  703. {
  704. MOZ_ASSERT(HasVideo());
  705. media::TimeUnit nextKeyframe;
  706. nsresult rv = mVideo.mTrackDemuxer->GetNextRandomAccessPoint(&nextKeyframe);
  707. if (NS_FAILED(rv)) {
  708. return aSkipToNextKeyframe;
  709. }
  710. return (nextKeyframe < aTimeThreshold ||
  711. (mVideo.mTimeThreshold &&
  712. mVideo.mTimeThreshold.ref().EndTime() < aTimeThreshold)) &&
  713. nextKeyframe.ToMicroseconds() >= 0 && !nextKeyframe.IsInfinite();
  714. }
  715. RefPtr<MediaDecoderReader::MediaDataPromise>
  716. MediaFormatReader::RequestVideoData(bool aSkipToNextKeyframe,
  717. int64_t aTimeThreshold)
  718. {
  719. MOZ_ASSERT(OnTaskQueue());
  720. MOZ_DIAGNOSTIC_ASSERT(mSeekPromise.IsEmpty(), "No sample requests allowed while seeking");
  721. MOZ_DIAGNOSTIC_ASSERT(!mVideo.HasPromise(), "No duplicate sample requests");
  722. MOZ_DIAGNOSTIC_ASSERT(!mVideo.mSeekRequest.Exists() ||
  723. mVideo.mTimeThreshold.isSome());
  724. MOZ_DIAGNOSTIC_ASSERT(!IsSeeking(), "called mid-seek");
  725. LOGV("RequestVideoData(%d, %lld)", aSkipToNextKeyframe, aTimeThreshold);
  726. if (!HasVideo()) {
  727. LOG("called with no video track");
  728. return MediaDataPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
  729. }
  730. if (IsSeeking()) {
  731. LOG("called mid-seek. Rejecting.");
  732. return MediaDataPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
  733. }
  734. if (mShutdown) {
  735. NS_WARNING("RequestVideoData on shutdown MediaFormatReader!");
  736. return MediaDataPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
  737. }
  738. media::TimeUnit timeThreshold{media::TimeUnit::FromMicroseconds(aTimeThreshold)};
  739. // Ensure we have no pending seek going as ShouldSkip could return out of date
  740. // information.
  741. if (!mVideo.HasInternalSeekPending() &&
  742. ShouldSkip(aSkipToNextKeyframe, timeThreshold)) {
  743. RefPtr<MediaDataPromise> p = mVideo.EnsurePromise(__func__);
  744. SkipVideoDemuxToNextKeyFrame(timeThreshold);
  745. return p;
  746. }
  747. RefPtr<MediaDataPromise> p = mVideo.EnsurePromise(__func__);
  748. ScheduleUpdate(TrackInfo::kVideoTrack);
  749. return p;
  750. }
  751. void
  752. MediaFormatReader::OnDemuxFailed(TrackType aTrack, const MediaResult& aError)
  753. {
  754. MOZ_ASSERT(OnTaskQueue());
  755. LOG("Failed to demux %s, failure:%u",
  756. aTrack == TrackType::kVideoTrack ? "video" : "audio", aError.Code());
  757. auto& decoder = GetDecoderData(aTrack);
  758. decoder.mDemuxRequest.Complete();
  759. switch (aError.Code()) {
  760. case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
  761. if (!decoder.mWaitingForData) {
  762. decoder.mNeedDraining = true;
  763. }
  764. NotifyEndOfStream(aTrack);
  765. break;
  766. case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
  767. if (!decoder.mWaitingForData) {
  768. decoder.mNeedDraining = true;
  769. }
  770. NotifyWaitingForData(aTrack);
  771. break;
  772. case NS_ERROR_DOM_MEDIA_CANCELED:
  773. if (decoder.HasPromise()) {
  774. decoder.RejectPromise(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
  775. }
  776. break;
  777. default:
  778. NotifyError(aTrack, aError);
  779. break;
  780. }
  781. }
  782. void
  783. MediaFormatReader::DoDemuxVideo()
  784. {
  785. mVideo.mDemuxRequest.Begin(mVideo.mTrackDemuxer->GetSamples(1)
  786. ->Then(OwnerThread(), __func__, this,
  787. &MediaFormatReader::OnVideoDemuxCompleted,
  788. &MediaFormatReader::OnVideoDemuxFailed));
  789. }
  790. void
  791. MediaFormatReader::OnVideoDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples)
  792. {
  793. LOGV("%d video samples demuxed (sid:%d)",
  794. aSamples->mSamples.Length(),
  795. aSamples->mSamples[0]->mTrackInfo ? aSamples->mSamples[0]->mTrackInfo->GetID() : 0);
  796. mVideo.mDemuxRequest.Complete();
  797. mVideo.mQueuedSamples.AppendElements(aSamples->mSamples);
  798. ScheduleUpdate(TrackInfo::kVideoTrack);
  799. }
  800. RefPtr<MediaDecoderReader::MediaDataPromise>
  801. MediaFormatReader::RequestAudioData()
  802. {
  803. MOZ_ASSERT(OnTaskQueue());
  804. MOZ_DIAGNOSTIC_ASSERT(!mAudio.HasPromise(), "No duplicate sample requests");
  805. MOZ_DIAGNOSTIC_ASSERT(IsVideoSeeking() || mSeekPromise.IsEmpty(),
  806. "No sample requests allowed while seeking");
  807. MOZ_DIAGNOSTIC_ASSERT(IsVideoSeeking() ||
  808. !mAudio.mSeekRequest.Exists() ||
  809. mAudio.mTimeThreshold.isSome());
  810. MOZ_DIAGNOSTIC_ASSERT(IsVideoSeeking() || !IsSeeking(), "called mid-seek");
  811. LOGV("");
  812. if (!HasAudio()) {
  813. LOG("called with no audio track");
  814. return MediaDataPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
  815. }
  816. if (IsSeeking()) {
  817. LOG("called mid-seek. Rejecting.");
  818. return MediaDataPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
  819. }
  820. if (mShutdown) {
  821. NS_WARNING("RequestAudioData on shutdown MediaFormatReader!");
  822. return MediaDataPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
  823. }
  824. RefPtr<MediaDataPromise> p = mAudio.EnsurePromise(__func__);
  825. ScheduleUpdate(TrackInfo::kAudioTrack);
  826. return p;
  827. }
  828. void
  829. MediaFormatReader::DoDemuxAudio()
  830. {
  831. mAudio.mDemuxRequest.Begin(mAudio.mTrackDemuxer->GetSamples(1)
  832. ->Then(OwnerThread(), __func__, this,
  833. &MediaFormatReader::OnAudioDemuxCompleted,
  834. &MediaFormatReader::OnAudioDemuxFailed));
  835. }
  836. void
  837. MediaFormatReader::OnAudioDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples)
  838. {
  839. LOGV("%d audio samples demuxed (sid:%d)",
  840. aSamples->mSamples.Length(),
  841. aSamples->mSamples[0]->mTrackInfo ? aSamples->mSamples[0]->mTrackInfo->GetID() : 0);
  842. mAudio.mDemuxRequest.Complete();
  843. mAudio.mQueuedSamples.AppendElements(aSamples->mSamples);
  844. ScheduleUpdate(TrackInfo::kAudioTrack);
  845. }
  846. void
  847. MediaFormatReader::NotifyNewOutput(TrackType aTrack, MediaData* aSample)
  848. {
  849. MOZ_ASSERT(OnTaskQueue());
  850. LOGV("Received new %s sample time:%lld duration:%lld",
  851. TrackTypeToStr(aTrack), aSample->mTime, aSample->mDuration);
  852. auto& decoder = GetDecoderData(aTrack);
  853. if (!decoder.mOutputRequested) {
  854. LOG("MediaFormatReader produced output while flushing, discarding.");
  855. return;
  856. }
  857. decoder.mOutput.AppendElement(aSample);
  858. decoder.mNumSamplesOutput++;
  859. decoder.mNumOfConsecutiveError = 0;
  860. ScheduleUpdate(aTrack);
  861. }
  862. void
  863. MediaFormatReader::NotifyInputExhausted(TrackType aTrack)
  864. {
  865. MOZ_ASSERT(OnTaskQueue());
  866. LOGV("Decoder has requested more %s data", TrackTypeToStr(aTrack));
  867. auto& decoder = GetDecoderData(aTrack);
  868. decoder.mDecodePending = false;
  869. ScheduleUpdate(aTrack);
  870. }
  871. void
  872. MediaFormatReader::NotifyDrainComplete(TrackType aTrack)
  873. {
  874. MOZ_ASSERT(OnTaskQueue());
  875. auto& decoder = GetDecoderData(aTrack);
  876. LOG("%s", TrackTypeToStr(aTrack));
  877. if (!decoder.mOutputRequested) {
  878. LOG("MediaFormatReader called DrainComplete() before flushing, ignoring.");
  879. return;
  880. }
  881. decoder.mDrainComplete = true;
  882. ScheduleUpdate(aTrack);
  883. }
  884. void
  885. MediaFormatReader::NotifyError(TrackType aTrack, const MediaResult& aError)
  886. {
  887. MOZ_ASSERT(OnTaskQueue());
  888. NS_WARNING(aError.Description().get());
  889. LOGV("%s Decoding error", TrackTypeToStr(aTrack));
  890. auto& decoder = GetDecoderData(aTrack);
  891. decoder.mError = decoder.HasFatalError() ? decoder.mError : Some(aError);
  892. ScheduleUpdate(aTrack);
  893. }
  894. void
  895. MediaFormatReader::NotifyWaitingForData(TrackType aTrack)
  896. {
  897. MOZ_ASSERT(OnTaskQueue());
  898. auto& decoder = GetDecoderData(aTrack);
  899. decoder.mWaitingForData = true;
  900. if (decoder.mTimeThreshold) {
  901. decoder.mTimeThreshold.ref().mWaiting = true;
  902. }
  903. ScheduleUpdate(aTrack);
  904. }
  905. void
  906. MediaFormatReader::NotifyWaitingForKey(TrackType aTrack)
  907. {
  908. MOZ_ASSERT(OnTaskQueue());
  909. auto& decoder = GetDecoderData(aTrack);
  910. if (mDecoder) {
  911. mDecoder->NotifyWaitingForKey();
  912. }
  913. if (!decoder.mDecodePending) {
  914. LOGV("WaitingForKey received while no pending decode. Ignoring");
  915. }
  916. decoder.mWaitingForKey = true;
  917. ScheduleUpdate(aTrack);
  918. }
  919. void
  920. MediaFormatReader::NotifyEndOfStream(TrackType aTrack)
  921. {
  922. MOZ_ASSERT(OnTaskQueue());
  923. auto& decoder = GetDecoderData(aTrack);
  924. decoder.mDemuxEOS = true;
  925. ScheduleUpdate(aTrack);
  926. }
  927. bool
  928. MediaFormatReader::NeedInput(DecoderData& aDecoder)
  929. {
  930. // To account for H.264 streams which may require a longer
  931. // run of input than we input, decoders fire an "input exhausted" callback.
  932. // The decoder will not be fed a new raw sample until InputExhausted
  933. // has been called.
  934. return
  935. (aDecoder.HasPromise() || aDecoder.mTimeThreshold.isSome()) &&
  936. !aDecoder.HasPendingDrain() &&
  937. !aDecoder.HasFatalError() &&
  938. !aDecoder.mDemuxRequest.Exists() &&
  939. !aDecoder.mOutput.Length() &&
  940. !aDecoder.HasInternalSeekPending() &&
  941. !aDecoder.mDecodePending;
  942. }
  943. void
  944. MediaFormatReader::ScheduleUpdate(TrackType aTrack)
  945. {
  946. MOZ_ASSERT(OnTaskQueue());
  947. if (mShutdown) {
  948. return;
  949. }
  950. auto& decoder = GetDecoderData(aTrack);
  951. if (decoder.mUpdateScheduled) {
  952. return;
  953. }
  954. LOGV("SchedulingUpdate(%s)", TrackTypeToStr(aTrack));
  955. decoder.mUpdateScheduled = true;
  956. RefPtr<nsIRunnable> task(
  957. NewRunnableMethod<TrackType>(this, &MediaFormatReader::Update, aTrack));
  958. OwnerThread()->Dispatch(task.forget());
  959. }
  960. bool
  961. MediaFormatReader::UpdateReceivedNewData(TrackType aTrack)
  962. {
  963. MOZ_ASSERT(OnTaskQueue());
  964. auto& decoder = GetDecoderData(aTrack);
  965. if (!decoder.mReceivedNewData) {
  966. return false;
  967. }
  968. // Update our cached TimeRange.
  969. decoder.mTimeRanges = decoder.mTrackDemuxer->GetBuffered();
  970. // We do not want to clear mWaitingForData while there are pending
  971. // demuxing or seeking operations that could affect the value of this flag.
  972. // This is in order to ensure that we will retry once they complete as we may
  973. // now have new data that could potentially allow those operations to
  974. // successfully complete if tried again.
  975. if (decoder.mSeekRequest.Exists()) {
  976. // Nothing more to do until this operation complete.
  977. return true;
  978. }
  979. if (aTrack == TrackType::kVideoTrack && mSkipRequest.Exists()) {
  980. LOGV("Skipping in progress, nothing more to do");
  981. return true;
  982. }
  983. if (decoder.mDemuxRequest.Exists()) {
  984. // We may have pending operations to process, so we want to continue
  985. // after UpdateReceivedNewData returns.
  986. return false;
  987. }
  988. if (decoder.HasPendingDrain()) {
  989. // We do not want to clear mWaitingForData or mDemuxEOS while
  990. // a drain is in progress in order to properly complete the operation.
  991. return false;
  992. }
  993. bool hasLastEnd;
  994. media::TimeUnit lastEnd = decoder.mTimeRanges.GetEnd(&hasLastEnd);
  995. if (hasLastEnd) {
  996. if (decoder.mLastTimeRangesEnd && decoder.mLastTimeRangesEnd.ref() < lastEnd) {
  997. // New data was added after our previous end, we can clear the EOS flag.
  998. decoder.mDemuxEOS = false;
  999. }
  1000. decoder.mLastTimeRangesEnd = Some(lastEnd);
  1001. }
  1002. decoder.mReceivedNewData = false;
  1003. if (decoder.mTimeThreshold) {
  1004. decoder.mTimeThreshold.ref().mWaiting = false;
  1005. }
  1006. decoder.mWaitingForData = false;
  1007. if (decoder.HasFatalError()) {
  1008. return false;
  1009. }
  1010. if (!mSeekPromise.IsEmpty() &&
  1011. (!IsVideoSeeking() || aTrack == TrackInfo::kVideoTrack)) {
  1012. MOZ_ASSERT(!decoder.HasPromise());
  1013. MOZ_DIAGNOSTIC_ASSERT((IsVideoSeeking() || !mAudio.mTimeThreshold) &&
  1014. !mVideo.mTimeThreshold,
  1015. "InternalSeek must have been aborted when Seek was first called");
  1016. MOZ_DIAGNOSTIC_ASSERT((IsVideoSeeking() || !mAudio.HasWaitingPromise()) &&
  1017. !mVideo.HasWaitingPromise(),
  1018. "Waiting promises must have been rejected when Seek was first called");
  1019. if (mVideo.mSeekRequest.Exists() ||
  1020. (!IsVideoSeeking() && mAudio.mSeekRequest.Exists())) {
  1021. // Already waiting for a seek to complete. Nothing more to do.
  1022. return true;
  1023. }
  1024. LOG("Attempting Seek");
  1025. ScheduleSeek();
  1026. return true;
  1027. }
  1028. if (decoder.HasInternalSeekPending() || decoder.HasWaitingPromise()) {
  1029. if (decoder.HasInternalSeekPending()) {
  1030. LOG("Attempting Internal Seek");
  1031. InternalSeek(aTrack, decoder.mTimeThreshold.ref());
  1032. }
  1033. if (decoder.HasWaitingPromise() && !decoder.IsWaiting()) {
  1034. MOZ_ASSERT(!decoder.HasPromise());
  1035. LOG("We have new data. Resolving WaitingPromise");
  1036. decoder.mWaitingPromise.Resolve(decoder.mType, __func__);
  1037. }
  1038. return true;
  1039. }
  1040. return false;
  1041. }
  1042. void
  1043. MediaFormatReader::RequestDemuxSamples(TrackType aTrack)
  1044. {
  1045. MOZ_ASSERT(OnTaskQueue());
  1046. auto& decoder = GetDecoderData(aTrack);
  1047. MOZ_ASSERT(!decoder.mDemuxRequest.Exists());
  1048. if (!decoder.mQueuedSamples.IsEmpty()) {
  1049. // No need to demux new samples.
  1050. return;
  1051. }
  1052. if (decoder.mDemuxEOS) {
  1053. // Nothing left to demux.
  1054. // We do not want to attempt to demux while in waiting for data mode
  1055. // as it would retrigger an unecessary drain.
  1056. return;
  1057. }
  1058. LOGV("Requesting extra demux %s", TrackTypeToStr(aTrack));
  1059. if (aTrack == TrackInfo::kVideoTrack) {
  1060. DoDemuxVideo();
  1061. } else {
  1062. DoDemuxAudio();
  1063. }
  1064. }
  1065. void
  1066. MediaFormatReader::DecodeDemuxedSamples(TrackType aTrack,
  1067. MediaRawData* aSample)
  1068. {
  1069. MOZ_ASSERT(OnTaskQueue());
  1070. auto& decoder = GetDecoderData(aTrack);
  1071. decoder.mDecoder->Input(aSample);
  1072. decoder.mDecodePending = true;
  1073. }
  1074. void
  1075. MediaFormatReader::HandleDemuxedSamples(TrackType aTrack,
  1076. AbstractMediaDecoder::AutoNotifyDecoded& aA)
  1077. {
  1078. MOZ_ASSERT(OnTaskQueue());
  1079. auto& decoder = GetDecoderData(aTrack);
  1080. if (decoder.mQueuedSamples.IsEmpty()) {
  1081. return;
  1082. }
  1083. if (!decoder.mDecoder) {
  1084. mDecoderFactory->CreateDecoder(aTrack);
  1085. return;
  1086. }
  1087. if (!ForceZeroStartTime() && decoder.mFirstDemuxedSampleTime.isNothing()) {
  1088. decoder.mFirstDemuxedSampleTime.emplace(
  1089. media::TimeUnit::FromMicroseconds(decoder.mQueuedSamples[0]->mTime));
  1090. }
  1091. LOGV("Giving %s input to decoder", TrackTypeToStr(aTrack));
  1092. // Decode all our demuxed frames.
  1093. bool samplesPending = false;
  1094. while (decoder.mQueuedSamples.Length()) {
  1095. RefPtr<MediaRawData> sample = decoder.mQueuedSamples[0];
  1096. RefPtr<SharedTrackInfo> info = sample->mTrackInfo;
  1097. if (info && decoder.mLastStreamSourceID != info->GetID()) {
  1098. if (samplesPending) {
  1099. // Let existing samples complete their decoding. We'll resume later.
  1100. return;
  1101. }
  1102. if (decoder.mNextStreamSourceID.isNothing() ||
  1103. decoder.mNextStreamSourceID.ref() != info->GetID()) {
  1104. LOG("%s stream id has changed from:%d to:%d, draining decoder.",
  1105. TrackTypeToStr(aTrack), decoder.mLastStreamSourceID,
  1106. info->GetID());
  1107. decoder.mNeedDraining = true;
  1108. decoder.mNextStreamSourceID = Some(info->GetID());
  1109. ScheduleUpdate(aTrack);
  1110. return;
  1111. }
  1112. LOG("%s stream id has changed from:%d to:%d, recreating decoder.",
  1113. TrackTypeToStr(aTrack), decoder.mLastStreamSourceID,
  1114. info->GetID());
  1115. decoder.mLastStreamSourceID = info->GetID();
  1116. decoder.mNextStreamSourceID.reset();
  1117. // Reset will clear our array of queued samples. So make a copy now.
  1118. nsTArray<RefPtr<MediaRawData>> samples{decoder.mQueuedSamples};
  1119. Reset(aTrack);
  1120. decoder.ShutdownDecoder();
  1121. decoder.mInfo = info;
  1122. if (sample->mKeyframe) {
  1123. decoder.mQueuedSamples.AppendElements(Move(samples));
  1124. ScheduleUpdate(aTrack);
  1125. } else {
  1126. TimeInterval time =
  1127. TimeInterval(TimeUnit::FromMicroseconds(sample->mTime),
  1128. TimeUnit::FromMicroseconds(sample->GetEndTime()));
  1129. InternalSeekTarget seekTarget =
  1130. decoder.mTimeThreshold.refOr(InternalSeekTarget(time, false));
  1131. LOG("Stream change occurred on a non-keyframe. Seeking to:%lld",
  1132. sample->mTime);
  1133. InternalSeek(aTrack, seekTarget);
  1134. }
  1135. return;
  1136. }
  1137. LOGV("Input:%lld (dts:%lld kf:%d)",
  1138. sample->mTime, sample->mTimecode, sample->mKeyframe);
  1139. decoder.mOutputRequested = true;
  1140. decoder.mNumSamplesInput++;
  1141. decoder.mSizeOfQueue++;
  1142. if (aTrack == TrackInfo::kVideoTrack) {
  1143. aA.mStats.mParsedFrames++;
  1144. }
  1145. if (mDemuxOnly) {
  1146. ReturnOutput(sample, aTrack);
  1147. } else {
  1148. DecodeDemuxedSamples(aTrack, sample);
  1149. }
  1150. decoder.mQueuedSamples.RemoveElementAt(0);
  1151. if (mDemuxOnly) {
  1152. // If demuxed-only case, ReturnOutput will resolve with one demuxed data.
  1153. // Then we should stop doing the iteration.
  1154. return;
  1155. }
  1156. samplesPending = true;
  1157. }
  1158. }
  1159. void
  1160. MediaFormatReader::InternalSeek(TrackType aTrack, const InternalSeekTarget& aTarget)
  1161. {
  1162. MOZ_ASSERT(OnTaskQueue());
  1163. LOG("%s internal seek to %f",
  1164. TrackTypeToStr(aTrack), aTarget.Time().ToSeconds());
  1165. auto& decoder = GetDecoderData(aTrack);
  1166. decoder.Flush();
  1167. decoder.ResetDemuxer();
  1168. decoder.mTimeThreshold = Some(aTarget);
  1169. RefPtr<MediaFormatReader> self = this;
  1170. decoder.mSeekRequest.Begin(decoder.mTrackDemuxer->Seek(decoder.mTimeThreshold.ref().Time())
  1171. ->Then(OwnerThread(), __func__,
  1172. [self, aTrack] (media::TimeUnit aTime) {
  1173. auto& decoder = self->GetDecoderData(aTrack);
  1174. decoder.mSeekRequest.Complete();
  1175. MOZ_ASSERT(decoder.mTimeThreshold,
  1176. "Seek promise must be disconnected when timethreshold is reset");
  1177. decoder.mTimeThreshold.ref().mHasSeeked = true;
  1178. self->SetVideoDecodeThreshold();
  1179. self->ScheduleUpdate(aTrack);
  1180. },
  1181. [self, aTrack] (const MediaResult& aError) {
  1182. auto& decoder = self->GetDecoderData(aTrack);
  1183. decoder.mSeekRequest.Complete();
  1184. switch (aError.Code()) {
  1185. case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
  1186. self->NotifyWaitingForData(aTrack);
  1187. break;
  1188. case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
  1189. decoder.mTimeThreshold.reset();
  1190. self->NotifyEndOfStream(aTrack);
  1191. break;
  1192. case NS_ERROR_DOM_MEDIA_CANCELED:
  1193. decoder.mTimeThreshold.reset();
  1194. break;
  1195. default:
  1196. decoder.mTimeThreshold.reset();
  1197. self->NotifyError(aTrack, aError);
  1198. break;
  1199. }
  1200. }));
  1201. }
  1202. void
  1203. MediaFormatReader::DrainDecoder(TrackType aTrack)
  1204. {
  1205. MOZ_ASSERT(OnTaskQueue());
  1206. auto& decoder = GetDecoderData(aTrack);
  1207. if (!decoder.mNeedDraining || decoder.mDraining) {
  1208. return;
  1209. }
  1210. decoder.mNeedDraining = false;
  1211. // mOutputRequest must be set, otherwise NotifyDrainComplete()
  1212. // may reject the drain if a Flush recently occurred.
  1213. decoder.mOutputRequested = true;
  1214. if (!decoder.mDecoder ||
  1215. decoder.mNumSamplesInput == decoder.mNumSamplesOutput) {
  1216. // No frames to drain.
  1217. NotifyDrainComplete(aTrack);
  1218. return;
  1219. }
  1220. decoder.mDecoder->Drain();
  1221. decoder.mDraining = true;
  1222. LOG("Requesting %s decoder to drain", TrackTypeToStr(aTrack));
  1223. }
  1224. void
  1225. MediaFormatReader::Update(TrackType aTrack)
  1226. {
  1227. MOZ_ASSERT(OnTaskQueue());
  1228. if (mShutdown) {
  1229. return;
  1230. }
  1231. LOGV("Processing update for %s", TrackTypeToStr(aTrack));
  1232. bool needOutput = false;
  1233. auto& decoder = GetDecoderData(aTrack);
  1234. decoder.mUpdateScheduled = false;
  1235. if (!mInitDone) {
  1236. return;
  1237. }
  1238. if (aTrack == TrackType::kVideoTrack && mSkipRequest.Exists()) {
  1239. LOGV("Skipping in progress, nothing more to do");
  1240. return;
  1241. }
  1242. if (decoder.HasWaitingPromise() && decoder.mDrainComplete) {
  1243. // This situation will occur when a change of stream ID occurred during
  1244. // internal seeking following a gap encountered in the data, a drain was
  1245. // requested and has now completed. We need to complete the draining process
  1246. // so that the new data can be processed.
  1247. // We can complete the draining operation now as we have no pending
  1248. // operation when a waiting promise is pending.
  1249. decoder.mDrainComplete = false;
  1250. decoder.mDraining = false;
  1251. }
  1252. if (UpdateReceivedNewData(aTrack)) {
  1253. LOGV("Nothing more to do");
  1254. return;
  1255. }
  1256. if (decoder.mSeekRequest.Exists()) {
  1257. LOGV("Seeking hasn't completed, nothing more to do");
  1258. return;
  1259. }
  1260. MOZ_DIAGNOSTIC_ASSERT(!decoder.HasInternalSeekPending() ||
  1261. (!decoder.mOutput.Length() &&
  1262. !decoder.mQueuedSamples.Length()),
  1263. "No frames can be demuxed or decoded while an internal seek is pending");
  1264. // Record number of frames decoded and parsed. Automatically update the
  1265. // stats counters using the AutoNotifyDecoded stack-based class.
  1266. AbstractMediaDecoder::AutoNotifyDecoded a(mDecoder);
  1267. // Drop any frames found prior our internal seek target.
  1268. while (decoder.mTimeThreshold && decoder.mOutput.Length()) {
  1269. RefPtr<MediaData>& output = decoder.mOutput[0];
  1270. InternalSeekTarget target = decoder.mTimeThreshold.ref();
  1271. media::TimeUnit time = media::TimeUnit::FromMicroseconds(output->mTime);
  1272. if (time >= target.Time()) {
  1273. // We have reached our internal seek target.
  1274. decoder.mTimeThreshold.reset();
  1275. // We might have dropped some keyframes.
  1276. mPreviousDecodedKeyframeTime_us = sNoPreviousDecodedKeyframe;
  1277. }
  1278. if (time < target.Time() || (target.mDropTarget && target.Contains(time))) {
  1279. LOGV("Internal Seeking: Dropping %s frame time:%f wanted:%f (kf:%d)",
  1280. TrackTypeToStr(aTrack),
  1281. media::TimeUnit::FromMicroseconds(output->mTime).ToSeconds(),
  1282. target.Time().ToSeconds(),
  1283. output->mKeyframe);
  1284. decoder.mOutput.RemoveElementAt(0);
  1285. decoder.mSizeOfQueue -= 1;
  1286. }
  1287. }
  1288. while (decoder.mOutput.Length() && decoder.mOutput[0]->mType == MediaData::NULL_DATA) {
  1289. LOGV("Dropping null data. Time: %lld", decoder.mOutput[0]->mTime);
  1290. decoder.mOutput.RemoveElementAt(0);
  1291. decoder.mSizeOfQueue -= 1;
  1292. }
  1293. if (decoder.HasPromise()) {
  1294. needOutput = true;
  1295. if (decoder.mOutput.Length()) {
  1296. RefPtr<MediaData> output = decoder.mOutput[0];
  1297. decoder.mOutput.RemoveElementAt(0);
  1298. decoder.mSizeOfQueue -= 1;
  1299. decoder.mLastSampleTime =
  1300. Some(TimeInterval(TimeUnit::FromMicroseconds(output->mTime),
  1301. TimeUnit::FromMicroseconds(output->GetEndTime())));
  1302. decoder.mNumSamplesOutputTotal++;
  1303. ReturnOutput(output, aTrack);
  1304. // We have a decoded sample ready to be returned.
  1305. if (aTrack == TrackType::kVideoTrack) {
  1306. uint64_t delta =
  1307. decoder.mNumSamplesOutputTotal - mLastReportedNumDecodedFrames;
  1308. a.mStats.mDecodedFrames = static_cast<uint32_t>(delta);
  1309. mLastReportedNumDecodedFrames = decoder.mNumSamplesOutputTotal;
  1310. if (output->mKeyframe) {
  1311. if (mPreviousDecodedKeyframeTime_us < output->mTime) {
  1312. // There is a previous keyframe -> Record inter-keyframe stats.
  1313. uint64_t segment_us = output->mTime - mPreviousDecodedKeyframeTime_us;
  1314. a.mStats.mInterKeyframeSum_us += segment_us;
  1315. a.mStats.mInterKeyframeCount += 1;
  1316. if (a.mStats.mInterKeyFrameMax_us < segment_us) {
  1317. a.mStats.mInterKeyFrameMax_us = segment_us;
  1318. }
  1319. }
  1320. mPreviousDecodedKeyframeTime_us = output->mTime;
  1321. }
  1322. nsCString error;
  1323. mVideo.mIsHardwareAccelerated =
  1324. mVideo.mDecoder && mVideo.mDecoder->IsHardwareAccelerated(error);
  1325. }
  1326. } else if (decoder.HasFatalError()) {
  1327. LOG("Rejecting %s promise: DECODE_ERROR", TrackTypeToStr(aTrack));
  1328. decoder.RejectPromise(decoder.mError.ref(), __func__);
  1329. return;
  1330. } else if (decoder.mDrainComplete) {
  1331. bool wasDraining = decoder.mDraining;
  1332. decoder.mDrainComplete = false;
  1333. decoder.mDraining = false;
  1334. if (decoder.mDemuxEOS) {
  1335. LOG("Rejecting %s promise: EOS", TrackTypeToStr(aTrack));
  1336. decoder.RejectPromise(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
  1337. } else if (decoder.mWaitingForData) {
  1338. if (wasDraining && decoder.mLastSampleTime &&
  1339. !decoder.mNextStreamSourceID) {
  1340. // We have completed draining the decoder following WaitingForData.
  1341. // Set up the internal seek machinery to be able to resume from the
  1342. // last sample decoded.
  1343. LOG("Seeking to last sample time: %lld",
  1344. decoder.mLastSampleTime.ref().mStart.ToMicroseconds());
  1345. InternalSeek(aTrack, InternalSeekTarget(decoder.mLastSampleTime.ref(), true));
  1346. }
  1347. if (!decoder.mReceivedNewData) {
  1348. LOG("Rejecting %s promise: WAITING_FOR_DATA", TrackTypeToStr(aTrack));
  1349. decoder.RejectPromise(NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA, __func__);
  1350. }
  1351. }
  1352. // Now that draining has completed, we check if we have received
  1353. // new data again as the result may now be different from the earlier
  1354. // run.
  1355. if (UpdateReceivedNewData(aTrack) || decoder.mSeekRequest.Exists()) {
  1356. LOGV("Nothing more to do");
  1357. return;
  1358. }
  1359. } else if (decoder.mDemuxEOS && !decoder.mNeedDraining &&
  1360. !decoder.HasPendingDrain() && decoder.mQueuedSamples.IsEmpty()) {
  1361. // It is possible to transition from WAITING_FOR_DATA directly to EOS
  1362. // state during the internal seek; in which case no draining would occur.
  1363. // There is no more samples left to be decoded and we are already in
  1364. // EOS state. We can immediately reject the data promise.
  1365. LOG("Rejecting %s promise: EOS", TrackTypeToStr(aTrack));
  1366. decoder.RejectPromise(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__);
  1367. } else if (decoder.mWaitingForKey) {
  1368. LOG("Rejecting %s promise: WAITING_FOR_DATA due to waiting for key",
  1369. TrackTypeToStr(aTrack));
  1370. decoder.RejectPromise(NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA, __func__);
  1371. }
  1372. }
  1373. if (decoder.mNeedDraining) {
  1374. DrainDecoder(aTrack);
  1375. return;
  1376. }
  1377. if (decoder.mError && !decoder.HasFatalError()) {
  1378. decoder.mDecodePending = false;
  1379. bool needsNewDecoder = decoder.mError.ref() == NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER;
  1380. if (!needsNewDecoder && ++decoder.mNumOfConsecutiveError > decoder.mMaxConsecutiveError) {
  1381. NotifyError(aTrack, decoder.mError.ref());
  1382. return;
  1383. }
  1384. decoder.mError.reset();
  1385. LOG("%s decoded error count %d", TrackTypeToStr(aTrack),
  1386. decoder.mNumOfConsecutiveError);
  1387. media::TimeUnit nextKeyframe;
  1388. if (aTrack == TrackType::kVideoTrack && !decoder.HasInternalSeekPending() &&
  1389. NS_SUCCEEDED(decoder.mTrackDemuxer->GetNextRandomAccessPoint(&nextKeyframe))) {
  1390. if (needsNewDecoder) {
  1391. decoder.ShutdownDecoder();
  1392. }
  1393. SkipVideoDemuxToNextKeyFrame(decoder.mLastSampleTime.refOr(TimeInterval()).Length());
  1394. return;
  1395. } else if (aTrack == TrackType::kAudioTrack) {
  1396. decoder.Flush();
  1397. }
  1398. }
  1399. bool needInput = NeedInput(decoder);
  1400. LOGV("Update(%s) ni=%d no=%d ie=%d, in:%llu out:%llu qs=%u pending:%u waiting:%d promise:%d wfk:%d sid:%u",
  1401. TrackTypeToStr(aTrack), needInput, needOutput, decoder.mDecodePending,
  1402. decoder.mNumSamplesInput, decoder.mNumSamplesOutput,
  1403. uint32_t(size_t(decoder.mSizeOfQueue)), uint32_t(decoder.mOutput.Length()),
  1404. decoder.mWaitingForData, decoder.HasPromise(),
  1405. decoder.mWaitingForKey, decoder.mLastStreamSourceID);
  1406. if ((decoder.mWaitingForData &&
  1407. (!decoder.mTimeThreshold || decoder.mTimeThreshold.ref().mWaiting)) ||
  1408. (decoder.mWaitingForKey && decoder.mDecodePending)) {
  1409. // Nothing more we can do at present.
  1410. LOGV("Still waiting for data or key.");
  1411. return;
  1412. }
  1413. if (decoder.mWaitingForKey) {
  1414. decoder.mWaitingForKey = false;
  1415. if (decoder.HasWaitingPromise() && !decoder.IsWaiting()) {
  1416. LOGV("No longer waiting for key. Resolving waiting promise");
  1417. decoder.mWaitingPromise.Resolve(decoder.mType, __func__);
  1418. return;
  1419. }
  1420. }
  1421. if (!needInput) {
  1422. LOGV("No need for additional input (pending:%u)",
  1423. uint32_t(decoder.mOutput.Length()));
  1424. return;
  1425. }
  1426. // Demux samples if we don't have some.
  1427. RequestDemuxSamples(aTrack);
  1428. HandleDemuxedSamples(aTrack, a);
  1429. }
  1430. void
  1431. MediaFormatReader::ReturnOutput(MediaData* aData, TrackType aTrack)
  1432. {
  1433. MOZ_ASSERT(GetDecoderData(aTrack).HasPromise());
  1434. MOZ_DIAGNOSTIC_ASSERT(aData->mType != MediaData::NULL_DATA);
  1435. LOG("Resolved data promise for %s [%lld, %lld]", TrackTypeToStr(aTrack),
  1436. aData->mTime, aData->GetEndTime());
  1437. if (aTrack == TrackInfo::kAudioTrack) {
  1438. if (aData->mType != MediaData::RAW_DATA) {
  1439. AudioData* audioData = static_cast<AudioData*>(aData);
  1440. if (audioData->mChannels != mInfo.mAudio.mChannels ||
  1441. audioData->mRate != mInfo.mAudio.mRate) {
  1442. LOG("change of audio format (rate:%d->%d). "
  1443. "This is an unsupported configuration",
  1444. mInfo.mAudio.mRate, audioData->mRate);
  1445. mInfo.mAudio.mRate = audioData->mRate;
  1446. mInfo.mAudio.mChannels = audioData->mChannels;
  1447. }
  1448. }
  1449. mAudio.ResolvePromise(aData, __func__);
  1450. } else if (aTrack == TrackInfo::kVideoTrack) {
  1451. if (aData->mType != MediaData::RAW_DATA) {
  1452. VideoData* videoData = static_cast<VideoData*>(aData);
  1453. if (videoData->mDisplay != mInfo.mVideo.mDisplay) {
  1454. LOG("change of video display size (%dx%d->%dx%d)",
  1455. mInfo.mVideo.mDisplay.width, mInfo.mVideo.mDisplay.height,
  1456. videoData->mDisplay.width, videoData->mDisplay.height);
  1457. mInfo.mVideo.mDisplay = videoData->mDisplay;
  1458. }
  1459. }
  1460. mVideo.ResolvePromise(aData, __func__);
  1461. }
  1462. }
  1463. size_t
  1464. MediaFormatReader::SizeOfVideoQueueInFrames()
  1465. {
  1466. return SizeOfQueue(TrackInfo::kVideoTrack);
  1467. }
  1468. size_t
  1469. MediaFormatReader::SizeOfAudioQueueInFrames()
  1470. {
  1471. return SizeOfQueue(TrackInfo::kAudioTrack);
  1472. }
  1473. size_t
  1474. MediaFormatReader::SizeOfQueue(TrackType aTrack)
  1475. {
  1476. auto& decoder = GetDecoderData(aTrack);
  1477. return decoder.mSizeOfQueue;
  1478. }
  1479. RefPtr<MediaDecoderReader::WaitForDataPromise>
  1480. MediaFormatReader::WaitForData(MediaData::Type aType)
  1481. {
  1482. MOZ_ASSERT(OnTaskQueue());
  1483. TrackType trackType = aType == MediaData::VIDEO_DATA ?
  1484. TrackType::kVideoTrack : TrackType::kAudioTrack;
  1485. auto& decoder = GetDecoderData(trackType);
  1486. if (!decoder.IsWaiting()) {
  1487. // We aren't waiting for anything.
  1488. return WaitForDataPromise::CreateAndResolve(decoder.mType, __func__);
  1489. }
  1490. RefPtr<WaitForDataPromise> p = decoder.mWaitingPromise.Ensure(__func__);
  1491. ScheduleUpdate(trackType);
  1492. return p;
  1493. }
  1494. nsresult
  1495. MediaFormatReader::ResetDecode(TrackSet aTracks)
  1496. {
  1497. MOZ_ASSERT(OnTaskQueue());
  1498. LOGV("");
  1499. mSeekPromise.RejectIfExists(NS_OK, __func__);
  1500. mSkipRequest.DisconnectIfExists();
  1501. // Do the same for any data wait promises.
  1502. if (aTracks.contains(TrackInfo::kAudioTrack)) {
  1503. mAudio.mWaitingPromise.RejectIfExists(
  1504. WaitForDataRejectValue(MediaData::AUDIO_DATA,
  1505. WaitForDataRejectValue::CANCELED), __func__);
  1506. }
  1507. if (aTracks.contains(TrackInfo::kVideoTrack)) {
  1508. mVideo.mWaitingPromise.RejectIfExists(
  1509. WaitForDataRejectValue(MediaData::VIDEO_DATA,
  1510. WaitForDataRejectValue::CANCELED), __func__);
  1511. }
  1512. // Reset miscellaneous seeking state.
  1513. mPendingSeekTime.reset();
  1514. if (HasVideo() && aTracks.contains(TrackInfo::kVideoTrack)) {
  1515. mVideo.ResetDemuxer();
  1516. Reset(TrackInfo::kVideoTrack);
  1517. if (mVideo.HasPromise()) {
  1518. mVideo.RejectPromise(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
  1519. }
  1520. }
  1521. if (HasAudio() && aTracks.contains(TrackInfo::kAudioTrack)) {
  1522. mAudio.ResetDemuxer();
  1523. Reset(TrackInfo::kAudioTrack);
  1524. if (mAudio.HasPromise()) {
  1525. mAudio.RejectPromise(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
  1526. }
  1527. }
  1528. return MediaDecoderReader::ResetDecode(aTracks);
  1529. }
  1530. void
  1531. MediaFormatReader::Output(TrackType aTrack, MediaData* aSample)
  1532. {
  1533. if (!aSample) {
  1534. NS_WARNING("MediaFormatReader::Output() passed a null sample");
  1535. Error(aTrack, MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR, __func__));
  1536. return;
  1537. }
  1538. LOGV("Decoded %s sample time=%lld timecode=%lld kf=%d dur=%lld",
  1539. TrackTypeToStr(aTrack), aSample->mTime, aSample->mTimecode,
  1540. aSample->mKeyframe, aSample->mDuration);
  1541. RefPtr<nsIRunnable> task =
  1542. NewRunnableMethod<TrackType, MediaData*>(
  1543. this, &MediaFormatReader::NotifyNewOutput, aTrack, aSample);
  1544. OwnerThread()->Dispatch(task.forget());
  1545. }
  1546. void
  1547. MediaFormatReader::DrainComplete(TrackType aTrack)
  1548. {
  1549. RefPtr<nsIRunnable> task =
  1550. NewRunnableMethod<TrackType>(
  1551. this, &MediaFormatReader::NotifyDrainComplete, aTrack);
  1552. OwnerThread()->Dispatch(task.forget());
  1553. }
  1554. void
  1555. MediaFormatReader::InputExhausted(TrackType aTrack)
  1556. {
  1557. RefPtr<nsIRunnable> task =
  1558. NewRunnableMethod<TrackType>(
  1559. this, &MediaFormatReader::NotifyInputExhausted, aTrack);
  1560. OwnerThread()->Dispatch(task.forget());
  1561. }
  1562. void
  1563. MediaFormatReader::Error(TrackType aTrack, const MediaResult& aError)
  1564. {
  1565. RefPtr<nsIRunnable> task =
  1566. NewRunnableMethod<TrackType, MediaResult>(
  1567. this, &MediaFormatReader::NotifyError, aTrack, aError);
  1568. OwnerThread()->Dispatch(task.forget());
  1569. }
  1570. void
  1571. MediaFormatReader::WaitingForKey(TrackType aTrack)
  1572. {
  1573. RefPtr<nsIRunnable> task =
  1574. NewRunnableMethod<TrackType>(
  1575. this, &MediaFormatReader::NotifyWaitingForKey, aTrack);
  1576. OwnerThread()->Dispatch(task.forget());
  1577. }
  1578. void
  1579. MediaFormatReader::Reset(TrackType aTrack)
  1580. {
  1581. MOZ_ASSERT(OnTaskQueue());
  1582. LOG("Reset(%s) BEGIN", TrackTypeToStr(aTrack));
  1583. auto& decoder = GetDecoderData(aTrack);
  1584. decoder.ResetState();
  1585. decoder.Flush();
  1586. LOG("Reset(%s) END", TrackTypeToStr(aTrack));
  1587. }
  1588. void
  1589. MediaFormatReader::DropDecodedSamples(TrackType aTrack)
  1590. {
  1591. MOZ_ASSERT(OnTaskQueue());
  1592. auto& decoder = GetDecoderData(aTrack);
  1593. size_t lengthDecodedQueue = decoder.mOutput.Length();
  1594. if (lengthDecodedQueue && decoder.mTimeThreshold.isSome()) {
  1595. TimeUnit time =
  1596. TimeUnit::FromMicroseconds(decoder.mOutput.LastElement()->mTime);
  1597. if (time >= decoder.mTimeThreshold.ref().Time()) {
  1598. // We would have reached our internal seek target.
  1599. decoder.mTimeThreshold.reset();
  1600. }
  1601. }
  1602. decoder.mOutput.Clear();
  1603. decoder.mSizeOfQueue -= lengthDecodedQueue;
  1604. if (aTrack == TrackInfo::kVideoTrack && mDecoder) {
  1605. mDecoder->NotifyDecodedFrames({ 0, 0, lengthDecodedQueue });
  1606. }
  1607. }
  1608. void
  1609. MediaFormatReader::SkipVideoDemuxToNextKeyFrame(media::TimeUnit aTimeThreshold)
  1610. {
  1611. MOZ_ASSERT(OnTaskQueue());
  1612. LOG("Skipping up to %lld", aTimeThreshold.ToMicroseconds());
  1613. // We've reached SkipVideoDemuxToNextKeyFrame when our decoding is late.
  1614. // As such we can drop all already decoded samples and discard all pending
  1615. // samples.
  1616. // TODO: Ideally we should set mOutputRequested to false so that all pending
  1617. // frames are dropped too. However, we can't do such thing as the code assumes
  1618. // that the decoder just got flushed. Once bug 1257107 land, we could set the
  1619. // decoder threshold to the value of currentTime.
  1620. DropDecodedSamples(TrackInfo::kVideoTrack);
  1621. mSkipRequest.Begin(mVideo.mTrackDemuxer->SkipToNextRandomAccessPoint(aTimeThreshold)
  1622. ->Then(OwnerThread(), __func__, this,
  1623. &MediaFormatReader::OnVideoSkipCompleted,
  1624. &MediaFormatReader::OnVideoSkipFailed));
  1625. return;
  1626. }
  1627. void
  1628. MediaFormatReader::VideoSkipReset(uint32_t aSkipped)
  1629. {
  1630. MOZ_ASSERT(OnTaskQueue());
  1631. // Some frames may have been output by the decoder since we initiated the
  1632. // videoskip process and we know they would be late.
  1633. DropDecodedSamples(TrackInfo::kVideoTrack);
  1634. // Report the pending frames as dropped.
  1635. if (mDecoder) {
  1636. mDecoder->NotifyDecodedFrames({ 0, 0, SizeOfVideoQueueInFrames() });
  1637. }
  1638. // Cancel any pending demux request and pending demuxed samples.
  1639. mVideo.mDemuxRequest.DisconnectIfExists();
  1640. Reset(TrackType::kVideoTrack);
  1641. if (mDecoder) {
  1642. mDecoder->NotifyDecodedFrames({ aSkipped, 0, aSkipped });
  1643. }
  1644. mVideo.mNumSamplesSkippedTotal += aSkipped;
  1645. }
  1646. void
  1647. MediaFormatReader::OnVideoSkipCompleted(uint32_t aSkipped)
  1648. {
  1649. MOZ_ASSERT(OnTaskQueue());
  1650. LOG("Skipping succeeded, skipped %u frames", aSkipped);
  1651. mSkipRequest.Complete();
  1652. VideoSkipReset(aSkipped);
  1653. ScheduleUpdate(TrackInfo::kVideoTrack);
  1654. }
  1655. void
  1656. MediaFormatReader::OnVideoSkipFailed(MediaTrackDemuxer::SkipFailureHolder aFailure)
  1657. {
  1658. MOZ_ASSERT(OnTaskQueue());
  1659. LOG("Skipping failed, skipped %u frames", aFailure.mSkipped);
  1660. mSkipRequest.Complete();
  1661. switch (aFailure.mFailure.Code()) {
  1662. case NS_ERROR_DOM_MEDIA_END_OF_STREAM:
  1663. case NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA:
  1664. // Some frames may have been output by the decoder since we initiated the
  1665. // videoskip process and we know they would be late.
  1666. DropDecodedSamples(TrackInfo::kVideoTrack);
  1667. // We can't complete the skip operation, will just service a video frame
  1668. // normally.
  1669. ScheduleUpdate(TrackInfo::kVideoTrack);
  1670. break;
  1671. case NS_ERROR_DOM_MEDIA_CANCELED:
  1672. if (mVideo.HasPromise()) {
  1673. mVideo.RejectPromise(aFailure.mFailure, __func__);
  1674. }
  1675. break;
  1676. default:
  1677. NotifyError(TrackType::kVideoTrack, aFailure.mFailure);
  1678. break;
  1679. }
  1680. }
  1681. RefPtr<MediaDecoderReader::SeekPromise>
  1682. MediaFormatReader::Seek(SeekTarget aTarget, int64_t aUnused)
  1683. {
  1684. MOZ_ASSERT(OnTaskQueue());
  1685. LOG("aTarget=(%lld)", aTarget.GetTime().ToMicroseconds());
  1686. MOZ_DIAGNOSTIC_ASSERT(mSeekPromise.IsEmpty());
  1687. MOZ_DIAGNOSTIC_ASSERT(!mVideo.HasPromise());
  1688. MOZ_DIAGNOSTIC_ASSERT(aTarget.IsVideoOnly() || !mAudio.HasPromise());
  1689. MOZ_DIAGNOSTIC_ASSERT(mPendingSeekTime.isNothing());
  1690. MOZ_DIAGNOSTIC_ASSERT(mVideo.mTimeThreshold.isNothing());
  1691. MOZ_DIAGNOSTIC_ASSERT(aTarget.IsVideoOnly() || mAudio.mTimeThreshold.isNothing());
  1692. if (!mInfo.mMediaSeekable && !mInfo.mMediaSeekableOnlyInBufferedRanges) {
  1693. LOG("Seek() END (Unseekable)");
  1694. return SeekPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
  1695. }
  1696. if (mShutdown) {
  1697. return SeekPromise::CreateAndReject(NS_ERROR_FAILURE, __func__);
  1698. }
  1699. SetSeekTarget(Move(aTarget));
  1700. RefPtr<SeekPromise> p = mSeekPromise.Ensure(__func__);
  1701. ScheduleSeek();
  1702. return p;
  1703. }
  1704. void
  1705. MediaFormatReader::SetSeekTarget(const SeekTarget& aTarget)
  1706. {
  1707. MOZ_ASSERT(OnTaskQueue());
  1708. SeekTarget target = aTarget;
  1709. // Transform the seek target time to the demuxer timeline.
  1710. if (!ForceZeroStartTime()) {
  1711. target.SetTime(aTarget.GetTime() - TimeUnit::FromMicroseconds(StartTime())
  1712. + DemuxStartTime());
  1713. }
  1714. mOriginalSeekTarget = target;
  1715. mFallbackSeekTime = mPendingSeekTime = Some(target.GetTime());
  1716. }
  1717. TimeUnit
  1718. MediaFormatReader::DemuxStartTime()
  1719. {
  1720. MOZ_ASSERT(OnTaskQueue());
  1721. MOZ_ASSERT(!ForceZeroStartTime());
  1722. MOZ_ASSERT(HasAudio() || HasVideo());
  1723. const TimeUnit startTime =
  1724. std::min(mAudio.mFirstDemuxedSampleTime.refOr(TimeUnit::FromInfinity()),
  1725. mVideo.mFirstDemuxedSampleTime.refOr(TimeUnit::FromInfinity()));
  1726. return startTime.IsInfinite() ? TimeUnit::FromMicroseconds(0) : startTime;
  1727. }
  1728. void
  1729. MediaFormatReader::ScheduleSeek()
  1730. {
  1731. if (mSeekScheduled) {
  1732. return;
  1733. }
  1734. mSeekScheduled = true;
  1735. OwnerThread()->Dispatch(NewRunnableMethod(this, &MediaFormatReader::AttemptSeek));
  1736. }
  1737. void
  1738. MediaFormatReader::AttemptSeek()
  1739. {
  1740. MOZ_ASSERT(OnTaskQueue());
  1741. mSeekScheduled = false;
  1742. if (mPendingSeekTime.isNothing()) {
  1743. return;
  1744. }
  1745. if (HasVideo()) {
  1746. mVideo.ResetDemuxer();
  1747. mVideo.ResetState();
  1748. }
  1749. // Don't reset the audio demuxer not state when seeking video only
  1750. // as it will cause the audio to seek back to the beginning
  1751. // resulting in out-of-sync audio from video.
  1752. if (HasAudio() && !mOriginalSeekTarget.IsVideoOnly()) {
  1753. mAudio.ResetDemuxer();
  1754. mAudio.ResetState();
  1755. }
  1756. if (HasVideo()) {
  1757. DoVideoSeek();
  1758. } else if (HasAudio()) {
  1759. DoAudioSeek();
  1760. } else {
  1761. MOZ_CRASH();
  1762. }
  1763. }
  1764. void
  1765. MediaFormatReader::OnSeekFailed(TrackType aTrack, const MediaResult& aError)
  1766. {
  1767. MOZ_ASSERT(OnTaskQueue());
  1768. LOGV("%s failure:%u", TrackTypeToStr(aTrack), aError.Code());
  1769. if (aTrack == TrackType::kVideoTrack) {
  1770. mVideo.mSeekRequest.Complete();
  1771. } else {
  1772. mAudio.mSeekRequest.Complete();
  1773. }
  1774. if (aError == NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA) {
  1775. if (HasVideo() && aTrack == TrackType::kAudioTrack &&
  1776. mFallbackSeekTime.isSome() &&
  1777. mPendingSeekTime.ref() != mFallbackSeekTime.ref()) {
  1778. // We have failed to seek audio where video seeked to earlier.
  1779. // Attempt to seek instead to the closest point that we know we have in
  1780. // order to limit A/V sync discrepency.
  1781. // Ensure we have the most up to date buffered ranges.
  1782. UpdateReceivedNewData(TrackType::kAudioTrack);
  1783. Maybe<media::TimeUnit> nextSeekTime;
  1784. // Find closest buffered time found after video seeked time.
  1785. for (const auto& timeRange : mAudio.mTimeRanges) {
  1786. if (timeRange.mStart >= mPendingSeekTime.ref()) {
  1787. nextSeekTime.emplace(timeRange.mStart);
  1788. break;
  1789. }
  1790. }
  1791. if (nextSeekTime.isNothing() ||
  1792. nextSeekTime.ref() > mFallbackSeekTime.ref()) {
  1793. nextSeekTime = Some(mFallbackSeekTime.ref());
  1794. LOG("Unable to seek audio to video seek time. A/V sync may be broken");
  1795. } else {
  1796. mFallbackSeekTime.reset();
  1797. }
  1798. mPendingSeekTime = nextSeekTime;
  1799. DoAudioSeek();
  1800. return;
  1801. }
  1802. NotifyWaitingForData(aTrack);
  1803. return;
  1804. }
  1805. MOZ_ASSERT(!mVideo.mSeekRequest.Exists() && !mAudio.mSeekRequest.Exists());
  1806. mPendingSeekTime.reset();
  1807. mSeekPromise.Reject(aError, __func__);
  1808. }
  1809. void
  1810. MediaFormatReader::DoVideoSeek()
  1811. {
  1812. MOZ_ASSERT(mPendingSeekTime.isSome());
  1813. LOGV("Seeking video to %lld", mPendingSeekTime.ref().ToMicroseconds());
  1814. media::TimeUnit seekTime = mPendingSeekTime.ref();
  1815. mVideo.mSeekRequest.Begin(mVideo.mTrackDemuxer->Seek(seekTime)
  1816. ->Then(OwnerThread(), __func__, this,
  1817. &MediaFormatReader::OnVideoSeekCompleted,
  1818. &MediaFormatReader::OnVideoSeekFailed));
  1819. }
  1820. void
  1821. MediaFormatReader::OnVideoSeekCompleted(media::TimeUnit aTime)
  1822. {
  1823. MOZ_ASSERT(OnTaskQueue());
  1824. LOGV("Video seeked to %lld", aTime.ToMicroseconds());
  1825. mVideo.mSeekRequest.Complete();
  1826. mPreviousDecodedKeyframeTime_us = sNoPreviousDecodedKeyframe;
  1827. SetVideoDecodeThreshold();
  1828. if (HasAudio() && !mOriginalSeekTarget.IsVideoOnly()) {
  1829. MOZ_ASSERT(mPendingSeekTime.isSome());
  1830. if (mOriginalSeekTarget.IsFast()) {
  1831. // We are performing a fast seek. We need to seek audio to where the
  1832. // video seeked to, to ensure proper A/V sync once playback resume.
  1833. mPendingSeekTime = Some(aTime);
  1834. }
  1835. DoAudioSeek();
  1836. } else {
  1837. mPendingSeekTime.reset();
  1838. mSeekPromise.Resolve(aTime, __func__);
  1839. }
  1840. }
  1841. void
  1842. MediaFormatReader::OnVideoSeekFailed(const MediaResult& aError)
  1843. {
  1844. mPreviousDecodedKeyframeTime_us = sNoPreviousDecodedKeyframe;
  1845. OnSeekFailed(TrackType::kVideoTrack, aError);
  1846. }
  1847. void
  1848. MediaFormatReader::SetVideoDecodeThreshold()
  1849. {
  1850. MOZ_ASSERT(OnTaskQueue());
  1851. if (!HasVideo() || !mVideo.mDecoder) {
  1852. return;
  1853. }
  1854. if (!mVideo.mTimeThreshold && !IsSeeking()) {
  1855. return;
  1856. }
  1857. TimeUnit threshold;
  1858. if (mVideo.mTimeThreshold) {
  1859. // For internalSeek.
  1860. threshold = mVideo.mTimeThreshold.ref().Time();
  1861. } else if (IsSeeking()) {
  1862. // If IsSeeking() is true, then video seek must have completed already.
  1863. TimeUnit keyframe;
  1864. if (NS_FAILED(mVideo.mTrackDemuxer->GetNextRandomAccessPoint(&keyframe))) {
  1865. return;
  1866. }
  1867. // If the key frame is invalid/infinite, it means the target position is
  1868. // closing to end of stream. We don't want to skip any frame at this point.
  1869. if (!keyframe.IsValid() || keyframe.IsInfinite()) {
  1870. return;
  1871. }
  1872. threshold = mOriginalSeekTarget.GetTime();
  1873. } else {
  1874. return;
  1875. }
  1876. LOG("Set seek threshold to %lld", threshold.ToMicroseconds());
  1877. mVideo.mDecoder->SetSeekThreshold(threshold);
  1878. }
  1879. void
  1880. MediaFormatReader::DoAudioSeek()
  1881. {
  1882. MOZ_ASSERT(mPendingSeekTime.isSome());
  1883. LOGV("Seeking audio to %lld", mPendingSeekTime.ref().ToMicroseconds());
  1884. media::TimeUnit seekTime = mPendingSeekTime.ref();
  1885. mAudio.mSeekRequest.Begin(mAudio.mTrackDemuxer->Seek(seekTime)
  1886. ->Then(OwnerThread(), __func__, this,
  1887. &MediaFormatReader::OnAudioSeekCompleted,
  1888. &MediaFormatReader::OnAudioSeekFailed));
  1889. }
  1890. void
  1891. MediaFormatReader::OnAudioSeekCompleted(media::TimeUnit aTime)
  1892. {
  1893. MOZ_ASSERT(OnTaskQueue());
  1894. LOGV("Audio seeked to %lld", aTime.ToMicroseconds());
  1895. mAudio.mSeekRequest.Complete();
  1896. mPendingSeekTime.reset();
  1897. mSeekPromise.Resolve(aTime, __func__);
  1898. }
  1899. void
  1900. MediaFormatReader::OnAudioSeekFailed(const MediaResult& aError)
  1901. {
  1902. OnSeekFailed(TrackType::kAudioTrack, aError);
  1903. }
  1904. media::TimeIntervals
  1905. MediaFormatReader::GetBuffered()
  1906. {
  1907. MOZ_ASSERT(OnTaskQueue());
  1908. media::TimeIntervals videoti;
  1909. media::TimeIntervals audioti;
  1910. media::TimeIntervals intervals;
  1911. if (!mInitDone) {
  1912. return intervals;
  1913. }
  1914. int64_t startTime = 0;
  1915. if (!ForceZeroStartTime()) {
  1916. if (!HaveStartTime()) {
  1917. return intervals;
  1918. }
  1919. startTime = StartTime();
  1920. }
  1921. // Ensure we have up to date buffered time range.
  1922. if (HasVideo()) {
  1923. UpdateReceivedNewData(TrackType::kVideoTrack);
  1924. }
  1925. if (HasAudio()) {
  1926. UpdateReceivedNewData(TrackType::kAudioTrack);
  1927. }
  1928. if (HasVideo()) {
  1929. videoti = mVideo.mTimeRanges;
  1930. }
  1931. if (HasAudio()) {
  1932. audioti = mAudio.mTimeRanges;
  1933. }
  1934. if (HasAudio() && HasVideo()) {
  1935. intervals = media::Intersection(Move(videoti), Move(audioti));
  1936. } else if (HasAudio()) {
  1937. intervals = Move(audioti);
  1938. } else if (HasVideo()) {
  1939. intervals = Move(videoti);
  1940. }
  1941. if (!intervals.Length() ||
  1942. intervals.GetStart() == media::TimeUnit::FromMicroseconds(0)) {
  1943. // IntervalSet already starts at 0 or is empty, nothing to shift.
  1944. return intervals;
  1945. }
  1946. return intervals.Shift(media::TimeUnit::FromMicroseconds(-startTime));
  1947. }
  1948. // For the MediaFormatReader override we need to force an update to the
  1949. // buffered ranges, so we call NotifyDataArrive
  1950. RefPtr<MediaDecoderReader::BufferedUpdatePromise>
  1951. MediaFormatReader::UpdateBufferedWithPromise() {
  1952. MOZ_ASSERT(OnTaskQueue());
  1953. // Call NotifyDataArrive to force a recalculation of the buffered
  1954. // ranges. UpdateBuffered alone will not force a recalculation, so we
  1955. // use NotifyDataArrived which sets flags to force this recalculation.
  1956. // See MediaFormatReader::UpdateReceivedNewData for an example of where
  1957. // the new data flag is used.
  1958. NotifyDataArrived();
  1959. return BufferedUpdatePromise::CreateAndResolve(true, __func__);
  1960. }
  1961. void MediaFormatReader::ReleaseResources()
  1962. {
  1963. mVideo.ShutdownDecoder();
  1964. mAudio.ShutdownDecoder();
  1965. }
  1966. bool
  1967. MediaFormatReader::VideoIsHardwareAccelerated() const
  1968. {
  1969. return mVideo.mIsHardwareAccelerated;
  1970. }
  1971. void
  1972. MediaFormatReader::NotifyDemuxer()
  1973. {
  1974. MOZ_ASSERT(OnTaskQueue());
  1975. if (mShutdown || !mDemuxer ||
  1976. (!mDemuxerInitDone && !mDemuxerInitRequest.Exists())) {
  1977. return;
  1978. }
  1979. LOGV("");
  1980. mDemuxer->NotifyDataArrived();
  1981. if (!mInitDone) {
  1982. return;
  1983. }
  1984. if (HasVideo()) {
  1985. mVideo.mReceivedNewData = true;
  1986. ScheduleUpdate(TrackType::kVideoTrack);
  1987. }
  1988. if (HasAudio()) {
  1989. mAudio.mReceivedNewData = true;
  1990. ScheduleUpdate(TrackType::kAudioTrack);
  1991. }
  1992. }
  1993. void
  1994. MediaFormatReader::NotifyDataArrivedInternal()
  1995. {
  1996. MOZ_ASSERT(OnTaskQueue());
  1997. NotifyDemuxer();
  1998. }
  1999. bool
  2000. MediaFormatReader::ForceZeroStartTime() const
  2001. {
  2002. return !mDemuxer->ShouldComputeStartTime();
  2003. }
  2004. layers::ImageContainer*
  2005. MediaFormatReader::GetImageContainer()
  2006. {
  2007. return mVideoFrameContainer
  2008. ? mVideoFrameContainer->GetImageContainer() : nullptr;
  2009. }
  2010. void
  2011. MediaFormatReader::GetMozDebugReaderData(nsAString& aString)
  2012. {
  2013. nsAutoCString result;
  2014. const char* audioName = "unavailable";
  2015. const char* videoName = audioName;
  2016. if (HasAudio()) {
  2017. MonitorAutoLock mon(mAudio.mMonitor);
  2018. audioName = mAudio.mDescription;
  2019. }
  2020. if (HasVideo()) {
  2021. MonitorAutoLock mon(mVideo.mMonitor);
  2022. videoName = mVideo.mDescription;
  2023. }
  2024. result += nsPrintfCString("audio decoder: %s\n", audioName);
  2025. result += nsPrintfCString("audio frames decoded: %lld\n",
  2026. mAudio.mNumSamplesOutputTotal);
  2027. if (HasAudio()) {
  2028. result += nsPrintfCString("audio state: ni=%d no=%d ie=%d demuxr:%d demuxq:%d tt:%f tths:%d in:%llu out:%llu qs=%u pending:%u waiting:%d wfk:%d sid:%u\n",
  2029. NeedInput(mAudio), mAudio.HasPromise(),
  2030. mAudio.mDecodePending,
  2031. mAudio.mDemuxRequest.Exists(),
  2032. int(mAudio.mQueuedSamples.Length()),
  2033. mAudio.mTimeThreshold
  2034. ? mAudio.mTimeThreshold.ref().Time().ToSeconds()
  2035. : -1.0,
  2036. mAudio.mTimeThreshold
  2037. ? mAudio.mTimeThreshold.ref().mHasSeeked
  2038. : -1,
  2039. mAudio.mNumSamplesInput, mAudio.mNumSamplesOutput,
  2040. unsigned(size_t(mAudio.mSizeOfQueue)),
  2041. unsigned(mAudio.mOutput.Length()),
  2042. mAudio.mWaitingForData, mAudio.mWaitingForKey,
  2043. mAudio.mLastStreamSourceID);
  2044. }
  2045. result += nsPrintfCString("video decoder: %s\n", videoName);
  2046. result += nsPrintfCString("hardware video decoding: %s\n",
  2047. VideoIsHardwareAccelerated() ? "enabled" : "disabled");
  2048. result += nsPrintfCString("video frames decoded: %lld (skipped:%lld)\n",
  2049. mVideo.mNumSamplesOutputTotal,
  2050. mVideo.mNumSamplesSkippedTotal);
  2051. if (HasVideo()) {
  2052. result += nsPrintfCString("video state: ni=%d no=%d ie=%d demuxr:%d demuxq:%d tt:%f tths:%d in:%llu out:%llu qs=%u pending:%u waiting:%d wfk:%d, sid:%u\n",
  2053. NeedInput(mVideo), mVideo.HasPromise(),
  2054. mVideo.mDecodePending,
  2055. mVideo.mDemuxRequest.Exists(),
  2056. int(mVideo.mQueuedSamples.Length()),
  2057. mVideo.mTimeThreshold
  2058. ? mVideo.mTimeThreshold.ref().Time().ToSeconds()
  2059. : -1.0,
  2060. mVideo.mTimeThreshold
  2061. ? mVideo.mTimeThreshold.ref().mHasSeeked
  2062. : -1,
  2063. mVideo.mNumSamplesInput, mVideo.mNumSamplesOutput,
  2064. unsigned(size_t(mVideo.mSizeOfQueue)),
  2065. unsigned(mVideo.mOutput.Length()),
  2066. mVideo.mWaitingForData, mVideo.mWaitingForKey,
  2067. mVideo.mLastStreamSourceID);
  2068. }
  2069. aString += NS_ConvertUTF8toUTF16(result);
  2070. }
  2071. void
  2072. MediaFormatReader::SetVideoBlankDecode(bool aIsBlankDecode)
  2073. {
  2074. MOZ_ASSERT(OnTaskQueue());
  2075. return SetBlankDecode(TrackType::kVideoTrack, aIsBlankDecode);
  2076. }
  2077. void
  2078. MediaFormatReader::SetBlankDecode(TrackType aTrack, bool aIsBlankDecode)
  2079. {
  2080. MOZ_ASSERT(OnTaskQueue());
  2081. auto& decoder = GetDecoderData(aTrack);
  2082. LOG("%s, decoder.mIsBlankDecode = %d => aIsBlankDecode = %d",
  2083. TrackTypeToStr(aTrack), decoder.mIsBlankDecode, aIsBlankDecode);
  2084. if (decoder.mIsBlankDecode == aIsBlankDecode) {
  2085. return;
  2086. }
  2087. decoder.mIsBlankDecode = aIsBlankDecode;
  2088. decoder.Flush();
  2089. decoder.ShutdownDecoder();
  2090. ScheduleUpdate(TrackInfo::kVideoTrack);
  2091. return;
  2092. }
  2093. } // namespace mozilla