VideoInputSenderManager::VideoInputSenderManager(QObject *parent) : QObject(parent) { QStringList devs = CameraThread::enumerateDevices(); foreach(QString dev, devs) { //qDebug() << "VideoInputSenderManager::ctor: Creating thread for device: "<<dev; VideoSender *sender = new VideoSender(); CameraThread *source = CameraThread::threadForCamera(dev); source->setFps(30); source->registerConsumer(sender); // The 'raw frames' mode uses V4L to get the frames instead of LibAV // Of course, V4L isn't supported on windows, so we don't enable raw frames on windows. // In the future, I suppose I could find code to use the appros Windows API to // connect to the capture card - but I just don't have a need for that level of performance // on windows right now, so I'll put it off until I need it or someone really wants it. // For now, the high-performance capture use is on Linux (for me), so that's where I'll focus. #ifndef Q_OS_WIN source->enableRawFrames(true); #endif sender->setVideoSource(source); m_videoSenders[dev] = sender; }
GstFlowReturn VideoSender::newBufferCB(GstAppSink *sink, gpointer user_data) { qDebug() << "In" << __FUNCTION__; VideoSender *vs = static_cast<VideoSender *>(user_data); // Get new video sample GstSample *sample = gst_app_sink_pull_sample(sink); if (sample == NULL) { qWarning("%s: Failed to get new sample", __FUNCTION__); return GST_FLOW_OK; } // FIXME: zero copy? GstBuffer *buffer = gst_sample_get_buffer(sample); GstMapInfo map; QByteArray *data = NULL; if (gst_buffer_map(buffer, &map, GST_MAP_READ)) { // Copy the data to QByteArray data = new QByteArray((char *)map.data, map.size); vs->emitVideo(data); gst_buffer_unmap(buffer, &map); } else { qWarning("Error with gst_buffer_map"); } gst_sample_unref(sample); return GST_FLOW_OK; }
VideoInputSenderManager::VideoInputSenderManager(QObject *parent) : QObject(parent) { QStringList devs = CameraThread::enumerateDevices(); foreach(QString dev, devs) { VideoSender *sender = new VideoSender(); CameraThread *source = CameraThread::threadForCamera(dev); source->setFps(30); source->registerConsumer(sender); #ifndef Q_OS_WINDOWS source->enableRawFrames(true); #endif sender->setVideoSource(source); m_videoSenders[dev] = sender; }