vlc_es.h 8.37 KB
Newer Older
1
/*****************************************************************************
2
 * vlc_es.h: Elementary stream formats descriptions
3
 *****************************************************************************
4
 * Copyright (C) 1999-2001 the VideoLAN team
5
 * $Id$
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.
22 23
 *****************************************************************************/

24 25
#ifndef VLC_ES_H
#define VLC_ES_H 1
26

27 28 29 30
/* FIXME: i'm not too sure about this include but it fixes compilation of
 * video chromas -- dionoea */
#include "vlc_common.h"

31
/**
32 33
 * \file
 * This file defines the elementary streams format types
34
 */
35 36 37

/**
 * video palette data
38
 * \see video_format_t
39 40 41
 * \see subs_format_t
 */
struct video_palette_t
42
{
43
    int i_entries;      /**< to keep the compatibility with ffmpeg's palette */
44
    uint8_t palette[256][4];                   /**< 4-byte RGBA/YUVA palette */
45
};
46

47 48 49 50 51 52 53 54 55
/**
 * audio replay gain description
 */
#define AUDIO_REPLAY_GAIN_MAX (2)
#define AUDIO_REPLAY_GAIN_TRACK (0)
#define AUDIO_REPLAY_GAIN_ALBUM (1)
typedef struct
{
    /* true if we have the peak value */
56
    bool pb_peak[AUDIO_REPLAY_GAIN_MAX];
57 58 59 60
    /* peak value where 1.0 means full sample value */
    float      pf_peak[AUDIO_REPLAY_GAIN_MAX];

    /* true if we have the gain value */
61
    bool pb_gain[AUDIO_REPLAY_GAIN_MAX];
62 63 64 65
    /* gain value in dB */
    float      pf_gain[AUDIO_REPLAY_GAIN_MAX];
} audio_replay_gain_t;

66 67 68 69 70 71 72
/**
 * audio format description
 */
struct audio_format_t
{
    vlc_fourcc_t i_format;                          /**< audio format fourcc */
    unsigned int i_rate;                              /**< audio sample-rate */
73 74 75

    /* Describes the channels configuration of the samples (ie. number of
     * channels which are available in the buffer, and positions). */
76
    uint32_t     i_physical_channels;
77 78 79

    /* Describes from which original channels, before downmixing, the
     * buffer is derived. */
80
    uint32_t     i_original_channels;
81 82 83

    /* Optional - for A/52, SPDIF and DTS types : */
    /* Bytes used by one compressed frame, depends on bitrate. */
84
    unsigned int i_bytes_per_frame;
85 86

    /* Number of sampleframes contained in one compressed frame. */
Jean-Paul Saman's avatar
Jean-Paul Saman committed
87
    unsigned int i_frame_length;
88 89 90 91 92 93 94
    /* Please note that it may be completely arbitrary - buffers are not
     * obliged to contain a integral number of so-called "frames". It's
     * just here for the division :
     * buffer_size = i_nb_samples * i_bytes_per_frame / i_frame_length
     */

    /* FIXME ? (used by the codecs) */
95 96
    unsigned     i_bitspersample;
    unsigned     i_blockalign;
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
97
    uint8_t      i_channels; /* must be <=32 */
98
    uint8_t      i_flavor;
99 100
};

101 102 103 104 105 106 107 108
#ifdef WORDS_BIGENDIAN
#   define AUDIO_FMT_S16_NE VLC_FOURCC('s','1','6','b')
#   define AUDIO_FMT_U16_NE VLC_FOURCC('u','1','6','b')
#else
#   define AUDIO_FMT_S16_NE VLC_FOURCC('s','1','6','l')
#   define AUDIO_FMT_U16_NE VLC_FOURCC('u','1','6','l')
#endif

109
/**
110
 * video format description
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
 */
struct video_format_t
{
    vlc_fourcc_t i_chroma;                               /**< picture chroma */
    unsigned int i_aspect;                                 /**< aspect ratio */

    unsigned int i_width;                                 /**< picture width */
    unsigned int i_height;                               /**< picture height */
    unsigned int i_x_offset;               /**< start offset of visible area */
    unsigned int i_y_offset;               /**< start offset of visible area */
    unsigned int i_visible_width;                 /**< width of visible area */
    unsigned int i_visible_height;               /**< height of visible area */

    unsigned int i_bits_per_pixel;             /**< number of bits per pixel */

126 127 128
    unsigned int i_sar_num;                   /**< sample/pixel aspect ratio */
    unsigned int i_sar_den;

129 130
    unsigned int i_frame_rate;                     /**< frame rate numerator */
    unsigned int i_frame_rate_base;              /**< frame rate denominator */
131

132
    int i_rmask, i_gmask, i_bmask;          /**< color masks for RGB chroma */
133 134 135
    int i_rrshift, i_lrshift;
    int i_rgshift, i_lgshift;
    int i_rbshift, i_lbshift;
136
    video_palette_t *p_palette;              /**< video palette from demuxer */
137 138
};

139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
static inline void video_format_Init( video_format_t *p_src, vlc_fourcc_t i_chroma )
{
    memset( p_src, 0, sizeof( video_format_t ) );
    p_src->i_chroma = i_chroma;
    p_src->i_sar_num = p_src->i_sar_den = 1;
    p_src->p_palette = NULL;
}

static inline int video_format_Copy( video_format_t *p_dst, video_format_t *p_src )
{
    memcpy( p_dst, p_src, sizeof( video_format_t ) );
    if( p_src->p_palette )
    {
        p_dst->p_palette = (video_palette_t *) malloc( sizeof( video_palette_t ) );
        if( !p_dst->p_palette )
            return VLC_ENOMEM;
        memcpy( p_dst->p_palette, p_src->p_palette, sizeof( video_palette_t ) );
    }
    return VLC_SUCCESS;
};

static inline void video_format_Clean( video_format_t *p_src )
{
    free( p_src->p_palette );
    memset( p_src, 0, sizeof( video_format_t ) );
    p_src->p_palette = NULL;
}

167
/**
168
 * subtitles format description
169
 */
170
struct subs_format_t
171
{
172 173
    /* the character encoding of the text of the subtitle.
     * all gettext recognized shorts can be used */
174 175
    char *psz_encoding;

176 177 178 179

    int  i_x_origin; /**< x coordinate of the subtitle. 0 = left */
    int  i_y_origin; /**< y coordinate of the subtitle. 0 = top */

180 181
    struct
    {
182
        /*  */
183
        uint32_t palette[16+1];
184 185

        /* the width of the original movie the spu was extracted from */
Antoine Cellerier's avatar
Antoine Cellerier committed
186
        int i_original_frame_width;
187
        /* the height of the original movie the spu was extracted from */
Antoine Cellerier's avatar
Antoine Cellerier committed
188
        int i_original_frame_height;
189
    } spu;
190 191 192 193 194

    struct
    {
        int i_id;
    } dvb;
195
};
196 197 198 199

/**
 * ES definition
 */
Christophe Mutricy's avatar
Christophe Mutricy committed
200 201 202 203 204 205 206
typedef struct extra_languages_t
{
        char *psz_language;
        char *psz_description;
} extra_languages_t;


207
struct es_format_t
208 209 210 211
{
    int             i_cat;
    vlc_fourcc_t    i_codec;

212 213
    int             i_id;       /* -1: let the core mark the right id
                                   >=0: valid id */
214 215 216 217 218 219 220
    int             i_group;    /* -1 : standalone
                                   >= 0 then a "group" (program) is created
                                        for each value */
    int             i_priority; /*  -2 : mean not selectable by the users
                                    -1 : mean not selected by default even
                                        when no other stream
                                    >=0: priority */
221

222 223
    char            *psz_language;
    char            *psz_description;
224
    int             i_extra_languages;
Christophe Mutricy's avatar
Christophe Mutricy committed
225 226
    extra_languages_t *p_extra_languages;

227 228
    audio_format_t  audio;
    audio_replay_gain_t audio_replay_gain;
229 230 231
    video_format_t video;
    subs_format_t  subs;

232
    unsigned int   i_bitrate;
233

234
    bool     b_packetized; /* wether the data is packetized
235
                                    (ie. not truncated) */
236 237 238
    int     i_extra;
    void    *p_extra;

239
};
240

241
/* ES Categories */
242
enum es_format_category_e
243
{
244 245 246 247 248 249
    UNKNOWN_ES = 0x00,
    VIDEO_ES   = 0x01,
    AUDIO_ES   = 0x02,
    SPU_ES     = 0x03,
    NAV_ES     = 0x04,
};
250

251 252 253 254
/**
 * This function will fill all RGB shift from RGB masks.
 */
VLC_EXPORT( void, video_format_FixRgb, ( video_format_t * ) );
255

256 257 258 259
/**
 * This funtion will initialize a es_format_t structure.
 */
VLC_EXPORT( void, es_format_Init, ( es_format_t *, int i_cat, vlc_fourcc_t i_codec ) );
260

261 262 263 264
/**
 * This functions will copy a es_format_t.
 */
VLC_EXPORT( int, es_format_Copy, ( es_format_t *p_dst, const es_format_t *p_src ) );
265

266 267 268 269 270 271
/**
 * This function will clean up a es_format_t and relasing all associated
 * resources.
 * You can call it multiple times on the same structure.
 */
VLC_EXPORT( void, es_format_Clean, ( es_format_t *fmt ) );
272

273
#endif
274