vlc_es_out.h 5.11 KB
Newer Older
Laurent Aimar's avatar
Laurent Aimar committed
1
/*****************************************************************************
2
 * vlc_es_out.h: es_out (demuxer output) descriptor, queries and methods
Laurent Aimar's avatar
Laurent Aimar committed
3
 *****************************************************************************
4
 * Copyright (C) 1999-2004 the VideoLAN team
5
 * $Id$
Laurent Aimar's avatar
Laurent Aimar committed
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 *
 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (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
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
Antoine Cellerier's avatar
Antoine Cellerier committed
21
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
Laurent Aimar's avatar
Laurent Aimar committed
22 23
 *****************************************************************************/

Clément Stenac's avatar
Clément Stenac committed
24 25 26 27
#if !defined( __LIBVLC__ )
  #error You are not libvlc or one of its plugins. You cannot include this file
#endif

Laurent Aimar's avatar
Laurent Aimar committed
28 29 30 31 32 33 34 35 36 37 38 39
#ifndef _VLC_ES_OUT_H
#define _VLC_ES_OUT_H 1

/**
 * \defgroup es out Es Out
 * @{
 */

enum es_out_mode_e
{
    ES_OUT_MODE_NONE,   /* don't select anything */
    ES_OUT_MODE_ALL,    /* eg for stream output */
40
    ES_OUT_MODE_AUTO,   /* best audio/video or for input follow audio-track, sub-track */
41
    ES_OUT_MODE_PARTIAL /* select programs given after --programs */
Laurent Aimar's avatar
Laurent Aimar committed
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
};

enum es_out_query_e
{
    /* activate apply of mode */
    ES_OUT_SET_ACTIVE,  /* arg1= vlc_bool_t                     */
    /* see if mode is currently aplied or not */
    ES_OUT_GET_ACTIVE,  /* arg1= vlc_bool_t*                    */

    /* set/get mode */
    ES_OUT_SET_MODE,    /* arg1= int                            */
    ES_OUT_GET_MODE,    /* arg2= int*                           */

    /* set es selected for the es category(audio/video/spu) */
    ES_OUT_SET_ES,      /* arg1= es_out_id_t*                   */

58 59 60
    /* set 'default' tag on es (copied across from container) */
    ES_OUT_SET_DEFAULT, /* arg1= es_out_id_t*                   */

Laurent Aimar's avatar
Laurent Aimar committed
61 62 63 64 65 66 67 68
    /* force selection/unselection of the ES (bypass current mode)*/
    ES_OUT_SET_ES_STATE,/* arg1= es_out_id_t* arg2=vlc_bool_t   */
    ES_OUT_GET_ES_STATE,/* arg1= es_out_id_t* arg2=vlc_bool_t*  */

    /* */
    ES_OUT_SET_GROUP,   /* arg1= int                            */
    ES_OUT_GET_GROUP,   /* arg1= int*                           */

Laurent Aimar's avatar
Laurent Aimar committed
69 70 71 72 73 74
    /* PCR handling, dts/pts will be automatically computed using thoses PCR
     * XXX: SET_PCR(_GROUP) is in charge of the pace control. They will wait to slow
     * down the demuxer to read at the right speed.
     * XXX: if you want PREROLL just call RESET_PCR and ES_OUT_SET_NEXT_DISPLAY_TIME and send
     * data to the decoder *without* calling SET_PCR until preroll is finished.
     */
Laurent Aimar's avatar
Laurent Aimar committed
75 76 77
    ES_OUT_SET_PCR,             /* arg1=int64_t i_pcr(microsecond!) (using default group 0)*/
    ES_OUT_SET_GROUP_PCR,       /* arg1= int i_group, arg2=int64_t i_pcr(microsecond!)*/
    ES_OUT_RESET_PCR,           /* no arg */
78

79 80 81 82
    /* Timestamp handling, convert an input timestamp to a global clock one.
     * (shouldn't have to be used by input plugins directly) */
    ES_OUT_GET_TS,             /* arg1=int64_t i_ts(microsecond!) (using default group 0), arg2=int64_t* converted i_ts */

83
    /* Try not to use this one as it is a bit hacky */
Laurent Aimar's avatar
Laurent Aimar committed
84 85 86 87
    ES_OUT_SET_FMT,     /* arg1= es_out_id_t* arg2=es_format_t* */

    /* Allow preroll of data (data with dts/pts < i_pts for one ES will be decoded but not displayed */
    ES_OUT_SET_NEXT_DISPLAY_TIME,   /* arg1=es_out_id_t* arg2=int64_t i_pts(microsecond) */
88 89
    /* Set meta data for group (dynamic) */
    ES_OUT_SET_GROUP_META,  /* arg1=int i_group arg2=vlc_meta_t */
90 91
    /* Set epg for group (dynamic) */
    ES_OUT_SET_GROUP_EPG,   /* arg1=int i_group arg2=vlc_epg_t */
92
    /* */
Clément Stenac's avatar
Clément Stenac committed
93
    ES_OUT_DEL_GROUP        /* arg1=int i_group */
Laurent Aimar's avatar
Laurent Aimar committed
94 95 96 97 98 99 100 101
};

struct es_out_t
{
    es_out_id_t *(*pf_add)    ( es_out_t *, es_format_t * );
    int          (*pf_send)   ( es_out_t *, es_out_id_t *, block_t * );
    void         (*pf_del)    ( es_out_t *, es_out_id_t * );
    int          (*pf_control)( es_out_t *, int i_query, va_list );
102
    vlc_bool_t      b_sout;
Laurent Aimar's avatar
Laurent Aimar committed
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140

    es_out_sys_t    *p_sys;
};

static inline es_out_id_t * es_out_Add( es_out_t *out, es_format_t *fmt )
{
    return out->pf_add( out, fmt );
}
static inline void es_out_Del( es_out_t *out, es_out_id_t *id )
{
    out->pf_del( out, id );
}
static inline int es_out_Send( es_out_t *out, es_out_id_t *id,
                               block_t *p_block )
{
    return out->pf_send( out, id, p_block );
}

static inline int es_out_vaControl( es_out_t *out, int i_query, va_list args )
{
    return out->pf_control( out, i_query, args );
}
static inline int es_out_Control( es_out_t *out, int i_query, ... )
{
    va_list args;
    int     i_result;

    va_start( args, i_query );
    i_result = es_out_vaControl( out, i_query, args );
    va_end( args );
    return i_result;
}

/**
 * @}
 */

#endif