addLabel("Capture Method");
m_capMethods = new QComboBox(parent);
- if (m_querycap.capabilities & V4L2_CAP_STREAMING) {
+ if (caps() & V4L2_CAP_STREAMING) {
v4l2_requestbuffers reqbuf;
// Yuck. The videobuf framework does not accept a count of 0.
reqbufs_mmap_cap(reqbuf, 0);
}
}
- if (m_querycap.capabilities & V4L2_CAP_READWRITE) {
+ if (caps() & V4L2_CAP_READWRITE) {
m_capMethods->addItem("read()", QVariant(methodRead));
}
addWidget(m_capMethods);
if (enum_frameintervals(frmival, m_pixelformat, m_width, m_height, idx)
&& frmival.type == V4L2_FRMIVAL_TYPE_DISCRETE) {
- set_interval(frmival.discrete);
- m_interval = frmival.discrete;
+ if (set_interval(frmival.discrete))
+ m_interval = frmival.discrete;
}
+ updateVidCapFormat();
}
void GeneralTab::vidOutFormatChanged(int idx)
m_width = fmt.fmt.pix.width;
m_height = fmt.fmt.pix.height;
updateFrameSize();
+ updateFrameInterval();
if (enum_fmt_cap(desc, true)) {
do {
if (desc.pixelformat == fmt.fmt.pix.pixelformat)
err = v4lconvert_convert(m_convertData, &m_capSrcFormat, &m_capDestFormat,
m_frameData, s,
m_capImage->bits(), m_capDestFormat.fmt.pix.sizeimage);
- else
- memcpy(m_capImage->bits(), m_frameData, s);
+ if (!m_mustConvert || err)
+ memcpy(m_capImage->bits(), m_frameData, std::min(s, m_capImage->numBytes()));
break;
case methodMmap:
&m_capSrcFormat, &m_capDestFormat,
(unsigned char *)m_buffers[buf.index].start, buf.bytesused,
m_capImage->bits(), m_capDestFormat.fmt.pix.sizeimage);
- else
+ if (!m_mustConvert || err)
memcpy(m_capImage->bits(),
(unsigned char *)m_buffers[buf.index].start,
- buf.bytesused);
+ std::min(buf.bytesused, (unsigned)m_capImage->numBytes()));
}
qbuf(buf);
&m_capSrcFormat, &m_capDestFormat,
(unsigned char *)buf.m.userptr, buf.bytesused,
m_capImage->bits(), m_capDestFormat.fmt.pix.sizeimage);
- else
+ if (!m_mustConvert || err)
memcpy(m_capImage->bits(), (unsigned char *)buf.m.userptr,
- buf.bytesused);
+ std::min(buf.bytesused, (unsigned)m_capImage->numBytes()));
}
qbuf(buf);
break;
}
- if (err == -1)
+ if (err == -1 && m_frame == 0)
error(v4lconvert_get_error_message(m_convertData));
QString status;
inline int fd() const { return m_fd; }
inline bool useWrapper() const { return m_useWrapper; }
- inline __u32 caps() const { return m_capability.capabilities; }
+ inline __u32 caps() const {
+ if (m_capability.capabilities & V4L2_CAP_DEVICE_CAPS)
+ return m_capability.device_caps;
+ return m_capability.capabilities;
+ }
inline const QString &device() const { return m_device; }
static QString pixfmt2s(unsigned pixelformat);