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.15 2003/11/21 09:23:49 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 GtkTreeView *p_tvplaylist = NULL;
94 /* Add to playlist object. */
95 p_tvplaylist = (GtkTreeView *) lookup_widget( GTK_WIDGET(widget), "tvPlaylist");
98 GtkTreeModel *p_play_model;
99 GtkTreeIter p_play_iter;
101 p_play_model = gtk_tree_view_get_model(p_tvplaylist);
105 /* Add a new row to the playlist treeview model */
106 gtk_list_store_append (GTK_LIST_STORE(p_play_model), &p_play_iter);
107 gtk_list_store_set (GTK_LIST_STORE(p_play_model), &p_play_iter,
108 0, name, /* Add path to it !!! */
115 void PlaylistRebuildListStore( GtkListStore * p_list, playlist_t * p_playlist )
119 gchar * ppsz_text[2];
125 vlc_mutex_lock( &p_playlist->object_lock );
126 for( i_dummy = p_playlist->i_size ; i_dummy-- ; )
128 ppsz_text[0] = p_playlist->pp_items[i_dummy]->psz_name;
129 ppsz_text[1] = "no info";
130 gtk_list_store_append (p_list, &iter);
131 gtk_list_store_set (p_list, &iter,
136 vlc_mutex_unlock( &p_playlist->object_lock );
140 void MediaURLOpenChanged( GtkWidget *widget, gchar *psz_url )
142 intf_thread_t *p_intf = GtkGetIntf( widget );
143 playlist_t *p_playlist;
145 p_playlist = (playlist_t *)
146 vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
148 if( p_playlist == NULL)
155 if (p_intf->p_sys->b_autoplayfile)
157 playlist_Add( p_playlist, (char*)psz_url, 0, 0,
158 PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END);
162 playlist_Add( p_playlist, (char*)psz_url, 0, 0,
163 PLAYLIST_APPEND, PLAYLIST_END );
165 vlc_object_release( p_playlist );
167 PlaylistAddItem(GTK_WIDGET(widget), psz_url);
172 /*****************************************************************
173 * Read directory helper function.
174 ****************************************************************/
175 void ReadDirectory(intf_thread_t *p_intf, GtkListStore *p_list, char *psz_dir )
178 struct dirent **namelist;
184 msg_Dbg(p_intf, "Changing to dir %s", psz_dir);
187 status = chdir(psz_dir);
189 msg_Dbg(p_intf, "permision denied" );
191 n = scandir(".", &namelist, 0, alphasort);
200 if (lstat("..", &st)==0)
203 pw = getpwuid(st.st_uid);
204 grp = getgrgid(st.st_gid);
206 /* XXX : kludge temporaire pour yopy */
208 ppsz_text[1] = get_file_perms(st);
209 ppsz_text[2] = pw->pw_name;
210 ppsz_text[3] = grp->gr_name;
212 /* Add a new row to the model */
213 gtk_list_store_append (p_list, &iter);
214 gtk_list_store_set (p_list, &iter,
222 if (ppsz_text[1]) free(ppsz_text[1]);
227 if ((namelist[i]->d_name[0] != '.') &&
228 (lstat(namelist[i]->d_name, &st)==0))
231 pw = getpwuid(st.st_uid);
232 grp = getgrgid(st.st_gid);
234 /* This is a list of strings. */
235 ppsz_text[0] = namelist[i]->d_name;
236 ppsz_text[1] = get_file_perms(st);
237 ppsz_text[2] = pw->pw_name;
238 ppsz_text[3] = grp->gr_name;
240 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] );
242 gtk_list_store_append (p_list, &iter);
243 gtk_list_store_set (p_list, &iter,
251 if (ppsz_text[1]) free(ppsz_text[1]);
258 static char *get_file_perms(const struct stat st)
262 perm = (char *) malloc(sizeof(char)*10);
263 strncpy( perm, "----------", sizeof("----------"));
265 /* determine permission modes */
266 if (S_ISLNK(st.st_mode))
268 else if (S_ISDIR(st.st_mode))
270 else if (S_ISCHR(st.st_mode))
272 else if (S_ISBLK(st.st_mode))
274 else if (S_ISFIFO(st.st_mode))
276 else if (S_ISSOCK(st.st_mode))
278 else if (S_ISREG(st.st_mode))
280 else /* Unknown type is an error */
282 /* Get file permissions */
284 if (st.st_mode & S_IRUSR)
286 if (st.st_mode & S_IWUSR)
288 if (st.st_mode & S_IXUSR)
290 if (st.st_mode & S_ISUID)
295 else if (st.st_mode & S_ISUID)
298 if (st.st_mode & S_IRGRP)
300 if (st.st_mode & S_IWGRP)
302 if (st.st_mode & S_IXGRP)
304 if (st.st_mode & S_ISGID)
309 else if (st.st_mode & S_ISGID)
312 if (st.st_mode & S_IROTH)
314 if (st.st_mode & S_IWOTH)
316 if (st.st_mode & S_IXOTH)
319 if (st.st_mode &S_ISVTX)
324 else if (st.st_mode &S_ISVTX)
331 * Main interface callbacks
335 onPDADeleteEvent (GtkWidget *widget,
339 intf_thread_t *p_intf = GtkGetIntf( widget );
341 msg_Dbg( p_intf, "about to exit vlc ... " );
342 vlc_mutex_lock( &p_intf->change_lock );
343 p_intf->p_vlc->b_die = VLC_TRUE;
344 vlc_mutex_unlock( &p_intf->change_lock );
345 msg_Dbg( p_intf, "about to exit vlc ... signalled" );
352 onRewind (GtkButton *button,
355 intf_thread_t * p_intf = GtkGetIntf( button );
357 if (p_intf->p_sys->p_input != NULL)
359 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_SLOWER );
365 onPause (GtkButton *button,
368 intf_thread_t * p_intf = GtkGetIntf( button );
370 if (p_intf->p_sys->p_input != NULL)
372 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_PAUSE );
378 onPlay (GtkButton *button,
381 intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET( button ) );
382 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
386 vlc_mutex_lock( &p_playlist->object_lock );
387 if (p_playlist->i_size)
389 vlc_mutex_unlock( &p_playlist->object_lock );
390 playlist_Play( p_playlist );
394 vlc_mutex_unlock( &p_playlist->object_lock );
396 vlc_object_release( p_playlist );
402 onStop (GtkButton *button,
405 intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET( button ) );
406 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
410 playlist_Stop( p_playlist );
411 vlc_object_release( p_playlist );
417 onForward (GtkButton *button,
420 intf_thread_t *p_intf = GtkGetIntf( button );
422 if (p_intf->p_sys->p_input != NULL)
424 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_FASTER );
430 onAbout (GtkButton *button,
433 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(button) );
436 if (p_intf->p_sys->p_notebook)
438 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
439 gtk_notebook_set_page(p_intf->p_sys->p_notebook,6);
445 SliderRelease (GtkWidget *widget,
446 GdkEventButton *event,
449 intf_thread_t *p_intf = GtkGetIntf( widget );
451 vlc_mutex_lock( &p_intf->change_lock );
452 p_intf->p_sys->b_slider_free = 1;
453 vlc_mutex_unlock( &p_intf->change_lock );
460 SliderPress (GtkWidget *widget,
461 GdkEventButton *event,
464 intf_thread_t *p_intf = GtkGetIntf( widget );
466 vlc_mutex_lock( &p_intf->change_lock );
467 p_intf->p_sys->b_slider_free = 0;
468 vlc_mutex_unlock( &p_intf->change_lock );
473 void addSelectedToPlaylist(GtkTreeModel *model,
480 gtk_tree_model_get(model, iter, 0, &filename, -1);
482 PlaylistAddItem(GTK_WIDGET(userdata), filename);
486 onFileListRow (GtkTreeView *treeview,
488 GtkTreeViewColumn *column,
491 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(treeview) );
492 GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
494 if (gtk_tree_selection_count_selected_rows(selection) == 1)
501 /* This might be a directory selection */
502 model = gtk_tree_view_get_model(treeview);
504 msg_Err(p_intf, "PDA: Filelist model contains a NULL pointer\n" );
511 list = gtk_tree_selection_get_selected_rows(selection,model);
512 if (g_list_length(list) == 1)
514 filename = (gchar *) g_list_nth_data(list,0);
515 msg_Dbg(p_intf, "PDA: filename = %s", (gchar*) filename );
516 PlaylistAddItem(GTK_WIDGET(treeview), filename);
518 g_list_foreach (list, gtk_tree_path_free, NULL);
524 if (!gtk_tree_model_get_iter(model, &iter, path))
525 msg_Err( p_intf, "PDA: Could not get iter from model" );
527 gtk_tree_model_get(model, &iter, 0, &filename, -1);
529 if (stat((char*)filename, &st)==0)
531 if (S_ISDIR(st.st_mode))
533 GtkListStore *p_model = NULL;
535 /* Get new directory listing */
536 p_model = gtk_list_store_new (5,
544 ReadDirectory(p_intf, p_model, filename);
546 /* Update TreeView with new model */
547 gtk_tree_view_set_model(treeview, (GtkTreeModel*) p_model);
548 g_object_unref(p_model);
553 gtk_tree_selection_selected_foreach(selection, (GtkTreeSelectionForeachFunc) &addSelectedToPlaylist, (gpointer) treeview);
560 gtk_tree_selection_selected_foreach(selection, (GtkTreeSelectionForeachFunc) &addSelectedToPlaylist, (gpointer) treeview);
565 onAddFileToPlaylist (GtkButton *button,
568 GtkTreeView *treeview = NULL;
570 treeview = (GtkTreeView *) lookup_widget( GTK_WIDGET(button), "tvFileList");
573 onFileListRow(treeview, NULL, NULL, NULL );
579 NetworkBuildMRL (GtkEditable *editable,
582 GtkSpinButton *networkPort = NULL;
583 GtkEntry *entryMRL = NULL;
584 GtkEntry *networkType = NULL;
585 GtkEntry *networkAddress = NULL;
586 GtkEntry *networkProtocol = NULL;
587 const gchar *mrlNetworkType;
588 const gchar *mrlAddress;
589 const gchar *mrlProtocol;
591 char text[VLC_MAX_MRL];
594 entryMRL = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryMRL" );
596 networkType = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryNetworkType" );
597 networkAddress = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryNetworkAddress" );
598 networkPort = (GtkSpinButton*) lookup_widget( GTK_WIDGET(editable), "entryNetworkPort" );
599 networkProtocol = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryNetworkProtocolType" );
601 mrlNetworkType = gtk_entry_get_text(GTK_ENTRY(networkType));
602 mrlAddress = gtk_entry_get_text(GTK_ENTRY(networkAddress));
603 mrlPort = gtk_spin_button_get_value_as_int(networkPort);
604 mrlProtocol = gtk_entry_get_text(GTK_ENTRY(networkProtocol));
606 /* Build MRL from parts ;-) */
607 pos = snprintf( &text[0], VLC_MAX_MRL, "%s://", (char*)mrlProtocol);
608 if (strncasecmp( (char*)mrlNetworkType, "multicast",9)==0)
610 pos += snprintf( &text[pos], VLC_MAX_MRL - pos, "@" );
612 pos += snprintf( &text[pos], VLC_MAX_MRL - pos, "%s:%d", (char*)mrlAddress, (int)mrlPort );
614 if (pos >= VLC_MAX_MRL)
615 text[VLC_MAX_MRL-1]='\0';
617 gtk_entry_set_text(entryMRL,text);
621 onAddNetworkPlaylist (GtkButton *button,
624 GtkEntry *p_mrl = NULL;
625 const gchar *mrl_name;
627 p_mrl = (GtkEntry*) lookup_widget(GTK_WIDGET(button),"entryMRL" );
630 mrl_name = gtk_entry_get_text(p_mrl);
632 PlaylistAddItem(GTK_WIDGET(button), (gchar *)mrl_name);
638 onAddCameraToPlaylist (GtkButton *button,
641 intf_thread_t *p_intf = GtkGetIntf( button );
643 GtkSpinButton *entryV4LChannel = NULL;
644 GtkSpinButton *entryV4LFrequency = NULL;
645 GtkSpinButton *entryV4LSampleRate = NULL;
646 GtkSpinButton *entryV4LQuality = NULL;
647 GtkSpinButton *entryV4LTuner = NULL;
649 gint i_v4l_frequency;
650 gint i_v4l_samplerate;
654 GtkEntry *entryV4LVideoDevice = NULL;
655 GtkEntry *entryV4LAudioDevice = NULL;
656 GtkEntry *entryV4LNorm = NULL;
657 GtkEntry *entryV4LSize = NULL;
658 GtkEntry *entryV4LSoundDirection = NULL;
659 const gchar *p_v4l_video_device;
660 const gchar *p_v4l_audio_device;
661 const gchar *p_v4l_norm;
662 const gchar *p_v4l_size;
663 const gchar *p_v4l_sound_direction;
666 GtkCheckButton *checkV4LMJPEG = NULL;
667 GtkSpinButton *entryV4LDecimation = NULL;
668 gboolean b_v4l_mjpeg;
669 gint i_v4l_decimation;
672 char v4l_mrl[VLC_MAX_MRL];
675 pos = snprintf( &v4l_mrl[0], VLC_MAX_MRL, "v4l://");
677 entryV4LChannel = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LChannel" );
678 entryV4LFrequency = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LFrequency" );
679 entryV4LSampleRate = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LSampleRate" );
680 entryV4LQuality = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LQuality" );
681 entryV4LTuner = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LTuner" );
683 entryV4LVideoDevice = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LVideoDevice" );
684 entryV4LAudioDevice = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LAudioDevice" );
685 entryV4LNorm = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LNorm" );
686 entryV4LSize = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LSize" );
687 entryV4LSoundDirection = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LSoundDirection" );
689 i_v4l_channel = gtk_spin_button_get_value_as_int(entryV4LChannel);
690 i_v4l_frequency = gtk_spin_button_get_value_as_int(entryV4LFrequency);
691 i_v4l_samplerate = gtk_spin_button_get_value_as_int(entryV4LSampleRate);
692 i_v4l_quality = gtk_spin_button_get_value_as_int(entryV4LQuality);
693 i_v4l_tuner = gtk_spin_button_get_value_as_int(entryV4LTuner);
695 p_v4l_video_device = gtk_entry_get_text(GTK_ENTRY(entryV4LVideoDevice));
696 p_v4l_audio_device = gtk_entry_get_text(GTK_ENTRY(entryV4LAudioDevice));
697 p_v4l_norm = gtk_entry_get_text(GTK_ENTRY(entryV4LNorm));
698 p_v4l_size = gtk_entry_get_text(GTK_ENTRY(entryV4LSize));
699 p_v4l_sound_direction = gtk_entry_get_text(GTK_ENTRY(entryV4LSoundDirection));
701 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":%s", (char*)p_v4l_video_device );
702 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":adev=%s", (char*)p_v4l_audio_device );
703 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":norm=%s", (char*)p_v4l_norm );
704 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":size=%s", (char*)p_v4l_size );
705 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":%s", (char*)p_v4l_sound_direction );
707 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":channel=%d", (int)i_v4l_channel );
708 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":frequency=%d", (int)i_v4l_frequency );
709 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":samplerate=%d", (int)i_v4l_samplerate );
710 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":quality=%d", (int)i_v4l_quality );
711 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":tuner=%d", (int)i_v4l_tuner );
714 checkV4LMJPEG = (GtkCheckButton*) lookup_widget( GTK_WIDGET(button), "checkV4LMJPEG" );
715 b_v4l_mjpeg = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkV4LMJPEG));
718 entryV4LDecimation = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LDecimation" );
719 i_v4l_decimation = gtk_spin_button_get_value_as_int(entryV4LDecimation);
720 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":mjpeg:%d", (int)i_v4l_decimation );
724 if (pos >= VLC_MAX_MRL)
726 v4l_mrl[VLC_MAX_MRL-1]='\0';
727 msg_Err(p_intf, "Media Resource Locator is truncated to: %s", v4l_mrl);
730 PlaylistAddItem(GTK_WIDGET(button), (gchar*) &v4l_mrl);
735 PlaylistEvent (GtkWidget *widget,
744 onPlaylistColumnsChanged (GtkTreeView *treeview,
751 onPlaylistRowSelected (GtkTreeView *treeview,
752 gboolean start_editing,
760 onPlaylistRow (GtkTreeView *treeview,
762 GtkTreeViewColumn *column,
769 onUpdatePlaylist (GtkButton *button,
777 onDeletePlaylist (GtkButton *button,
785 onClearPlaylist (GtkButton *button,
788 intf_thread_t *p_intf = GtkGetIntf( button );
790 msg_Dbg(p_intf, "Clear playlist" );
795 onPreferenceSave (GtkButton *button,
798 intf_thread_t *p_intf = GtkGetIntf( button );
800 msg_Dbg(p_intf, "Preferences Save" );
805 onPreferenceApply (GtkButton *button,
808 intf_thread_t *p_intf = GtkGetIntf( button );
810 msg_Dbg(p_intf, "Preferences Apply" );
815 onPreferenceCancel (GtkButton *button,
818 intf_thread_t *p_intf = GtkGetIntf( button );
820 msg_Dbg(p_intf, "Preferences Cancel" );
825 onAddTranscodeToPlaylist (GtkButton *button,
828 intf_thread_t *p_intf = GtkGetIntf( button );
830 GtkEntry *entryVideoCodec = NULL;
831 GtkSpinButton *entryVideoBitrate = NULL;
832 GtkSpinButton *entryVideoBitrateTolerance = NULL;
833 GtkSpinButton *entryVideoKeyFrameInterval = NULL;
834 GtkCheckButton *checkVideoDeinterlace = NULL;
835 GtkEntry *entryAudioCodec = NULL;
836 GtkSpinButton *entryAudioBitrate = NULL;
837 const gchar *p_video_codec;
838 gint i_video_bitrate;
839 gint i_video_bitrate_tolerance;
840 gint i_video_keyframe_interval;
841 gboolean b_video_deinterlace;
842 const gchar *p_audio_codec;
843 gint i_audio_bitrate;
845 GtkEntry *entryStdAccess = NULL;
846 GtkEntry *entryStdMuxer = NULL;
847 GtkEntry *entryStdURL = NULL;
848 GtkSpinButton *entryStdTTL = NULL;
849 const gchar *p_std_access;
850 const gchar *p_std_muxer;
851 const gchar *p_std_url;
854 gchar mrl[VLC_MAX_MRL];
857 pos = snprintf( &mrl[0], VLC_MAX_MRL, "--sout '#transcode{");
859 entryVideoCodec = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryVideoCodec" );
860 entryVideoBitrate = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryVideoBitrate" );
861 entryVideoBitrateTolerance = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryVideoBitrateTolerance" );
862 entryVideoKeyFrameInterval = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryVideoKeyFrameInterval" );
864 p_video_codec = gtk_entry_get_text(GTK_ENTRY(entryVideoCodec));
865 i_video_bitrate = gtk_spin_button_get_value_as_int(entryVideoBitrate);
866 i_video_bitrate_tolerance = gtk_spin_button_get_value_as_int(entryVideoBitrateTolerance);
867 i_video_keyframe_interval = gtk_spin_button_get_value_as_int(entryVideoKeyFrameInterval);
869 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "vcodec=%s,", (char*)p_video_codec );
870 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "vb=%d,", (int)i_video_bitrate );
871 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "vt=%d,", (int)i_video_bitrate_tolerance );
872 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "keyint=%d,", (int)i_video_keyframe_interval );
874 checkVideoDeinterlace = (GtkCheckButton*) lookup_widget( GTK_WIDGET(button), "checkVideoDeinterlace" );
875 b_video_deinterlace = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkVideoDeinterlace));
876 if (b_video_deinterlace)
878 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "deinterlace," );
880 entryAudioCodec = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryAudioCodec" );
881 entryAudioBitrate = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryAudioBitrate" );
883 p_audio_codec = gtk_entry_get_text(GTK_ENTRY(entryAudioCodec));
884 i_audio_bitrate = gtk_spin_button_get_value_as_int(entryAudioBitrate);
886 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "acodec=%s,", (char*)p_audio_codec );
887 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "ab=%d", (int)i_audio_bitrate );
889 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "}:std{" );
891 entryStdAccess = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryStdAccess" );
892 entryStdMuxer = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryStdMuxer" );
893 entryStdURL = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryStdURL" );
894 entryStdTTL = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryStdTTL" );
896 p_std_access = gtk_entry_get_text(GTK_ENTRY(entryStdAccess));
897 p_std_muxer = gtk_entry_get_text(GTK_ENTRY(entryStdMuxer));
898 p_std_url = gtk_entry_get_text(GTK_ENTRY(entryStdURL));
900 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "access=%s,", (char*)p_std_access);
901 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "mux=%s,", (char*)p_std_muxer);
902 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "url=%s", (char*)p_std_url);
903 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "}'");
905 i_std_ttl = gtk_spin_button_get_value_as_int(entryStdTTL);
907 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, " --ttl=%d", (int)i_std_ttl);
909 if (pos >= VLC_MAX_MRL)
911 mrl[VLC_MAX_MRL-1]='\0';
912 msg_Err(p_intf, "Media Resource Locator is truncated to: %s", mrl );
915 PlaylistAddItem(GTK_WIDGET(button), (gchar*) &mrl);