mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-03-11 01:53:43 +00:00
refactoring
This commit is contained in:
18
src/device.c
18
src/device.c
@@ -173,11 +173,15 @@ void device_close(struct device_t *dev) {
|
|||||||
if (dev->run->hw_buffers) {
|
if (dev->run->hw_buffers) {
|
||||||
LOG_DEBUG("Unmapping HW buffers ...");
|
LOG_DEBUG("Unmapping HW buffers ...");
|
||||||
for (unsigned index = 0; index < dev->run->n_buffers; ++index) {
|
for (unsigned index = 0; index < dev->run->n_buffers; ++index) {
|
||||||
if (dev->run->hw_buffers[index].start != MAP_FAILED) {
|
# define HW_BUFFER(_next) dev->run->hw_buffers[index]._next
|
||||||
if (munmap(dev->run->hw_buffers[index].start, dev->run->hw_buffers[index].length) < 0) {
|
|
||||||
|
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);
|
LOG_PERROR("Can't unmap device buffer %u", index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# undef HW_BUFFER
|
||||||
}
|
}
|
||||||
dev->run->n_buffers = 0;
|
dev->run->n_buffers = 0;
|
||||||
free(dev->run->hw_buffers);
|
free(dev->run->hw_buffers);
|
||||||
@@ -395,13 +399,17 @@ static int _device_open_mmap(struct device_t *dev) {
|
|||||||
return -1;
|
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);
|
LOG_DEBUG("Mapping device buffer %u ...", dev->run->n_buffers);
|
||||||
dev->run->hw_buffers[dev->run->n_buffers].length = buf_info.length;
|
HW_BUFFER(data) = mmap(NULL, buf_info.length, PROT_READ|PROT_WRITE, MAP_SHARED, dev->run->fd, buf_info.m.offset);
|
||||||
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 (HW_BUFFER(data) == MAP_FAILED) {
|
||||||
if (dev->run->hw_buffers[dev->run->n_buffers].start == MAP_FAILED) {
|
|
||||||
LOG_PERROR("Can't map device buffer %u", dev->run->n_buffers);
|
LOG_PERROR("Can't map device buffer %u", dev->run->n_buffers);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
HW_BUFFER(size) = buf_info.length;
|
||||||
|
|
||||||
|
# undef HW_BUFFER
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,8 +43,8 @@
|
|||||||
|
|
||||||
|
|
||||||
struct hw_buffer_t {
|
struct hw_buffer_t {
|
||||||
void *start;
|
unsigned char *data;
|
||||||
size_t length;
|
size_t size;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct picture_t {
|
struct picture_t {
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ void cpu_encoder_compress_buffer(struct device_t *dev, unsigned index, unsigned
|
|||||||
jpeg_start_compress(&jpeg, TRUE);
|
jpeg_start_compress(&jpeg, TRUE);
|
||||||
|
|
||||||
# define WRITE_SCANLINES(_format, _func) \
|
# 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) {
|
switch (dev->run->format) {
|
||||||
// https://www.fourcc.org/yuv.php
|
// https://www.fourcc.org/yuv.php
|
||||||
|
|||||||
@@ -69,8 +69,8 @@ void hw_encoder_compress_buffer(struct device_t *dev, unsigned index) {
|
|||||||
# define PICTURE(_next) dev->run->pictures[index]._next
|
# define PICTURE(_next) dev->run->pictures[index]._next
|
||||||
# define HW_BUFFER(_next) dev->run->hw_buffers[index]._next
|
# define HW_BUFFER(_next) dev->run->hw_buffers[index]._next
|
||||||
|
|
||||||
assert(PICTURE(allocated) >= HW_BUFFER(length) + sizeof(HUFFMAN_TABLE));
|
assert(PICTURE(allocated) >= HW_BUFFER(size) + sizeof(HUFFMAN_TABLE));
|
||||||
PICTURE(size) = _memcpy_with_huffman(PICTURE(data), HW_BUFFER(start), HW_BUFFER(length));
|
PICTURE(size) = _memcpy_with_huffman(PICTURE(data), HW_BUFFER(data), HW_BUFFER(size));
|
||||||
|
|
||||||
# undef HW_BUFFER
|
# undef HW_BUFFER
|
||||||
# undef PICTURE
|
# undef PICTURE
|
||||||
|
|||||||
@@ -216,18 +216,18 @@ int omx_encoder_compress_buffer(struct omx_encoder_t *omx, struct device_t *dev,
|
|||||||
if (omx->input_required) {
|
if (omx->input_required) {
|
||||||
omx->input_required = false;
|
omx->input_required = false;
|
||||||
|
|
||||||
if (pos == HW_BUFFER(length)) {
|
if (pos == HW_BUFFER(size)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(IN(pBuffer), HW_BUFFER(start) + pos, slice_size);
|
memcpy(IN(pBuffer), HW_BUFFER(data) + pos, slice_size);
|
||||||
IN(nOffset) = 0;
|
IN(nOffset) = 0;
|
||||||
IN(nFilledLen) = slice_size;
|
IN(nFilledLen) = slice_size;
|
||||||
|
|
||||||
pos += slice_size;
|
pos += slice_size;
|
||||||
|
|
||||||
if (pos + slice_size > HW_BUFFER(length)) {
|
if (pos + slice_size > HW_BUFFER(size)) {
|
||||||
slice_size = HW_BUFFER(length) - pos;
|
slice_size = HW_BUFFER(size) - pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((error = OMX_EmptyThisBuffer(omx->encoder, omx->input_buffer)) != OMX_ErrorNone) {
|
if ((error = OMX_EmptyThisBuffer(omx->encoder, omx->input_buffer)) != OMX_ErrorNone) {
|
||||||
|
|||||||
Reference in New Issue
Block a user