mirror of
https://gitee.com/openharmony/third_party_ffmpeg
synced 2024-11-23 19:30:05 +00:00
avfilter/f_realtime: add option to scale speed
This commit is contained in:
parent
e94447cd49
commit
98541f7032
@ -21136,6 +21136,14 @@ They accept the following options:
|
||||
@item limit
|
||||
Time limit for the pauses. Any pause longer than that will be considered
|
||||
a timestamp discontinuity and reset the timer. Default is 2 seconds.
|
||||
@item speed
|
||||
Speed factor for processing. The value must be a float larger than zero.
|
||||
Values larger than 1.0 will result in faster than realtime processing,
|
||||
smaller will slow processing down. The @var{limit} is automatically adapted
|
||||
accordingly. Default is 1.0.
|
||||
|
||||
A processing speed faster than what is possible without these filters cannot
|
||||
be achieved.
|
||||
@end table
|
||||
|
||||
@anchor{select}
|
||||
|
@ -22,11 +22,13 @@
|
||||
#include "libavutil/time.h"
|
||||
#include "avfilter.h"
|
||||
#include "internal.h"
|
||||
#include <float.h>
|
||||
|
||||
typedef struct RealtimeContext {
|
||||
const AVClass *class;
|
||||
int64_t delta;
|
||||
int64_t limit;
|
||||
double speed;
|
||||
unsigned inited;
|
||||
} RealtimeContext;
|
||||
|
||||
@ -36,7 +38,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
|
||||
RealtimeContext *s = ctx->priv;
|
||||
|
||||
if (frame->pts != AV_NOPTS_VALUE) {
|
||||
int64_t pts = av_rescale_q(frame->pts, inlink->time_base, AV_TIME_BASE_Q);
|
||||
int64_t pts = av_rescale_q(frame->pts, inlink->time_base, AV_TIME_BASE_Q) / s->speed;
|
||||
int64_t now = av_gettime_relative();
|
||||
int64_t sleep = pts - now + s->delta;
|
||||
if (!s->inited) {
|
||||
@ -44,7 +46,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
|
||||
sleep = 0;
|
||||
s->delta = now - pts;
|
||||
}
|
||||
if (sleep > s->limit || sleep < -s->limit) {
|
||||
if (FFABS(sleep) > s->limit / s->speed) {
|
||||
av_log(ctx, AV_LOG_WARNING,
|
||||
"time discontinuity detected: %"PRIi64" us, resetting\n",
|
||||
sleep);
|
||||
@ -65,6 +67,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
|
||||
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
|
||||
static const AVOption options[] = {
|
||||
{ "limit", "sleep time limit", OFFSET(limit), AV_OPT_TYPE_DURATION, { .i64 = 2000000 }, 0, INT64_MAX, FLAGS },
|
||||
{ "speed", "speed factor", OFFSET(speed), AV_OPT_TYPE_DOUBLE, { .dbl = 1.0 }, DBL_MIN, DBL_MAX, FLAGS },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user