void QGstreamerGLTextureRenderer::setSurface(QAbstractVideoSurface *surface) { if (m_surface != surface) { #ifdef GL_TEXTURE_SINK_DEBUG qDebug() << Q_FUNC_INFO << surface; #endif bool oldReady = isReady(); m_context = m_glEnabled ? const_cast<QGLContext*>(QGLContext::currentContext()) : NULL; if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); m_videoSink = 0; if (m_surface) { disconnect(m_surface, SIGNAL(supportedFormatsChanged()), this, SLOT(handleFormatChange())); } m_surface = surface; if (oldReady != isReady()) emit readyChanged(!oldReady); if (m_surface) { connect(m_surface, SIGNAL(supportedFormatsChanged()), this, SLOT(handleFormatChange())); } emit sinkChanged(); } }
void QGstreamerVideoRenderer::setSurface(QAbstractVideoSurface *surface) { if (m_surface != surface) { //qDebug() << Q_FUNC_INFO << surface; if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); m_videoSink = 0; if (m_surface) { disconnect(m_surface, SIGNAL(supportedFormatsChanged()), this, SLOT(handleFormatChange())); } m_surface = surface; if (surface && !m_surface) emit readyChanged(true); if (!surface && m_surface) emit readyChanged(false); if (m_surface) { connect(m_surface, SIGNAL(supportedFormatsChanged()), this, SLOT(handleFormatChange())); } emit sinkChanged(); } }
void QGstreamerVideoRenderer::setSurface(QAbstractVideoSurface *surface) { if (m_surface != surface) { //qDebug() << Q_FUNC_INFO << surface; if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); m_videoSink = 0; if (m_surface) { disconnect(m_surface.data(), SIGNAL(supportedFormatsChanged()), this, SLOT(handleFormatChange())); } bool wasReady = isReady(); m_surface = surface; if (m_surface) { connect(m_surface.data(), SIGNAL(supportedFormatsChanged()), this, SLOT(handleFormatChange())); } if (wasReady != isReady()) emit readyChanged(isReady()); emit sinkChanged(); } }
void QGstreamerGLTextureRenderer::handleFormatChange() { if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); m_videoSink = 0; emit sinkChanged(); }
void GraphConnection::setSink(QPointF sink) { if (m_sink != sink) { m_sink = sink; emit sinkChanged(sink); update(); } }
void QGstreamerVideoRenderer::handleFormatChange() { //qDebug() << "Supported formats list has changed, reload video output"; if (m_videoSink) gst_object_unref(GST_OBJECT(m_videoSink)); m_videoSink = 0; emit sinkChanged(); }
void QGstreamerPlayerSession::setVideoRenderer(QObject *videoOutput) { if (m_videoOutput != videoOutput) { if (m_videoOutput) { disconnect(m_videoOutput, SIGNAL(sinkChanged()), this, SLOT(updateVideoRenderer())); disconnect(m_videoOutput, SIGNAL(readyChanged(bool)), this, SLOT(updateVideoRenderer())); } if (videoOutput) { connect(videoOutput, SIGNAL(sinkChanged()), this, SLOT(updateVideoRenderer())); connect(videoOutput, SIGNAL(readyChanged(bool)), this, SLOT(updateVideoRenderer())); } m_videoOutput = videoOutput; } QGstreamerVideoRendererInterface* renderer = qobject_cast<QGstreamerVideoRendererInterface*>(videoOutput); m_renderer = renderer; #ifdef DEBUG_VO_BIN_DUMP dumpNum++; _gst_debug_bin_to_dot_file(GST_BIN(m_playbin), GstDebugGraphDetails(GST_DEBUG_GRAPH_SHOW_ALL /* GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE | GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS | GST_DEBUG_GRAPH_SHOW_STATES*/), QString("playbin_%1_set").arg(dumpNum).toAscii().constData()); #endif GstElement *videoSink = m_renderer ? m_renderer->videoSink() : m_nullVideoSink; if (!videoSink) videoSink = m_nullVideoSink; #ifdef DEBUG_PLAYBIN qDebug() << "Set video output:" << videoOutput; qDebug() << "Current sink:" << (m_videoSink ? GST_ELEMENT_NAME(m_videoSink) : "") << m_videoSink << "pending:" << (m_pendingVideoSink ? GST_ELEMENT_NAME(m_pendingVideoSink) : "") << m_pendingVideoSink << "new sink:" << (videoSink ? GST_ELEMENT_NAME(videoSink) : "") << videoSink; #endif if (m_pendingVideoSink == videoSink || (m_pendingVideoSink == 0 && m_videoSink == videoSink)) { #ifdef DEBUG_PLAYBIN qDebug() << "Video sink has not changed, skip video output reconfiguration"; #endif return; } #ifdef DEBUG_PLAYBIN qDebug() << "Reconfigure video output"; #endif if (m_state == QMediaPlayer::StoppedState) { #ifdef DEBUG_PLAYBIN qDebug() << "The pipeline has not started yet, pending state:" << m_pendingState; #endif //the pipeline has not started yet m_pendingVideoSink = 0; gst_element_set_state(m_videoSink, GST_STATE_NULL); gst_element_set_state(m_playbin, GST_STATE_NULL); gst_element_unlink(m_videoIdentity, m_videoSink); gst_bin_remove(GST_BIN(m_videoOutputBin), m_videoSink); m_videoSink = videoSink; gst_bin_add(GST_BIN(m_videoOutputBin), m_videoSink); gst_element_link(m_videoIdentity, m_videoSink); switch (m_pendingState) { case QMediaPlayer::PausedState: gst_element_set_state(m_playbin, GST_STATE_PAUSED); break; case QMediaPlayer::PlayingState: gst_element_set_state(m_playbin, GST_STATE_PLAYING); break; default: break; } } else { if (m_pendingVideoSink) { #ifdef DEBUG_PLAYBIN qDebug() << "already waiting for pad to be blocked, just change the pending sink"; #endif m_pendingVideoSink = videoSink; return; } m_pendingVideoSink = videoSink; #ifdef DEBUG_PLAYBIN qDebug() << "Blocking the video output pad..."; #endif { #ifdef DEBUG_PLAYBIN qDebug() << "send the last new segment event to the video output..."; #endif GstEvent *event = gst_event_new_new_segment(TRUE, m_segment.rate, m_segment.format, m_segment.last_stop, //start m_segment.stop, m_segment.last_stop);//position GstPad *pad = gst_element_get_static_pad(videoSink, "sink"); //gst_pad_send_event(pad, m_lastSegmentEvent); gst_pad_send_event(pad, event); gst_object_unref(GST_OBJECT(pad)); } //block pads, async to avoid locking in paused state GstPad *srcPad = gst_element_get_static_pad(m_videoIdentity, "src"); gst_pad_set_blocked_async(srcPad, true, &block_pad_cb, this); gst_object_unref(GST_OBJECT(srcPad)); } }