X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ffplay.c;h=18422e282232302ea48f48c9321fc89becb8bd53;hb=49da3b7df2ae54d3512dd9b26ae20f1beb153cf0;hp=18504c550a3e07925ee1a5f9510b78a69524acd0;hpb=f7554a99bc23312c30071c37ec8c4bbfacba3a87;p=ffmpeg diff --git a/ffplay.c b/ffplay.c index 18504c550a3..18422e28223 100644 --- a/ffplay.c +++ b/ffplay.c @@ -110,6 +110,7 @@ typedef struct VideoState { int seek_req; int seek_flags; int64_t seek_pos; + int64_t seek_rel; AVFormatContext *ic; int dtg_active_format; @@ -984,11 +985,11 @@ static double get_master_clock(VideoState *is) } /* seek in the stream */ -static void stream_seek(VideoState *is, int64_t pos, int rel) +static void stream_seek(VideoState *is, int64_t pos, int64_t rel) { if (!is->seek_req) { is->seek_pos = pos; - is->seek_flags = rel < 0 ? AVSEEK_FLAG_BACKWARD : 0; + is->seek_rel = rel; if (seek_by_bytes) is->seek_flags |= AVSEEK_FLAG_BYTE; is->seek_req = 1; @@ -1226,7 +1227,6 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts) { VideoPicture *vp; int dst_pix_fmt; - AVPicture pict; static struct SwsContext *img_convert_ctx; /* wait until we have space to put a new picture */ @@ -1269,10 +1269,13 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts) /* if the frame is not skipped, then display it */ if (vp->bmp) { + AVPicture pict; + /* get a pointer on the bitmap */ SDL_LockYUVOverlay (vp->bmp); dst_pix_fmt = PIX_FMT_YUV420P; + memset(&pict,0,sizeof(AVPicture)); pict.data[0] = vp->bmp->pixels[0]; pict.data[1] = vp->bmp->pixels[2]; pict.data[2] = vp->bmp->pixels[1]; @@ -1752,7 +1755,7 @@ static int stream_component_open(VideoState *is, int stream_index) enc->error_recognition= error_recognition; enc->error_concealment= error_concealment; - set_context_opts(enc, avctx_opts[enc->codec_type], 0); + set_context_opts(enc, avcodec_opts[enc->codec_type], 0); if (!codec || avcodec_open(enc, codec) < 0) @@ -1962,7 +1965,7 @@ static int decode_thread(void *arg) /* add the stream start time */ if (ic->start_time != AV_NOPTS_VALUE) timestamp += ic->start_time; - ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD); + ret = avformat_seek_file(ic, -1, INT64_MIN, timestamp, INT64_MAX, 0); if (ret < 0) { fprintf(stderr, "%s: could not seek to position %0.3f\n", is->filename, (double)timestamp / AV_TIME_BASE); @@ -1974,16 +1977,15 @@ static int decode_thread(void *arg) ic->streams[i]->discard = AVDISCARD_ALL; switch(enc->codec_type) { case CODEC_TYPE_AUDIO: - if ((audio_index < 0 || wanted_audio_stream-- > 0) && !audio_disable) + if (wanted_audio_stream-- >= 0 && !audio_disable) audio_index = i; break; case CODEC_TYPE_VIDEO: - if ((video_index < 0 || wanted_video_stream-- > 0) && !video_disable) + if (wanted_video_stream-- >= 0 && !video_disable) video_index = i; break; case CODEC_TYPE_SUBTITLE: - if (wanted_subtitle_stream >= 0 && !video_disable && - (subtitle_index < 0 || wanted_subtitle_stream-- > 0)) + if (wanted_subtitle_stream-- >= 0 && !video_disable) subtitle_index = i; break; default: @@ -2036,18 +2038,13 @@ static int decode_thread(void *arg) } #endif if (is->seek_req) { - int stream_index= -1; int64_t seek_target= is->seek_pos; + int64_t seek_min= is->seek_rel > 0 ? seek_target - is->seek_rel + 2: INT64_MIN; + int64_t seek_max= is->seek_rel < 0 ? seek_target - is->seek_rel - 2: INT64_MAX; +//FIXME the +-2 is due to rounding being not done in the correct direction in generation +// of the seek_pos/seek_rel variables - if (is-> video_stream >= 0) stream_index= is-> video_stream; - else if(is-> audio_stream >= 0) stream_index= is-> audio_stream; - else if(is->subtitle_stream >= 0) stream_index= is->subtitle_stream; - - if(stream_index>=0){ - seek_target= av_rescale_q(seek_target, AV_TIME_BASE_Q, ic->streams[stream_index]->time_base); - } - - ret = av_seek_frame(is->ic, stream_index, seek_target, is->seek_flags); + ret = avformat_seek_file(is->ic, -1, seek_min, seek_target, seek_max, is->seek_flags); if (ret < 0) { fprintf(stderr, "%s: error while seeking\n", is->ic->filename); }else{ @@ -2347,7 +2344,7 @@ static void event_loop(void) } else { pos = get_master_clock(cur_stream); pos += incr; - stream_seek(cur_stream, (int64_t)(pos * AV_TIME_BASE), incr); + stream_seek(cur_stream, (int64_t)(pos * AV_TIME_BASE), (int64_t)(incr * AV_TIME_BASE)); } } break; @@ -2490,9 +2487,9 @@ static const OptionDef options[] = { { "fs", OPT_BOOL, {(void*)&is_full_screen}, "force full screen" }, { "an", OPT_BOOL, {(void*)&audio_disable}, "disable audio" }, { "vn", OPT_BOOL, {(void*)&video_disable}, "disable video" }, - { "ast", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&wanted_audio_stream}, "", "" }, - { "vst", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&wanted_video_stream}, "", "" }, - { "sst", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&wanted_subtitle_stream}, "", "" }, + { "ast", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&wanted_audio_stream}, "select desired audio stream", "stream_number" }, + { "vst", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&wanted_video_stream}, "select desired video stream", "stream_number" }, + { "sst", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&wanted_subtitle_stream}, "select desired subtitle stream", "stream_number" }, { "ss", HAS_ARG | OPT_FUNC2, {(void*)&opt_seek}, "seek to a given position in seconds", "pos" }, { "bytes", OPT_BOOL, {(void*)&seek_by_bytes}, "seek by bytes" }, { "nodisp", OPT_BOOL, {(void*)&display_disable}, "disable graphical display" }, @@ -2559,7 +2556,7 @@ int main(int argc, char **argv) av_register_all(); for(i=0; i