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
|
#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_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;
double f_scale;
unsigned int i_width, i_maxwidth;
unsigned int i_height, i_maxheight;
bool b_deinterlace;
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;
/* OSD Menu */
vlc_fourcc_t i_osdcodec; /* codec osd menu (0 if not transcode) */
char *psz_osdenc;
config_chain_t *p_osd_cfg;
bool b_osd; /* true when osd es is registered */
/* Sync */
bool b_master_sync;
/* i_master drift is how much audio buffer is ahead of calculated pts */
mtime_t i_master_drift;
};
struct aout_filters;
struct sout_stream_id_sys_t
{
bool b_transcode;
/* id of the out stream */
void *id;
/* Decoder */
decoder_t *p_decoder;
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;
};
struct
{
struct aout_filters *p_af_chain; /**< Audio filters */
audio_format_t fmt_audio;
};
};
/* Encoder */
encoder_t *p_encoder;
/* Sync */
date_t next_input_pts; /**< Incoming calculated PTS */
date_t next_output_pts; /**< output calculated PTS */
int i_input_frame_interval;
int i_output_frame_interval;
};
/* OSD */
int transcode_osd_new( sout_stream_t *p_stream, sout_stream_id_sys_t *id );
void transcode_osd_close( sout_stream_t *p_stream, sout_stream_id_sys_t *id);
int transcode_osd_process( sout_stream_t *p_stream, sout_stream_id_sys_t *id,
block_t *in, block_t **out );
bool transcode_osd_add ( sout_stream_t *, es_format_t *, sout_stream_id_sys_t *);
/* SPU */
int transcode_spu_new ( sout_stream_t *, sout_stream_id_sys_t * );
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 *, es_format_t *, sout_stream_id_sys_t *);
/* AUDIO */
int transcode_audio_new ( sout_stream_t *, sout_stream_id_sys_t * );
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 *, es_format_t *,
sout_stream_id_sys_t *);
/* VIDEO */
int transcode_video_new ( sout_stream_t *, sout_stream_id_sys_t * );
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 *, es_format_t *,
sout_stream_id_sys_t *);
|