struct video_window vwin;
struct video_audio Audio;
uint i;
const char * TEMP_NODENAME;
TEMP_NODENAME = m_NodeName.toStdString( ).c_str( );
m_CamFD = ::open((const char *) TEMP_NODENAME, O_RDWR);
if (m_CamFD < 0)
return false;
/* Check for Philips cams */
m_HasFramerate = false;
if (m_IntfName.contains ("Philips", Qt::CaseInsensitive )) {
m_HasFramerate = true;
}
else {
struct pwc_probe Probe;
if (ioctl(m_CamFD, VIDIOCPWCPROBE, &Probe) == 0) {
if (m_IntfName == Probe.name) {
m_HasFramerate = true;
} }
}
/* Probe audio functionality */
if (ioctl(m_CamFD, VIDIOCGAUDIO, &Audio) == 0) {
m_Mutable = (Audio.flags & VIDEO_AUDIO_MUTABLE);
if (m_Mutable)
qDebug("Device can be muted (usually TV card).");
}
else
qWarning("Cannot query audio capabilities of video device.");
/* See if device has mmap(); */
m_VMBuf.size = 0;
m_VMBuf.frames = 0;
vid_io_buffer_size = 0;
if (ioctl(m_CamFD, VIDIOCGMBUF, &m_VMBuf) == 0) {
vid_io_buffer_size = m_VMBuf.size;
if (m_RequestedBuffers > 0) {
// User specified a number of buffers; see if we can match that.
if (m_VMBuf.frames < m_RequestedBuffers) {
qWarning("There are more buffers requested than device can provide. Limiting to %d buffers.", m_Buffers);
} else
m_Buffers = m_RequestedBuffers;
}
else // We grab everything we can.
m_Buffers = m_VMBuf.frames;
}
else {
m_VMBuf.size = 0; // Just to be sure....
m_VMBuf.frames = 0;
}
/* See if we can actually mmap() the memory */
if (m_VMBuf.size > 0) {
vid_io_buffer = (uchar *)mmap(NULL, vid_io_buffer_size, PROT_READ | PROT_WRITE, MAP_SHARED, m_CamFD, 0);
if (vid_io_buffer == (uchar *)-1) {
qWarning("mmap() failed (%d). Falling back to non-mmap()ed mode.", errno);
m_VMBuf.size = 0;
vid_io_buffer = NULL;
}
else {
vid_io_offsets.resize(m_Buffers);
for (i = 0; i < m_Buffers; i++)
vid_io_offsets[i] = m_VMBuf.offsets[i];
} }
if (m_VMBuf.size == 0) { // No mmap or failed: allocate a buffer
m_Buffers = m_RequestedBuffers;
if (m_Buffers < 0)
m_Buffers = 4; // In case the user didn't specify a buffer size, we make one.
vid_io_buffer_size = m_Buffers * m_MaxSize.width() * m_MaxSize.height() * 4;
vid_io_buffer = new uchar[vid_io_buffer_size];
vid_io_offsets.resize(m_Buffers);
for (i = 0; i < m_Buffers; i++)
vid_io_offsets[i] = i * m_MaxSize.width() * m_MaxSize.height() * 4;
}
if (vid_io_buffer == NULL) {
qWarning("Failed to mmap/malloc memory!");
return false;
}
// Try to set default image size (from config)
memset(&vwin, 0, sizeof(vwin));
RequestedSize = m_pSettings->GetSize();
if (!RequestedSize.isNull()) {
vwin.width = RequestedSize.width();
vwin.height = RequestedSize.height();
if (m_HasFramerate) {
vwin.flags |= (m_pSettings->GetFramerate() << PWC_FPS_SHIFT) & PWC_FPS_FRMASK;
}
if (ioctl(m_CamFD, VIDIOCSWIN, &vwin) < 0) {
qWarning("Failed to restore image size (%d, %d)", vwin.width, vwin.height);
}
}
// Query current image size
if (ioctl(m_CamFD, VIDIOCGWIN, &vwin) < 0) {
qWarning("Failed to query current image size.");
}
else {
m_ImageSize.setWidth(vwin.width);
m_ImageSize.setHeight(vwin.height);
if (m_HasFramerate)
{
m_Framerate = (vwin.flags & PWC_FPS_FRMASK) >> PWC_FPS_SHIFT;
qDebug("Initial image size = (%d, %d), framerate = %d", vwin.width, vwin.height, m_Framerate);
}
}
// Restore brightness, contrast, etc.
m_VPic.brightness = m_pSettings->GetBrightness();
m_VPic.contrast = m_pSettings->GetContrast();
m_VPic.colour = m_pSettings->GetSaturation();
m_VPic.hue = m_pSettings->GetHue();
m_VPic.whiteness = m_pSettings->GetGamma();
if (ioctl(m_CamFD, VIDIOCSPICT, &m_VPic) < 0)
qWarning("Failed to restore video controls.");
// Restore input/tuner
SetInput(m_CurrentVideoInput);
SetTuner(m_CurrentTuner);
return true;
]
and from another function I create the
QImage like
this
[
CreateImagesRGB()
{
int w, h;
uint u;
m_RGB.resize(m_Buffers);
w = m_ImageSize.width();
h = m_ImageSize.height();
if (m_Palette == VIDEO_PALETTE_RGB32) {
// This is easy... map directly onto images
for (u = 0; u < m_Buffers; u++) {
m_RGB.
insert(u,
*(new QImage(vid_io_buffer
+ vid_io_offsets
[u
], w, h,
QImage::Format_RGB32)));
} }
else {
for (u = 0; u < m_Buffers; u++) {
m_RGB.insert(u, *CImage);
}
} }