Libjingle

1. Introduction

Libjingle is a set of components provided by Google to implement Jingle
protocols XEP-166 (http://xmpp.org/extensions/xep-0166.html) and XEP-167
(http://xmpp.org/extensions/xep-0167.html). Libjingle is also backward
compatible with Google Talk Call Signaling
(http://code.google.com/apis/talk/call_signaling.html). This package will
create several static libraries you may link to your projects as needed.

-talk               - No source files in talk/, just these subdirectories
|-base              - Contains basic low-level portable utility functions for
|                     things like threads and sockets
|-p2p               - The P2P stack
  |-base            - Base p2p functionality
  |-client          - Hooks to tie it into XMPP
|-session           - Signaling
  |-phone           - Signaling code specific to making phone calls
    |-testdata      - Samples of RTP voice and video dump
  |-tunnel          - Tunnel session and channel
|-third_party       - Folder for third party libraries
  |-libudev         - Folder containing libudev.h
|-xmllite           - XML parser
|-xmpp              - XMPP engine

In addition, this package contains two examples in talk/examples which
illustrate the basic concepts of how the provided classes work.

2. How to Build

2.1 Prerequisites

Libjingle is built with swtoolkit (http://code.google.com/p/swtoolkit/), which
is a set of extensions to the open-source SCons build tool (www.scons.org).

  * First, install Python 2.4 or later from http://www.python.org/.
    Please note that since swtoolkit only works with Python 2.x, you will
    not be able to use Python 3.x.

    python --version to confirm that python is in your path, and 2.4 or greater.

  * Second, install the stand alone scons-local zip package 2.0.0 or later from
    http://www.scons.org/download.php and set an environment variable,
    SCONS_DIR, to point to the directory containing SCons.
    For example, on Windows, download
    http://sourceforge.net/projects/scons/files/scons-src/2.0.1/scons-local-2.0.1.zip
    Unzip to C:\src\libjingle\scons-local\
    set SCONS_DIR=C:\src\libjingle\scons-local\scons-local-2.0.1

  * Third, install swtoolkit from http://code.google.com/p/swtoolkit/.
    For example, on Windows download
    http://code.google.com/p/swtoolkit/downloads/detail?name=swtoolkit.0.9.1.zip
    Unzip to C:\src
    Optionally add swtoolkit to path.  Otherwise call hammer.bat directly.
    set PATH_TO_SWTOOLKIT=c:\src\swtoolkit
    set PATH=%PATH_TO_SWTOOLKIT%;%PATH%

  * Finally, download and install the unit test framework from
    http://code.google.com/p/googletest/downloads/list
    To install it, just unzip the package and put the file folder under
    /talk/third_party/ directory and rename it from "gtest-x.x.x" to "gtest",
    so that your folder structure looks like:
    /talk/third_party/gtest/...

2.2 libjingle

Libjingle needs to be downloaded and patched

  * First, install Libjingle.  Since this README lives within Libjingle,
    this step is normally already done.
    Libjingle home page is here http://code.google.com/p/libjingle/
    For example, on Windows, download
    http://libjingle.googlecode.com/files/libjingle-0.5.2.zip
    unzip to C:\src\

  * Second, Libjingle depends on two open-source projects, expat and srtp.
    Download expat from http://sourceforge.net/projects/expat/ to
    talk/third_party/expat-2.0.1/. Download srtp at
    http://libjingle.googlecode.com/files/srtp-cvs.zip to
    talk/third_party/srtp. Note that srtp-1.4.4 does not work since it misses
    the extensions used by Libjingle.
    If you put expat or srtp in a different directory, you need to edit
    talk/libjingle.scons correspondingly.
    rename srtp-cvs to srtp
    For example, on Windows, download expat
    http://sourceforge.net/projects/expat/files/expat/2.0.1/expat-2.0.1.tar.gz
    Unzip to C:\src\libjingle-0.5.2\talk\third_party
    Download srtp
    http://libjingle.googlecode.com/files/srtp-cvs.zip
    Unzip to C:\src\libjingle-0.5.2\talk\third_party
    rename C:\src\libjingle-0.5.2\talk\third_party\srtp-cvs srtp

  * Third, on Windows, copy config.h
    copy talk\third_party\srtp\config.hw talk\third_party\srtp\crypto\include\config.h

2.2 Build Libjingle under Linux or OS X
  * On Linux, you need to install libssl-dev, libasound2-dev and gtk+2.0.
  * Some optional new features in OpenSSL are only available in OpenSSL v1.0
    and above. To build with new OpenSSL features, you need to add the
    "HAS_OPENSSL_1_0" to the cppdefine under the
    "talk.Library(env, name = jingle..." section in the "libjingle.scons" file.
    Then download the OpenSSL v1.0 from the following URL:
    http://www.openssl.org/source/openssl-1.0.0e.tar.gz
    Unzip the downloaded package to the "third_party/openssl", such that it creates
    the directory "third_party/openssl/include/", etc.
  * To build Libjingle, first make sure the SCONS_DIR environment variable
    is set correctly.
  * Second, run talk/third_party/expat-2.0.1/configure and
    talk/third_party/srtp/configure.
  * Third, go to the talk/ directory and run $path_to_swtoolkit/hammer.sh. Run
    $path_to_swtoolkit/hammer.sh --help for information on how to build for
    different modes.

2.3 Build Libjingle under Windows
  * First, make sure the SCONS_DIR environment variable is set correctly and
    Microsoft Visual Studio is installed.
    dir %SCONS_DIR%
    Should show a folder containing Scons\
  * Second, go to the talk\ directory and run %PATH_TO_SWTOOLKIT%\hammer.bat.
    To get help run:
    %PATH_TO_SWTOOLKIT%\hammer.bat --help
    different modes. You can run the last step under Visual Studio Command
    Prompt if Visual Studio tools are not under the path environment variable.
    Example to build call.exe
    %PATH_TO_SWTOOLKIT%\hammer.bat
    Example to build opt and dbg all programs
    %PATH_TO_SWTOOLKIT%\hammer.bat --jobs=6 --verbose --mode=all all_programs


The built binaries are under talk/build/dbg/staging or talk/build/opt/staging,
depending on the build mode. When the build is complete, you can run the
examples, login or call. For the call sample, you can specify the input and
output RTP dump for voice and video. This package provides two samples of input
RTP dump: voice.rtpdump is a single channel, 16Khz voice encoded with G722, and
video.rtpdump is 320x240 video encoded with H264 AVC at 30 frames per second.
These provided samples will inter-operate with Google Talk Video. If you use
other input RTP dump, you may need to change the codecs in call_main.cc, lines
215 - 222.

Libjingle also builds two server tools, a relay server and a STUN server. The
relay server may be used to relay traffic when a direct peer-to-peer connection
could not be established. The STUN Server implements the STUN protocol for
Simple Traversal of UDP over NAT. See the Libjingle Developer Guide at
http://code.google.com/apis/talk/index.html for information about configuring a
client to use this relay server and this STUN server.

To use LinphoneMediaEngine, you need to perform the following additional steps:
  * Download and install the "MediaStreamer" library on your
    machine.
  * Add the following lines into the libjingle.scons file.
    In the "talk.Library(env, name = "libjingle",..." section, you need to add:
      "HAVE_LINPHONE",
      "HAVE_SPEEX",
      "HAVE_ILBC",
    to the "cppdefines = [".

    In the "talk.App(env, name = "call",..." section, you need to add:
      "mediastreamer",
    to the "libs = [".
  * In the libjingle.scons file, add the following line into the "srcs = [ ..."
    section of the "libjingle" Library.
      "session/phone/linphonemediaengine.cc",
