/***************************************************************************** * Thread: *****************************************************************************/ static void *Thread( void *p_thread_data ) { goom_thread_t *p_thread = (goom_thread_t*)p_thread_data; date_t i_pts; int16_t p_data[2][512]; int i_data = 0, i_count = 0; PluginInfo *p_plugin_info; int canc = vlc_savecancel (); p_plugin_info = goom_init( p_thread->i_width, p_thread->i_height ); for( ;; ) { uint32_t *plane; picture_t *p_pic; /* FIXME the way the update is done is not really good. * Supurious wake up from p_thread->wait will make it generates a frame * without using new samples (probably rare as we should not be waiting * samples). * The frame rate at which the video is generated is not well controlled * nor the time at which each frame is displayed (not smooth) */ /* goom_update is damn slow, so just copy data and release the lock */ vlc_mutex_lock( &p_thread->lock ); if( !p_thread->b_exit && FillBuffer( (int16_t *)p_data, &i_data, &i_pts, &p_thread->date, p_thread ) != VLC_SUCCESS ) vlc_cond_wait( &p_thread->wait, &p_thread->lock ); bool b_exit = p_thread->b_exit; vlc_mutex_unlock( &p_thread->lock ); if( b_exit ) break; /* Speed selection */ if( p_thread->i_speed && (++i_count % (p_thread->i_speed+1)) ) continue; /* Frame dropping if necessary */ if( date_Get( &i_pts ) + GOOM_DELAY <= mdate() ) continue; plane = goom_update( p_plugin_info, p_data, 0, 0.0, NULL, NULL ); p_pic = vout_GetPicture( p_thread->p_vout ); if( unlikely(p_pic == NULL) ) continue; memcpy( p_pic->p[0].p_pixels, plane, p_thread->i_width * p_thread->i_height * 4 ); p_pic->date = date_Get( &i_pts ) + GOOM_DELAY; vout_PutPicture( p_thread->p_vout, p_pic ); } goom_close( p_plugin_info ); vlc_restorecancel (canc); return NULL; }
/***************************************************************************** * DoWork: convert a buffer ***************************************************************************** * Audio part pasted from trivial.c ****************************************************************************/ static block_t *DoWork( filter_t *p_filter, block_t *p_in_buf ) { filter_sys_t *p_sys = p_filter->p_sys; picture_t *p_outpic; /* First, get a new picture */ while( ( p_outpic = vout_GetPicture( p_sys->p_vout ) ) == NULL) { /* XXX: This looks like a bad idea. Don't run to me for sympathy if it * dead locks... */ if( !vlc_object_alive (p_sys->p_vout) ) return NULL; msleep( VOUT_OUTMEM_SLEEP ); } /* Blank the picture */ for( int i = 0 ; i < p_outpic->i_planes ; i++ ) { memset( p_outpic->p[i].p_pixels, i > 0 ? 0x80 : 0x00, p_outpic->p[i].i_visible_lines * p_outpic->p[i].i_pitch ); } /* We can now call our visualization effects */ for( int i = 0; i < p_sys->i_effect; i++ ) { #define p_effect p_sys->effect[i] if( p_effect->pf_run ) { p_effect->pf_run( p_effect, VLC_OBJECT(p_filter), p_in_buf, p_outpic ); } #undef p_effect } p_outpic->date = p_in_buf->i_pts + (p_in_buf->i_length / 2); vout_PutPicture( p_sys->p_vout, p_outpic ); return p_in_buf; }
/***************************************************************************** * Thread: *****************************************************************************/ static void* Thread( vlc_object_t *p_this ) { goom_thread_t *p_thread = (goom_thread_t*)p_this; int width, height, speed; date_t i_pts; int16_t p_data[2][512]; int i_data = 0, i_count = 0; PluginInfo *p_plugin_info; int canc = vlc_savecancel (); width = var_GetInteger( p_this, "goom-width" ); height = var_GetInteger( p_this, "goom-height" ); speed = var_CreateGetInteger( p_thread, "goom-speed" ); speed = MAX_SPEED - speed; if( speed < 0 ) speed = 0; p_plugin_info = goom_init( width, height ); while( vlc_object_alive (p_thread) ) { uint32_t *plane; picture_t *p_pic; /* goom_update is damn slow, so just copy data and release the lock */ vlc_mutex_lock( &p_thread->lock ); if( FillBuffer( (int16_t *)p_data, &i_data, &i_pts, &p_thread->date, p_thread ) != VLC_SUCCESS ) vlc_cond_wait( &p_thread->wait, &p_thread->lock ); vlc_mutex_unlock( &p_thread->lock ); /* Speed selection */ if( speed && (++i_count % (speed+1)) ) continue; /* Frame dropping if necessary */ if( date_Get( &i_pts ) + GOOM_DELAY <= mdate() ) continue; plane = goom_update( p_plugin_info, p_data, 0, 0.0, p_thread->psz_title, NULL ); free( p_thread->psz_title ); p_thread->psz_title = NULL; while( !( p_pic = vout_GetPicture( p_thread->p_vout ) ) && vlc_object_alive (p_thread) ) { msleep( VOUT_OUTMEM_SLEEP ); } if( p_pic == NULL ) break; memcpy( p_pic->p[0].p_pixels, plane, width * height * 4 ); p_pic->date = date_Get( &i_pts ) + GOOM_DELAY; vout_PutPicture( p_thread->p_vout, p_pic ); } goom_close( p_plugin_info ); vlc_restorecancel (canc); return NULL; }