home *** CD-ROM | disk | FTP | other *** search
/ mail.altrad.com / 2015.02.mail.altrad.com.tar / mail.altrad.com / TEST / vlc-2-0-5-win32.exe / sdk / include / vlc / plugins / vlc_sout.h < prev    next >
C/C++ Source or Header  |  2012-12-12  |  9KB  |  266 lines

  1. /*****************************************************************************
  2.  * stream_output.h : stream output module
  3.  *****************************************************************************
  4.  * Copyright (C) 2002-2008 VLC authors and VideoLAN
  5.  * $Id: 8c2e3428113a4900fc9ec197027fa808ff5b267f $
  6.  *
  7.  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  8.  *          Laurent Aimar <fenrir@via.ecp.fr>
  9.  *          Eric Petit <titer@videolan.org>
  10.  *          Jean-Paul Saman <jpsaman #_at_# m2x.nl>
  11.  *          R├⌐mi Denis-Courmont
  12.  *
  13.  * This program is free software; you can redistribute it and/or modify it
  14.  * under the terms of the GNU Lesser General Public License as published by
  15.  * the Free Software Foundation; either version 2.1 of the License, or
  16.  * (at your option) any later version.
  17.  *
  18.  * This program is distributed in the hope that it will be useful,
  19.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  21.  * GNU Lesser General Public License for more details.
  22.  *
  23.  * You should have received a copy of the GNU Lesser General Public License
  24.  * along with this program; if not, write to the Free Software Foundation,
  25.  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  26.  *****************************************************************************/
  27.  
  28. #ifndef VLC_SOUT_H_
  29. #define VLC_SOUT_H_
  30.  
  31. /**
  32.  * \file
  33.  * This file defines structures and functions for stream output in vlc
  34.  */
  35.  
  36. #ifdef __cplusplus
  37. extern "C" {
  38. #endif
  39.  
  40. #include <sys/types.h>
  41. #include <vlc_es.h>
  42.  
  43. /** Stream output instance */
  44. struct sout_instance_t
  45. {
  46.     VLC_COMMON_MEMBERS
  47.  
  48.     char *psz_sout;
  49.  
  50.     /* meta data (Read only) XXX it won't be set before the first packet received */
  51.     vlc_meta_t          *p_meta;
  52.  
  53.     /** count of output that can't control the space */
  54.     int                 i_out_pace_nocontrol;
  55.  
  56.     vlc_mutex_t         lock;
  57.     sout_stream_t       *p_stream;
  58.  
  59.     /** Private */
  60.     sout_instance_sys_t *p_sys;
  61. };
  62.  
  63. /****************************************************************************
  64.  * sout_stream_id_t: opaque (private for all sout_stream_t)
  65.  ****************************************************************************/
  66. typedef struct sout_stream_id_t  sout_stream_id_t;
  67.  
  68. /** Stream output access_output */
  69. struct sout_access_out_t
  70. {
  71.     VLC_COMMON_MEMBERS
  72.  
  73.     module_t                *p_module;
  74.     char                    *psz_access;
  75.  
  76.     int                      i_writes;
  77.     /** Local counter reset each time it is transferred to stats */
  78.     int64_t                  i_sent_bytes;
  79.  
  80.     char                    *psz_path;
  81.     sout_access_out_sys_t   *p_sys;
  82.     int                     (*pf_seek)( sout_access_out_t *, off_t );
  83.     ssize_t                 (*pf_read)( sout_access_out_t *, block_t * );
  84.     ssize_t                 (*pf_write)( sout_access_out_t *, block_t * );
  85.     int                     (*pf_control)( sout_access_out_t *, int, va_list );
  86.  
  87.     config_chain_t          *p_cfg;
  88. };
  89.  
  90. enum access_out_query_e
  91. {
  92.     ACCESS_OUT_CONTROLS_PACE, /* arg1=bool *, can fail (assume true) */
  93. };
  94.  
  95. VLC_API sout_access_out_t * sout_AccessOutNew( vlc_object_t *, const char *psz_access, const char *psz_name ) VLC_USED;
  96. #define sout_AccessOutNew( obj, access, name ) \
  97.         sout_AccessOutNew( VLC_OBJECT(obj), access, name )
  98. VLC_API void sout_AccessOutDelete( sout_access_out_t * );
  99. VLC_API int sout_AccessOutSeek( sout_access_out_t *, off_t );
  100. VLC_API ssize_t sout_AccessOutRead( sout_access_out_t *, block_t * );
  101. VLC_API ssize_t sout_AccessOutWrite( sout_access_out_t *, block_t * );
  102. VLC_API int sout_AccessOutControl( sout_access_out_t *, int, ... );
  103.  
  104. static inline bool sout_AccessOutCanControlPace( sout_access_out_t *p_ao )
  105. {
  106.     bool b;
  107.     if( sout_AccessOutControl( p_ao, ACCESS_OUT_CONTROLS_PACE, &b ) )
  108.         return true;
  109.     return b;
  110. }
  111.  
  112. /** Muxer structure */
  113. struct  sout_mux_t
  114. {
  115.     VLC_COMMON_MEMBERS
  116.     module_t            *p_module;
  117.  
  118.     sout_instance_t     *p_sout;
  119.  
  120.     char                *psz_mux;
  121.     config_chain_t          *p_cfg;
  122.  
  123.     sout_access_out_t   *p_access;
  124.  
  125.     int                 (*pf_addstream)( sout_mux_t *, sout_input_t * );
  126.     int                 (*pf_delstream)( sout_mux_t *, sout_input_t * );
  127.     int                 (*pf_mux)      ( sout_mux_t * );
  128.     int                 (*pf_control)  ( sout_mux_t *, int, va_list );
  129.  
  130.     /* here are all inputs accepted by muxer */
  131.     int                 i_nb_inputs;
  132.     sout_input_t        **pp_inputs;
  133.  
  134.     /* mux private */
  135.     sout_mux_sys_t      *p_sys;
  136.  
  137.     /* XXX private to stream_output.c */
  138.     /* if muxer doesn't support adding stream at any time then we first wait
  139.      *  for stream then we refuse all stream and start muxing */
  140.     bool  b_add_stream_any_time;
  141.     bool  b_waiting_stream;
  142.     /* we wait one second after first stream added */
  143.     mtime_t     i_add_stream_start;
  144. };
  145.  
  146. enum sout_mux_query_e
  147. {
  148.     /* capabilities */
  149.     MUX_CAN_ADD_STREAM_WHILE_MUXING,    /* arg1= bool *,      res=cannot fail */
  150.     /* properties */
  151.     MUX_GET_ADD_STREAM_WAIT,            /* arg1= bool *,      res=cannot fail */
  152.     MUX_GET_MIME,                       /* arg1= char **            res=can fail    */
  153. };
  154.  
  155. struct sout_input_t
  156. {
  157.     sout_instance_t *p_sout;
  158.  
  159.     es_format_t     *p_fmt;
  160.     block_fifo_t    *p_fifo;
  161.  
  162.     void            *p_sys;
  163. };
  164.  
  165.  
  166. VLC_API sout_mux_t * sout_MuxNew( sout_instance_t*, const char *, sout_access_out_t * ) VLC_USED;
  167. VLC_API sout_input_t * sout_MuxAddStream( sout_mux_t *, es_format_t * ) VLC_USED;
  168. VLC_API void sout_MuxDeleteStream( sout_mux_t *, sout_input_t * );
  169. VLC_API void sout_MuxDelete( sout_mux_t * );
  170. VLC_API void sout_MuxSendBuffer( sout_mux_t *, sout_input_t  *, block_t * );
  171. VLC_API int sout_MuxGetStream(sout_mux_t *, int , mtime_t *);
  172.  
  173. static inline int sout_MuxControl( sout_mux_t *p_mux, int i_query, ... )
  174. {
  175.     va_list args;
  176.     int     i_result;
  177.  
  178.     va_start( args, i_query );
  179.     i_result = p_mux->pf_control( p_mux, i_query, args );
  180.     va_end( args );
  181.     return i_result;
  182. }
  183.  
  184. /****************************************************************************
  185.  * sout_stream:
  186.  ****************************************************************************/
  187. struct sout_stream_t
  188. {
  189.     VLC_COMMON_MEMBERS
  190.  
  191.     module_t          *p_module;
  192.     sout_instance_t   *p_sout;
  193.  
  194.     char              *psz_name;
  195.     config_chain_t        *p_cfg;
  196.     sout_stream_t     *p_next;
  197.  
  198.     /* Subpicture unit */
  199.     spu_t             *p_spu;
  200.  
  201.     /* add, remove a stream */
  202.     sout_stream_id_t *(*pf_add)( sout_stream_t *, es_format_t * );
  203.     int               (*pf_del)( sout_stream_t *, sout_stream_id_t * );
  204.     /* manage a packet */
  205.     int               (*pf_send)( sout_stream_t *, sout_stream_id_t *, block_t* );
  206.  
  207.     /* private */
  208.     sout_stream_sys_t *p_sys;
  209. };
  210.  
  211. VLC_API void sout_StreamChainDelete(sout_stream_t *p_first, sout_stream_t *p_last );
  212. VLC_API sout_stream_t *sout_StreamChainNew(sout_instance_t *p_sout,
  213.         char *psz_chain, sout_stream_t *p_next, sout_stream_t **p_last) VLC_USED;
  214.  
  215. static inline sout_stream_id_t *sout_StreamIdAdd( sout_stream_t *s, es_format_t *fmt )
  216. {
  217.     return s->pf_add( s, fmt );
  218. }
  219. static inline int sout_StreamIdDel( sout_stream_t *s, sout_stream_id_t *id )
  220. {
  221.     return s->pf_del( s, id );
  222. }
  223. static inline int sout_StreamIdSend( sout_stream_t *s, sout_stream_id_t *id, block_t *b )
  224. {
  225.     return s->pf_send( s, id, b );
  226. }
  227.  
  228. /****************************************************************************
  229.  * Encoder
  230.  ****************************************************************************/
  231.  
  232. VLC_API encoder_t * sout_EncoderCreate( vlc_object_t *obj );
  233. #define sout_EncoderCreate(o) sout_EncoderCreate(VLC_OBJECT(o))
  234.  
  235. /****************************************************************************
  236.  * Announce handler
  237.  ****************************************************************************/
  238. VLC_API session_descriptor_t* sout_AnnounceRegisterSDP( vlc_object_t *, const char *, const char * ) VLC_USED;
  239. VLC_API int sout_AnnounceUnRegister(vlc_object_t *,session_descriptor_t* );
  240. #define sout_AnnounceRegisterSDP(o, sdp, addr) \
  241.         sout_AnnounceRegisterSDP(VLC_OBJECT (o), sdp, addr)
  242. #define sout_AnnounceUnRegister(o, a) \
  243.         sout_AnnounceUnRegister(VLC_OBJECT (o), a)
  244.  
  245. /** SDP */
  246.  
  247. struct sockaddr;
  248.  
  249. VLC_API char * vlc_sdp_Start( vlc_object_t *obj, const char *cfgpref, const struct sockaddr *src, size_t srclen, const struct sockaddr *addr, size_t addrlen ) VLC_USED;
  250. VLC_API char * sdp_AddMedia(char **sdp, const char *type, const char *protocol, int dport, unsigned pt, bool bw_indep, unsigned bw, const char *ptname, unsigned clockrate, unsigned channels, const char *fmtp);
  251. VLC_API char * sdp_AddAttribute(char **sdp, const char *name, const char *fmt, ...) VLC_FORMAT( 3, 4 );
  252.  
  253. /** Description module */
  254. typedef struct sout_description_data_t
  255. {
  256.     int i_es;
  257.     es_format_t **es;
  258.     vlc_sem_t *sem;
  259. } sout_description_data_t;
  260.  
  261. #ifdef __cplusplus
  262. }
  263. #endif
  264.  
  265. #endif
  266.