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

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

Issue 1812543003: Allow muting/unmuting audio through media track API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@blink-sb-tracks6
Patch Set: Don't call DemuxStream::type from the wrong thread Created 4 years, 8 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) 2016 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2016 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/media_source_state.h" 5 #include "media/filters/media_source_state.h"
6 6
7 #include "base/callback_helpers.h" 7 #include "base/callback_helpers.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "media/base/media_track.h" 9 #include "media/base/media_track.h"
10 #include "media/base/media_tracks.h" 10 #include "media/base/media_tracks.h"
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 } 474 }
475 475
476 bool MediaSourceState::OnNewConfigs( 476 bool MediaSourceState::OnNewConfigs(
477 bool allow_audio, 477 bool allow_audio,
478 bool allow_video, 478 bool allow_video,
479 scoped_ptr<MediaTracks> tracks, 479 scoped_ptr<MediaTracks> tracks,
480 const StreamParser::TextTrackConfigMap& text_configs) { 480 const StreamParser::TextTrackConfigMap& text_configs) {
481 DCHECK_GE(state_, PENDING_PARSER_CONFIG); 481 DCHECK_GE(state_, PENDING_PARSER_CONFIG);
482 DCHECK(tracks.get()); 482 DCHECK(tracks.get());
483 media_tracks_ = std::move(tracks); 483 media_tracks_ = std::move(tracks);
484 const AudioDecoderConfig& audio_config = media_tracks_->getFirstAudioConfig(); 484
485 const VideoDecoderConfig& video_config = media_tracks_->getFirstVideoConfig(); 485 MediaTracks::TrackToDemuxStreamMap track_to_demux_stream_map;
486 const MediaTrack* audio_track = nullptr;
487 const MediaTrack* video_track = nullptr;
488 AudioDecoderConfig audio_config;
489 VideoDecoderConfig video_config;
490 for (const auto& track : media_tracks_->tracks()) {
491 if (!audio_track && track->type() == MediaTrack::Audio &&
492 media_tracks_->getAudioConfig(track->id()).IsValidConfig()) {
493 audio_config = media_tracks_->getAudioConfig(track->id());
494 audio_track = track.get();
495 } else if (!video_track && track->type() == MediaTrack::Video &&
496 media_tracks_->getVideoConfig(track->id()).IsValidConfig()) {
497 video_config = media_tracks_->getVideoConfig(track->id());
498 video_track = track.get();
499 }
500 }
486 501
487 DVLOG(1) << "OnNewConfigs(" << allow_audio << ", " << allow_video << ", " 502 DVLOG(1) << "OnNewConfigs(" << allow_audio << ", " << allow_video << ", "
488 << audio_config.IsValidConfig() << ", " 503 << audio_config.IsValidConfig() << ", "
489 << video_config.IsValidConfig() << ")"; 504 << video_config.IsValidConfig() << ")";
490 // MSE spec allows new configs to be emitted only during Append, but not 505 // MSE spec allows new configs to be emitted only during Append, but not
491 // during Flush or parser reset operations. 506 // during Flush or parser reset operations.
492 CHECK(append_in_progress_); 507 CHECK(append_in_progress_);
493 508
494 if (!audio_config.IsValidConfig() && !video_config.IsValidConfig()) { 509 if (!audio_config.IsValidConfig() && !video_config.IsValidConfig()) {
495 DVLOG(1) << "OnNewConfigs() : Audio & video config are not valid!"; 510 DVLOG(1) << "OnNewConfigs() : Audio & video config are not valid!";
(...skipping 27 matching lines...) Expand all
523 if (!audio_) { 538 if (!audio_) {
524 media_log_->SetBooleanProperty("found_audio_stream", true); 539 media_log_->SetBooleanProperty("found_audio_stream", true);
525 } 540 }
526 if (!audio_ || 541 if (!audio_ ||
527 audio_->audio_decoder_config().codec() != audio_config.codec()) { 542 audio_->audio_decoder_config().codec() != audio_config.codec()) {
528 media_log_->SetStringProperty("audio_codec_name", 543 media_log_->SetStringProperty("audio_codec_name",
529 GetCodecName(audio_config.codec())); 544 GetCodecName(audio_config.codec()));
530 } 545 }
531 546
532 if (!audio_) { 547 if (!audio_) {
533 audio_ = create_demuxer_stream_cb_.Run(DemuxerStream::AUDIO); 548 DCHECK(audio_track);
549 audio_ = create_demuxer_stream_cb_.Run(*audio_track);
534 550
535 if (!audio_) { 551 if (!audio_) {
536 DVLOG(1) << "Failed to create an audio stream."; 552 DVLOG(1) << "Failed to create an audio stream.";
537 return false; 553 return false;
538 } 554 }
539 555
540 if (!frame_processor_->AddTrack(FrameProcessor::kAudioTrackId, audio_)) { 556 if (!frame_processor_->AddTrack(FrameProcessor::kAudioTrackId, audio_)) {
541 DVLOG(1) << "Failed to add audio track to frame processor."; 557 DVLOG(1) << "Failed to add audio track to frame processor.";
542 return false; 558 return false;
543 } 559 }
544 } 560 }
545 561
546 frame_processor_->OnPossibleAudioConfigUpdate(audio_config); 562 frame_processor_->OnPossibleAudioConfigUpdate(audio_config);
547 success &= audio_->UpdateAudioConfig(audio_config, media_log_); 563 success &= audio_->UpdateAudioConfig(audio_config, media_log_);
548 } 564 }
549 565
550 if (video_config.IsValidConfig()) { 566 if (video_config.IsValidConfig()) {
551 if (!video_) { 567 if (!video_) {
552 media_log_->SetBooleanProperty("found_video_stream", true); 568 media_log_->SetBooleanProperty("found_video_stream", true);
553 } 569 }
554 if (!video_ || 570 if (!video_ ||
555 video_->video_decoder_config().codec() != video_config.codec()) { 571 video_->video_decoder_config().codec() != video_config.codec()) {
556 media_log_->SetStringProperty("video_codec_name", 572 media_log_->SetStringProperty("video_codec_name",
557 GetCodecName(video_config.codec())); 573 GetCodecName(video_config.codec()));
558 } 574 }
559 575
560 if (!video_) { 576 if (!video_) {
561 video_ = create_demuxer_stream_cb_.Run(DemuxerStream::VIDEO); 577 DCHECK(video_track);
578 video_ = create_demuxer_stream_cb_.Run(*video_track);
562 579
563 if (!video_) { 580 if (!video_) {
564 DVLOG(1) << "Failed to create a video stream."; 581 DVLOG(1) << "Failed to create a video stream.";
565 return false; 582 return false;
566 } 583 }
567 584
568 if (!frame_processor_->AddTrack(FrameProcessor::kVideoTrackId, video_)) { 585 if (!frame_processor_->AddTrack(FrameProcessor::kVideoTrackId, video_)) {
569 DVLOG(1) << "Failed to add video track to frame processor."; 586 DVLOG(1) << "Failed to add video track to frame processor.";
570 return false; 587 return false;
571 } 588 }
572 } 589 }
573 590
574 success &= video_->UpdateVideoConfig(video_config, media_log_); 591 success &= video_->UpdateVideoConfig(video_config, media_log_);
575 } 592 }
576 593
577 typedef StreamParser::TextTrackConfigMap::const_iterator TextConfigItr; 594 typedef StreamParser::TextTrackConfigMap::const_iterator TextConfigItr;
578 if (text_stream_map_.empty()) { 595 if (text_stream_map_.empty()) {
579 for (TextConfigItr itr = text_configs.begin(); itr != text_configs.end(); 596 for (TextConfigItr itr = text_configs.begin(); itr != text_configs.end();
580 ++itr) { 597 ++itr) {
598 // TODO(servolk): Look into unifying text tracks code path with audio and
599 // video track code paths.
600 MediaTrack dummy_text_track(MediaTrack::Text, "", "", "", "");
581 ChunkDemuxerStream* const text_stream = 601 ChunkDemuxerStream* const text_stream =
582 create_demuxer_stream_cb_.Run(DemuxerStream::TEXT); 602 create_demuxer_stream_cb_.Run(dummy_text_track);
583 if (!frame_processor_->AddTrack(itr->first, text_stream)) { 603 if (!frame_processor_->AddTrack(itr->first, text_stream)) {
584 success &= false; 604 success &= false;
585 MEDIA_LOG(ERROR, media_log_) << "Failed to add text track ID " 605 MEDIA_LOG(ERROR, media_log_) << "Failed to add text track ID "
586 << itr->first << " to frame processor."; 606 << itr->first << " to frame processor.";
587 break; 607 break;
588 } 608 }
589 text_stream->UpdateTextConfig(itr->second, media_log_); 609 text_stream->UpdateTextConfig(itr->second, media_log_);
590 text_stream_map_[itr->first] = text_stream; 610 text_stream_map_[itr->first] = text_stream;
591 new_text_track_cb_.Run(text_stream, itr->second); 611 new_text_track_cb_.Run(text_stream, itr->second);
592 } 612 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
644 << config_itr->first 664 << config_itr->first
645 << " does not match old one."; 665 << " does not match old one.";
646 break; 666 break;
647 } 667 }
648 } 668 }
649 } 669 }
650 } 670 }
651 671
652 frame_processor_->SetAllTrackBuffersNeedRandomAccessPoint(); 672 frame_processor_->SetAllTrackBuffersNeedRandomAccessPoint();
653 673
674 if (audio_track) {
675 DCHECK(audio_);
676 track_to_demux_stream_map[audio_track] = audio_;
677 }
678 if (video_track) {
679 DCHECK(video_);
680 track_to_demux_stream_map[video_track] = video_;
681 }
682 media_tracks_->set_track_to_demux_stream_map(track_to_demux_stream_map);
683
654 DVLOG(1) << "OnNewConfigs() : " << (success ? "success" : "failed"); 684 DVLOG(1) << "OnNewConfigs() : " << (success ? "success" : "failed");
655 if (success) { 685 if (success) {
656 if (state_ == PENDING_PARSER_CONFIG) 686 if (state_ == PENDING_PARSER_CONFIG)
657 state_ = PENDING_PARSER_INIT; 687 state_ = PENDING_PARSER_INIT;
658 DCHECK(!init_segment_received_cb_.is_null()); 688 DCHECK(!init_segment_received_cb_.is_null());
659 init_segment_received_cb_.Run(std::move(media_tracks_)); 689 init_segment_received_cb_.Run(std::move(media_tracks_));
660 } 690 }
661 691
662 return success; 692 return success;
663 } 693 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 769
740 void MediaSourceState::OnSourceInitDone( 770 void MediaSourceState::OnSourceInitDone(
741 const StreamParser::InitParameters& params) { 771 const StreamParser::InitParameters& params) {
742 DCHECK_EQ(state_, PENDING_PARSER_INIT); 772 DCHECK_EQ(state_, PENDING_PARSER_INIT);
743 state_ = PARSER_INITIALIZED; 773 state_ = PARSER_INITIALIZED;
744 auto_update_timestamp_offset_ = params.auto_update_timestamp_offset; 774 auto_update_timestamp_offset_ = params.auto_update_timestamp_offset;
745 base::ResetAndReturn(&init_cb_).Run(params); 775 base::ResetAndReturn(&init_cb_).Run(params);
746 } 776 }
747 777
748 } // namespace media 778 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698