diff --git a/src/device.c b/src/device.c index c4881a3..f016216 100644 --- a/src/device.c +++ b/src/device.c @@ -173,11 +173,15 @@ void device_close(struct device_t *dev) { if (dev->run->hw_buffers) { LOG_DEBUG("Unmapping HW buffers ..."); for (unsigned index = 0; index < dev->run->n_buffers; ++index) { - if (dev->run->hw_buffers[index].start != MAP_FAILED) { - if (munmap(dev->run->hw_buffers[index].start, dev->run->hw_buffers[index].length) < 0) { +# define HW_BUFFER(_next) dev->run->hw_buffers[index]._next + + if (HW_BUFFER(size) > 0 && HW_BUFFER(data) != MAP_FAILED) { + if (munmap(HW_BUFFER(data), HW_BUFFER(size)) < 0) { LOG_PERROR("Can't unmap device buffer %u", index); } } + +# undef HW_BUFFER } dev->run->n_buffers = 0; free(dev->run->hw_buffers); @@ -395,13 +399,17 @@ static int _device_open_mmap(struct device_t *dev) { return -1; } +# define HW_BUFFER(_next) dev->run->hw_buffers[dev->run->n_buffers]._next + LOG_DEBUG("Mapping device buffer %u ...", dev->run->n_buffers); - dev->run->hw_buffers[dev->run->n_buffers].length = buf_info.length; - dev->run->hw_buffers[dev->run->n_buffers].start = mmap(NULL, buf_info.length, PROT_READ|PROT_WRITE, MAP_SHARED, dev->run->fd, buf_info.m.offset); - if (dev->run->hw_buffers[dev->run->n_buffers].start == MAP_FAILED) { + HW_BUFFER(data) = mmap(NULL, buf_info.length, PROT_READ|PROT_WRITE, MAP_SHARED, dev->run->fd, buf_info.m.offset); + if (HW_BUFFER(data) == MAP_FAILED) { LOG_PERROR("Can't map device buffer %u", dev->run->n_buffers); return -1; } + HW_BUFFER(size) = buf_info.length; + +# undef HW_BUFFER } return 0; } diff --git a/src/device.h b/src/device.h index a5dfafd..bcf5081 100644 --- a/src/device.h +++ b/src/device.h @@ -43,8 +43,8 @@ struct hw_buffer_t { - void *start; - size_t length; + unsigned char *data; + size_t size; }; struct picture_t { diff --git a/src/encoders/cpu/encoder.c b/src/encoders/cpu/encoder.c index 0c30a97..4fbe23c 100644 --- a/src/encoders/cpu/encoder.c +++ b/src/encoders/cpu/encoder.c @@ -95,7 +95,7 @@ void cpu_encoder_compress_buffer(struct device_t *dev, unsigned index, unsigned jpeg_start_compress(&jpeg, TRUE); # define WRITE_SCANLINES(_format, _func) \ - case _format: { _func(&jpeg, dev->run->hw_buffers[index].start, dev->run->width, dev->run->height); break; } + case _format: { _func(&jpeg, dev->run->hw_buffers[index].data, dev->run->width, dev->run->height); break; } switch (dev->run->format) { // https://www.fourcc.org/yuv.php diff --git a/src/encoders/hw/encoder.c b/src/encoders/hw/encoder.c index 789eda4..77afd8a 100644 --- a/src/encoders/hw/encoder.c +++ b/src/encoders/hw/encoder.c @@ -69,8 +69,8 @@ void hw_encoder_compress_buffer(struct device_t *dev, unsigned index) { # define PICTURE(_next) dev->run->pictures[index]._next # define HW_BUFFER(_next) dev->run->hw_buffers[index]._next - assert(PICTURE(allocated) >= HW_BUFFER(length) + sizeof(HUFFMAN_TABLE)); - PICTURE(size) = _memcpy_with_huffman(PICTURE(data), HW_BUFFER(start), HW_BUFFER(length)); + assert(PICTURE(allocated) >= HW_BUFFER(size) + sizeof(HUFFMAN_TABLE)); + PICTURE(size) = _memcpy_with_huffman(PICTURE(data), HW_BUFFER(data), HW_BUFFER(size)); # undef HW_BUFFER # undef PICTURE diff --git a/src/encoders/omx/encoder.c b/src/encoders/omx/encoder.c index fed33e8..9469fa7 100644 --- a/src/encoders/omx/encoder.c +++ b/src/encoders/omx/encoder.c @@ -216,18 +216,18 @@ int omx_encoder_compress_buffer(struct omx_encoder_t *omx, struct device_t *dev, if (omx->input_required) { omx->input_required = false; - if (pos == HW_BUFFER(length)) { + if (pos == HW_BUFFER(size)) { continue; } - memcpy(IN(pBuffer), HW_BUFFER(start) + pos, slice_size); + memcpy(IN(pBuffer), HW_BUFFER(data) + pos, slice_size); IN(nOffset) = 0; IN(nFilledLen) = slice_size; pos += slice_size; - if (pos + slice_size > HW_BUFFER(length)) { - slice_size = HW_BUFFER(length) - pos; + if (pos + slice_size > HW_BUFFER(size)) { + slice_size = HW_BUFFER(size) - pos; } if ((error = OMX_EmptyThisBuffer(omx->encoder, omx->input_buffer)) != OMX_ErrorNone) {