vlc_es_out.h 4.99 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 24 25 26 27 28 29 30 31 32 33 34 35
 *****************************************************************************/

#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 */
36
    ES_OUT_MODE_AUTO,   /* best audio/video or for input follow audio-track, sub-track */
37
    ES_OUT_MODE_PARTIAL /* select programs given after --programs */
Laurent Aimar's avatar
Laurent Aimar committed
38 39 40 41
};

enum es_out_query_e
{
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
42
    /* activate application of mode */
43
    ES_OUT_SET_ACTIVE,  /* arg1= bool                     */
Laurent Aimar's avatar
Laurent Aimar committed
44
    /* see if mode is currently aplied or not */
45
    ES_OUT_GET_ACTIVE,  /* arg1= bool*                    */
Laurent Aimar's avatar
Laurent Aimar committed
46 47 48 49 50

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

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
51
    /* set ES selected for the es category (audio/video/spu) */
Laurent Aimar's avatar
Laurent Aimar committed
52 53
    ES_OUT_SET_ES,      /* arg1= es_out_id_t*                   */

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
54
    /* set 'default' tag on ES (copied across from container) */
55 56
    ES_OUT_SET_DEFAULT, /* arg1= es_out_id_t*                   */

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
57
    /* force selection/unselection of the ES (bypass current mode) */
58 59
    ES_OUT_SET_ES_STATE,/* arg1= es_out_id_t* arg2=bool   */
    ES_OUT_GET_ES_STATE,/* arg1= es_out_id_t* arg2=bool*  */
Laurent Aimar's avatar
Laurent Aimar committed
60 61 62 63 64

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

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
65 66 67 68 69 70
    /* PCR handling, DTS/PTS will be automatically computed using thoses PCR
     * XXX: SET_PCR(_GROUP) are in charge of the pace control. They will wait
     * to slow down the demuxer to read to 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
71
     */
Laurent Aimar's avatar
Laurent Aimar committed
72 73 74
    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 */
75

76 77 78 79
    /* 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 */

80
    /* Try not to use this one as it is a bit hacky */
Laurent Aimar's avatar
Laurent Aimar committed
81 82 83 84
    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) */
85 86
    /* Set meta data for group (dynamic) */
    ES_OUT_SET_GROUP_META,  /* arg1=int i_group arg2=vlc_meta_t */
87 88
    /* Set epg for group (dynamic) */
    ES_OUT_SET_GROUP_EPG,   /* arg1=int i_group arg2=vlc_epg_t */
89
    /* */
Clément Stenac's avatar
Clément Stenac committed
90
    ES_OUT_DEL_GROUP        /* arg1=int i_group */
Laurent Aimar's avatar
Laurent Aimar committed
91 92 93 94 95 96 97 98
};

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 );
99
    bool      b_sout;
Laurent Aimar's avatar
Laurent Aimar committed
100 101 102 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

    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