00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef VLC_INPUT_H
00027 #define VLC_INPUT_H 1
00028
00029
00030
00031
00032
00033
00034 #include <vlc_es.h>
00035 #include <vlc_meta.h>
00036 #include <vlc_epg.h>
00037 #include <vlc_events.h>
00038 #include <vlc_input_item.h>
00039
00040 #include <string.h>
00041
00042
00043
00044
00045 static inline void vlc_audio_replay_gain_MergeFromMeta( audio_replay_gain_t *p_dst,
00046 const vlc_meta_t *p_meta )
00047 {
00048 const char * psz_value;
00049
00050 if( !p_meta )
00051 return;
00052
00053 if( (psz_value = vlc_meta_GetExtra(p_meta, "REPLAYGAIN_TRACK_GAIN")) ||
00054 (psz_value = vlc_meta_GetExtra(p_meta, "RG_RADIO")) )
00055 {
00056 p_dst->pb_gain[AUDIO_REPLAY_GAIN_TRACK] = true;
00057 p_dst->pf_gain[AUDIO_REPLAY_GAIN_TRACK] = atof( psz_value );
00058 }
00059 else if( (psz_value = vlc_meta_GetExtra(p_meta, "REPLAYGAIN_TRACK_PEAK" )) ||
00060 (psz_value = vlc_meta_GetExtra(p_meta, "RG_PEAK" )) )
00061 {
00062 p_dst->pb_peak[AUDIO_REPLAY_GAIN_TRACK] = true;
00063 p_dst->pf_peak[AUDIO_REPLAY_GAIN_TRACK] = atof( psz_value );
00064 }
00065 else if( (psz_value = vlc_meta_GetExtra(p_meta, "REPLAYGAIN_ALBUM_GAIN" )) ||
00066 (psz_value = vlc_meta_GetExtra(p_meta, "RG_AUDIOPHILE" )) )
00067 {
00068 p_dst->pb_gain[AUDIO_REPLAY_GAIN_ALBUM] = true;
00069 p_dst->pf_gain[AUDIO_REPLAY_GAIN_ALBUM] = atof( psz_value );
00070 }
00071 else if( (psz_value = vlc_meta_GetExtra(p_meta, "REPLAYGAIN_ALBUM_PEAK" )) )
00072 {
00073 p_dst->pb_peak[AUDIO_REPLAY_GAIN_ALBUM] = true;
00074 p_dst->pf_peak[AUDIO_REPLAY_GAIN_ALBUM] = atof( psz_value );
00075 }
00076 }
00077
00078
00079
00080
00081 struct seekpoint_t
00082 {
00083 int64_t i_byte_offset;
00084 int64_t i_time_offset;
00085 char *psz_name;
00086 };
00087
00088 static inline seekpoint_t *vlc_seekpoint_New( void )
00089 {
00090 seekpoint_t *point = (seekpoint_t*)malloc( sizeof( seekpoint_t ) );
00091 point->i_byte_offset =
00092 point->i_time_offset = -1;
00093 point->psz_name = NULL;
00094 return point;
00095 }
00096
00097 static inline void vlc_seekpoint_Delete( seekpoint_t *point )
00098 {
00099 if( !point ) return;
00100 free( point->psz_name );
00101 free( point );
00102 }
00103
00104 static inline seekpoint_t *vlc_seekpoint_Duplicate( const seekpoint_t *src )
00105 {
00106 seekpoint_t *point = vlc_seekpoint_New();
00107 if( src->psz_name ) point->psz_name = strdup( src->psz_name );
00108 point->i_time_offset = src->i_time_offset;
00109 point->i_byte_offset = src->i_byte_offset;
00110 return point;
00111 }
00112
00113
00114
00115
00116 typedef struct
00117 {
00118 char *psz_name;
00119
00120 bool b_menu;
00121
00122 int64_t i_length;
00123 int64_t i_size;
00124
00125
00126 int i_seekpoint;
00127 seekpoint_t **seekpoint;
00128
00129 } input_title_t;
00130
00131 static inline input_title_t *vlc_input_title_New(void)
00132 {
00133 input_title_t *t = (input_title_t*)malloc( sizeof( input_title_t ) );
00134
00135 t->psz_name = NULL;
00136 t->b_menu = false;
00137 t->i_length = 0;
00138 t->i_size = 0;
00139 t->i_seekpoint = 0;
00140 t->seekpoint = NULL;
00141
00142 return t;
00143 }
00144
00145 static inline void vlc_input_title_Delete( input_title_t *t )
00146 {
00147 int i;
00148 if( t == NULL )
00149 return;
00150
00151 free( t->psz_name );
00152 for( i = 0; i < t->i_seekpoint; i++ )
00153 {
00154 free( t->seekpoint[i]->psz_name );
00155 free( t->seekpoint[i] );
00156 }
00157 free( t->seekpoint );
00158 free( t );
00159 }
00160
00161 static inline input_title_t *vlc_input_title_Duplicate( const input_title_t *t )
00162 {
00163 input_title_t *dup = vlc_input_title_New( );
00164 int i;
00165
00166 if( t->psz_name ) dup->psz_name = strdup( t->psz_name );
00167 dup->b_menu = t->b_menu;
00168 dup->i_length = t->i_length;
00169 dup->i_size = t->i_size;
00170 dup->i_seekpoint = t->i_seekpoint;
00171 if( t->i_seekpoint > 0 )
00172 {
00173 dup->seekpoint = (seekpoint_t**)calloc( t->i_seekpoint,
00174 sizeof(seekpoint_t*) );
00175
00176 for( i = 0; i < t->i_seekpoint; i++ )
00177 {
00178 dup->seekpoint[i] = vlc_seekpoint_Duplicate( t->seekpoint[i] );
00179 }
00180 }
00181
00182 return dup;
00183 }
00184
00185
00186
00187
00188 struct input_attachment_t
00189 {
00190 char *psz_name;
00191 char *psz_mime;
00192 char *psz_description;
00193
00194 int i_data;
00195 void *p_data;
00196 };
00197
00198 static inline input_attachment_t *vlc_input_attachment_New( const char *psz_name,
00199 const char *psz_mime,
00200 const char *psz_description,
00201 const void *p_data,
00202 int i_data )
00203 {
00204 input_attachment_t *a =
00205 (input_attachment_t*)malloc( sizeof(input_attachment_t) );
00206 if( !a )
00207 return NULL;
00208 a->psz_name = strdup( psz_name ? psz_name : "" );
00209 a->psz_mime = strdup( psz_mime ? psz_mime : "" );
00210 a->psz_description = strdup( psz_description ? psz_description : "" );
00211 a->i_data = i_data;
00212 a->p_data = NULL;
00213 if( i_data > 0 )
00214 {
00215 a->p_data = malloc( i_data );
00216 if( a->p_data && p_data )
00217 memcpy( a->p_data, p_data, i_data );
00218 }
00219 return a;
00220 }
00221 static inline input_attachment_t *vlc_input_attachment_Duplicate( const input_attachment_t *a )
00222 {
00223 return vlc_input_attachment_New( a->psz_name, a->psz_mime, a->psz_description,
00224 a->p_data, a->i_data );
00225 }
00226 static inline void vlc_input_attachment_Delete( input_attachment_t *a )
00227 {
00228 if( !a )
00229 return;
00230 free( a->psz_name );
00231 free( a->psz_mime );
00232 free( a->psz_description );
00233 free( a->p_data );
00234 free( a );
00235 }
00236
00237
00238
00239
00240
00241
00242 #define INPUT_UPDATE_NONE 0x0000
00243 #define INPUT_UPDATE_SIZE 0x0001
00244 #define INPUT_UPDATE_TITLE 0x0010
00245 #define INPUT_UPDATE_SEEKPOINT 0x0020
00246 #define INPUT_UPDATE_META 0x0040
00247 #define INPUT_UPDATE_SIGNAL 0x0080
00248
00249
00250
00251
00252 typedef struct input_thread_private_t input_thread_private_t;
00253
00254
00255
00256
00257 typedef struct input_resource_t input_resource_t;
00258
00259
00260
00261
00262
00263
00264 struct input_thread_t
00265 {
00266 VLC_COMMON_MEMBERS
00267
00268 bool b_error;
00269 bool b_eof;
00270 bool b_preparsing;
00271 bool b_dead;
00272
00273
00274
00275 input_thread_private_t *p;
00276 };
00277
00278
00279
00280
00281
00282 #define INPUT_RECORD_PREFIX "vlc-record-%Y-%m-%d-%Hh%Mm%Ss-$ N-$ p"
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333 typedef enum input_state_e
00334 {
00335 INIT_S = 0,
00336 OPENING_S,
00337 PLAYING_S,
00338 PAUSE_S,
00339 END_S,
00340 ERROR_S,
00341 } input_state_e;
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359 #define INPUT_RATE_DEFAULT 1000
00360
00361
00362
00363 #define INPUT_RATE_MIN 32
00364
00365
00366
00367 #define INPUT_RATE_MAX 32000
00368
00369
00370
00371
00372
00373
00374
00375 typedef enum input_event_type_e
00376 {
00377
00378 INPUT_EVENT_STATE,
00379
00380 INPUT_EVENT_DEAD,
00381
00382 INPUT_EVENT_ABORT,
00383
00384
00385 INPUT_EVENT_RATE,
00386
00387
00388 INPUT_EVENT_POSITION,
00389
00390
00391 INPUT_EVENT_LENGTH,
00392
00393
00394
00395 INPUT_EVENT_TITLE,
00396
00397 INPUT_EVENT_CHAPTER,
00398
00399
00400
00401 INPUT_EVENT_PROGRAM,
00402
00403 INPUT_EVENT_ES,
00404
00405 INPUT_EVENT_TELETEXT,
00406
00407
00408 INPUT_EVENT_RECORD,
00409
00410
00411 INPUT_EVENT_ITEM_META,
00412
00413 INPUT_EVENT_ITEM_INFO,
00414
00415 INPUT_EVENT_ITEM_NAME,
00416
00417 INPUT_EVENT_ITEM_EPG,
00418
00419
00420 INPUT_EVENT_STATISTICS,
00421
00422 INPUT_EVENT_SIGNAL,
00423
00424
00425 INPUT_EVENT_AUDIO_DELAY,
00426
00427 INPUT_EVENT_SUBTITLE_DELAY,
00428
00429
00430 INPUT_EVENT_BOOKMARK,
00431
00432
00433 INPUT_EVENT_CACHE,
00434
00435
00436 INPUT_EVENT_AOUT,
00437
00438 INPUT_EVENT_VOUT,
00439
00440 } input_event_type_e;
00441
00442
00443
00444
00445 enum input_query_e
00446 {
00447
00448 INPUT_GET_POSITION,
00449 INPUT_SET_POSITION,
00450
00451
00452 INPUT_GET_LENGTH,
00453
00454
00455 INPUT_GET_TIME,
00456 INPUT_SET_TIME,
00457
00458
00459 INPUT_GET_RATE,
00460 INPUT_SET_RATE,
00461
00462
00463 INPUT_GET_STATE,
00464 INPUT_SET_STATE,
00465
00466
00467 INPUT_GET_AUDIO_DELAY,
00468 INPUT_SET_AUDIO_DELAY,
00469 INPUT_GET_SPU_DELAY,
00470 INPUT_SET_SPU_DELAY,
00471
00472
00473 INPUT_ADD_INFO,
00474 INPUT_REPLACE_INFOS,
00475 INPUT_MERGE_INFOS,
00476 INPUT_GET_INFO,
00477 INPUT_DEL_INFO,
00478 INPUT_SET_NAME,
00479
00480
00481 INPUT_GET_VIDEO_FPS,
00482
00483
00484 INPUT_GET_BOOKMARK,
00485 INPUT_GET_BOOKMARKS,
00486 INPUT_CLEAR_BOOKMARKS,
00487 INPUT_ADD_BOOKMARK,
00488 INPUT_CHANGE_BOOKMARK,
00489 INPUT_DEL_BOOKMARK,
00490 INPUT_SET_BOOKMARK,
00491
00492
00493 INPUT_GET_TITLE_INFO,
00494
00495
00496 INPUT_GET_ATTACHMENTS,
00497 INPUT_GET_ATTACHMENT,
00498
00499
00500 INPUT_ADD_SLAVE,
00501 INPUT_ADD_SUBTITLE,
00502
00503
00504 INPUT_SET_RECORD_STATE,
00505 INPUT_GET_RECORD_STATE,
00506
00507
00508 INPUT_RESTART_ES,
00509
00510
00511
00512 INPUT_GET_AOUT,
00513 INPUT_GET_VOUTS,
00514 INPUT_GET_ES_OBJECTS,
00515
00516
00517 INPUT_GET_PCR_SYSTEM,
00518 INPUT_MODIFY_PCR_SYSTEM,
00519 };
00520
00521
00522
00523
00524
00525
00526
00527 VLC_API input_thread_t * input_Create( vlc_object_t *p_parent, input_item_t *, const char *psz_log, input_resource_t * ) VLC_USED;
00528 #define input_Create(a,b,c,d) input_Create(VLC_OBJECT(a),b,c,d)
00529
00530 VLC_API input_thread_t * input_CreateAndStart( vlc_object_t *p_parent, input_item_t *, const char *psz_log ) VLC_USED;
00531 #define input_CreateAndStart(a,b,c) input_CreateAndStart(VLC_OBJECT(a),b,c)
00532
00533 VLC_API int input_Start( input_thread_t * );
00534
00535 VLC_API void input_Stop( input_thread_t *, bool b_abort );
00536
00537 VLC_API int input_Read( vlc_object_t *, input_item_t * );
00538 #define input_Read(a,b) input_Read(VLC_OBJECT(a),b)
00539
00540 VLC_API int input_vaControl( input_thread_t *, int i_query, va_list );
00541
00542 VLC_API int input_Control( input_thread_t *, int i_query, ... );
00543
00544 VLC_API void input_Close( input_thread_t * );
00545 void input_Join( input_thread_t * );
00546 void input_Release( input_thread_t * );
00547
00548
00549
00550
00551
00552
00553
00554 VLC_API input_item_t* input_GetItem( input_thread_t * ) VLC_USED;
00555
00556
00557
00558
00559
00560 static inline input_state_e input_GetState( input_thread_t * p_input )
00561 {
00562 input_state_e state = INIT_S;
00563 input_Control( p_input, INPUT_GET_STATE, &state );
00564 return state;
00565 }
00566
00567
00568
00569
00570 static inline int input_AddSubtitle( input_thread_t *p_input, const char *psz_url, bool b_check_extension )
00571 {
00572 return input_Control( p_input, INPUT_ADD_SUBTITLE, psz_url, b_check_extension );
00573 }
00574
00575
00576
00577
00578
00579
00580
00581
00582 static inline vout_thread_t *input_GetVout( input_thread_t *p_input )
00583 {
00584 vout_thread_t **pp_vout, *p_vout;
00585 size_t i_vout;
00586
00587 if( input_Control( p_input, INPUT_GET_VOUTS, &pp_vout, &i_vout ) )
00588 return NULL;
00589
00590 for( size_t i = 1; i < i_vout; i++ )
00591 vlc_object_release( (vlc_object_t *)(pp_vout[i]) );
00592
00593 p_vout = (i_vout >= 1) ? pp_vout[0] : NULL;
00594 free( pp_vout );
00595 return p_vout;
00596 }
00597
00598
00599
00600
00601
00602
00603
00604 static inline audio_output_t *input_GetAout( input_thread_t *p_input )
00605 {
00606 audio_output_t *p_aout;
00607 return input_Control( p_input, INPUT_GET_AOUT, &p_aout ) ? NULL : p_aout;
00608 }
00609
00610
00611
00612
00613
00614
00615
00616 static inline int input_GetEsObjects( input_thread_t *p_input, int i_id,
00617 vlc_object_t **pp_decoder,
00618 vout_thread_t **pp_vout, audio_output_t **pp_aout )
00619 {
00620 return input_Control( p_input, INPUT_GET_ES_OBJECTS, i_id,
00621 pp_decoder, pp_vout, pp_aout );
00622 }
00623
00624
00625
00626
00627 static inline int input_GetPcrSystem( input_thread_t *p_input, mtime_t *pi_system, mtime_t *pi_delay )
00628 {
00629 return input_Control( p_input, INPUT_GET_PCR_SYSTEM, pi_system, pi_delay );
00630 }
00631
00632
00633
00634 static inline int input_ModifyPcrSystem( input_thread_t *p_input, bool b_absolute, mtime_t i_system )
00635 {
00636 return input_Control( p_input, INPUT_MODIFY_PCR_SYSTEM, b_absolute, i_system );
00637 }
00638
00639
00640 VLC_API decoder_t * input_DecoderCreate( vlc_object_t *, es_format_t *, input_resource_t * ) VLC_USED;
00641 VLC_API void input_DecoderDelete( decoder_t * );
00642 VLC_API void input_DecoderDecode( decoder_t *, block_t *, bool b_do_pace );
00643
00644
00645
00646
00647 VLC_API char * input_CreateFilename( vlc_object_t *, const char *psz_path, const char *psz_prefix, const char *psz_extension ) VLC_USED;
00648
00649
00650
00651
00652
00653
00654
00655 VLC_API input_resource_t * input_resource_New( vlc_object_t * ) VLC_USED;
00656
00657
00658
00659
00660 VLC_API void input_resource_Release( input_resource_t * );
00661
00662
00663
00664
00665 VLC_API void input_resource_TerminateVout( input_resource_t * );
00666
00667
00668
00669
00670 VLC_API void input_resource_Terminate( input_resource_t * );
00671
00672 #endif