vlc_input.h 20.8 KB
Newer Older
1
/*****************************************************************************
2
 * vlc_input.h: Core input structures
3
 *****************************************************************************
4
 * Copyright (C) 1999-2015 VLC authors and VideoLAN
5
 * $Id$
6 7 8 9
 *
 * Authors: Christophe Massiot <massiot@via.ecp.fr>
 *          Laurent Aimar <fenrir@via.ecp.fr>
 *
Jean-Baptiste Kempf's avatar
LGPL  
Jean-Baptiste Kempf committed
10 11 12
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
13 14 15 16
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Jean-Baptiste Kempf's avatar
LGPL  
Jean-Baptiste Kempf committed
17 18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
19
 *
Jean-Baptiste Kempf's avatar
LGPL  
Jean-Baptiste Kempf committed
20 21 22
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 24 25
 *****************************************************************************/

/* __ is need because conflict with <vlc/input.h> */
26 27
#ifndef VLC_INPUT_H
#define VLC_INPUT_H 1
28

29 30 31 32 33
/**
 * \file
 * This file defines functions, structures and enums for input objects in vlc
 */

34
#include <vlc_es.h>
35
#include <vlc_meta.h>
Laurent Aimar's avatar
Laurent Aimar committed
36
#include <vlc_epg.h>
37
#include <vlc_events.h>
38
#include <vlc_input_item.h>
39
#include <vlc_vout_osd.h>
40

41
#include <string.h>
42

43 44 45 46 47 48 49 50 51 52 53 54 55
/*****************************************************************************
 * Seek point: (generalisation of chapters)
 *****************************************************************************/
struct seekpoint_t
{
    int64_t i_byte_offset;
    int64_t i_time_offset;
    char    *psz_name;
};

static inline seekpoint_t *vlc_seekpoint_New( void )
{
    seekpoint_t *point = (seekpoint_t*)malloc( sizeof( seekpoint_t ) );
56 57
    if( !point )
        return NULL;
58
    point->i_byte_offset =
59
    point->i_time_offset = -1;
60 61 62 63 64 65 66
    point->psz_name = NULL;
    return point;
}

static inline void vlc_seekpoint_Delete( seekpoint_t *point )
{
    if( !point ) return;
67
    free( point->psz_name );
68 69 70
    free( point );
}

71
static inline seekpoint_t *vlc_seekpoint_Duplicate( const seekpoint_t *src )
72 73 74 75 76 77 78 79 80 81 82
{
    seekpoint_t *point = vlc_seekpoint_New();
    if( src->psz_name ) point->psz_name = strdup( src->psz_name );
    point->i_time_offset = src->i_time_offset;
    point->i_byte_offset = src->i_byte_offset;
    return point;
}

/*****************************************************************************
 * Title:
 *****************************************************************************/
83
typedef struct input_title_t
84 85 86
{
    char        *psz_name;

Jean-Paul Saman's avatar
Jean-Paul Saman committed
87
    bool        b_menu;      /* Is it a menu or a normal entry */
88 89 90 91 92 93 94 95 96

    int64_t     i_length;   /* Length(microsecond) if known, else 0 */
    int64_t     i_size;     /* Size (bytes) if known, else 0 */

    /* Title seekpoint */
    int         i_seekpoint;
    seekpoint_t **seekpoint;
} input_title_t;

97
static inline input_title_t *vlc_input_title_New(void)
98 99
{
    input_title_t *t = (input_title_t*)malloc( sizeof( input_title_t ) );
100 101
    if( !t )
        return NULL;
102 103

    t->psz_name = NULL;
104
    t->b_menu = false;
105 106 107 108 109 110 111
    t->i_length = 0;
    t->i_size   = 0;
    t->i_seekpoint = 0;
    t->seekpoint = NULL;

    return t;
}
112

113 114 115 116 117 118
static inline void vlc_input_title_Delete( input_title_t *t )
{
    int i;
    if( t == NULL )
        return;

119
    free( t->psz_name );
120 121
    for( i = 0; i < t->i_seekpoint; i++ )
    {
122
        free( t->seekpoint[i]->psz_name );
123 124
        free( t->seekpoint[i] );
    }
125
    free( t->seekpoint );
126 127 128
    free( t );
}

Rémi Duraffort's avatar
Rémi Duraffort committed
129
static inline input_title_t *vlc_input_title_Duplicate( const input_title_t *t )
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
{
    input_title_t *dup = vlc_input_title_New( );
    int i;

    if( t->psz_name ) dup->psz_name = strdup( t->psz_name );
    dup->b_menu      = t->b_menu;
    dup->i_length    = t->i_length;
    dup->i_size      = t->i_size;
    dup->i_seekpoint = t->i_seekpoint;
    if( t->i_seekpoint > 0 )
    {
        dup->seekpoint = (seekpoint_t**)calloc( t->i_seekpoint,
                                                sizeof(seekpoint_t*) );

        for( i = 0; i < t->i_seekpoint; i++ )
        {
            dup->seekpoint[i] = vlc_seekpoint_Duplicate( t->seekpoint[i] );
        }
    }

    return dup;
}
Jean-Paul Saman's avatar
Jean-Paul Saman committed
152

153 154 155 156 157 158 159 160
/*****************************************************************************
 * Attachments
 *****************************************************************************/
struct input_attachment_t
{
    char *psz_name;
    char *psz_mime;
    char *psz_description;
161

162 163 164
    int  i_data;
    void *p_data;
};
Jean-Paul Saman's avatar
Jean-Paul Saman committed
165

166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
static inline input_attachment_t *vlc_input_attachment_New( const char *psz_name,
                                                            const char *psz_mime,
                                                            const char *psz_description,
                                                            const void *p_data,
                                                            int i_data )
{
    input_attachment_t *a =
        (input_attachment_t*)malloc( sizeof(input_attachment_t) );
    if( !a )
        return NULL;
    a->psz_name = strdup( psz_name ? psz_name : "" );
    a->psz_mime = strdup( psz_mime ? psz_mime : "" );
    a->psz_description = strdup( psz_description ? psz_description : "" );
    a->i_data = i_data;
    a->p_data = NULL;
    if( i_data > 0 )
    {
        a->p_data = malloc( i_data );
        if( a->p_data && p_data )
            memcpy( a->p_data, p_data, i_data );
    }
    return a;
}
static inline input_attachment_t *vlc_input_attachment_Duplicate( const input_attachment_t *a )
{
    return vlc_input_attachment_New( a->psz_name, a->psz_mime, a->psz_description,
                                     a->p_data, a->i_data );
}
static inline void vlc_input_attachment_Delete( input_attachment_t *a )
{
    if( !a )
        return;
    free( a->psz_name );
    free( a->psz_mime );
    free( a->psz_description );
201
    free( a->p_data );
202 203
    free( a );
}
Jean-Paul Saman's avatar
Jean-Paul Saman committed
204

205 206 207 208
/*****************************************************************************
 * input defines/constants.
 *****************************************************************************/

209 210
/**
 * This defines private core storage for an input.
211
 */
Clément Stenac's avatar
Clément Stenac committed
212 213
typedef struct input_thread_private_t input_thread_private_t;

214 215 216 217 218
/**
 * This defines an opaque input resource handler.
 */
typedef struct input_resource_t input_resource_t;

Clément Stenac's avatar
Clément Stenac committed
219 220
/**
 * Main structure representing an input thread. This structure is mostly
221
 * private. The only public fields are read-only and constant.
Clément Stenac's avatar
Clément Stenac committed
222
 */
223 224
struct input_thread_t
{
225
    VLC_COMMON_MEMBERS
226

227
    bool b_preparsing;
228
    bool b_dead VLC_DEPRECATED;
229

Clément Stenac's avatar
Clément Stenac committed
230 231 232
    /* All other data is input_thread is PRIVATE. You can't access it
     * outside of src/input */
    input_thread_private_t *p;
233 234
};

235 236 237 238
/**
 * Record prefix string.
 * TODO make it configurable.
 */
239
#define INPUT_RECORD_PREFIX "vlc-record-%Y-%m-%d-%Hh%Mm%Ss-$ N-$ p"
240

Laurent Aimar's avatar
Laurent Aimar committed
241 242 243 244 245 246 247 248 249 250 251 252
/*****************************************************************************
 * Input events and variables
 *****************************************************************************/

/**
 * \defgroup inputvariable Input variables
 *
 * The input provides multiples variable you can write to and/or read from.
 *
 * TODO complete the documentation.
 * The read only variables are:
 *  - "length"
253
 *  - "can-seek" (if you can seek, it doesn't say if 'bar display' has be shown
Laurent Aimar's avatar
Laurent Aimar committed
254 255
 *    or not, for that check position != 0.0)
 *  - "can-pause"
256
 *  - "can-rate"
Laurent Aimar's avatar
Laurent Aimar committed
257 258
 *  - "can-rewind"
 *  - "can-record" (if a stream can be recorded while playing)
259 260
 *  - "teletext-es" (list of id from the spu tracks (spu-es) that are teletext, the
 *                   variable value being the one currently selected, -1 if no teletext)
261 262
 *  - "signal-quality"
 *  - "signal-strength"
263
 *  - "program-scrambled" (if the current program is scrambled)
264
 *  - "cache" (level of data cached [0 .. 1])
Laurent Aimar's avatar
Laurent Aimar committed
265 266 267
 *
 * The read-write variables are:
 *  - state (\see input_state_e)
268
 *  - rate
Laurent Aimar's avatar
Laurent Aimar committed
269 270
 *  - position, position-offset
 *  - time, time-offset
271 272
 *  - title, next-title, prev-title
 *  - chapter, next-chapter, next-chapter-prev
Laurent Aimar's avatar
Laurent Aimar committed
273 274
 *  - program, audio-es, video-es, spu-es
 *  - audio-delay, spu-delay
275
 *  - bookmark (bookmark list)
276 277 278 279
 *  - record
 *  - frame-next
 *  - navigation (list of "title %2i")
 *  - "title %2i"
Laurent Aimar's avatar
Laurent Aimar committed
280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
 *
 * The variable used for event is
 *  - intf-event (\see input_event_type_e)
 */

/**
 * Input state
 *
 * This enum is used by the variable "state"
 */
typedef enum input_state_e
{
    INIT_S = 0,
    OPENING_S,
    PLAYING_S,
    PAUSE_S,
    END_S,
    ERROR_S,
} input_state_e;

/**
 * Input rate.
 *
303
 * It is an float used by the variable "rate" in the
Frédéric Yhuel's avatar
Frédéric Yhuel committed
304
 * range [INPUT_RATE_DEFAULT/INPUT_RATE_MAX, INPUT_RATE_DEFAULT/INPUT_RATE_MIN]
305 306
 * the default value being 1. It represents the ratio of playback speed to
 * nominal speed (bigger is faster).
Laurent Aimar's avatar
Laurent Aimar committed
307
 *
308 309 310
 * Internally, the rate is stored as a value in the range
 * [INPUT_RATE_MIN, INPUT_RATE_MAX].
 * internal rate = INPUT_RATE_DEFAULT / rate variable
Laurent Aimar's avatar
Laurent Aimar committed
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
 */

/**
 * Default rate value
 */
#define INPUT_RATE_DEFAULT  1000
/**
 * Minimal rate value
 */
#define INPUT_RATE_MIN        32            /* Up to 32/1 */
/**
 * Maximal rate value
 */
#define INPUT_RATE_MAX     32000            /* Up to 1/32 */

/**
 * Input events
 *
 * You can catch input event by adding a callback on the variable "intf-event".
 * This variable is an integer that will hold a input_event_type_e value.
 */
typedef enum input_event_type_e
{
    /* "state" has changed */
    INPUT_EVENT_STATE,
336 337 338
    /* b_dead is true */
    INPUT_EVENT_DEAD,

Laurent Aimar's avatar
Laurent Aimar committed
339 340
    /* "rate" has changed */
    INPUT_EVENT_RATE,
341

342 343 344 345 346
    /* At least one of "position" or "time" */
    INPUT_EVENT_POSITION,

    /* "length" has changed */
    INPUT_EVENT_LENGTH,
Laurent Aimar's avatar
Laurent Aimar committed
347 348 349 350 351 352 353

    /* A title has been added or removed or selected.
     * It imply that chapter has changed (not chapter event is sent) */
    INPUT_EVENT_TITLE,
    /* A chapter has been added or removed or selected. */
    INPUT_EVENT_CHAPTER,

354 355
    /* A program ("program") has been added or removed or selected,
     * or "program-scrambled" has changed.*/
Laurent Aimar's avatar
Laurent Aimar committed
356 357 358
    INPUT_EVENT_PROGRAM,
    /* A ES has been added or removed or selected */
    INPUT_EVENT_ES,
Laurent Aimar's avatar
Laurent Aimar committed
359 360
    /* "teletext-es" has changed */
    INPUT_EVENT_TELETEXT,
Laurent Aimar's avatar
Laurent Aimar committed
361 362 363 364 365 366 367 368 369 370

    /* "record" has changed */
    INPUT_EVENT_RECORD,

    /* input_item_t media has changed */
    INPUT_EVENT_ITEM_META,
    /* input_item_t info has changed */
    INPUT_EVENT_ITEM_INFO,
    /* input_item_t name has changed */
    INPUT_EVENT_ITEM_NAME,
371 372
    /* input_item_t epg has changed */
    INPUT_EVENT_ITEM_EPG,
Laurent Aimar's avatar
Laurent Aimar committed
373 374 375 376 377 378 379 380 381 382 383

    /* Input statistics have been updated */
    INPUT_EVENT_STATISTICS,
    /* At least one of "signal-quality" or "signal-strength" has changed */
    INPUT_EVENT_SIGNAL,

    /* "audio-delay" has changed */
    INPUT_EVENT_AUDIO_DELAY,
    /* "spu-delay" has changed */
    INPUT_EVENT_SUBTITLE_DELAY,

384 385 386
    /* "bookmark" has changed */
    INPUT_EVENT_BOOKMARK,

387 388 389
    /* cache" has changed */
    INPUT_EVENT_CACHE,

390
    /* A audio_output_t object has been created/deleted by *the input* */
391 392 393 394
    INPUT_EVENT_AOUT,
    /* A vout_thread_t object has been created/deleted by *the input* */
    INPUT_EVENT_VOUT,

Laurent Aimar's avatar
Laurent Aimar committed
395 396
} input_event_type_e;

397
/**
398
 * Input queries
399
 */
400 401 402 403 404 405 406 407 408 409 410 411 412
enum input_query_e
{
    /* input variable "position" */
    INPUT_GET_POSITION,         /* arg1= double *       res=    */
    INPUT_SET_POSITION,         /* arg1= double         res=can fail    */

    /* input variable "length" */
    INPUT_GET_LENGTH,           /* arg1= int64_t *      res=can fail    */

    /* input variable "time" */
    INPUT_GET_TIME,             /* arg1= int64_t *      res=    */
    INPUT_SET_TIME,             /* arg1= int64_t        res=can fail    */

413
    /* input variable "rate" (nominal is INPUT_RATE_DEFAULT) */
414 415 416 417 418 419 420
    INPUT_GET_RATE,             /* arg1= int *          res=    */
    INPUT_SET_RATE,             /* arg1= int            res=can fail    */

    /* input variable "state" */
    INPUT_GET_STATE,            /* arg1= int *          res=    */
    INPUT_SET_STATE,            /* arg1= int            res=can fail    */

421
    /* input variable "audio-delay" and "sub-delay" */
422 423 424 425 426
    INPUT_GET_AUDIO_DELAY,      /* arg1 = int* res=can fail */
    INPUT_SET_AUDIO_DELAY,      /* arg1 = int  res=can fail */
    INPUT_GET_SPU_DELAY,        /* arg1 = int* res=can fail */
    INPUT_SET_SPU_DELAY,        /* arg1 = int  res=can fail */

427 428 429 430 431 432 433
    /* Menu navigation */
    INPUT_NAV_ACTIVATE,
    INPUT_NAV_UP,
    INPUT_NAV_DOWN,
    INPUT_NAV_LEFT,
    INPUT_NAV_RIGHT,

434
    /* Meta datas */
435
    INPUT_ADD_INFO,   /* arg1= char* arg2= char* arg3=...     res=can fail */
436 437
    INPUT_REPLACE_INFOS,/* arg1= info_category_t *            res=cannot fail */
    INPUT_MERGE_INFOS,/* arg1= info_category_t *              res=cannot fail */
438 439 440
    INPUT_GET_INFO,   /* arg1= char* arg2= char* arg3= char** res=can fail */
    INPUT_DEL_INFO,   /* arg1= char* arg2= char*              res=can fail */
    INPUT_SET_NAME,   /* arg1= char* res=can fail    */
441

442
    /* Input properties */
443
    INPUT_GET_VIDEO_FPS,         /* arg1= double *        res=can fail */
444

445
    /* bookmarks */
446
    INPUT_GET_BOOKMARK,    /* arg1= seekpoint_t *               res=can fail */
447 448 449 450 451 452
    INPUT_GET_BOOKMARKS,   /* arg1= seekpoint_t *** arg2= int * res=can fail */
    INPUT_CLEAR_BOOKMARKS, /* res=can fail */
    INPUT_ADD_BOOKMARK,    /* arg1= seekpoint_t *  res=can fail   */
    INPUT_CHANGE_BOOKMARK, /* arg1= seekpoint_t * arg2= int * res=can fail   */
    INPUT_DEL_BOOKMARK,    /* arg1= seekpoint_t *  res=can fail   */
    INPUT_SET_BOOKMARK,    /* arg1= int  res=can fail    */
453

454 455
    /* titles */
    INPUT_GET_TITLE_INFO,     /* arg1=input_title_t** arg2= int * res=can fail */
456
    INPUT_GET_FULL_TITLE_INFO,     /* arg1=input_title_t*** arg2= int * res=can fail */
457

458 459 460
    /* seekpoints */
    INPUT_GET_SEEKPOINTS,  /* arg1=seekpoint_t*** arg2= int * res=can fail */

461 462 463 464
    /* Attachments */
    INPUT_GET_ATTACHMENTS, /* arg1=input_attachment_t***, arg2=int*  res=can fail */
    INPUT_GET_ATTACHMENT,  /* arg1=input_attachment_t**, arg2=char*  res=can fail */

465
    /* On the fly input slave */
466 467
    INPUT_ADD_SLAVE,       /* arg1= const char * */
    INPUT_ADD_SUBTITLE,    /* arg1= const char *, arg2=bool b_check_extension */
468 469 470 471

    /* On the fly record while playing */
    INPUT_SET_RECORD_STATE, /* arg1=bool    res=can fail */
    INPUT_GET_RECORD_STATE, /* arg1=bool*   res=can fail */
472 473 474

    /* ES */
    INPUT_RESTART_ES,       /* arg1=int (-AUDIO/VIDEO/SPU_ES for the whole category) */
475 476 477

    /* Input ressources
     * XXX You must call vlc_object_release as soon as possible */
478
    INPUT_GET_AOUT,         /* arg1=audio_output_t **              res=can fail */
479
    INPUT_GET_VOUTS,        /* arg1=vout_thread_t ***, size_t *        res=can fail */
480
    INPUT_GET_ES_OBJECTS,   /* arg1=int id, vlc_object_t **dec, vout_thread_t **, audio_output_t ** */
481 482

    /* External clock managments */
483
    INPUT_GET_PCR_SYSTEM,   /* arg1=mtime_t *, arg2=mtime_t *       res=can fail */
484
    INPUT_MODIFY_PCR_SYSTEM,/* arg1=int absolute, arg2=mtime_t      res=can fail */
485 486
};

487 488 489 490 491 492
/** @}*/

/*****************************************************************************
 * Prototypes
 *****************************************************************************/

493
VLC_API input_thread_t * input_Create( vlc_object_t *p_parent, input_item_t *, const char *psz_log, input_resource_t * ) VLC_USED;
494
#define input_Create(a,b,c,d) input_Create(VLC_OBJECT(a),b,c,d)
495

496
VLC_API input_thread_t * input_CreateAndStart( vlc_object_t *p_parent, input_item_t *, const char *psz_log ) VLC_USED;
497
#define input_CreateAndStart(a,b,c) input_CreateAndStart(VLC_OBJECT(a),b,c)
498

499
VLC_API int input_Start( input_thread_t * );
500

501
VLC_API void input_Stop( input_thread_t * );
502

503
VLC_API int input_Read( vlc_object_t *, input_item_t * );
504
#define input_Read(a,b) input_Read(VLC_OBJECT(a),b)
505

506
VLC_API int input_vaControl( input_thread_t *, int i_query, va_list  );
507

508
VLC_API int input_Control( input_thread_t *, int i_query, ...  );
509

510
VLC_API void input_Close( input_thread_t * );
Laurent Aimar's avatar
Laurent Aimar committed
511

512 513 514 515 516 517
/**
 * Get the input item for an input thread
 *
 * You have to keep a reference to the input or to the input_item_t until
 * you do not need it anymore.
 */
518
VLC_API input_item_t* input_GetItem( input_thread_t * ) VLC_USED;
519

520 521 522 523
/**
 * It will return the current state of the input.
 * Provided for convenience.
 */
524 525 526 527 528 529
static inline input_state_e input_GetState( input_thread_t * p_input )
{
    input_state_e state = INIT_S;
    input_Control( p_input, INPUT_GET_STATE, &state );
    return state;
}
530

531 532 533 534 535 536 537 538 539 540
/**
 * Return one of the video output (if any). If possible, you should use
 * INPUT_GET_VOUTS directly and process _all_ video outputs instead.
 * @param p_input an input thread from which to get a video output
 * @return NULL on error, or a video output thread pointer (which needs to be
 * released with vlc_object_release()).
 */
static inline vout_thread_t *input_GetVout( input_thread_t *p_input )
{
     vout_thread_t **pp_vout, *p_vout;
541
     size_t i_vout;
542 543 544 545

     if( input_Control( p_input, INPUT_GET_VOUTS, &pp_vout, &i_vout ) )
         return NULL;

546
     for( size_t i = 1; i < i_vout; i++ )
547 548 549
         vlc_object_release( (vlc_object_t *)(pp_vout[i]) );

     p_vout = (i_vout >= 1) ? pp_vout[0] : NULL;
550
     free( pp_vout );
551 552 553
     return p_vout;
}

554 555 556 557 558 559 560 561 562 563 564 565 566 567
/**
 * It will add a new subtitle source to the input.
 * Provided for convenience.
 */
static inline int input_AddSubtitleOSD( input_thread_t *p_input, const char *psz_url,
        bool b_check_extension, bool b_osd )
{
    int i_result = input_Control( p_input, INPUT_ADD_SUBTITLE, psz_url, b_check_extension );
    if( i_result != VLC_SUCCESS || !b_osd )
        return i_result;

    vout_thread_t *p_vout = input_GetVout( p_input );
    if( p_vout )
    {
568 569
        vout_OSDMessage(p_vout, SPU_DEFAULT_CHANNEL, "%s",
                        vlc_gettext("Subtitle track added") );
570 571 572 573 574 575 576
        vlc_object_release( (vlc_object_t *)p_vout );
    }
    return i_result;
}
#define input_AddSubtitle(a, b, c) input_AddSubtitleOSD(a, b, c, false)


577 578 579 580 581 582
/**
 * Return the audio output (if any) associated with an input.
 * @param p_input an input thread
 * @return NULL on error, or the audio output (which needs to be
 * released with vlc_object_release()).
 */
583
static inline audio_output_t *input_GetAout( input_thread_t *p_input )
584
{
585
     audio_output_t *p_aout;
586
     return input_Control( p_input, INPUT_GET_AOUT, &p_aout ) ? NULL : p_aout;
587 588
}

589 590 591 592 593 594 595 596
/**
 * Returns the objects associated to an ES.
 *
 * You must release all non NULL object using vlc_object_release.
 * You may set pointer of pointer to NULL to avoid retreiving it.
 */
static inline int input_GetEsObjects( input_thread_t *p_input, int i_id,
                                      vlc_object_t **pp_decoder,
597
                                      vout_thread_t **pp_vout, audio_output_t **pp_aout )
598 599 600 601 602
{
    return input_Control( p_input, INPUT_GET_ES_OBJECTS, i_id,
                          pp_decoder, pp_vout, pp_aout );
}

603 604 605
/**
 * \see input_clock_GetSystemOrigin
 */
606
static inline int input_GetPcrSystem( input_thread_t *p_input, mtime_t *pi_system, mtime_t *pi_delay )
607
{
608
    return input_Control( p_input, INPUT_GET_PCR_SYSTEM, pi_system, pi_delay );
609 610 611 612 613 614 615 616 617
}
/**
 * \see input_clock_ChangeSystemOrigin
 */
static inline int input_ModifyPcrSystem( input_thread_t *p_input, bool b_absolute, mtime_t i_system )
{
    return input_Control( p_input, INPUT_MODIFY_PCR_SYSTEM, b_absolute, i_system );
}

618
/* */
619
VLC_API decoder_t * input_DecoderCreate( vlc_object_t *, const es_format_t *, input_resource_t * ) VLC_USED;
620 621
VLC_API void input_DecoderDelete( decoder_t * );
VLC_API void input_DecoderDecode( decoder_t *, block_t *, bool b_do_pace );
622
VLC_API void input_DecoderDrain( decoder_t * );
623
VLC_API void input_DecoderFlush( decoder_t * );
624

625 626 627
/**
 * This function creates a sane filename path.
 */
628
VLC_API char * input_CreateFilename( input_thread_t *, const char *psz_path, const char *psz_prefix, const char *psz_extension ) VLC_USED;
629

630
/**
631
 * It creates an empty input resource handler.
632
 *
633 634
 * The given object MUST stay alive as long as the input_resource_t is
 * not deleted.
635
 */
636
VLC_API input_resource_t * input_resource_New( vlc_object_t * ) VLC_USED;
637 638

/**
639
 * It releases an input resource.
640
 */
641
VLC_API void input_resource_Release( input_resource_t * );
642

643 644 645
/**
 * Forcefully destroys the video output (e.g. when the playlist is stopped).
 */
646
VLC_API void input_resource_TerminateVout( input_resource_t * );
647

648 649 650
/**
 * This function releases all resources (object).
 */
651
VLC_API void input_resource_Terminate( input_resource_t * );
652

653 654 655 656 657 658
/**
 * \return the current audio output if any.
 * Use vlc_object_release() to drop the reference.
 */
VLC_API audio_output_t *input_resource_HoldAout( input_resource_t * );

659 660 661 662 663 664 665 666 667 668
/**
 * This function creates or recycles an audio output.
 */
VLC_API audio_output_t *input_resource_GetAout( input_resource_t * );

/**
 * This function retains or destroys an audio output.
 */
VLC_API void input_resource_PutAout( input_resource_t *, audio_output_t * );

669 670 671 672 673
/**
 * Prevents the existing audio output (if any) from being recycled.
 */
VLC_API void input_resource_ResetAout( input_resource_t * );

674
#endif