diff --git a/host_applications/linux/apps/raspicam/RaspiHelpers.c b/host_applications/linux/apps/raspicam/RaspiHelpers.c index 19e28e1..9421148 100644 --- a/host_applications/linux/apps/raspicam/RaspiHelpers.c +++ b/host_applications/linux/apps/raspicam/RaspiHelpers.c @@ -33,6 +33,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include +#include +#include #include "interface/vcos/vcos.h" #include "interface/mmal/mmal.h" @@ -294,3 +297,25 @@ uint64_t get_microseconds64() return us; } + + +/* + * If we are configured to use /dev/video0 as unicam (e.g. for libcamera) then + * these legacy camera apps can't work. Fail immediately with an obvious message. + */ +void check_camera_stack() +{ + int fd = open("/dev/video0", O_RDWR, 0); + if (fd < 0) + return; + + struct v4l2_capability caps; + int ret = ioctl(fd, VIDIOC_QUERYCAP, &caps); + close(fd); + + if (ret < 0 || strcmp((char *)caps.driver, "unicam")) + return; + + fprintf(stderr, "ERROR: the system should be configured for the legacy camera stack\n"); + exit(-1); +} diff --git a/host_applications/linux/apps/raspicam/RaspiHelpers.h b/host_applications/linux/apps/raspicam/RaspiHelpers.h index c309692..9ab7d18 100644 --- a/host_applications/linux/apps/raspicam/RaspiHelpers.h +++ b/host_applications/linux/apps/raspicam/RaspiHelpers.h @@ -39,5 +39,6 @@ void default_signal_handler(int signal_number); int mmal_status_to_int(MMAL_STATUS_T status); void print_app_details(FILE *fd); uint64_t get_microseconds64(); +void check_camera_stack(); #endif diff --git a/host_applications/linux/apps/raspicam/RaspiStill.c b/host_applications/linux/apps/raspicam/RaspiStill.c index 4bb9d8f..a88bcc8 100644 --- a/host_applications/linux/apps/raspicam/RaspiStill.c +++ b/host_applications/linux/apps/raspicam/RaspiStill.c @@ -1647,6 +1647,8 @@ int main(int argc, const char **argv) MMAL_PORT_T *encoder_input_port = NULL; MMAL_PORT_T *encoder_output_port = NULL; + check_camera_stack(); + bcm_host_init(); // Register our application with the logging system diff --git a/host_applications/linux/apps/raspicam/RaspiStillYUV.c b/host_applications/linux/apps/raspicam/RaspiStillYUV.c index ffa120d..4acd1ab 100644 --- a/host_applications/linux/apps/raspicam/RaspiStillYUV.c +++ b/host_applications/linux/apps/raspicam/RaspiStillYUV.c @@ -1066,6 +1066,8 @@ int main(int argc, const char **argv) MMAL_PORT_T *preview_input_port = NULL; FILE *output_file = NULL; + check_camera_stack(); + bcm_host_init(); // Register our application with the logging system diff --git a/host_applications/linux/apps/raspicam/RaspiVid.c b/host_applications/linux/apps/raspicam/RaspiVid.c index 4095539..0ebe7fa 100644 --- a/host_applications/linux/apps/raspicam/RaspiVid.c +++ b/host_applications/linux/apps/raspicam/RaspiVid.c @@ -2408,6 +2408,8 @@ int main(int argc, const char **argv) MMAL_PORT_T *splitter_output_port = NULL; MMAL_PORT_T *splitter_preview_port = NULL; + check_camera_stack(); + bcm_host_init(); // Register our application with the logging system diff --git a/host_applications/linux/apps/raspicam/RaspiVidYUV.c b/host_applications/linux/apps/raspicam/RaspiVidYUV.c index d8b5494..87ab502 100644 --- a/host_applications/linux/apps/raspicam/RaspiVidYUV.c +++ b/host_applications/linux/apps/raspicam/RaspiVidYUV.c @@ -1239,6 +1239,8 @@ int main(int argc, const char **argv) MMAL_PORT_T *camera_still_port = NULL; MMAL_PORT_T *preview_input_port = NULL; + check_camera_stack(); + bcm_host_init(); // Register our application with the logging system