/* $Id$ */
/* 
 * Copyright (C)2003-2006 Benny Prijono <benny@prijono.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 */
#ifndef __PJMEDIA_DOXYGEN_H__
#define __PJMEDIA_DOXYGEN_H__

/**
 * @file doxygen.h
 * @brief Doxygen's mainpage.
 */

/**
 * @defgroup PJMEDIA PJMEDIA Library
 */

/*////////////////////////////////////////////////////////////////////////// */
/*
	INTRODUCTION PAGE
 */

/**
 * @mainpage PJMEDIA and PJMEDIA-CODEC
 *
 * \n
 * @section intro_sec PJMEDIA
 *
 * PJMEDIA is a rather complete media stack, distributed under Open Source/GPL
 * terms, and featuring small footprint and good extensibility and portability.
 *
 * Please click the <A HREF="modules.htm"><b>Modules</b></A> link on top
 * of this page to get the complete features currently present in PJMEDIA.
 *
 * Also please read the documentation about @ref PJMEDIA_PORT_CONCEPT,
 * which is a major concept that is used for implementing many objects in 
 * the library.
 *
 * \n
 * @section pjmedia_codec_sec PJMEDIA-CODEC
 *
 * PJMEDIA-CODEC is a static library containing various codec implementations,
 * wrapped into PJMEDIA codec framework. The static library is designed as
 * such so that only codecs that are explicitly initialized are linked with 
 * the application, therefore keeping the application size in control.
 *
 * Please see @ref pjmedia_codec_page on how to use the codec in 
 * PJMEDIA-CODEC.
 *
 * \n
 * @section pjmedia_lic Copying and Acknowledgements
 *
 * Please see @ref lic_stuffs page for the details.
 */


/**
 * @page pjmedia_codec_page Using PJMEDIA-CODEC
 *
 * Before application can use a codec, it needs to initialize and register
 * the codec to the codec manager. This is accomplished with using
 * constructs like the following:
 *
 \code
    #include <pjmedia.h>
    #include <pjmedia-codec.h>

    init_codecs( pjmedia_endpt *med_ept )
    {
	// Register G.711 codecs
	pjmedia_codec_g711_init(med_ept);

	// Register GSM codec.
	pjmedia_codec_gsm_init(med_ept);

	// Register Speex codecs.
	// With the default flag, this will register three codecs:
	// speex/8000, speex/16000, and speex/32000
	pjmedia_codec_speex_init(med_ept, 0, 0, 0);
    }
 \endcode
 *
 * After the codec is registered, application may create the encoder/decoder
 * instance, by using the API as documented in @ref PJMEDIA_CODEC.
 */



/**
 * @page lic_stuffs Copying and Acknowledgements
 * @section lic_stuff Copying and Acknowledgements
 * @subsection pjmedia_about_subsec About PJMEDIA
 *
 * PJMEDIA is distributed under GPL terms (other licensing schemes may be 
 * arranged):
 \verbatim
    Copyright (C) 2003-2006 Benny Prijono <benny@prijono.org>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 \endverbatim
 *
 *
 * @section other_acks Acknowlegments
 * @subsection portaudio_subsec PortAudio
 *
 * PortAudio is supported as one of the sound device backend, and
 * is used by default on Linux/Unix and MacOS X target.
 * 
 * Please visit <A HREF="http://www.portaudio.com">http://www.portaudio.com</A>
 * for more info.
 *
 * PortAudio is distributed with the following condition.
 \verbatim
    Based on the Open Source API proposed by Ross Bencina
    Copyright (c) 1999-2000 Phil Burk

    Permission is hereby granted, free of charge, to any person obtaining
    a copy of this software and associated documentation files
    (the "Software"), to deal in the Software without restriction,
    including without limitation the rights to use, copy, modify, merge,
    publish, distribute, sublicense, and/or sell copies of the Software,
    and to permit persons to whom the Software is furnished to do so,
    subject to the following conditions:

    The above copyright notice and this permission notice shall be
    included in all copies or substantial portions of the Software.
 \endverbatim
 *
 *
 * @subsection resample_ack Resample
 *
 * PJMEDIA uses <tt>resample-1.8.tar.gz</tt> from 
 * <A HREF="http://www-ccrma.stanford.edu/~jos/resample/">
 * Digital Audio Resampling Home Page</A>. This library is distibuted
 * on LGPL terms.
 *
 * Some excerpts from the original source codes:
 \verbatim
    HISTORY

    The first version of this software was written by Julius O. Smith III
    <jos@ccrma.stanford.edu> at CCRMA <http://www-ccrma.stanford.edu> in
    1981.  It was called SRCONV and was written in SAIL for PDP-10
    compatible machines.  The algorithm was first published in

    Smith, Julius O. and Phil Gossett. ``A Flexible Sampling-Rate
    Conversion Method,'' Proceedings (2): 19.4.1-19.4.4, IEEE Conference
    on Acoustics, Speech, and Signal Processing, San Diego, March 1984.

    An expanded tutorial based on this paper is available at the Digital
    Audio Resampling Home Page given above.

    Circa 1988, the SRCONV program was translated from SAIL to C by
    Christopher Lee Fraley working with Roger Dannenberg at CMU.

    Since then, the C version has been maintained by jos.

    Sndlib support was added 6/99 by John Gibson <jgg9c@virginia.edu>.

    The resample program is free software distributed in accordance
    with the Lesser GNU Public License (LGPL).  There is NO warranty; not
    even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 \endverbatim
 *
 * @subsection jb_ack Adaptive Jitter Buffer
 *
 * The PJMEDIA jitter buffer is based on implementation kindly donated
 * by <A HREF="http://www.switchlab.com">Switchlab, Ltd.</A>, and is
 * distributed under PJMEDIA licensing terms.
 *
 *
 * @subsection silence_det_ack Adaptive Silence Detector
 *
 * The adaptive silence detector was based on silence detector 
 * implementation in <A HREF="http://www.openh323.org">Open H323</A> 
 * project. I couldn't find the source code anymore, but generally
 * Open H323 files are distributed under MPL terms and has the
 * following excerpts:
 \verbatim
    Open H323 Library

    Copyright (c) 1998-2000 Equivalence Pty. Ltd.

    The contents of this file are subject to the Mozilla Public License
    Version 1.0 (the "License"); you may not use this file except in
    compliance with the License. You may obtain a copy of the License at
    http://www.mozilla.org/MPL/

    Software distributed under the License is distributed on an "AS IS"
    basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
    the License for the specific language governing rights and limitations
    under the License.

    The Original Code is Open H323 Library.

    The Initial Developer of the Original Code is Equivalence Pty. Ltd.

    Portions of this code were written with the assisance of funding from
    Vovida Networks, Inc. http://www.vovida.com.
 \endverbatim

 * @subsection gsm_ack GSM Codec
 *
 * PJMEDIA uses GSM 
 * <A HREF="http://kbs.cs.tu-berlin.de/~jutta/toast.html">GSM 06.10</A>
 * version 1.0 at patchlevel 12. It has the following Copyright notice:
 *
 \verbatim
    Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann,
    Technische Universitaet Berlin

    Any use of this software is permitted provided that this notice is not
    removed and that neither the authors nor the Technische Universitaet Berlin
    are deemed to have made any representations as to the suitability of this
    software for any purpose nor are held responsible for any defects of
    this software.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.

    As a matter of courtesy, the authors request to be informed about uses
    this software has found, about bugs in this software, and about any
    improvements that may be of general interest.

    Berlin, 28.11.1994
    Jutta Degener
    Carsten Bormann
 \endverbatim
 *
 *
 * @subsection speex_codec_ack Speex Codec
 *
 * PJMEDIA uses Speex codec uses version 1.1.12 from <A HREF="http://www.speex.org">
 * www.speex.org</A>. The Speex library comes with the following Copying
 * notice:
 \verbatim
    Copyright 2002-2005 
	    Xiph.org Foundation
	    Jean-Marc Valin
	    David Rowe
	    EpicGames
	    Analog Devices

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    - Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

    - 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.

    - Neither the name of the Xiph.org Foundation nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    ``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 FOUNDATION OR
    CONTRIBUTORS 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.
 \endverbatim
 *
 *
 * @subsection g711_codec_ack G.711 Codec
 *
 * The G.711 codec algorithm came from Sun Microsystems, Inc, and it's
 * got the following excerpts:
 *
 \verbatim
    This source code is a product of Sun Microsystems, Inc. and is provided
    for unrestricted use.  Users may copy or modify this source code without
    charge.

    SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
    THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
    PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.

    Sun source code is provided with no support and without any obligation on
    the part of Sun Microsystems, Inc. to assist in its use, correction,
    modification or enhancement.

    SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
    INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
    OR ANY PART THEREOF.

    In no event will Sun Microsystems, Inc. be liable for any lost revenue
    or profits or other special, indirect and consequential damages, even if
    Sun has been advised of the possibility of such damages.

    Sun Microsystems, Inc.
    2550 Garcia Avenue
    Mountain View, California  94043
 \endverbatim
 *
 */

#endif /* __PJMEDIA_DOXYGEN_H__ */
