| OLD | NEW |
| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <limits> | 9 #include <limits> |
| 10 | 10 |
| (...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 *buffer = StreamParserBuffer::CreateEOSBuffer(); | 399 *buffer = StreamParserBuffer::CreateEOSBuffer(); |
| 400 return true; | 400 return true; |
| 401 } | 401 } |
| 402 | 402 |
| 403 NOTREACHED(); | 403 NOTREACHED(); |
| 404 return false; | 404 return false; |
| 405 } | 405 } |
| 406 | 406 |
| 407 ChunkDemuxer::ChunkDemuxer(const base::Closure& open_cb, | 407 ChunkDemuxer::ChunkDemuxer(const base::Closure& open_cb, |
| 408 const NeedKeyCB& need_key_cb, | 408 const NeedKeyCB& need_key_cb, |
| 409 const TextTrackCB& text_track_cb, |
| 410 const TextCB& text_cb, |
| 409 const LogCB& log_cb) | 411 const LogCB& log_cb) |
| 410 : state_(WAITING_FOR_INIT), | 412 : state_(WAITING_FOR_INIT), |
| 411 host_(NULL), | 413 host_(NULL), |
| 412 open_cb_(open_cb), | 414 open_cb_(open_cb), |
| 413 need_key_cb_(need_key_cb), | 415 need_key_cb_(need_key_cb), |
| 416 text_track_cb_(text_track_cb), |
| 417 text_cb_(text_cb), |
| 414 log_cb_(log_cb), | 418 log_cb_(log_cb), |
| 415 duration_(kNoTimestamp()), | 419 duration_(kNoTimestamp()), |
| 416 user_specified_duration_(-1) { | 420 user_specified_duration_(-1) { |
| 417 DCHECK(!open_cb_.is_null()); | 421 DCHECK(!open_cb_.is_null()); |
| 418 DCHECK(!need_key_cb_.is_null()); | 422 DCHECK(!need_key_cb_.is_null()); |
| 419 } | 423 } |
| 420 | 424 |
| 421 void ChunkDemuxer::Initialize(DemuxerHost* host, const PipelineStatusCB& cb) { | 425 void ChunkDemuxer::Initialize(DemuxerHost* host, const PipelineStatusCB& cb) { |
| 422 DVLOG(1) << "Init()"; | 426 DVLOG(1) << "Init()"; |
| 423 | 427 |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 audio_cb = base::Bind(&ChunkDemuxer::OnAudioBuffers, | 562 audio_cb = base::Bind(&ChunkDemuxer::OnAudioBuffers, |
| 559 base::Unretained(this)); | 563 base::Unretained(this)); |
| 560 } | 564 } |
| 561 | 565 |
| 562 if (has_video) { | 566 if (has_video) { |
| 563 source_id_video_ = id; | 567 source_id_video_ = id; |
| 564 video_cb = base::Bind(&ChunkDemuxer::OnVideoBuffers, | 568 video_cb = base::Bind(&ChunkDemuxer::OnVideoBuffers, |
| 565 base::Unretained(this)); | 569 base::Unretained(this)); |
| 566 } | 570 } |
| 567 | 571 |
| 572 // TODO(matthewjheaney): need a predicate here? |
| 573 StreamParser::NewBuffersCB text_cb; |
| 574 text_cb = base::Bind(&ChunkDemuxer::OnTextBuffers, |
| 575 base::Unretained(this)); |
| 576 |
| 568 stream_parser->Init( | 577 stream_parser->Init( |
| 569 base::Bind(&ChunkDemuxer::OnStreamParserInitDone, base::Unretained(this)), | 578 base::Bind(&ChunkDemuxer::OnStreamParserInitDone, base::Unretained(this)), |
| 570 base::Bind(&ChunkDemuxer::OnNewConfigs, base::Unretained(this), | 579 base::Bind(&ChunkDemuxer::OnNewConfigs, base::Unretained(this), |
| 571 has_audio, has_video), | 580 has_audio, has_video), |
| 572 audio_cb, | 581 audio_cb, |
| 573 video_cb, | 582 video_cb, |
| 574 base::Bind(&ChunkDemuxer::OnNeedKey, base::Unretained(this)), | 583 base::Bind(&ChunkDemuxer::OnNeedKey, base::Unretained(this)), |
| 584 text_track_cb_, |
| 585 text_cb, |
| 575 base::Bind(&ChunkDemuxer::OnNewMediaSegment, base::Unretained(this), id), | 586 base::Bind(&ChunkDemuxer::OnNewMediaSegment, base::Unretained(this), id), |
| 576 base::Bind(&ChunkDemuxer::OnEndOfMediaSegment, | 587 base::Bind(&ChunkDemuxer::OnEndOfMediaSegment, |
| 577 base::Unretained(this), id), | 588 base::Unretained(this), id), |
| 578 log_cb_); | 589 log_cb_); |
| 579 | 590 |
| 580 stream_parser_map_[id] = stream_parser.release(); | 591 stream_parser_map_[id] = stream_parser.release(); |
| 581 SourceInfo info = { base::TimeDelta(), true }; | 592 SourceInfo info = { base::TimeDelta(), true }; |
| 582 source_info_map_[id] = info; | 593 source_info_map_[id] = info; |
| 583 | 594 |
| 584 return kOk; | 595 return kOk; |
| (...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1068 // this method can be removed and need_key_cb_ can be passed directly | 1079 // this method can be removed and need_key_cb_ can be passed directly |
| 1069 // to the parser. | 1080 // to the parser. |
| 1070 bool ChunkDemuxer::OnNeedKey(const std::string& type, | 1081 bool ChunkDemuxer::OnNeedKey(const std::string& type, |
| 1071 scoped_array<uint8> init_data, | 1082 scoped_array<uint8> init_data, |
| 1072 int init_data_size) { | 1083 int init_data_size) { |
| 1073 lock_.AssertAcquired(); | 1084 lock_.AssertAcquired(); |
| 1074 need_key_cb_.Run(type, init_data.Pass(), init_data_size); | 1085 need_key_cb_.Run(type, init_data.Pass(), init_data_size); |
| 1075 return true; | 1086 return true; |
| 1076 } | 1087 } |
| 1077 | 1088 |
| 1089 bool ChunkDemuxer::OnTextBuffers(const StreamParser::BufferQueue& buffers) { |
| 1090 lock_.AssertAcquired(); |
| 1091 DCHECK_NE(state_, SHUTDOWN); |
| 1092 |
| 1093 StreamParser::BufferQueue::const_iterator it = buffers.begin(); |
| 1094 const StreamParser::BufferQueue::const_iterator it_end = buffers.end(); |
| 1095 |
| 1096 while (it != it_end) { |
| 1097 const StreamParser::BufferQueue::value_type& buffer = *it++; |
| 1098 const base::TimeDelta time = buffer->GetDecodeTimestamp(); |
| 1099 text_cb_.Run(time); |
| 1100 } |
| 1101 |
| 1102 return true; |
| 1103 } |
| 1104 |
| 1078 void ChunkDemuxer::OnNewMediaSegment(const std::string& source_id, | 1105 void ChunkDemuxer::OnNewMediaSegment(const std::string& source_id, |
| 1079 TimeDelta timestamp) { | 1106 TimeDelta timestamp) { |
| 1080 DCHECK(timestamp != kNoTimestamp()); | 1107 DCHECK(timestamp != kNoTimestamp()); |
| 1081 DVLOG(2) << "OnNewMediaSegment(" << source_id << ", " | 1108 DVLOG(2) << "OnNewMediaSegment(" << source_id << ", " |
| 1082 << timestamp.InSecondsF() << ")"; | 1109 << timestamp.InSecondsF() << ")"; |
| 1083 lock_.AssertAcquired(); | 1110 lock_.AssertAcquired(); |
| 1084 | 1111 |
| 1085 CHECK(IsValidId(source_id)); | 1112 CHECK(IsValidId(source_id)); |
| 1086 source_info_map_[source_id].can_update_offset = false; | 1113 source_info_map_[source_id].can_update_offset = false; |
| 1087 base::TimeDelta start_timestamp = | 1114 base::TimeDelta start_timestamp = |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1153 | 1180 |
| 1154 Ranges<TimeDelta> ChunkDemuxer::GetBufferedRanges() const { | 1181 Ranges<TimeDelta> ChunkDemuxer::GetBufferedRanges() const { |
| 1155 if (audio_ && !video_) | 1182 if (audio_ && !video_) |
| 1156 return audio_->GetBufferedRanges(duration_); | 1183 return audio_->GetBufferedRanges(duration_); |
| 1157 else if (!audio_ && video_) | 1184 else if (!audio_ && video_) |
| 1158 return video_->GetBufferedRanges(duration_); | 1185 return video_->GetBufferedRanges(duration_); |
| 1159 return ComputeIntersection(); | 1186 return ComputeIntersection(); |
| 1160 } | 1187 } |
| 1161 | 1188 |
| 1162 } // namespace media | 1189 } // namespace media |
| OLD | NEW |