already_AddRefed<mozilla::MediaByteBuffer> MoofParser::Metadata() { MediaByteRange ftyp; MediaByteRange moov; ScanForMetadata(ftyp, moov); if (!ftyp.Length() || !moov.Length()) { return nullptr; } RefPtr<MediaByteBuffer> metadata = new MediaByteBuffer(); if (!metadata->SetLength(ftyp.Length() + moov.Length(), fallible)) { // OOM return nullptr; } RefPtr<mp4_demuxer::BlockingStream> stream = new BlockingStream(mSource); size_t read; bool rv = stream->ReadAt(ftyp.mStart, metadata->Elements(), ftyp.Length(), &read); if (!rv || read != ftyp.Length()) { return nullptr; } rv = stream->ReadAt(moov.mStart, metadata->Elements() + ftyp.Length(), moov.Length(), &read); if (!rv || read != moov.Length()) { return nullptr; } return metadata.forget(); }
already_AddRefed<mozilla::MediaByteBuffer> MoofParser::Metadata() { MediaByteRange moov; ScanForMetadata(moov); CheckedInt<MediaByteBuffer::size_type> moovLength = moov.Length(); if (!moovLength.isValid() || !moovLength.value()) { // No moov, or cannot be used as array size. return nullptr; } RefPtr<MediaByteBuffer> metadata = new MediaByteBuffer(); if (!metadata->SetLength(moovLength.value(), fallible)) { LOG(Moof, "OOM"); return nullptr; } RefPtr<BlockingStream> stream = new BlockingStream(mSource); size_t read; bool rv = stream->ReadAt(moov.mStart, metadata->Elements(), moovLength.value(), &read); if (!rv || read != moovLength.value()) { return nullptr; } return metadata.forget(); }
bool MoofParser::HasMetadata() { MediaByteRange ftyp; MediaByteRange moov; ScanForMetadata(ftyp, moov); return !!ftyp.Length() && !!moov.Length(); }
already_AddRefed<mozilla::MediaByteBuffer> MoofParser::Metadata() { MediaByteRange ftyp; MediaByteRange moov; ScanForMetadata(ftyp, moov); CheckedInt<MediaByteBuffer::size_type> ftypLength = ftyp.Length(); CheckedInt<MediaByteBuffer::size_type> moovLength = moov.Length(); if (!ftypLength.isValid() || !moovLength.isValid() || !ftypLength.value() || !moovLength.value()) { // No ftyp or moov, or they cannot be used as array size. return nullptr; } CheckedInt<MediaByteBuffer::size_type> totalLength = ftypLength + moovLength; if (!totalLength.isValid()) { // Addition overflow, or sum cannot be used as array size. return nullptr; } RefPtr<MediaByteBuffer> metadata = new MediaByteBuffer(); if (!metadata->SetLength(totalLength.value(), fallible)) { // OOM return nullptr; } RefPtr<mp4_demuxer::BlockingStream> stream = new BlockingStream(mSource); size_t read; bool rv = stream->ReadAt(ftyp.mStart, metadata->Elements(), ftypLength.value(), &read); if (!rv || read != ftypLength.value()) { return nullptr; } rv = stream->ReadAt(moov.mStart, metadata->Elements() + ftypLength.value(), moovLength.value(), &read); if (!rv || read != moovLength.value()) { return nullptr; } return metadata.forget(); }