+int input_EsOutSetRecord( es_out_t *out, bool b_record )
+{
+ es_out_sys_t *p_sys = out->p_sys;
+ input_thread_t *p_input = p_sys->p_input;
+
+ assert( ( b_record && !p_sys->p_sout_record ) || ( !b_record && p_sys->p_sout_record ) );
+
+ if( b_record )
+ {
+ char *psz_path = var_CreateGetString( p_input, "input-record-path" );
+ if( !psz_path || *psz_path == '\0' )
+ {
+ free( psz_path );
+ psz_path = strdup( config_GetHomeDir() );
+ }
+
+ char *psz_sout = NULL; // TODO conf
+
+ if( !psz_sout && psz_path )
+ {
+ char *psz_file = input_CreateFilename( VLC_OBJECT(p_input), psz_path, INPUT_RECORD_PREFIX, NULL );
+ if( psz_file )
+ {
+ if( asprintf( &psz_sout, "#record{dst-prefix='%s'}", psz_file ) < 0 )
+ psz_sout = NULL;
+ free( psz_file );
+ }
+ }
+ free( psz_path );
+
+ if( !psz_sout )
+ return VLC_EGENERIC;
+
+#ifdef ENABLE_SOUT
+ p_sys->p_sout_record = sout_NewInstance( p_input, psz_sout );
+#endif
+ free( psz_sout );
+
+ if( !p_sys->p_sout_record )
+ return VLC_EGENERIC;
+
+ for( int i = 0; i < p_sys->i_es; i++ )
+ {
+ es_out_id_t *p_es = p_sys->es[i];
+
+ if( !p_es->p_dec || p_es->p_master )
+ continue;
+
+ p_es->p_dec_record = input_DecoderNew( p_input, &p_es->fmt, p_sys->p_sout_record );
+ }
+ }
+ else
+ {
+ for( int i = 0; i < p_sys->i_es; i++ )
+ {
+ es_out_id_t *p_es = p_sys->es[i];
+
+ if( !p_es->p_dec_record )
+ continue;
+
+ input_DecoderDelete( p_es->p_dec_record );
+ p_es->p_dec_record = NULL;
+ }
+#ifdef ENABLE_SOUT
+ sout_DeleteInstance( p_sys->p_sout_record );
+#endif
+ p_sys->p_sout_record = NULL;
+ }
+
+ return VLC_SUCCESS;
+}