bool GStreamerWrapper::seekFrame( gint64 iTargetTimeInNs )
{
	GstFormat gstFormat = GST_FORMAT_TIME;
	// The flags determine how the seek behaves, in this case we simply want to jump to certain part in stream
	// while keeping the pre-set speed and play direction
	GstSeekFlags gstSeekFlags = ( GstSeekFlags ) ( GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH );

	bool bIsSeekSuccessful = false;

	if ( m_PlayDirection == FORWARD )
	{
		bIsSeekSuccessful = gst_element_seek( GST_ELEMENT( m_GstPipeline ),
			m_fSpeed,
			gstFormat,
			gstSeekFlags,
			GST_SEEK_TYPE_SET,
			iTargetTimeInNs,
			GST_SEEK_TYPE_SET,
			m_iDurationInNs );
	}
	else if ( m_PlayDirection == BACKWARD )
	{
		bIsSeekSuccessful = gst_element_seek( GST_ELEMENT( m_GstPipeline ),
			-m_fSpeed,
			gstFormat,
			gstSeekFlags,
			GST_SEEK_TYPE_SET,
			0,
			GST_SEEK_TYPE_SET,
			iTargetTimeInNs );
	}

	return bIsSeekSuccessful;
}
bool GStreamerWrapper::changeSpeedAndDirection( float fSpeed, PlayDirection direction )
{
	GstFormat gstFormat = GST_FORMAT_TIME;
	// The flags determine how the seek behaves, in this case we stay at the current position in the stream but simply
	// want to change either speed, play direction or both
	GstSeekFlags gstSeekFlags = (GstSeekFlags)( GST_SEEK_FLAG_SKIP | GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH );

	bool bIsSeekSuccessful = false;

	if ( direction == FORWARD )
	{
		bIsSeekSuccessful = gst_element_seek( GST_ELEMENT( m_GstPipeline ),
			fSpeed,
			gstFormat,
			gstSeekFlags,
			GST_SEEK_TYPE_SET,
			getCurrentTimeInNs(),
			GST_SEEK_TYPE_SET,
			m_iDurationInNs );
	}
	else if ( direction == BACKWARD )
	{
		bIsSeekSuccessful = gst_element_seek( GST_ELEMENT( m_GstPipeline ),
			-fSpeed,
			gstFormat,
			gstSeekFlags,
			GST_SEEK_TYPE_SET,
			0,
			GST_SEEK_TYPE_SET,
			getCurrentTimeInNs() );
	}

	return bIsSeekSuccessful;
}
Beispiel #3
0
RESULT eServiceMP3::trickSeek(gdouble ratio)
{
	m_currentTrickRatio = ratio;

	if (!m_gst_playbin)
		return -1;
	if (ratio > -0.01 && ratio < 0.01)
	{
		gst_element_set_state(m_gst_playbin, GST_STATE_PAUSED);
		return 0;
	}

	gint64 pos;
	pts_t pts;
	getPlayPosition(pts);
	pos = pts * 11111LL;

	gst_element_set_state(m_gst_playbin, GST_STATE_PLAYING);

	if (ratio >= 0.0)
	{
		gst_element_seek(m_gst_playbin, ratio, GST_FORMAT_TIME, (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SKIP), GST_SEEK_TYPE_SET, pos, GST_SEEK_TYPE_SET, -1);
	}
	else
	{
		/* note that most elements will not support negative speed */
		gst_element_seek(m_gst_playbin, ratio, GST_FORMAT_TIME, (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SKIP), GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, pos);
	}

	m_subtitle_pages.clear();
	m_prev_decoder_time = -1;
	m_decoder_time_valid_state = 0;
	return 0;
}
Beispiel #4
0
void ofGstUtils::setPosition(float pct){
	//pct = CLAMP(pct, 0,1);// check between 0 and 1;
	GstFormat format = GST_FORMAT_TIME;
	GstSeekFlags flags = (GstSeekFlags) (GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE);
	gint64 pos = (guint64)((double)pct*(double)durationNanos);

	/*if(bPaused){
		seek_lock();
		gst_element_set_state (gstPipeline, GST_STATE_PLAYING);
		posChangingPaused=true;
		seek_unlock();
	}*/
	if(speed>0){
		if(!gst_element_seek(GST_ELEMENT(gstPipeline),speed, 	format,
				flags,
				GST_SEEK_TYPE_SET,
				pos,
				GST_SEEK_TYPE_SET,
				-1)) {
		ofLog(OF_LOG_WARNING,"GStreamer: unable to seek");
		}
	}else{
		if(!gst_element_seek(GST_ELEMENT(gstPipeline),speed, 	format,
				flags,
				GST_SEEK_TYPE_SET,
				0,
				GST_SEEK_TYPE_SET,
				pos)) {
		ofLog(OF_LOG_WARNING,"GStreamer: unable to seek");
		}
	}
}
void ofGstUtils::setSpeed(float _speed){
	GstFormat format = GST_FORMAT_TIME;
	GstSeekFlags flags = (GstSeekFlags) (GST_SEEK_FLAG_SKIP | GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH);
	gint64 pos;

	if(_speed==0){
		gst_element_set_state (gstPipeline, GST_STATE_PAUSED);
		return;
	}
#if GST_VERSION_MAJOR==0
	if(!gst_element_query_position(GST_ELEMENT(gstPipeline),&format,&pos) || pos<0){
		//ofLog(OF_LOG_ERROR,"GStreamer: cannot query position");
		return;
	}
#else
	if(!gst_element_query_position(GST_ELEMENT(gstPipeline),format,&pos) || pos<0){
		//ofLog(OF_LOG_ERROR,"GStreamer: cannot query position");
		return;
	}
#endif

	speed = _speed;
	//pos = (float)gstData.lastFrame * (float)fps_d / (float)fps_n * GST_SECOND;

	if(!bPaused)
		gst_element_set_state (gstPipeline, GST_STATE_PLAYING);

	if(speed>0){
		if(!gst_element_seek(GST_ELEMENT(gstPipeline),speed, 	format,
				flags,
				GST_SEEK_TYPE_SET,
				pos,
				GST_SEEK_TYPE_SET,
				-1)) {
		gLogManager.log("GStreamer: unable to change speed",ELL_WARNING);
		}
	}else{
		if(!gst_element_seek(GST_ELEMENT(gstPipeline),speed, 	format,
				flags,
				GST_SEEK_TYPE_SET,
				0,
				GST_SEEK_TYPE_SET,
				pos)) {
		gLogManager.log("GStreamer: unable to change speed",ELL_WARNING);
		}
	}

	gLogManager.log("Gstreamer: speed change to "+core::StringConverter::toString(speed),ELL_INFO);

}
Beispiel #6
0
void ofGstUtils::setSpeed(float _speed){
	GstFormat format = GST_FORMAT_TIME;
	GstSeekFlags flags = (GstSeekFlags) (GST_SEEK_FLAG_SKIP | GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH);
	gint64 pos;

	if(_speed==0){
		gst_element_set_state (gstPipeline, GST_STATE_PAUSED);
		return;
	}
#if GST_VERSION_MAJOR==0
	if(!gst_element_query_position(GST_ELEMENT(gstPipeline),&format,&pos) || pos<0){
		//ofLogError("ofGstUtils") << "setSpeed(): couldn't query position";
		return;
	}
#else
	if(!gst_element_query_position(GST_ELEMENT(gstPipeline),format,&pos) || pos<0){
		//ofLogError("ofGstUtils") << "setSpeed(): couldn't query position";
		return;
	}
#endif

	speed = _speed;
	//pos = (float)gstData.lastFrame * (float)fps_d / (float)fps_n * GST_SECOND;

	if(!bPaused)
		gst_element_set_state (gstPipeline, GST_STATE_PLAYING);

	if(speed>0){
		if(!gst_element_seek(GST_ELEMENT(gstPipeline),speed, 	format,
				flags,
				GST_SEEK_TYPE_SET,
				pos,
				GST_SEEK_TYPE_SET,
				-1)) {
			ofLogWarning("ofGstUtils") << "setSpeed(): unable to change speed";
		}
	}else{
		if(!gst_element_seek(GST_ELEMENT(gstPipeline),speed, 	format,
				flags,
				GST_SEEK_TYPE_SET,
				0,
				GST_SEEK_TYPE_SET,
				pos)) {
			ofLogWarning("ofGstUtils") << "setSpeed(): unable to change speed";
		}
	}

	ofLogVerbose("ofGstUtils") << "setSpeed(): speed changed to " << speed;

}
Beispiel #7
0
bool GstPipe::speed(gdouble speed) {
    g_debug("GstPipeliner::speed %f", speed);
    speed_ = speed;
    GstQuery *query;
    gboolean res;
    // query position
    query = gst_query_new_position(GST_FORMAT_TIME);
    res = gst_element_query(pipeline_, query);
    gint64 cur_pos = 0;
    if (res) {
        gst_query_parse_position(query, nullptr, &cur_pos);

        g_debug("cur pos = %" GST_TIME_FORMAT "\n", GST_TIME_ARGS(cur_pos));
    } else {
        g_warning("position query failed...");
    }
    gst_query_unref(query);
    gboolean ret;
    ret = gst_element_seek(pipeline_,
                           speed,
                           GST_FORMAT_TIME,
                           (GstSeekFlags) (GST_SEEK_FLAG_FLUSH |
                                           GST_SEEK_FLAG_ACCURATE),
                           GST_SEEK_TYPE_SET,
                           cur_pos, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);

    if (!ret)
        g_debug("speed not handled\n");
    return true;
}
Beispiel #8
0
/* 'pos' parameter is in milliseconds. */
int video_seek(int pos, int flags)
{
	gint64 len, cur;
	GstFormat fmt = GST_FORMAT_TIME;
	GstElement *sink = get_sink();

	if (!sink) return VIDEO_ERROR;
	
	if (!(gst_element_query(sink, GST_QUERY_POSITION, &fmt, &cur) &&
		  gst_element_query(sink, GST_QUERY_TOTAL, &fmt, &len))) 
		return VIDEO_ERROR;

	if (flags & VIDEO_SEEK_RELATIVE)
		cur += pos * GST_SECOND;
	else
		cur = pos * GST_SECOND;

	if (cur >= len) return video_stop();
	if (cur <= 0) cur = 0;
	
	if (!gst_element_seek(
			sink,
			GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH | GST_FORMAT_TIME,
			cur))
		return VIDEO_ERROR;

	return VIDEO_OK;
}
Beispiel #9
0
bool GstVideoPlayerBackend::setSpeed(double speed)
{
    if (!m_pipeline)
        return false;

    if (speed == m_playbackSpeed)
        return true;

    if (speed == 0)
        return false;

    gboolean re = gst_element_seek(m_pipeline, speed, GST_FORMAT_TIME,
                                   GstSeekFlags(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SKIP),
                                   GST_SEEK_TYPE_SET, position(), GST_SEEK_TYPE_SET, GST_CLOCK_TIME_NONE);

    if (!re)
    {
        qDebug() << "gstreamer: Setting playback speed failed";
        emit nonFatalError(tr("Playback speed failed"));
    }
    else
    {
        m_playbackSpeed = speed;
        m_lastspeed = speed;
        qDebug() << "gstreamer: set playback speed to" << m_playbackSpeed;
        emit playbackSpeedChanged(m_playbackSpeed);
    }

    return re ? true : false;
}
gboolean
gbp_player_seek (GbpPlayer *player, GstClockTime position, gdouble rate)
{
  GstFormat format;
  GstSeekFlags seek_flags;
  guint64 start, stop;

  g_return_val_if_fail (player != NULL, FALSE);

  if (!player->priv->have_pipeline)
    return FALSE;

  format = GST_FORMAT_TIME;
  seek_flags = GST_SEEK_FLAG_FLUSH;

  if (rate > 0) {
    start = position;
    stop = -1;
  } else {
    start = -1;
    stop = position;
  }

  return gst_element_seek (GST_ELEMENT (player->priv->pipeline), rate,
      format, seek_flags, GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET, stop);
}
bool VideoPlayerBackend::seek(qint64 position)
{
    if (!m_pipeline)
        return false;

    if (state() != Playing && state() != Paused)
    {
        qDebug() << "gstreamer: Stream is not playing or paused, ignoring seek";
        return false;
    }

    gboolean re = gst_element_seek(m_pipeline, m_playbackSpeed, GST_FORMAT_TIME,
                            (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SKIP |
                                           GST_SEEK_FLAG_KEY_UNIT /* removing this will seek between
                                                                   * keyframes, but is much slower */
                                           ),
                            GST_SEEK_TYPE_SET, position, GST_SEEK_TYPE_SET, GST_CLOCK_TIME_NONE);

    if (!re)
    {
        qDebug() << "gstreamer: seek to position" << position << "failed";
        emit nonFatalError(tr("Seeking failed"));
    }

    return re ? true : false;
}
/* Map the passed segment to 'internal' time from 0 to length of this piece and seek. Lock cannot be held */
static gboolean
gst_splitmux_part_reader_seek_to_segment (GstSplitMuxPartReader * reader,
    GstSegment * target_seg)
{
  GstSeekFlags flags;
  GstClockTime start = 0, stop = GST_CLOCK_TIME_NONE;

  flags = target_seg->flags | GST_SEEK_FLAG_FLUSH;

  SPLITMUX_PART_LOCK (reader);
  if (target_seg->start >= reader->start_offset)
    start = target_seg->start - reader->start_offset;
  /* If the segment stop is within this part, don't play to the end */
  if (target_seg->stop != -1 &&
      target_seg->stop < reader->start_offset + reader->duration)
    stop = target_seg->stop - reader->start_offset;

  SPLITMUX_PART_UNLOCK (reader);

  GST_DEBUG_OBJECT (reader,
      "Seeking rate %f format %d flags 0x%x start %" GST_TIME_FORMAT " stop %"
      GST_TIME_FORMAT, target_seg->rate, target_seg->format, flags,
      GST_TIME_ARGS (start), GST_TIME_ARGS (stop));

  return gst_element_seek (GST_ELEMENT_CAST (reader), target_seg->rate,
      target_seg->format, flags, GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET,
      stop);
}
static void
rb_audiocd_plugin_reuse_stream_cb (RBPlayer *player,
				   const char *new_uri,
				   const char *stream_uri,
				   GstElement *element,
				   RBAudioCdPlugin *plugin)
{
	GstFormat track_format = gst_format_get_by_nick ("track");
	char *track_str;
	char *new_device;
	guint track;
	guint cdda_len;

	/* get the new track number */
	cdda_len = strlen ("cdda://");
	new_device = g_utf8_strrchr (new_uri, -1, '#');
	track_str = g_strndup (new_uri + cdda_len, new_device - (new_uri + cdda_len));
	track = atoi (track_str);
	g_free (track_str);

	rb_debug ("seeking to track %d on CD device %s", track, new_device+1);

	gst_element_seek (element,
			  1.0, track_format, GST_SEEK_FLAG_FLUSH,
			  GST_SEEK_TYPE_SET, track-1,
			  GST_SEEK_TYPE_NONE, -1);
}
Beispiel #14
0
bool cPlayback::SetPosition(int position, bool absolute)
{
	if(playing == false) 
		return false;

#if defined (ENABLE_LIBEPLAYER3)
	float pos = (position/1000.0);

	if(player && player->playback)
		player->playback->Command(player, PLAYBACK_SEEK, (void*)&pos);
#endif

#if defined (ENABLE_GSTREAMER)
	gint64 time_nanoseconds;
	gint64 pos;
	GstFormat fmt = GST_FORMAT_TIME;
		
	if(m_gst_playbin)
	{
		gst_element_query_position(m_gst_playbin, &fmt, &pos);
		time_nanoseconds = pos + (position * 1000000000);
		if(time_nanoseconds < 0) time_nanoseconds = 0;
		gst_element_seek(m_gst_playbin, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, time_nanoseconds, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
	}
#endif

	return true;
}
//-------------------------------------------------------------------------------
// Name: GSTFastRewind
// Arguments: value (speed)
// Description: fast Rewind
// usage: object->GSTFastRewind(2);
//FIXME: not working
//-------------------------------------------------------------------------------
void GSTVideoControl::GSTFastRewind(float value)
{
	gint64 x;
	
	if (__bin)
	{
		x = GSTQueryPosition();
		
		GSTPause ();
		
		gst_element_seek (	__pipeline,
					-value,
					GST_FORMAT_TIME,
					GST_SEEK_FLAG_FLUSH,
					GST_SEEK_TYPE_SET, x,
					GST_SEEK_TYPE_NONE, 
					GST_CLOCK_TIME_NONE
				);
		GSTPlay ();	
	}
	
    	else
	{
		printf ("\nError: no BIN created\n");
	}
	

	return;
}
//-------------------------------------------------------------------------------
// Name: GSTSeekAbsolute
// Arguments: value (position in time - miliseconds)
// Description: seek to a determined value
// usage: object->GSTSeekAbsolute(1000); 
//-------------------------------------------------------------------------------
void GSTVideoControl::GSTSeekAbsolute(guint64 value)
{
	guint64 nanoseconds;
	nanoseconds = value * 1000 * 1000;
	if (__pipeline)
	{
		GSTPause ();
		
		gst_element_seek (	__pipeline, 
					1.0,
					GST_FORMAT_TIME,
					GST_SEEK_FLAG_FLUSH,
					GST_SEEK_TYPE_SET, 
					nanoseconds,
					GST_SEEK_TYPE_NONE, 
					GST_CLOCK_TIME_NONE
				);
				
		GSTPlay ();
	}
	
    	else
	{
		printf ("\nError: no pipeline created\n");
	}
	
	
	return;
}
Beispiel #17
0
/**
 * ly_aud_set_position:
 * @percent: The desire position you want to seek, it should be between 0 and 1.
 *
 * Seek.
 *
 * Returns:	TRUE for success, others FALSE.
 */
gboolean
ly_aud_set_position(gdouble percent)
{
	LyMdhMetadata *md=ly_pqm_get_current_md();
	if(!md)
		return FALSE;
		GstElement *play=ly_ppl_get_playbin();
	if(!play)
		return FALSE;

	gint64 position=0;
	gint64 start=0;
	gint64 duration=0;

	duration=ly_mdh_time_str2int(md->duration);
	if(duration<10)
	{
		return FALSE;
	}
	start=ly_mdh_time_str2int(md->start);

	position=(duration*percent)+start;
	if(!gst_element_seek(play,1.0,GST_FORMAT_TIME,GST_SEEK_FLAG_FLUSH,GST_SEEK_TYPE_SET,position,GST_SEEK_TYPE_SET,start+duration))
	{
		g_critical(_("Cannot seek to desired position!"));
		return FALSE;
	}

	return TRUE;
}
Beispiel #18
0
static void
position_value_changed_cb (GtkAdjustment *adjustment,
			   gpointer       user_data)
{
	GthMediaViewerPage *self = user_data;
	gint64              current_value;
	char               *s;

	if (self->priv->playbin == NULL)
		return;

	current_value = (gint64) (gtk_adjustment_get_value (adjustment) / 100.0 * self->priv->duration);
	gst_element_seek (self->priv->playbin,
			  self->priv->rate,
			  GST_FORMAT_TIME,
			  GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT,
			  GST_SEEK_TYPE_SET,
			  current_value,
			  GST_SEEK_TYPE_NONE,
			  0.0);

	s = _g_format_duration_for_display (GST_TIME_AS_MSECONDS (current_value));
	gtk_label_set_text (GTK_LABEL (GET_WIDGET ("label_position")), s);

	g_free (s);
}
Beispiel #19
0
static void
update_player_rate (GthMediaViewerPage *self)
{
	gint64 current_value;

	self->priv->rate = CLAMP (self->priv->rate,
				  default_rates[0],
				  default_rates[G_N_ELEMENTS (default_rates) - 1]);

	if (self->priv->playbin == NULL)
		return;

	update_playback_info (self);

	if (! self->priv->playing)
		return;

	current_value = (gint64) (gtk_adjustment_get_value (GTK_ADJUSTMENT (GET_WIDGET ("position_adjustment"))) / 100.0 * self->priv->duration);
	if (! gst_element_seek (self->priv->playbin,
				self->priv->rate,
			        GST_FORMAT_TIME,
			        GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
			        GST_SEEK_TYPE_SET,
			        current_value,
			        GST_SEEK_TYPE_NONE,
			        0.0))
	{
		g_warning ("seek failed");
	}
}
Beispiel #20
0
// set the position of the media file
void gst_binding_set_position (gstPlay *play, gint64 time_sec, float speed) {
	if (!isValid (play)) return;
	
	gst_element_seek (play->element, speed, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
					  GST_SEEK_TYPE_SET, time_sec * GST_MSECOND,
					  GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
}
Beispiel #21
0
// set the position of the media file
void gst_binding_set_track (gstPlay *play, gint64 track_number, float speed) {
	if (!isValid (play)) return;
	
	gst_element_seek (play->element, speed, gst_format_get_by_nick ("track"),
	      GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, track_number - 1,
	      GST_SEEK_TYPE_NONE, -1);
}
Beispiel #22
0
static void
test_reset_on_seek (BT_TEST_ARGS)
{
  BT_TEST_START;
  GST_INFO ("-- arrange --");
  GstElement *p =
      gst_parse_launch
      ("buzztrax-test-audio-synth name=\"src\" ! fakesink async=false", NULL);
  BtTestAudioSynth *e =
      (BtTestAudioSynth *) gst_bin_get_by_name (GST_BIN (p), "src");
  GstBus *bus = gst_element_get_bus (p);

  GST_INFO ("-- act --");
  gst_element_set_state (p, GST_STATE_PAUSED);
  gst_element_get_state (p, NULL, NULL, GST_CLOCK_TIME_NONE);
  gst_element_seek (p, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
      GST_SEEK_TYPE_SET, GST_MSECOND * 100,
      GST_SEEK_TYPE_SET, GST_MSECOND * 200);
  gst_element_set_state (p, GST_STATE_PLAYING);
  gst_element_get_state (p, NULL, NULL, GST_CLOCK_TIME_NONE);
  gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, GST_CLOCK_TIME_NONE);

  GST_INFO ("-- assert --");
  ck_assert_int_eq (e->num_disconts, 1);

  GST_INFO ("-- cleanup --");
  gst_element_set_state (p, GST_STATE_NULL);
  gst_object_unref (e);
  gst_object_unref (p);
  BT_TEST_END;
}
Beispiel #23
0
void
gst_seek_absolute(guint64 value) {
    gst_element_seek(pipeline, 1.0,
            GST_FORMAT_TIME,
            GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT,
            GST_SEEK_TYPE_SET, value,
            GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
}
Beispiel #24
0
bool CGstDecoder::Seek(GstElement *element)
{
  if (!gst_element_seek (m_pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
                         GST_SEEK_TYPE_NONE, 0,
                         GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) {
    g_print ("Seek failed!\n");
	}
}
Beispiel #25
0
void
gst_seek(gint value) {
    gst_element_seek(pipeline, 1.0,
            GST_FORMAT_TIME,
            GST_SEEK_FLAG_ACCURATE | GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT,
            GST_SEEK_TYPE_CUR, value * GST_SECOND,
            GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
}
Beispiel #26
0
void ofGstUtils::setSpeed(float _speed){


	GstFormat format = GST_FORMAT_TIME;
	GstSeekFlags flags = (GstSeekFlags) (GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SKIP | GST_SEEK_FLAG_ACCURATE);
	gint64 pos;

	if(_speed==0){
		gst_element_set_state (gstPipeline, GST_STATE_PAUSED);
		return;
	}

	if(!gst_element_query_position(GST_ELEMENT(gstPipeline),&format,&pos) || pos<0){
		//ofLog(OF_LOG_ERROR,"GStreamer: cannot query position");
		return;
	}

	speed 				= _speed;
	//pos = (float)gstData.lastFrame * (float)fps_d / (float)fps_n * GST_SECOND;

	if(!bPaused)
		gst_element_set_state (gstPipeline, GST_STATE_PLAYING);

	if(speed>0){
		if(!gst_element_seek(GST_ELEMENT(gstPipeline),speed, 	format,
				flags,
				GST_SEEK_TYPE_SET,
				pos,
				GST_SEEK_TYPE_SET,
				-1)) {
		ofLog(OF_LOG_WARNING,"GStreamer: unable to change speed");
		}
	}else{
		if(!gst_element_seek(GST_ELEMENT(gstPipeline),speed, 	format,
				flags,
				GST_SEEK_TYPE_SET,
				0,
				GST_SEEK_TYPE_SET,
				pos)) {
		ofLog(OF_LOG_WARNING,"GStreamer: unable to change speed");
		}
	}

	ofLog(OF_LOG_VERBOSE,"Gstreamer: speed change to %f", speed);

}
P_INVOKE void
bp_dvd_go_to_previous_chapter (BansheePlayer *player)
{
    gint64 index;
    GstFormat format = gst_format_get_by_nick ("chapter");
    gst_element_query_position (player->playbin, format, &index);
    gst_element_seek (player->playbin, 1.0, format, GST_SEEK_FLAG_FLUSH,
        GST_SEEK_TYPE_SET, index - 1, GST_SEEK_TYPE_NONE, 0);
}
Beispiel #28
0
static GdkPixbuf *
gst_thumbnailer_capture_interesting_frame (GstElement   *play,
                                           gint64        duration,
                                           gint          width,
                                           GCancellable *cancellable)
{
  GdkPixbuf     *pixbuf = NULL;
  guint          n;
  const gdouble  offsets[] = { 1.0 / 3.0, 2.0 / 3.0, 0.1, 0.9, 0.5 };
  gint64         seek_time;

  /* video has no duration, capture 1st frame */
  if (duration == -1)
    {
      if (!g_cancellable_is_cancelled (cancellable))
        return gst_thumbnailer_capture_frame (play, width);
      else
        return NULL;
    }

  for (n = 0; n < G_N_ELEMENTS (offsets); n++)
    {
      /* check if we should abort */
      if (g_cancellable_is_cancelled (cancellable))
        break;

      /* seek to offset */
      seek_time = offsets[n] * duration;
      gst_element_seek (play, 1.0,
                        GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT,
                        GST_SEEK_TYPE_SET, seek_time * GST_MSECOND,
                        GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);

      /* wait for the seek to complete */
      gst_element_get_state (play, NULL, NULL, GST_CLOCK_TIME_NONE);

      /* check if we should abort */
      if (g_cancellable_is_cancelled (cancellable))
        break;

      /* get the frame */
      pixbuf = gst_thumbnailer_capture_frame (play, width);
      if (pixbuf == NULL)
        continue;

      /* check if image is interesting or end of loop */
      if (n + 1 == G_N_ELEMENTS (offsets)
          || gst_thumbnailer_pixbuf_interesting (pixbuf))
        break;

      /* continue looking for something better */
      g_object_unref (pixbuf);
      pixbuf = NULL;
    }

  return pixbuf;
}
Beispiel #29
0
void Player::setPosition(QTime position)
{
        int time_milliseconds=QTime(0,0).msecsTo(position);
        gint64 time_nanoseconds=( time_milliseconds * GST_MSECOND );
        gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
                                 GST_SEEK_TYPE_SET, time_nanoseconds,
                                 GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
        m_position=time_milliseconds;
        emit positionChanged();
}
Beispiel #30
0
bool PlayerGst::play()
{
	GstElement *p = pipeline;
	if(usePlaybin) p = gst_bin_get_by_name(GST_BIN(pipeline), "playbin");
	if(Glength) gst_element_seek(p, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, Gstart, GST_SEEK_TYPE_SET, Gstart + Glength);
	//sync_set_state(player, GST_STATE_PLAYING);
	gst_element_set_state (GST_ELEMENT (p), GST_STATE_PLAYING);
	timer->start(TIME);
	if(usePlaybin) gst_object_unref(p);
    return true;
}