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

Side by Side Diff: media/filters/chunk_demuxer.cc

Issue 10669022: Add status parameter to DemuxerStream::ReadCB (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 6 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "media/filters/chunk_demuxer.h" 5 #include "media/filters/chunk_demuxer.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/string_util.h" 10 #include "base/string_util.h"
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 DVLOG(1) << "StartWaitingForSeek()"; 240 DVLOG(1) << "StartWaitingForSeek()";
241 ReadCBQueue read_cbs; 241 ReadCBQueue read_cbs;
242 { 242 {
243 base::AutoLock auto_lock(lock_); 243 base::AutoLock auto_lock(lock_);
244 ChangeState_Locked(WAITING_FOR_SEEK); 244 ChangeState_Locked(WAITING_FOR_SEEK);
245 245
246 std::swap(read_cbs_, read_cbs); 246 std::swap(read_cbs_, read_cbs);
247 } 247 }
248 248
249 for (ReadCBQueue::iterator it = read_cbs.begin(); it != read_cbs.end(); ++it) 249 for (ReadCBQueue::iterator it = read_cbs.begin(); it != read_cbs.end(); ++it)
250 it->Run(NULL); 250 it->Run(kAborted, NULL);
251 } 251 }
252 252
253 void ChunkDemuxerStream::Seek(TimeDelta time) { 253 void ChunkDemuxerStream::Seek(TimeDelta time) {
254 base::AutoLock auto_lock(lock_); 254 base::AutoLock auto_lock(lock_);
255 255
256 DCHECK(read_cbs_.empty()); 256 DCHECK(read_cbs_.empty());
257 257
258 stream_->Seek(time); 258 stream_->Seek(time);
259 259
260 if (state_ == WAITING_FOR_SEEK) 260 if (state_ == WAITING_FOR_SEEK)
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 ReadCBQueue read_cbs; 367 ReadCBQueue read_cbs;
368 { 368 {
369 base::AutoLock auto_lock(lock_); 369 base::AutoLock auto_lock(lock_);
370 ChangeState_Locked(SHUTDOWN); 370 ChangeState_Locked(SHUTDOWN);
371 std::swap(read_cbs_, read_cbs); 371 std::swap(read_cbs_, read_cbs);
372 } 372 }
373 373
374 // Pass end of stream buffers to all callbacks to signal that no more data 374 // Pass end of stream buffers to all callbacks to signal that no more data
375 // will be sent. 375 // will be sent.
376 for (ReadCBQueue::iterator it = read_cbs.begin(); it != read_cbs.end(); ++it) 376 for (ReadCBQueue::iterator it = read_cbs.begin(); it != read_cbs.end(); ++it)
377 it->Run(StreamParserBuffer::CreateEOSBuffer()); 377 it->Run(DemuxerStream::kOk, StreamParserBuffer::CreateEOSBuffer());
378 } 378 }
379 379
380 // Helper function that makes sure |read_cb| runs on |message_loop|. 380 // Helper function that makes sure |read_cb| runs on |message_loop|.
381 static void RunOnMessageLoop(const DemuxerStream::ReadCB& read_cb, 381 static void RunOnMessageLoop(const DemuxerStream::ReadCB& read_cb,
382 MessageLoop* message_loop, 382 MessageLoop* message_loop,
383 DemuxerStream::Status status,
383 const scoped_refptr<DecoderBuffer>& buffer) { 384 const scoped_refptr<DecoderBuffer>& buffer) {
384 if (MessageLoop::current() != message_loop) { 385 if (MessageLoop::current() != message_loop) {
385 message_loop->PostTask(FROM_HERE, base::Bind( 386 message_loop->PostTask(FROM_HERE, base::Bind(
386 &RunOnMessageLoop, read_cb, message_loop, buffer)); 387 &RunOnMessageLoop, read_cb, message_loop, status, buffer));
387 return; 388 return;
388 } 389 }
389 390
390 read_cb.Run(buffer); 391 read_cb.Run(status, buffer);
391 } 392 }
392 393
393 // DemuxerStream methods. 394 // DemuxerStream methods.
394 void ChunkDemuxerStream::Read(const ReadCB& read_cb) { 395 void ChunkDemuxerStream::Read(const ReadCB& read_cb) {
396 DemuxerStream::Status status = kOk;
395 scoped_refptr<StreamParserBuffer> buffer; 397 scoped_refptr<StreamParserBuffer> buffer;
396 { 398 {
397 base::AutoLock auto_lock(lock_); 399 base::AutoLock auto_lock(lock_);
398 400
399 switch (state_) { 401 switch (state_) {
400 case RETURNING_DATA_FOR_READS: 402 case RETURNING_DATA_FOR_READS:
401 // If we already have pending reads or we don't have any buffers ready, 403 // If we already have pending reads or we don't have any buffers ready,
402 // then defer this read. 404 // then defer this read.
403 if (!read_cbs_.empty() || !stream_->GetNextBuffer(&buffer)) { 405 if (!read_cbs_.empty() || !stream_->GetNextBuffer(&buffer)) {
404 DeferRead_Locked(read_cb); 406 DeferRead_Locked(read_cb);
405 return; 407 return;
406 } 408 }
407 break; 409 break;
408 case WAITING_FOR_SEEK: 410 case WAITING_FOR_SEEK:
409 // Null buffers should be returned in this state since we are waiting 411 // Null buffers should be returned in this state since we are waiting
410 // for a seek. Any buffers in the SourceBuffer should NOT be returned 412 // for a seek. Any buffers in the SourceBuffer should NOT be returned
411 // because they are associated with the seek. 413 // because they are associated with the seek.
412 DCHECK(read_cbs_.empty()); 414 DCHECK(read_cbs_.empty());
415 status = kAborted;
413 break; 416 break;
414 case SHUTDOWN: 417 case SHUTDOWN:
415 DCHECK(read_cbs_.empty()); 418 DCHECK(read_cbs_.empty());
416 buffer = StreamParserBuffer::CreateEOSBuffer(); 419 buffer = StreamParserBuffer::CreateEOSBuffer();
417 } 420 }
418 } 421 }
419 422
420 read_cb.Run(buffer); 423 read_cb.Run(status, buffer);
421 } 424 }
422 425
423 DemuxerStream::Type ChunkDemuxerStream::type() { return type_; } 426 DemuxerStream::Type ChunkDemuxerStream::type() { return type_; }
424 427
425 void ChunkDemuxerStream::EnableBitstreamConverter() {} 428 void ChunkDemuxerStream::EnableBitstreamConverter() {}
426 429
427 const AudioDecoderConfig& ChunkDemuxerStream::audio_decoder_config() { 430 const AudioDecoderConfig& ChunkDemuxerStream::audio_decoder_config() {
428 CHECK_EQ(type_, AUDIO); 431 CHECK_EQ(type_, AUDIO);
429 base::AutoLock auto_lock(lock_); 432 base::AutoLock auto_lock(lock_);
430 return stream_->GetCurrentAudioDecoderConfig(); 433 return stream_->GetCurrentAudioDecoderConfig();
(...skipping 23 matching lines...) Expand all
454 void ChunkDemuxerStream::CreateReadDoneClosures_Locked(ClosureQueue* closures) { 457 void ChunkDemuxerStream::CreateReadDoneClosures_Locked(ClosureQueue* closures) {
455 lock_.AssertAcquired(); 458 lock_.AssertAcquired();
456 459
457 if (state_ != RETURNING_DATA_FOR_READS) 460 if (state_ != RETURNING_DATA_FOR_READS)
458 return; 461 return;
459 462
460 scoped_refptr<StreamParserBuffer> buffer; 463 scoped_refptr<StreamParserBuffer> buffer;
461 while (!read_cbs_.empty()) { 464 while (!read_cbs_.empty()) {
462 if (!stream_->GetNextBuffer(&buffer)) 465 if (!stream_->GetNextBuffer(&buffer))
463 return; 466 return;
464 closures->push_back(base::Bind(read_cbs_.front(), buffer)); 467 closures->push_back(base::Bind(read_cbs_.front(),
468 DemuxerStream::kOk, buffer));
465 read_cbs_.pop_front(); 469 read_cbs_.pop_front();
466 } 470 }
467 } 471 }
468 472
469 ChunkDemuxer::ChunkDemuxer(ChunkDemuxerClient* client) 473 ChunkDemuxer::ChunkDemuxer(ChunkDemuxerClient* client)
470 : state_(WAITING_FOR_INIT), 474 : state_(WAITING_FOR_INIT),
471 host_(NULL), 475 host_(NULL),
472 client_(client) { 476 client_(client) {
473 DCHECK(client); 477 DCHECK(client);
474 } 478 }
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after
994 // TODO(vrk): There should be a special case for the first appends where all 998 // TODO(vrk): There should be a special case for the first appends where all
995 // streams (for both demuxed and muxed case) begin at the earliest stream 999 // streams (for both demuxed and muxed case) begin at the earliest stream
996 // timestamp. (crbug.com/132815) 1000 // timestamp. (crbug.com/132815)
997 if (audio_ && source_id == source_id_audio_) 1001 if (audio_ && source_id == source_id_audio_)
998 audio_->OnNewMediaSegment(start_timestamp); 1002 audio_->OnNewMediaSegment(start_timestamp);
999 if (video_ && source_id == source_id_video_) 1003 if (video_ && source_id == source_id_video_)
1000 video_->OnNewMediaSegment(start_timestamp); 1004 video_->OnNewMediaSegment(start_timestamp);
1001 } 1005 }
1002 1006
1003 } // namespace media 1007 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698