1 /*****************************************************************************
2 * pda_callbacks.c : Callbacks for the pda Linux Gtk+ plugin.
3 *****************************************************************************
4 * Copyright (C) 2000, 2001 VideoLAN
5 * $Id: pda_callbacks.c,v 1.17 2003/11/25 20:41:35 jpsaman Exp $
7 * Authors: Jean-Paul Saman <jpsaman@wxs.nl>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
22 *****************************************************************************/
24 /*****************************************************************************
26 *****************************************************************************/
27 #include <sys/types.h> /* off_t */
47 #include "pda_callbacks.h"
48 #include "pda_interface.h"
49 #include "pda_support.h"
52 #define VLC_MAX_MRL 256
54 static char *get_file_perms(struct stat st);
56 /*****************************************************************************
57 * Useful function to retrieve p_intf
58 ****************************************************************************/
59 void * E_(__GtkGetIntf)( GtkWidget * widget )
63 if( GTK_IS_MENU_ITEM( widget ) )
65 /* Look for a GTK_MENU */
66 while( widget->parent && !GTK_IS_MENU( widget ) )
68 widget = widget->parent;
71 /* Maybe this one has the data */
72 p_data = gtk_object_get_data( GTK_OBJECT( widget ), "p_intf" );
78 /* Otherwise, the parent widget has it */
79 widget = gtk_menu_get_attach_widget( GTK_MENU( widget ) );
82 /* We look for the top widget */
83 widget = gtk_widget_get_toplevel( GTK_WIDGET( widget ) );
85 p_data = gtk_object_get_data( GTK_OBJECT( widget ), "p_intf" );
90 void PlaylistAddItem(GtkWidget *widget, gchar *name)
92 intf_thread_t *p_intf = GtkGetIntf( widget );
93 playlist_t *p_playlist;
94 GtkTreeView *p_tvplaylist = NULL;
96 p_playlist = (playlist_t *)
97 vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
99 if( p_playlist == NULL)
100 { /* Bail out when VLC's playlist object is not found. */
104 /* Add to playlist object. */
105 p_tvplaylist = (GtkTreeView *) lookup_widget( GTK_WIDGET(widget), "tvPlaylist");
108 GtkTreeModel *p_play_model;
109 GtkTreeIter p_play_iter;
111 p_play_model = gtk_tree_view_get_model(p_tvplaylist);
115 /* Add a new row to the playlist treeview model */
116 gtk_list_store_append (GTK_LIST_STORE(p_play_model), &p_play_iter);
117 gtk_list_store_set (GTK_LIST_STORE(p_play_model), &p_play_iter,
118 0, name, /* Add path to it !!! */
122 msg_Dbg( p_intf, "Adding files to playlist ...");
123 /* Add to VLC's playlist */
125 if (p_intf->p_sys->b_autoplayfile)
127 playlist_Add( p_playlist, (const char*)name, 0, 0,
128 PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END);
132 playlist_Add( p_playlist, (const char*)name, 0, 0,
133 PLAYLIST_APPEND, PLAYLIST_END );
137 vlc_object_release( p_playlist );
138 msg_Dbg( p_intf, "done");
143 void PlaylistRebuildListStore( GtkListStore * p_list, playlist_t * p_playlist )
147 gchar * ppsz_text[2];
153 vlc_mutex_lock( &p_playlist->object_lock );
154 for( i_dummy = p_playlist->i_size ; i_dummy-- ; )
156 ppsz_text[0] = p_playlist->pp_items[i_dummy]->psz_name;
157 ppsz_text[1] = "no info";
158 gtk_list_store_append (p_list, &iter);
159 gtk_list_store_set (p_list, &iter,
164 vlc_mutex_unlock( &p_playlist->object_lock );
167 /*****************************************************************
168 * Read directory helper function.
169 ****************************************************************/
170 void ReadDirectory(intf_thread_t *p_intf, GtkListStore *p_list, char *psz_dir )
173 struct dirent **namelist;
179 msg_Dbg(p_intf, "Changing to dir %s", psz_dir);
182 status = chdir(psz_dir);
184 msg_Dbg(p_intf, "permision denied" );
186 n = scandir(".", &namelist, 0, alphasort);
195 if (lstat("..", &st)==0)
198 pw = getpwuid(st.st_uid);
199 grp = getgrgid(st.st_gid);
201 /* XXX : kludge temporaire pour yopy */
203 ppsz_text[1] = get_file_perms(st);
204 ppsz_text[2] = pw->pw_name;
205 ppsz_text[3] = grp->gr_name;
207 /* Add a new row to the model */
208 gtk_list_store_append (p_list, &iter);
209 gtk_list_store_set (p_list, &iter,
217 if (ppsz_text[1]) free(ppsz_text[1]);
222 if ((namelist[i]->d_name[0] != '.') &&
223 (lstat(namelist[i]->d_name, &st)==0))
226 pw = getpwuid(st.st_uid);
227 grp = getgrgid(st.st_gid);
229 /* This is a list of strings. */
230 ppsz_text[0] = namelist[i]->d_name;
231 ppsz_text[1] = get_file_perms(st);
232 ppsz_text[2] = pw->pw_name;
233 ppsz_text[3] = grp->gr_name;
235 msg_Dbg(p_intf, "(%d) file: %s permission: %s user: %s group: %s", i, ppsz_text[0], ppsz_text[1], ppsz_text[2], ppsz_text[3] );
237 gtk_list_store_append (p_list, &iter);
238 gtk_list_store_set (p_list, &iter,
246 if (ppsz_text[1]) free(ppsz_text[1]);
253 static char *get_file_perms(const struct stat st)
257 perm = (char *) malloc(sizeof(char)*10);
258 strncpy( perm, "----------", sizeof("----------"));
260 /* determine permission modes */
261 if (S_ISLNK(st.st_mode))
263 else if (S_ISDIR(st.st_mode))
265 else if (S_ISCHR(st.st_mode))
267 else if (S_ISBLK(st.st_mode))
269 else if (S_ISFIFO(st.st_mode))
271 else if (S_ISSOCK(st.st_mode))
273 else if (S_ISREG(st.st_mode))
275 else /* Unknown type is an error */
277 /* Get file permissions */
279 if (st.st_mode & S_IRUSR)
281 if (st.st_mode & S_IWUSR)
283 if (st.st_mode & S_IXUSR)
285 if (st.st_mode & S_ISUID)
290 else if (st.st_mode & S_ISUID)
293 if (st.st_mode & S_IRGRP)
295 if (st.st_mode & S_IWGRP)
297 if (st.st_mode & S_IXGRP)
299 if (st.st_mode & S_ISGID)
304 else if (st.st_mode & S_ISGID)
307 if (st.st_mode & S_IROTH)
309 if (st.st_mode & S_IWOTH)
311 if (st.st_mode & S_IXOTH)
314 if (st.st_mode &S_ISVTX)
319 else if (st.st_mode &S_ISVTX)
326 * Main interface callbacks
330 onPDADeleteEvent (GtkWidget *widget,
334 intf_thread_t *p_intf = GtkGetIntf( widget );
336 msg_Dbg( p_intf, "about to exit vlc ... " );
337 vlc_mutex_lock( &p_intf->change_lock );
338 p_intf->p_vlc->b_die = VLC_TRUE;
339 vlc_mutex_unlock( &p_intf->change_lock );
340 msg_Dbg( p_intf, "about to exit vlc ... signalled" );
347 onRewind (GtkButton *button,
350 intf_thread_t * p_intf = GtkGetIntf( button );
352 if (p_intf->p_sys->p_input != NULL)
354 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_SLOWER );
360 onPause (GtkButton *button,
363 intf_thread_t * p_intf = GtkGetIntf( button );
365 if (p_intf->p_sys->p_input != NULL)
367 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_PAUSE );
373 onPlay (GtkButton *button,
376 intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET( button ) );
377 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
381 vlc_mutex_lock( &p_playlist->object_lock );
382 if (p_playlist->i_size)
384 vlc_mutex_unlock( &p_playlist->object_lock );
385 playlist_Play( p_playlist );
389 vlc_mutex_unlock( &p_playlist->object_lock );
391 vlc_object_release( p_playlist );
397 onStop (GtkButton *button,
400 intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET( button ) );
401 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
405 playlist_Stop( p_playlist );
406 vlc_object_release( p_playlist );
412 onForward (GtkButton *button,
415 intf_thread_t *p_intf = GtkGetIntf( button );
417 if (p_intf->p_sys->p_input != NULL)
419 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_FASTER );
425 onAbout (GtkButton *button,
428 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(button) );
431 if (p_intf->p_sys->p_notebook)
433 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
434 gtk_notebook_set_page(p_intf->p_sys->p_notebook,6);
440 SliderRelease (GtkWidget *widget,
441 GdkEventButton *event,
444 intf_thread_t *p_intf = GtkGetIntf( widget );
446 vlc_mutex_lock( &p_intf->change_lock );
447 p_intf->p_sys->b_slider_free = 1;
448 vlc_mutex_unlock( &p_intf->change_lock );
455 SliderPress (GtkWidget *widget,
456 GdkEventButton *event,
459 intf_thread_t *p_intf = GtkGetIntf( widget );
461 vlc_mutex_lock( &p_intf->change_lock );
462 p_intf->p_sys->b_slider_free = 0;
463 vlc_mutex_unlock( &p_intf->change_lock );
468 void addSelectedToPlaylist(GtkTreeModel *model,
475 gtk_tree_model_get(model, iter, 0, &filename, -1);
477 PlaylistAddItem(GTK_WIDGET(userdata), filename);
481 onFileListRow (GtkTreeView *treeview,
483 GtkTreeViewColumn *column,
486 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(treeview) );
487 GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
489 if (gtk_tree_selection_count_selected_rows(selection) == 1)
496 /* This might be a directory selection */
497 model = gtk_tree_view_get_model(treeview);
500 msg_Err(p_intf, "PDA: Filelist model contains a NULL pointer\n" );
503 if (!gtk_tree_model_get_iter(model, &iter, path))
505 msg_Err( p_intf, "PDA: Could not get iter from model" );
509 gtk_tree_model_get(model, &iter, 0, &filename, -1);
510 if (stat((char*)filename, &st)==0)
512 if (S_ISDIR(st.st_mode))
514 GtkListStore *p_model = NULL;
516 /* Get new directory listing */
517 p_model = gtk_list_store_new (5,
525 ReadDirectory(p_intf, p_model, filename);
527 /* Update TreeView with new model */
528 gtk_tree_view_set_model(treeview, (GtkTreeModel*) p_model);
529 g_object_unref(p_model);
534 gtk_tree_selection_selected_foreach(selection, (GtkTreeSelectionForeachFunc) &addSelectedToPlaylist, (gpointer) treeview);
540 gtk_tree_selection_selected_foreach(selection, (GtkTreeSelectionForeachFunc) &addSelectedToPlaylist, (gpointer) treeview);
545 onAddFileToPlaylist (GtkButton *button,
548 GtkTreeView *treeview = NULL;
550 treeview = (GtkTreeView *) lookup_widget( GTK_WIDGET(button), "tvFileList");
553 GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
555 gtk_tree_selection_selected_foreach(selection, (GtkTreeSelectionForeachFunc) &addSelectedToPlaylist, (gpointer) treeview);
561 NetworkBuildMRL (GtkEditable *editable,
564 GtkSpinButton *networkPort = NULL;
565 GtkEntry *entryMRL = NULL;
566 GtkEntry *networkType = NULL;
567 GtkEntry *networkAddress = NULL;
568 GtkEntry *networkProtocol = NULL;
569 const gchar *mrlNetworkType;
570 const gchar *mrlAddress;
571 const gchar *mrlProtocol;
573 char text[VLC_MAX_MRL];
576 entryMRL = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryMRL" );
578 networkType = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryNetworkType" );
579 networkAddress = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryNetworkAddress" );
580 networkPort = (GtkSpinButton*) lookup_widget( GTK_WIDGET(editable), "entryNetworkPort" );
581 networkProtocol = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryNetworkProtocolType" );
583 mrlNetworkType = gtk_entry_get_text(GTK_ENTRY(networkType));
584 mrlAddress = gtk_entry_get_text(GTK_ENTRY(networkAddress));
585 mrlPort = gtk_spin_button_get_value_as_int(networkPort);
586 mrlProtocol = gtk_entry_get_text(GTK_ENTRY(networkProtocol));
588 /* Build MRL from parts ;-) */
589 pos = snprintf( &text[0], VLC_MAX_MRL, "%s://", (char*)mrlProtocol);
590 if (strncasecmp( (char*)mrlNetworkType, "multicast",9)==0)
592 pos += snprintf( &text[pos], VLC_MAX_MRL - pos, "@" );
594 pos += snprintf( &text[pos], VLC_MAX_MRL - pos, "%s:%d", (char*)mrlAddress, (int)mrlPort );
596 if (pos >= VLC_MAX_MRL)
597 text[VLC_MAX_MRL-1]='\0';
599 gtk_entry_set_text(entryMRL,text);
603 onAddNetworkPlaylist (GtkButton *button,
606 GtkEntry *p_mrl = NULL;
607 const gchar *mrl_name;
609 p_mrl = (GtkEntry*) lookup_widget(GTK_WIDGET(button),"entryMRL" );
612 mrl_name = gtk_entry_get_text(p_mrl);
614 PlaylistAddItem(GTK_WIDGET(button), (gchar *)mrl_name);
620 onAddCameraToPlaylist (GtkButton *button,
623 intf_thread_t *p_intf = GtkGetIntf( button );
625 GtkSpinButton *entryV4LChannel = NULL;
626 GtkSpinButton *entryV4LFrequency = NULL;
627 GtkSpinButton *entryV4LSampleRate = NULL;
628 GtkSpinButton *entryV4LQuality = NULL;
629 GtkSpinButton *entryV4LTuner = NULL;
631 gint i_v4l_frequency;
632 gint i_v4l_samplerate;
636 GtkEntry *entryV4LVideoDevice = NULL;
637 GtkEntry *entryV4LAudioDevice = NULL;
638 GtkEntry *entryV4LNorm = NULL;
639 GtkEntry *entryV4LSize = NULL;
640 GtkEntry *entryV4LSoundDirection = NULL;
641 const gchar *p_v4l_video_device;
642 const gchar *p_v4l_audio_device;
643 const gchar *p_v4l_norm;
644 const gchar *p_v4l_size;
645 const gchar *p_v4l_sound_direction;
648 GtkCheckButton *checkV4LMJPEG = NULL;
649 GtkSpinButton *entryV4LDecimation = NULL;
650 gboolean b_v4l_mjpeg;
651 gint i_v4l_decimation;
654 char v4l_mrl[VLC_MAX_MRL];
657 pos = snprintf( &v4l_mrl[0], VLC_MAX_MRL, "v4l://");
659 entryV4LChannel = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LChannel" );
660 entryV4LFrequency = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LFrequency" );
661 entryV4LSampleRate = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LSampleRate" );
662 entryV4LQuality = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LQuality" );
663 entryV4LTuner = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LTuner" );
665 entryV4LVideoDevice = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LVideoDevice" );
666 entryV4LAudioDevice = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LAudioDevice" );
667 entryV4LNorm = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LNorm" );
668 entryV4LSize = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LSize" );
669 entryV4LSoundDirection = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LSoundDirection" );
671 i_v4l_channel = gtk_spin_button_get_value_as_int(entryV4LChannel);
672 i_v4l_frequency = gtk_spin_button_get_value_as_int(entryV4LFrequency);
673 i_v4l_samplerate = gtk_spin_button_get_value_as_int(entryV4LSampleRate);
674 i_v4l_quality = gtk_spin_button_get_value_as_int(entryV4LQuality);
675 i_v4l_tuner = gtk_spin_button_get_value_as_int(entryV4LTuner);
677 p_v4l_video_device = gtk_entry_get_text(GTK_ENTRY(entryV4LVideoDevice));
678 p_v4l_audio_device = gtk_entry_get_text(GTK_ENTRY(entryV4LAudioDevice));
679 p_v4l_norm = gtk_entry_get_text(GTK_ENTRY(entryV4LNorm));
680 p_v4l_size = gtk_entry_get_text(GTK_ENTRY(entryV4LSize));
681 p_v4l_sound_direction = gtk_entry_get_text(GTK_ENTRY(entryV4LSoundDirection));
683 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":%s", (char*)p_v4l_video_device );
684 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":adev=%s", (char*)p_v4l_audio_device );
685 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":norm=%s", (char*)p_v4l_norm );
686 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":size=%s", (char*)p_v4l_size );
687 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":%s", (char*)p_v4l_sound_direction );
689 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":channel=%d", (int)i_v4l_channel );
690 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":frequency=%d", (int)i_v4l_frequency );
691 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":samplerate=%d", (int)i_v4l_samplerate );
692 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":quality=%d", (int)i_v4l_quality );
693 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":tuner=%d", (int)i_v4l_tuner );
696 checkV4LMJPEG = (GtkCheckButton*) lookup_widget( GTK_WIDGET(button), "checkV4LMJPEG" );
697 b_v4l_mjpeg = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkV4LMJPEG));
700 entryV4LDecimation = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LDecimation" );
701 i_v4l_decimation = gtk_spin_button_get_value_as_int(entryV4LDecimation);
702 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":mjpeg:%d", (int)i_v4l_decimation );
706 if (pos >= VLC_MAX_MRL)
708 v4l_mrl[VLC_MAX_MRL-1]='\0';
709 msg_Err(p_intf, "Media Resource Locator is truncated to: %s", v4l_mrl);
712 PlaylistAddItem(GTK_WIDGET(button), (gchar*) &v4l_mrl);
717 PlaylistEvent (GtkWidget *widget,
726 onPlaylistColumnsChanged (GtkTreeView *treeview,
733 onPlaylistRowSelected (GtkTreeView *treeview,
734 gboolean start_editing,
742 onPlaylistRow (GtkTreeView *treeview,
744 GtkTreeViewColumn *column,
751 onUpdatePlaylist (GtkButton *button,
759 onDeletePlaylist (GtkButton *button,
767 onClearPlaylist (GtkButton *button,
770 intf_thread_t *p_intf = GtkGetIntf( button );
771 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
773 GtkTreeView *p_tvplaylist;
776 msg_Dbg(p_intf, "Clear VLC playlist" );
778 if( p_playlist == NULL )
783 vlc_mutex_lock( &p_playlist->object_lock );
784 for(item = p_playlist->i_size - 1 ; item >= 0 ; item-- )
786 playlist_Delete( p_playlist, item);
788 vlc_mutex_unlock( &p_playlist->object_lock );
789 vlc_object_release( p_playlist );
791 // Remove all entries from the Playlist widget.
792 msg_Dbg(p_intf, "Clear playlist widget" );
793 p_tvplaylist = (GtkTreeView*) lookup_widget( GTK_WIDGET(button), "tvPlaylist");
796 GtkTreeModel *p_play_model;
798 p_play_model = gtk_tree_view_get_model(p_tvplaylist);
801 gtk_list_store_clear(GTK_LIST_STORE(p_play_model));
808 onPreferenceSave (GtkButton *button,
811 intf_thread_t *p_intf = GtkGetIntf( button );
813 msg_Dbg(p_intf, "Preferences Save" );
818 onPreferenceApply (GtkButton *button,
821 intf_thread_t *p_intf = GtkGetIntf( button );
823 msg_Dbg(p_intf, "Preferences Apply" );
828 onPreferenceCancel (GtkButton *button,
831 intf_thread_t *p_intf = GtkGetIntf( button );
833 msg_Dbg(p_intf, "Preferences Cancel" );
838 onAddTranscodeToPlaylist (GtkButton *button,
841 intf_thread_t *p_intf = GtkGetIntf( button );
843 GtkEntry *entryVideoCodec = NULL;
844 GtkSpinButton *entryVideoBitrate = NULL;
845 GtkSpinButton *entryVideoBitrateTolerance = NULL;
846 GtkSpinButton *entryVideoKeyFrameInterval = NULL;
847 GtkCheckButton *checkVideoDeinterlace = NULL;
848 GtkEntry *entryAudioCodec = NULL;
849 GtkSpinButton *entryAudioBitrate = NULL;
850 const gchar *p_video_codec;
851 gint i_video_bitrate;
852 gint i_video_bitrate_tolerance;
853 gint i_video_keyframe_interval;
854 gboolean b_video_deinterlace;
855 const gchar *p_audio_codec;
856 gint i_audio_bitrate;
858 GtkEntry *entryStdAccess = NULL;
859 GtkEntry *entryStdMuxer = NULL;
860 GtkEntry *entryStdURL = NULL;
861 GtkSpinButton *entryStdTTL = NULL;
862 const gchar *p_std_access;
863 const gchar *p_std_muxer;
864 const gchar *p_std_url;
867 gchar mrl[VLC_MAX_MRL];
870 pos = snprintf( &mrl[0], VLC_MAX_MRL, "--sout '#transcode{");
872 entryVideoCodec = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryVideoCodec" );
873 entryVideoBitrate = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryVideoBitrate" );
874 entryVideoBitrateTolerance = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryVideoBitrateTolerance" );
875 entryVideoKeyFrameInterval = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryVideoKeyFrameInterval" );
877 p_video_codec = gtk_entry_get_text(GTK_ENTRY(entryVideoCodec));
878 i_video_bitrate = gtk_spin_button_get_value_as_int(entryVideoBitrate);
879 i_video_bitrate_tolerance = gtk_spin_button_get_value_as_int(entryVideoBitrateTolerance);
880 i_video_keyframe_interval = gtk_spin_button_get_value_as_int(entryVideoKeyFrameInterval);
882 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "vcodec=%s,", (char*)p_video_codec );
883 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "vb=%d,", (int)i_video_bitrate );
884 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "vt=%d,", (int)i_video_bitrate_tolerance );
885 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "keyint=%d,", (int)i_video_keyframe_interval );
887 checkVideoDeinterlace = (GtkCheckButton*) lookup_widget( GTK_WIDGET(button), "checkVideoDeinterlace" );
888 b_video_deinterlace = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkVideoDeinterlace));
889 if (b_video_deinterlace)
891 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "deinterlace," );
893 entryAudioCodec = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryAudioCodec" );
894 entryAudioBitrate = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryAudioBitrate" );
896 p_audio_codec = gtk_entry_get_text(GTK_ENTRY(entryAudioCodec));
897 i_audio_bitrate = gtk_spin_button_get_value_as_int(entryAudioBitrate);
899 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "acodec=%s,", (char*)p_audio_codec );
900 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "ab=%d", (int)i_audio_bitrate );
902 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "}:std{" );
904 entryStdAccess = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryStdAccess" );
905 entryStdMuxer = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryStdMuxer" );
906 entryStdURL = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryStdURL" );
907 entryStdTTL = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryStdTTL" );
909 p_std_access = gtk_entry_get_text(GTK_ENTRY(entryStdAccess));
910 p_std_muxer = gtk_entry_get_text(GTK_ENTRY(entryStdMuxer));
911 p_std_url = gtk_entry_get_text(GTK_ENTRY(entryStdURL));
913 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "access=%s,", (char*)p_std_access);
914 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "mux=%s,", (char*)p_std_muxer);
915 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "url=%s", (char*)p_std_url);
916 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "}'");
918 i_std_ttl = gtk_spin_button_get_value_as_int(entryStdTTL);
920 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, " --ttl=%d", (int)i_std_ttl);
922 if (pos >= VLC_MAX_MRL)
924 mrl[VLC_MAX_MRL-1]='\0';
925 msg_Err(p_intf, "Media Resource Locator is truncated to: %s", mrl );
928 PlaylistAddItem(GTK_WIDGET(button), (gchar*) &mrl);