mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-02-26 19:56:33 +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) {
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -43,8 +43,8 @@
|
||||
|
||||
|
||||
struct hw_buffer_t {
|
||||
void *start;
|
||||
size_t length;
|
||||
unsigned char *data;
|
||||
size_t size;
|
||||
};
|
||||
|
||||
struct picture_t {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user