diff options
author | William Yu <genwillyu@gmail.com> | 2012-03-15 19:45:26 +0800 |
---|---|---|
committer | Stefano Sabatini <stefasab@gmail.com> | 2012-03-18 21:19:09 +0100 |
commit | d19d52d4a11547cc70bcbc3a2f8b83ccd24bb951 (patch) | |
tree | 4aafc8893051edd7ee15a00622fef0723110d09b /libavfilter/src_movie.c | |
parent | 0ca15aa066f1fad20853f5a560f13688d095ea81 (diff) | |
download | ffmpeg-d19d52d4a11547cc70bcbc3a2f8b83ccd24bb951.tar.gz |
lavfi/movie: add loop parameter
Signed-off-by: William Yu <genwillyu@gmail.com>
Signed-off-by: Stefano Sabatini <stefasab@gmail.com>
Diffstat (limited to 'libavfilter/src_movie.c')
-rw-r--r-- | libavfilter/src_movie.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c index a0b427d82c..1d65ade5c8 100644 --- a/libavfilter/src_movie.c +++ b/libavfilter/src_movie.c @@ -46,6 +46,7 @@ typedef struct { char *format_name; char *file_name; int stream_index; + int loop_count; AVFormatContext *format_ctx; AVCodecContext *codec_ctx; @@ -71,6 +72,7 @@ static const AVOption movie_options[]= { {"si", "set stream index", OFFSET(stream_index), AV_OPT_TYPE_INT, {.dbl = -1}, -1, INT_MAX }, {"seek_point", "set seekpoint (seconds)", OFFSET(seek_point_d), AV_OPT_TYPE_DOUBLE, {.dbl = 0}, 0, (INT64_MAX-1) / 1000000 }, {"sp", "set seekpoint (seconds)", OFFSET(seek_point_d), AV_OPT_TYPE_DOUBLE, {.dbl = 0}, 0, (INT64_MAX-1) / 1000000 }, +{"loop", "set loop count", OFFSET(loop_count), AV_OPT_TYPE_INT, {.dbl = 1}, 0, INT_MAX }, {NULL}, }; @@ -245,7 +247,27 @@ static int movie_get_frame(AVFilterLink *outlink) if (movie->is_done == 1) return 0; - while ((ret = av_read_frame(movie->format_ctx, &pkt)) >= 0) { + while (1) { + ret = av_read_frame(movie->format_ctx, &pkt); + if (ret == AVERROR_EOF) { + int64_t timestamp; + if (movie->loop_count != 1) { + timestamp = movie->seek_point; + if (movie->format_ctx->start_time != AV_NOPTS_VALUE) + timestamp += movie->format_ctx->start_time; + if (av_seek_frame(movie->format_ctx, -1, timestamp, AVSEEK_FLAG_BACKWARD) < 0) { + movie->is_done = 1; + break; + } else if (movie->loop_count>1) + movie->loop_count--; + continue; + } else { + movie->is_done = 1; + break; + } + } else if (ret < 0) + break; + // Is this a packet from the video stream? if (pkt.stream_index == movie->stream_index) { avcodec_decode_video2(movie->codec_ctx, movie->frame, &frame_decoded, &pkt); @@ -284,10 +306,6 @@ static int movie_get_frame(AVFilterLink *outlink) av_free_packet(&pkt); } - // On multi-frame source we should stop the mixing process when - // the movie source does not have more frames - if (ret == AVERROR_EOF) - movie->is_done = 1; return ret; } |