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 "CameraPreviewMediaStream.h"
8 using namespace mozilla::layers
;
9 using namespace mozilla::dom
;
13 CameraPreviewMediaStream::CameraPreviewMediaStream(DOMMediaStream
* aWrapper
)
14 : MediaStream(aWrapper
)
15 , mMutex("mozilla::camera::CameraPreviewMediaStream")
16 , mFrameCallback(nullptr)
18 SetGraphImpl(MediaStreamGraph::GetInstance());
23 CameraPreviewMediaStream::AddAudioOutput(void* aKey
)
28 CameraPreviewMediaStream::SetAudioOutputVolume(void* aKey
, float aVolume
)
33 CameraPreviewMediaStream::RemoveAudioOutput(void* aKey
)
38 CameraPreviewMediaStream::AddVideoOutput(VideoFrameContainer
* aContainer
)
40 MutexAutoLock
lock(mMutex
);
41 nsRefPtr
<VideoFrameContainer
> container
= aContainer
;
42 AddVideoOutputImpl(container
.forget());
44 if (mVideoOutputs
.Length() > 1) {
47 MediaStreamGraph
* gm
= MediaStreamGraph::GetInstance();
49 for (uint32_t j
= 0; j
< mListeners
.Length(); ++j
) {
50 MediaStreamListener
* l
= mListeners
[j
];
51 l
->NotifyConsumptionChanged(gm
, MediaStreamListener::CONSUMED
);
56 CameraPreviewMediaStream::RemoveVideoOutput(VideoFrameContainer
* aContainer
)
58 MutexAutoLock
lock(mMutex
);
59 RemoveVideoOutputImpl(aContainer
);
61 if (!mVideoOutputs
.IsEmpty()) {
64 MediaStreamGraph
* gm
= MediaStreamGraph::GetInstance();
66 for (uint32_t j
= 0; j
< mListeners
.Length(); ++j
) {
67 MediaStreamListener
* l
= mListeners
[j
];
68 l
->NotifyConsumptionChanged(gm
, MediaStreamListener::NOT_CONSUMED
);
73 CameraPreviewMediaStream::ChangeExplicitBlockerCount(int32_t aDelta
)
78 CameraPreviewMediaStream::AddListener(MediaStreamListener
* aListener
)
80 MutexAutoLock
lock(mMutex
);
82 MediaStreamGraph
* gm
= MediaStreamGraph::GetInstance();
83 MediaStreamListener
* listener
= *mListeners
.AppendElement() = aListener
;
84 listener
->NotifyBlockingChanged(gm
, MediaStreamListener::UNBLOCKED
);
88 CameraPreviewMediaStream::RemoveListener(MediaStreamListener
* aListener
)
90 MutexAutoLock
lock(mMutex
);
92 MediaStreamGraph
* gm
= MediaStreamGraph::GetInstance();
93 nsRefPtr
<MediaStreamListener
> listener(aListener
);
94 mListeners
.RemoveElement(aListener
);
95 listener
->NotifyRemoved(gm
);
99 CameraPreviewMediaStream::Destroy()
101 MutexAutoLock
lock(mMutex
);
106 CameraPreviewMediaStream::SetCurrentFrame(const gfxIntSize
& aIntrinsicSize
, Image
* aImage
)
108 MutexAutoLock
lock(mMutex
);
110 TimeStamp now
= TimeStamp::Now();
111 for (uint32_t i
= 0; i
< mVideoOutputs
.Length(); ++i
) {
112 VideoFrameContainer
* output
= mVideoOutputs
[i
];
113 output
->SetCurrentFrame(aIntrinsicSize
, aImage
, now
);
114 nsCOMPtr
<nsIRunnable
> event
=
115 NS_NewRunnableMethod(output
, &VideoFrameContainer::Invalidate
);
116 NS_DispatchToMainThread(event
, NS_DISPATCH_NORMAL
);
119 if (mFrameCallback
) {
120 mFrameCallback
->OnNewFrame(aIntrinsicSize
, aImage
);
125 CameraPreviewMediaStream::ClearCurrentFrame()
127 MutexAutoLock
lock(mMutex
);
129 for (uint32_t i
= 0; i
< mVideoOutputs
.Length(); ++i
) {
130 VideoFrameContainer
* output
= mVideoOutputs
[i
];
131 output
->ClearCurrentFrame();
132 nsCOMPtr
<nsIRunnable
> event
=
133 NS_NewRunnableMethod(output
, &VideoFrameContainer::Invalidate
);
134 NS_DispatchToMainThread(event
, NS_DISPATCH_NORMAL
);