gecko-dev/dom/media/fmp4/MP4Demuxer.h
Gerald Squelart d32a15fe74 Bug 1341454 - MP4Demuxer::Init() pre-caches everything from MP4Metadata - r=jya
MP4Demuxer::Init() used to just create a minimal MP4Metadata structure, and
report success/failure from that alone. But other later-called functions
(e.g.: GetNumberTracks, GetTrackDemuxer, etc.) could still fail with no useful
error reporting, when MP4Metadata tried to gather more of the needed
information.
Also, MP4Demuxer needed to keep this MP4Metadata around forever, even though
it could contain an arbitrary amount of extra data that is not needed.

With this patch, MP4Demuxer::Init() fetches all the data that could ever be
needed, and then discards the MP4Metadata.
This ensures that no late-initialization errors could creep in, and also helps
reporting errors early and with better diagnostic information.

This bug focuses on Init(), a later bug will give MP4Metadata the ability
to report its own even-more-detailed errors.

MozReview-Commit-ID: 1NjzOeKa1JI

--HG--
extra : rebase_source : 02781395aa538cf2be984b695a7bc7e2b9b039b7
2017-02-23 14:56:51 +11:00

60 lines
1.5 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#if !defined(MP4Demuxer_h_)
#define MP4Demuxer_h_
#include "mozilla/Maybe.h"
#include "mozilla/Monitor.h"
#include "MediaDataDemuxer.h"
#include "MediaResource.h"
namespace mp4_demuxer {
class MP4Metadata;
class ResourceStream;
class SampleIterator;
} // namespace mp4_demuxer
namespace mozilla {
class MP4TrackDemuxer;
class MP4Demuxer : public MediaDataDemuxer
{
public:
explicit MP4Demuxer(MediaResource* aResource);
RefPtr<InitPromise> Init() override;
bool HasTrackType(TrackInfo::TrackType aType) const override;
uint32_t GetNumberTracks(TrackInfo::TrackType aType) const override;
already_AddRefed<MediaTrackDemuxer>
GetTrackDemuxer(TrackInfo::TrackType aType, uint32_t aTrackNumber) override;
bool IsSeekable() const override;
UniquePtr<EncryptionInfo> GetCrypto() override;
void NotifyDataArrived() override;
void NotifyDataRemoved() override;
private:
friend class MP4TrackDemuxer;
RefPtr<MediaResource> mResource;
RefPtr<mp4_demuxer::ResourceStream> mStream;
AutoTArray<RefPtr<MP4TrackDemuxer>, 1> mAudioDemuxers;
AutoTArray<RefPtr<MP4TrackDemuxer>, 1> mVideoDemuxers;
nsTArray<uint8_t> mCryptoInitData;
bool mIsSeekable;
};
} // namespace mozilla
#endif