aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-12-29 04:34:23 +0100
committerMichael Niedermayer <michaelni@gmx.at>2012-12-29 04:34:27 +0100
commitba34e56c0d39e0aa4c93241623b63db81dfef79b (patch)
tree0d066a8cd9790caffced15ee88a4c8cd7270a5e4
parentc5bea1b02b16ae7d9b07459da3916b8c6c0322d8 (diff)
parent92b50b71a1e4e78fa2828dc2e0a4428674a8a9b0 (diff)
downloadffmpeg-ba34e56c0d39e0aa4c93241623b63db81dfef79b.tar.gz
Merge remote-tracking branch 'cus/stable'
* cus/stable: ffplay: fix type of time_diff in waveform display ffplay: always display audio visualization if mode is set ffplay: hide cursor on no mouse movement ffplay: reset external clock to unknown on start ffplay: only drop frames if not in frame step mode ffplay: move frame step pause from the video thread to video_refresh Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--ffplay.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/ffplay.c b/ffplay.c
index 38673b5de1..7d47bcdc2c 100644
--- a/ffplay.c
+++ b/ffplay.c
@@ -90,6 +90,8 @@ const int program_birth_year = 2003;
/* TODO: We assume that a decoded and resampled frame fits into this buffer */
#define SAMPLE_ARRAY_SIZE (8 * 65536)
+#define CURSOR_HIDE_DELAY 1000000
+
static int64_t sws_flags = SWS_BICUBIC;
typedef struct MyAVPacketList {
@@ -303,6 +305,8 @@ static const char *audio_codec_name;
static const char *subtitle_codec_name;
static const char *video_codec_name;
static int rdftspeed = 20;
+static int64_t cursor_last_shown;
+static int cursor_hidden = 0;
#if CONFIG_AVFILTER
static char *vfilters = NULL;
#endif
@@ -824,7 +828,7 @@ static void video_audio_display(VideoState *s)
{
int i, i_start, x, y1, y, ys, delay, n, nb_display_channels;
int ch, channels, h, h2, bgcolor, fgcolor;
- int16_t time_diff;
+ int64_t time_diff;
int rdft_bits, nb_freq;
for (rdft_bits = 1; (1 << rdft_bits) < 2 * s->height; rdft_bits++)
@@ -1292,6 +1296,9 @@ static void video_refresh(void *opaque)
if (!is->paused && get_master_sync_type(is) == AV_SYNC_EXTERNAL_CLOCK && is->realtime)
check_external_clock_speed(is);
+ if (!display_disable && is->show_mode != SHOW_MODE_VIDEO && is->audio_st)
+ video_display(is);
+
if (is->video_st) {
if (is->force_refresh)
pictq_prev_picture(is);
@@ -1339,7 +1346,7 @@ retry:
if (is->pictq_size > 1) {
VideoPicture *nextvp = &is->pictq[(is->pictq_rindex + 1) % VIDEO_PICTURE_QUEUE_SIZE];
duration = nextvp->pts - vp->pts;
- if((framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) && time > is->frame_timer + duration){
+ if(!is->step && (framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) && time > is->frame_timer + duration){
is->frame_drops_late++;
pictq_next_picture(is);
goto retry;
@@ -1392,20 +1399,14 @@ retry:
display:
/* display picture */
- if (!display_disable)
+ if (!display_disable && is->show_mode == SHOW_MODE_VIDEO)
video_display(is);
pictq_next_picture(is);
- }
- } else if (is->audio_st) {
- /* draw the next audio frame */
-
- /* if only audio stream, then display the audio bars (better
- than nothing, just to test the implementation */
- /* display picture */
- if (!display_disable)
- video_display(is);
+ if (is->step && !is->paused)
+ stream_toggle_pause(is);
+ }
}
is->force_refresh = 0;
if (show_status) {
@@ -1923,9 +1924,6 @@ static int video_thread(void *arg)
if (ret < 0)
goto the_end;
-
- if (is->step)
- stream_toggle_pause(is);
}
the_end:
avcodec_flush_buffers(is->video_st->codec);
@@ -2835,7 +2833,8 @@ static VideoState *stream_open(const char *filename, AVInputFormat *iformat)
is->continue_read_thread = SDL_CreateCond();
- update_external_clock_pts(is, 0.0);
+ //FIXME: use a cleaner way to signal obsolete external clock...
+ update_external_clock_pts(is, (double)AV_NOPTS_VALUE);
update_external_clock_speed(is, 1.0);
is->audio_current_pts_drift = -av_gettime() / 1000000.0;
is->video_current_pts_drift = is->audio_current_pts_drift;
@@ -3037,6 +3036,11 @@ static void event_loop(VideoState *cur_stream)
break;
}
case SDL_MOUSEMOTION:
+ if (cursor_hidden) {
+ SDL_ShowCursor(1);
+ cursor_hidden = 0;
+ }
+ cursor_last_shown = av_gettime();
if (event.type == SDL_MOUSEBUTTONDOWN) {
x = event.button.x;
} else {
@@ -3083,6 +3087,10 @@ static void event_loop(VideoState *cur_stream)
alloc_picture(event.user.data1);
break;
case FF_REFRESH_EVENT:
+ if (!cursor_hidden && av_gettime() - cursor_last_shown > CURSOR_HIDE_DELAY) {
+ SDL_ShowCursor(0);
+ cursor_hidden = 1;
+ }
video_refresh(event.user.data1);
cur_stream->refresh = 0;
break;