Line data Source code
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 "MediaStreamListener.h"
7 :
8 : #include "AudioSegment.h"
9 : #include "VideoSegment.h"
10 : #include "StreamTracks.h"
11 :
12 : namespace mozilla {
13 :
14 : #ifdef LOG
15 : #undef LOG
16 : #endif
17 :
18 : #define LOG(type, msg) MOZ_LOG(gMediaStreamGraphLog, type, msg)
19 :
20 : void
21 0 : DirectMediaStreamTrackListener::MirrorAndDisableSegment(AudioSegment& aFrom,
22 : AudioSegment& aTo)
23 : {
24 0 : aTo.Clear();
25 0 : aTo.AppendNullData(aFrom.GetDuration());
26 0 : }
27 :
28 : void
29 0 : DirectMediaStreamTrackListener::MirrorAndDisableSegment(VideoSegment& aFrom,
30 : VideoSegment& aTo,
31 : DisabledTrackMode aMode)
32 : {
33 0 : aTo.Clear();
34 0 : if (aMode == DisabledTrackMode::SILENCE_BLACK) {
35 0 : for (VideoSegment::ChunkIterator it(aFrom); !it.IsEnded(); it.Next()) {
36 0 : aTo.AppendFrame(do_AddRef(it->mFrame.GetImage()),
37 : it->GetDuration(),
38 0 : it->mFrame.GetIntrinsicSize(),
39 0 : it->GetPrincipalHandle(),
40 0 : true);
41 : }
42 0 : } else if (aMode == DisabledTrackMode::SILENCE_FREEZE) {
43 0 : aTo.AppendNullData(aFrom.GetDuration());
44 : }
45 0 : }
46 :
47 : void
48 0 : DirectMediaStreamTrackListener::NotifyRealtimeTrackDataAndApplyTrackDisabling(MediaStreamGraph* aGraph,
49 : StreamTime aTrackOffset,
50 : MediaSegment& aMedia)
51 : {
52 0 : if (mDisabledFreezeCount == 0 && mDisabledBlackCount == 0) {
53 0 : NotifyRealtimeTrackData(aGraph, aTrackOffset, aMedia);
54 0 : return;
55 : }
56 :
57 0 : DisabledTrackMode mode = mDisabledBlackCount > 0
58 0 : ? DisabledTrackMode::SILENCE_BLACK
59 0 : : DisabledTrackMode::SILENCE_FREEZE;
60 0 : if (!mMedia) {
61 0 : mMedia = aMedia.CreateEmptyClone();
62 : }
63 0 : if (aMedia.GetType() == MediaSegment::AUDIO) {
64 : MirrorAndDisableSegment(static_cast<AudioSegment&>(aMedia),
65 0 : static_cast<AudioSegment&>(*mMedia));
66 0 : } else if (aMedia.GetType() == MediaSegment::VIDEO) {
67 : MirrorAndDisableSegment(static_cast<VideoSegment&>(aMedia),
68 0 : static_cast<VideoSegment&>(*mMedia),
69 0 : mode);
70 : } else {
71 0 : MOZ_CRASH("Unsupported media type");
72 : }
73 0 : NotifyRealtimeTrackData(aGraph, aTrackOffset, *mMedia);
74 : }
75 :
76 : void
77 0 : DirectMediaStreamTrackListener::IncreaseDisabled(DisabledTrackMode aMode)
78 : {
79 0 : if (aMode == DisabledTrackMode::SILENCE_FREEZE) {
80 0 : ++mDisabledFreezeCount;
81 0 : } else if (aMode == DisabledTrackMode::SILENCE_BLACK) {
82 0 : ++mDisabledBlackCount;
83 : } else {
84 0 : MOZ_ASSERT(false, "Unknown disabled mode");
85 : }
86 :
87 0 : LOG(LogLevel::Debug, ("DirectMediaStreamTrackListener %p increased disabled "
88 : "mode %s. Current counts are: freeze=%d, black=%d",
89 : this,
90 : aMode == DisabledTrackMode::SILENCE_FREEZE ? "freeze" : "black",
91 : int32_t(mDisabledFreezeCount),
92 : int32_t(mDisabledBlackCount)));
93 0 : }
94 :
95 : void
96 0 : DirectMediaStreamTrackListener::DecreaseDisabled(DisabledTrackMode aMode)
97 : {
98 0 : if (aMode == DisabledTrackMode::SILENCE_FREEZE) {
99 0 : --mDisabledFreezeCount;
100 0 : MOZ_ASSERT(mDisabledFreezeCount >= 0, "Double decrease");
101 0 : } else if (aMode == DisabledTrackMode::SILENCE_BLACK) {
102 0 : --mDisabledBlackCount;
103 0 : MOZ_ASSERT(mDisabledBlackCount >= 0, "Double decrease");
104 : } else {
105 0 : MOZ_ASSERT(false, "Unknown disabled mode");
106 : }
107 :
108 0 : LOG(LogLevel::Debug, ("DirectMediaStreamTrackListener %p decreased disabled "
109 : "mode %s. Current counts are: freeze=%d, black=%d",
110 : this,
111 : aMode == DisabledTrackMode::SILENCE_FREEZE ? "freeze" : "black",
112 : int32_t(mDisabledFreezeCount),
113 : int32_t(mDisabledBlackCount)));
114 0 : }
115 :
116 9 : } // namespace mozilla
|