av_gettime_relative() is using the monotonic clock therefore more suitable for elapsed time calculations. Packet timestamps are still kept absolute, although that should be configurable in the future. Related to ticket #9089. Signed-off-by: Marton Balint <cus@passwd.hu>tags/n4.4
@@ -225,14 +225,14 @@ static void bktr_getframe(uint64_t per_frame) | |||||
{ | { | ||||
uint64_t curtime; | uint64_t curtime; | ||||
curtime = av_gettime(); | |||||
curtime = av_gettime_relative(); | |||||
if (!last_frame_time | if (!last_frame_time | ||||
|| ((last_frame_time + per_frame) > curtime)) { | || ((last_frame_time + per_frame) > curtime)) { | ||||
if (!usleep(last_frame_time + per_frame + per_frame / 8 - curtime)) { | if (!usleep(last_frame_time + per_frame + per_frame / 8 - curtime)) { | ||||
if (!nsignals) | if (!nsignals) | ||||
av_log(NULL, AV_LOG_INFO, | av_log(NULL, AV_LOG_INFO, | ||||
"SLEPT NO signals - %d microseconds late\n", | "SLEPT NO signals - %d microseconds late\n", | ||||
(int)(av_gettime() - last_frame_time - per_frame)); | |||||
(int)(av_gettime_relative() - last_frame_time - per_frame)); | |||||
} | } | ||||
} | } | ||||
nsignals = 0; | nsignals = 0; | ||||
@@ -157,11 +157,11 @@ static int fbdev_read_packet(AVFormatContext *avctx, AVPacket *pkt) | |||||
uint8_t *pin, *pout; | uint8_t *pin, *pout; | ||||
if (fbdev->time_frame == AV_NOPTS_VALUE) | if (fbdev->time_frame == AV_NOPTS_VALUE) | ||||
fbdev->time_frame = av_gettime(); | |||||
fbdev->time_frame = av_gettime_relative(); | |||||
/* wait based on the frame rate */ | /* wait based on the frame rate */ | ||||
while (1) { | while (1) { | ||||
curtime = av_gettime(); | |||||
curtime = av_gettime_relative(); | |||||
delay = fbdev->time_frame - curtime; | delay = fbdev->time_frame - curtime; | ||||
av_log(avctx, AV_LOG_TRACE, | av_log(avctx, AV_LOG_TRACE, | ||||
"time_frame:%"PRId64" curtime:%"PRId64" delay:%"PRId64"\n", | "time_frame:%"PRId64" curtime:%"PRId64" delay:%"PRId64"\n", | ||||
@@ -186,7 +186,7 @@ static int fbdev_read_packet(AVFormatContext *avctx, AVPacket *pkt) | |||||
"Error refreshing variable info: %s\n", av_err2str(AVERROR(errno))); | "Error refreshing variable info: %s\n", av_err2str(AVERROR(errno))); | ||||
} | } | ||||
pkt->pts = curtime; | |||||
pkt->pts = av_gettime(); | |||||
/* compute visible data offset */ | /* compute visible data offset */ | ||||
pin = fbdev->data + fbdev->bytes_per_pixel * fbdev->varinfo.xoffset + | pin = fbdev->data + fbdev->bytes_per_pixel * fbdev->varinfo.xoffset + | ||||
@@ -394,7 +394,7 @@ gdigrab_read_header(AVFormatContext *s1) | |||||
gdigrab->header_size = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + | gdigrab->header_size = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + | ||||
(bpp <= 8 ? (1 << bpp) : 0) * sizeof(RGBQUAD) /* palette size */; | (bpp <= 8 ? (1 << bpp) : 0) * sizeof(RGBQUAD) /* palette size */; | ||||
gdigrab->time_base = av_inv_q(gdigrab->framerate); | gdigrab->time_base = av_inv_q(gdigrab->framerate); | ||||
gdigrab->time_frame = av_gettime() / av_q2d(gdigrab->time_base); | |||||
gdigrab->time_frame = av_gettime_relative() / av_q2d(gdigrab->time_base); | |||||
gdigrab->hwnd = hwnd; | gdigrab->hwnd = hwnd; | ||||
gdigrab->source_hdc = source_hdc; | gdigrab->source_hdc = source_hdc; | ||||
@@ -551,7 +551,7 @@ static int gdigrab_read_packet(AVFormatContext *s1, AVPacket *pkt) | |||||
/* wait based on the frame rate */ | /* wait based on the frame rate */ | ||||
for (;;) { | for (;;) { | ||||
curtime = av_gettime(); | |||||
curtime = av_gettime_relative(); | |||||
delay = time_frame * av_q2d(time_base) - curtime; | delay = time_frame * av_q2d(time_base) - curtime; | ||||
if (delay <= 0) { | if (delay <= 0) { | ||||
if (delay < INT64_C(-1000000) * av_q2d(time_base)) { | if (delay < INT64_C(-1000000) * av_q2d(time_base)) { | ||||
@@ -568,7 +568,7 @@ static int gdigrab_read_packet(AVFormatContext *s1, AVPacket *pkt) | |||||
if (av_new_packet(pkt, file_size) < 0) | if (av_new_packet(pkt, file_size) < 0) | ||||
return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
pkt->pts = curtime; | |||||
pkt->pts = av_gettime(); | |||||
/* Blit screen grab */ | /* Blit screen grab */ | ||||
if (!BitBlt(dest_hdc, 0, 0, | if (!BitBlt(dest_hdc, 0, 0, | ||||
@@ -268,7 +268,7 @@ static int kmsgrab_read_packet(AVFormatContext *avctx, AVPacket *pkt) | |||||
int64_t now; | int64_t now; | ||||
int err; | int err; | ||||
now = av_gettime(); | |||||
now = av_gettime_relative(); | |||||
if (ctx->frame_last) { | if (ctx->frame_last) { | ||||
int64_t delay; | int64_t delay; | ||||
while (1) { | while (1) { | ||||
@@ -276,10 +276,11 @@ static int kmsgrab_read_packet(AVFormatContext *avctx, AVPacket *pkt) | |||||
if (delay <= 0) | if (delay <= 0) | ||||
break; | break; | ||||
av_usleep(delay); | av_usleep(delay); | ||||
now = av_gettime(); | |||||
now = av_gettime_relative(); | |||||
} | } | ||||
} | } | ||||
ctx->frame_last = now; | ctx->frame_last = now; | ||||
now = av_gettime(); | |||||
plane = drmModeGetPlane(ctx->hwctx->fd, ctx->plane_id); | plane = drmModeGetPlane(ctx->hwctx->fd, ctx->plane_id); | ||||
if (!plane) { | if (!plane) { | ||||
@@ -206,7 +206,7 @@ static int64_t wait_frame(AVFormatContext *s, AVPacket *pkt) | |||||
c->time_frame += c->frame_duration; | c->time_frame += c->frame_duration; | ||||
for (;;) { | for (;;) { | ||||
curtime = av_gettime(); | |||||
curtime = av_gettime_relative(); | |||||
delay = c->time_frame - curtime; | delay = c->time_frame - curtime; | ||||
if (delay <= 0) | if (delay <= 0) | ||||
break; | break; | ||||
@@ -422,7 +422,8 @@ static int xcbgrab_read_packet(AVFormatContext *s, AVPacket *pkt) | |||||
int ret = 0; | int ret = 0; | ||||
int64_t pts; | int64_t pts; | ||||
pts = wait_frame(s, pkt); | |||||
wait_frame(s, pkt); | |||||
pts = av_gettime(); | |||||
if (c->follow_mouse || c->draw_mouse) { | if (c->follow_mouse || c->draw_mouse) { | ||||
pc = xcb_query_pointer(c->conn, c->screen->root); | pc = xcb_query_pointer(c->conn, c->screen->root); | ||||
@@ -596,7 +597,7 @@ static int create_stream(AVFormatContext *s) | |||||
c->time_base = (AVRational){ st->avg_frame_rate.den, | c->time_base = (AVRational){ st->avg_frame_rate.den, | ||||
st->avg_frame_rate.num }; | st->avg_frame_rate.num }; | ||||
c->frame_duration = av_rescale_q(1, c->time_base, AV_TIME_BASE_Q); | c->frame_duration = av_rescale_q(1, c->time_base, AV_TIME_BASE_Q); | ||||
c->time_frame = av_gettime(); | |||||
c->time_frame = av_gettime_relative(); | |||||
ret = pixfmt_from_pixmap_format(s, geo->depth, &st->codecpar->format, &c->bpp); | ret = pixfmt_from_pixmap_format(s, geo->depth, &st->codecpar->format, &c->bpp); | ||||
free(geo); | free(geo); | ||||