standard and palette are actually unsigned in v4l2, so let's use that instead of int. Fixes some build warnings

This commit is contained in:
Isaac Connor
2025-12-03 08:45:12 -05:00
parent 7da3eecc2c
commit 6d55e889cb
2 changed files with 46 additions and 12 deletions

View File

@@ -46,7 +46,7 @@ static int vidioctl(int fd, int request, void *arg) {
return result;
}
static _AVPIXELFORMAT getFfPixFormatFromV4lPalette(int v4l_version, int palette) {
static _AVPIXELFORMAT getFfPixFormatFromV4lPalette(int v4l_version, unsigned int palette) {
_AVPIXELFORMAT pixFormat = AV_PIX_FMT_NONE;
switch (palette) {
@@ -139,7 +139,7 @@ static _AVPIXELFORMAT getFfPixFormatFromV4lPalette(int v4l_version, int palette)
//case V4L2_PIX_FMT_PJPG :
//case V4L2_PIX_FMT_YVYU :
default : {
Fatal("Can't find swscale format for palette %d", palette);
Fatal("Can't find swscale format for palette %u", palette);
break;
#if 0
// These are all spare and may match some of the above
@@ -226,14 +226,14 @@ LocalCamera::LocalCamera(
const Monitor *monitor,
const std::string &p_device,
int p_channel,
int p_standard,
v4l2_std_id p_standard,
bool p_v4l_multi_buffer,
unsigned int p_v4l_captures_per_frame,
const std::string &p_method,
int p_width,
int p_height,
int p_colours,
int p_palette,
unsigned int p_palette,
int p_brightness,
int p_contrast,
int p_hue,
@@ -512,7 +512,7 @@ void LocalCamera::Initialise() {
}
if ((input.std != V4L2_STD_UNKNOWN) && ((input.std & standard) == V4L2_STD_UNKNOWN)) {
Error("Device does not support video standard %d", standard);
Error("Device does not support video standard %lld", standard);
}
if ((vidioctl(vid_fd, VIDIOC_G_STD, &stdId) < 0)) {
@@ -521,7 +521,7 @@ void LocalCamera::Initialise() {
if (stdId != standard) {
stdId = standard;
if ((vidioctl(vid_fd, VIDIOC_S_STD, &stdId) < 0)) {
Error("Failed to set video standard %d: %d %s", standard, errno, strerror(errno));
Error("Failed to set video standard %lld: %d %s", standard, errno, strerror(errno));
}
}
Debug(3, "Setting up video format");
@@ -715,6 +715,7 @@ void LocalCamera::Initialise() {
//vid_buf.memory = V4L2_MEMORY_MMAP;
vid_buf.memory = v4l2_data.reqbufs.memory;
vid_buf.index = i;
Debug(1, "buf_type for %d %d =? %d, memory %d =? %d", i, vid_buf.type, V4L2_BUF_TYPE_VIDEO_CAPTURE, vid_buf.memory, V4L2_MEMORY_MMAP);
if (vidioctl(vid_fd, VIDIOC_QUERYBUF, &vid_buf) < 0)
Fatal("Unable to query video buffer: %s", strerror(errno));
@@ -726,6 +727,7 @@ void LocalCamera::Initialise() {
Fatal("Can't map video buffer %u (%u bytes) to memory: %s(%d)",
i, vid_buf.length, strerror(errno), errno);
capturePictures[i] = av_frame_ptr{av_frame_alloc()};
if (!capturePictures[i])
@@ -1229,6 +1231,31 @@ int LocalCamera::PrimeCapture() {
if (!device_prime)
return 1;
// *** VERIFY FORMAT HASN'T CHANGED ***
struct v4l2_format current_fmt;
memset(&current_fmt, 0, sizeof(current_fmt));
current_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (vidioctl(vid_fd, VIDIOC_G_FMT, &current_fmt) < 0) {
Error("Failed to get current format: %s", strerror(errno));
} else {
Debug(1, "Format at PrimeCapture: %dx%d, format=0x%x, bytesperline=%d, sizeimage=%d",
current_fmt.fmt.pix. width, current_fmt.fmt. pix.height,
current_fmt.fmt.pix. pixelformat, current_fmt. fmt.pix.bytesperline,
current_fmt. fmt.pix.sizeimage);
Debug(1, "Expected format: %dx%d, format=0x%x, bytesperline=%d, sizeimage=%d",
v4l2_data.fmt.fmt. pix.width, v4l2_data.fmt.fmt. pix.height,
v4l2_data.fmt. fmt.pix.pixelformat, v4l2_data. fmt.fmt.pix.bytesperline,
v4l2_data.fmt.fmt.pix.sizeimage);
if (current_fmt.fmt.pix.sizeimage != v4l2_data.fmt.fmt.pix.sizeimage) {
Error("FORMAT MISMATCH! Current sizeimage %d != expected %d",
current_fmt.fmt.pix.sizeimage, v4l2_data.fmt.fmt.pix. sizeimage);
}
}
// *** END DIAGNOSTIC ***
Debug(3, "Queueing (%d) buffers", v4l2_data.reqbufs.count);
for (unsigned int frame = 0; frame < v4l2_data.reqbufs.count; frame++) {
struct v4l2_buffer vid_buf;
@@ -1242,8 +1269,16 @@ int LocalCamera::PrimeCapture() {
vid_buf.memory = v4l2_data.reqbufs.memory;
vid_buf.index = frame;
// *** ADD MORE DIAGNOSTICS FOR THE FAILING QBUF ***
Debug(3, "Attempting QBUF: index=%d, type=%d, memory=%d, reqbufs.count=%d",
vid_buf.index, vid_buf.type, vid_buf.memory, v4l2_data. reqbufs.count);
if (vidioctl(vid_fd, VIDIOC_QBUF, &vid_buf) < 0) {
Error("Failed to queue buffer %d: %s", frame, strerror(errno));
Error(" vid_buf: type=%d, memory=%d, index=%d", vid_buf.type, vid_buf.memory, vid_buf.index);
Error(" reqbufs: count=%d, type=%d, memory=%d",
v4l2_data.reqbufs.count, v4l2_data.reqbufs.type, v4l2_data.reqbufs.memory);
return 0;
}
}
@@ -1284,7 +1319,6 @@ int LocalCamera::Capture(std::shared_ptr<ZMPacket> &zm_packet) {
static struct v4l2_buffer vid_buf;
memset(&vid_buf, 0, sizeof(vid_buf));
vid_buf.type = v4l2_data.fmt.type;
vid_buf.memory = v4l2_data.reqbufs.memory;

View File

@@ -50,8 +50,8 @@ class LocalCamera : public Camera {
protected:
std::string device;
int channel;
int standard;
int palette;
v4l2_std_id standard;
unsigned int palette;
bool device_prime;
bool channel_prime;
int channel_index;
@@ -86,14 +86,14 @@ class LocalCamera : public Camera {
const Monitor *monitor,
const std::string &device,
int p_channel,
int p_format,
v4l2_std_id p_standard,
bool v4lmultibuffer,
unsigned int v4lcapturesperframe,
const std::string &p_method,
int p_width,
int p_height,
int p_colours,
int p_palette,
unsigned int p_palette,
int p_brightness,
int p_contrast,
int p_hue,
@@ -110,7 +110,7 @@ class LocalCamera : public Camera {
int Channel() const { return channel; }
int Standard() const { return standard; }
int Palette() const { return palette; }
unsigned int Palette() const { return palette; }
int Extras() const { return extras; }
int Control(int vid_id, int newvalue=-1 );