Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/media/mediasource/SourceBufferResource.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
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 "SourceBufferResource.h"
8
9
#include "mozilla/Logging.h"
10
#include "mozilla/TaskQueue.h"
11
#include "MediaData.h"
12
13
mozilla::LogModule* GetSourceBufferResourceLog()
14
0
{
15
0
  static mozilla::LazyLogModule sLogModule("SourceBufferResource");
16
0
  return sLogModule;
17
0
}
18
19
#define SBR_DEBUG(arg, ...)                                                    \
20
0
  DDMOZ_LOG(GetSourceBufferResourceLog(),                                      \
21
0
            mozilla::LogLevel::Debug,                                          \
22
0
            "::%s: " arg,                                                      \
23
0
            __func__,                                                          \
24
0
            ##__VA_ARGS__)
25
#define SBR_DEBUGV(arg, ...)                                                   \
26
0
  DDMOZ_LOG(GetSourceBufferResourceLog(),                                      \
27
0
            mozilla::LogLevel::Verbose,                                        \
28
0
            "::%s: " arg,                                                      \
29
0
            __func__,                                                          \
30
0
            ##__VA_ARGS__)
31
32
namespace mozilla {
33
34
nsresult
35
SourceBufferResource::Close()
36
0
{
37
0
  MOZ_ASSERT(OnTaskQueue());
38
0
  SBR_DEBUG("Close");
39
0
  mClosed = true;
40
0
  return NS_OK;
41
0
}
42
43
nsresult
44
SourceBufferResource::ReadAt(int64_t aOffset,
45
                             char* aBuffer,
46
                             uint32_t aCount,
47
                             uint32_t* aBytes)
48
0
{
49
0
  SBR_DEBUG("ReadAt(aOffset=%" PRId64 ", aBuffer=%p, aCount=%u, aBytes=%p)",
50
0
            aOffset, aBytes, aCount, aBytes);
51
0
  return ReadAtInternal(aOffset, aBuffer, aCount, aBytes);
52
0
}
53
54
nsresult
55
SourceBufferResource::ReadAtInternal(int64_t aOffset,
56
                                     char* aBuffer,
57
                                     uint32_t aCount,
58
                                     uint32_t* aBytes)
59
0
{
60
0
  MOZ_ASSERT(OnTaskQueue());
61
0
62
0
  if (mClosed ||
63
0
      aOffset < 0 ||
64
0
      uint64_t(aOffset) < mInputBuffer.GetOffset() ||
65
0
      aOffset > GetLength()) {
66
0
    return NS_ERROR_FAILURE;
67
0
  }
68
0
69
0
  uint32_t available = GetLength() - aOffset;
70
0
  uint32_t count = std::min(aCount, available);
71
0
72
0
  SBR_DEBUGV("offset=%" PRId64 " GetLength()=%" PRId64
73
0
             " available=%u count=%u mEnded=%d",
74
0
             aOffset,
75
0
             GetLength(),
76
0
             available,
77
0
             count,
78
0
             mEnded);
79
0
  if (available == 0) {
80
0
    SBR_DEBUGV("reached EOF");
81
0
    *aBytes = 0;
82
0
    return NS_OK;
83
0
  }
84
0
85
0
  mInputBuffer.CopyData(aOffset, count, aBuffer);
86
0
  *aBytes = count;
87
0
88
0
  return NS_OK;
89
0
}
90
91
nsresult
92
SourceBufferResource::ReadFromCache(char* aBuffer,
93
                                    int64_t aOffset,
94
                                    uint32_t aCount)
95
0
{
96
0
  SBR_DEBUG("ReadFromCache(aBuffer=%p, aOffset=%" PRId64 ", aCount=%u)",
97
0
            aBuffer, aOffset, aCount);
98
0
  uint32_t bytesRead;
99
0
  nsresult rv = ReadAtInternal(aOffset, aBuffer, aCount, &bytesRead);
100
0
  NS_ENSURE_SUCCESS(rv, rv);
101
0
102
0
  // ReadFromCache return failure if not all the data is cached.
103
0
  return bytesRead == aCount ? NS_OK : NS_ERROR_FAILURE;
104
0
}
105
106
uint32_t
107
SourceBufferResource::EvictData(uint64_t aPlaybackOffset,
108
                                int64_t aThreshold,
109
                                ErrorResult& aRv)
110
0
{
111
0
  MOZ_ASSERT(OnTaskQueue());
112
0
  SBR_DEBUG("EvictData(aPlaybackOffset=%" PRIu64 ","
113
0
            "aThreshold=%" PRId64 ")", aPlaybackOffset, aThreshold);
114
0
  uint32_t result = mInputBuffer.Evict(aPlaybackOffset, aThreshold, aRv);
115
0
  return result;
116
0
}
117
118
void
119
SourceBufferResource::EvictBefore(uint64_t aOffset, ErrorResult& aRv)
120
0
{
121
0
  MOZ_ASSERT(OnTaskQueue());
122
0
  SBR_DEBUG("EvictBefore(aOffset=%" PRIu64 ")", aOffset);
123
0
124
0
  mInputBuffer.EvictBefore(aOffset, aRv);
125
0
}
126
127
uint32_t
128
SourceBufferResource::EvictAll()
129
0
{
130
0
  MOZ_ASSERT(OnTaskQueue());
131
0
  SBR_DEBUG("EvictAll()");
132
0
  return mInputBuffer.EvictAll();
133
0
}
134
135
void
136
SourceBufferResource::AppendData(MediaByteBuffer* aData)
137
0
{
138
0
  MOZ_ASSERT(OnTaskQueue());
139
0
  SBR_DEBUG("AppendData(aData=%p, aLength=%zu)",
140
0
            aData->Elements(), aData->Length());
141
0
  mInputBuffer.AppendItem(aData);
142
0
  mEnded = false;
143
0
}
144
145
void
146
SourceBufferResource::Ended()
147
0
{
148
0
  MOZ_ASSERT(OnTaskQueue());
149
0
  SBR_DEBUG("");
150
0
  mEnded = true;
151
0
}
152
153
SourceBufferResource::~SourceBufferResource()
154
0
{
155
0
  SBR_DEBUG("");
156
0
}
157
158
SourceBufferResource::SourceBufferResource()
159
#if defined(DEBUG)
160
  : mTaskQueue(AbstractThread::GetCurrent()->AsTaskQueue())
161
#endif
162
0
{
163
0
  SBR_DEBUG("");
164
0
}
165
166
#if defined(DEBUG)
167
AbstractThread*
168
SourceBufferResource::GetTaskQueue() const
169
{
170
  return mTaskQueue;
171
}
172
bool
173
SourceBufferResource::OnTaskQueue() const
174
{
175
  return !GetTaskQueue() || GetTaskQueue()->IsCurrentThreadIn();
176
}
177
#endif
178
179
#undef SBR_DEBUG
180
#undef SBR_DEBUGV
181
} // namespace mozilla