From a165ff4523fb54a4ff55c1131f04fa7a9faa2c8d Mon Sep 17 00:00:00 2001 From: Devaev Maxim Date: Wed, 3 Feb 2021 05:39:18 +0300 Subject: [PATCH] expose keyframe flag --- python/ustreamer.c | 4 ++++ src/dump/main.c | 9 ++++++--- src/libs/frame.c | 2 ++ src/libs/frame.h | 1 + src/libs/memsink.c | 4 +++- src/libs/memsinksh.h | 3 ++- src/ustreamer/h264/encoder.c | 1 + 7 files changed, 19 insertions(+), 5 deletions(-) diff --git a/python/ustreamer.c b/python/ustreamer.c index c386b69..e9edbbb 100644 --- a/python/ustreamer.c +++ b/python/ustreamer.c @@ -31,6 +31,7 @@ typedef struct { unsigned stride; bool online; + bool key; long double grab_ts; long double encode_begin_ts; @@ -195,6 +196,7 @@ static int wait_frame(MemsinkObject *self) { && CMP(format) && CMP(stride) && CMP(online) + && CMP(key) && (TMP(ts) + self->drop_same_frames > now) && !memcmp(TMP(data), MEM(data), MEM(used)) ) { @@ -249,6 +251,7 @@ static PyObject *MemsinkObject_wait_frame(MemsinkObject *self, PyObject *Py_UNUS COPY(format); COPY(stride); COPY(online); + COPY(key); COPY(grab_ts); COPY(encode_begin_ts); COPY(encode_end_ts); @@ -291,6 +294,7 @@ static PyObject *MemsinkObject_wait_frame(MemsinkObject *self, PyObject *Py_UNUS SET_NUMBER(format, Long, Long); SET_NUMBER(stride, Long, Long); SET_NUMBER(online, Long, Bool); + SET_NUMBER(key, Long, Bool); SET_NUMBER(grab_ts, Double, Float); SET_NUMBER(encode_begin_ts, Double, Float); SET_NUMBER(encode_end_ts, Double, Float); diff --git a/src/dump/main.c b/src/dump/main.c index b5c7e91..949f701 100644 --- a/src/dump/main.c +++ b/src/dump/main.c @@ -213,6 +213,8 @@ static int _dump_sink(const char *sink_name, unsigned sink_timeout, _output_cont unsigned fps_accum = 0; long long fps_second = 0; + long double last = 0; + while (!global_stop) { int error = memsink_client_get(sink, frame); if (error == 0) { @@ -220,11 +222,12 @@ static int _dump_sink(const char *sink_name, unsigned sink_timeout, _output_cont const long long now_second = floor_ms(now); char fourcc_str[8]; - LOG_VERBOSE("Frame: size=%zu, resolution=%ux%u, fourcc=%s, stride=%u, online=%d, latency=%.3Lf", + LOG_VERBOSE("Frame: size=%zu, res=%ux%u, fourcc=%s, stride=%u, online=%d, key=%d, latency=%.3Lf, diff=%.3Lf", frame->used, frame->width, frame->height, fourcc_to_string(frame->format, fourcc_str, 8), - frame->stride, frame->online, - now - frame->grab_ts); + frame->stride, frame->online, frame->key, + now - frame->grab_ts, (last ? now - last : 0)); + last = now; LOG_DEBUG(" grab_ts=%.3Lf, encode_begin_ts=%.3Lf, encode_end_ts=%.3Lf", frame->grab_ts, frame->encode_begin_ts, frame->encode_end_ts); diff --git a/src/libs/frame.c b/src/libs/frame.c index a86ffeb..32c3f97 100644 --- a/src/libs/frame.c +++ b/src/libs/frame.c @@ -81,6 +81,7 @@ void frame_copy_meta(const frame_s *src, frame_s *dest) { COPY(format); COPY(stride); COPY(online); + COPY(key); COPY(grab_ts); COPY(encode_begin_ts); COPY(encode_end_ts); @@ -98,6 +99,7 @@ bool frame_compare(const frame_s *a, const frame_s *b) { && CMP(format) && CMP(stride) && CMP(online) + && CMP(key) && !memcmp(a->data, b->data, b->used) ); # undef CMP diff --git a/src/libs/frame.h b/src/libs/frame.h index 0872a74..2064546 100644 --- a/src/libs/frame.h +++ b/src/libs/frame.h @@ -51,6 +51,7 @@ typedef struct { // https://medium.com/@oleg.shipitko/what-does-stride-mean-in-image-processing-bba158a72bcd bool online; + bool key; long double grab_ts; long double encode_begin_ts; diff --git a/src/libs/memsink.c b/src/libs/memsink.c index 95968a8..bfea9b3 100644 --- a/src/libs/memsink.c +++ b/src/libs/memsink.c @@ -109,7 +109,7 @@ bool memsink_server_check(memsink_s *sink, const frame_s *frame) { sink->has_clients = (sink->mem->last_client_ts + sink->client_ttl > get_now_monotonic()); # define NEQ(_field) (sink->mem->_field != frame->_field) - bool retval = (sink->has_clients || NEQ(width) || NEQ(height) || NEQ(format) || NEQ(stride) || NEQ(online)); + bool retval = (sink->has_clients || NEQ(width) || NEQ(height) || NEQ(format) || NEQ(stride) || NEQ(online) || NEQ(key)); # undef NEQ if (flock(sink->fd, LOCK_UN) < 0) { @@ -142,6 +142,7 @@ int memsink_server_put(memsink_s *sink, const frame_s *frame) { COPY(format); COPY(stride); COPY(online); + COPY(key); COPY(grab_ts); COPY(encode_begin_ts); COPY(encode_end_ts); @@ -195,6 +196,7 @@ int memsink_client_get(memsink_s *sink, frame_s *frame) { // cppcheck-suppress u COPY(format); COPY(stride); COPY(online); + COPY(key); COPY(grab_ts); COPY(encode_begin_ts); COPY(encode_end_ts); diff --git a/src/libs/memsinksh.h b/src/libs/memsinksh.h index 0cafc8f..4465698 100644 --- a/src/libs/memsinksh.h +++ b/src/libs/memsinksh.h @@ -29,7 +29,7 @@ #define MEMSINK_MAGIC ((uint64_t)0xCAFEBABECAFEBABE) -#define MEMSINK_VERSION ((uint32_t)1) +#define MEMSINK_VERSION ((uint32_t)2) #ifndef CFG_MEMSINK_MAX_DATA # define CFG_MEMSINK_MAX_DATA 33554432 @@ -49,6 +49,7 @@ typedef struct { unsigned format; unsigned stride; bool online; + bool key; long double grab_ts; long double encode_begin_ts; diff --git a/src/ustreamer/h264/encoder.c b/src/ustreamer/h264/encoder.c index 11a9ae2..cd476d0 100644 --- a/src/ustreamer/h264/encoder.c +++ b/src/ustreamer/h264/encoder.c @@ -347,6 +347,7 @@ static int _h264_encoder_compress_raw(h264_encoder_s *enc, const frame_s *src, i } frame_append_data(dest, out->data, out->length); + dest->key = out->flags & MMAL_BUFFER_HEADER_FLAG_KEYFRAME; eos = out->flags & MMAL_BUFFER_HEADER_FLAG_EOS; mmal_buffer_header_release(out);