Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(500)

Side by Side Diff: Source/modules/mediasource/MediaSource.cpp

Issue 1306613002: Keep auxilliary media objects on the heap always. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/modules/mediasource/MediaSource.h ('k') | Source/modules/mediasource/SourceBuffer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * 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 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 { 293 {
294 ASSERT(m_isAddedToRegistry); 294 ASSERT(m_isAddedToRegistry);
295 m_isAddedToRegistry = false; 295 m_isAddedToRegistry = false;
296 } 296 }
297 297
298 double MediaSource::duration() const 298 double MediaSource::duration() const
299 { 299 {
300 return isClosed() ? std::numeric_limits<float>::quiet_NaN() : m_webMediaSour ce->duration(); 300 return isClosed() ? std::numeric_limits<float>::quiet_NaN() : m_webMediaSour ce->duration();
301 } 301 }
302 302
303 PassRefPtrWillBeRawPtr<TimeRanges> MediaSource::buffered() const 303 TimeRanges* MediaSource::buffered() const
304 { 304 {
305 // Implements MediaSource algorithm for HTMLMediaElement.buffered. 305 // Implements MediaSource algorithm for HTMLMediaElement.buffered.
306 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#htmlmediaelement-extensions 306 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#htmlmediaelement-extensions
307 WillBeHeapVector<RefPtrWillBeMember<TimeRanges>> ranges(m_activeSourceBuffer s->length()); 307 HeapVector<Member<TimeRanges>> ranges(m_activeSourceBuffers->length());
308 for (size_t i = 0; i < m_activeSourceBuffers->length(); ++i) 308 for (size_t i = 0; i < m_activeSourceBuffers->length(); ++i)
309 ranges[i] = m_activeSourceBuffers->item(i)->buffered(ASSERT_NO_EXCEPTION ); 309 ranges[i] = m_activeSourceBuffers->item(i)->buffered(ASSERT_NO_EXCEPTION );
310 310
311 // 1. If activeSourceBuffers.length equals 0 then return an empty TimeRanges object and abort these steps. 311 // 1. If activeSourceBuffers.length equals 0 then return an empty TimeRanges object and abort these steps.
312 if (ranges.isEmpty()) 312 if (ranges.isEmpty())
313 return TimeRanges::create(); 313 return TimeRanges::create();
314 314
315 // 2. Let active ranges be the ranges returned by buffered for each SourceBu ffer object in activeSourceBuffers. 315 // 2. Let active ranges be the ranges returned by buffered for each SourceBu ffer object in activeSourceBuffers.
316 // 3. Let highest end time be the largest range end time in the active range s. 316 // 3. Let highest end time be the largest range end time in the active range s.
317 double highestEndTime = -1; 317 double highestEndTime = -1;
318 for (size_t i = 0; i < ranges.size(); ++i) { 318 for (size_t i = 0; i < ranges.size(); ++i) {
319 unsigned length = ranges[i]->length(); 319 unsigned length = ranges[i]->length();
320 if (length) 320 if (length)
321 highestEndTime = std::max(highestEndTime, ranges[i]->end(length - 1, ASSERT_NO_EXCEPTION)); 321 highestEndTime = std::max(highestEndTime, ranges[i]->end(length - 1, ASSERT_NO_EXCEPTION));
322 } 322 }
323 323
324 // Return an empty range if all ranges are empty. 324 // Return an empty range if all ranges are empty.
325 if (highestEndTime < 0) 325 if (highestEndTime < 0)
326 return TimeRanges::create(); 326 return TimeRanges::create();
327 327
328 // 4. Let intersection ranges equal a TimeRange object containing a single r ange from 0 to highest end time. 328 // 4. Let intersection ranges equal a TimeRange object containing a single r ange from 0 to highest end time.
329 RefPtrWillBeRawPtr<TimeRanges> intersectionRanges = TimeRanges::create(0, hi ghestEndTime); 329 TimeRanges* intersectionRanges = TimeRanges::create(0, highestEndTime);
330 330
331 // 5. For each SourceBuffer object in activeSourceBuffers run the following steps: 331 // 5. For each SourceBuffer object in activeSourceBuffers run the following steps:
332 bool ended = readyState() == endedKeyword(); 332 bool ended = readyState() == endedKeyword();
333 for (size_t i = 0; i < ranges.size(); ++i) { 333 for (size_t i = 0; i < ranges.size(); ++i) {
334 // 5.1 Let source ranges equal the ranges returned by the buffered attri bute on the current SourceBuffer. 334 // 5.1 Let source ranges equal the ranges returned by the buffered attri bute on the current SourceBuffer.
335 TimeRanges* sourceRanges = ranges[i].get(); 335 TimeRanges* sourceRanges = ranges[i].get();
336 336
337 // 5.2 If readyState is "ended", then set the end time on the last range in source ranges to highest end time. 337 // 5.2 If readyState is "ended", then set the end time on the last range in source ranges to highest end time.
338 if (ended && sourceRanges->length()) 338 if (ended && sourceRanges->length())
339 sourceRanges->add(sourceRanges->start(sourceRanges->length() - 1, AS SERT_NO_EXCEPTION), highestEndTime); 339 sourceRanges->add(sourceRanges->start(sourceRanges->length() - 1, AS SERT_NO_EXCEPTION), highestEndTime);
340 340
341 // 5.3 Let new intersection ranges equal the the intersection between th e intersection ranges and the source ranges. 341 // 5.3 Let new intersection ranges equal the the intersection between th e intersection ranges and the source ranges.
342 // 5.4 Replace the ranges in intersection ranges with the new intersecti on ranges. 342 // 5.4 Replace the ranges in intersection ranges with the new intersecti on ranges.
343 intersectionRanges->intersectWith(sourceRanges); 343 intersectionRanges->intersectWith(sourceRanges);
344 } 344 }
345 345
346 return intersectionRanges.release(); 346 return intersectionRanges;
347 } 347 }
348 348
349 PassRefPtrWillBeRawPtr<TimeRanges> MediaSource::seekable() const 349 TimeRanges* MediaSource::seekable() const
350 { 350 {
351 // Implements MediaSource algorithm for HTMLMediaElement.seekable. 351 // Implements MediaSource algorithm for HTMLMediaElement.seekable.
352 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#htmlmediaelement-extensions 352 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#htmlmediaelement-extensions
353 353
354 double sourceDuration = duration(); 354 double sourceDuration = duration();
355 // If duration equals NaN: Return an empty TimeRanges object. 355 // If duration equals NaN: Return an empty TimeRanges object.
356 if (std::isnan(sourceDuration)) 356 if (std::isnan(sourceDuration))
357 return TimeRanges::create(); 357 return TimeRanges::create();
358 358
359 // If duration equals positive Infinity: 359 // If duration equals positive Infinity:
360 if (sourceDuration == std::numeric_limits<double>::infinity()) { 360 if (sourceDuration == std::numeric_limits<double>::infinity()) {
361 RefPtrWillBeRawPtr<TimeRanges> buffered = m_attachedElement->buffered(); 361 TimeRanges* buffered = m_attachedElement->buffered();
362 362
363 // 1. If the HTMLMediaElement.buffered attribute returns an empty TimeRa nges object, then 363 // 1. If the HTMLMediaElement.buffered attribute returns an empty TimeRa nges object, then
364 // return an empty TimeRanges object and abort these steps. 364 // return an empty TimeRanges object and abort these steps.
365 if (buffered->length() == 0) 365 if (buffered->length() == 0)
366 return TimeRanges::create(); 366 return TimeRanges::create();
367 367
368 // 2. Return a single range with a start time of 0 and an end time equal to the highest end 368 // 2. Return a single range with a start time of 0 and an end time equal to the highest end
369 // time reported by the HTMLMediaElement.buffered attribute. 369 // time reported by the HTMLMediaElement.buffered attribute.
370 return TimeRanges::create(0, buffered->end(buffered->length() - 1, ASSER T_NO_EXCEPTION)); 370 return TimeRanges::create(0, buffered->end(buffered->length() - 1, ASSER T_NO_EXCEPTION));
371 } 371 }
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 598
599 m_asyncEventQueue->enqueueEvent(event.release()); 599 m_asyncEventQueue->enqueueEvent(event.release());
600 } 600 }
601 601
602 URLRegistry& MediaSource::registry() const 602 URLRegistry& MediaSource::registry() const
603 { 603 {
604 return MediaSourceRegistry::registry(); 604 return MediaSourceRegistry::registry();
605 } 605 }
606 606
607 } // namespace blink 607 } // namespace blink
OLDNEW
« no previous file with comments | « Source/modules/mediasource/MediaSource.h ('k') | Source/modules/mediasource/SourceBuffer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698