* Update the session layer to p4 37930
* Update the peerconnection_client in sync with updates on the libjingle side.
Review URL: http://webrtc-codereview.appspot.com/29008
git-svn-id: http://webrtc.googlecode.com/svn/trunk@34 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/peerconnection/samples/client/conductor.cc b/peerconnection/samples/client/conductor.cc
index 698ba48..e0c029f 100644
--- a/peerconnection/samples/client/conductor.cc
+++ b/peerconnection/samples/client/conductor.cc
@@ -12,6 +12,7 @@
#include "peerconnection/samples/client/defaults.h"
#include "talk/base/logging.h"
+#include "talk/session/phone/videorendererfactory.h"
Conductor::Conductor(PeerConnectionClient* client, MainWnd* main_wnd)
: handshake_(NONE),
@@ -70,6 +71,8 @@
void Conductor::DeletePeerConnection() {
peer_connection_.reset();
+ local_renderer_.reset();
+ remote_renderer_.reset();
handshake_ = NONE;
}
@@ -79,8 +82,14 @@
main_wnd_->SwitchToStreamingUI();
if (peer_connection_->SetVideoCapture("")) {
- peer_connection_->SetVideoRenderer(-1, main_wnd_->handle(), 0,
- 0.7f, 0.7f, 0.95f, 0.95f);
+ if (!local_renderer_.get()) {
+ // The window will be resized according to the stream properties
+ // when streaming starts.
+ local_renderer_.reset(
+ cricket::VideoRendererFactory::CreateGuiVideoRenderer(100, 100));
+ }
+ if (local_renderer_.get())
+ peer_connection_->SetLocalVideoRenderer(local_renderer_.get());
} else {
ASSERT(false);
}
@@ -130,8 +139,13 @@
video_channel_ = channel_id;
waiting_for_video_ = false;
LOG(INFO) << "Setting video renderer for channel: " << channel_id;
- bool ok = peer_connection_->SetVideoRenderer(channel_id,
- main_wnd_->handle(), 1, 0.0f, 0.0f, 1.0f, 1.0f);
+ if (!remote_renderer_.get()) {
+ // The window size will be automatically corrected.
+ remote_renderer_.reset(
+ cricket::VideoRendererFactory::CreateGuiVideoRenderer(100, 100));
+ }
+ bool ok = peer_connection_->SetVideoRenderer(stream_id,
+ remote_renderer_.get());
ASSERT(ok);
} else {
ASSERT(audio_channel_ == -1);
diff --git a/peerconnection/samples/client/conductor.h b/peerconnection/samples/client/conductor.h
index ce968d7..3b9d471 100644
--- a/peerconnection/samples/client/conductor.h
+++ b/peerconnection/samples/client/conductor.h
@@ -19,6 +19,9 @@
#include "talk/app/peerconnection.h"
#include "talk/base/scoped_ptr.h"
+namespace cricket {
+class VideoRenderer;
+} // namespace cricket
class Conductor
: public webrtc::PeerConnectionObserver,
@@ -112,6 +115,8 @@
MainWnd* main_wnd_;
int video_channel_;
int audio_channel_;
+ talk_base::scoped_ptr<cricket::VideoRenderer> local_renderer_;
+ talk_base::scoped_ptr<cricket::VideoRenderer> remote_renderer_;
};
#endif // PEERCONNECTION_SAMPLES_CLIENT_CONDUCTOR_H_
diff --git a/third_party_mods/libjingle/libjingle.gyp b/third_party_mods/libjingle/libjingle.gyp
index 42f34bb..bad09b5 100644
--- a/third_party_mods/libjingle/libjingle.gyp
+++ b/third_party_mods/libjingle/libjingle.gyp
@@ -466,7 +466,7 @@
'source/talk/session/phone/devicemanager.cc',
'source/talk/session/phone/devicemanager.h',
'source/talk/session/phone/filemediaengine.cc',
- 'source/talk/session/phone/filemediaengine.h',
+ 'source/talk/session/phone/filemediaengine.h',
'source/talk/session/phone/mediachannel.h',
'source/talk/session/phone/mediaengine.cc',
'source/talk/session/phone/mediaengine.h',
@@ -494,9 +494,17 @@
'source/talk/session/tunnel/tunnelsessionclient.cc',
'source/talk/session/tunnel/tunnelsessionclient.h',
],
- 'conditions': [
+ 'conditions': [
+ ['OS=="win"', {
+ 'sources': [
+ 'source/talk/session/phone/gdivideorenderer.cc',
+ 'source/talk/session/phone/gdivideorenderer.h',
+ ],
+ }],
['OS=="linux"', {
'sources': [
+ #'source/talk/session/phone/gtkvideorenderer.cc',
+ #'source/talk/session/phone/gtkvideorenderer.h',
'source/talk/session/phone/libudevsymboltable.cc',
'source/talk/session/phone/libudevsymboltable.h',
'source/talk/session/phone/v4llookup.cc',
@@ -539,8 +547,6 @@
'source/talk/app/voicemediaengine.h',
'source/talk/app/webrtc_json.cc',
'source/talk/app/webrtc_json.h',
- 'source/talk/app/webrtcchannelmanager.cc',
- 'source/talk/app/webrtcchannelmanager.h',
'source/talk/app/webrtcsession.cc',
'source/talk/app/webrtcsession.h',
'source/talk/app/webrtcsessionimpl.cc',
@@ -556,8 +562,8 @@
],
},{
'sources': [
- 'source/talk/app/p2p_transport_manager.cc',
- 'source/talk/app/p2p_transport_manager.h',
+ 'source/talk/app/p2p_transport_manager.cc',
+ 'source/talk/app/p2p_transport_manager.h',
],
}],
],
diff --git a/third_party_mods/libjingle/source/talk/app/peerconnection.cc b/third_party_mods/libjingle/source/talk/app/peerconnection.cc
index 4a1962f..87805c1 100644
--- a/third_party_mods/libjingle/source/talk/app/peerconnection.cc
+++ b/third_party_mods/libjingle/source/talk/app/peerconnection.cc
@@ -115,7 +115,7 @@
cricket::PORTALLOCATOR_DISABLE_RELAY);
// create channel manager
- channel_manager_.reset(new WebRtcChannelManager(media_thread_.get()));
+ channel_manager_.reset(new cricket::ChannelManager(media_thread_.get()));
//start the media thread
media_thread_->SetPriority(talk_base::PRIORITY_HIGH);
@@ -244,24 +244,22 @@
return channel_manager_->SetAudioOptions(wave_in_device, wave_out_device, opts);
}
+bool PeerConnection::SetLocalVideoRenderer(cricket::VideoRenderer* renderer) {
+ return channel_manager_->SetLocalRenderer(renderer);
+}
+
+bool PeerConnection::SetVideoRenderer(const std::string& stream_id,
+ cricket::VideoRenderer* renderer) {
+ ASSERT(session_ != NULL);
+ return session_->SetVideoRenderer(stream_id, renderer);
+}
+
bool PeerConnection::SetVideoRenderer(const std::string& stream_id,
ExternalRenderer* external_renderer) {
ASSERT(session_ != NULL);
return session_->SetVideoRenderer(stream_id, external_renderer);
}
-bool PeerConnection::SetVideoRenderer(int channel_id,
- void* window,
- unsigned int zOrder,
- float left,
- float top,
- float right,
- float bottom) {
- ASSERT(session_ != NULL);
- return session_->SetVideoRenderer(channel_id, window, zOrder, left, top,
- right, bottom);
-}
-
bool PeerConnection::SetVideoCapture(const std::string& cam_device) {
return channel_manager_->SetVideoOptions(cam_device);
}
diff --git a/third_party_mods/libjingle/source/talk/app/peerconnection.h b/third_party_mods/libjingle/source/talk/app/peerconnection.h
index 9ab8da5..e39c88b 100644
--- a/third_party_mods/libjingle/source/talk/app/peerconnection.h
+++ b/third_party_mods/libjingle/source/talk/app/peerconnection.h
@@ -10,7 +10,7 @@
#include "talk/base/thread.h"
#include "talk/base/scoped_ptr.h"
#include "talk/base/basicpacketsocketfactory.h"
-#include "talk/app/webrtcchannelmanager.h"
+#include "talk/session/phone/channelmanager.h"
namespace Json {
class Value;
@@ -18,6 +18,8 @@
namespace cricket {
class BasicPortAllocator;
+class ChannelManager;
+class VideoRenderer;
}
#ifdef PLATFORM_CHROMIUM
@@ -76,16 +78,13 @@
bool SetAudioDevice(const std::string& wave_in_device,
const std::string& wave_out_device, int opts);
// Set the video renderer
+ bool SetLocalVideoRenderer(cricket::VideoRenderer* renderer);
+ bool SetVideoRenderer(const std::string& stream_id,
+ cricket::VideoRenderer* renderer);
+
bool SetVideoRenderer(const std::string& stream_id,
ExternalRenderer* external_renderer);
- // Set channel_id to -1 for the local preview
- bool SetVideoRenderer(int channel_id,
- void* window,
- unsigned int zOrder,
- float left,
- float top,
- float right,
- float bottom);
+
// Set video capture device
// For Chromium the cam_device should use the capture session id.
// For standalone app, cam_device is the camera name. It will try to
@@ -120,7 +119,7 @@
std::string config_;
talk_base::scoped_ptr<talk_base::Thread> media_thread_;
- talk_base::scoped_ptr<WebRtcChannelManager> channel_manager_;
+ talk_base::scoped_ptr<cricket::ChannelManager> channel_manager_;
talk_base::scoped_ptr<talk_base::NetworkManager> network_manager_;
talk_base::scoped_ptr<cricket::BasicPortAllocator> port_allocator_;
talk_base::scoped_ptr<talk_base::BasicPacketSocketFactory> socket_factory_;
diff --git a/third_party_mods/libjingle/source/talk/app/session_test/session_test_main.cc b/third_party_mods/libjingle/source/talk/app/session_test/session_test_main.cc
index 99af54e..e783bdf 100644
--- a/third_party_mods/libjingle/source/talk/app/session_test/session_test_main.cc
+++ b/third_party_mods/libjingle/source/talk/app/session_test/session_test_main.cc
@@ -20,6 +20,7 @@
#include "talk/app/peerconnection.h"
#include "talk/app/session_test/main_wnd.h"
#include "talk/base/logging.h"
+#include "talk/session/phone/videorendererfactory.h"
static const char kAudioLabel[] = "audio_label";
static const char kVideoLabel[] = "video_label";
@@ -217,6 +218,7 @@
}
void OnConnect(talk_base::AsyncSocket* socket) {
+ ASSERT(!onconnect_data_.empty());
int sent = socket->Send(onconnect_data_.c_str(), onconnect_data_.length());
ASSERT(sent == onconnect_data_.length());
onconnect_data_.clear();
@@ -385,8 +387,10 @@
notification_data_.clear();
}
- if (hanging_get_.GetState() == talk_base::Socket::CS_CLOSED)
+ if (hanging_get_.GetState() == talk_base::Socket::CS_CLOSED &&
+ state_ == CONNECTED) {
hanging_get_.Connect(server_address_);
+ }
}
// Parses a single line entry in the form "<name>,<id>,<connected>"
@@ -446,7 +450,9 @@
void OnClose(talk_base::AsyncSocket* socket, int err) {
LOG(INFO) << __FUNCTION__;
+
socket->Close();
+
if (err != WSAECONNREFUSED) {
if (socket == &hanging_get_) {
if (state_ == CONNECTED) {
@@ -553,6 +559,7 @@
void DeletePeerConnection() {
peer_connection_.reset();
+ handshake_ = NONE;
}
void StartCaptureDevice() {
@@ -561,8 +568,11 @@
main_wnd_->SwitchToStreamingUI();
if (peer_connection_->SetVideoCapture("")) {
- peer_connection_->SetVideoRenderer(-1, main_wnd_->handle(), 0,
- 0.7f, 0.7f, 0.95f, 0.95f);
+ if (!local_renderer_.get()) {
+ local_renderer_.reset(
+ cricket::VideoRendererFactory::CreateGuiVideoRenderer(176, 144));
+ }
+ peer_connection_->SetLocalVideoRenderer(local_renderer_.get());
} else {
ASSERT(false);
}
@@ -612,8 +622,12 @@
video_channel_ = channel_id;
waiting_for_video_ = false;
LOG(INFO) << "Setting video renderer for channel: " << channel_id;
- bool ok = peer_connection_->SetVideoRenderer(channel_id,
- main_wnd_->handle(), 1, 0.0f, 0.0f, 1.0f, 1.0f);
+ if (!remote_renderer_.get()) {
+ remote_renderer_.reset(
+ cricket::VideoRendererFactory::CreateGuiVideoRenderer(352, 288));
+ }
+ bool ok = peer_connection_->SetVideoRenderer(stream_id,
+ remote_renderer_.get());
ASSERT(ok);
} else {
ASSERT(audio_channel_ == -1);
@@ -774,7 +788,6 @@
LOG(INFO) << "PEER_CONNECTION_CLOSED";
DeletePeerConnection();
::InvalidateRect(main_wnd_->handle(), NULL, TRUE);
- handshake_ = NONE;
waiting_for_audio_ = false;
waiting_for_video_ = false;
peer_id_ = -1;
@@ -790,7 +803,12 @@
DisconnectFromServer();
}
} else if (msg == SEND_MESSAGE_TO_PEER) {
- client_->SendToPeer(peer_id_, *reinterpret_cast<std::string*>(lp));
+ bool ok = client_->SendToPeer(peer_id_,
+ *reinterpret_cast<std::string*>(lp));
+ if (!ok) {
+ LOG(LS_ERROR) << "SendToPeer failed";
+ DisconnectFromServer();
+ }
} else {
ret = false;
}
@@ -808,6 +826,8 @@
MainWnd* main_wnd_;
int video_channel_;
int audio_channel_;
+ scoped_ptr<cricket::VideoRenderer> local_renderer_;
+ scoped_ptr<cricket::VideoRenderer> remote_renderer_;
};
int PASCAL wWinMain(HINSTANCE instance, HINSTANCE prev_instance,
diff --git a/third_party_mods/libjingle/source/talk/app/videoengine.h b/third_party_mods/libjingle/source/talk/app/videoengine.h
index aa7fb62..3b724bb 100644
--- a/third_party_mods/libjingle/source/talk/app/videoengine.h
+++ b/third_party_mods/libjingle/source/talk/app/videoengine.h
@@ -31,6 +31,7 @@
#include "talk/base/common.h"
#include "common_types.h"
+#include "modules/interface/module_common_types.h"
#include "video_engine/main/interface/vie_base.h"
#include "video_engine/main/interface/vie_capture.h"
#include "video_engine/main/interface/vie_codec.h"
diff --git a/third_party_mods/libjingle/source/talk/app/videomediaengine.cc b/third_party_mods/libjingle/source/talk/app/videomediaengine.cc
index dd5bdde..95387bf 100644
--- a/third_party_mods/libjingle/source/talk/app/videomediaengine.cc
+++ b/third_party_mods/libjingle/source/talk/app/videomediaengine.cc
@@ -14,6 +14,7 @@
#include "talk/app/voicemediaengine.h"
#include "modules/video_capture/main/interface/video_capture.h"
+#include "vplib.h"
#ifndef ARRAYSIZE
#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
@@ -25,6 +26,213 @@
static const int kStartVideoBitrate = 300;
static const int kMaxVideoBitrate = 1000;
+CricketWebRTCVideoFrame::CricketWebRTCVideoFrame() {
+}
+
+CricketWebRTCVideoFrame::~CricketWebRTCVideoFrame() {
+ // TODO(ronghuawu): should the CricketWebRTCVideoFrame owns the buffer?
+ WebRtc_UWord8* newMemory = NULL;
+ WebRtc_UWord32 newLength = 0;
+ WebRtc_UWord32 newSize = 0;
+ video_frame_.Swap(newMemory, newLength, newSize);
+}
+
+void CricketWebRTCVideoFrame::Attach(unsigned char* buffer, int bufferSize,
+ int w, int h) {
+ WebRtc_UWord8* newMemory = buffer;
+ WebRtc_UWord32 newLength = bufferSize;
+ WebRtc_UWord32 newSize = bufferSize;
+ video_frame_.Swap(newMemory, newLength, newSize);
+ video_frame_.SetWidth(w);
+ video_frame_.SetHeight(h);
+}
+
+size_t CricketWebRTCVideoFrame::GetWidth() const {
+ return video_frame_.Width();
+}
+size_t CricketWebRTCVideoFrame::GetHeight() const {
+ return video_frame_.Height();
+}
+
+const uint8* CricketWebRTCVideoFrame::GetYPlane() const {
+ WebRtc_UWord8* buffer = video_frame_.Buffer();
+ return buffer;
+}
+
+const uint8* CricketWebRTCVideoFrame::GetUPlane() const {
+ WebRtc_UWord8* buffer = video_frame_.Buffer();
+ if (buffer)
+ buffer += (video_frame_.Width() * video_frame_.Height());
+ return buffer;
+}
+
+const uint8* CricketWebRTCVideoFrame::GetVPlane() const {
+ WebRtc_UWord8* buffer = video_frame_.Buffer();
+ if (buffer)
+ buffer += (video_frame_.Width() * video_frame_.Height() * 5 / 4);
+ return buffer;
+}
+
+uint8* CricketWebRTCVideoFrame::GetYPlane() {
+ WebRtc_UWord8* buffer = video_frame_.Buffer();
+ return buffer;
+}
+
+uint8* CricketWebRTCVideoFrame::GetUPlane() {
+ WebRtc_UWord8* buffer = video_frame_.Buffer();
+ if (buffer)
+ buffer += (video_frame_.Width() * video_frame_.Height());
+ return buffer;
+}
+
+uint8* CricketWebRTCVideoFrame::GetVPlane() {
+ WebRtc_UWord8* buffer = video_frame_.Buffer();
+ if (buffer)
+ buffer += (video_frame_.Width() * video_frame_.Height() * 3 / 2);
+ return buffer;
+}
+
+cricket::VideoFrame* CricketWebRTCVideoFrame::Copy() const {
+ WebRtc_UWord8* buffer = video_frame_.Buffer();
+ if (buffer) {
+ int new_buffer_size = video_frame_.Length();
+ unsigned char* new_buffer = new unsigned char[new_buffer_size];
+ memcpy(new_buffer, buffer, new_buffer_size);
+ CricketWebRTCVideoFrame* copy = new CricketWebRTCVideoFrame();
+ copy->Attach(new_buffer, new_buffer_size,
+ video_frame_.Width(), video_frame_.Height());
+ copy->SetTimeStamp(video_frame_.TimeStamp());
+ copy->SetElapsedTime(elapsed_time_);
+ return copy;
+ }
+ return NULL;
+}
+
+size_t CricketWebRTCVideoFrame::CopyToBuffer(
+ uint8* buffer, size_t size) const {
+ if (!video_frame_.Buffer()) {
+ return 0;
+ }
+
+ size_t needed = video_frame_.Length();
+ if (needed <= size) {
+ memcpy(buffer, video_frame_.Buffer(), needed);
+ }
+ return needed;
+}
+
+size_t CricketWebRTCVideoFrame::ConvertToRgbBuffer(uint32 to_fourcc,
+ uint8* buffer,
+ size_t size,
+ size_t pitch_rgb) const {
+ if (!video_frame_.Buffer()) {
+ return 0;
+ }
+
+ size_t width = video_frame_.Width();
+ size_t height = video_frame_.Height();
+ // See http://www.virtualdub.org/blog/pivot/entry.php?id=190 for a good
+ // explanation of pitch and why this is the amount of space we need.
+ size_t needed = pitch_rgb * (height - 1) + 4 * width;
+
+ if (needed > size) {
+ LOG(LS_WARNING) << "RGB buffer is not large enough";
+ return needed;
+ }
+
+ VideoType outgoingVideoType = kUnknown;
+ switch (to_fourcc) {
+ case cricket::FOURCC_ARGB:
+ outgoingVideoType = kARGB;
+ break;
+ default:
+ LOG(LS_WARNING) << "RGB type not supported: " << to_fourcc;
+ break;
+ }
+
+ if (outgoingVideoType != kUnknown)
+ ConvertFromI420(outgoingVideoType, video_frame_.Buffer(),
+ width, height, buffer);
+
+ return needed;
+}
+
+// TODO(ronghuawu): Implement StretchToPlanes
+void CricketWebRTCVideoFrame::StretchToPlanes(
+ uint8* y, uint8* u, uint8* v,
+ int32 dst_pitch_y, int32 dst_pitch_u, int32 dst_pitch_v,
+ size_t width, size_t height, bool interpolate, bool crop) const {
+}
+
+size_t CricketWebRTCVideoFrame::StretchToBuffer(size_t w, size_t h,
+ uint8* buffer, size_t size,
+ bool interpolate,
+ bool crop) const {
+ if (!video_frame_.Buffer()) {
+ return 0;
+ }
+
+ size_t needed = video_frame_.Length();
+
+ if (needed <= size) {
+ uint8* bufy = buffer;
+ uint8* bufu = bufy + w * h;
+ uint8* bufv = bufu + ((w + 1) >> 1) * ((h + 1) >> 1);
+ StretchToPlanes(bufy, bufu, bufv, w, (w + 1) >> 1, (w + 1) >> 1, w, h,
+ interpolate, crop);
+ }
+ return needed;
+}
+
+void CricketWebRTCVideoFrame::StretchToFrame(cricket::VideoFrame *target,
+ bool interpolate, bool crop) const {
+ if (!target) return;
+
+ StretchToPlanes(target->GetYPlane(),
+ target->GetUPlane(),
+ target->GetVPlane(),
+ target->GetYPitch(),
+ target->GetUPitch(),
+ target->GetVPitch(),
+ target->GetWidth(),
+ target->GetHeight(),
+ interpolate, crop);
+ target->SetElapsedTime(GetElapsedTime());
+ target->SetTimeStamp(GetTimeStamp());
+}
+
+cricket::VideoFrame* CricketWebRTCVideoFrame::Stretch(size_t w, size_t h,
+ bool interpolate, bool crop) const {
+ // TODO(ronghuawu): implement
+ CricketWebRTCVideoFrame* frame = new CricketWebRTCVideoFrame();
+ return frame;
+}
+
+CricketWebRTCVideoRenderer::CricketWebRTCVideoRenderer
+ (cricket::VideoRenderer* renderer)
+ :renderer_(renderer) {
+}
+
+CricketWebRTCVideoRenderer::~CricketWebRTCVideoRenderer() {
+}
+
+int CricketWebRTCVideoRenderer::FrameSizeChange(unsigned int width,
+ unsigned int height,
+ unsigned int numberOfStreams) {
+ ASSERT(renderer_ != NULL);
+ width_ = width;
+ height_ = height;
+ number_of_streams_ = numberOfStreams;
+ return renderer_->SetSize(width_, height_, 0) ? 0 : -1;
+}
+
+int CricketWebRTCVideoRenderer::DeliverFrame(unsigned char* buffer,
+ int bufferSize) {
+ ASSERT(renderer_ != NULL);
+ video_frame_.Attach(buffer, bufferSize, width_, height_);
+ return renderer_->RenderFrame(&video_frame_) ? 0 : -1;
+}
+
const RtcVideoEngine::VideoCodecPref RtcVideoEngine::kVideoCodecPrefs[] = {
{"VP8", 104, 0},
{"H264", 105, 1}
@@ -231,29 +439,23 @@
return (capture_id_ != -1);
}
-bool RtcVideoEngine::SetVideoRenderer(int channel_id,
- void* window,
- unsigned int zOrder,
- float left,
- float top,
- float right,
- float bottom) {
- int ret;
- if (channel_id == -1)
- channel_id = capture_id_;
- ret = video_engine_->render()->AddRenderer(
- channel_id, window, zOrder, left, top, right, bottom);
- if (ret !=0 )
- return false;
- ret = video_engine_->render()->StartRender(channel_id);
- if (ret !=0 )
- return false;
- return true;
-}
-
bool RtcVideoEngine::SetLocalRenderer(cricket::VideoRenderer* renderer) {
- LOG(LS_WARNING) << "Not required call SetLocalRenderer for webrtc";
- return false;
+ if (!local_renderer_.get()) {
+ local_renderer_.reset(new CricketWebRTCVideoRenderer(renderer));
+ } else {
+ // Renderer already set
+ return true;
+ }
+
+ int ret;
+ ret = video_engine_->render()->AddRenderer(capture_id_,
+ kVideoI420,
+ local_renderer_.get());
+ if (ret != 0)
+ return false;
+ ret = video_engine_->render()->StartRender(capture_id_);
+
+ return (ret == 0);
}
cricket::CaptureResult RtcVideoEngine::SetCapture(bool capture) {
@@ -565,7 +767,22 @@
bool RtcVideoMediaChannel::SetRenderer(
uint32 ssrc, cricket::VideoRenderer* renderer) {
- return false;
+ if (!remote_renderer_.get()) {
+ remote_renderer_.reset(new CricketWebRTCVideoRenderer(renderer));
+ } else {
+ // Renderer already set
+ return true;
+ }
+
+ int ret;
+ ret = engine_->video_engine()->render()->AddRenderer(video_channel_,
+ kVideoI420,
+ remote_renderer_.get());
+ if (ret != 0)
+ return false;
+ ret = engine_->video_engine()->render()->StartRender(video_channel_);
+
+ return (ret == 0);
}
bool RtcVideoMediaChannel::SetExternalRenderer(uint32 ssrc, void* renderer)
@@ -575,12 +792,11 @@
video_channel_,
kVideoI420,
static_cast<ExternalRenderer*>(renderer));
- if (ret !=0 )
+ if (ret != 0)
return false;
ret = engine_->video_engine()->render()->StartRender(video_channel_);
- if (ret !=0 )
- return false;
- return true;
+
+ return (ret == 0);
}
bool RtcVideoMediaChannel::GetStats(cricket::VideoMediaInfo* info) {
diff --git a/third_party_mods/libjingle/source/talk/app/videomediaengine.h b/third_party_mods/libjingle/source/talk/app/videomediaengine.h
index a5e9fce..4fdb629 100644
--- a/third_party_mods/libjingle/source/talk/app/videomediaengine.h
+++ b/third_party_mods/libjingle/source/talk/app/videomediaengine.h
@@ -49,6 +49,74 @@
class RtcVoiceEngine;
class ExternalRenderer;
+// CricketWebRTCVideoFrame only supports I420
+class CricketWebRTCVideoFrame : public cricket::VideoFrame {
+ public:
+ CricketWebRTCVideoFrame();
+ ~CricketWebRTCVideoFrame();
+
+ void Attach(unsigned char* buffer, int bufferSize, int w, int h);
+
+ virtual size_t GetWidth() const;
+ virtual size_t GetHeight() const;
+ virtual const uint8* GetYPlane() const;
+ virtual const uint8* GetUPlane() const;
+ virtual const uint8* GetVPlane() const;
+ virtual uint8* GetYPlane();
+ virtual uint8* GetUPlane();
+ virtual uint8* GetVPlane();
+ virtual int32 GetYPitch() const { return video_frame_.Width(); }
+ virtual int32 GetUPitch() const { return video_frame_.Width() / 2; }
+ virtual int32 GetVPitch() const { return video_frame_.Width() / 2; }
+
+ virtual size_t GetPixelWidth() const { return 1; }
+ virtual size_t GetPixelHeight() const { return 1; }
+ virtual int64 GetElapsedTime() const { return elapsed_time_; }
+ virtual int64 GetTimeStamp() const { return video_frame_.TimeStamp(); }
+ virtual void SetElapsedTime(int64 elapsed_time) {
+ elapsed_time_ = elapsed_time;
+ }
+ virtual void SetTimeStamp(int64 time_stamp) {
+ video_frame_.SetTimeStamp(time_stamp);
+ }
+
+ virtual VideoFrame* Copy() const;
+ virtual size_t CopyToBuffer(uint8* buffer, size_t size) const;
+ virtual size_t ConvertToRgbBuffer(uint32 to_fourcc, uint8* buffer,
+ size_t size, size_t pitch_rgb) const;
+ virtual void StretchToPlanes(uint8* y, uint8* u, uint8* v,
+ int32 pitchY, int32 pitchU, int32 pitchV,
+ size_t width, size_t height,
+ bool interpolate, bool crop) const;
+ virtual size_t StretchToBuffer(size_t w, size_t h, uint8* buffer, size_t size,
+ bool interpolate, bool crop) const;
+ virtual void StretchToFrame(VideoFrame* target, bool interpolate,
+ bool crop) const;
+ virtual VideoFrame* Stretch(size_t w, size_t h, bool interpolate,
+ bool crop) const;
+
+ private:
+ webrtc::VideoFrame video_frame_;
+ int64 elapsed_time_;
+};
+
+class CricketWebRTCVideoRenderer : public ExternalRenderer {
+ public:
+ CricketWebRTCVideoRenderer(cricket::VideoRenderer* renderer);
+
+ virtual int FrameSizeChange(unsigned int width, unsigned int height,
+ unsigned int numberOfStreams);
+ virtual int DeliverFrame(unsigned char* buffer, int bufferSize);
+ virtual ~CricketWebRTCVideoRenderer();
+
+ private:
+ cricket::VideoRenderer* renderer_;
+ CricketWebRTCVideoFrame video_frame_;
+ unsigned int width_;
+ unsigned int height_;
+ unsigned int number_of_streams_;
+};
+
class RtcVideoEngine : public ViEBaseObserver, public TraceCallback {
public:
RtcVideoEngine();
@@ -72,13 +140,6 @@
bool SetOptions(int options);
//TODO - need to change this interface for webrtc
bool SetCaptureDevice(const cricket::Device* device);
- bool SetVideoRenderer(int channel_id,
- void* window,
- unsigned int zOrder,
- float left,
- float top,
- float right,
- float bottom);
bool SetLocalRenderer(cricket::VideoRenderer* renderer);
cricket::CaptureResult SetCapture(bool capture);
const std::vector<cricket::VideoCodec>& codecs() const;
@@ -133,6 +194,7 @@
cricket::VideoEncoderConfig default_encoder_config_;
cricket::VideoCodec default_codec_;
bool capture_started_;
+ talk_base::scoped_ptr<CricketWebRTCVideoRenderer> local_renderer_;
};
class RtcVideoMediaChannel: public cricket::VideoMediaChannel,
@@ -188,6 +250,7 @@
bool sending_;
bool render_started_;
webrtc::VideoCodec send_codec_;
+ talk_base::scoped_ptr<CricketWebRTCVideoRenderer> remote_renderer_;
};
}
diff --git a/third_party_mods/libjingle/source/talk/app/webrtcchannelmanager.cc b/third_party_mods/libjingle/source/talk/app/webrtcchannelmanager.cc
deleted file mode 100644
index 8b624fd..0000000
--- a/third_party_mods/libjingle/source/talk/app/webrtcchannelmanager.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2011 Google Inc. All Rights Reserved.
-// Author: mallinath@google.com (Mallinath Bareddy)
-
-#include "talk/app/webrtcchannelmanager.h"
-
-namespace webrtc {
-
-struct VideoCaptureDeviceParams : public talk_base::MessageData {
- VideoCaptureDeviceParams(const std::string& cam_device)
- : cam_device(cam_device),
- result(false) {}
- const std::string cam_device;
- bool result;
-};
-
-struct RenderParams : public talk_base::MessageData {
- RenderParams(int channel_id,
- void* window,
- unsigned int zOrder,
- float left,
- float top,
- float right,
- float bottom)
- :channel_id(channel_id)
- ,window(window)
- ,zOrder(zOrder)
- ,left(left)
- ,top(top)
- ,right(right)
- ,bottom(bottom) {}
-
- int channel_id;
- void* window;
- unsigned int zOrder;
- float left;
- float top;
- float right;
- float bottom;
- bool result;
-};
-
-bool WebRtcChannelManager::Init() {
- return MaybeInit();
-}
-
-cricket::VoiceChannel* WebRtcChannelManager::CreateVoiceChannel(
- cricket::BaseSession* s, const std::string& content_name, bool rtcp) {
- return (MaybeInit()) ?
- ChannelManager::CreateVoiceChannel(s, content_name, rtcp) : NULL;
-}
-
-cricket::VideoChannel* WebRtcChannelManager::CreateVideoChannel(
- cricket::BaseSession* s, const std::string& content_name, bool rtcp,
- cricket::VoiceChannel* vc) {
- return (MaybeInit()) ?
- ChannelManager::CreateVideoChannel(s, content_name, rtcp, vc) : NULL;
-
-}
-
-cricket::Soundclip* WebRtcChannelManager::CreateSoundclip() {
- return (MaybeInit()) ? ChannelManager::CreateSoundclip() : NULL;
-}
-void WebRtcChannelManager::DestroyVoiceChannel(cricket::VoiceChannel* vc) {
- ChannelManager::DestroyVoiceChannel(vc);
- MaybeTerm();
-}
-void WebRtcChannelManager::DestroyVideoChannel(cricket::VideoChannel* vc) {
- ChannelManager::DestroyVideoChannel(vc);
- MaybeTerm();
-}
-void WebRtcChannelManager::DestroySoundclip(cricket::Soundclip* s) {
- ChannelManager::DestroySoundclip(s);
- MaybeTerm();
-}
-
-bool WebRtcChannelManager::MaybeInit() {
- bool ret = initialized();
- if (!ret) {
- ret = ChannelManager::Init();
- }
- return ret;
-}
-
-void WebRtcChannelManager::MaybeTerm() {
- if (initialized() && !has_channels()) {
- Terminate();
- }
-}
-
-bool WebRtcChannelManager::SetVideoRenderer(int channel_id,
- void* window,
- unsigned int zOrder,
- float left,
- float top,
- float right,
- float bottom) {
- if (MaybeInit()) {
- RenderParams params(channel_id, window, zOrder, left, top, right, bottom);
- return cricket::ChannelManager::Send(MSG_SETRTC_VIDEORENDERER, ¶ms);
- } else {
- return false;
- }
-}
-
-void WebRtcChannelManager::SetVideoRenderer_w(int channel_id,
- void* window,
- unsigned int zOrder,
- float left,
- float top,
- float right,
- float bottom) {
- ASSERT(worker_thread() == talk_base::Thread::Current());
- ASSERT(initialized());
- media_engine()->SetVideoRenderer(channel_id, window, zOrder, left, top, right, bottom);
-}
-
-void WebRtcChannelManager::OnMessage(talk_base::Message *message) {
- talk_base::MessageData* data = message->pdata;
- switch(message->message_id) {
- case MSG_SETRTC_VIDEORENDERER: {
- RenderParams* p = static_cast<RenderParams*>(data);
- SetVideoRenderer_w(p->channel_id,
- p->window,
- p->zOrder,
- p->left,
- p->top,
- p->right,
- p->bottom);
- break;
- }
- default: {
- ChannelManager::OnMessage(message);
- }
- }
-}
-
-} // namespace webrtc
diff --git a/third_party_mods/libjingle/source/talk/app/webrtcchannelmanager.h b/third_party_mods/libjingle/source/talk/app/webrtcchannelmanager.h
deleted file mode 100644
index b8f15a8..0000000
--- a/third_party_mods/libjingle/source/talk/app/webrtcchannelmanager.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2011 Google Inc. All Rights Reserved.
-// Author: mallinath@google.com (Mallinath Bareddy)
-
-
-#ifndef TALK_APP_WEBRTC_WEBRTCCHANNELMANAGER_H_
-#define TALK_APP_WEBRTC_WEBRTCCHANNELMANAGER_H_
-
-#include "talk/session/phone/channelmanager.h"
-
-namespace webrtc {
-
-class AudioDeviceModule;
-
-enum {
- MSG_SETRTC_VIDEORENDERER = 21, // Set internal video renderer
-};
-
-// WebRtcChannelManager automatically takes care of initialization and
-// cricket::ChannelManager. Terminates when not needed
-
-class WebRtcChannelManager : public cricket::ChannelManager {
- public:
- WebRtcChannelManager(talk_base::Thread* worker_thread)
- : ChannelManager(worker_thread) {
- }
-
- WebRtcChannelManager(cricket::MediaEngine* me, cricket::DeviceManager* dm,
- talk_base::Thread* worker_thread)
- : ChannelManager(me, dm, worker_thread) {
- }
-
- bool Init();
- cricket::VoiceChannel* CreateVoiceChannel(
- cricket::BaseSession* s, const std::string& content_name, bool rtcp);
- cricket::VideoChannel* CreateVideoChannel(
- cricket::BaseSession* s, const std::string& content_name, bool rtcp,
- cricket::VoiceChannel* vc);
- cricket::Soundclip* CreateSoundclip();
- void DestroyVoiceChannel(cricket::VoiceChannel* vc);
- void DestroyVideoChannel(cricket::VideoChannel* vc);
- void DestroySoundclip(cricket::Soundclip* s);
-
- bool SetVideoRenderer(int channel_id,
- void* window,
- unsigned int zOrder,
- float left,
- float top,
- float right,
- float bottom);
-
- private:
- bool MaybeInit();
- void MaybeTerm();
- void SetExternalAdm_w(AudioDeviceModule* external_adm);
- void SetVideoRenderer_w(int channel_id,
- void* window,
- unsigned int zOrder,
- float left,
- float top,
- float right,
- float bottom);
- void OnMessage(talk_base::Message *message);
-};
-
-} // namespace webrtc
-
-
-#endif /* TALK_APP_WEBRTC_WEBRTCCHANNELMANAGER_H_ */
diff --git a/third_party_mods/libjingle/source/talk/app/webrtcsessionimpl.cc b/third_party_mods/libjingle/source/talk/app/webrtcsessionimpl.cc
index 7c916c9..f71f6aa 100644
--- a/third_party_mods/libjingle/source/talk/app/webrtcsessionimpl.cc
+++ b/third_party_mods/libjingle/source/talk/app/webrtcsessionimpl.cc
@@ -29,20 +29,19 @@
#include <string>
#include <vector>
+#include "talk/app/pc_transport_impl.h"
+#include "talk/app/peerconnection.h"
+#include "talk/app/webrtc_json.h"
#include "talk/base/common.h"
#include "talk/base/json.h"
#include "talk/base/scoped_ptr.h"
#include "talk/p2p/base/constants.h"
#include "talk/p2p/base/sessiondescription.h"
#include "talk/p2p/base/p2ptransport.h"
-#include "talk/session/phone/mediasessionclient.h"
#include "talk/session/phone/channel.h"
-#include "talk/session/phone/voicechannel.h"
#include "talk/session/phone/channelmanager.h"
-#include "talk/app/webrtc_json.h"
-#include "talk/app/webrtcchannelmanager.h"
-#include "talk/app/peerconnection.h"
-#include "talk/app/pc_transport_impl.h"
+#include "talk/session/phone/mediasessionclient.h"
+#include "talk/session/phone/voicechannel.h"
using namespace cricket;
@@ -55,7 +54,7 @@
MSG_RTC_SETVIDEOCAPTURE = 4,
MSG_RTC_CANDIDATETIMEOUT = 5,
MSG_RTC_SETEXTERNALRENDERER = 6,
- MSG_RTC_SETRENDERER = 7,
+ MSG_RTC_SETCRICKETRENDERER = 7,
MSG_RTC_CHANNELENABLE = 8,
MSG_RTC_SIGNALONWRITABLESTATE = 9,
MSG_RTC_DESTROYVOICECHANNEL = 10,
@@ -107,29 +106,15 @@
bool result;
};
-struct RenderParams : public talk_base::MessageData {
- RenderParams(int channel_id,
- void* window,
- unsigned int zOrder,
- float left,
- float top,
- float right,
- float bottom)
- :channel_id(channel_id)
- ,window(window)
- ,zOrder(zOrder)
- ,left(left)
- ,top(top)
- ,right(right)
- ,bottom(bottom) {}
+struct CricketRenderParams : public talk_base::MessageData {
+ CricketRenderParams(const std::string& stream_id,
+ cricket::VideoRenderer* renderer)
+ : stream_id(stream_id),
+ renderer(renderer),
+ result(false) {}
- int channel_id;
- void* window;
- unsigned int zOrder;
- float left;
- float top;
- float right;
- float bottom;
+ const std::string stream_id;
+ cricket::VideoRenderer* renderer;
bool result;
};
@@ -159,7 +144,7 @@
const std::string& id,
const std::string& direction,
cricket::PortAllocator* allocator,
- WebRtcChannelManager* channelmgr,
+ cricket::ChannelManager* channelmgr,
PeerConnection* connection,
talk_base::Thread* signaling_thread)
: WebRTCSession(id, direction, allocator, connection, signaling_thread),
@@ -203,7 +188,7 @@
this, &WebRTCSessionImpl::OnVoiceChannelCreated);
signaling_thread_->Post(this, MSG_RTC_CREATEAUDIOCHANNEL,
- new CreateChannelParams(stream_id, false, NULL));
+ new CreateChannelParams(stream_id, true, NULL));
return true;
}
@@ -255,7 +240,7 @@
this, &WebRTCSessionImpl::OnVideoChannelCreated);
signaling_thread_->Post(this, MSG_RTC_CREATEVIDEOCHANNEL,
- new CreateChannelParams(stream_id, false, NULL));
+ new CreateChannelParams(stream_id, true, NULL));
return true;
}
@@ -304,6 +289,33 @@
}
bool WebRTCSessionImpl::SetVideoRenderer(const std::string& stream_id,
+ cricket::VideoRenderer* renderer) {
+ if(signaling_thread_ != talk_base::Thread::Current()) {
+ signaling_thread_->Post(this, MSG_RTC_SETCRICKETRENDERER,
+ new CricketRenderParams(stream_id, renderer),
+ true);
+ return true;
+ }
+
+ ASSERT(signaling_thread_ == talk_base::Thread::Current());
+
+ bool ret = false;
+ StreamMap::iterator iter;
+ for (iter = streams_.begin(); iter != streams_.end(); ++iter) {
+ StreamInfo* stream_info = (*iter);
+ if (stream_info->stream_id.compare(stream_id) == 0) {
+ ASSERT(stream_info->channel != NULL);
+ ASSERT(stream_info->video);
+ cricket::VideoChannel* channel = static_cast<cricket::VideoChannel*>(
+ stream_info->channel);
+ ret = channel->SetRenderer(0, renderer);
+ break;
+ }
+ }
+ return ret;
+}
+
+bool WebRTCSessionImpl::SetVideoRenderer(const std::string& stream_id,
ExternalRenderer* external_renderer) {
if(signaling_thread_ != talk_base::Thread::Current()) {
signaling_thread_->Post(this, MSG_RTC_SETEXTERNALRENDERER,
@@ -330,30 +342,6 @@
return ret;
}
-bool WebRTCSessionImpl::SetVideoRenderer(int channel_id,
- void* window,
- unsigned int zOrder,
- float left,
- float top,
- float right,
- float bottom) {
- signaling_thread_->Post(this, MSG_RTC_SETRENDERER,
- new RenderParams(channel_id, window, zOrder, left, top, right, bottom),
- true);
- return true;
-}
-
-bool WebRTCSessionImpl::SetVideoRenderer_w(int channel_id,
- void* window,
- unsigned int zOrder,
- float left,
- float top,
- float right,
- float bottom) {
- ASSERT(signaling_thread_ == talk_base::Thread::Current());
- return channel_manager_->SetVideoRenderer(channel_id, window, zOrder, left, top, right, bottom);
-}
-
void WebRTCSessionImpl::OnMessage(talk_base::Message* message) {
using talk_base::TypedMessageData;
talk_base::MessageData* data = message->pdata;
@@ -420,31 +408,25 @@
break;
}
case MSG_RTC_SETVIDEOCAPTURE : {
- CaptureParams* p = static_cast<CaptureParams*>(data);
+ CaptureParams* p = reinterpret_cast<CaptureParams*>(data);
p->result = SetVideoCapture_w(p->capture);
delete p;
break;
}
case MSG_RTC_SETEXTERNALRENDERER : {
- ExternalRenderParams* p = static_cast<ExternalRenderParams*> (data);
+ ExternalRenderParams* p = reinterpret_cast<ExternalRenderParams*>(data);
p->result = SetVideoRenderer(p->stream_id, p->external_renderer);
delete p;
break;
}
- case MSG_RTC_SETRENDERER : {
- RenderParams* p = static_cast<RenderParams*> (data);
- p->result = SetVideoRenderer_w(p->channel_id,
- p->window,
- p->zOrder,
- p->left,
- p->top,
- p->right,
- p->bottom);
+ case MSG_RTC_SETCRICKETRENDERER : {
+ CricketRenderParams* p = reinterpret_cast<CricketRenderParams*>(data);
+ p->result = SetVideoRenderer(p->stream_id, p->renderer);
delete p;
break;
}
case MSG_RTC_CHANNELENABLE : {
- ChannelEnableParams* p = static_cast<ChannelEnableParams*> (data);
+ ChannelEnableParams* p = reinterpret_cast<ChannelEnableParams*>(data);
ChannelEnable_w(p->channel, p->enable);
delete p;
break;
@@ -707,8 +689,6 @@
break;
}
}
-
- ASSERT(found);
}
void WebRTCSessionImpl::DestroyVoiceChannel_w(
diff --git a/third_party_mods/libjingle/source/talk/app/webrtcsessionimpl.h b/third_party_mods/libjingle/source/talk/app/webrtcsessionimpl.h
index 20a141a..95db057 100644
--- a/third_party_mods/libjingle/source/talk/app/webrtcsessionimpl.h
+++ b/third_party_mods/libjingle/source/talk/app/webrtcsessionimpl.h
@@ -79,7 +79,6 @@
class ExternalRenderer;
class PeerConnection;
-class WebRtcChannelManager;
class WebRTCSessionImpl: public WebRTCSession {
@@ -88,7 +87,7 @@
WebRTCSessionImpl(const std::string& id,
const std::string& direction,
cricket::PortAllocator* allocator,
- WebRtcChannelManager* channelmgr,
+ cricket::ChannelManager* channelmgr,
PeerConnection* connection,
talk_base::Thread* signaling_thread);
@@ -131,14 +130,10 @@
cricket::TransportChannel* channel);
void OnMessageReceived(const char* data, size_t data_size);
bool SetVideoRenderer(const std::string& stream_id,
+ cricket::VideoRenderer* renderer);
+ bool SetVideoRenderer(const std::string& stream_id,
ExternalRenderer* external_renderer);
- bool SetVideoRenderer(int channel_id,
- void* window,
- unsigned int zOrder,
- float left,
- float top,
- float right,
- float bottom);
+
sigslot::signal2<cricket::VideoChannel*, std::string&> SignalVideoChannel;
sigslot::signal2<cricket::VoiceChannel*, std::string&> SignalVoiceChannel;
sigslot::signal1<WebRTCSessionImpl*> SignalOnRemoveStream;
@@ -155,13 +150,6 @@
}
private:
- bool SetVideoRenderer_w(int channel_id,
- void* window,
- unsigned int zOrder,
- float left,
- float top,
- float right,
- float bottom);
void ChannelEnable_w(cricket::BaseChannel* channel, bool enable);
void OnVoiceChannelError(cricket::VoiceChannel* voice_channel, uint32 ssrc,
@@ -232,7 +220,7 @@
void SendLocalDescription_w();
- WebRtcChannelManager* channel_manager_;
+ cricket::ChannelManager* channel_manager_;
std::vector<StreamInfo*> streams_;
TransportChannelMap transport_channels_;
bool all_writable_;
diff --git a/third_party_mods/libjingle/source/talk/session/phone/channelmanager.cc b/third_party_mods/libjingle/source/talk/session/phone/channelmanager.cc
deleted file mode 100644
index 1c76f02..0000000
--- a/third_party_mods/libjingle/source/talk/session/phone/channelmanager.cc
+++ /dev/null
@@ -1,798 +0,0 @@
-/*
- * libjingle
- * Copyright 2004--2008, Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "talk/session/phone/channelmanager.h"
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <algorithm>
-
-#include "talk/base/common.h"
-#include "talk/base/logging.h"
-#include "talk/base/sigslotrepeater.h"
-#include "talk/base/stringencode.h"
-#include "talk/session/phone/mediaengine.h"
-#include "talk/session/phone/soundclip.h"
-
-namespace cricket {
-
-enum {
- MSG_CREATEVOICECHANNEL = 1,
- MSG_DESTROYVOICECHANNEL = 2,
- MSG_SETAUDIOOPTIONS = 3,
- MSG_GETOUTPUTVOLUME = 4,
- MSG_SETOUTPUTVOLUME = 5,
- MSG_SETLOCALMONITOR = 6,
- MSG_SETVOICELOGGING = 7,
- MSG_CREATEVIDEOCHANNEL = 11,
- MSG_DESTROYVIDEOCHANNEL = 12,
- MSG_SETVIDEOOPTIONS = 13,
- MSG_SETLOCALRENDERER = 14,
- MSG_SETDEFAULTVIDEOENCODERCONFIG = 15,
- MSG_SETVIDEOLOGGING = 16,
- MSG_CREATESOUNDCLIP = 17,
- MSG_DESTROYSOUNDCLIP = 18,
- MSG_CAMERASTARTED = 19,
- MSG_SETVIDEOCAPTURE = 20,
-};
-
-struct CreationParams : public talk_base::MessageData {
- CreationParams(BaseSession* session, const std::string& content_name,
- bool rtcp, VoiceChannel* voice_channel)
- : session(session),
- content_name(content_name),
- rtcp(rtcp),
- voice_channel(voice_channel),
- video_channel(NULL) {}
- BaseSession* session;
- std::string content_name;
- bool rtcp;
- VoiceChannel* voice_channel;
- VideoChannel* video_channel;
-};
-
-struct AudioOptions : public talk_base::MessageData {
- AudioOptions(int o, const Device* in, const Device* out)
- : options(o), in_device(in), out_device(out) {}
- int options;
- const Device* in_device;
- const Device* out_device;
- bool result;
-};
-
-struct VolumeLevel : public talk_base::MessageData {
- VolumeLevel() : level(-1), result(false) {}
- explicit VolumeLevel(int l) : level(l), result(false) {}
- int level;
- bool result;
-};
-
-struct VideoOptions : public talk_base::MessageData {
- explicit VideoOptions(const Device* d) : cam_device(d), result(false) {}
- const Device* cam_device;
- bool result;
-};
-
-struct DefaultVideoEncoderConfig : public talk_base::MessageData {
- explicit DefaultVideoEncoderConfig(const VideoEncoderConfig& c)
- : config(c), result(false) {}
- VideoEncoderConfig config;
- bool result;
-};
-
-struct LocalMonitor : public talk_base::MessageData {
- explicit LocalMonitor(bool e) : enable(e), result(false) {}
- bool enable;
- bool result;
-};
-
-struct LocalRenderer : public talk_base::MessageData {
- explicit LocalRenderer(VideoRenderer* r) : renderer(r), result(false) {}
- VideoRenderer* renderer;
- bool result;
-};
-
-struct LoggingOptions : public talk_base::MessageData {
- explicit LoggingOptions(int lev, const char* f) : level(lev), filter(f) {}
- int level;
- std::string filter;
-};
-
-struct CaptureParams : public talk_base::MessageData {
- explicit CaptureParams(bool c) : capture(c), result(CR_FAILURE) {}
-
- bool capture;
- CaptureResult result;
-};
-
-ChannelManager::ChannelManager(talk_base::Thread* worker_thread)
- : media_engine_(MediaEngine::Create()),
- device_manager_(new DeviceManager()),
- initialized_(false),
- main_thread_(talk_base::Thread::Current()),
- worker_thread_(worker_thread),
- audio_in_device_(DeviceManager::kDefaultDeviceName),
- audio_out_device_(DeviceManager::kDefaultDeviceName),
- audio_options_(MediaEngine::DEFAULT_AUDIO_OPTIONS),
- local_renderer_(NULL),
- capturing_(false),
- monitoring_(false) {
- Construct();
-}
-
-ChannelManager::ChannelManager(MediaEngine* me, DeviceManager* dm,
- talk_base::Thread* worker_thread)
- : media_engine_(me),
- device_manager_(dm),
- initialized_(false),
- main_thread_(talk_base::Thread::Current()),
- worker_thread_(worker_thread),
- audio_in_device_(DeviceManager::kDefaultDeviceName),
- audio_out_device_(DeviceManager::kDefaultDeviceName),
- audio_options_(MediaEngine::DEFAULT_AUDIO_OPTIONS),
- local_renderer_(NULL),
- capturing_(false),
- monitoring_(false) {
- Construct();
-}
-
-void ChannelManager::Construct() {
- // Init the device manager immediately, and set up our default video device.
- SignalDevicesChange.repeat(device_manager_->SignalDevicesChange);
- device_manager_->Init();
- // Set camera_device_ to the name of the default video capturer.
- SetVideoOptions(DeviceManager::kDefaultDeviceName);
-
- // Camera is started asynchronously, request callbacks when startup
- // completes to be able to forward them to the rendering manager.
- media_engine_->SignalVideoCaptureResult.connect(
- this, &ChannelManager::OnVideoCaptureResult);
-}
-
-ChannelManager::~ChannelManager() {
- if (initialized_)
- Terminate();
-}
-
-int ChannelManager::GetCapabilities() {
- return media_engine_->GetCapabilities() & device_manager_->GetCapabilities();
-}
-
-void ChannelManager::GetSupportedAudioCodecs(
- std::vector<AudioCodec>* codecs) const {
- codecs->clear();
-
- for (std::vector<AudioCodec>::const_iterator it =
- media_engine_->audio_codecs().begin();
- it != media_engine_->audio_codecs().end(); ++it) {
- codecs->push_back(*it);
- }
-}
-
-void ChannelManager::GetSupportedVideoCodecs(
- std::vector<VideoCodec>* codecs) const {
- codecs->clear();
-
- std::vector<VideoCodec>::const_iterator it;
- for (it = media_engine_->video_codecs().begin();
- it != media_engine_->video_codecs().end(); ++it) {
- codecs->push_back(*it);
- }
-}
-
-bool ChannelManager::Init() {
- ASSERT(!initialized_);
- if (initialized_) {
- return false;
- }
-
- ASSERT(worker_thread_ != NULL);
- if (worker_thread_ && worker_thread_->started()) {
- if (media_engine_->Init()) {
- initialized_ = true;
- // Now that we're initialized, apply any stored preferences. A preferred
- // device might have been unplugged. In this case, we fallback to the
- // default device but keep the user preferences. The preferences are
- // changed only when the Javascript FE changes them.
- const std::string preferred_audio_in_device = audio_in_device_;
- const std::string preferred_audio_out_device = audio_out_device_;
- const std::string preferred_camera_device = camera_device_;
- Device device;
- if (!device_manager_->GetAudioInputDevice(audio_in_device_, &device)) {
- LOG(LS_WARNING) << "The preferred microphone '" << audio_in_device_
- << "' is unavailable. Fall back to the default.";
- audio_in_device_ = DeviceManager::kDefaultDeviceName;
- }
- if (!device_manager_->GetAudioOutputDevice(audio_out_device_, &device)) {
- LOG(LS_WARNING) << "The preferred speaker '" << audio_out_device_
- << "' is unavailable. Fall back to the default.";
- audio_out_device_ = DeviceManager::kDefaultDeviceName;
- }
- if (!device_manager_->GetVideoCaptureDevice(camera_device_, &device)) {
- if (!camera_device_.empty()) {
- LOG(LS_WARNING) << "The preferred camera '" << camera_device_
- << "' is unavailable. Fall back to the default.";
- }
- camera_device_ = DeviceManager::kDefaultDeviceName;
- }
-
- if (!SetAudioOptions(audio_in_device_, audio_out_device_,
- audio_options_)) {
- LOG(LS_WARNING) << "Failed to SetAudioOptions with"
- << " microphone: " << audio_in_device_
- << " speaker: " << audio_out_device_
- << " options: " << audio_options_;
- }
- if (!SetVideoOptions(camera_device_) && !camera_device_.empty()) {
- LOG(LS_WARNING) << "Failed to SetVideoOptions with camera: "
- << camera_device_;
- }
-
- // Restore the user preferences.
- audio_in_device_ = preferred_audio_in_device;
- audio_out_device_ = preferred_audio_out_device;
- camera_device_ = preferred_camera_device;
-
- // Now apply the default video codec that has been set earlier.
- if (default_video_encoder_config_.max_codec.id != 0) {
- SetDefaultVideoEncoderConfig(default_video_encoder_config_);
- }
- // And the local renderer.
- if (local_renderer_) {
- SetLocalRenderer(local_renderer_);
- }
- }
-
- }
- return initialized_;
-}
-
-void ChannelManager::Terminate() {
- ASSERT(initialized_);
- if (!initialized_) {
- return;
- }
-
- // Need to destroy the voice/video channels
- while (!video_channels_.empty()) {
- DestroyVideoChannel_w(video_channels_.back());
- }
- while (!voice_channels_.empty()) {
- DestroyVoiceChannel_w(voice_channels_.back());
- }
- while (!soundclips_.empty()) {
- DestroySoundclip_w(soundclips_.back());
- }
-
- media_engine_->Terminate();
- initialized_ = false;
-}
-
-VoiceChannel* ChannelManager::CreateVoiceChannel(
- BaseSession* session, const std::string& content_name, bool rtcp) {
- CreationParams params(session, content_name, rtcp, NULL);
- return (Send(MSG_CREATEVOICECHANNEL, ¶ms)) ? params.voice_channel : NULL;
-}
-
-VoiceChannel* ChannelManager::CreateVoiceChannel_w(
- BaseSession* session, const std::string& content_name, bool rtcp) {
- talk_base::CritScope cs(&crit_);
-
- // This is ok to alloc from a thread other than the worker thread
- ASSERT(initialized_);
- VoiceMediaChannel* media_channel = media_engine_->CreateChannel();
- if (media_channel == NULL)
- return NULL;
-
- VoiceChannel* voice_channel = new VoiceChannel(
- worker_thread_, media_engine_.get(), media_channel,
- session, content_name, rtcp);
- voice_channels_.push_back(voice_channel);
- return voice_channel;
-}
-
-void ChannelManager::DestroyVoiceChannel(VoiceChannel* voice_channel) {
- if (voice_channel) {
- talk_base::TypedMessageData<VoiceChannel *> data(voice_channel);
- Send(MSG_DESTROYVOICECHANNEL, &data);
- }
-}
-
-void ChannelManager::DestroyVoiceChannel_w(VoiceChannel* voice_channel) {
- talk_base::CritScope cs(&crit_);
- // Destroy voice channel.
- ASSERT(initialized_);
- VoiceChannels::iterator it = std::find(voice_channels_.begin(),
- voice_channels_.end(), voice_channel);
- ASSERT(it != voice_channels_.end());
- if (it == voice_channels_.end())
- return;
-
- voice_channels_.erase(it);
- delete voice_channel;
-}
-
-VideoChannel* ChannelManager::CreateVideoChannel(
- BaseSession* session, const std::string& content_name, bool rtcp,
- VoiceChannel* voice_channel) {
- CreationParams params(session, content_name, rtcp, voice_channel);
- return (Send(MSG_CREATEVIDEOCHANNEL, ¶ms)) ? params.video_channel : NULL;
-}
-
-VideoChannel* ChannelManager::CreateVideoChannel_w(
- BaseSession* session, const std::string& content_name, bool rtcp,
- VoiceChannel* voice_channel) {
- talk_base::CritScope cs(&crit_);
-
- // This is ok to alloc from a thread other than the worker thread
- ASSERT(initialized_);
- VideoMediaChannel* media_channel =
- // voice_channel can be NULL in case of NullVoiceEngine.
- media_engine_->CreateVideoChannel(voice_channel ?
- voice_channel->media_channel() : NULL);
- if (media_channel == NULL)
- return NULL;
-
- VideoChannel* video_channel = new VideoChannel(
- worker_thread_, media_engine_.get(), media_channel,
- session, content_name, rtcp, voice_channel);
- video_channels_.push_back(video_channel);
- return video_channel;
-}
-
-void ChannelManager::DestroyVideoChannel(VideoChannel* video_channel) {
- if (video_channel) {
- talk_base::TypedMessageData<VideoChannel *> data(video_channel);
- Send(MSG_DESTROYVIDEOCHANNEL, &data);
- }
-}
-
-void ChannelManager::DestroyVideoChannel_w(VideoChannel *video_channel) {
- talk_base::CritScope cs(&crit_);
- // Destroy voice channel.
- ASSERT(initialized_);
- VideoChannels::iterator it = std::find(video_channels_.begin(),
- video_channels_.end(), video_channel);
- if (it == video_channels_.end())
- return;
-
- video_channels_.erase(it);
- delete video_channel;
-}
-
-Soundclip* ChannelManager::CreateSoundclip() {
- talk_base::TypedMessageData<Soundclip*> data(NULL);
- Send(MSG_CREATESOUNDCLIP, &data);
- return data.data();
-}
-
-Soundclip* ChannelManager::CreateSoundclip_w() {
- talk_base::CritScope cs(&crit_);
-
- ASSERT(initialized_);
- ASSERT(worker_thread_ == talk_base::Thread::Current());
-
- SoundclipMedia* soundclip_media = media_engine_->CreateSoundclip();
- if (!soundclip_media) {
- return NULL;
- }
-
- Soundclip* soundclip = new Soundclip(worker_thread_, soundclip_media);
- soundclips_.push_back(soundclip);
- return soundclip;
-}
-
-void ChannelManager::DestroySoundclip(Soundclip* soundclip) {
- if (soundclip) {
- talk_base::TypedMessageData<Soundclip*> data(soundclip);
- Send(MSG_DESTROYSOUNDCLIP, &data);
- }
-}
-
-void ChannelManager::DestroySoundclip_w(Soundclip* soundclip) {
- talk_base::CritScope cs(&crit_);
- // Destroy soundclip.
- ASSERT(initialized_);
- Soundclips::iterator it = std::find(soundclips_.begin(),
- soundclips_.end(), soundclip);
- ASSERT(it != soundclips_.end());
- if (it == soundclips_.end())
- return;
-
- soundclips_.erase(it);
- delete soundclip;
-}
-
-bool ChannelManager::GetAudioOptions(std::string* in_name,
- std::string* out_name, int* opts) {
- *in_name = audio_in_device_;
- *out_name = audio_out_device_;
- *opts = audio_options_;
- return true;
-}
-
-bool ChannelManager::SetAudioOptions(const std::string& in_name,
- const std::string& out_name, int opts) {
- // Get device ids from DeviceManager.
- Device in_dev, out_dev;
- if (!device_manager_->GetAudioInputDevice(in_name, &in_dev)) {
- LOG(LS_WARNING) << "Failed to GetAudioInputDevice: " << in_name;
- return false;
- }
- if (!device_manager_->GetAudioOutputDevice(out_name, &out_dev)) {
- LOG(LS_WARNING) << "Failed to GetAudioOutputDevice: " << out_name;
- return false;
- }
-
- // If we're initialized, pass the settings to the media engine.
- bool ret = true;
- if (initialized_) {
- AudioOptions options(opts, &in_dev, &out_dev);
- ret = (Send(MSG_SETAUDIOOPTIONS, &options) && options.result);
- }
-
- // If all worked well, save the values for use in GetAudioOptions.
- if (ret) {
- audio_options_ = opts;
- audio_in_device_ = in_name;
- audio_out_device_ = out_name;
- }
- return ret;
-}
-
-bool ChannelManager::SetAudioOptions_w(int opts, const Device* in_dev,
- const Device* out_dev) {
- ASSERT(worker_thread_ == talk_base::Thread::Current());
- ASSERT(initialized_);
-
- // Set audio options
- bool ret = media_engine_->SetAudioOptions(opts);
-
- // Set the audio devices
- if (ret) {
- talk_base::CritScope cs(&crit_);
- ret = media_engine_->SetSoundDevices(in_dev, out_dev);
- }
-
- return ret;
-}
-
-bool ChannelManager::GetOutputVolume(int* level) {
- VolumeLevel volume;
- if (!Send(MSG_GETOUTPUTVOLUME, &volume) || !volume.result) {
- return false;
- }
-
- *level = volume.level;
- return true;
-}
-
-bool ChannelManager::GetOutputVolume_w(int* level) {
- ASSERT(worker_thread_ == talk_base::Thread::Current());
- ASSERT(initialized_);
- return media_engine_->GetOutputVolume(level);
-}
-
-bool ChannelManager::SetOutputVolume(int level) {
- VolumeLevel volume(level);
- return (Send(MSG_SETOUTPUTVOLUME, &volume) && volume.result);
-}
-
-bool ChannelManager::SetOutputVolume_w(int level) {
- ASSERT(worker_thread_ == talk_base::Thread::Current());
- ASSERT(initialized_);
- return media_engine_->SetOutputVolume(level);
-}
-
-bool ChannelManager::GetVideoOptions(std::string* cam_name) {
- *cam_name = camera_device_;
- return true;
-}
-
-bool ChannelManager::SetVideoOptions(const std::string& cam_name) {
- Device device;
- if (!device_manager_->GetVideoCaptureDevice(cam_name, &device)) {
- if (!cam_name.empty()) {
- LOG(LS_WARNING) << "Device manager can't find camera: " << cam_name;
- }
- return false;
- }
-
- // If we're running, tell the media engine about it.
- bool ret = true;
- if (initialized_) {
- VideoOptions options(&device);
- ret = (Send(MSG_SETVIDEOOPTIONS, &options) && options.result);
- }
-
- // If everything worked, retain the name of the selected camera.
- if (ret) {
- camera_device_ = device.name;
- }
- return ret;
-}
-
-bool ChannelManager::SetVideoOptions_w(const Device* cam_device) {
- ASSERT(worker_thread_ == talk_base::Thread::Current());
- ASSERT(initialized_);
-
- // Set the video input device
- return media_engine_->SetVideoCaptureDevice(cam_device);
-}
-
-bool ChannelManager::SetDefaultVideoEncoderConfig(const VideoEncoderConfig& c) {
- bool ret = true;
- if (initialized_) {
- DefaultVideoEncoderConfig config(c);
- ret = Send(MSG_SETDEFAULTVIDEOENCODERCONFIG, &config) && config.result;
- }
- if (ret) {
- default_video_encoder_config_ = c;
- }
- return ret;
-}
-
-bool ChannelManager::SetDefaultVideoEncoderConfig_w(
- const VideoEncoderConfig& c) {
- ASSERT(worker_thread_ == talk_base::Thread::Current());
- ASSERT(initialized_);
- return media_engine_->SetDefaultVideoEncoderConfig(c);
-}
-
-bool ChannelManager::SetLocalMonitor(bool enable) {
- LocalMonitor monitor(enable);
- bool ret = Send(MSG_SETLOCALMONITOR, &monitor) && monitor.result;
- if (ret) {
- monitoring_ = enable;
- }
- return ret;
-}
-
-bool ChannelManager::SetLocalMonitor_w(bool enable) {
- ASSERT(worker_thread_ == talk_base::Thread::Current());
- ASSERT(initialized_);
- return media_engine_->SetLocalMonitor(enable);
-}
-
-bool ChannelManager::SetLocalRenderer(VideoRenderer* renderer) {
- bool ret = true;
- if (initialized_) {
- LocalRenderer local(renderer);
- ret = (Send(MSG_SETLOCALRENDERER, &local) && local.result);
- }
- if (ret) {
- local_renderer_ = renderer;
- }
- return ret;
-}
-
-bool ChannelManager::SetLocalRenderer_w(VideoRenderer* renderer) {
- ASSERT(worker_thread_ == talk_base::Thread::Current());
- ASSERT(initialized_);
- return media_engine_->SetLocalRenderer(renderer);
-}
-
-CaptureResult ChannelManager::SetVideoCapture(bool capture) {
- bool ret;
- CaptureParams capture_params(capture);
- ret = (Send(MSG_SETVIDEOCAPTURE, &capture_params) &&
- (capture_params.result != CR_FAILURE));
- if (ret) {
- capturing_ = capture;
- }
- return capture_params.result;
-}
-
-CaptureResult ChannelManager::SetVideoCapture_w(bool capture) {
- ASSERT(worker_thread_ == talk_base::Thread::Current());
- ASSERT(initialized_);
- return media_engine_->SetVideoCapture(capture);
-}
-
-void ChannelManager::SetVoiceLogging(int level, const char* filter) {
- SetMediaLogging(false, level, filter);
-}
-
-void ChannelManager::SetVideoLogging(int level, const char* filter) {
- SetMediaLogging(true, level, filter);
-}
-
-void ChannelManager::SetMediaLogging(bool video, int level,
- const char* filter) {
- // Can be called before initialization; in this case, the worker function
- // is simply called on the main thread.
- if (initialized_) {
- LoggingOptions options(level, filter);
- Send((video) ? MSG_SETVIDEOLOGGING : MSG_SETVOICELOGGING, &options);
- } else {
- SetMediaLogging_w(video, level, filter);
- }
-}
-
-void ChannelManager::SetMediaLogging_w(bool video, int level,
- const char* filter) {
- // Can be called before initialization
- ASSERT(worker_thread_ == talk_base::Thread::Current() || !initialized_);
- if (video) {
- media_engine_->SetVideoLogging(level, filter);
- } else {
- media_engine_->SetVoiceLogging(level, filter);
- }
-}
-
-bool ChannelManager::Send(uint32 id, talk_base::MessageData* data) {
- if (!worker_thread_ || !initialized_) return false;
- worker_thread_->Send(this, id, data);
- return true;
-}
-
-void ChannelManager::OnVideoCaptureResult(CaptureResult result) {
- capturing_ = result == CR_SUCCESS;
- main_thread_->Post(this, MSG_CAMERASTARTED,
- new talk_base::TypedMessageData<CaptureResult>(result));
-}
-
-void ChannelManager::OnMessage(talk_base::Message* message) {
- talk_base::MessageData* data = message->pdata;
- switch (message->message_id) {
- case MSG_CREATEVOICECHANNEL: {
- CreationParams* p = static_cast<CreationParams*>(data);
- p->voice_channel =
- CreateVoiceChannel_w(p->session, p->content_name, p->rtcp);
- break;
- }
- case MSG_DESTROYVOICECHANNEL: {
- VoiceChannel* p = static_cast<talk_base::TypedMessageData<VoiceChannel*>*>
- (data)->data();
- DestroyVoiceChannel_w(p);
- break;
- }
- case MSG_CREATEVIDEOCHANNEL: {
- CreationParams* p = static_cast<CreationParams*>(data);
- p->video_channel = CreateVideoChannel_w(p->session, p->content_name,
- p->rtcp, p->voice_channel);
- break;
- }
- case MSG_DESTROYVIDEOCHANNEL: {
- VideoChannel* p = static_cast<talk_base::TypedMessageData<VideoChannel*>*>
- (data)->data();
- DestroyVideoChannel_w(p);
- break;
- }
- case MSG_CREATESOUNDCLIP: {
- talk_base::TypedMessageData<Soundclip*> *p =
- static_cast<talk_base::TypedMessageData<Soundclip*>*>(data);
- p->data() = CreateSoundclip_w();
- break;
- }
- case MSG_DESTROYSOUNDCLIP: {
- talk_base::TypedMessageData<Soundclip*> *p =
- static_cast<talk_base::TypedMessageData<Soundclip*>*>(data);
- DestroySoundclip_w(p->data());
- break;
- }
- case MSG_SETAUDIOOPTIONS: {
- AudioOptions* p = static_cast<AudioOptions*>(data);
- p->result = SetAudioOptions_w(p->options,
- p->in_device, p->out_device);
- break;
- }
- case MSG_GETOUTPUTVOLUME: {
- VolumeLevel* p = static_cast<VolumeLevel*>(data);
- p->result = GetOutputVolume_w(&p->level);
- break;
- }
- case MSG_SETOUTPUTVOLUME: {
- VolumeLevel* p = static_cast<VolumeLevel*>(data);
- p->result = SetOutputVolume_w(p->level);
- break;
- }
- case MSG_SETLOCALMONITOR: {
- LocalMonitor* p = static_cast<LocalMonitor*>(data);
- p->result = SetLocalMonitor_w(p->enable);
- break;
- }
- case MSG_SETVIDEOOPTIONS: {
- VideoOptions* p = static_cast<VideoOptions*>(data);
- p->result = SetVideoOptions_w(p->cam_device);
- break;
- }
- case MSG_SETDEFAULTVIDEOENCODERCONFIG: {
- DefaultVideoEncoderConfig* p =
- static_cast<DefaultVideoEncoderConfig*>(data);
- p->result = SetDefaultVideoEncoderConfig_w(p->config);
- break;
- }
- case MSG_SETLOCALRENDERER: {
- LocalRenderer* p = static_cast<LocalRenderer*>(data);
- p->result = SetLocalRenderer_w(p->renderer);
- break;
- }
- case MSG_SETVIDEOCAPTURE: {
- CaptureParams* p = static_cast<CaptureParams*>(data);
- p->result = SetVideoCapture_w(p->capture);
- break;
- }
- case MSG_SETVOICELOGGING:
- case MSG_SETVIDEOLOGGING: {
- LoggingOptions* p = static_cast<LoggingOptions*>(data);
- bool video = (message->message_id == MSG_SETVIDEOLOGGING);
- SetMediaLogging_w(video, p->level, p->filter.c_str());
- break;
- }
- case MSG_CAMERASTARTED: {
- talk_base::TypedMessageData<CaptureResult>* data =
- static_cast<talk_base::TypedMessageData<CaptureResult>*>(
- message->pdata);
- SignalVideoCaptureResult(data->data());
- delete data;
- break;
- }
- }
-}
-
-static void GetDeviceNames(const std::vector<Device>& devs,
- std::vector<std::string>* names) {
- names->clear();
- for (size_t i = 0; i < devs.size(); ++i) {
- names->push_back(devs[i].name);
- }
-}
-
-bool ChannelManager::GetAudioInputDevices(std::vector<std::string>* names) {
- names->clear();
- std::vector<Device> devs;
- bool ret = device_manager_->GetAudioInputDevices(&devs);
- if (ret)
- GetDeviceNames(devs, names);
-
- return ret;
-}
-
-bool ChannelManager::GetAudioOutputDevices(std::vector<std::string>* names) {
- names->clear();
- std::vector<Device> devs;
- bool ret = device_manager_->GetAudioOutputDevices(&devs);
- if (ret)
- GetDeviceNames(devs, names);
-
- return ret;
-}
-
-bool ChannelManager::GetVideoCaptureDevices(std::vector<std::string>* names) {
- names->clear();
- std::vector<Device> devs;
- bool ret = device_manager_->GetVideoCaptureDevices(&devs);
- if (ret)
- GetDeviceNames(devs, names);
-
- return ret;
-}
-
-} // namespace cricket
diff --git a/third_party_mods/libjingle/source/talk/session/phone/channelmanager.h b/third_party_mods/libjingle/source/talk/session/phone/channelmanager.h
deleted file mode 100644
index bfdf5d5..0000000
--- a/third_party_mods/libjingle/source/talk/session/phone/channelmanager.h
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * libjingle
- * Copyright 2004--2008, Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef TALK_SESSION_PHONE_CHANNELMANAGER_H_
-#define TALK_SESSION_PHONE_CHANNELMANAGER_H_
-
-#include <string>
-#include <vector>
-
-#include "talk/base/criticalsection.h"
-#include "talk/base/sigslotrepeater.h"
-#include "talk/base/thread.h"
-#include "talk/p2p/base/session.h"
-#include "talk/session/phone/voicechannel.h"
-#include "talk/session/phone/mediaengine.h"
-#include "talk/session/phone/devicemanager.h"
-
-namespace cricket {
-
-class Soundclip;
-class VoiceChannel;
-
-// ChannelManager allows the MediaEngine to run on a separate thread, and takes
-// care of marshalling calls between threads. It also creates and keeps track of
-// voice and video channels; by doing so, it can temporarily pause all the
-// channels when a new audio or video device is chosen. The voice and video
-// channels are stored in separate vectors, to easily allow operations on just
-// voice or just video channels.
-// ChannelManager also allows the application to discover what devices it has
-// using device manager.
-class ChannelManager : public talk_base::MessageHandler,
- public sigslot::has_slots<> {
- public:
- // Creates the channel manager, and specifies the worker thread to use.
- explicit ChannelManager(talk_base::Thread* worker);
- // For testing purposes. Allows the media engine and dev manager to be mocks.
- // The ChannelManager takes ownership of these objects.
- ChannelManager(MediaEngine* me, DeviceManager* dm, talk_base::Thread* worker);
- ~ChannelManager();
-
- // Accessors for the worker thread, allowing it to be set after construction,
- // but before Init. set_worker_thread will return false if called after Init.
- talk_base::Thread* worker_thread() const { return worker_thread_; }
- bool set_worker_thread(talk_base::Thread* thread) {
- if (initialized_) return false;
- worker_thread_ = thread;
- return true;
- }
-
- // Gets capabilities. Can be called prior to starting the media engine.
- int GetCapabilities();
-
- // Retrieves the list of supported audio & video codec types.
- // Can be called before starting the media engine.
- void GetSupportedAudioCodecs(std::vector<AudioCodec>* codecs) const;
- void GetSupportedVideoCodecs(std::vector<VideoCodec>* codecs) const;
-
- // Indicates whether the media engine is started.
- bool initialized() const { return initialized_; }
- // Starts up the media engine.
- bool Init();
- // TODO: Remove this temporary API once Flute is updated.
- bool Init(talk_base::Thread* thread) {
- return set_worker_thread(thread) && Init();
- }
- // Shuts down the media engine.
- void Terminate();
-
- // The operations below all occur on the worker thread.
-
- // Creates a voice channel, to be associated with the specified session.
- VoiceChannel* CreateVoiceChannel(
- BaseSession* session, const std::string& content_name, bool rtcp);
- // Destroys a voice channel created with the Create API.
- void DestroyVoiceChannel(VoiceChannel* voice_channel);
- // Creates a video channel, synced with the specified voice channel, and
- // associated with the specified session.
- VideoChannel* CreateVideoChannel(
- BaseSession* session, const std::string& content_name, bool rtcp,
- VoiceChannel* voice_channel);
- // Destroys a video channel created with the Create API.
- void DestroyVideoChannel(VideoChannel* video_channel);
-
- // Creates a soundclip.
- Soundclip* CreateSoundclip();
- // Destroys a soundclip created with the Create API.
- void DestroySoundclip(Soundclip* soundclip);
-
- // Indicates whether any channels exist.
- bool has_channels() const {
- return (!voice_channels_.empty() || !video_channels_.empty() ||
- !soundclips_.empty());
- }
-
- // Configures the audio and video devices.
- bool GetAudioOptions(std::string* wave_in_device,
- std::string* wave_out_device, int* opts);
- bool SetAudioOptions(const std::string& wave_in_device,
- const std::string& wave_out_device, int opts);
- bool GetOutputVolume(int* level);
- bool SetOutputVolume(int level);
- bool GetVideoOptions(std::string* cam_device);
- bool SetVideoOptions(const std::string& cam_device);
- bool SetDefaultVideoEncoderConfig(const VideoEncoderConfig& config);
-
- // Starts/stops the local microphone and enables polling of the input level.
- bool SetLocalMonitor(bool enable);
- bool monitoring() const { return monitoring_; }
- // Sets the local renderer where to renderer the local camera.
- bool SetLocalRenderer(VideoRenderer* renderer);
- // Starts and stops the local camera and renders it to the local renderer.
- CaptureResult SetVideoCapture(bool capture);
- bool capturing() const { return capturing_; }
-
- // Configures the logging output of the mediaengine(s).
- void SetVoiceLogging(int level, const char* filter);
- void SetVideoLogging(int level, const char* filter);
-
- // The operations below occur on the main thread.
-
- bool GetAudioInputDevices(std::vector<std::string>* names);
- bool GetAudioOutputDevices(std::vector<std::string>* names);
- bool GetVideoCaptureDevices(std::vector<std::string>* names);
- sigslot::repeater0<> SignalDevicesChange;
- sigslot::signal1<CaptureResult> SignalVideoCaptureResult;
-
- protected:
- bool Send(uint32 id, talk_base::MessageData* pdata);
- void OnMessage(talk_base::Message *message);
- MediaEngine* media_engine() { return media_engine_.get(); }
-
- private:
- typedef std::vector<VoiceChannel*> VoiceChannels;
- typedef std::vector<VideoChannel*> VideoChannels;
- typedef std::vector<Soundclip*> Soundclips;
-
- void Construct();
- VoiceChannel* CreateVoiceChannel_w(
- BaseSession* session, const std::string& content_name, bool rtcp);
- void DestroyVoiceChannel_w(VoiceChannel* voice_channel);
- VideoChannel* CreateVideoChannel_w(
- BaseSession* session, const std::string& content_name, bool rtcp,
- VoiceChannel* voice_channel);
- void DestroyVideoChannel_w(VideoChannel* video_channel);
- Soundclip* CreateSoundclip_w();
- void DestroySoundclip_w(Soundclip* soundclip);
- bool SetAudioOptions_w(int opts, const Device* in_dev,
- const Device* out_dev);
- bool GetOutputVolume_w(int* level);
- bool SetOutputVolume_w(int level);
- bool SetLocalMonitor_w(bool enable);
- bool SetVideoOptions_w(const Device* cam_device);
- bool SetDefaultVideoEncoderConfig_w(const VideoEncoderConfig& config);
- bool SetLocalRenderer_w(VideoRenderer* renderer);
- CaptureResult SetVideoCapture_w(bool capture);
- void SetMediaLogging(bool video, int level, const char* filter);
- void SetMediaLogging_w(bool video, int level, const char* filter);
- void OnVideoCaptureResult(CaptureResult result);
-
- talk_base::CriticalSection crit_;
- talk_base::scoped_ptr<MediaEngine> media_engine_;
- talk_base::scoped_ptr<DeviceManager> device_manager_;
- bool initialized_;
- talk_base::Thread* main_thread_;
- talk_base::Thread* worker_thread_;
-
- VoiceChannels voice_channels_;
- VideoChannels video_channels_;
- Soundclips soundclips_;
-
- std::string audio_in_device_;
- std::string audio_out_device_;
- int audio_options_;
- std::string camera_device_;
- VideoEncoderConfig default_video_encoder_config_;
- VideoRenderer* local_renderer_;
-
- bool capturing_;
- bool monitoring_;
-};
-
-} // namespace cricket
-
-#endif // TALK_SESSION_PHONE_CHANNELMANAGER_H_
diff --git a/third_party_mods/libjingle/source/talk/session/phone/mediaengine.h b/third_party_mods/libjingle/source/talk/session/phone/mediaengine.h
deleted file mode 100644
index 05f0821..0000000
--- a/third_party_mods/libjingle/source/talk/session/phone/mediaengine.h
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * libjingle
- * Copyright 2004--2007, Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef TALK_SESSION_PHONE_MEDIAENGINE_H_
-#define TALK_SESSION_PHONE_MEDIAENGINE_H_
-
-#ifdef OSX
-#include <CoreAudio/CoreAudio.h>
-#endif
-
-#include <string>
-#include <vector>
-
-#include "talk/base/sigslotrepeater.h"
-#include "talk/session/phone/codec.h"
-#include "talk/session/phone/devicemanager.h"
-#include "talk/session/phone/mediachannel.h"
-#include "talk/session/phone/videocommon.h"
-
-namespace cricket {
-
-// A class for playing out soundclips.
-class SoundclipMedia {
- public:
- enum SoundclipFlags {
- SF_LOOP = 1,
- };
-
- virtual ~SoundclipMedia() {}
-
- // Plays a sound out to the speakers with the given audio stream. The stream
- // must be 16-bit little-endian 16 kHz PCM. If a stream is already playing
- // on this SoundclipMedia, it is stopped. If clip is NULL, nothing is played.
- // Returns whether it was successful.
- virtual bool PlaySound(const char *clip, int len, int flags) = 0;
-};
-
-// MediaEngine is an abstraction of a media engine which can be subclassed
-// to support different media componentry backends. It supports voice and
-// video operations in the same class to facilitate proper synchronization
-// between both media types.
-class MediaEngine {
- public:
- // TODO: Move this to a global location (also used in DeviceManager)
- // Capabilities of the media engine.
- enum Capabilities {
- AUDIO_RECV = 1 << 0,
- AUDIO_SEND = 1 << 1,
- VIDEO_RECV = 1 << 2,
- VIDEO_SEND = 1 << 3,
- };
-
- // Bitmask flags for options that may be supported by the media engine
- // implementation
- enum AudioOptions {
- ECHO_CANCELLATION = 1 << 0,
- AUTO_GAIN_CONTROL = 1 << 1,
- DEFAULT_AUDIO_OPTIONS = ECHO_CANCELLATION | AUTO_GAIN_CONTROL
- };
- enum VideoOptions {
- };
-
- virtual ~MediaEngine() {}
- static MediaEngine* Create();
-
- // Initialization
- // Starts the engine.
- virtual bool Init() = 0;
- // Shuts down the engine.
- virtual void Terminate() = 0;
- // Returns what the engine is capable of, as a set of Capabilities, above.
- virtual int GetCapabilities() = 0;
-
- // MediaChannel creation
- // Creates a voice media channel. Returns NULL on failure.
- virtual VoiceMediaChannel *CreateChannel() = 0;
- // Creates a video media channel, paired with the specified voice channel.
- // Returns NULL on failure.
- virtual VideoMediaChannel *CreateVideoChannel(
- VoiceMediaChannel* voice_media_channel) = 0;
-
- // Creates a soundclip object for playing sounds on. Returns NULL on failure.
- virtual SoundclipMedia *CreateSoundclip() = 0;
-
- // Configuration
- // Sets global audio options. "options" are from AudioOptions, above.
- virtual bool SetAudioOptions(int options) = 0;
- // Sets global video options. "options" are from VideoOptions, above.
- virtual bool SetVideoOptions(int options) = 0;
- // Sets the default (maximum) codec/resolution and encoder option to capture
- // and encode video.
- virtual bool SetDefaultVideoEncoderConfig(const VideoEncoderConfig& config)
- = 0;
-
- // Device selection
- // TODO: Add method for selecting the soundclip device.
- virtual bool SetSoundDevices(const Device* in_device,
- const Device* out_device) = 0;
- virtual bool SetVideoCaptureDevice(const Device* cam_device) = 0;
- virtual bool SetVideoRenderer(int channel_id,
- void* window,
- unsigned int zOrder,
- float left,
- float top,
- float right,
- float bottom) = 0;
-
- // Device configuration
- // Gets the current speaker volume, as a value between 0 and 255.
- virtual bool GetOutputVolume(int* level) = 0;
- // Sets the current speaker volume, as a value between 0 and 255.
- virtual bool SetOutputVolume(int level) = 0;
-
- // Local monitoring
- // Gets the current microphone level, as a value between 0 and 10.
- virtual int GetInputLevel() = 0;
- // Starts or stops the local microphone. Useful if local mic info is needed
- // prior to a call being connected; the mic will be started automatically
- // when a VoiceMediaChannel starts sending.
- virtual bool SetLocalMonitor(bool enable) = 0;
- // Installs a callback for raw frames from the local camera.
- virtual bool SetLocalRenderer(VideoRenderer* renderer) = 0;
- // Starts/stops local camera.
- virtual CaptureResult SetVideoCapture(bool capture) = 0;
-
- virtual const std::vector<AudioCodec>& audio_codecs() = 0;
- virtual const std::vector<VideoCodec>& video_codecs() = 0;
-
- // Logging control
- virtual void SetVoiceLogging(int min_sev, const char* filter) = 0;
- virtual void SetVideoLogging(int min_sev, const char* filter) = 0;
-
- sigslot::repeater1<CaptureResult> SignalVideoCaptureResult;
-};
-
-// CompositeMediaEngine constructs a MediaEngine from separate
-// voice and video engine classes.
-template<class VOICE, class VIDEO>
-class CompositeMediaEngine : public MediaEngine {
- public:
- CompositeMediaEngine() {}
- virtual ~CompositeMediaEngine() {}
- virtual bool Init() {
- if (!voice_.Init())
- return false;
- if (!video_.Init()) {
- voice_.Terminate();
- return false;
- }
- SignalVideoCaptureResult.repeat(video_.SignalCaptureResult);
- return true;
- }
- virtual void Terminate() {
- video_.Terminate();
- voice_.Terminate();
- }
-
- virtual int GetCapabilities() {
- return (voice_.GetCapabilities() | video_.GetCapabilities());
- }
- virtual VoiceMediaChannel *CreateChannel() {
- return voice_.CreateChannel();
- }
- virtual VideoMediaChannel *CreateVideoChannel(VoiceMediaChannel* channel) {
- return video_.CreateChannel(channel);
- }
- virtual SoundclipMedia *CreateSoundclip() {
- return voice_.CreateSoundclip();
- }
-
- virtual bool SetAudioOptions(int o) {
- return voice_.SetOptions(o);
- }
- virtual bool SetVideoOptions(int o) {
- return video_.SetOptions(o);
- }
- virtual bool SetDefaultVideoEncoderConfig(const VideoEncoderConfig& config) {
- return video_.SetDefaultEncoderConfig(config);
- }
-
- virtual bool SetSoundDevices(const Device* in_device,
- const Device* out_device) {
- return voice_.SetDevices(in_device, out_device);
- }
-
- virtual bool SetVideoCaptureDevice(const Device* cam_device) {
- return video_.SetCaptureDevice(cam_device);
- }
-
- virtual bool SetVideoRenderer(int channel_id,
- void* window,
- unsigned int zOrder,
- float left,
- float top,
- float right,
- float bottom) {
- return video_.SetVideoRenderer(channel_id,
- window,
- zOrder,
- left,
- top,
- right,
- bottom);
- }
-
- virtual bool GetOutputVolume(int* level) {
- return voice_.GetOutputVolume(level);
- }
-
- virtual bool SetOutputVolume(int level) {
- return voice_.SetOutputVolume(level);
- }
-
- virtual int GetInputLevel() {
- return voice_.GetInputLevel();
- }
- virtual bool SetLocalMonitor(bool enable) {
- return voice_.SetLocalMonitor(enable);
- }
- virtual bool SetLocalRenderer(VideoRenderer* renderer) {
- return video_.SetLocalRenderer(renderer);
- }
- virtual CaptureResult SetVideoCapture(bool capture) {
- return video_.SetCapture(capture);
- }
-
- virtual const std::vector<AudioCodec>& audio_codecs() {
- return voice_.codecs();
- }
- virtual const std::vector<VideoCodec>& video_codecs() {
- return video_.codecs();
- }
-
- virtual void SetVoiceLogging(int min_sev, const char* filter) {
- return voice_.SetLogging(min_sev, filter);
- }
- virtual void SetVideoLogging(int min_sev, const char* filter) {
- return video_.SetLogging(min_sev, filter);
- }
-
- protected:
- VOICE voice_;
- VIDEO video_;
-};
-
-// NullVoiceEngine can be used with CompositeMediaEngine in the case where only
-// a video engine is desired.
-class NullVoiceEngine {
- public:
- bool Init() { return true; }
- void Terminate() {}
- int GetCapabilities() { return 0; }
- // If you need this to return an actual channel, use FakeMediaEngine instead.
- VoiceMediaChannel* CreateChannel() {
- return NULL;
- }
- SoundclipMedia* CreateSoundclip() {
- return NULL;
- }
- bool SetOptions(int opts) { return true; }
- bool SetDevices(const Device* in_device, const Device* out_device) {
- return true;
- }
- bool GetOutputVolume(int* level) { *level = 0; return true; }
- bool SetOutputVolume(int level) { return true; }
- int GetInputLevel() { return 0; }
- bool SetLocalMonitor(bool enable) { return true; }
- const std::vector<AudioCodec>& codecs() { return codecs_; }
- void SetLogging(int min_sev, const char* filter) {}
- private:
- std::vector<AudioCodec> codecs_;
-};
-
-// NullVideoEngine can be used with CompositeMediaEngine in the case where only
-// a voice engine is desired.
-class NullVideoEngine {
- public:
- bool Init() { return true; }
- void Terminate() {}
- int GetCapabilities() { return 0; }
- // If you need this to return an actual channel, use FakeMediaEngine instead.
- VideoMediaChannel* CreateChannel(
- VoiceMediaChannel* voice_media_channel) {
- return NULL;
- }
- bool SetOptions(int opts) { return true; }
- bool SetDefaultEncoderConfig(const VideoEncoderConfig& config) {
- return true;
- }
- bool SetCaptureDevice(const Device* cam_device) { return true; }
- bool SetLocalRenderer(VideoRenderer* renderer) { return true; }
- CaptureResult SetCapture(bool capture) { return CR_SUCCESS; }
- const std::vector<VideoCodec>& codecs() { return codecs_; }
- void SetLogging(int min_sev, const char* filter) {}
- sigslot::signal1<CaptureResult> SignalCaptureResult;
- private:
- std::vector<VideoCodec> codecs_;
-};
-
-typedef CompositeMediaEngine<NullVoiceEngine, NullVideoEngine> NullMediaEngine;
-
-} // namespace cricket
-
-#endif // TALK_SESSION_PHONE_MEDIAENGINE_H_