From a337a2bf6f25dbceb92ebcc0744c0697ad5398e4 Mon Sep 17 00:00:00 2001 From: Mrinmayee Hingolikar Date: Wed, 9 Jan 2013 01:51:30 +0530 Subject: [PATCH] Implemented forward and rewind. --- include/gui.h | 4 +- src/gui.c | 135 +++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 119 insertions(+), 20 deletions(-) diff --git a/include/gui.h b/include/gui.h index 7efd2b4..4662a71 100644 --- a/include/gui.h +++ b/include/gui.h @@ -115,7 +115,7 @@ typedef struct{ #define DECODER_INDEX_SINGLE 0 #define DECODER_INDEX_DOUBLE 1 -/*ratio of scrren size per window*/ +/*ratio of screen size per window*/ #define SCREEN_WIDTH_FACTOR 3 #define SCREEN_HEIGHT_FACTOR 2 @@ -135,6 +135,8 @@ typedef struct{ #define TIME_LABEL_ORIGIN "--:--:--/--:--:--" +#define FORWARD 3000000000 +#define REWIND 3000000000 #define SWITCH_TEXT_SINGLE "Single Decode" #define SWITCH_TEXT_DUAL "Dual Decode" diff --git a/src/gui.c b/src/gui.c index db6bdd6..b3aed4e 100644 --- a/src/gui.c +++ b/src/gui.c @@ -1,5 +1,4 @@ /* - * Copyright (c) 2012-2013, Texas Instruments Incorporated * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -82,6 +81,8 @@ static gboolean cbOpenClicked (GtkWidget *widget, gpointer data); static gboolean cbPlayClicked (GtkWidget *widget, gpointer data); static gboolean cbPauseClicked (GtkWidget *widget, gpointer data); static gboolean cbStopClicked (GtkWidget *widget, gpointer data); +static gboolean cbForwardClicked (GtkWidget *widget, gpointer data); +static gboolean cbRewindClicked (GtkWidget *widget, gpointer data); static gboolean cbWindowClosed (GtkWidget *widget, gpointer data); static gboolean cbHelpClicked (GtkWidget *widget, gpointer data); static gboolean cbTimerInterval (gpointer data); @@ -324,15 +325,23 @@ static gboolean cbPlayClicked(GtkWidget *widget, gpointer data) SEEK_START); } }else{ - if(window[DECODER_INDEX_SINGLE] == thisWindow){ - setControlMode(window[DECODER_INDEX_SINGLE], + if (window[DECODER_INDEX_SINGLE] == thisWindow){ + setControlMode (window[DECODER_INDEX_SINGLE], CONTROL_MODE_PLAYING, window[DECODER_INDEX_SINGLE]->activeFlag); - if(GST_STATE_PAUSED == + if (GST_STATE_PAUSED == DualDecode_getMediaState(pipes[DECODER_INDEX_SINGLE])){ DualDecode_resumeMedia(pipes[DECODER_INDEX_SINGLE]); - }else{ - DualDecode_playMedia(pipes[DECODER_INDEX_SINGLE], + }else if (GST_STATE_READY == + DualDecode_getMediaState(pipes[DECODER_INDEX_SINGLE])){ + g_print ("\nPipeline state is READY\n"); + DualDecode_setPipelineSink (pipes[DECODER_INDEX_SINGLE], window[DECODER_INDEX_SINGLE]->sink, NULL); + DualDecode_playMedia (pipes[DECODER_INDEX_SINGLE], filename[0],0); + //DualDecode_seekMedia (pipes[DECODER_INDEX_SINGLE], 0); + } + + else { + DualDecode_playMedia(pipes[DECODER_INDEX_SINGLE], filename[DECODER_INDEX_SINGLE], SEEK_START); } @@ -343,7 +352,14 @@ static gboolean cbPlayClicked(GtkWidget *widget, gpointer data) if(GST_STATE_PAUSED == DualDecode_getMediaState(pipes[DECODER_INDEX_DOUBLE])){ DualDecode_resumeMedia(pipes[DECODER_INDEX_DOUBLE]); - }else{ + } + else if (GST_STATE_READY == + DualDecode_getMediaState(pipes[DECODER_INDEX_DOUBLE])){ + DualDecode_resumeMedia (pipes[DECODER_INDEX_DOUBLE]); + //DualDecode_seekMedia (pipes[DECODER_INDEX_SINGLE], 0); + } + + else{ DualDecode_playMedia(pipes[DECODER_INDEX_DOUBLE], filename[DECODER_INDEX_DOUBLE], SEEK_START); @@ -390,29 +406,104 @@ static gboolean cbStopClicked(GtkWidget *widget, gpointer data) GUIWindow *thisWindow = (GUIWindow *)data; - if(DECODE_MODE_SINGLE == decodeMode){ - setControlMode(window[DECODER_INDEX_SINGLE], + if (DECODE_MODE_SINGLE == decodeMode){ + setControlMode (window[DECODER_INDEX_SINGLE], CONTROL_MODE_STOPPED, window[DECODER_INDEX_SINGLE]->activeFlag); - setControlMode(window[DECODER_INDEX_DOUBLE], + setControlMode (window[DECODER_INDEX_DOUBLE], CONTROL_MODE_STOPPED, window[DECODER_INDEX_DOUBLE]->activeFlag); - DualDecode_stopMedia(pipes[DECODER_INDEX_SINGLE]); + DualDecode_stopMedia (pipes[DECODER_INDEX_SINGLE]); }else{ - if(window[DECODER_INDEX_SINGLE] == thisWindow){ + if (window[DECODER_INDEX_SINGLE] == thisWindow){ setControlMode(window[DECODER_INDEX_SINGLE], CONTROL_MODE_STOPPED, window[DECODER_INDEX_SINGLE]->activeFlag); DualDecode_stopMedia(pipes[DECODER_INDEX_SINGLE]); }else{ - setControlMode(window[DECODER_INDEX_DOUBLE], + setControlMode (window[DECODER_INDEX_DOUBLE], CONTROL_MODE_STOPPED, window[DECODER_INDEX_DOUBLE]->activeFlag); - DualDecode_stopMedia(pipes[DECODER_INDEX_DOUBLE]); + DualDecode_stopMedia (pipes[DECODER_INDEX_DOUBLE]); } } return ret; } +static gboolean cbForwardClicked(GtkWidget *widget, gpointer data) +{ + gboolean ret = TRUE; + GstFormat format = GST_FORMAT_TIME; + gint64 duration = 0; + gint64 seekPoint = 0; + GUIWindow *thisWindow = (GUIWindow *)data; + gdouble percent = gtk_range_get_value ((GtkRange *) (thisWindow->seekScale)); + + g_print ("IN FORWARD CLICKED\n"); + if (DECODE_MODE_SINGLE == decodeMode){ + + gst_element_query_duration (pipes[DECODER_INDEX_SINGLE]->pipe, + &format,&duration); + seekPoint = (duration * percent/ (gdouble)100)+ FORWARD; + g_print ("SEEK POINT %d\n", seekPoint); + ret = DualDecode_seekMedia(pipes[DECODER_INDEX_SINGLE], seekPoint); + } + else{ + if(window[DECODER_INDEX_SINGLE] == thisWindow){ + gst_element_query_duration (pipes[DECODER_INDEX_SINGLE]->pipe, + &format, &duration); + seekPoint = (duration * percent/ (gdouble)100) + FORWARD; + g_print ("SEEK POINT %d\n", seekPoint); + ret = DualDecode_seekMedia(pipes[DECODER_INDEX_SINGLE], seekPoint); + } + else { + gst_element_query_duration(pipes[DECODER_INDEX_SINGLE]->pipe, + &format,&duration); + seekPoint = (duration * percent/ (gdouble)100)+ FORWARD; + ret = DualDecode_seekMedia(pipes[DECODER_INDEX_DOUBLE], seekPoint); + } + } + + return ret; +} +static gboolean cbRewindClicked(GtkWidget *widget, gpointer data) +{ + gboolean ret = TRUE; + GstFormat format = GST_FORMAT_TIME; + gint64 duration = 0; + gint64 seekPoint = 0; + GUIWindow *thisWindow = (GUIWindow *)data; + gdouble percent = gtk_range_get_value ((GtkRange *) (thisWindow->seekScale)); + + g_print ("IN FORWARD CLICKED\n"); + if (DECODE_MODE_SINGLE == decodeMode){ + + gst_element_query_duration (pipes[DECODER_INDEX_SINGLE]->pipe, + &format,&duration); + seekPoint = (duration * percent/ (gdouble)100) - REWIND; + g_print ("SEEK POINT %d\n", seekPoint); + seekPoint = (seekPoint < 0) ? 0 : seekPoint; + ret = DualDecode_seekMedia(pipes[DECODER_INDEX_SINGLE], seekPoint); + } + else{ + if(window[DECODER_INDEX_SINGLE] == thisWindow){ + gst_element_query_duration (pipes[DECODER_INDEX_SINGLE]->pipe, + &format, &duration); + seekPoint = (duration * percent/ (gdouble)100) - REWIND; + g_print ("SEEK POINT %d\n", seekPoint); + seekPoint = (seekPoint < 0) ? 0 : seekPoint; + ret = DualDecode_seekMedia(pipes[DECODER_INDEX_SINGLE], seekPoint); + } + else { + gst_element_query_duration(pipes[DECODER_INDEX_SINGLE]->pipe, + &format,&duration); + seekPoint = (duration * percent/ (gdouble)100) - REWIND; + seekPoint = (seekPoint < 0) ? 0 : seekPoint; + ret = DualDecode_seekMedia(pipes[DECODER_INDEX_DOUBLE], seekPoint); + } + } + + return ret; +} static gboolean cbSwitchButtonClicked (GtkWidget *widget, gpointer data) { gboolean ret = TRUE; @@ -638,8 +729,8 @@ static void setup() { g_print ("SINK TO BE USED %s\n", sink); - gtk_widget_show_all(window[DECODER_INDEX_SINGLE]->window); - gtk_widget_show_all(window[DECODER_INDEX_DOUBLE]->window); + gtk_widget_show_all (window[DECODER_INDEX_SINGLE]->window); + gtk_widget_show_all (window[DECODER_INDEX_DOUBLE]->window); window[DECODER_INDEX_SINGLE]->sink = createImageSinkFromWindow ( window[DECODER_INDEX_SINGLE]->drawArea, @@ -656,8 +747,6 @@ static void setup() DualDecode_exitApplication(); } - //DualDecode_setSinksForPipes (pipes,window[DECODER_INDEX_SINGLE]->sink, - // window[DECODER_INDEX_DOUBLE]->sink); switch(decodeMode){ case DECODE_MODE_NONE: setControlMode(window[DECODER_INDEX_SINGLE], @@ -819,8 +908,16 @@ static GUIWindow *createWindow() "clicked", G_CALLBACK(cbPlayClicked), ret); + ret->forwardSignal = g_signal_connect(G_OBJECT(ret->forwardButton), + "clicked", + G_CALLBACK(cbForwardClicked), + ret); + ret->rewindSignal = g_signal_connect(G_OBJECT(ret->rewindButton), + "clicked", + G_CALLBACK(cbRewindClicked), + ret); - ret->playSignal = g_signal_connect(G_OBJECT(ret->helpButton), + ret->helpSignal = g_signal_connect(G_OBJECT(ret->helpButton), "clicked", G_CALLBACK(cbHelpClicked), ret); -- 2.39.2