@ -167,7 +167,9 @@ typedef struct VideoState {
enum AVSampleFormat audio_src_fmt ;
AVAudioConvert * reformat_ctx ;
int show_audio ; /* if true, display audio samples */
enum {
SHOW_MODE_VIDEO = 0 , SHOW_MODE_WAVES , SHOW_MODE_RDFT , SHOW_MODE_NB
} show_mode ;
int16_t sample_array [ SAMPLE_ARRAY_SIZE ] ;
int sample_array_index ;
int last_i_start ;
@ -789,7 +791,7 @@ static void video_audio_display(VideoState *s)
channels = s - > audio_st - > codec - > channels ;
nb_display_channels = channels ;
if ( ! s - > paused ) {
int data_used = s - > show_audio = = 1 ? s - > width : ( 2 * nb_freq ) ;
int data_used = s - > show_mode = = SHOW_MODE_WAVES ? s - > width : ( 2 * nb_freq ) ;
n = 2 * channels ;
delay = audio_write_get_buf_size ( s ) ;
delay / = n ;
@ -806,7 +808,7 @@ static void video_audio_display(VideoState *s)
delay = data_used ;
i_start = x = compute_mod ( s - > sample_array_index - delay * channels , SAMPLE_ARRAY_SIZE ) ;
if ( s - > show_audio = = 1 ) {
if ( s - > show_mode = = SHOW_MODE_WAVES ) {
h = INT_MIN ;
for ( i = 0 ; i < 1000 ; i + = channels ) {
int idx = ( SAMPLE_ARRAY_SIZE + x - i ) % SAMPLE_ARRAY_SIZE ;
@ -828,7 +830,7 @@ static void video_audio_display(VideoState *s)
}
bgcolor = SDL_MapRGB ( screen - > format , 0x00 , 0x00 , 0x00 ) ;
if ( s - > show_audio = = 1 ) {
if ( s - > show_mode = = SHOW_MODE_WAVES ) {
fill_rectangle ( screen ,
s - > xleft , s - > ytop , s - > width , s - > height ,
bgcolor ) ;
@ -968,7 +970,7 @@ static void video_display(VideoState *is)
{
if ( ! screen )
video_open ( cur_stream ) ;
if ( is - > audio_st & & is - > show_audio )
if ( is - > audio_st & & is - > show_mode ! = SHOW_MODE_VIDEO )
video_audio_display ( is ) ;
else if ( is - > video_st )
video_image_display ( is ) ;
@ -985,7 +987,8 @@ static int refresh_thread(void *opaque)
is - > refresh = 1 ;
SDL_PushEvent ( & event ) ;
}
usleep ( is - > audio_st & & is - > show_audio ? rdftspeed * 1000 : 5000 ) ; //FIXME ideally we should wait the correct time but SDLs event passing is so slow it would be silly
//FIXME ideally we should wait the correct time but SDLs event passing is so slow it would be silly
usleep ( is - > audio_st & & is - > show_mode ! = SHOW_MODE_VIDEO ? rdftspeed * 1000 : 5000 ) ;
}
return 0 ;
}
@ -2165,7 +2168,7 @@ static void sdl_audio_callback(void *opaque, Uint8 *stream, int len)
is - > audio_buf_size = 1024 ;
memset ( is - > audio_buf , 0 , is - > audio_buf_size ) ;
} else {
if ( is - > show_audio )
if ( is - > show_mode ! = SHOW_MODE_VIDEO )
update_sample_display ( is , ( int16_t * ) is - > audio_buf , audio_size ) ;
audio_size = synchronize_audio ( is , ( int16_t * ) is - > audio_buf , audio_size ,
pts ) ;
@ -2470,7 +2473,7 @@ static int decode_thread(void *arg)
is - > refresh_tid = SDL_CreateThread ( refresh_thread , is ) ;
if ( ret < 0 ) {
if ( ! display_disable )
is - > show_audio = 2 ;
is - > show_mode = SHOW_MODE_RDFT ;
}
if ( st_index [ AVMEDIA_TYPE_SUBTITLE ] > = 0 ) {
@ -2725,7 +2728,7 @@ static void toggle_audio_display(void)
{
if ( cur_stream ) {
int bgcolor = SDL_MapRGB ( screen - > format , 0x00 , 0x00 , 0x00 ) ;
cur_stream - > show_audio = ( cur_stream - > show_audio + 1 ) % 3 ;
cur_stream - > show_mode = ( cur_stream - > show_mode + 1 ) % SHOW_MODE_NB ;
fill_rectangle ( screen ,
cur_stream - > xleft , cur_stream - > ytop , cur_stream - > width , cur_stream - > height ,
bgcolor ) ;