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

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

Issue 2050043002: Generate and assign media track ids in demuxers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@use-streamparser-trackid
Patch Set: Created 4 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
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 <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <list> 9 #include <list>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/callback_helpers.h" 13 #include "base/callback_helpers.h"
14 #include "base/location.h" 14 #include "base/location.h"
15 #include "base/macros.h" 15 #include "base/macros.h"
16 #include "base/metrics/histogram_macros.h" 16 #include "base/metrics/histogram_macros.h"
17 #include "base/stl_util.h" 17 #include "base/stl_util.h"
18 #include "base/strings/string_number_conversions.h"
18 #include "media/base/audio_decoder_config.h" 19 #include "media/base/audio_decoder_config.h"
19 #include "media/base/bind_to_current_loop.h" 20 #include "media/base/bind_to_current_loop.h"
21 #include "media/base/media_tracks.h"
20 #include "media/base/stream_parser_buffer.h" 22 #include "media/base/stream_parser_buffer.h"
21 #include "media/base/timestamp_constants.h" 23 #include "media/base/timestamp_constants.h"
22 #include "media/base/video_decoder_config.h" 24 #include "media/base/video_decoder_config.h"
23 #include "media/filters/frame_processor.h" 25 #include "media/filters/frame_processor.h"
24 #include "media/filters/stream_parser_factory.h" 26 #include "media/filters/stream_parser_factory.h"
25 27
26 using base::TimeDelta; 28 using base::TimeDelta;
27 29
28 namespace media { 30 namespace media {
29 31
30 ChunkDemuxerStream::ChunkDemuxerStream(Type type, 32 ChunkDemuxerStream::ChunkDemuxerStream(Type type,
31 bool splice_frames_enabled) 33 bool splice_frames_enabled,
34 MediaTrack::TrackId media_track_id)
32 : type_(type), 35 : type_(type),
33 liveness_(DemuxerStream::LIVENESS_UNKNOWN), 36 liveness_(DemuxerStream::LIVENESS_UNKNOWN),
37 media_track_id_(media_track_id),
34 state_(UNINITIALIZED), 38 state_(UNINITIALIZED),
35 splice_frames_enabled_(splice_frames_enabled), 39 splice_frames_enabled_(splice_frames_enabled),
36 partial_append_window_trimming_enabled_(false) { 40 partial_append_window_trimming_enabled_(false) {}
37 }
38 41
39 void ChunkDemuxerStream::StartReturningData() { 42 void ChunkDemuxerStream::StartReturningData() {
40 DVLOG(1) << "ChunkDemuxerStream::StartReturningData()"; 43 DVLOG(1) << "ChunkDemuxerStream::StartReturningData()";
41 base::AutoLock auto_lock(lock_); 44 base::AutoLock auto_lock(lock_);
42 DCHECK(read_cb_.is_null()); 45 DCHECK(read_cb_.is_null());
43 ChangeState_Locked(RETURNING_DATA_FOR_READS); 46 ChangeState_Locked(RETURNING_DATA_FOR_READS);
44 } 47 }
45 48
46 void ChunkDemuxerStream::AbortReads() { 49 void ChunkDemuxerStream::AbortReads() {
47 DVLOG(1) << "ChunkDemuxerStream::AbortReads()"; 50 DVLOG(1) << "ChunkDemuxerStream::AbortReads()";
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 encrypted_media_init_data_cb_(encrypted_media_init_data_cb), 368 encrypted_media_init_data_cb_(encrypted_media_init_data_cb),
366 enable_text_(false), 369 enable_text_(false),
367 media_log_(media_log), 370 media_log_(media_log),
368 pending_source_init_done_count_(0), 371 pending_source_init_done_count_(0),
369 duration_(kNoTimestamp()), 372 duration_(kNoTimestamp()),
370 user_specified_duration_(-1), 373 user_specified_duration_(-1),
371 liveness_(DemuxerStream::LIVENESS_UNKNOWN), 374 liveness_(DemuxerStream::LIVENESS_UNKNOWN),
372 splice_frames_enabled_(splice_frames_enabled), 375 splice_frames_enabled_(splice_frames_enabled),
373 detected_audio_track_count_(0), 376 detected_audio_track_count_(0),
374 detected_video_track_count_(0), 377 detected_video_track_count_(0),
375 detected_text_track_count_(0) { 378 detected_text_track_count_(0),
379 next_track_id_(1) {
376 DCHECK(!open_cb_.is_null()); 380 DCHECK(!open_cb_.is_null());
377 DCHECK(!encrypted_media_init_data_cb_.is_null()); 381 DCHECK(!encrypted_media_init_data_cb_.is_null());
378 } 382 }
379 383
380 std::string ChunkDemuxer::GetDisplayName() const { 384 std::string ChunkDemuxer::GetDisplayName() const {
381 return "ChunkDemuxer"; 385 return "ChunkDemuxer";
382 } 386 }
383 387
384 void ChunkDemuxer::Initialize( 388 void ChunkDemuxer::Initialize(
385 DemuxerHost* host, 389 DemuxerHost* host,
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 } 562 }
559 563
560 void ChunkDemuxer::SetTracksWatcher( 564 void ChunkDemuxer::SetTracksWatcher(
561 const std::string& id, 565 const std::string& id,
562 const MediaTracksUpdatedCB& tracks_updated_cb) { 566 const MediaTracksUpdatedCB& tracks_updated_cb) {
563 base::AutoLock auto_lock(lock_); 567 base::AutoLock auto_lock(lock_);
564 CHECK(IsValidId(id)); 568 CHECK(IsValidId(id));
565 source_state_map_[id]->SetTracksWatcher(tracks_updated_cb); 569 source_state_map_[id]->SetTracksWatcher(tracks_updated_cb);
566 } 570 }
567 571
572 const DemuxerStream* ChunkDemuxer::GetDemuxerStreamByTrackId(
573 MediaTrack::TrackId track_id) const {
574 base::AutoLock auto_lock(lock_);
575 auto it = track_id_to_demux_stream_map_.find(track_id);
576 DCHECK(it != track_id_to_demux_stream_map_.end());
577 return it->second;
578 }
579
568 void ChunkDemuxer::RemoveId(const std::string& id) { 580 void ChunkDemuxer::RemoveId(const std::string& id) {
569 base::AutoLock auto_lock(lock_); 581 base::AutoLock auto_lock(lock_);
570 CHECK(IsValidId(id)); 582 CHECK(IsValidId(id));
571 583
572 delete source_state_map_[id]; 584 delete source_state_map_[id];
573 source_state_map_.erase(id); 585 source_state_map_.erase(id);
574 586
575 if (source_id_audio_ == id) 587 if (source_id_audio_ == id)
576 source_id_audio_.clear(); 588 source_id_audio_.clear();
577 589
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 if (duration_ == kNoTimestamp()) 1010 if (duration_ == kNoTimestamp())
999 duration_ = kInfiniteDuration(); 1011 duration_ = kInfiniteDuration();
1000 1012
1001 // The demuxer is now initialized after the |start_timestamp_| was set. 1013 // The demuxer is now initialized after the |start_timestamp_| was set.
1002 ChangeState_Locked(INITIALIZED); 1014 ChangeState_Locked(INITIALIZED);
1003 base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); 1015 base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK);
1004 } 1016 }
1005 1017
1006 ChunkDemuxerStream* ChunkDemuxer::CreateDemuxerStream( 1018 ChunkDemuxerStream* ChunkDemuxer::CreateDemuxerStream(
1007 DemuxerStream::Type type) { 1019 DemuxerStream::Type type) {
1020 // New ChunkDemuxerStreams can be created only during initialization segment
1021 // processing, which happens when a new chunk of data is appended and the
1022 // lock_ must be held by ChunkDemuxer::AppendData.
1023 lock_.AssertAcquired();
1024
1025 MediaTrack::TrackId media_track_id = base::UintToString(next_track_id_++);
1026
1008 switch (type) { 1027 switch (type) {
1009 case DemuxerStream::AUDIO: 1028 case DemuxerStream::AUDIO:
1010 if (audio_) 1029 if (audio_)
1011 return NULL; 1030 return NULL;
1012 audio_.reset( 1031 audio_.reset(new ChunkDemuxerStream(
1013 new ChunkDemuxerStream(DemuxerStream::AUDIO, splice_frames_enabled_)); 1032 DemuxerStream::AUDIO, splice_frames_enabled_, media_track_id));
1033 track_id_to_demux_stream_map_[media_track_id] = audio_.get();
1014 return audio_.get(); 1034 return audio_.get();
1015 break; 1035 break;
1016 case DemuxerStream::VIDEO: 1036 case DemuxerStream::VIDEO:
1017 if (video_) 1037 if (video_)
1018 return NULL; 1038 return NULL;
1019 video_.reset( 1039 video_.reset(new ChunkDemuxerStream(
1020 new ChunkDemuxerStream(DemuxerStream::VIDEO, splice_frames_enabled_)); 1040 DemuxerStream::VIDEO, splice_frames_enabled_, media_track_id));
1041 track_id_to_demux_stream_map_[media_track_id] = video_.get();
1021 return video_.get(); 1042 return video_.get();
1022 break; 1043 break;
1023 case DemuxerStream::TEXT: { 1044 case DemuxerStream::TEXT: {
1024 return new ChunkDemuxerStream(DemuxerStream::TEXT, 1045 return new ChunkDemuxerStream(DemuxerStream::TEXT, splice_frames_enabled_,
1025 splice_frames_enabled_); 1046 media_track_id);
1026 break; 1047 break;
1027 } 1048 }
1028 case DemuxerStream::UNKNOWN: 1049 case DemuxerStream::UNKNOWN:
1029 case DemuxerStream::NUM_TYPES: 1050 case DemuxerStream::NUM_TYPES:
1030 NOTREACHED(); 1051 NOTREACHED();
1031 return NULL; 1052 return NULL;
1032 } 1053 }
1033 NOTREACHED(); 1054 NOTREACHED();
1034 return NULL; 1055 return NULL;
1035 } 1056 }
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1140 } 1161 }
1141 1162
1142 void ChunkDemuxer::ShutdownAllStreams() { 1163 void ChunkDemuxer::ShutdownAllStreams() {
1143 for (MediaSourceStateMap::iterator itr = source_state_map_.begin(); 1164 for (MediaSourceStateMap::iterator itr = source_state_map_.begin();
1144 itr != source_state_map_.end(); ++itr) { 1165 itr != source_state_map_.end(); ++itr) {
1145 itr->second->Shutdown(); 1166 itr->second->Shutdown();
1146 } 1167 }
1147 } 1168 }
1148 1169
1149 } // namespace media 1170 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698