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/. */
6 #include "MediaTrackListener.h"
8 #include "AudioSegment.h"
9 #include "VideoSegment.h"
17 #define LOG(type, msg) MOZ_LOG(gMediaTrackGraphLog, type, msg)
19 void DirectMediaTrackListener::MirrorAndDisableSegment(AudioSegment
& aFrom
,
21 aTo
.AppendNullData(aFrom
.GetDuration());
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(do_AddRef(it
->mFrame
.GetImage()),
29 it
->mFrame
.GetIntrinsicSize(), it
->GetPrincipalHandle(),
31 aTo
.ExtendLastFrameBy(it
->GetDuration());
33 } else if (aMode
== DisabledTrackMode::SILENCE_FREEZE
) {
34 aTo
.AppendNullData(aFrom
.GetDuration());
38 void DirectMediaTrackListener::NotifyRealtimeTrackDataAndApplyTrackDisabling(
39 MediaTrackGraph
* aGraph
, TrackTime aTrackOffset
, MediaSegment
& aMedia
) {
40 if (mDisabledFreezeCount
== 0 && mDisabledBlackCount
== 0) {
41 NotifyRealtimeTrackData(aGraph
, aTrackOffset
, aMedia
);
45 DisabledTrackMode mode
= mDisabledBlackCount
> 0
46 ? DisabledTrackMode::SILENCE_BLACK
47 : DisabledTrackMode::SILENCE_FREEZE
;
48 UniquePtr
<MediaSegment
> media(aMedia
.CreateEmptyClone());
49 if (aMedia
.GetType() == MediaSegment::AUDIO
) {
50 MirrorAndDisableSegment(static_cast<AudioSegment
&>(aMedia
),
51 static_cast<AudioSegment
&>(*media
));
52 } else if (aMedia
.GetType() == MediaSegment::VIDEO
) {
53 MirrorAndDisableSegment(static_cast<VideoSegment
&>(aMedia
),
54 static_cast<VideoSegment
&>(*media
), mode
);
56 MOZ_CRASH("Unsupported media type");
58 NotifyRealtimeTrackData(aGraph
, aTrackOffset
, *media
);
61 void DirectMediaTrackListener::IncreaseDisabled(DisabledTrackMode aMode
) {
62 if (aMode
== DisabledTrackMode::SILENCE_FREEZE
) {
63 ++mDisabledFreezeCount
;
64 } else if (aMode
== DisabledTrackMode::SILENCE_BLACK
) {
65 ++mDisabledBlackCount
;
67 MOZ_ASSERT(false, "Unknown disabled mode");
71 ("DirectMediaTrackListener %p increased disabled "
72 "mode %s. Current counts are: freeze=%d, black=%d",
73 this, aMode
== DisabledTrackMode::SILENCE_FREEZE
? "freeze" : "black",
74 int32_t(mDisabledFreezeCount
), int32_t(mDisabledBlackCount
)));
77 void DirectMediaTrackListener::DecreaseDisabled(DisabledTrackMode aMode
) {
78 if (aMode
== DisabledTrackMode::SILENCE_FREEZE
) {
79 --mDisabledFreezeCount
;
80 MOZ_ASSERT(mDisabledFreezeCount
>= 0, "Double decrease");
81 } else if (aMode
== DisabledTrackMode::SILENCE_BLACK
) {
82 --mDisabledBlackCount
;
83 MOZ_ASSERT(mDisabledBlackCount
>= 0, "Double decrease");
85 MOZ_ASSERT(false, "Unknown disabled mode");
89 ("DirectMediaTrackListener %p decreased disabled "
90 "mode %s. Current counts are: freeze=%d, black=%d",
91 this, aMode
== DisabledTrackMode::SILENCE_FREEZE
? "freeze" : "black",
92 int32_t(mDisabledFreezeCount
), int32_t(mDisabledBlackCount
)));
95 } // namespace mozilla