`

[Libjingle代码分析]随记

阅读更多

call_main.cc的main()方法中创建CallClient对象:
CallClient *client = new CallClient(pump.client());


CallClient is the top level manager for all calls in a voice chat application.



当登陆到Server后, XmppClient的SignalStateChange会传到CallClient::OnStateChange(), 这里会调用函数:
InitPhone();

在InitPhone()中一些很重要的对象被创建, 这些对象会在程序运行过程中一直被使用:
// 创建并运行Worker线程
worker_thread_ = new talk_base::Thread();
worker_thread_->Start();

// 创建NetworkManager对象
network_manager_ = new talk_base::NetworkManager();

// 创建PortAllocator对象
talk_base::SocketAddress stun_addr("stun.l.google.com", 19302);
  port_allocator_ =
      new cricket::BasicPortAllocator(network_manager_, stun_addr,
          talk_base::SocketAddress(), talk_base::SocketAddress(),
          talk_base::SocketAddress());
         
// 创建SessionManager对象
session_manager_ = new cricket::SessionManager(
      port_allocator_, worker_thread_);
     
     
// 创建并运行SessionManagerTask任务
session_manager_task_ =
      new cricket::SessionManagerTask(xmpp_client_, session_manager_);
  session_manager_task_->EnableOutgoingMessages();
  session_manager_task_->Start();   

// 创建MediaEngine对象
media_engine_ = cricket::MediaEngine::Create();        

// 创建MediaSessionClient对象
media_client_ = new cricket::MediaSessionClient(
      xmpp_client_->jid(),
      session_manager_,
      media_engine_,
      new cricket::DeviceManager());    
     
     
 当要place voice call的时候, CallClient::MakeCallTo()->CallClient::PlaceCall()被调用, 在CallClient::PlaceCall()里, Call对象和Session对象会被创建:
 call_ = media_client_->CreateCall();
 session_ = call_->InitiateSession(jid, options);
 
 
 MediaSessionClient is the top level manager for Call objects, each of which represents one or more voice chat connections. It also is the top level manager for handles creating the offer description by collecting the list of codecs supported by the computer. In addition to the base SessionClient tasks, it handles voice chat specific tasks such as reading and generating codec lists, choosing a codec, and managing global audio settings. It creates Call objects and the ChannelManager object. The application instantiates this object.

Call handles one or more Session objects, each representing a connection between two users. A multi-person chat would consist of a single Call object managing several Session objects, one per connection. The Call object handles the top-level jobs for that call, for example ending sessions, making a call to another user, accepting an incoming call, handling audio tasks such as mute and monitoring, and so on. It sends signals when sessions are created, ended, or change state (connecting, running, and so on). For outgoing calls, the application instantiates this object; for incoming calls, it is instantiated for you by MediaSessionClient.


在Call::InitiateSession()里,
Session *session = session_client_->CreateSession(this);
AddSession(session, offer);
session->Initiate(jid.Str(), offer);
 
在Call::AddSession()里,
voice_channel = session_client_->channel_manager()->CreateVoiceChannel(
      session, audio_offer->name, video_);

video_channel = session_client_->channel_manager()->CreateVideoChannel(
        session, video_offer->name, true, voice_channel);


在ChannelManager::CreateVoiceChannel()里, 调用CreateVoiceChannel_w(),然后创建VoiceChannel对象:
VoiceChannel* voice_channel = new VoiceChannel(
      worker_thread_, media_engine_.get(), media_channel,
      session, content_name, rtcp);

而VoiceChannel对象创建时会创建TransportChannel对象:
VoiceChannel::VoiceChannel(talk_base::Thread* thread,
                           MediaEngine* media_engine,
                           VoiceMediaChannel* media_channel,
                           BaseSession* session,
                           const std::string& content_name,
                           bool rtcp)
    : BaseChannel(thread, media_engine, media_channel, session, content_name,
                  session->CreateChannel(content_name, "rtp")),
      received_media_(false) {
  ...
}
而Session::CreateChannel()会首先创建(如果已经创建则直接获得)Transport对象:
TransportProxy* transproxy = GetOrCreateTransportProxy(content_name);
return transproxy->CreateChannel(channel_name, content_type_);


在Session::GetOrCreateTransportProxy()中,
Transport* transport =
      new P2PTransport(signaling_thread_,
                       session_manager_->worker_thread(),
                       session_manager_->port_allocator());
                      
在TransportProxy::CreateChannel()中,
TransportChannelProxy* channel =
      new TransportChannelProxy(name, content_type);


在Session::Initiate()里, 会调用SendInitiateMessage()发送session initiate消息给远端. 然后改变状态为STATE_SENTINITIATE, 这个会触发SignalState, 传给Call::OnSessionState().
然后触发SignalSessionState, 传给CallClient::OnSessionState(), CallClient会显示"Calling...".
在Session::Initiate()里, 也会调用SpeculativelyConnectAllTransportChannels(). TransportProxy::SpeculativelyConnectChannels()->Transport::ConnectChannels()->Transport::ConnectChannels_w()
->P2PTransportChannel::Connect()->
// Kick off an allocator session
Allocate();
->SignalRequestSignaling->Transport::OnChannelRequestSignaling()->SignalRequestSignaling->Session::OnTransportRequestSignaling()->SignalRequestSignaling->SessionManager::OnRequestSignaling()->CallClient::OnRequestSignaling()()
->session_manager_->OnSignalingReady()
->Session::OnSignalingReady()->Transport::OnSignalingReady()->P2PTransportChannel::OnSignalingReady()
->AddAllocatorSession(allocator_->CreateSession(name(), content_type()));
->PortAllocatorSession::GetInitialPorts()->BasicPortAllocatorSession::GetInitialPorts()->BasicPortAllocatorSession::OnAllocate()->AllocationSequence::OnMessage()->CreateUDPPorts()/CreateStunPorts()/CreateTCPPorts()              

分享到:
评论

相关推荐

    带GIPS的libjingle source

    标题 "带GIPS的libjingle source" 指的是一个包含GIPS(Global IP Sound)技术的libjingle源代码库。libjingle是Google开发的一个开源项目,主要用于实现跨平台的实时通信(RTC)功能,特别是网络音视频通话。GIPS是...

    VS2010编译libjingle0.6.2步骤

    知识点解释:python 是一门高级编程语言,它广泛应用于各种领域,包括科学计算、数据分析、人工智能等。在编译 libjingle 库时,python 是必不可少的依赖项。 3. expat 下载和安装:expat 是一个 XML 解析库,...

    libjingle文档和0.4.0版本源码

    3. **运行示例**:如果有示例程序,运行并分析它们的工作原理,这将加深对libjingle功能的理解。 4. **调试和修改**:利用调试器逐步执行代码,观察变量变化;尝试修改源码并观察结果,以验证理解是否正确。 5. **...

    libjingle vs2010 编译通过

    编译libjingle意味着你需要将源代码转换为可执行的二进制文件或库,以便在你的项目中使用。这个过程通常包括配置项目设置、解决依赖关系、处理预处理器定义和链接库等步骤。 首先,你需要获取libjingle的源代码,这...

    Libjingle 通过vs2005编译

    目前GOOGLECODE上的最新更新删除了libjingle.vcproj文件,采用scons脚本进行编译,增加了学习门槛,本次下载包增加了libjingle.vcproj文件并且已经通过了vs2005编译,方便大家学习使用。 Libjingle - Google Talk ...

    libjingle-0.5.1.zip

    8. **libjingle-0.5.1**:这个版本的libjingle包含了0.5.1版的源代码、库文件和其他资源,可能包括头文件、编译脚本、示例代码等,供开发者在构建自己的WebRTC应用时使用。 总的来说,“libjingle-0.5.1.zip”对于...

    libjingle0.6.14

    描述中的"libjingle0.6.14 版本,p2p学习"暗示了这个压缩包可能是为了学习libjingle库的P2P功能而准备的资源,可能包含了源代码、文档、示例或者其他有助于理解P2P通信机制的材料。 **libjingle库详解** libjingle...

    libjingle源码(linux版本)

    通过学习libjingle的源代码,开发者可以深入了解P2P通信的底层实现,掌握如何在实际项目中应用P2P技术,解决网络通信中的各种挑战,如NAT穿透、媒体流传输、安全保护等。同时,libjingle作为一个成熟的开源项目,其...

    libjingle的封装库

    - **源代码**:包含封装后的libjingle库源代码,开发者可以直接导入到项目中使用。 - **头文件**:封装后的API定义,供开发者在代码中调用。 - **示例**:可能包含一些简单的示例应用,展示如何初始化、建立连接和...

    libjingle,P2P传输的开源库

    P2P传输的开源库,通过libjingle我们可以建立一个直通的网络连接(无视中间的NAT、防火墙、中继服务器和代理等),无需特别关心Session建立的细节(加解密、格式等),直接进行数据的交换

    libjingle_peerconnection

    《深入理解libjingle_peerconnection:WebRTC的核心组件》 libjingle_peerconnection是Google开源项目WebRTC(Web Real-Time Communication)中的关键组件,它在实时通信领域扮演着至关重要的角色。WebRTC是一种...

    libjingle-0.6.2.

    Libjingle是Google提供的C++组件集,它为Google Talk的点对点通讯与语音呼叫功能提供交互操作性。组件包包括了Jingle和Jingle-Audio的google实现的源代码,它们是XMPP标准的推荐扩展,目前试验版可用。 我们发布此...

    libjingle0.6.14编译好的.lib

    2. **xmpphelp.lib** - 提示这可能包含与XMPP(Extensible Messaging and Presence Protocol)相关的代码。XMPP是一种开放的即时通讯协议,常用于在线聊天、语音和视频通话等应用。 3. **srtp.lib** - SRTP(Secure ...

    android webrtc libjingle_peerconnection

    这个压缩包“android webrtc libjingle_peerconnection_builds”包含了构建和使用WebRTC库所需的所有资源,包括源代码、示例应用以及编译构建脚本。这使得开发者能够深入理解WebRTC的工作原理,并将其集成到自己的...

    libjingle源码(含GIPS LITE)

    libjingle源码(含GIPS LITE),方便大家编译上传

    基于海思芯片(ARM平台)的libjingle静态库(交叉编译).rar

    Libjingle是一个方便实现P2P传输的开源库,由google公司开发,并与2005年12月15日发布第一个版本,可以粗略的看成是Jingle协议的C++实现库(peakflys注:只是和Jingle协议非常相似,并不完全兼容,区别以后介绍),...

    libjingle_peerconnection_so.so

    最完全,最全面的Android框架列表libjingle_peerconnection_so

    libjingle在windows和ubuntu-linux上编译方法

    ### libjingle在Windows与Ubuntu-Linux上的编译方法 #### 概述 本文主要针对libjingle(版本包括但不限于0.6.6、0.6.9和最新的0.6.10)在Windows与Ubuntu Linux操作系统上的编译过程进行详细介绍,并分享了在编译...

    【自整理】源于谷歌的libjingle的API (libjingle Reference).xlsx

    源:https://developers.google.com/talk/libjingle/reference/ 语言:English 源于谷歌的libjingle的API。 个人整理成表格,方便开发时查找。 希望能帮助相关开发者。

Global site tag (gtag.js) - Google Analytics