コード例 #1
0
S32 LLTextureEntry::setMediaFlags(U8 media_flags)
{
	media_flags &= TEM_MEDIA_MASK;
	if (getMediaFlags() != media_flags)
	{
		mMediaFlags &= ~TEM_MEDIA_MASK;
		mMediaFlags |= media_flags;

#ifdef MEDIA_ON_PRIM
		// Special code for media handling
		if (hasMedia() && mMediaEntry == NULL)
		{
			mMediaEntry = new LLMediaEntry;
		}
        else if (!hasMedia() && mMediaEntry != NULL)
        {
            delete mMediaEntry;
            mMediaEntry = NULL;
        }

		return TEM_CHANGE_MEDIA;
#else
		return TEM_CHANGE_TEXTURE;
#endif
	}
	return TEM_CHANGE_NONE;
}
コード例 #2
0
ファイル: playbackEngineVlc.cpp プロジェクト: nulloy/nulloy
void NPlaybackEngineVlc::setPosition(qreal pos)
{
    if (!hasMedia() || pos < 0)
        return;

    libvlc_media_player_set_position(m_mediaPlayer, qBound(0.0, pos, 1.0));
}
コード例 #3
0
void LLTextureEntry::asLLSD(LLSD& sd) const
{
	sd["imageid"] = mID;
	sd["colors"] = ll_sd_from_color4(mColor);
	sd["scales"] = mScaleS;
	sd["scalet"] = mScaleT;
	sd["offsets"] = mOffsetS;
	sd["offsett"] = mOffsetT;
	sd["imagerot"] = mRotation;
	sd["bump"] = getBumpShiny();
	sd["fullbright"] = getFullbright();
	sd["media_flags"] = mMediaFlags;
#ifdef MEDIA_ON_PRIM
	if (hasMedia())
	{
		LLSD mediaData;
        if (NULL != getMediaData())
		{
            getMediaData()->asLLSD(mediaData);
        }
		sd[TEXTURE_MEDIA_DATA_KEY] = mediaData;
	}
#endif
	sd["glow"] = mGlow;
}
コード例 #4
0
ファイル: playbackEngineVlc.cpp プロジェクト: nulloy/nulloy
void NPlaybackEngineVlc::stop()
{
    if (!hasMedia())
        return;

    libvlc_media_player_stop(m_mediaPlayer);
}
コード例 #5
0
ファイル: playbackEngineVlc.cpp プロジェクト: nulloy/nulloy
qreal NPlaybackEngineVlc::position() const
{
    if (!hasMedia())
        return -1;

    return libvlc_media_player_get_position(m_mediaPlayer);
}
コード例 #6
0
ファイル: playbackEngineVlc.cpp プロジェクト: nulloy/nulloy
void NPlaybackEngineVlc::pause()
{
    if (!hasMedia())
        return;

    libvlc_media_player_set_pause(m_mediaPlayer, true);
}
コード例 #7
0
ファイル: playbackEngineVlc.cpp プロジェクト: nulloy/nulloy
qint64 NPlaybackEngineVlc::durationMsec() const
{
    if (!hasMedia())
        return -1;

    return libvlc_media_player_get_length(m_mediaPlayer);
}
コード例 #8
0
ファイル: playbackEngineVlc.cpp プロジェクト: nulloy/nulloy
void NPlaybackEngineVlc::jump(qint64 msec)
{
    if (!hasMedia() || !libvlc_media_player_is_seekable(m_mediaPlayer))
        return;

    qint64 posMsec = qBound(0LL, libvlc_media_player_get_time(m_mediaPlayer) + msec, durationMsec());
    libvlc_media_player_set_time(m_mediaPlayer, posMsec);
}
コード例 #9
0
void NPlaybackEngineGStreamer::stop()
{
	if (!hasMedia())
		return;

	m_crossfading = false;
	gst_element_set_state(m_playbin, GST_STATE_NULL);
}
コード例 #10
0
void NPlaybackEngineGStreamer::jump(qint64 msec)
{
	if (!hasMedia())
		return;

	gst_element_seek_simple(m_playbin, GST_FORMAT_TIME,
	                        GstSeekFlags(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT),
	                        position() * m_durationNsec + msec * NSEC_IN_MSEC);
}
コード例 #11
0
ファイル: playbackEngineVlc.cpp プロジェクト: nulloy/nulloy
void NPlaybackEngineVlc::play()
{
    if (!hasMedia())
        return;

    if (!libvlc_media_player_is_playing(m_mediaPlayer))
        libvlc_media_player_play(m_mediaPlayer);
    else
        pause();
}
コード例 #12
0
void NPlaybackEngineGStreamer::pause()
{
	if (!hasMedia())
		return;

	gst_element_set_state(m_playbin, GST_STATE_PAUSED);

	m_timer->stop();
	checkStatus();
}
コード例 #13
0
S32 LLTextureEntry::setMediaTexGen(U8 media)
{
	if (mMediaFlags != media)
	{
		mMediaFlags = media;

		// Special code for media handling
		if( hasMedia() && mMediaEntry == NULL)
		{
			mMediaEntry = new LLMediaEntry;
		}
        else if ( ! hasMedia() && mMediaEntry != NULL)
        {
            delete mMediaEntry;
            mMediaEntry = NULL;
        }

		return TEM_CHANGE_MEDIA;
	}
	return TEM_CHANGE_NONE;
}
コード例 #14
0
void NPlaybackEngineGStreamer::setPosition(qreal pos)
{
	if (!hasMedia() || pos < 0 || pos > 1)
		return;

	if (m_durationNsec > 0) {
		gst_element_seek_simple(m_playbin, GST_FORMAT_TIME,
		                        GstSeekFlags(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT),
		                        pos * m_durationNsec);
	} else {
		m_posponedPosition = pos;
	}
}
コード例 #15
0
void NPlaybackEngineGStreamer::play()
{
	if (!hasMedia() || m_crossfading)
		return;

	GstState gstState;
	gst_element_get_state(m_playbin, &gstState, NULL, 0);
	if (gstState != GST_STATE_PLAYING) {
		gst_element_set_state(m_playbin, GST_STATE_PLAYING);
		m_timer->start(100);
	} else {
		pause();
	}
}
コード例 #16
0
bool LLTextureEntry::fromLLSD(const LLSD& sd)
{
	const char *w, *x;
	w = "imageid";
	if (sd.has(w))
	{
		setID( sd[w] );
	} else goto fail;
	w = "colors";
	if (sd.has(w))
	{
		setColor( ll_color4_from_sd(sd["colors"]) );
	} else goto fail;
	w = "scales";
	x = "scalet";
	if (sd.has(w) && sd.has(x))
	{
		setScale( (F32)sd[w].asReal(), (F32)sd[x].asReal() );
	} else goto fail;
	w = "offsets";
	x = "offsett";
	if (sd.has(w) && sd.has(x))
	{
		setOffset( (F32)sd[w].asReal(), (F32)sd[x].asReal() );
	} else goto fail;
	w = "imagerot";
	if (sd.has(w))
	{
		setRotation( (F32)sd[w].asReal() );
	} else goto fail;
	w = "bump";
	if (sd.has(w))
	{
		setBumpShiny( sd[w].asInteger() );
	} else goto fail;
	w = "fullbright";
	if (sd.has(w))
	{
		setFullbright( sd[w].asInteger() );
	} else goto fail;
	w = "media_flags";
	if (sd.has(w))
	{
		setMediaTexGen( sd[w].asInteger() );
	} else goto fail;
	// If the "has media" flag doesn't match the fact that 
	// media data exists, updateMediaData will "fix" it
	// by either clearing or setting the flag
	w = TEXTURE_MEDIA_DATA_KEY;
	if (hasMedia() != sd.has(w))
	{
		llwarns << "LLTextureEntry::fromLLSD: media_flags (" << hasMedia() <<
			") does not match presence of media_data (" << sd.has(w) << ").  Fixing." << llendl;
	}
	updateMediaData(sd[w]);

	w = "glow";
	if (sd.has(w))
	{
		setGlow((F32)sd[w].asReal() );
	}

	return true;
fail:
	return false;
}
コード例 #17
0
void NPlaybackEngineGStreamer::checkStatus()
{
	GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(m_playbin));
	GstMessage *msg;
	while ((msg = gst_bus_pop_filtered(bus, GstMessageType(GST_MESSAGE_EOS | GST_MESSAGE_ERROR))) != NULL) {
		switch (GST_MESSAGE_TYPE(msg)) {
			case GST_MESSAGE_EOS: {
				stop();
				emit finished();
				emit stateChanged(m_oldState = N::PlaybackStopped);
				break;
			}
			case GST_MESSAGE_ERROR: {
				gchar *debug;
				GError *err = NULL;
				gst_message_parse_error(msg, &err, &debug);
				g_free(debug);

				emit message(QMessageBox::Critical, QFileInfo(m_currentMedia).absoluteFilePath(), err ? QString::fromUtf8(err->message) : "unknown error");
				fail();

				if (err)
					g_error_free(err);
				break;
			}
			default:
				break;
		}
		gst_message_unref(msg);
	}
	gst_object_unref(bus);

	GstState gstState;
	if (gst_element_get_state(m_playbin, &gstState, NULL, 0) != GST_STATE_CHANGE_SUCCESS)
		return;

	N::PlaybackState state = fromGstState(gstState);
	if (m_oldState != state)
		emit stateChanged(m_oldState = state);

	if (state == N::PlaybackPlaying || state == N::PlaybackPaused) {
		// duration may change for some reason
		// TODO use DURATION_CHANGED in gstreamer1.0
		gboolean res = gst_element_query_duration(m_playbin, GST_FORMAT_TIME, &m_durationNsec);
		if (!res)
			m_durationNsec = 0;
	}

	if (m_posponedPosition >= 0 && m_durationNsec > 0) {
		setPosition(m_posponedPosition);
		m_posponedPosition = -1;
		emit positionChanged(m_posponedPosition);
	} else {
		qreal pos;
		gint64 gstPos = 0;

		if (!hasMedia() || m_durationNsec <= 0) {
			pos = -1;
		} else {
			gboolean res = gst_element_query_position(m_playbin, GST_FORMAT_TIME, &gstPos);
			if (!res)
				gstPos = 0;
			pos = (qreal)gstPos / m_durationNsec;
		}

		if (m_oldPosition != pos) {
			if (m_oldPosition > pos)
				m_crossfading = false;
			m_oldPosition = pos;
			emit positionChanged(m_crossfading ? 0 : m_oldPosition);
		}

		emit tick(m_crossfading ? 0 : gstPos / NSEC_IN_MSEC);
	}

	qreal vol = volume();
	if (qAbs(m_oldVolume - vol) > 0.0001) {
		m_oldVolume = vol;
		emit volumeChanged(vol);
	}

	if (state == N::PlaybackStopped)
		m_timer->stop();
}