OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * Copyright (C) 2011, 2012 Ericsson AB. All rights reserved. | 3 * Copyright (C) 2011, 2012 Ericsson AB. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
48 static void processTrack(MediaStreamTrack* track, MediaStreamTrackVector& trackV ector) | 48 static void processTrack(MediaStreamTrack* track, MediaStreamTrackVector& trackV ector) |
49 { | 49 { |
50 if (track->ended()) | 50 if (track->ended()) |
51 return; | 51 return; |
52 | 52 |
53 MediaStreamSource* source = track->component()->source(); | 53 MediaStreamSource* source = track->component()->source(); |
54 if (!containsSource(trackVector, source)) | 54 if (!containsSource(trackVector, source)) |
55 trackVector.append(track); | 55 trackVector.append(track); |
56 } | 56 } |
57 | 57 |
58 PassRefPtr<MediaStream> MediaStream::create(ExecutionContext* context) | 58 PassRefPtrWillBeRawPtr<MediaStream> MediaStream::create(ExecutionContext* contex t) |
59 { | 59 { |
60 MediaStreamTrackVector audioTracks; | 60 MediaStreamTrackVector audioTracks; |
61 MediaStreamTrackVector videoTracks; | 61 MediaStreamTrackVector videoTracks; |
62 | 62 |
63 return adoptRef(new MediaStream(context, audioTracks, videoTracks)); | 63 return adoptRefWillBeRefCountedGarbageCollected(new MediaStream(context, aud ioTracks, videoTracks)); |
64 } | 64 } |
65 | 65 |
66 PassRefPtr<MediaStream> MediaStream::create(ExecutionContext* context, PassRefPt r<MediaStream> stream) | 66 PassRefPtrWillBeRawPtr<MediaStream> MediaStream::create(ExecutionContext* contex t, PassRefPtrWillBeRawPtr<MediaStream> stream) |
67 { | 67 { |
68 ASSERT(stream); | 68 ASSERT(stream); |
69 | 69 |
70 MediaStreamTrackVector audioTracks; | 70 MediaStreamTrackVector audioTracks; |
71 MediaStreamTrackVector videoTracks; | 71 MediaStreamTrackVector videoTracks; |
72 | 72 |
73 for (size_t i = 0; i < stream->m_audioTracks.size(); ++i) | 73 for (size_t i = 0; i < stream->m_audioTracks.size(); ++i) |
74 processTrack(stream->m_audioTracks[i].get(), audioTracks); | 74 processTrack(stream->m_audioTracks[i].get(), audioTracks); |
75 | 75 |
76 for (size_t i = 0; i < stream->m_videoTracks.size(); ++i) | 76 for (size_t i = 0; i < stream->m_videoTracks.size(); ++i) |
77 processTrack(stream->m_videoTracks[i].get(), videoTracks); | 77 processTrack(stream->m_videoTracks[i].get(), videoTracks); |
78 | 78 |
79 return adoptRef(new MediaStream(context, audioTracks, videoTracks)); | 79 return adoptRefWillBeRefCountedGarbageCollected(new MediaStream(context, aud ioTracks, videoTracks)); |
80 } | 80 } |
81 | 81 |
82 PassRefPtr<MediaStream> MediaStream::create(ExecutionContext* context, const Med iaStreamTrackVector& tracks) | 82 PassRefPtrWillBeRawPtr<MediaStream> MediaStream::create(ExecutionContext* contex t, const MediaStreamTrackVector& tracks) |
83 { | 83 { |
84 MediaStreamTrackVector audioTracks; | 84 MediaStreamTrackVector audioTracks; |
85 MediaStreamTrackVector videoTracks; | 85 MediaStreamTrackVector videoTracks; |
86 | 86 |
87 for (size_t i = 0; i < tracks.size(); ++i) | 87 for (size_t i = 0; i < tracks.size(); ++i) |
88 processTrack(tracks[i].get(), tracks[i]->kind() == "audio" ? audioTracks : videoTracks); | 88 processTrack(tracks[i].get(), tracks[i]->kind() == "audio" ? audioTracks : videoTracks); |
89 | 89 |
90 return adoptRef(new MediaStream(context, audioTracks, videoTracks)); | 90 return adoptRefWillBeRefCountedGarbageCollected(new MediaStream(context, aud ioTracks, videoTracks)); |
91 } | 91 } |
92 | 92 |
93 PassRefPtr<MediaStream> MediaStream::create(ExecutionContext* context, PassRefPt r<MediaStreamDescriptor> streamDescriptor) | 93 PassRefPtrWillBeRawPtr<MediaStream> MediaStream::create(ExecutionContext* contex t, PassRefPtr<MediaStreamDescriptor> streamDescriptor) |
94 { | 94 { |
95 return adoptRef(new MediaStream(context, streamDescriptor)); | 95 return adoptRefWillBeRefCountedGarbageCollected(new MediaStream(context, str eamDescriptor)); |
96 } | 96 } |
97 | 97 |
98 MediaStream::MediaStream(ExecutionContext* context, PassRefPtr<MediaStreamDescri ptor> streamDescriptor) | 98 MediaStream::MediaStream(ExecutionContext* context, PassRefPtr<MediaStreamDescri ptor> streamDescriptor) |
99 : ContextLifecycleObserver(context) | 99 : ContextLifecycleObserver(context) |
100 , m_stopped(false) | 100 , m_stopped(false) |
101 , m_descriptor(streamDescriptor) | 101 , m_descriptor(streamDescriptor) |
102 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired) | 102 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired) |
103 { | 103 { |
104 ScriptWrappable::init(this); | 104 ScriptWrappable::init(this); |
105 m_descriptor->setClient(this); | 105 m_descriptor->setClient(this); |
106 | 106 |
107 size_t numberOfAudioTracks = m_descriptor->numberOfAudioComponents(); | 107 size_t numberOfAudioTracks = m_descriptor->numberOfAudioComponents(); |
108 m_audioTracks.reserveCapacity(numberOfAudioTracks); | 108 m_audioTracks.reserveCapacity(numberOfAudioTracks); |
109 for (size_t i = 0; i < numberOfAudioTracks; i++) { | 109 for (size_t i = 0; i < numberOfAudioTracks; i++) { |
110 RefPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create(context, m_ descriptor->audioComponent(i)); | 110 RefPtrWillBeRawPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create (context, m_descriptor->audioComponent(i)); |
111 newTrack->addObserver(this); | 111 newTrack->addObserver(this); |
112 m_audioTracks.append(newTrack.release()); | 112 m_audioTracks.append(newTrack.release()); |
113 } | 113 } |
114 | 114 |
115 size_t numberOfVideoTracks = m_descriptor->numberOfVideoComponents(); | 115 size_t numberOfVideoTracks = m_descriptor->numberOfVideoComponents(); |
116 m_videoTracks.reserveCapacity(numberOfVideoTracks); | 116 m_videoTracks.reserveCapacity(numberOfVideoTracks); |
117 for (size_t i = 0; i < numberOfVideoTracks; i++) { | 117 for (size_t i = 0; i < numberOfVideoTracks; i++) { |
118 RefPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create(context, m_ descriptor->videoComponent(i)); | 118 RefPtrWillBeRawPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create (context, m_descriptor->videoComponent(i)); |
119 newTrack->addObserver(this); | 119 newTrack->addObserver(this); |
120 m_videoTracks.append(newTrack.release()); | 120 m_videoTracks.append(newTrack.release()); |
121 } | 121 } |
122 } | 122 } |
123 | 123 |
124 MediaStream::MediaStream(ExecutionContext* context, const MediaStreamTrackVector & audioTracks, const MediaStreamTrackVector& videoTracks) | 124 MediaStream::MediaStream(ExecutionContext* context, const MediaStreamTrackVector & audioTracks, const MediaStreamTrackVector& videoTracks) |
125 : ContextLifecycleObserver(context) | 125 : ContextLifecycleObserver(context) |
126 , m_stopped(false) | 126 , m_stopped(false) |
127 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired) | 127 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired) |
128 { | 128 { |
(...skipping 16 matching lines...) Expand all Loading... | |
145 m_descriptor->setClient(this); | 145 m_descriptor->setClient(this); |
146 MediaStreamCenter::instance().didCreateMediaStream(m_descriptor.get()); | 146 MediaStreamCenter::instance().didCreateMediaStream(m_descriptor.get()); |
147 | 147 |
148 m_audioTracks = audioTracks; | 148 m_audioTracks = audioTracks; |
149 m_videoTracks = videoTracks; | 149 m_videoTracks = videoTracks; |
150 } | 150 } |
151 | 151 |
152 MediaStream::~MediaStream() | 152 MediaStream::~MediaStream() |
153 { | 153 { |
154 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) | 154 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) |
155 (*iter)->removeObserver(this); | 155 (*iter)->removeObserver(this); |
haraken
2014/04/08 04:42:35
You cannot touch the track vector because the vect
keishi
2014/04/11 20:03:06
Done.
| |
156 | 156 |
157 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) | 157 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) |
158 (*iter)->removeObserver(this); | 158 (*iter)->removeObserver(this); |
haraken
2014/04/08 04:42:35
Ditto. You need to remove this code by making Medi
keishi
2014/04/11 20:03:06
Done.
| |
159 | 159 |
160 m_descriptor->setClient(0); | 160 m_descriptor->setClient(0); |
161 } | 161 } |
162 | 162 |
163 bool MediaStream::ended() const | 163 bool MediaStream::ended() const |
164 { | 164 { |
165 return m_stopped || m_descriptor->ended(); | 165 return m_stopped || m_descriptor->ended(); |
166 } | 166 } |
167 | 167 |
168 void MediaStream::addTrack(PassRefPtr<MediaStreamTrack> prpTrack, ExceptionState & exceptionState) | 168 void MediaStream::addTrack(PassRefPtrWillBeRawPtr<MediaStreamTrack> prpTrack, Ex ceptionState& exceptionState) |
169 { | 169 { |
170 if (ended()) { | 170 if (ended()) { |
171 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is finished."); | 171 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is finished."); |
172 return; | 172 return; |
173 } | 173 } |
174 | 174 |
175 if (!prpTrack) { | 175 if (!prpTrack) { |
176 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid."); | 176 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid."); |
177 return; | 177 return; |
178 } | 178 } |
179 | 179 |
180 RefPtr<MediaStreamTrack> track = prpTrack; | 180 RefPtrWillBeRawPtr<MediaStreamTrack> track = prpTrack; |
181 | 181 |
182 if (getTrackById(track->id())) | 182 if (getTrackById(track->id())) |
183 return; | 183 return; |
184 | 184 |
185 switch (track->component()->source()->type()) { | 185 switch (track->component()->source()->type()) { |
186 case MediaStreamSource::TypeAudio: | 186 case MediaStreamSource::TypeAudio: |
187 m_audioTracks.append(track); | 187 m_audioTracks.append(track); |
188 break; | 188 break; |
189 case MediaStreamSource::TypeVideo: | 189 case MediaStreamSource::TypeVideo: |
190 m_videoTracks.append(track); | 190 m_videoTracks.append(track); |
191 break; | 191 break; |
192 } | 192 } |
193 track->addObserver(this); | 193 track->addObserver(this); |
194 m_descriptor->addComponent(track->component()); | 194 m_descriptor->addComponent(track->component()); |
195 MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), tra ck->component()); | 195 MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), tra ck->component()); |
196 } | 196 } |
197 | 197 |
198 void MediaStream::removeTrack(PassRefPtr<MediaStreamTrack> prpTrack, ExceptionSt ate& exceptionState) | 198 void MediaStream::removeTrack(PassRefPtrWillBeRawPtr<MediaStreamTrack> prpTrack, ExceptionState& exceptionState) |
199 { | 199 { |
200 if (ended()) { | 200 if (ended()) { |
201 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is finished."); | 201 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is finished."); |
202 return; | 202 return; |
203 } | 203 } |
204 | 204 |
205 if (!prpTrack) { | 205 if (!prpTrack) { |
206 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid."); | 206 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac k provided is invalid."); |
207 return; | 207 return; |
208 } | 208 } |
209 | 209 |
210 RefPtr<MediaStreamTrack> track = prpTrack; | 210 RefPtrWillBeRawPtr<MediaStreamTrack> track = prpTrack; |
211 | 211 |
212 size_t pos = kNotFound; | 212 size_t pos = kNotFound; |
213 switch (track->component()->source()->type()) { | 213 switch (track->component()->source()->type()) { |
214 case MediaStreamSource::TypeAudio: | 214 case MediaStreamSource::TypeAudio: |
215 pos = m_audioTracks.find(track); | 215 pos = m_audioTracks.find(track); |
216 if (pos != kNotFound) | 216 if (pos != kNotFound) |
217 m_audioTracks.remove(pos); | 217 m_audioTracks.remove(pos); |
218 break; | 218 break; |
219 case MediaStreamSource::TypeVideo: | 219 case MediaStreamSource::TypeVideo: |
220 pos = m_videoTracks.find(track); | 220 pos = m_videoTracks.find(track); |
(...skipping 22 matching lines...) Expand all Loading... | |
243 } | 243 } |
244 | 244 |
245 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) { | 245 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) { |
246 if ((*iter)->id() == id) | 246 if ((*iter)->id() == id) |
247 return (*iter).get(); | 247 return (*iter).get(); |
248 } | 248 } |
249 | 249 |
250 return 0; | 250 return 0; |
251 } | 251 } |
252 | 252 |
253 PassRefPtr<MediaStream> MediaStream::clone(ExecutionContext* context) | 253 PassRefPtrWillBeRawPtr<MediaStream> MediaStream::clone(ExecutionContext* context ) |
254 { | 254 { |
255 MediaStreamTrackVector tracks; | 255 MediaStreamTrackVector tracks; |
256 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) | 256 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter != m_audioTracks.end(); ++iter) |
257 tracks.append((*iter)->clone(context)); | 257 tracks.append((*iter)->clone(context)); |
258 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) | 258 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter != m_videoTracks.end(); ++iter) |
259 tracks.append((*iter)->clone(context)); | 259 tracks.append((*iter)->clone(context)); |
260 RefPtr<MediaStream> clonedStream = MediaStream::create(context, tracks); | 260 RefPtrWillBeRawPtr<MediaStream> clonedStream = MediaStream::create(context, tracks); |
sof
2014/04/07 14:22:16
No need to bind this to 'clonedStream' before retu
keishi
2014/04/11 20:03:06
Done.
| |
261 return clonedStream.release(); | 261 return clonedStream.release(); |
262 } | 262 } |
263 | 263 |
264 void MediaStream::stop() | 264 void MediaStream::stop() |
265 { | 265 { |
266 if (ended()) | 266 if (ended()) |
267 return; | 267 return; |
268 | 268 |
269 MediaStreamCenter::instance().didStopLocalMediaStream(descriptor()); | 269 MediaStreamCenter::instance().didStopLocalMediaStream(descriptor()); |
270 | 270 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
310 { | 310 { |
311 return ContextLifecycleObserver::executionContext(); | 311 return ContextLifecycleObserver::executionContext(); |
312 } | 312 } |
313 | 313 |
314 void MediaStream::addRemoteTrack(MediaStreamComponent* component) | 314 void MediaStream::addRemoteTrack(MediaStreamComponent* component) |
315 { | 315 { |
316 ASSERT(component); | 316 ASSERT(component); |
317 if (ended()) | 317 if (ended()) |
318 return; | 318 return; |
319 | 319 |
320 RefPtr<MediaStreamTrack> track = MediaStreamTrack::create(executionContext() , component); | 320 RefPtrWillBeRawPtr<MediaStreamTrack> track = MediaStreamTrack::create(execut ionContext(), component); |
321 switch (component->source()->type()) { | 321 switch (component->source()->type()) { |
322 case MediaStreamSource::TypeAudio: | 322 case MediaStreamSource::TypeAudio: |
323 m_audioTracks.append(track); | 323 m_audioTracks.append(track); |
324 break; | 324 break; |
325 case MediaStreamSource::TypeVideo: | 325 case MediaStreamSource::TypeVideo: |
326 m_videoTracks.append(track); | 326 m_videoTracks.append(track); |
327 break; | 327 break; |
328 } | 328 } |
329 track->addObserver(this); | 329 track->addObserver(this); |
330 m_descriptor->addComponent(component); | 330 m_descriptor->addComponent(component); |
(...skipping 21 matching lines...) Expand all Loading... | |
352 if ((*tracks)[i]->component() == component) { | 352 if ((*tracks)[i]->component() == component) { |
353 index = i; | 353 index = i; |
354 break; | 354 break; |
355 } | 355 } |
356 } | 356 } |
357 if (index == kNotFound) | 357 if (index == kNotFound) |
358 return; | 358 return; |
359 | 359 |
360 m_descriptor->removeComponent(component); | 360 m_descriptor->removeComponent(component); |
361 | 361 |
362 RefPtr<MediaStreamTrack> track = (*tracks)[index]; | 362 RefPtrWillBeRawPtr<MediaStreamTrack> track = (*tracks)[index]; |
363 track->removeObserver(this); | 363 track->removeObserver(this); |
364 tracks->remove(index); | 364 tracks->remove(index); |
365 scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::removetr ack, false, false, track)); | 365 scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::removetr ack, false, false, track)); |
366 } | 366 } |
367 | 367 |
368 void MediaStream::scheduleDispatchEvent(PassRefPtrWillBeRawPtr<Event> event) | 368 void MediaStream::scheduleDispatchEvent(PassRefPtrWillBeRawPtr<Event> event) |
369 { | 369 { |
370 m_scheduledEvents.append(event); | 370 m_scheduledEvents.append(event); |
371 | 371 |
372 if (!m_scheduledEventTimer.isActive()) | 372 if (!m_scheduledEventTimer.isActive()) |
(...skipping 13 matching lines...) Expand all Loading... | |
386 dispatchEvent((*it).release()); | 386 dispatchEvent((*it).release()); |
387 | 387 |
388 events.clear(); | 388 events.clear(); |
389 } | 389 } |
390 | 390 |
391 URLRegistry& MediaStream::registry() const | 391 URLRegistry& MediaStream::registry() const |
392 { | 392 { |
393 return MediaStreamRegistry::registry(); | 393 return MediaStreamRegistry::registry(); |
394 } | 394 } |
395 | 395 |
396 void MediaStream::trace(Visitor* visitor) | |
397 { | |
398 visitor->trace(m_audioTracks); | |
399 visitor->trace(m_videoTracks); | |
400 visitor->trace(m_scheduledEvents); | |
401 } | |
402 | |
396 } // namespace WebCore | 403 } // namespace WebCore |
OLD | NEW |