Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim:set ts=2 sw=2 sts=2 et cindent: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #include "mp4_demuxer/ResourceStream.h"
8 :
9 : namespace mp4_demuxer {
10 :
11 0 : ResourceStream::ResourceStream(mozilla::MediaResource* aResource)
12 : : mResource(aResource)
13 0 : , mPinCount(0)
14 : {
15 0 : MOZ_ASSERT(aResource);
16 0 : }
17 :
18 0 : ResourceStream::~ResourceStream()
19 : {
20 0 : MOZ_ASSERT(mPinCount == 0);
21 0 : }
22 :
23 : bool
24 0 : ResourceStream::ReadAt(int64_t aOffset, void* aBuffer, size_t aCount,
25 : size_t* aBytesRead)
26 : {
27 0 : uint32_t sum = 0;
28 0 : uint32_t bytesRead = 0;
29 0 : do {
30 0 : uint64_t offset = aOffset + sum;
31 0 : char* buffer = reinterpret_cast<char*>(aBuffer) + sum;
32 0 : uint32_t toRead = aCount - sum;
33 0 : nsresult rv = mResource.ReadAt(offset, buffer, toRead, &bytesRead);
34 0 : if (NS_FAILED(rv)) {
35 0 : return false;
36 : }
37 0 : sum += bytesRead;
38 0 : } while (sum < aCount && bytesRead > 0);
39 :
40 0 : *aBytesRead = sum;
41 0 : return true;
42 : }
43 :
44 : bool
45 0 : ResourceStream::CachedReadAt(int64_t aOffset, void* aBuffer, size_t aCount,
46 : size_t* aBytesRead)
47 : {
48 0 : nsresult rv = mResource.GetResource()->ReadFromCache(
49 0 : reinterpret_cast<char*>(aBuffer), aOffset, aCount);
50 0 : if (NS_FAILED(rv)) {
51 0 : *aBytesRead = 0;
52 0 : return false;
53 : }
54 0 : *aBytesRead = aCount;
55 0 : return true;
56 : }
57 :
58 : bool
59 0 : ResourceStream::Length(int64_t* aSize)
60 : {
61 0 : if (mResource.GetLength() < 0)
62 0 : return false;
63 0 : *aSize = mResource.GetLength();
64 0 : return true;
65 : }
66 :
67 : } // namespace mp4_demuxer
|