dummy.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:5k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * dummy.c: dummy muxer module for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2001, 2002 VideoLAN
  5.  * $Id: dummy.c 8161 2004-07-10 17:20:11Z fenrir $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *          Eric Petit <titer@videolan.org>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. /*****************************************************************************
  25.  * Preamble
  26.  *****************************************************************************/
  27. #include <stdlib.h>
  28. #include <vlc/vlc.h>
  29. #include <vlc/sout.h>
  30. /*****************************************************************************
  31.  * Module descriptor
  32.  *****************************************************************************/
  33. static int  Open   ( vlc_object_t * );
  34. static void Close  ( vlc_object_t * );
  35. vlc_module_begin();
  36.     set_description( _("Dummy/Raw muxer") );
  37.     set_capability( "sout mux", 5 );
  38.     add_shortcut( "dummy" );
  39.     add_shortcut( "raw" );
  40.     add_shortcut( "es" );
  41.     set_callbacks( Open, Close );
  42. vlc_module_end();
  43. /*****************************************************************************
  44.  * Exported prototypes
  45.  *****************************************************************************/
  46. static int Control( sout_mux_t *, int, va_list );
  47. static int AddStream( sout_mux_t *, sout_input_t * );
  48. static int DelStream( sout_mux_t *, sout_input_t * );
  49. static int Mux      ( sout_mux_t * );
  50. struct sout_mux_sys_t
  51. {
  52.     /* Some streams have special initialization data, we'll output this
  53.      * data as an header in the stream. */
  54.     vlc_bool_t b_header;
  55. };
  56. /*****************************************************************************
  57.  * Open:
  58.  *****************************************************************************/
  59. static int Open( vlc_object_t *p_this )
  60. {
  61.     sout_mux_t *p_mux = (sout_mux_t*)p_this;
  62.     sout_mux_sys_t  *p_sys;
  63.     msg_Dbg( p_mux, "Dummy/Raw muxer opened" );
  64.     msg_Info( p_mux, "Open" );
  65.     p_mux->pf_control   = Control;
  66.     p_mux->pf_addstream = AddStream;
  67.     p_mux->pf_delstream = DelStream;
  68.     p_mux->pf_mux       = Mux;
  69.     p_mux->p_sys = p_sys = malloc( sizeof( sout_mux_sys_t ) );
  70.     p_sys->b_header      = VLC_TRUE;
  71.     return VLC_SUCCESS;
  72. }
  73. /*****************************************************************************
  74.  * Close:
  75.  *****************************************************************************/
  76. static void Close( vlc_object_t * p_this )
  77. {
  78.     sout_mux_t *p_mux = (sout_mux_t*)p_this;
  79.     sout_mux_sys_t *p_sys = p_mux->p_sys;
  80.     msg_Dbg( p_mux, "Dummy/Raw muxer closed" );
  81.     free( p_sys );
  82. }
  83. static int Control( sout_mux_t *p_mux, int i_query, va_list args )
  84. {
  85.     vlc_bool_t *pb_bool;
  86.    switch( i_query )
  87.    {
  88.        case MUX_CAN_ADD_STREAM_WHILE_MUXING:
  89.            pb_bool = (vlc_bool_t*)va_arg( args, vlc_bool_t * );
  90.            *pb_bool = VLC_TRUE;
  91.            return VLC_SUCCESS;
  92.        case MUX_GET_ADD_STREAM_WAIT:
  93.            pb_bool = (vlc_bool_t*)va_arg( args, vlc_bool_t * );
  94.            *pb_bool = VLC_FALSE;
  95.            return VLC_SUCCESS;
  96.        case MUX_GET_MIME:   /* Unknown */
  97.         default:
  98.             return VLC_EGENERIC;
  99.    }
  100. }
  101. static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
  102. {
  103.     msg_Dbg( p_mux, "adding input" );
  104.     return VLC_SUCCESS;
  105. }
  106. static int DelStream( sout_mux_t *p_mux, sout_input_t *p_input )
  107. {
  108.     msg_Dbg( p_mux, "removing input" );
  109.     return VLC_SUCCESS;
  110. }
  111. static int Mux( sout_mux_t *p_mux )
  112. {
  113.     sout_mux_sys_t *p_sys = p_mux->p_sys;
  114.     int i;
  115.     for( i = 0; i < p_mux->i_nb_inputs; i++ )
  116.     {
  117.         block_fifo_t *p_fifo;
  118.         int i_count;
  119.         if( p_sys->b_header && p_mux->pp_inputs[i]->p_fmt->i_extra )
  120.         {
  121.             /* Write header data */
  122.             block_t *p_data;
  123.             p_data = block_New( p_mux, p_mux->pp_inputs[i]->p_fmt->i_extra );
  124.             memcpy( p_data->p_buffer, p_mux->pp_inputs[i]->p_fmt->p_extra,
  125.                     p_mux->pp_inputs[i]->p_fmt->i_extra );
  126.             msg_Dbg( p_mux, "writing header data" );
  127.             sout_AccessOutWrite( p_mux->p_access, p_data );
  128.         }
  129.         p_fifo = p_mux->pp_inputs[i]->p_fifo;
  130.         i_count = p_fifo->i_depth;
  131.         while( i_count > 0 )
  132.         {
  133.             block_t *p_data = block_FifoGet( p_fifo );
  134.             sout_AccessOutWrite( p_mux->p_access, p_data );
  135.             i_count--;
  136.         }
  137.     }
  138.     p_sys->b_header = VLC_FALSE;
  139.     return VLC_SUCCESS;
  140. }