1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 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 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <vlc_common.h>
#include <vlc_sout.h>
#include <vlc_filter.h>
#include <vlc_es.h>
#include <vlc_codec.h>
#include <vlc_picture_fifo.h>
/*100ms is around the limit where people are noticing lipsync issues*/
#define MASTER_SYNC_MAX_DRIFT 100000
struct sout_stream_sys_t
{
sout_stream_id_sys_t *id_video;
block_t *p_buffers;
vlc_mutex_t lock_out;
vlc_cond_t cond;
bool b_abort;
picture_fifo_t *pp_pics;
vlc_sem_t picture_pool_has_room;
uint32_t pool_size;
vlc_thread_t thread;
/* Audio */
vlc_fourcc_t i_acodec; /* codec audio (0 if not transcode) */
char *psz_aenc;
char *psz_alang;
config_chain_t *p_audio_cfg;
uint32_t i_sample_rate;
uint32_t i_channels;
int i_abitrate;
char *psz_af;
/* Video */
vlc_fourcc_t i_vcodec; /* codec video (0 if not transcode) */
char *psz_venc;
config_chain_t *p_video_cfg;
int i_vbitrate;
float f_scale;
unsigned int i_width, i_maxwidth;
unsigned int i_height, i_maxheight;
char *psz_deinterlace;
config_chain_t *p_deinterlace_cfg;
int i_threads;
bool b_high_priority;
bool b_hurry_up;
unsigned int fps_num,fps_den;
char *psz_vf2;
/* SPU */
vlc_fourcc_t i_scodec; /* codec spu (0 if not transcode) */
char *psz_senc;
bool b_soverlay;
config_chain_t *p_spu_cfg;
spu_t *p_spu;
filter_t *p_spu_blend;
/* Sync */
bool b_master_sync;
/* i_master drift is how much audio buffer is ahead of calculated pts */
vlc_tick_t i_master_drift;
};
struct aout_filters;
struct sout_stream_id_sys_t
{
bool b_transcode;
bool b_error;
/* id of the out stream */
void *id;
/* Decoder */
decoder_t *p_decoder;
struct
{
vlc_mutex_t lock;
union
{
struct {
picture_t *first;
picture_t **last;
} pic;
struct {
subpicture_t *first;
subpicture_t **last;
} spu;
struct {
block_t *first;
block_t **last;
} audio;
};
} fifo;
union
{
struct
{
filter_chain_t *p_f_chain; /**< Video filters */
filter_chain_t *p_uf_chain; /**< User-specified video filters */
video_format_t fmt_input_video;
video_format_t video_dec_out; /* only rw from pf_vout_format_update() */
};
struct
{
struct aout_filters *p_af_chain; /**< Audio filters */
audio_format_t fmt_audio;
audio_format_t audio_dec_out; /* only rw from pf_aout_format_update() */
};
};
/* Encoder */
encoder_t *p_encoder;
/* Sync */
date_t next_input_pts; /**< Incoming calculated PTS */
date_t next_output_pts; /**< output calculated PTS */
};
/* SPU */
void transcode_spu_close ( sout_stream_t *, sout_stream_id_sys_t * );
int transcode_spu_process( sout_stream_t *, sout_stream_id_sys_t *,
block_t *, block_t ** );
bool transcode_spu_add ( sout_stream_t *, const es_format_t *, sout_stream_id_sys_t *);
/* AUDIO */
void transcode_audio_close ( sout_stream_id_sys_t * );
int transcode_audio_process( sout_stream_t *, sout_stream_id_sys_t *,
block_t *, block_t ** );
bool transcode_audio_add ( sout_stream_t *, const es_format_t *,
sout_stream_id_sys_t *);
/* VIDEO */
void transcode_video_close ( sout_stream_t *, sout_stream_id_sys_t * );
int transcode_video_process( sout_stream_t *, sout_stream_id_sys_t *,
block_t *, block_t ** );
bool transcode_video_add ( sout_stream_t *, const es_format_t *,
sout_stream_id_sys_t *);
|