1 /* $Id$ */
2 /*
3  * Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
4  * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20 #ifndef __PJMEDIA_PLC_H__
21 #define __PJMEDIA_PLC_H__
22 
23 
24 /**
25  * @file plc.h
26  * @brief Packet Lost Concealment (PLC) API.
27  */
28 #include <pjmedia/types.h>
29 
30 /**
31  * @defgroup PJMED_PLC Packet Lost Concealment (PLC)
32  * @ingroup PJMEDIA_FRAME_OP
33  * @brief Packet lost compensation algorithm
34  * @{
35  *
36  * This section describes PJMEDIA's implementation of Packet Lost
37  * Concealment algorithm. This algorithm is used to implement PLC for
38  * codecs that do not have built-in support for one (e.g. G.711 or GSM
39  * codecs).
40  *
41  * The PLC algorithm (either built-in or external) is embedded in
42  * PJMEDIA codec instance, and application can conceal lost frames
43  * by calling <b><tt>recover()</tt></b> member of the codec's member
44  * operation (#pjmedia_codec_op).
45  *
46  * See also @ref plc_codec for more info.
47  */
48 
49 
50 PJ_BEGIN_DECL
51 
52 
53 /**
54  * Opaque declaration for PLC.
55  */
56 typedef struct pjmedia_plc pjmedia_plc;
57 
58 
59 
60 /**
61  * Create PLC session. This function will select the PLC algorithm to
62  * use based on the arguments.
63  *
64  * @param pool		    Pool to allocate memory for the PLC.
65  * @param clock_rate	    Media sampling rate.
66  * @param samples_per_frame Number of samples per frame.
67  * @param options	    Must be zero for now.
68  * @param p_plc		    Pointer to receive the PLC instance.
69  *
70  * @return		    PJ_SUCCESS on success.
71  */
72 PJ_DECL(pj_status_t) pjmedia_plc_create( pj_pool_t *pool,
73 					 unsigned clock_rate,
74 					 unsigned samples_per_frame,
75 					 unsigned options,
76 					 pjmedia_plc **p_plc);
77 
78 
79 /**
80  * Save a good frame to PLC.
81  *
82  * @param plc		    The PLC session.
83  * @param frame		    The good frame to be stored to PLC. This frame
84  *			    must have the same length as the configured
85  *			    samples per frame.
86  *
87  * @return		    PJ_SUCCESS on success.
88  */
89 PJ_DECL(pj_status_t) pjmedia_plc_save( pjmedia_plc *plc,
90 				       pj_int16_t *frame );
91 
92 
93 /**
94  * Generate a replacement for lost frame.
95  *
96  * @param plc		    The PLC session.
97  * @param frame		    Buffer to receive the generated frame. This buffer
98  *			    must be able to store the frame.
99  *
100  * @return		    PJ_SUCCESS on success.
101  */
102 PJ_DECL(pj_status_t) pjmedia_plc_generate( pjmedia_plc *plc,
103 					   pj_int16_t *frame );
104 
105 
106 
107 
108 PJ_END_DECL
109 
110 /**
111  * @}
112  */
113 
114 #endif	/* __PJMEDIA_PLC_H__ */
115 
116