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.14 2003/11/18 20:36:40 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_stat(const char *path, off_t *size);
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;
181 msg_Dbg(p_intf, "Changing to dir %s", psz_dir);
184 status = chdir(psz_dir);
186 msg_Dbg(p_intf, "permision denied" );
188 n = scandir(".", &namelist, 0, alphasort);
198 /* XXX : kludge temporaire pour yopy */
200 ppsz_text[1] = get_file_stat("..", &size);
204 /* Add a new row to the model */
205 gtk_list_store_append (p_list, &iter);
206 gtk_list_store_set (p_list, &iter,
214 if (ppsz_text[1]) free(ppsz_text[1]);
219 if (namelist[i]->d_name[0] != '.')
221 /* This is a list of strings. */
222 ppsz_text[0] = namelist[i]->d_name;
223 ppsz_text[1] = get_file_stat(namelist[i]->d_name, &size);
227 msg_Dbg(p_intf, "(%d) file: %s permission: %s user: %s group: %s size: %ull", i, ppsz_text[0], ppsz_text[1], ppsz_text[2], ppsz_text[3], (unsigned long long) size );
229 gtk_list_store_append (p_list, &iter);
230 gtk_list_store_set (p_list, &iter,
238 if (ppsz_text[1]) free(ppsz_text[1]);
245 static char *get_file_stat(const char *path, off_t *size)
247 struct passwd *pw = NULL;
248 struct group *grp = NULL;
253 perm = (char *) malloc(sizeof(char)*10);
254 strncpy( perm, "----------", sizeof("----------"));
255 if (lstat(path, &st)==0)
257 /* determine permission modes */
258 if (S_ISLNK(st.st_mode))
260 else if (S_ISDIR(st.st_mode))
262 else if (S_ISCHR(st.st_mode))
264 else if (S_ISBLK(st.st_mode))
266 else if (S_ISFIFO(st.st_mode))
268 else if (S_ISSOCK(st.st_mode))
270 else if (S_ISREG(st.st_mode))
272 else /* Unknown type is an error */
274 /* Get file permissions */
276 if (st.st_mode & S_IRUSR)
278 if (st.st_mode & S_IWUSR)
280 if (st.st_mode & S_IXUSR)
282 if (st.st_mode & S_ISUID)
287 else if (st.st_mode & S_ISUID)
290 if (st.st_mode & S_IRGRP)
292 if (st.st_mode & S_IWGRP)
294 if (st.st_mode & S_IXGRP)
296 if (st.st_mode & S_ISGID)
301 else if (st.st_mode & S_ISGID)
304 if (st.st_mode & S_IROTH)
306 if (st.st_mode & S_IWOTH)
308 if (st.st_mode & S_IXOTH)
311 if (st.st_mode &S_ISVTX)
316 else if (st.st_mode &S_ISVTX)
322 /* user, group, filesize */
323 pw = getpwuid(st.st_uid);
324 grp = getgrgid(st.st_gid);
327 *uid = (char*) malloc( sizeof(char) * strlen(pw->pw_name) );
328 strcpy(path[2],pw->pw_name);
331 *gid = (char*) malloc( sizeof(char) * strlen(grp->gr_name) );
332 strcpy(path[3], grp->gr_name);
341 * Main interface callbacks
345 onPDADeleteEvent (GtkWidget *widget,
349 intf_thread_t *p_intf = GtkGetIntf( widget );
351 msg_Dbg( p_intf, "about to exit vlc ... " );
352 vlc_mutex_lock( &p_intf->change_lock );
353 p_intf->p_vlc->b_die = VLC_TRUE;
354 vlc_mutex_unlock( &p_intf->change_lock );
355 msg_Dbg( p_intf, "about to exit vlc ... signalled" );
362 onRewind (GtkButton *button,
365 intf_thread_t * p_intf = GtkGetIntf( button );
367 if (p_intf->p_sys->p_input != NULL)
369 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_SLOWER );
375 onPause (GtkButton *button,
378 intf_thread_t * p_intf = GtkGetIntf( button );
380 if (p_intf->p_sys->p_input != NULL)
382 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_PAUSE );
388 onPlay (GtkButton *button,
391 intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET( button ) );
392 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
396 vlc_mutex_lock( &p_playlist->object_lock );
397 if (p_playlist->i_size)
399 vlc_mutex_unlock( &p_playlist->object_lock );
400 playlist_Play( p_playlist );
404 vlc_mutex_unlock( &p_playlist->object_lock );
406 vlc_object_release( p_playlist );
412 onStop (GtkButton *button,
415 intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET( button ) );
416 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
420 playlist_Stop( p_playlist );
421 vlc_object_release( p_playlist );
427 onForward (GtkButton *button,
430 intf_thread_t *p_intf = GtkGetIntf( button );
432 if (p_intf->p_sys->p_input != NULL)
434 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_FASTER );
440 onAbout (GtkButton *button,
443 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(button) );
446 if (p_intf->p_sys->p_notebook)
448 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
449 gtk_notebook_set_page(p_intf->p_sys->p_notebook,6);
455 SliderRelease (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 = 1;
463 vlc_mutex_unlock( &p_intf->change_lock );
470 SliderPress (GtkWidget *widget,
471 GdkEventButton *event,
474 intf_thread_t *p_intf = GtkGetIntf( widget );
476 vlc_mutex_lock( &p_intf->change_lock );
477 p_intf->p_sys->b_slider_free = 0;
478 vlc_mutex_unlock( &p_intf->change_lock );
483 void addSelectedToPlaylist(GtkTreeModel *model,
490 gtk_tree_model_get(model, iter, 0, &filename, -1);
492 PlaylistAddItem(GTK_WIDGET(userdata), filename);
496 onFileListRow (GtkTreeView *treeview,
498 GtkTreeViewColumn *column,
501 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(treeview) );
502 GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
504 if (gtk_tree_selection_count_selected_rows(selection) == 1)
511 /* This might be a directory selection */
512 model = gtk_tree_view_get_model(treeview);
514 msg_Err(p_intf, "PDA: Filelist model contains a NULL pointer\n" );
521 list = gtk_tree_selection_get_selected_rows(selection,model);
522 if (g_list_length(list) == 1)
524 filename = (gchar *) g_list_nth_data(list,0);
525 msg_Dbg(p_intf, "PDA: filename = %s", (gchar*) filename );
526 PlaylistAddItem(GTK_WIDGET(treeview), filename);
528 g_list_foreach (list, gtk_tree_path_free, NULL);
534 if (!gtk_tree_model_get_iter(model, &iter, path))
535 msg_Err( p_intf, "PDA: Could not get iter from model" );
537 gtk_tree_model_get(model, &iter, 0, &filename, -1);
539 if (stat((char*)filename, &st)==0)
541 if (S_ISDIR(st.st_mode))
543 GtkListStore *p_model = NULL;
545 /* Get new directory listing */
546 p_model = gtk_list_store_new (5,
554 ReadDirectory(p_intf, p_model, filename);
556 /* Update TreeView with new model */
557 gtk_tree_view_set_model(treeview, (GtkTreeModel*) p_model);
558 g_object_unref(p_model);
563 gtk_tree_selection_selected_foreach(selection, (GtkTreeSelectionForeachFunc) &addSelectedToPlaylist, (gpointer) treeview);
570 gtk_tree_selection_selected_foreach(selection, (GtkTreeSelectionForeachFunc) &addSelectedToPlaylist, (gpointer) treeview);
575 onAddFileToPlaylist (GtkButton *button,
578 GtkTreeView *treeview = NULL;
580 treeview = (GtkTreeView *) lookup_widget( GTK_WIDGET(button), "tvFileList");
583 onFileListRow(treeview, NULL, NULL, NULL );
589 NetworkBuildMRL (GtkEditable *editable,
592 GtkSpinButton *networkPort = NULL;
593 GtkEntry *entryMRL = NULL;
594 GtkEntry *networkType = NULL;
595 GtkEntry *networkAddress = NULL;
596 GtkEntry *networkProtocol = NULL;
597 const gchar *mrlNetworkType;
598 const gchar *mrlAddress;
599 const gchar *mrlProtocol;
601 char text[VLC_MAX_MRL];
604 entryMRL = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryMRL" );
606 networkType = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryNetworkType" );
607 networkAddress = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryNetworkAddress" );
608 networkPort = (GtkSpinButton*) lookup_widget( GTK_WIDGET(editable), "entryNetworkPort" );
609 networkProtocol = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryNetworkProtocolType" );
611 mrlNetworkType = gtk_entry_get_text(GTK_ENTRY(networkType));
612 mrlAddress = gtk_entry_get_text(GTK_ENTRY(networkAddress));
613 mrlPort = gtk_spin_button_get_value_as_int(networkPort);
614 mrlProtocol = gtk_entry_get_text(GTK_ENTRY(networkProtocol));
616 /* Build MRL from parts ;-) */
617 pos = snprintf( &text[0], VLC_MAX_MRL, "%s://", (char*)mrlProtocol);
618 if (strncasecmp( (char*)mrlNetworkType, "multicast",9)==0)
620 pos += snprintf( &text[pos], VLC_MAX_MRL - pos, "@" );
622 pos += snprintf( &text[pos], VLC_MAX_MRL - pos, "%s:%d", (char*)mrlAddress, (int)mrlPort );
624 if (pos >= VLC_MAX_MRL)
625 text[VLC_MAX_MRL-1]='\0';
627 gtk_entry_set_text(entryMRL,text);
631 onAddNetworkPlaylist (GtkButton *button,
634 GtkEntry *p_mrl = NULL;
635 const gchar *mrl_name;
637 p_mrl = (GtkEntry*) lookup_widget(GTK_WIDGET(button),"entryMRL" );
640 mrl_name = gtk_entry_get_text(p_mrl);
642 PlaylistAddItem(GTK_WIDGET(button), (gchar *)mrl_name);
648 onAddCameraToPlaylist (GtkButton *button,
651 intf_thread_t *p_intf = GtkGetIntf( button );
653 GtkSpinButton *entryV4LChannel = NULL;
654 GtkSpinButton *entryV4LFrequency = NULL;
655 GtkSpinButton *entryV4LSampleRate = NULL;
656 GtkSpinButton *entryV4LQuality = NULL;
657 GtkSpinButton *entryV4LTuner = NULL;
659 gint i_v4l_frequency;
660 gint i_v4l_samplerate;
664 GtkEntry *entryV4LVideoDevice = NULL;
665 GtkEntry *entryV4LAudioDevice = NULL;
666 GtkEntry *entryV4LNorm = NULL;
667 GtkEntry *entryV4LSize = NULL;
668 GtkEntry *entryV4LSoundDirection = NULL;
669 const gchar *p_v4l_video_device;
670 const gchar *p_v4l_audio_device;
671 const gchar *p_v4l_norm;
672 const gchar *p_v4l_size;
673 const gchar *p_v4l_sound_direction;
676 GtkCheckButton *checkV4LMJPEG = NULL;
677 GtkSpinButton *entryV4LDecimation = NULL;
678 gboolean b_v4l_mjpeg;
679 gint i_v4l_decimation;
682 char v4l_mrl[VLC_MAX_MRL];
685 pos = snprintf( &v4l_mrl[0], VLC_MAX_MRL, "v4l://");
687 entryV4LChannel = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LChannel" );
688 entryV4LFrequency = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LFrequency" );
689 entryV4LSampleRate = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LSampleRate" );
690 entryV4LQuality = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LQuality" );
691 entryV4LTuner = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LTuner" );
693 entryV4LVideoDevice = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LVideoDevice" );
694 entryV4LAudioDevice = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LAudioDevice" );
695 entryV4LNorm = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LNorm" );
696 entryV4LSize = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LSize" );
697 entryV4LSoundDirection = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LSoundDirection" );
699 i_v4l_channel = gtk_spin_button_get_value_as_int(entryV4LChannel);
700 i_v4l_frequency = gtk_spin_button_get_value_as_int(entryV4LFrequency);
701 i_v4l_samplerate = gtk_spin_button_get_value_as_int(entryV4LSampleRate);
702 i_v4l_quality = gtk_spin_button_get_value_as_int(entryV4LQuality);
703 i_v4l_tuner = gtk_spin_button_get_value_as_int(entryV4LTuner);
705 p_v4l_video_device = gtk_entry_get_text(GTK_ENTRY(entryV4LVideoDevice));
706 p_v4l_audio_device = gtk_entry_get_text(GTK_ENTRY(entryV4LAudioDevice));
707 p_v4l_norm = gtk_entry_get_text(GTK_ENTRY(entryV4LNorm));
708 p_v4l_size = gtk_entry_get_text(GTK_ENTRY(entryV4LSize));
709 p_v4l_sound_direction = gtk_entry_get_text(GTK_ENTRY(entryV4LSoundDirection));
711 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":%s", (char*)p_v4l_video_device );
712 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":adev=%s", (char*)p_v4l_audio_device );
713 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":norm=%s", (char*)p_v4l_norm );
714 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":size=%s", (char*)p_v4l_size );
715 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":%s", (char*)p_v4l_sound_direction );
717 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":channel=%d", (int)i_v4l_channel );
718 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":frequency=%d", (int)i_v4l_frequency );
719 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":samplerate=%d", (int)i_v4l_samplerate );
720 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":quality=%d", (int)i_v4l_quality );
721 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":tuner=%d", (int)i_v4l_tuner );
724 checkV4LMJPEG = (GtkCheckButton*) lookup_widget( GTK_WIDGET(button), "checkV4LMJPEG" );
725 b_v4l_mjpeg = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkV4LMJPEG));
728 entryV4LDecimation = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LDecimation" );
729 i_v4l_decimation = gtk_spin_button_get_value_as_int(entryV4LDecimation);
730 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":mjpeg:%d", (int)i_v4l_decimation );
734 if (pos >= VLC_MAX_MRL)
736 v4l_mrl[VLC_MAX_MRL-1]='\0';
737 msg_Err(p_intf, "Media Resource Locator is truncated to: %s", v4l_mrl);
740 PlaylistAddItem(GTK_WIDGET(button), (gchar*) &v4l_mrl);
745 PlaylistEvent (GtkWidget *widget,
754 onPlaylistColumnsChanged (GtkTreeView *treeview,
761 onPlaylistRowSelected (GtkTreeView *treeview,
762 gboolean start_editing,
770 onPlaylistRow (GtkTreeView *treeview,
772 GtkTreeViewColumn *column,
779 onUpdatePlaylist (GtkButton *button,
787 onDeletePlaylist (GtkButton *button,
795 onClearPlaylist (GtkButton *button,
798 intf_thread_t *p_intf = GtkGetIntf( button );
800 msg_Dbg(p_intf, "Clear playlist" );
805 onPreferenceSave (GtkButton *button,
808 intf_thread_t *p_intf = GtkGetIntf( button );
810 msg_Dbg(p_intf, "Preferences Save" );
815 onPreferenceApply (GtkButton *button,
818 intf_thread_t *p_intf = GtkGetIntf( button );
820 msg_Dbg(p_intf, "Preferences Apply" );
825 onPreferenceCancel (GtkButton *button,
828 intf_thread_t *p_intf = GtkGetIntf( button );
830 msg_Dbg(p_intf, "Preferences Cancel" );
835 onAddTranscodeToPlaylist (GtkButton *button,
838 intf_thread_t *p_intf = GtkGetIntf( button );
840 GtkEntry *entryVideoCodec = NULL;
841 GtkSpinButton *entryVideoBitrate = NULL;
842 GtkSpinButton *entryVideoBitrateTolerance = NULL;
843 GtkSpinButton *entryVideoKeyFrameInterval = NULL;
844 GtkCheckButton *checkVideoDeinterlace = NULL;
845 GtkEntry *entryAudioCodec = NULL;
846 GtkSpinButton *entryAudioBitrate = NULL;
847 const gchar *p_video_codec;
848 gint i_video_bitrate;
849 gint i_video_bitrate_tolerance;
850 gint i_video_keyframe_interval;
851 gboolean b_video_deinterlace;
852 const gchar *p_audio_codec;
853 gint i_audio_bitrate;
855 GtkEntry *entryStdAccess = NULL;
856 GtkEntry *entryStdMuxer = NULL;
857 GtkEntry *entryStdURL = NULL;
858 GtkSpinButton *entryStdTTL = NULL;
859 const gchar *p_std_access;
860 const gchar *p_std_muxer;
861 const gchar *p_std_url;
864 gchar mrl[VLC_MAX_MRL];
867 pos = snprintf( &mrl[0], VLC_MAX_MRL, "--sout '#transcode{");
869 entryVideoCodec = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryVideoCodec" );
870 entryVideoBitrate = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryVideoBitrate" );
871 entryVideoBitrateTolerance = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryVideoBitrateTolerance" );
872 entryVideoKeyFrameInterval = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryVideoKeyFrameInterval" );
874 p_video_codec = gtk_entry_get_text(GTK_ENTRY(entryVideoCodec));
875 i_video_bitrate = gtk_spin_button_get_value_as_int(entryVideoBitrate);
876 i_video_bitrate_tolerance = gtk_spin_button_get_value_as_int(entryVideoBitrateTolerance);
877 i_video_keyframe_interval = gtk_spin_button_get_value_as_int(entryVideoKeyFrameInterval);
879 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "vcodec=%s,", (char*)p_video_codec );
880 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "vb=%d,", (int)i_video_bitrate );
881 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "vt=%d,", (int)i_video_bitrate_tolerance );
882 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "keyint=%d,", (int)i_video_keyframe_interval );
884 checkVideoDeinterlace = (GtkCheckButton*) lookup_widget( GTK_WIDGET(button), "checkVideoDeinterlace" );
885 b_video_deinterlace = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkVideoDeinterlace));
886 if (b_video_deinterlace)
888 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "deinterlace," );
890 entryAudioCodec = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryAudioCodec" );
891 entryAudioBitrate = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryAudioBitrate" );
893 p_audio_codec = gtk_entry_get_text(GTK_ENTRY(entryAudioCodec));
894 i_audio_bitrate = gtk_spin_button_get_value_as_int(entryAudioBitrate);
896 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "acodec=%s,", (char*)p_audio_codec );
897 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "ab=%d", (int)i_audio_bitrate );
899 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "}:std{" );
901 entryStdAccess = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryStdAccess" );
902 entryStdMuxer = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryStdMuxer" );
903 entryStdURL = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryStdURL" );
904 entryStdTTL = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryStdTTL" );
906 p_std_access = gtk_entry_get_text(GTK_ENTRY(entryStdAccess));
907 p_std_muxer = gtk_entry_get_text(GTK_ENTRY(entryStdMuxer));
908 p_std_url = gtk_entry_get_text(GTK_ENTRY(entryStdURL));
910 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "access=%s,", (char*)p_std_access);
911 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "mux=%s,", (char*)p_std_muxer);
912 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "url=%s", (char*)p_std_url);
913 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "}'");
915 i_std_ttl = gtk_spin_button_get_value_as_int(entryStdTTL);
917 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, " --ttl=%d", (int)i_std_ttl);
919 if (pos >= VLC_MAX_MRL)
921 mrl[VLC_MAX_MRL-1]='\0';
922 msg_Err(p_intf, "Media Resource Locator is truncated to: %s", mrl );
925 PlaylistAddItem(GTK_WIDGET(button), (gchar*) &mrl);