X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fstream_out%2Fswitcher.c;h=a28c4096addd54c647c3861cab68a86850e8ea4a;hb=d4e0e64ed5bceec689ddc6f0ef3a6a045c087289;hp=31d4e63c8563468bcc96f6442321e4e9f2796c3c;hpb=58f925c65a66372dad3eb0edc257f03355d94903;p=vlc diff --git a/modules/stream_out/switcher.c b/modules/stream_out/switcher.c index 31d4e63c85..a28c4096ad 100644 --- a/modules/stream_out/switcher.c +++ b/modules/stream_out/switcher.c @@ -18,24 +18,30 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ -#include -#include #include -#include -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include -#include "network.h" +#include +#include #define HAVE_MMX -#ifdef HAVE_FFMPEG_AVCODEC_H +#ifdef HAVE_LIBAVCODEC_AVCODEC_H +# include +#elif defined(HAVE_FFMPEG_AVCODEC_H) # include #else # include @@ -50,7 +56,6 @@ #define SOUT_CFG_PREFIX "sout-switcher-" #define MAX_PICTURES 10 #define MAX_AUDIO 30 -#define AVCODEC_MAX_VIDEO_FRAME_SIZE (3*1024*1024) #define MAX_THRESHOLD 99999999 /***************************************************************************** @@ -104,30 +109,30 @@ static block_t *AudioGetBuffer( sout_stream_t *p_stream, sout_stream_id_t *id, "Mute audio when command is not 0." ) vlc_module_begin(); - set_description( _("MPEG2 video switcher stream output") ); + set_description( N_("MPEG2 video switcher stream output") ); set_capability( "sout stream", 50 ); add_shortcut( "switcher" ); set_callbacks( Open, Close ); add_string( SOUT_CFG_PREFIX "files", "", NULL, FILES_TEXT, - FILES_LONGTEXT, VLC_FALSE ); + FILES_LONGTEXT, false ); add_string( SOUT_CFG_PREFIX "sizes", "", NULL, SIZES_TEXT, - SIZES_LONGTEXT, VLC_FALSE ); + SIZES_LONGTEXT, false ); add_string( SOUT_CFG_PREFIX "aspect-ratio", "4:3", NULL, RATIO_TEXT, - RATIO_LONGTEXT, VLC_FALSE ); + RATIO_LONGTEXT, false ); add_integer( SOUT_CFG_PREFIX "port", 5001, NULL, - PORT_TEXT, PORT_LONGTEXT, VLC_TRUE ); + PORT_TEXT, PORT_LONGTEXT, true ); add_integer( SOUT_CFG_PREFIX "command", 0, NULL, - COMMAND_TEXT, COMMAND_LONGTEXT, VLC_TRUE ); + COMMAND_TEXT, COMMAND_LONGTEXT, true ); add_integer( SOUT_CFG_PREFIX "gop", 8, NULL, - GOP_TEXT, GOP_LONGTEXT, VLC_TRUE ); + GOP_TEXT, GOP_LONGTEXT, true ); add_integer( SOUT_CFG_PREFIX "qscale", 5, NULL, - QSCALE_TEXT, QSCALE_LONGTEXT, VLC_TRUE ); + QSCALE_TEXT, QSCALE_LONGTEXT, true ); add_bool( SOUT_CFG_PREFIX "mute-audio", 1, NULL, - AUDIO_TEXT, AUDIO_LONGTEXT, VLC_TRUE ); + AUDIO_TEXT, AUDIO_LONGTEXT, true ); vlc_module_end(); -static const char *ppsz_sout_options[] = { +static const char *const ppsz_sout_options[] = { "files", "sizes", "aspect-ratio", "port", "command", "gop", "qscale", "mute-audio", NULL }; @@ -139,7 +144,7 @@ struct sout_stream_sys_t int i_qscale; int i_aspect; sout_stream_id_t *pp_audio_ids[MAX_AUDIO]; - vlc_bool_t b_audio; + bool b_audio; /* Pictures */ picture_t p_pictures[MAX_PICTURES]; @@ -153,8 +158,8 @@ struct sout_stream_sys_t struct sout_stream_id_t { void *id; - vlc_bool_t b_switcher_video; - vlc_bool_t b_switcher_audio; + bool b_switcher_video; + bool b_switcher_audio; es_format_t f_src; block_t *p_queued; @@ -162,7 +167,7 @@ struct sout_stream_id_t AVCodec *ff_enc; AVCodecContext *ff_enc_c; AVFrame *p_frame; - char *p_buffer_out; + uint8_t *p_buffer_out; int i_nb_pred; int16_t *p_samples; }; @@ -189,7 +194,7 @@ static int Open( vlc_object_t *p_this ) return VLC_EGENERIC; } - sout_CfgParse( p_stream, SOUT_CFG_PREFIX, ppsz_sout_options, + config_ChainParse( p_stream, SOUT_CFG_PREFIX, ppsz_sout_options, p_stream->p_cfg ); var_Get( p_stream, SOUT_CFG_PREFIX "files", &val ); @@ -257,7 +262,7 @@ static int Open( vlc_object_t *p_this ) } var_Get( p_stream, SOUT_CFG_PREFIX "port", &val ); - p_sys->i_fd = net_OpenUDP( p_stream, NULL, val.i_int, NULL, 0 ); + p_sys->i_fd = net_ListenUDP1( p_stream, NULL, val.i_int ); if ( p_sys->i_fd < 0 ) { free( p_sys ); @@ -317,11 +322,11 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt ) && (p_fmt->i_codec == VLC_FOURCC('m', 'p', 'g', 'v') || p_fmt->i_codec == VLC_FOURCC('f', 'a', 'k', 'e')) ) { - id->b_switcher_video = VLC_TRUE; + id->b_switcher_video = true; p_fmt->i_codec = VLC_FOURCC('m', 'p', 'g', 'v'); msg_Dbg( p_stream, - "creating video switcher for fcc=`%4.4s'", - (char*)&p_fmt->i_codec ); + "creating video switcher for fcc=`%4.4s' cmd:%d", + (char*)&p_fmt->i_codec, p_sys->i_cmd ); } else if ( p_fmt->i_cat == AUDIO_ES && p_fmt->i_codec == VLC_FOURCC('m', 'p', 'g', 'a') @@ -330,10 +335,10 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt ) int i_ff_codec = CODEC_ID_MP2; int i; - id->b_switcher_audio = VLC_TRUE; + id->b_switcher_audio = true; msg_Dbg( p_stream, - "creating audio switcher for fcc=`%4.4s'", - (char*)&p_fmt->i_codec ); + "creating audio switcher for fcc=`%4.4s' cmd:%d", + (char*)&p_fmt->i_codec, p_sys->i_cmd ); /* Allocate the encoder right now. */ if( i_ff_codec == 0 ) @@ -352,20 +357,21 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt ) id->ff_enc_c = avcodec_alloc_context(); /* Set CPU capabilities */ + unsigned i_cpu = vlc_CPU(); id->ff_enc_c->dsp_mask = 0; - if( !(p_stream->p_libvlc->i_cpu & CPU_CAPABILITY_MMX) ) + if( !(i_cpu & CPU_CAPABILITY_MMX) ) { id->ff_enc_c->dsp_mask |= FF_MM_MMX; } - if( !(p_stream->p_libvlc->i_cpu & CPU_CAPABILITY_MMXEXT) ) + if( !(i_cpu & CPU_CAPABILITY_MMXEXT) ) { id->ff_enc_c->dsp_mask |= FF_MM_MMXEXT; } - if( !(p_stream->p_libvlc->i_cpu & CPU_CAPABILITY_3DNOW) ) + if( !(i_cpu & CPU_CAPABILITY_3DNOW) ) { id->ff_enc_c->dsp_mask |= FF_MM_3DNOW; } - if( !(p_stream->p_libvlc->i_cpu & CPU_CAPABILITY_SSE) ) + if( !(i_cpu & CPU_CAPABILITY_SSE) ) { id->ff_enc_c->dsp_mask |= FF_MM_SSE; id->ff_enc_c->dsp_mask |= FF_MM_SSE2; @@ -398,7 +404,7 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt ) } if ( i == MAX_AUDIO ) { - msg_Err( p_stream, "too many audio streams !" ); + msg_Err( p_stream, "too many audio streams!" ); free( id ); return NULL; } @@ -585,7 +591,7 @@ static int UnpackFromFile( sout_stream_t *p_stream, const char *psz_file, picture_t *p_pic ) { int i, j; - FILE *p_file = fopen( psz_file, "r" ); + FILE *p_file = utf8_fopen( psz_file, "r" ); if ( p_file == NULL ) { @@ -649,12 +655,12 @@ static int UnpackFromFile( sout_stream_t *p_stream, const char *psz_file, static void NetCommand( sout_stream_t *p_stream ) { sout_stream_sys_t *p_sys = p_stream->p_sys; - char psz_buffer[10]; - int i_len = net_ReadNonBlock( p_stream, p_sys->i_fd, NULL, psz_buffer, - sizeof( psz_buffer ), 0 ); + char psz_buffer[11]; + int i_len = recv( p_sys->i_fd, psz_buffer, sizeof( psz_buffer ) - 1, 0 ); if ( i_len > 0 ) { + psz_buffer[i_len] = '\0'; int i_cmd = strtol( psz_buffer, NULL, 0 ); if ( i_cmd < -1 || i_cmd > p_sys->i_nb_pictures ) { @@ -663,6 +669,9 @@ static void NetCommand( sout_stream_t *p_stream ) } p_sys->i_cmd = i_cmd; + + msg_Dbg( p_stream, "new command: %d old:%d", p_sys->i_cmd, + p_sys->i_old_cmd ); } } @@ -722,20 +731,21 @@ static mtime_t VideoCommand( sout_stream_t *p_stream, sout_stream_id_t *id ) id->ff_enc_c = avcodec_alloc_context(); /* Set CPU capabilities */ + unsigned i_cpu = vlc_CPU(); id->ff_enc_c->dsp_mask = 0; - if( !(p_stream->p_libvlc->i_cpu & CPU_CAPABILITY_MMX) ) + if( !(i_cpu & CPU_CAPABILITY_MMX) ) { id->ff_enc_c->dsp_mask |= FF_MM_MMX; } - if( !(p_stream->p_libvlc->i_cpu & CPU_CAPABILITY_MMXEXT) ) + if( !(i_cpu & CPU_CAPABILITY_MMXEXT) ) { id->ff_enc_c->dsp_mask |= FF_MM_MMXEXT; } - if( !(p_stream->p_libvlc->i_cpu & CPU_CAPABILITY_3DNOW) ) + if( !(i_cpu & CPU_CAPABILITY_3DNOW) ) { id->ff_enc_c->dsp_mask |= FF_MM_3DNOW; } - if( !(p_stream->p_libvlc->i_cpu & CPU_CAPABILITY_SSE) ) + if( !(i_cpu & CPU_CAPABILITY_SSE) ) { id->ff_enc_c->dsp_mask |= FF_MM_SSE; id->ff_enc_c->dsp_mask |= FF_MM_SSE2; @@ -775,7 +785,7 @@ static mtime_t VideoCommand( sout_stream_t *p_stream, sout_stream_id_t *id ) return 0; } - id->p_buffer_out = malloc( AVCODEC_MAX_VIDEO_FRAME_SIZE ); + id->p_buffer_out = malloc( id->ff_enc_c->width * id->ff_enc_c->height * 3 ); id->p_frame = avcodec_alloc_frame(); id->p_frame->linesize[0] = p_sys->p_pictures[p_sys->i_cmd-1].p[0].i_pitch; id->p_frame->linesize[1] = p_sys->p_pictures[p_sys->i_cmd-1].p[1].i_pitch; @@ -829,7 +839,7 @@ static block_t *VideoGetBuffer( sout_stream_t *p_stream, sout_stream_id_t *id, } i_out = avcodec_encode_video( id->ff_enc_c, id->p_buffer_out, - AVCODEC_MAX_VIDEO_FRAME_SIZE, + id->ff_enc_c->width * id->ff_enc_c->height * 3, id->p_frame ); if ( i_out <= 0 ) @@ -843,7 +853,7 @@ static block_t *VideoGetBuffer( sout_stream_t *p_stream, sout_stream_id_t *id, int mb_height = (id->ff_enc_c->height + 15) / 16; int h_chroma_shift, v_chroma_shift; int i; - + avcodec_get_chroma_sub_sample( id->ff_enc_c->pix_fmt, &h_chroma_shift, &v_chroma_shift ); @@ -851,11 +861,9 @@ static block_t *VideoGetBuffer( sout_stream_t *p_stream, sout_stream_id_t *id, = id->ff_enc_c->coded_frame->motion_subsample_log2; id->p_frame->mb_type = malloc( ((mb_width + 1) * (mb_height + 1) + 1) * sizeof(uint32_t) ); - p_stream->p_vlc->pf_memcpy( id->p_frame->mb_type, - id->ff_enc_c->coded_frame->mb_type, - (mb_width + 1) * mb_height - * sizeof(id->p_frame->mb_type[0])); - + vlc_memcpy( id->p_frame->mb_type, id->ff_enc_c->coded_frame->mb_type, + (mb_width + 1) * mb_height * sizeof(id->p_frame->mb_type[0])); + for ( i = 0; i < 2; i++ ) { int stride = ((16 * mb_width ) @@ -868,24 +876,24 @@ static block_t *VideoGetBuffer( sout_stream_t *p_stream, sout_stream_id_t *id, { id->p_frame->motion_val[i] = malloc( 2 * stride * height * sizeof(int16_t) ); - p_stream->p_vlc->pf_memcpy( id->p_frame->motion_val[i], - id->ff_enc_c->coded_frame->motion_val[i], - 2 * stride * height * sizeof(int16_t) ); + vlc_memcpy( id->p_frame->motion_val[i], + id->ff_enc_c->coded_frame->motion_val[i], + 2 * stride * height * sizeof(int16_t) ); } if ( id->ff_enc_c->coded_frame->ref_index[i] ) { id->p_frame->ref_index[i] = malloc( b8_stride * 2 * mb_height * sizeof(int8_t) ); - p_stream->p_vlc->pf_memcpy( id->p_frame->ref_index[i], - id->ff_enc_c->coded_frame->ref_index[i], - b8_stride * 2 * mb_height * sizeof(int8_t)); + vlc_memcpy( id->p_frame->ref_index[i], + id->ff_enc_c->coded_frame->ref_index[i], + b8_stride * 2 * mb_height * sizeof(int8_t)); } } } #endif p_out = block_New( p_stream, i_out ); - p_stream->p_vlc->pf_memcpy( p_out->p_buffer, id->p_buffer_out, i_out ); + vlc_memcpy( p_out->p_buffer, id->p_buffer_out, i_out ); p_out->i_length = p_buffer->i_length; p_out->i_pts = p_buffer->i_dts; p_out->i_dts = p_buffer->i_dts; @@ -928,7 +936,7 @@ static block_t *AudioGetBuffer( sout_stream_t *p_stream, sout_stream_id_t *id, return NULL; p_out = block_New( p_stream, i_out ); - p_stream->p_vlc->pf_memcpy( p_out->p_buffer, id->p_buffer_out, i_out ); + vlc_memcpy( p_out->p_buffer, id->p_buffer_out, i_out ); p_out->i_length = p_buffer->i_length; p_out->i_pts = p_buffer->i_dts; p_out->i_dts = p_buffer->i_dts; @@ -938,4 +946,3 @@ static block_t *AudioGetBuffer( sout_stream_t *p_stream, sout_stream_id_t *id, return p_out; } -