diff options
author | Wim Taymans <wtaymans@redhat.com> | 2020-09-29 17:06:24 +0200 |
---|---|---|
committer | Wim Taymans <wtaymans@redhat.com> | 2020-09-29 17:06:24 +0200 |
commit | ced338ad7de0b968115a584067e0a80d6065c54b (patch) | |
tree | 1fe3ed79b27fc7c686a8d9a8dadd51565f707329 | |
parent | 2a630dbecdaae3576d9d950c9a9027c0ae6e61cb (diff) |
v4l2: mmap the buffer again
Some drivers need a mmaped buffer...
-rw-r--r-- | spa/plugins/v4l2/v4l2-utils.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/spa/plugins/v4l2/v4l2-utils.c b/spa/plugins/v4l2/v4l2-utils.c index 9d6a20d3..757b3e0a 100644 --- a/spa/plugins/v4l2/v4l2-utils.c +++ b/spa/plugins/v4l2/v4l2-utils.c @@ -162,8 +162,7 @@ static int spa_v4l2_clear_buffers(struct impl *this) spa_v4l2_buffer_recycle(this, i); } if (SPA_FLAG_IS_SET(b->flags, BUFFER_FLAG_MAPPED)) { - munmap(SPA_MEMBER(b->ptr, -d[0].mapoffset, void), - d[0].maxsize - d[0].mapoffset); + munmap(b->ptr, d[0].maxsize); } if (SPA_FLAG_IS_SET(b->flags, BUFFER_FLAG_ALLOCATED)) { spa_log_debug(this->log, "v4l2: close %d", (int) d[0].fd); @@ -1354,14 +1353,14 @@ static int spa_v4l2_use_buffers(struct impl *this, struct spa_buffer **buffers, void *data; data = mmap(NULL, - d[0].maxsize + d[0].mapoffset, + d[0].maxsize, PROT_READ | PROT_WRITE, MAP_SHARED, d[0].fd, - 0); + d[0].mapoffset); if (data == MAP_FAILED) return -errno; - b->ptr = SPA_MEMBER(data, d[0].mapoffset, void); + b->ptr = data; SPA_FLAG_SET(b->flags, BUFFER_FLAG_MAPPED); } else @@ -1482,7 +1481,18 @@ fallback: d[0].flags = SPA_DATA_FLAG_READABLE; d[0].fd = dev->fd; d[0].mapoffset = b->v4l2_buffer.m.offset; - spa_log_debug(this->log, "v4l2: mmap offset:%u", d[0].mapoffset); + d[0].data = mmap(NULL, + b->v4l2_buffer.length, + PROT_READ, MAP_SHARED, + dev->fd, + b->v4l2_buffer.m.offset); + if (d[0].data == MAP_FAILED) { + spa_log_error(this->log, "v4l2: '%s' mmap: %m", this->props.device); + return -errno; + } + b->ptr = d[0].data; + SPA_FLAG_SET(b->flags, BUFFER_FLAG_MAPPED); + spa_log_debug(this->log, "v4l2: mmap offset:%u data:%p", d[0].mapoffset, b->ptr); } spa_v4l2_buffer_recycle(this, i); } |