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

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * vlc_input.h:
  3.  *****************************************************************************
  4.  * Copyright (C) 1999-2004 VideoLAN
  5.  * $Id: input_ext-intf.h 7954 2004-06-07 22:19:12Z fenrir $
  6.  *
  7.  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  8.  *          Laurent Aimar <fenrir@via.ecp.fr>
  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. /* __ is need because conflict with <vlc/input.h> */
  25. #ifndef _VLC__INPUT_H
  26. #define _VLC__INPUT_H 1
  27. /*****************************************************************************
  28.  * input_item_t: Describes an input and is used to spawn input_thread_t objects
  29.  *****************************************************************************/
  30. struct info_t
  31. {
  32.     char *psz_name;            /**< Name of this info */
  33.     char *psz_value;           /**< Value of the info */
  34. };
  35. struct info_category_t
  36. {
  37.     char   *psz_name;      /**< Name of this category */
  38.     int    i_infos;        /**< Number of infos in the category */
  39.     struct info_t **pp_infos;     /**< Pointer to an array of infos */
  40. };
  41. struct input_item_t
  42. {
  43.     char       *psz_name;            /**< text describing this item */
  44.     char       *psz_uri;             /**< mrl of this item */
  45.     int        i_options;            /**< Number of input options */
  46.     char       **ppsz_options;       /**< Array of input options */
  47.     mtime_t    i_duration;           /**< A hint about the duration of this
  48.                                       * item, in milliseconds*/
  49.     int        i_categories;         /**< Number of info categories */
  50.     info_category_t **pp_categories; /**< Pointer to the first info category */
  51.     int         i_es;                /**< Number of es format descriptions */
  52.     es_format_t **es;                /**< Pointer to an array of es formats */
  53.     vlc_mutex_t lock;                /**< Item cannot be changed without this lock */
  54. };
  55. static inline void vlc_input_item_Init( vlc_object_t *p_o, input_item_t *p_i )
  56. {
  57.     memset( p_i, 0, sizeof(input_item_t) );
  58.     p_i->psz_name = 0;
  59.     p_i->psz_uri = 0;
  60.     p_i->ppsz_options = 0;
  61.     p_i->pp_categories = 0;
  62.     p_i->es = 0;
  63.     vlc_mutex_init( p_o, &p_i->lock );
  64. }
  65. static inline void vlc_input_item_Clean( input_item_t *p_i )
  66. {
  67.     if( p_i->psz_name ) free( p_i->psz_name );
  68.     if( p_i->psz_uri ) free( p_i->psz_uri );
  69.     p_i->psz_name = 0;
  70.     p_i->psz_uri = 0;
  71.     while( p_i->i_options )
  72.     {
  73.         p_i->i_options--;
  74.         if( p_i->ppsz_options[p_i->i_options] )
  75.             free( p_i->ppsz_options[p_i->i_options] );
  76.         if( !p_i->i_options ) free( p_i->ppsz_options );
  77.     }
  78.     while( p_i->i_es )
  79.     {
  80.         p_i->i_es--;
  81.         es_format_Clean( p_i->es[p_i->i_es] );
  82.         if( !p_i->i_es ) free( p_i->es );
  83.     }
  84.     while( p_i->i_categories )
  85.     {
  86.         info_category_t *p_category =
  87.             p_i->pp_categories[--(p_i->i_categories)];
  88.         while( p_category->i_infos )
  89.         {
  90.             p_category->i_infos--;
  91.             if( p_category->pp_infos[p_category->i_infos]->psz_name )
  92.                 free( p_category->pp_infos[p_category->i_infos]->psz_name);
  93.             if( p_category->pp_infos[p_category->i_infos]->psz_value )
  94.                 free( p_category->pp_infos[p_category->i_infos]->psz_value );
  95.             free( p_category->pp_infos[p_category->i_infos] );
  96.             if( !p_category->i_infos ) free( p_category->pp_infos );
  97.         }
  98.         if( p_category->psz_name ) free( p_category->psz_name );
  99.         free( p_category );
  100.         if( !p_i->i_categories ) free( p_i->pp_categories );
  101.     }
  102.     vlc_mutex_destroy( &p_i->lock );
  103. }
  104. /*****************************************************************************
  105.  * Seek point: (generalisation of chapters)
  106.  *****************************************************************************/
  107. struct seekpoint_t
  108. {
  109.     int64_t i_byte_offset;
  110.     int64_t i_time_offset;
  111.     char    *psz_name;
  112. };
  113. static inline seekpoint_t *vlc_seekpoint_New( void )
  114. {
  115.     seekpoint_t *point = (seekpoint_t*)malloc( sizeof( seekpoint_t ) );
  116.     point->i_byte_offset =
  117.     point->i_time_offset = 0;
  118.     point->psz_name = NULL;
  119.     return point;
  120. }
  121. static inline void vlc_seekpoint_Delete( seekpoint_t *point )
  122. {
  123.     if( !point ) return;
  124.     if( point->psz_name ) free( point->psz_name );
  125.     free( point );
  126. }
  127. static inline seekpoint_t *vlc_seekpoint_Duplicate( seekpoint_t *src )
  128. {
  129.     seekpoint_t *point = vlc_seekpoint_New();
  130.     if( src->psz_name ) point->psz_name = strdup( src->psz_name );
  131.     point->i_time_offset = src->i_time_offset;
  132.     point->i_byte_offset = src->i_byte_offset;
  133.     return point;
  134. }
  135. /*****************************************************************************
  136.  * Title:
  137.  *****************************************************************************/
  138. typedef struct
  139. {
  140.     char        *psz_name;
  141.     vlc_bool_t  b_menu;      /* Is it a menu or a normal entry */
  142.     int64_t     i_length;   /* Length(microsecond) if known, else 0 */
  143.     int64_t     i_size;     /* Size (bytes) if known, else 0 */
  144.     /* Title seekpoint */
  145.     int         i_seekpoint;
  146.     seekpoint_t **seekpoint;
  147. } input_title_t;
  148. static inline input_title_t *vlc_input_title_New( )
  149. {
  150.     input_title_t *t = (input_title_t*)malloc( sizeof( input_title_t ) );
  151.     t->psz_name = NULL;
  152.     t->b_menu = VLC_FALSE;
  153.     t->i_length = 0;
  154.     t->i_size   = 0;
  155.     t->i_seekpoint = 0;
  156.     t->seekpoint = NULL;
  157.     return t;
  158. }
  159. static inline void vlc_input_title_Delete( input_title_t *t )
  160. {
  161.     int i;
  162.     if( t == NULL )
  163.         return;
  164.     if( t->psz_name ) free( t->psz_name );
  165.     for( i = 0; i < t->i_seekpoint; i++ )
  166.     {
  167.         if( t->seekpoint[i]->psz_name ) free( t->seekpoint[i]->psz_name );
  168.         free( t->seekpoint[i] );
  169.     }
  170.     if( t->seekpoint ) free( t->seekpoint );
  171.     free( t );
  172. }
  173. static inline input_title_t *vlc_input_title_Duplicate( input_title_t *t )
  174. {
  175.     input_title_t *dup = vlc_input_title_New( );
  176.     int i;
  177.     if( t->psz_name ) dup->psz_name = strdup( t->psz_name );
  178.     dup->b_menu      = t->b_menu;
  179.     dup->i_length    = t->i_length;
  180.     dup->i_size      = t->i_size;
  181.     dup->i_seekpoint = t->i_seekpoint;
  182.     if( t->i_seekpoint > 0 )
  183.     {
  184.         dup->seekpoint = (seekpoint_t**)calloc( t->i_seekpoint,
  185.                                                 sizeof(seekpoint_t*) );
  186.         for( i = 0; i < t->i_seekpoint; i++ )
  187.         {
  188.             dup->seekpoint[i] = vlc_seekpoint_Duplicate( t->seekpoint[i] );
  189.         }
  190.     }
  191.     return dup;
  192. }
  193. /*****************************************************************************
  194.  * input defines/constants.
  195.  *****************************************************************************/
  196. /* "state" value */
  197. enum input_state_e
  198. {
  199.     INIT_S,
  200.     PLAYING_S,
  201.     PAUSE_S,
  202.     END_S,
  203. };
  204. /* "rate" default, min/max */
  205. #define INPUT_RATE_DEFAULT  1000
  206. #define INPUT_RATE_MIN       125            /* Up to 8/1 */
  207. #define INPUT_RATE_MAX      8000            /* Up to 1/8 */
  208. /* input_source_t: gathers all information per input source */
  209. typedef struct
  210. {
  211.     /* Input item description */
  212.     input_item_t *p_item;
  213.     /* Access/Stream/Demux plugins */
  214.     access_t *p_access;
  215.     stream_t *p_stream;
  216.     demux_t  *p_demux;
  217.     /* Title infos for that input */
  218.     vlc_bool_t   b_title_demux; /* Titles/Seekpoints provided by demux */
  219.     int          i_title;
  220.     input_title_t **title;
  221.     int i_title_offset;
  222.     int i_seekpoint_offset;
  223.     int i_title_start;
  224.     int i_title_end;
  225.     int i_seekpoint_start;
  226.     int i_seekpoint_end;
  227.     /* Properties */
  228.     vlc_bool_t b_can_pace_control;
  229.     vlc_bool_t b_can_pause;
  230.     vlc_bool_t b_eof;   /* eof of demuxer */
  231.     /* Clock average variation */
  232.     int     i_cr_average;
  233. } input_source_t;
  234. /* i_update field of access_t/demux_t */
  235. #define INPUT_UPDATE_NONE       0x0000
  236. #define INPUT_UPDATE_SIZE       0x0001
  237. #define INPUT_UPDATE_TITLE      0x0010
  238. #define INPUT_UPDATE_SEEKPOINT  0x0020
  239. #define INPUT_UPDATE_META       0x0040
  240. /* Input control XXX: internal */
  241. #define INPUT_CONTROL_FIFO_SIZE    100
  242. /*****************************************************************************
  243.  * input_thread_t
  244.  *****************************************************************************
  245.  * XXX: this strucrures is *PRIVATE* so nobody can touch it out of src/input.
  246.  * I plan to move it to src/input/input_internal.h anyway
  247.  *
  248.  * XXX: look at src/input/input.c:input_CreateThread for accessible variables
  249.  *      YOU CANNOT HAVE ACCESS TO THE CONTENT OF input_thread_t except
  250.  *      p_input->input.p_item (and it's only temporary).
  251.  * XXX: move the docs somewhere (better than src/input )
  252.  *****************************************************************************/
  253. struct input_thread_t
  254. {
  255.     VLC_COMMON_MEMBERS
  256.      /* Global properties */
  257.     vlc_bool_t  b_eof;
  258.     vlc_bool_t  b_can_pace_control;
  259.     vlc_bool_t  b_can_pause;
  260.     /* Global state */
  261.     int         i_state;
  262.     int         i_rate;
  263.     /* */
  264.     int64_t     i_start;    /* :start-time,0 by default */
  265.     int64_t     i_time;     /* Current time */
  266.     int64_t     i_stop;     /* :stop-time, 0 if none */
  267.     /* Title infos FIXME multi-input (not easy) ? */
  268.     int          i_title;
  269.     input_title_t **title;
  270.     int i_title_offset;
  271.     int i_seekpoint_offset;
  272.     /* User bookmarks FIXME won't be easy with multiples input */
  273.     int         i_bookmark;
  274.     seekpoint_t **bookmark;
  275.     /* Output */
  276.     es_out_t    *p_es_out;
  277.     sout_instance_t *p_sout;            /* XXX Move it to es_out ? */
  278.     vlc_bool_t      b_out_pace_control; /*     idem ? */
  279.     /* Internal caching common for all inputs */
  280.     int64_t i_pts_delay;
  281.     /* Main input properties */
  282.     input_source_t input;
  283.     /* Slave demuxers (subs, and others) */
  284.     int            i_slave;
  285.     input_source_t **slave;
  286.     /* Buffer of pending actions */
  287.     vlc_mutex_t lock_control;
  288.     int i_control;
  289.     struct
  290.     {
  291.         /* XXX: val isn't duplicated so it won't works with string */
  292.         int         i_type;
  293.         vlc_value_t val;
  294.     } control[INPUT_CONTROL_FIFO_SIZE];
  295. };
  296. /*****************************************************************************
  297.  * Prototypes
  298.  *****************************************************************************/
  299. #define input_CreateThread(a,b) __input_CreateThread(VLC_OBJECT(a),b)
  300. VLC_EXPORT( input_thread_t *, __input_CreateThread, ( vlc_object_t *, input_item_t * ) );
  301. VLC_EXPORT( void,             input_StopThread,     ( input_thread_t * ) );
  302. VLC_EXPORT( void,             input_DestroyThread,  ( input_thread_t * ) );
  303. enum input_query_e
  304. {
  305.     /* input variable "position" */
  306.     INPUT_GET_POSITION,         /* arg1= double *       res=    */
  307.     INPUT_SET_POSITION,         /* arg1= double         res=can fail    */
  308.     /* input variable "length" */
  309.     INPUT_GET_LENGTH,           /* arg1= int64_t *      res=can fail    */
  310.     /* input variable "time" */
  311.     INPUT_GET_TIME,             /* arg1= int64_t *      res=    */
  312.     INPUT_SET_TIME,             /* arg1= int64_t        res=can fail    */
  313.     /* input variable "rate" (1 is DEFAULT_RATE) */
  314.     INPUT_GET_RATE,             /* arg1= int *          res=    */
  315.     INPUT_SET_RATE,             /* arg1= int            res=can fail    */
  316.     /* input variable "state" */
  317.     INPUT_GET_STATE,            /* arg1= int *          res=    */
  318.     INPUT_SET_STATE,            /* arg1= int            res=can fail    */
  319.     /* input variable "audio-delay" and "spu-delay" */
  320.     INPUT_GET_AUDIO_DELAY,      /* arg1 = int* res=can fail */
  321.     INPUT_SET_AUDIO_DELAY,      /* arg1 = int  res=can fail */
  322.     INPUT_GET_SPU_DELAY,        /* arg1 = int* res=can fail */
  323.     INPUT_SET_SPU_DELAY,        /* arg1 = int  res=can fail */
  324.     /* Meta datas */
  325.     INPUT_ADD_INFO,   /* arg1= char * arg2= char * arg3=...  res=can fail    */
  326.     INPUT_GET_INFO,   /* arg1= char * arg2= char * arg3= char ** res=can fail*/
  327.     INPUT_SET_NAME,   /* arg1= char * res=can fail    */
  328.     /* Input config options */
  329.     INPUT_ADD_OPTION,      /* arg1= char * arg2= char *  res=can fail*/
  330.     /* Input properties */
  331.     INPUT_GET_BYTE_POSITION,     /* arg1= int64_t *       res=    */
  332.     INPUT_SET_BYTE_SIZE,         /* arg1= int64_t *       res=    */
  333.     /* bookmarks */
  334.     INPUT_GET_BOOKMARKS,   /* arg1= seekpoint_t *** arg2= int * res=can fail */
  335.     INPUT_CLEAR_BOOKMARKS, /* res=can fail */
  336.     INPUT_ADD_BOOKMARK,    /* arg1= seekpoint_t *  res=can fail   */
  337.     INPUT_CHANGE_BOOKMARK, /* arg1= seekpoint_t * arg2= int * res=can fail   */
  338.     INPUT_DEL_BOOKMARK,    /* arg1= seekpoint_t *  res=can fail   */
  339.     INPUT_SET_BOOKMARK,    /* arg1= int  res=can fail    */
  340. };
  341. VLC_EXPORT( int, input_vaControl,( input_thread_t *, int i_query, va_list  ) );
  342. VLC_EXPORT( int, input_Control,  ( input_thread_t *, int i_query, ...  ) );
  343. VLC_EXPORT( decoder_t *, input_DecoderNew, ( input_thread_t *, es_format_t *, vlc_bool_t b_force_decoder ) );
  344. VLC_EXPORT( void, input_DecoderDelete, ( decoder_t * ) );
  345. VLC_EXPORT( void, input_DecoderDecode,( decoder_t *, block_t * ) );
  346. #endif