From 0b776ba19a0b0703f87e5529b2e4f82af6b50435 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 13 Mar 2019 21:36:40 +0100 Subject: [PATCH] Fix an unneeded copy when muxing MJPEGs. Saves ~10% of one core at five 1080p50 sources. --- nageru/mjpeg_encoder.cpp | 14 ++++++-------- nageru/mjpeg_encoder.h | 2 +- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/nageru/mjpeg_encoder.cpp b/nageru/mjpeg_encoder.cpp index 3f98cd0..07e302c 100644 --- a/nageru/mjpeg_encoder.cpp +++ b/nageru/mjpeg_encoder.cpp @@ -318,7 +318,7 @@ void MJPEGEncoder::encoder_thread_func() } else { // Encode synchronously, in the same thread. vector jpeg = encode_jpeg_libjpeg(qf); - write_mjpeg_packet(qf.pts, qf.card_index, jpeg); + write_mjpeg_packet(qf.pts, qf.card_index, jpeg.data(), jpeg.size()); } } @@ -328,13 +328,13 @@ void MJPEGEncoder::encoder_thread_func() free(tmp_cr); } -void MJPEGEncoder::write_mjpeg_packet(int64_t pts, unsigned card_index, const vector &jpeg) +void MJPEGEncoder::write_mjpeg_packet(int64_t pts, unsigned card_index, const uint8_t *jpeg, size_t jpeg_size) { AVPacket pkt; memset(&pkt, 0, sizeof(pkt)); pkt.buf = nullptr; - pkt.data = const_cast(&jpeg[0]); - pkt.size = jpeg.size(); + pkt.data = const_cast(jpeg); + pkt.size = jpeg_size; pkt.stream_index = card_index; pkt.flags = AV_PKT_FLAG_KEY; AVRational time_base = avctx->streams[pkt.stream_index]->time_base; @@ -708,13 +708,11 @@ void MJPEGEncoder::va_receiver_thread_func() va_status = vaMapBuffer(va_dpy->va_dpy, qf.resources.data_buffer, (void **)&segment); CHECK_VASTATUS(va_status, "vaMapBuffer"); - const char *coded_buf = reinterpret_cast(segment->buf); - vector jpeg(coded_buf, coded_buf + segment->size); + const uint8_t *coded_buf = reinterpret_cast(segment->buf); + write_mjpeg_packet(qf.pts, qf.card_index, coded_buf, segment->size); va_status = vaUnmapBuffer(va_dpy->va_dpy, qf.resources.data_buffer); CHECK_VASTATUS(va_status, "vaUnmapBuffer"); - - write_mjpeg_packet(qf.pts, qf.card_index, jpeg); } } diff --git a/nageru/mjpeg_encoder.h b/nageru/mjpeg_encoder.h index 6610e13..8b68294 100644 --- a/nageru/mjpeg_encoder.h +++ b/nageru/mjpeg_encoder.h @@ -103,7 +103,7 @@ private: void va_receiver_thread_func(); void encode_jpeg_va(QueuedFrame &&qf); std::vector encode_jpeg_libjpeg(const QueuedFrame &qf); - void write_mjpeg_packet(int64_t pts, unsigned card_index, const std::vector &jpeg); + void write_mjpeg_packet(int64_t pts, unsigned card_index, const uint8_t *jpeg, size_t jpeg_size); void init_jpeg_422(unsigned width, unsigned height, VectorDestinationManager *dest, jpeg_compress_struct *cinfo); std::vector get_jpeg_header(unsigned width, unsigned height, jpeg_compress_struct *cinfo); -- 2.39.2