mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-02-18 02:55:46 +00:00
grab_begin_ts and grab_end_ts
This commit is contained in:
parent
6adbb93e57
commit
9eb39bbfc3
@ -241,7 +241,8 @@ static PyObject *_MemsinkObject_wait_frame(_MemsinkObject *self, PyObject *args,
|
|||||||
SET_NUMBER(online, Long, Bool);
|
SET_NUMBER(online, Long, Bool);
|
||||||
SET_NUMBER(key, Long, Bool);
|
SET_NUMBER(key, Long, Bool);
|
||||||
SET_NUMBER(gop, Long, Long);
|
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_begin_ts, Double, Float);
|
||||||
SET_NUMBER(encode_end_ts, Double, Float);
|
SET_NUMBER(encode_end_ts, Double, Float);
|
||||||
SET_VALUE("data", PyBytes_FromStringAndSize((const char*)self->frame->data, self->frame->used));
|
SET_VALUE("data", PyBytes_FromStringAndSize((const char*)self->frame->data, self->frame->used));
|
||||||
|
|||||||
@ -53,11 +53,13 @@ void us_output_file_write(void *v_output, const us_frame_s *frame) {
|
|||||||
fprintf(output->fp,
|
fprintf(output->fp,
|
||||||
"{\"size\": %zu, \"width\": %u, \"height\": %u,"
|
"{\"size\": %zu, \"width\": %u, \"height\": %u,"
|
||||||
" \"format\": %u, \"stride\": %u, \"online\": %u, \"key\": %u, \"gop\": %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",
|
" \"data\": \"%s\"}\n",
|
||||||
frame->used, frame->width, frame->height,
|
frame->used, frame->width, frame->height,
|
||||||
frame->format, frame->stride, frame->online, frame->key, frame->gop,
|
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);
|
output->base64_data);
|
||||||
} else {
|
} else {
|
||||||
fwrite(frame->data, 1, frame->used, output->fp);
|
fwrite(frame->data, 1, frame->used, output->fp);
|
||||||
|
|||||||
@ -240,16 +240,22 @@ static int _dump_sink(
|
|||||||
const long double now = us_get_now_monotonic();
|
const long double now = us_get_now_monotonic();
|
||||||
|
|
||||||
char fourcc_str[8];
|
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),
|
us_fourcc_to_string(frame->format, fourcc_str, 8),
|
||||||
frame->width, frame->height,
|
frame->width,
|
||||||
frame->online, frame->key, key_requested, frame->gop,
|
frame->height,
|
||||||
now - frame->grab_ts, (last_ts ? now - last_ts : 0),
|
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);
|
frame->used);
|
||||||
last_ts = now;
|
|
||||||
|
|
||||||
US_LOG_DEBUG(" stride=%u, grab_ts=%.3Lf, encode_begin_ts=%.3Lf, encode_end_ts=%.3Lf",
|
last_ts = now;
|
||||||
frame->stride, frame->grab_ts, frame->encode_begin_ts, frame->encode_end_ts);
|
|
||||||
|
|
||||||
us_fpsi_update(fpsi, true, NULL);
|
us_fpsi_update(fpsi, true, NULL);
|
||||||
|
|
||||||
|
|||||||
@ -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.stride = run->stride;
|
||||||
(*hw)->raw.online = true;
|
(*hw)->raw.online = true;
|
||||||
_v4l2_buffer_copy(&buf, &(*hw)->buf);
|
_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;
|
return buf.index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -38,7 +38,8 @@
|
|||||||
bool key; \
|
bool key; \
|
||||||
uint gop; \
|
uint gop; \
|
||||||
\
|
\
|
||||||
ldf grab_ts; \
|
ldf grab_begin_ts; \
|
||||||
|
ldf grab_end_ts; \
|
||||||
ldf encode_begin_ts; \
|
ldf encode_begin_ts; \
|
||||||
ldf encode_end_ts;
|
ldf encode_end_ts;
|
||||||
|
|
||||||
@ -62,7 +63,8 @@ typedef struct {
|
|||||||
(x_dest)->key = (x_src)->key; \
|
(x_dest)->key = (x_src)->key; \
|
||||||
(x_dest)->gop = (x_src)->gop; \
|
(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_begin_ts = (x_src)->encode_begin_ts; \
|
||||||
(x_dest)->encode_end_ts = (x_src)->encode_end_ts; \
|
(x_dest)->encode_end_ts = (x_src)->encode_end_ts; \
|
||||||
}
|
}
|
||||||
|
|||||||
@ -722,7 +722,8 @@ static void _http_callback_stream_write(struct bufferevent *buf_event, void *v_c
|
|||||||
"X-UStreamer-Width: %u" RN
|
"X-UStreamer-Width: %u" RN
|
||||||
"X-UStreamer-Height: %u" RN
|
"X-UStreamer-Height: %u" RN
|
||||||
"X-UStreamer-Client-FPS: %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-Begin-Time: %.06Lf" RN
|
||||||
"X-UStreamer-Encode-End-Time: %.06Lf" RN
|
"X-UStreamer-Encode-End-Time: %.06Lf" RN
|
||||||
"X-UStreamer-Expose-Begin-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->width,
|
||||||
ex->frame->height,
|
ex->frame->height,
|
||||||
us_fpsi_get(client->fpsi, NULL),
|
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_begin_ts,
|
||||||
ex->frame->encode_end_ts,
|
ex->frame->encode_end_ts,
|
||||||
ex->expose_begin_ts,
|
ex->expose_begin_ts,
|
||||||
ex->expose_cmp_ts,
|
ex->expose_cmp_ts,
|
||||||
ex->expose_end_ts,
|
ex->expose_end_ts,
|
||||||
now_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));
|
_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-Width", frame->width);
|
||||||
ADD_UNSIGNED_HEADER("X-UStreamer-Height", frame->height);
|
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-Begin-Timestamp", frame->encode_begin_ts);
|
||||||
ADD_TIME_HEADER("X-UStreamer-Encode-End-Timestamp", frame->encode_end_ts);
|
ADD_TIME_HEADER("X-UStreamer-Encode-End-Timestamp", frame->encode_end_ts);
|
||||||
ADD_TIME_HEADER("X-UStreamer-Send-Timestamp", us_get_now_monotonic());
|
ADD_TIME_HEADER("X-UStreamer-Send-Timestamp", us_get_now_monotonic());
|
||||||
|
|||||||
@ -332,7 +332,7 @@ static void *_jpeg_thread(void *v_ctx) {
|
|||||||
atomic_fetch_sub(&stream->run->http->snapshot_requested, 1);
|
atomic_fetch_sub(&stream->run->http->snapshot_requested, 1);
|
||||||
}
|
}
|
||||||
US_LOG_PERF("JPEG: ##### Encoded JPEG exposed; worker=%s, latency=%.3Lf",
|
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 {
|
} else {
|
||||||
US_LOG_PERF("JPEG: ----- Encoded JPEG dropped; worker=%s", wr->name);
|
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");
|
US_LOG_VERBOSE("H264: Passed encoding because nobody is watching");
|
||||||
goto decref;
|
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");
|
US_LOG_DEBUG("H264: Passed encoding for FPS limit");
|
||||||
goto decref;
|
goto decref;
|
||||||
}
|
}
|
||||||
@ -421,7 +421,7 @@ static void *_h264_thread(void *v_ctx) {
|
|||||||
const uint fps_limit = stream->run->h264_enc->run->fps_limit;
|
const uint fps_limit = stream->run->h264_enc->run->fps_limit;
|
||||||
if (fps_limit > 0) {
|
if (fps_limit > 0) {
|
||||||
const ldf frame_interval = (ldf)1 / fps_limit;
|
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:
|
decref:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user