From 26e0c9d54c51603d8f0d8301b1d3ba8d125d7ccd Mon Sep 17 00:00:00 2001 From: Maxim Devaev Date: Wed, 24 Nov 2021 23:50:50 +0300 Subject: [PATCH] refactoring --- src/libs/frame.h | 15 +++++++++++++++ src/ustreamer/encoder.c | 8 -------- src/ustreamer/encoders/cpu/encoder.c | 4 +++- src/ustreamer/encoders/hw/encoder.c | 5 +++++ src/ustreamer/m2m.c | 8 +++----- 5 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/libs/frame.h b/src/libs/frame.h index b041bb2..a824ea0 100644 --- a/src/libs/frame.h +++ b/src/libs/frame.h @@ -84,6 +84,21 @@ static inline void frame_copy_meta(const frame_s *src, frame_s *dest) { ) +static inline void frame_encoding_begin(const frame_s *src, frame_s *dest, unsigned format) { + assert(src->used > 0); + frame_copy_meta(src, dest); + dest->encode_begin_ts = get_now_monotonic(); + dest->format = format; + dest->stride = 0; + dest->used = 0; +} + +static inline void frame_encoding_end(frame_s *dest) { + assert(dest->used > 0); + dest->encode_end_ts = get_now_monotonic(); +} + + frame_s *frame_init(void); void frame_destroy(frame_s *frame); diff --git a/src/ustreamer/encoder.c b/src/ustreamer/encoder.c index 5802a65..94558a6 100644 --- a/src/ustreamer/encoder.c +++ b/src/ustreamer/encoder.c @@ -204,13 +204,6 @@ static bool _worker_run_job(worker_s *wr) { LOG_DEBUG("Worker %s compressing JPEG from buffer index=%u ...", wr->name, job->hw->buf.index); assert(ER(type) != ENCODER_TYPE_UNKNOWN); - assert(src->used > 0); - - frame_copy_meta(src, dest); - dest->format = V4L2_PIX_FMT_JPEG; - dest->stride = 0; - dest->encode_begin_ts = get_now_monotonic(); - dest->used = 0; if (ER(type) == ENCODER_TYPE_CPU) { LOG_VERBOSE("Compressing buffer using CPU"); @@ -234,7 +227,6 @@ static bool _worker_run_job(worker_s *wr) { usleep(5000); // Просто чтобы работала логика desired_fps } - dest->encode_end_ts = get_now_monotonic(); LOG_VERBOSE("Compressed new JPEG: size=%zu, time=%0.3Lf, worker=%s, buffer=%u", job->dest->used, job->dest->encode_end_ts - job->dest->encode_begin_ts, diff --git a/src/ustreamer/encoders/cpu/encoder.c b/src/ustreamer/encoders/cpu/encoder.c index eec522c..8b1f35c 100644 --- a/src/ustreamer/encoders/cpu/encoder.c +++ b/src/ustreamer/encoders/cpu/encoder.c @@ -50,6 +50,8 @@ static void _jpeg_term_destination(j_compress_ptr jpeg); void cpu_encoder_compress(const frame_s *src, frame_s *dest, unsigned quality) { // This function based on compress_image_to_jpeg() from mjpg-streamer + frame_encoding_begin(src, dest, V4L2_PIX_FMT_JPEG); + struct jpeg_compress_struct jpeg; struct jpeg_error_mgr jpeg_error; @@ -85,7 +87,7 @@ void cpu_encoder_compress(const frame_s *src, frame_s *dest, unsigned quality) { jpeg_finish_compress(&jpeg); jpeg_destroy_compress(&jpeg); - assert(dest->used > 0); + frame_encoding_end(dest); } static void _jpeg_set_dest_frame(j_compress_ptr jpeg, frame_s *frame) { diff --git a/src/ustreamer/encoders/hw/encoder.c b/src/ustreamer/encoders/hw/encoder.c index 8eb7f45..5ec385c 100644 --- a/src/ustreamer/encoders/hw/encoder.c +++ b/src/ustreamer/encoders/hw/encoder.c @@ -38,6 +38,8 @@ void hw_encoder_compress(const frame_s *src, frame_s *dest) { } void _copy_plus_huffman(const frame_s *src, frame_s *dest) { + frame_encoding_begin(src, dest, V4L2_PIX_FMT_JPEG); + if (!_is_huffman(src->data)) { const uint8_t *src_ptr = src->data; const uint8_t *src_end = src->data + src->used; @@ -55,9 +57,12 @@ void _copy_plus_huffman(const frame_s *src, frame_s *dest) { frame_set_data(dest, src->data, paste); frame_append_data(dest, HUFFMAN_TABLE, sizeof(HUFFMAN_TABLE)); frame_append_data(dest, src_ptr, src->used - paste); + } else { frame_set_data(dest, src->data, src->used); } + + frame_encoding_end(dest); } static bool _is_huffman(const uint8_t *data) { diff --git a/src/ustreamer/m2m.c b/src/ustreamer/m2m.c index d952910..11c6dda 100644 --- a/src/ustreamer/m2m.c +++ b/src/ustreamer/m2m.c @@ -321,10 +321,7 @@ int m2m_encoder_compress(m2m_encoder_s *enc, const frame_s *src, frame_s *dest, assert(enc->stride == src->stride); assert(enc->dma == (src->dma_fd >= 0)); - frame_copy_meta(src, dest); - dest->encode_begin_ts = get_now_monotonic(); - dest->format = (enc->output_format == V4L2_PIX_FMT_MJPEG ? V4L2_PIX_FMT_JPEG : enc->output_format); - dest->stride = 0; + frame_encoding_begin(src, dest, (enc->output_format == V4L2_PIX_FMT_MJPEG ? V4L2_PIX_FMT_JPEG : enc->output_format)); force_key = (force_key || enc->last_online != src->online); @@ -334,7 +331,8 @@ int m2m_encoder_compress(m2m_encoder_s *enc, const frame_s *src, frame_s *dest, return -1; } - dest->encode_end_ts = get_now_monotonic(); + frame_encoding_end(dest); + E_LOG_VERBOSE("Compressed new frame: size=%zu, time=%0.3Lf, force_key=%d", dest->used, dest->encode_end_ts - dest->encode_begin_ts, force_key);