From b1f1356a3efb99bd7d20b4947b286d009f9241a4 Mon Sep 17 00:00:00 2001 From: inodlite <1023852+inodlite@users.noreply.github.com> Date: Tue, 5 Sep 2017 22:20:48 -0700 Subject: [PATCH 1/4] Enable padding-removal for MMAL video port. --- mmalcam.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mmalcam.c b/mmalcam.c index 7c3a736d..d71bd099 100644 --- a/mmalcam.c +++ b/mmalcam.c @@ -141,6 +141,12 @@ static int create_camera_component(mmalcam_context_ptr mmalcam, const char *mmal set_video_port_format(mmalcam, video_port->format); video_port->format->encoding = MMAL_ENCODING_I420; + + if (mmal_port_parameter_set_boolean(video_port, MMAL_PARAMETER_NO_IMAGE_PADDING, 1) + != MMAL_SUCCESS) { + MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO, "MMAL no-padding setup failed"); + } + status = mmal_port_format_commit(video_port); if (status) { From ef36f9c9c5f786a977f74d0a310c8b37635fc94b Mon Sep 17 00:00:00 2001 From: inodlite <1023852+inodlite@users.noreply.github.com> Date: Tue, 5 Sep 2017 22:23:09 -0700 Subject: [PATCH 2/4] Set MMAL buffer size to accommodate padded frame, as required by RPi's firmware. --- mmalcam.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mmalcam.c b/mmalcam.c index d71bd099..70c8e7ba 100644 --- a/mmalcam.c +++ b/mmalcam.c @@ -141,7 +141,10 @@ static int create_camera_component(mmalcam_context_ptr mmalcam, const char *mmal set_video_port_format(mmalcam, video_port->format); video_port->format->encoding = MMAL_ENCODING_I420; - + // set buffer size for an aligned/padded frame + video_port->buffer_size = VCOS_ALIGN_UP(mmalcam->width, 32) * + VCOS_ALIGN_UP(mmalcam->height, 16) * 3 / 2; + if (mmal_port_parameter_set_boolean(video_port, MMAL_PARAMETER_NO_IMAGE_PADDING, 1) != MMAL_SUCCESS) { MOTION_LOG(WRN, TYPE_VIDEO, NO_ERRNO, "MMAL no-padding setup failed"); From 7de5b8a07c3684cc86ccc044c4e4b3a198f6c7fc Mon Sep 17 00:00:00 2001 From: inodlite <1023852+inodlite@users.noreply.github.com> Date: Tue, 5 Sep 2017 22:26:15 -0700 Subject: [PATCH 3/4] Print image size on failure in mmalcam_next. --- mmalcam.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mmalcam.c b/mmalcam.c index 70c8e7ba..bd931515 100644 --- a/mmalcam.c +++ b/mmalcam.c @@ -387,8 +387,9 @@ int mmalcam_next(struct context *cnt, unsigned char *map) memcpy(map, camera_buffer->data, cnt->imgs.size); mmal_buffer_header_mem_unlock(camera_buffer); } else { - MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO, "cmd %d flags %08x size %d/%d at %08x", - camera_buffer->cmd, camera_buffer->flags, camera_buffer->length, camera_buffer->alloc_size, camera_buffer->data); + MOTION_LOG(ERR, TYPE_VIDEO, NO_ERRNO, "cmd %d flags %08x size %d/%d at %08x, img_size=%d", + camera_buffer->cmd, camera_buffer->flags, camera_buffer->length, + camera_buffer->alloc_size, camera_buffer->data, cnt->imgs.size); } mmal_buffer_header_release(camera_buffer); From 27102bba56cb12e1b31b206d3638a4251bae1880 Mon Sep 17 00:00:00 2001 From: inodlite <1023852+inodlite@users.noreply.github.com> Date: Tue, 5 Sep 2017 22:29:08 -0700 Subject: [PATCH 4/4] Allow copy from larger buffers in mmalcam_next, as those are from (un)padded frames. --- mmalcam.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmalcam.c b/mmalcam.c index bd931515..b71a960f 100644 --- a/mmalcam.c +++ b/mmalcam.c @@ -382,7 +382,7 @@ int mmalcam_next(struct context *cnt, unsigned char *map) MMAL_BUFFER_HEADER_T *camera_buffer = mmal_queue_wait(mmalcam->camera_buffer_queue); if (camera_buffer->cmd == 0 && (camera_buffer->flags & MMAL_BUFFER_HEADER_FLAG_FRAME_END) - && camera_buffer->length == cnt->imgs.size) { + && camera_buffer->length >= cnt->imgs.size) { mmal_buffer_header_mem_lock(camera_buffer); memcpy(map, camera_buffer->data, cnt->imgs.size); mmal_buffer_header_mem_unlock(camera_buffer);