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.16 2003/11/25 20:01:08 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, (char*)name, 0, 0,
128 PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END);
132 playlist_Add( p_playlist, (char*)name, 0, 0,
133 PLAYLIST_APPEND, PLAYLIST_END );
136 msg_Dbg( p_intf, "done");
139 vlc_object_release( p_playlist );
142 void PlaylistRebuildListStore( GtkListStore * p_list, playlist_t * p_playlist )
146 gchar * ppsz_text[2];
152 vlc_mutex_lock( &p_playlist->object_lock );
153 for( i_dummy = p_playlist->i_size ; i_dummy-- ; )
155 ppsz_text[0] = p_playlist->pp_items[i_dummy]->psz_name;
156 ppsz_text[1] = "no info";
157 gtk_list_store_append (p_list, &iter);
158 gtk_list_store_set (p_list, &iter,
163 vlc_mutex_unlock( &p_playlist->object_lock );
166 /*****************************************************************
167 * Read directory helper function.
168 ****************************************************************/
169 void ReadDirectory(intf_thread_t *p_intf, GtkListStore *p_list, char *psz_dir )
172 struct dirent **namelist;
178 msg_Dbg(p_intf, "Changing to dir %s", psz_dir);
181 status = chdir(psz_dir);
183 msg_Dbg(p_intf, "permision denied" );
185 n = scandir(".", &namelist, 0, alphasort);
194 if (lstat("..", &st)==0)
197 pw = getpwuid(st.st_uid);
198 grp = getgrgid(st.st_gid);
200 /* XXX : kludge temporaire pour yopy */
202 ppsz_text[1] = get_file_perms(st);
203 ppsz_text[2] = pw->pw_name;
204 ppsz_text[3] = grp->gr_name;
206 /* Add a new row to the model */
207 gtk_list_store_append (p_list, &iter);
208 gtk_list_store_set (p_list, &iter,
216 if (ppsz_text[1]) free(ppsz_text[1]);
221 if ((namelist[i]->d_name[0] != '.') &&
222 (lstat(namelist[i]->d_name, &st)==0))
225 pw = getpwuid(st.st_uid);
226 grp = getgrgid(st.st_gid);
228 /* This is a list of strings. */
229 ppsz_text[0] = namelist[i]->d_name;
230 ppsz_text[1] = get_file_perms(st);
231 ppsz_text[2] = pw->pw_name;
232 ppsz_text[3] = grp->gr_name;
234 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] );
236 gtk_list_store_append (p_list, &iter);
237 gtk_list_store_set (p_list, &iter,
245 if (ppsz_text[1]) free(ppsz_text[1]);
252 static char *get_file_perms(const struct stat st)
256 perm = (char *) malloc(sizeof(char)*10);
257 strncpy( perm, "----------", sizeof("----------"));
259 /* determine permission modes */
260 if (S_ISLNK(st.st_mode))
262 else if (S_ISDIR(st.st_mode))
264 else if (S_ISCHR(st.st_mode))
266 else if (S_ISBLK(st.st_mode))
268 else if (S_ISFIFO(st.st_mode))
270 else if (S_ISSOCK(st.st_mode))
272 else if (S_ISREG(st.st_mode))
274 else /* Unknown type is an error */
276 /* Get file permissions */
278 if (st.st_mode & S_IRUSR)
280 if (st.st_mode & S_IWUSR)
282 if (st.st_mode & S_IXUSR)
284 if (st.st_mode & S_ISUID)
289 else if (st.st_mode & S_ISUID)
292 if (st.st_mode & S_IRGRP)
294 if (st.st_mode & S_IWGRP)
296 if (st.st_mode & S_IXGRP)
298 if (st.st_mode & S_ISGID)
303 else if (st.st_mode & S_ISGID)
306 if (st.st_mode & S_IROTH)
308 if (st.st_mode & S_IWOTH)
310 if (st.st_mode & S_IXOTH)
313 if (st.st_mode &S_ISVTX)
318 else if (st.st_mode &S_ISVTX)
325 * Main interface callbacks
329 onPDADeleteEvent (GtkWidget *widget,
333 intf_thread_t *p_intf = GtkGetIntf( widget );
335 msg_Dbg( p_intf, "about to exit vlc ... " );
336 vlc_mutex_lock( &p_intf->change_lock );
337 p_intf->p_vlc->b_die = VLC_TRUE;
338 vlc_mutex_unlock( &p_intf->change_lock );
339 msg_Dbg( p_intf, "about to exit vlc ... signalled" );
346 onRewind (GtkButton *button,
349 intf_thread_t * p_intf = GtkGetIntf( button );
351 if (p_intf->p_sys->p_input != NULL)
353 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_SLOWER );
359 onPause (GtkButton *button,
362 intf_thread_t * p_intf = GtkGetIntf( button );
364 if (p_intf->p_sys->p_input != NULL)
366 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_PAUSE );
372 onPlay (GtkButton *button,
375 intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET( button ) );
376 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
380 vlc_mutex_lock( &p_playlist->object_lock );
381 if (p_playlist->i_size)
383 vlc_mutex_unlock( &p_playlist->object_lock );
384 playlist_Play( p_playlist );
388 vlc_mutex_unlock( &p_playlist->object_lock );
390 vlc_object_release( p_playlist );
396 onStop (GtkButton *button,
399 intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET( button ) );
400 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
404 playlist_Stop( p_playlist );
405 vlc_object_release( p_playlist );
411 onForward (GtkButton *button,
414 intf_thread_t *p_intf = GtkGetIntf( button );
416 if (p_intf->p_sys->p_input != NULL)
418 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_FASTER );
424 onAbout (GtkButton *button,
427 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(button) );
430 if (p_intf->p_sys->p_notebook)
432 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
433 gtk_notebook_set_page(p_intf->p_sys->p_notebook,6);
439 SliderRelease (GtkWidget *widget,
440 GdkEventButton *event,
443 intf_thread_t *p_intf = GtkGetIntf( widget );
445 vlc_mutex_lock( &p_intf->change_lock );
446 p_intf->p_sys->b_slider_free = 1;
447 vlc_mutex_unlock( &p_intf->change_lock );
454 SliderPress (GtkWidget *widget,
455 GdkEventButton *event,
458 intf_thread_t *p_intf = GtkGetIntf( widget );
460 vlc_mutex_lock( &p_intf->change_lock );
461 p_intf->p_sys->b_slider_free = 0;
462 vlc_mutex_unlock( &p_intf->change_lock );
467 void addSelectedToPlaylist(GtkTreeModel *model,
474 gtk_tree_model_get(model, iter, 0, &filename, -1);
476 PlaylistAddItem(GTK_WIDGET(userdata), filename);
480 onFileListRow (GtkTreeView *treeview,
482 GtkTreeViewColumn *column,
485 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(treeview) );
486 GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
488 if (gtk_tree_selection_count_selected_rows(selection) == 1)
495 /* This might be a directory selection */
496 model = gtk_tree_view_get_model(treeview);
499 msg_Err(p_intf, "PDA: Filelist model contains a NULL pointer\n" );
502 if (!gtk_tree_model_get_iter(model, &iter, path))
504 msg_Err( p_intf, "PDA: Could not get iter from model" );
508 gtk_tree_model_get(model, &iter, 0, &filename, -1);
509 if (stat((char*)filename, &st)==0)
511 if (S_ISDIR(st.st_mode))
513 GtkListStore *p_model = NULL;
515 /* Get new directory listing */
516 p_model = gtk_list_store_new (5,
524 ReadDirectory(p_intf, p_model, filename);
526 /* Update TreeView with new model */
527 gtk_tree_view_set_model(treeview, (GtkTreeModel*) p_model);
528 g_object_unref(p_model);
533 gtk_tree_selection_selected_foreach(selection, (GtkTreeSelectionForeachFunc) &addSelectedToPlaylist, (gpointer) treeview);
539 gtk_tree_selection_selected_foreach(selection, (GtkTreeSelectionForeachFunc) &addSelectedToPlaylist, (gpointer) treeview);
544 onAddFileToPlaylist (GtkButton *button,
547 GtkTreeView *treeview = NULL;
549 treeview = (GtkTreeView *) lookup_widget( GTK_WIDGET(button), "tvFileList");
552 GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
554 gtk_tree_selection_selected_foreach(selection, (GtkTreeSelectionForeachFunc) &addSelectedToPlaylist, (gpointer) treeview);
560 NetworkBuildMRL (GtkEditable *editable,
563 GtkSpinButton *networkPort = NULL;
564 GtkEntry *entryMRL = NULL;
565 GtkEntry *networkType = NULL;
566 GtkEntry *networkAddress = NULL;
567 GtkEntry *networkProtocol = NULL;
568 const gchar *mrlNetworkType;
569 const gchar *mrlAddress;
570 const gchar *mrlProtocol;
572 char text[VLC_MAX_MRL];
575 entryMRL = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryMRL" );
577 networkType = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryNetworkType" );
578 networkAddress = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryNetworkAddress" );
579 networkPort = (GtkSpinButton*) lookup_widget( GTK_WIDGET(editable), "entryNetworkPort" );
580 networkProtocol = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryNetworkProtocolType" );
582 mrlNetworkType = gtk_entry_get_text(GTK_ENTRY(networkType));
583 mrlAddress = gtk_entry_get_text(GTK_ENTRY(networkAddress));
584 mrlPort = gtk_spin_button_get_value_as_int(networkPort);
585 mrlProtocol = gtk_entry_get_text(GTK_ENTRY(networkProtocol));
587 /* Build MRL from parts ;-) */
588 pos = snprintf( &text[0], VLC_MAX_MRL, "%s://", (char*)mrlProtocol);
589 if (strncasecmp( (char*)mrlNetworkType, "multicast",9)==0)
591 pos += snprintf( &text[pos], VLC_MAX_MRL - pos, "@" );
593 pos += snprintf( &text[pos], VLC_MAX_MRL - pos, "%s:%d", (char*)mrlAddress, (int)mrlPort );
595 if (pos >= VLC_MAX_MRL)
596 text[VLC_MAX_MRL-1]='\0';
598 gtk_entry_set_text(entryMRL,text);
602 onAddNetworkPlaylist (GtkButton *button,
605 GtkEntry *p_mrl = NULL;
606 const gchar *mrl_name;
608 p_mrl = (GtkEntry*) lookup_widget(GTK_WIDGET(button),"entryMRL" );
611 mrl_name = gtk_entry_get_text(p_mrl);
613 PlaylistAddItem(GTK_WIDGET(button), (gchar *)mrl_name);
619 onAddCameraToPlaylist (GtkButton *button,
622 intf_thread_t *p_intf = GtkGetIntf( button );
624 GtkSpinButton *entryV4LChannel = NULL;
625 GtkSpinButton *entryV4LFrequency = NULL;
626 GtkSpinButton *entryV4LSampleRate = NULL;
627 GtkSpinButton *entryV4LQuality = NULL;
628 GtkSpinButton *entryV4LTuner = NULL;
630 gint i_v4l_frequency;
631 gint i_v4l_samplerate;
635 GtkEntry *entryV4LVideoDevice = NULL;
636 GtkEntry *entryV4LAudioDevice = NULL;
637 GtkEntry *entryV4LNorm = NULL;
638 GtkEntry *entryV4LSize = NULL;
639 GtkEntry *entryV4LSoundDirection = NULL;
640 const gchar *p_v4l_video_device;
641 const gchar *p_v4l_audio_device;
642 const gchar *p_v4l_norm;
643 const gchar *p_v4l_size;
644 const gchar *p_v4l_sound_direction;
647 GtkCheckButton *checkV4LMJPEG = NULL;
648 GtkSpinButton *entryV4LDecimation = NULL;
649 gboolean b_v4l_mjpeg;
650 gint i_v4l_decimation;
653 char v4l_mrl[VLC_MAX_MRL];
656 pos = snprintf( &v4l_mrl[0], VLC_MAX_MRL, "v4l://");
658 entryV4LChannel = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LChannel" );
659 entryV4LFrequency = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LFrequency" );
660 entryV4LSampleRate = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LSampleRate" );
661 entryV4LQuality = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LQuality" );
662 entryV4LTuner = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LTuner" );
664 entryV4LVideoDevice = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LVideoDevice" );
665 entryV4LAudioDevice = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LAudioDevice" );
666 entryV4LNorm = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LNorm" );
667 entryV4LSize = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LSize" );
668 entryV4LSoundDirection = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LSoundDirection" );
670 i_v4l_channel = gtk_spin_button_get_value_as_int(entryV4LChannel);
671 i_v4l_frequency = gtk_spin_button_get_value_as_int(entryV4LFrequency);
672 i_v4l_samplerate = gtk_spin_button_get_value_as_int(entryV4LSampleRate);
673 i_v4l_quality = gtk_spin_button_get_value_as_int(entryV4LQuality);
674 i_v4l_tuner = gtk_spin_button_get_value_as_int(entryV4LTuner);
676 p_v4l_video_device = gtk_entry_get_text(GTK_ENTRY(entryV4LVideoDevice));
677 p_v4l_audio_device = gtk_entry_get_text(GTK_ENTRY(entryV4LAudioDevice));
678 p_v4l_norm = gtk_entry_get_text(GTK_ENTRY(entryV4LNorm));
679 p_v4l_size = gtk_entry_get_text(GTK_ENTRY(entryV4LSize));
680 p_v4l_sound_direction = gtk_entry_get_text(GTK_ENTRY(entryV4LSoundDirection));
682 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":%s", (char*)p_v4l_video_device );
683 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":adev=%s", (char*)p_v4l_audio_device );
684 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":norm=%s", (char*)p_v4l_norm );
685 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":size=%s", (char*)p_v4l_size );
686 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":%s", (char*)p_v4l_sound_direction );
688 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":channel=%d", (int)i_v4l_channel );
689 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":frequency=%d", (int)i_v4l_frequency );
690 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":samplerate=%d", (int)i_v4l_samplerate );
691 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":quality=%d", (int)i_v4l_quality );
692 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":tuner=%d", (int)i_v4l_tuner );
695 checkV4LMJPEG = (GtkCheckButton*) lookup_widget( GTK_WIDGET(button), "checkV4LMJPEG" );
696 b_v4l_mjpeg = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkV4LMJPEG));
699 entryV4LDecimation = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LDecimation" );
700 i_v4l_decimation = gtk_spin_button_get_value_as_int(entryV4LDecimation);
701 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":mjpeg:%d", (int)i_v4l_decimation );
705 if (pos >= VLC_MAX_MRL)
707 v4l_mrl[VLC_MAX_MRL-1]='\0';
708 msg_Err(p_intf, "Media Resource Locator is truncated to: %s", v4l_mrl);
711 PlaylistAddItem(GTK_WIDGET(button), (gchar*) &v4l_mrl);
716 PlaylistEvent (GtkWidget *widget,
725 onPlaylistColumnsChanged (GtkTreeView *treeview,
732 onPlaylistRowSelected (GtkTreeView *treeview,
733 gboolean start_editing,
741 onPlaylistRow (GtkTreeView *treeview,
743 GtkTreeViewColumn *column,
750 onUpdatePlaylist (GtkButton *button,
758 onDeletePlaylist (GtkButton *button,
766 onClearPlaylist (GtkButton *button,
769 intf_thread_t *p_intf = GtkGetIntf( button );
771 msg_Dbg(p_intf, "Clear playlist" );
776 onPreferenceSave (GtkButton *button,
779 intf_thread_t *p_intf = GtkGetIntf( button );
781 msg_Dbg(p_intf, "Preferences Save" );
786 onPreferenceApply (GtkButton *button,
789 intf_thread_t *p_intf = GtkGetIntf( button );
791 msg_Dbg(p_intf, "Preferences Apply" );
796 onPreferenceCancel (GtkButton *button,
799 intf_thread_t *p_intf = GtkGetIntf( button );
801 msg_Dbg(p_intf, "Preferences Cancel" );
806 onAddTranscodeToPlaylist (GtkButton *button,
809 intf_thread_t *p_intf = GtkGetIntf( button );
811 GtkEntry *entryVideoCodec = NULL;
812 GtkSpinButton *entryVideoBitrate = NULL;
813 GtkSpinButton *entryVideoBitrateTolerance = NULL;
814 GtkSpinButton *entryVideoKeyFrameInterval = NULL;
815 GtkCheckButton *checkVideoDeinterlace = NULL;
816 GtkEntry *entryAudioCodec = NULL;
817 GtkSpinButton *entryAudioBitrate = NULL;
818 const gchar *p_video_codec;
819 gint i_video_bitrate;
820 gint i_video_bitrate_tolerance;
821 gint i_video_keyframe_interval;
822 gboolean b_video_deinterlace;
823 const gchar *p_audio_codec;
824 gint i_audio_bitrate;
826 GtkEntry *entryStdAccess = NULL;
827 GtkEntry *entryStdMuxer = NULL;
828 GtkEntry *entryStdURL = NULL;
829 GtkSpinButton *entryStdTTL = NULL;
830 const gchar *p_std_access;
831 const gchar *p_std_muxer;
832 const gchar *p_std_url;
835 gchar mrl[VLC_MAX_MRL];
838 pos = snprintf( &mrl[0], VLC_MAX_MRL, "--sout '#transcode{");
840 entryVideoCodec = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryVideoCodec" );
841 entryVideoBitrate = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryVideoBitrate" );
842 entryVideoBitrateTolerance = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryVideoBitrateTolerance" );
843 entryVideoKeyFrameInterval = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryVideoKeyFrameInterval" );
845 p_video_codec = gtk_entry_get_text(GTK_ENTRY(entryVideoCodec));
846 i_video_bitrate = gtk_spin_button_get_value_as_int(entryVideoBitrate);
847 i_video_bitrate_tolerance = gtk_spin_button_get_value_as_int(entryVideoBitrateTolerance);
848 i_video_keyframe_interval = gtk_spin_button_get_value_as_int(entryVideoKeyFrameInterval);
850 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "vcodec=%s,", (char*)p_video_codec );
851 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "vb=%d,", (int)i_video_bitrate );
852 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "vt=%d,", (int)i_video_bitrate_tolerance );
853 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "keyint=%d,", (int)i_video_keyframe_interval );
855 checkVideoDeinterlace = (GtkCheckButton*) lookup_widget( GTK_WIDGET(button), "checkVideoDeinterlace" );
856 b_video_deinterlace = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkVideoDeinterlace));
857 if (b_video_deinterlace)
859 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "deinterlace," );
861 entryAudioCodec = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryAudioCodec" );
862 entryAudioBitrate = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryAudioBitrate" );
864 p_audio_codec = gtk_entry_get_text(GTK_ENTRY(entryAudioCodec));
865 i_audio_bitrate = gtk_spin_button_get_value_as_int(entryAudioBitrate);
867 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "acodec=%s,", (char*)p_audio_codec );
868 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "ab=%d", (int)i_audio_bitrate );
870 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "}:std{" );
872 entryStdAccess = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryStdAccess" );
873 entryStdMuxer = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryStdMuxer" );
874 entryStdURL = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryStdURL" );
875 entryStdTTL = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryStdTTL" );
877 p_std_access = gtk_entry_get_text(GTK_ENTRY(entryStdAccess));
878 p_std_muxer = gtk_entry_get_text(GTK_ENTRY(entryStdMuxer));
879 p_std_url = gtk_entry_get_text(GTK_ENTRY(entryStdURL));
881 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "access=%s,", (char*)p_std_access);
882 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "mux=%s,", (char*)p_std_muxer);
883 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "url=%s", (char*)p_std_url);
884 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "}'");
886 i_std_ttl = gtk_spin_button_get_value_as_int(entryStdTTL);
888 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, " --ttl=%d", (int)i_std_ttl);
890 if (pos >= VLC_MAX_MRL)
892 mrl[VLC_MAX_MRL-1]='\0';
893 msg_Err(p_intf, "Media Resource Locator is truncated to: %s", mrl );
896 PlaylistAddItem(GTK_WIDGET(button), (gchar*) &mrl);