X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=avplay.c;h=b70ee54c7b904b4073fb7d8f2c2c3be506bcde01;hb=929ec39ec4497827f7530f2aaa31646ef35462ee;hp=96e0cf2d9efae6c2845bda070c03fcc5b243f9bd;hpb=8f8bc92365a943e96cc08b5369408c20f35193c7;p=ffmpeg diff --git a/avplay.c b/avplay.c index 96e0cf2d9ef..b70ee54c7b9 100644 --- a/avplay.c +++ b/avplay.c @@ -1846,8 +1846,7 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr) if (!is->frame) { if (!(is->frame = av_frame_alloc())) return AVERROR(ENOMEM); - } else - avcodec_get_frame_defaults(is->frame); + } if (flush_complete) break; @@ -2152,7 +2151,7 @@ static void stream_component_close(VideoState *is, int stream_index) avresample_free(&is->avr); av_freep(&is->audio_buf1); is->audio_buf = NULL; - avcodec_free_frame(&is->frame); + av_frame_free(&is->frame); if (is->rdft) { av_rdft_end(is->rdft); @@ -2602,6 +2601,33 @@ static void toggle_audio_display(void) } } +static void seek_chapter(VideoState *is, int incr) +{ + int64_t pos = get_master_clock(is) * AV_TIME_BASE; + int i; + + if (!is->ic->nb_chapters) + return; + + /* find the current chapter */ + for (i = 0; i < is->ic->nb_chapters; i++) { + AVChapter *ch = is->ic->chapters[i]; + if (av_compare_ts(pos, AV_TIME_BASE_Q, ch->start, ch->time_base) < 0) { + i--; + break; + } + } + + i += incr; + i = FFMAX(i, 0); + if (i >= is->ic->nb_chapters) + return; + + av_log(NULL, AV_LOG_VERBOSE, "Seeking to chapter %d.\n", i); + stream_seek(is, av_rescale_q(is->ic->chapters[i]->start, is->ic->chapters[i]->time_base, + AV_TIME_BASE_Q), 0, 0); +} + /* handle an event sent by the GUI */ static void event_loop(void) { @@ -2647,6 +2673,12 @@ static void event_loop(void) case SDLK_w: toggle_audio_display(); break; + case SDLK_PAGEUP: + seek_chapter(cur_stream, 1); + break; + case SDLK_PAGEDOWN: + seek_chapter(cur_stream, -1); + break; case SDLK_LEFT: incr = -10.0; goto do_seek;