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; }
void NPlaybackEngineVlc::setPosition(qreal pos) { if (!hasMedia() || pos < 0) return; libvlc_media_player_set_position(m_mediaPlayer, qBound(0.0, pos, 1.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; }
void NPlaybackEngineVlc::stop() { if (!hasMedia()) return; libvlc_media_player_stop(m_mediaPlayer); }
qreal NPlaybackEngineVlc::position() const { if (!hasMedia()) return -1; return libvlc_media_player_get_position(m_mediaPlayer); }
void NPlaybackEngineVlc::pause() { if (!hasMedia()) return; libvlc_media_player_set_pause(m_mediaPlayer, true); }
qint64 NPlaybackEngineVlc::durationMsec() const { if (!hasMedia()) return -1; return libvlc_media_player_get_length(m_mediaPlayer); }
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); }
void NPlaybackEngineGStreamer::stop() { if (!hasMedia()) return; m_crossfading = false; gst_element_set_state(m_playbin, GST_STATE_NULL); }
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); }
void NPlaybackEngineVlc::play() { if (!hasMedia()) return; if (!libvlc_media_player_is_playing(m_mediaPlayer)) libvlc_media_player_play(m_mediaPlayer); else pause(); }
void NPlaybackEngineGStreamer::pause() { if (!hasMedia()) return; gst_element_set_state(m_playbin, GST_STATE_PAUSED); m_timer->stop(); checkStatus(); }
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; }
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; } }
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(); } }
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; }
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(); }