From 7d4ae57fbd1fd0ba8148733b6b0150d77b5b3709 Mon Sep 17 00:00:00 2001 From: Devaev Maxim Date: Thu, 21 Mar 2019 17:54:43 +0300 Subject: [PATCH] refactoring --- src/device.c | 8 +++---- src/device.h | 2 +- src/encoders/cpu/encoder.c | 49 +++++++++++++++++++++----------------- src/encoders/omx/encoder.c | 7 +++--- src/stream.c | 2 +- 5 files changed, 36 insertions(+), 32 deletions(-) diff --git a/src/device.c b/src/device.c index a1322c2..bece5de 100644 --- a/src/device.c +++ b/src/device.c @@ -497,11 +497,11 @@ static void _device_open_alloc_picbufs(struct device_t *dev) { LOG_DEBUG("Allocating picture buffers ..."); A_CALLOC(dev->run->pictures, dev->run->n_buffers); - dev->run->max_picture_size = ((dev->run->width * dev->run->height) << 1) * 2; + dev->run->max_raw_image_size = ((dev->run->width * dev->run->height) << 1) * 2; for (unsigned index = 0; index < dev->run->n_buffers; ++index) { - LOG_DEBUG("Allocating picture buffer %u sized %zu bytes... ", index, dev->run->max_picture_size); - A_CALLOC(dev->run->pictures[index].data, dev->run->max_picture_size); - dev->run->pictures[index].allocated = dev->run->max_picture_size; + LOG_DEBUG("Allocating picture buffer %u sized %zu bytes... ", index, dev->run->max_raw_image_size); + A_CALLOC(dev->run->pictures[index].data, dev->run->max_raw_image_size); + dev->run->pictures[index].allocated = dev->run->max_raw_image_size; } } diff --git a/src/device.h b/src/device.h index e495e03..6a7fcdb 100644 --- a/src/device.h +++ b/src/device.h @@ -66,7 +66,7 @@ struct device_runtime_t { // unsigned n_workers; // FIXME struct hw_buffer_t *hw_buffers; struct picture_t *pictures; - size_t max_picture_size; + size_t max_raw_image_size; bool capturing; }; diff --git a/src/encoders/cpu/encoder.c b/src/encoders/cpu/encoder.c index d29938d..615cd06 100644 --- a/src/encoders/cpu/encoder.c +++ b/src/encoders/cpu/encoder.c @@ -40,14 +40,14 @@ struct _jpeg_dest_manager_t { - struct jpeg_destination_mgr mgr; // Default manager - JOCTET *buffer; // Start of buffer - unsigned char *outbuffer_cursor; - size_t *written; + struct jpeg_destination_mgr mgr; // Default manager + JOCTET *buffer; // Start of buffer + struct picture_t *picture; + unsigned char *picture_data_cursor; }; -static void _jpeg_set_dest_picture(j_compress_ptr jpeg, unsigned char *picture, size_t *written); +static void _jpeg_set_picture(j_compress_ptr jpeg, struct picture_t *picture); static void _jpeg_write_scanlines_yuyv( struct jpeg_compress_struct *jpeg, const unsigned char *data, @@ -79,10 +79,7 @@ void cpu_encoder_compress_buffer(struct device_t *dev, unsigned index, unsigned jpeg.err = jpeg_std_error(&jpeg_error); jpeg_create_compress(&jpeg); -# define PICTURE(_next) dev->run->pictures[index]._next - - PICTURE(used) = 0; - _jpeg_set_dest_picture(&jpeg, PICTURE(data), &PICTURE(used)); + _jpeg_set_picture(&jpeg, &dev->run->pictures[index]); jpeg.image_width = dev->run->width; jpeg.image_height = dev->run->height; @@ -112,11 +109,11 @@ void cpu_encoder_compress_buffer(struct device_t *dev, unsigned index, unsigned // https://stackoverflow.com/questions/19857766/error-handling-in-libjpeg jpeg_finish_compress(&jpeg); jpeg_destroy_compress(&jpeg); - assert(PICTURE(used) > 0); - assert(PICTURE(used) <= dev->run->max_picture_size); + + assert(dev->run->pictures[index].used > 0); } -static void _jpeg_set_dest_picture(j_compress_ptr jpeg, unsigned char *picture, size_t *written) { +static void _jpeg_set_picture(j_compress_ptr jpeg, struct picture_t *picture) { struct _jpeg_dest_manager_t *dest; if (jpeg->dest == NULL) { @@ -129,8 +126,10 @@ static void _jpeg_set_dest_picture(j_compress_ptr jpeg, unsigned char *picture, dest->mgr.init_destination = _jpeg_init_destination; dest->mgr.empty_output_buffer = _jpeg_empty_output_buffer; dest->mgr.term_destination = _jpeg_term_destination; - dest->outbuffer_cursor = picture; - dest->written = written; + dest->picture = picture; + dest->picture_data_cursor = picture->data; + + picture->used = 0; } #define YUV_R(_y, _, _v) (((_y) + (359 * (_v))) >> 8) @@ -262,7 +261,7 @@ static void _jpeg_write_scanlines_rgb24( } } -#define JPEG_OUTPUT_BUFFER_SIZE 4096 +#define JPEG_OUTPUT_BUFFER_SIZE 4096 static void _jpeg_init_destination(j_compress_ptr jpeg) { struct _jpeg_dest_manager_t *dest = (struct _jpeg_dest_manager_t *)jpeg->dest; @@ -280,10 +279,13 @@ static boolean _jpeg_empty_output_buffer(j_compress_ptr jpeg) { // Called whenever local jpeg buffer fills up struct _jpeg_dest_manager_t *dest = (struct _jpeg_dest_manager_t *)jpeg->dest; + size_t new_used = dest->picture->used + JPEG_OUTPUT_BUFFER_SIZE; - memcpy(dest->outbuffer_cursor, dest->buffer, JPEG_OUTPUT_BUFFER_SIZE); - dest->outbuffer_cursor += JPEG_OUTPUT_BUFFER_SIZE; - *dest->written += JPEG_OUTPUT_BUFFER_SIZE; + assert(new_used <= dest->picture->allocated); + + memcpy(dest->picture_data_cursor, dest->buffer, JPEG_OUTPUT_BUFFER_SIZE); + dest->picture_data_cursor += JPEG_OUTPUT_BUFFER_SIZE; + dest->picture->used = new_used; dest->mgr.next_output_byte = dest->buffer; dest->mgr.free_in_buffer = JPEG_OUTPUT_BUFFER_SIZE; @@ -296,12 +298,15 @@ static void _jpeg_term_destination(j_compress_ptr jpeg) { // Usually needs to flush buffer struct _jpeg_dest_manager_t *dest = (struct _jpeg_dest_manager_t *)jpeg->dest; - size_t data_count = JPEG_OUTPUT_BUFFER_SIZE - dest->mgr.free_in_buffer; + size_t final = JPEG_OUTPUT_BUFFER_SIZE - dest->mgr.free_in_buffer; + size_t new_used = dest->picture->used + final; + + assert(new_used <= dest->picture->allocated); // Write any data remaining in the buffer - memcpy(dest->outbuffer_cursor, dest->buffer, data_count); - dest->outbuffer_cursor += data_count; - *dest->written += data_count; + memcpy(dest->picture_data_cursor, dest->buffer, final); + dest->picture_data_cursor += final; + dest->picture->used = new_used; } #undef JPEG_OUTPUT_BUFFER_SIZE diff --git a/src/encoders/omx/encoder.c b/src/encoders/omx/encoder.c index a29a368..7aa6e3f 100644 --- a/src/encoders/omx/encoder.c +++ b/src/encoders/omx/encoder.c @@ -78,6 +78,7 @@ struct omx_encoder_t *omx_encoder_init() { // - https://github.com/gagle/raspberrypi-openmax-jpeg/blob/master/jpeg.c // - https://www.raspberrypi.org/forums/viewtopic.php?t=154790 // - https://bitbucket.org/bensch128/omxjpegencode/src/master/jpeg_encoder.cpp + // - http://home.nouwen.name/RaspberryPi/documentation/ilcomponents/image_encode.html struct omx_encoder_t *omx; OMX_ERRORTYPE error; @@ -198,7 +199,7 @@ int omx_encoder_compress_buffer(struct omx_encoder_t *omx, struct device_t *dev, if (omx->output_available) { omx->output_available = false; - assert(PICTURE(used) + OUT(nFilledLen) <= dev->run->max_picture_size); + assert(PICTURE(used) + OUT(nFilledLen) <= PICTURE(allocated)); memcpy(PICTURE(data) + PICTURE(used), OUT(pBuffer) + OUT(nOffset), OUT(nFilledLen)); PICTURE(used) += OUT(nFilledLen); @@ -247,8 +248,6 @@ int omx_encoder_compress_buffer(struct omx_encoder_t *omx, struct device_t *dev, } static int _omx_init_component(struct omx_encoder_t *omx) { - // http://home.nouwen.name/RaspberryPi/documentation/ilcomponents/image_encode.html - OMX_ERRORTYPE error; OMX_CALLBACKTYPE callbacks; @@ -313,7 +312,7 @@ static int _omx_setup_input(struct omx_encoder_t *omx, struct device_t *dev) { # undef ALIGN_HEIGHT portdef.format.image.bFlagErrorConcealment = OMX_FALSE; portdef.format.image.eCompressionFormat = OMX_IMAGE_CodingUnused; - portdef.nBufferSize = dev->run->max_picture_size; + portdef.nBufferSize = dev->run->max_raw_image_size; # define MAP_FORMAT(_v4l2_format, _omx_format) \ case _v4l2_format: { portdef.format.image.eColorFormat = _omx_format; break; } diff --git a/src/stream.c b/src/stream.c index e13afc8..698b3ec 100644 --- a/src/stream.c +++ b/src/stream.c @@ -93,7 +93,7 @@ void stream_loop(struct stream_t *stream) { bool persistent_timeout_reported = false; LOG_DEBUG("Allocation memory for stream picture ..."); - A_CALLOC(stream->picture.data, stream->dev->run->max_picture_size); + A_CALLOC(stream->picture.data, stream->dev->run->max_raw_image_size); LOG_INFO("Capturing ...");