diff --git a/python/src/ustreamer.c b/python/src/ustreamer.c index c4bb8ed..34bfa9e 100644 --- a/python/src/ustreamer.c +++ b/python/src/ustreamer.c @@ -241,7 +241,8 @@ static PyObject *_MemsinkObject_wait_frame(_MemsinkObject *self, PyObject *args, SET_NUMBER(online, Long, Bool); SET_NUMBER(key, Long, Bool); SET_NUMBER(gop, Long, Long); - SET_NUMBER(grab_ts, Double, Float); + SET_NUMBER(grab_begin_ts, Double, Float); + SET_NUMBER(grab_end_ts, Double, Float); SET_NUMBER(encode_begin_ts, Double, Float); SET_NUMBER(encode_end_ts, Double, Float); SET_VALUE("data", PyBytes_FromStringAndSize((const char*)self->frame->data, self->frame->used)); diff --git a/src/dump/file.c b/src/dump/file.c index f106843..0700069 100644 --- a/src/dump/file.c +++ b/src/dump/file.c @@ -53,11 +53,13 @@ void us_output_file_write(void *v_output, const us_frame_s *frame) { fprintf(output->fp, "{\"size\": %zu, \"width\": %u, \"height\": %u," " \"format\": %u, \"stride\": %u, \"online\": %u, \"key\": %u, \"gop\": %u," - " \"grab_ts\": %.3Lf, \"encode_begin_ts\": %.3Lf, \"encode_end_ts\": %.3Lf," + " \"grab_begin_ts\": %.3Lf, \"grab_end_ts\": %.3Lf," + " \"encode_begin_ts\": %.3Lf, \"encode_end_ts\": %.3Lf," " \"data\": \"%s\"}\n", frame->used, frame->width, frame->height, frame->format, frame->stride, frame->online, frame->key, frame->gop, - frame->grab_ts, frame->encode_begin_ts, frame->encode_end_ts, + frame->grab_begin_ts, frame->grab_end_ts, + frame->encode_begin_ts, frame->encode_end_ts, output->base64_data); } else { fwrite(frame->data, 1, frame->used, output->fp); diff --git a/src/dump/main.c b/src/dump/main.c index f29e01f..b31b6a6 100644 --- a/src/dump/main.c +++ b/src/dump/main.c @@ -240,16 +240,22 @@ static int _dump_sink( const long double now = us_get_now_monotonic(); char fourcc_str[8]; - US_LOG_VERBOSE("Frame: %s - %ux%u -- online=%d, key=%d, kr=%d, gop=%u, latency=%.3Lf, backlog=%.3Lf, size=%zu", + US_LOG_VERBOSE("%s %.3Lf - %s %ux%u - gop=%u, key=%u, kr=%u - GRAB=%.3Lf ~~%.3Lf~~ ENC=%.3Lf ~~> LAT=%.3Lf - size=%zu", + (frame->online ? " ON" : "OFF"), + (last_ts ? now - last_ts : 0), us_fourcc_to_string(frame->format, fourcc_str, 8), - frame->width, frame->height, - frame->online, frame->key, key_requested, frame->gop, - now - frame->grab_ts, (last_ts ? now - last_ts : 0), + frame->width, + frame->height, + frame->gop, + frame->key, + key_requested, + frame->grab_end_ts - frame->grab_begin_ts, + frame->encode_begin_ts - frame->grab_end_ts, + frame->encode_end_ts - frame->encode_begin_ts, + now - frame->grab_begin_ts, frame->used); - last_ts = now; - US_LOG_DEBUG(" stride=%u, grab_ts=%.3Lf, encode_begin_ts=%.3Lf, encode_end_ts=%.3Lf", - frame->stride, frame->grab_ts, frame->encode_begin_ts, frame->encode_end_ts); + last_ts = now; us_fpsi_update(fpsi, true, NULL); diff --git a/src/libs/capture.c b/src/libs/capture.c index d60082b..4a7566c 100644 --- a/src/libs/capture.c +++ b/src/libs/capture.c @@ -447,10 +447,16 @@ int us_capture_hwbuf_grab(us_capture_s *cap, us_capture_hwbuf_s **hw) { (*hw)->raw.stride = run->stride; (*hw)->raw.online = true; _v4l2_buffer_copy(&buf, &(*hw)->buf); - (*hw)->raw.grab_ts = (ldf)((buf.timestamp.tv_sec * (u64)1000) + (buf.timestamp.tv_usec / 1000)) / 1000; + (*hw)->raw.grab_begin_ts = (ldf)((buf.timestamp.tv_sec * (u64)1000) + (buf.timestamp.tv_usec / 1000)) / 1000; + (*hw)->raw.grab_end_ts = us_get_now_monotonic(); + + _LOG_DEBUG("Grabbed HW buffer=%u: bytesused=%u, grab_begin_ts=%.3Lf, grab_end_ts=%.3Lf, latency=%.3Lf, skipped=%u", + buf.index, buf.bytesused, + (*hw)->raw.grab_begin_ts, + (*hw)->raw.grab_end_ts, + (*hw)->raw.grab_end_ts - (*hw)->raw.grab_begin_ts, + skipped); - _LOG_DEBUG("Grabbed HW buffer=%u: bytesused=%u, grab_ts=%.3Lf, latency=%.3Lf, skipped=%u", - buf.index, buf.bytesused, (*hw)->raw.grab_ts, us_get_now_monotonic() - (*hw)->raw.grab_ts, skipped); return buf.index; } diff --git a/src/libs/frame.h b/src/libs/frame.h index 09a2314..d39f0f9 100644 --- a/src/libs/frame.h +++ b/src/libs/frame.h @@ -38,7 +38,8 @@ bool key; \ uint gop; \ \ - ldf grab_ts; \ + ldf grab_begin_ts; \ + ldf grab_end_ts; \ ldf encode_begin_ts; \ ldf encode_end_ts; @@ -62,7 +63,8 @@ typedef struct { (x_dest)->key = (x_src)->key; \ (x_dest)->gop = (x_src)->gop; \ \ - (x_dest)->grab_ts = (x_src)->grab_ts; \ + (x_dest)->grab_begin_ts = (x_src)->grab_begin_ts; \ + (x_dest)->grab_end_ts = (x_src)->grab_end_ts; \ (x_dest)->encode_begin_ts = (x_src)->encode_begin_ts; \ (x_dest)->encode_end_ts = (x_src)->encode_end_ts; \ } diff --git a/src/ustreamer/http/server.c b/src/ustreamer/http/server.c index 12b1fa6..b9fdddd 100644 --- a/src/ustreamer/http/server.c +++ b/src/ustreamer/http/server.c @@ -722,7 +722,8 @@ static void _http_callback_stream_write(struct bufferevent *buf_event, void *v_c "X-UStreamer-Width: %u" RN "X-UStreamer-Height: %u" RN "X-UStreamer-Client-FPS: %u" RN - "X-UStreamer-Grab-Time: %.06Lf" RN + "X-UStreamer-Grab-Begin-Time: %.06Lf" RN + "X-UStreamer-Grab-End-Time: %.06Lf" RN "X-UStreamer-Encode-Begin-Time: %.06Lf" RN "X-UStreamer-Encode-End-Time: %.06Lf" RN "X-UStreamer-Expose-Begin-Time: %.06Lf" RN @@ -736,14 +737,15 @@ static void _http_callback_stream_write(struct bufferevent *buf_event, void *v_c ex->frame->width, ex->frame->height, us_fpsi_get(client->fpsi, NULL), - ex->frame->grab_ts, + ex->frame->grab_begin_ts, + ex->frame->grab_end_ts, ex->frame->encode_begin_ts, ex->frame->encode_end_ts, ex->expose_begin_ts, ex->expose_cmp_ts, ex->expose_end_ts, now_ts, - now_ts - ex->frame->grab_ts + now_ts - ex->frame->grab_begin_ts ); } } @@ -892,7 +894,8 @@ static void _http_send_snapshot(us_server_s *server) { _A_ADD_HEADER(request, "X-UStreamer-Online", us_bool_to_string(frame->online)); ADD_UNSIGNED_HEADER("X-UStreamer-Width", frame->width); ADD_UNSIGNED_HEADER("X-UStreamer-Height", frame->height); - ADD_TIME_HEADER("X-UStreamer-Grab-Timestamp", frame->grab_ts); + ADD_TIME_HEADER("X-UStreamer-Grab-Begin-Timestamp", frame->grab_begin_ts); + ADD_TIME_HEADER("X-UStreamer-Grab-End-Timestamp", frame->grab_end_ts); ADD_TIME_HEADER("X-UStreamer-Encode-Begin-Timestamp", frame->encode_begin_ts); ADD_TIME_HEADER("X-UStreamer-Encode-End-Timestamp", frame->encode_end_ts); ADD_TIME_HEADER("X-UStreamer-Send-Timestamp", us_get_now_monotonic()); diff --git a/src/ustreamer/stream.c b/src/ustreamer/stream.c index 4414b3a..a220383 100644 --- a/src/ustreamer/stream.c +++ b/src/ustreamer/stream.c @@ -332,7 +332,7 @@ static void *_jpeg_thread(void *v_ctx) { atomic_fetch_sub(&stream->run->http->snapshot_requested, 1); } US_LOG_PERF("JPEG: ##### Encoded JPEG exposed; worker=%s, latency=%.3Lf", - wr->name, us_get_now_monotonic() - job->dest->grab_ts); + wr->name, us_get_now_monotonic() - job->dest->grab_begin_ts); } else { US_LOG_PERF("JPEG: ----- Encoded JPEG dropped; worker=%s", wr->name); } @@ -407,7 +407,7 @@ static void *_h264_thread(void *v_ctx) { US_LOG_VERBOSE("H264: Passed encoding because nobody is watching"); goto decref; } - if (hw->raw.grab_ts < grab_after_ts) { + if (hw->raw.grab_begin_ts < grab_after_ts) { US_LOG_DEBUG("H264: Passed encoding for FPS limit"); goto decref; } @@ -421,7 +421,7 @@ static void *_h264_thread(void *v_ctx) { const uint fps_limit = stream->run->h264_enc->run->fps_limit; if (fps_limit > 0) { const ldf frame_interval = (ldf)1 / fps_limit; - grab_after_ts = hw->raw.grab_ts + frame_interval - 0.01; + grab_after_ts = hw->raw.grab_begin_ts + frame_interval - 0.01; } decref: