MediaTrackListener.cpp (3504B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 4 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #include "MediaTrackListener.h" 7 8 #include "AudioSegment.h" 9 #include "VideoSegment.h" 10 11 namespace mozilla { 12 13 #ifdef LOG 14 # undef LOG 15 #endif 16 17 #define LOG(type, msg) MOZ_LOG(gMediaTrackGraphLog, type, msg) 18 19 void DirectMediaTrackListener::MirrorAndDisableSegment(AudioSegment& aFrom, 20 AudioSegment& aTo) { 21 aTo.AppendNullData(aFrom.GetDuration()); 22 } 23 24 void DirectMediaTrackListener::MirrorAndDisableSegment( 25 VideoSegment& aFrom, VideoSegment& aTo, DisabledTrackMode aMode) { 26 if (aMode == DisabledTrackMode::SILENCE_BLACK) { 27 for (VideoSegment::ChunkIterator it(aFrom); !it.IsEnded(); it.Next()) { 28 aTo.AppendFrame(*it, Some(true)); 29 aTo.ExtendLastFrameBy(it->GetDuration()); 30 } 31 } else if (aMode == DisabledTrackMode::SILENCE_FREEZE) { 32 aTo.AppendNullData(aFrom.GetDuration()); 33 } 34 } 35 36 void DirectMediaTrackListener::NotifyRealtimeTrackDataAndApplyTrackDisabling( 37 MediaTrackGraph* aGraph, TrackTime aTrackOffset, MediaSegment& aMedia) { 38 if (mDisabledFreezeCount == 0 && mDisabledBlackCount == 0) { 39 NotifyRealtimeTrackData(aGraph, aTrackOffset, aMedia); 40 return; 41 } 42 43 DisabledTrackMode mode = mDisabledBlackCount > 0 44 ? DisabledTrackMode::SILENCE_BLACK 45 : DisabledTrackMode::SILENCE_FREEZE; 46 UniquePtr<MediaSegment> media(aMedia.CreateEmptyClone()); 47 if (aMedia.GetType() == MediaSegment::AUDIO) { 48 MirrorAndDisableSegment(static_cast<AudioSegment&>(aMedia), 49 static_cast<AudioSegment&>(*media)); 50 } else if (aMedia.GetType() == MediaSegment::VIDEO) { 51 MirrorAndDisableSegment(static_cast<VideoSegment&>(aMedia), 52 static_cast<VideoSegment&>(*media), mode); 53 } else { 54 MOZ_CRASH("Unsupported media type"); 55 } 56 NotifyRealtimeTrackData(aGraph, aTrackOffset, *media); 57 } 58 59 void DirectMediaTrackListener::IncreaseDisabled(DisabledTrackMode aMode) { 60 if (aMode == DisabledTrackMode::SILENCE_FREEZE) { 61 ++mDisabledFreezeCount; 62 } else if (aMode == DisabledTrackMode::SILENCE_BLACK) { 63 ++mDisabledBlackCount; 64 } else { 65 MOZ_ASSERT(false, "Unknown disabled mode"); 66 } 67 68 LOG(LogLevel::Debug, 69 ("DirectMediaTrackListener %p increased disabled " 70 "mode %s. Current counts are: freeze=%d, black=%d", 71 this, aMode == DisabledTrackMode::SILENCE_FREEZE ? "freeze" : "black", 72 int32_t(mDisabledFreezeCount), int32_t(mDisabledBlackCount))); 73 } 74 75 void DirectMediaTrackListener::DecreaseDisabled(DisabledTrackMode aMode) { 76 if (aMode == DisabledTrackMode::SILENCE_FREEZE) { 77 --mDisabledFreezeCount; 78 MOZ_ASSERT(mDisabledFreezeCount >= 0, "Double decrease"); 79 } else if (aMode == DisabledTrackMode::SILENCE_BLACK) { 80 --mDisabledBlackCount; 81 MOZ_ASSERT(mDisabledBlackCount >= 0, "Double decrease"); 82 } else { 83 MOZ_ASSERT(false, "Unknown disabled mode"); 84 } 85 86 LOG(LogLevel::Debug, 87 ("DirectMediaTrackListener %p decreased disabled " 88 "mode %s. Current counts are: freeze=%d, black=%d", 89 this, aMode == DisabledTrackMode::SILENCE_FREEZE ? "freeze" : "black", 90 int32_t(mDisabledFreezeCount), int32_t(mDisabledBlackCount))); 91 } 92 93 } // namespace mozilla