OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/media/websourcebuffer_impl.h" | 5 #include "media/blink/websourcebuffer_impl.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/float_util.h" | 9 #include "base/float_util.h" |
10 #include "media/filters/chunk_demuxer.h" | 10 #include "media/filters/chunk_demuxer.h" |
11 | 11 |
12 namespace content { | 12 namespace media { |
13 | 13 |
14 static base::TimeDelta DoubleToTimeDelta(double time) { | 14 static base::TimeDelta DoubleToTimeDelta(double time) { |
15 DCHECK(!base::IsNaN(time)); | 15 DCHECK(!base::IsNaN(time)); |
16 DCHECK_NE(time, -std::numeric_limits<double>::infinity()); | 16 DCHECK_NE(time, -std::numeric_limits<double>::infinity()); |
17 | 17 |
18 if (time == std::numeric_limits<double>::infinity()) | 18 if (time == std::numeric_limits<double>::infinity()) |
19 return media::kInfiniteDuration(); | 19 return kInfiniteDuration(); |
20 | 20 |
21 // Don't use base::TimeDelta::Max() here, as we want the largest finite time | 21 // Don't use base::TimeDelta::Max() here, as we want the largest finite time |
22 // delta. | 22 // delta. |
23 base::TimeDelta max_time = base::TimeDelta::FromInternalValue(kint64max - 1); | 23 base::TimeDelta max_time = base::TimeDelta::FromInternalValue(kint64max - 1); |
24 double max_time_in_seconds = max_time.InSecondsF(); | 24 double max_time_in_seconds = max_time.InSecondsF(); |
25 | 25 |
26 if (time >= max_time_in_seconds) | 26 if (time >= max_time_in_seconds) |
27 return max_time; | 27 return max_time; |
28 | 28 |
29 return base::TimeDelta::FromMicroseconds( | 29 return base::TimeDelta::FromMicroseconds( |
30 time * base::Time::kMicrosecondsPerSecond); | 30 time * base::Time::kMicrosecondsPerSecond); |
31 } | 31 } |
32 | 32 |
33 WebSourceBufferImpl::WebSourceBufferImpl( | 33 WebSourceBufferImpl::WebSourceBufferImpl( |
34 const std::string& id, media::ChunkDemuxer* demuxer) | 34 const std::string& id, ChunkDemuxer* demuxer) |
35 : id_(id), | 35 : id_(id), |
36 demuxer_(demuxer), | 36 demuxer_(demuxer), |
37 append_window_end_(media::kInfiniteDuration()) { | 37 append_window_end_(kInfiniteDuration()) { |
38 DCHECK(demuxer_); | 38 DCHECK(demuxer_); |
39 } | 39 } |
40 | 40 |
41 WebSourceBufferImpl::~WebSourceBufferImpl() { | 41 WebSourceBufferImpl::~WebSourceBufferImpl() { |
42 DCHECK(!demuxer_) << "Object destroyed w/o removedFromMediaSource() call"; | 42 DCHECK(!demuxer_) << "Object destroyed w/o removedFromMediaSource() call"; |
43 } | 43 } |
44 | 44 |
45 bool WebSourceBufferImpl::setMode(WebSourceBuffer::AppendMode mode) { | 45 bool WebSourceBufferImpl::setMode(WebSourceBuffer::AppendMode mode) { |
46 if (demuxer_->IsParsingMediaSegment(id_)) | 46 if (demuxer_->IsParsingMediaSegment(id_)) |
47 return false; | 47 return false; |
48 | 48 |
49 switch (mode) { | 49 switch (mode) { |
50 case WebSourceBuffer::AppendModeSegments: | 50 case WebSourceBuffer::AppendModeSegments: |
51 demuxer_->SetSequenceMode(id_, false); | 51 demuxer_->SetSequenceMode(id_, false); |
52 return true; | 52 return true; |
53 case WebSourceBuffer::AppendModeSequence: | 53 case WebSourceBuffer::AppendModeSequence: |
54 demuxer_->SetSequenceMode(id_, true); | 54 demuxer_->SetSequenceMode(id_, true); |
55 return true; | 55 return true; |
56 } | 56 } |
57 | 57 |
58 NOTREACHED(); | 58 NOTREACHED(); |
59 return false; | 59 return false; |
60 } | 60 } |
61 | 61 |
62 blink::WebTimeRanges WebSourceBufferImpl::buffered() { | 62 blink::WebTimeRanges WebSourceBufferImpl::buffered() { |
63 media::Ranges<base::TimeDelta> ranges = demuxer_->GetBufferedRanges(id_); | 63 Ranges<base::TimeDelta> ranges = demuxer_->GetBufferedRanges(id_); |
64 blink::WebTimeRanges result(ranges.size()); | 64 blink::WebTimeRanges result(ranges.size()); |
65 for (size_t i = 0; i < ranges.size(); i++) { | 65 for (size_t i = 0; i < ranges.size(); i++) { |
66 result[i].start = ranges.start(i).InSecondsF(); | 66 result[i].start = ranges.start(i).InSecondsF(); |
67 result[i].end = ranges.end(i).InSecondsF(); | 67 result[i].end = ranges.end(i).InSecondsF(); |
68 } | 68 } |
69 return result; | 69 return result; |
70 } | 70 } |
71 | 71 |
72 void WebSourceBufferImpl::append( | 72 void WebSourceBufferImpl::append( |
73 const unsigned char* data, | 73 const unsigned char* data, |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 void WebSourceBufferImpl::setAppendWindowEnd(double end) { | 124 void WebSourceBufferImpl::setAppendWindowEnd(double end) { |
125 DCHECK_GE(end, 0); | 125 DCHECK_GE(end, 0); |
126 append_window_end_ = DoubleToTimeDelta(end); | 126 append_window_end_ = DoubleToTimeDelta(end); |
127 } | 127 } |
128 | 128 |
129 void WebSourceBufferImpl::removedFromMediaSource() { | 129 void WebSourceBufferImpl::removedFromMediaSource() { |
130 demuxer_->RemoveId(id_); | 130 demuxer_->RemoveId(id_); |
131 demuxer_ = NULL; | 131 demuxer_ = NULL; |
132 } | 132 } |
133 | 133 |
134 } // namespace content | 134 } // namespace media |
OLD | NEW |