renatofilho@586: #include <sys/stat.h>
renatofilho@586: #include <fcntl.h>
renatofilho@586: #include <unistd.h>
renatofilho@586: #include <string.h>
renatofilho@586: 
renatofilho@586: #include <gst/gst.h>
morphbr@748: #include <glib.h>
renatofilho@789: #include <libgnomevfs/gnome-vfs.h>
renatofilho@586: 
renatofilho@588: #include "gmencoder.h"
renatofilho@586: 
renatofilho@588: #define FILE_OUT  1
renatofilho@586: 
renatofilho@586: static GMainLoop *mainloop = NULL;
renatofilho@754: /*
renatofilho@754:  * Options 
renatofilho@754:  */
renatofilho@754: static gchar   *input_file = NULL;
renatofilho@754: static gchar   *video_encode = NULL;
renatofilho@754: static gchar   *video_opts = NULL;
renatofilho@754: static gdouble  video_fps = 0.0;
renatofilho@754: static gint     video_rate = 0;
renatofilho@754: static gint     video_width = 0;
renatofilho@754: static gint     video_height = 0;
renatofilho@754: static gchar   *audio_encode = NULL;
renatofilho@754: static gchar   *audio_opts = NULL;
renatofilho@754: static double   audio_rate = 0.0;
renatofilho@754: static gchar   *mux_name = NULL;
renatofilho@754: static gchar   *output_uri = NULL;
renatofilho@768: static gboolean chunked = FALSE;
renatofilho@777: static gboolean deinterlace = FALSE;
renatofilho@586: 
renatofilho@586: 
renatofilho@678: 
renatofilho@786: static gboolean
renatofilho@752: _quit(gpointer data)
renatofilho@678: {
renatofilho@780:     //g_object_unref(data);
renatofilho@754:     g_main_loop_quit(mainloop);
renatofilho@754:     return FALSE;
renatofilho@678: }
renatofilho@678: 
renatofilho@586: static void
renatofilho@752: _mencoder_eos_cb(GMencoder * mencoder, gpointer data)
morphbr@748: {
renatofilho@760:     g_print("PROGRESS: 100\n");
renatofilho@754:     g_idle_add(_quit, mencoder);
renatofilho@586: }
renatofilho@586: 
renatofilho@678: 
renatofilho@586: static void
renatofilho@752: _mencoder_error_cb(GMencoder * mencoder, const gchar * msg, gpointer data)
renatofilho@586: {
renatofilho@754:     g_print("Error: %s\n", msg);
renatofilho@754:     g_idle_add(_quit, mencoder);
renatofilho@586: }
renatofilho@586: 
renatofilho@754: static          gboolean
renatofilho@752: _io_channel_cb(GIOChannel * ch, GIOCondition condition, gpointer data)
renatofilho@586: {
renatofilho@754:     GString        *cmd = g_string_new("");
renatofilho@754:     g_io_channel_read_line_string(ch, cmd, NULL, NULL);
renatofilho@586: 
renatofilho@754:     if (strcmp(cmd->str, "PLAY\n") == 0) {
renatofilho@754:         g_mencoder_play_stream(G_MENCODER(data));
renatofilho@754:     } else if (strcmp(cmd->str, "PAUSE\n") == 0) {
renatofilho@754:         g_mencoder_pause_stream(G_MENCODER(data));
renatofilho@754:     } else if (strcmp(cmd->str, "STOP\n") == 0) {
renatofilho@754:         g_mencoder_close_stream(G_MENCODER(data));
renatofilho@754:     } else if (strcmp(cmd->str, "QUIT\n") == 0) {
renatofilho@754:         g_mencoder_close_stream(G_MENCODER(data));
renatofilho@754:         g_main_loop_quit(mainloop);
renatofilho@754:     }
renatofilho@754:     g_string_free(cmd, TRUE);
renatofilho@754:     return TRUE;
renatofilho@586: }
renatofilho@586: 
morphbr@748: int
renatofilho@752: main(int argc, char **argv)
renatofilho@586: {
renatofilho@754:     GMencoder      *coder = NULL;
renatofilho@754:     GIOChannel     *ch;
renatofilho@754:     gchar         **vopts;
renatofilho@754:     gchar         **aopts;
renatofilho@754:     gchar         **files;
renatofilho@754:     gint            i;
renatofilho@757:     gboolean      ret;
renatofilho@588: 
renatofilho@754:     GOptionContext *context;
renatofilho@754:     static const GOptionEntry options[] = {
renatofilho@754:         {"input-files", 'i', 0, G_OPTION_ARG_STRING, &input_file,
renatofilho@754:          "Input File", NULL},
morphbr@748: 
renatofilho@754:         {"video-encode", 0, 0, G_OPTION_ARG_STRING, &video_encode,
renatofilho@754:          "GstElementName for used to video encode", NULL},
morphbr@748: 
renatofilho@754:         {"video-opts", 0, 0, G_OPTION_ARG_STRING, &video_opts,
renatofilho@754:          "Properties to set on video element", NULL},
morphbr@748: 
renatofilho@754:         {"video-fps", 0, 0, G_OPTION_ARG_DOUBLE, &video_fps,
renatofilho@754:          "Video FPS", NULL},
morphbr@748: 
renatofilho@754:         {"video-rate", 0, 0, G_OPTION_ARG_INT, &video_rate,
renatofilho@754:          "Video rate", NULL},
morphbr@748: 
renatofilho@754:         {"video-width", 0, 0, G_OPTION_ARG_INT, &video_width,
renatofilho@754:          "Video width", NULL},
morphbr@748: 
renatofilho@754:         {"video-height", 0, 0, G_OPTION_ARG_INT, &video_height,
renatofilho@754:          "Video height", NULL},
morphbr@748: 
renatofilho@754:         {"audio-encode", 0, 0, G_OPTION_ARG_STRING, &audio_encode,
renatofilho@754:          "GstElementName for use to audio encode", NULL},
morphbr@748: 
renatofilho@754:         {"audio-opts", 0, 0, G_OPTION_ARG_STRING, &audio_opts,
renatofilho@754:          "Properties to set on audio element", NULL},
morphbr@748: 
renatofilho@754:         {"audio-rate", 0, 0, G_OPTION_ARG_INT, &audio_rate,
renatofilho@754:          "Audio rate", NULL},
morphbr@748: 
renatofilho@754:         {"mux-element", 0, 0, G_OPTION_ARG_STRING, &mux_name,
renatofilho@754:          "GstElementName for use to mux file", NULL},
morphbr@748: 
renatofilho@754:         {"output-uri", 'o', 0, G_OPTION_ARG_STRING, &output_uri,
renatofilho@754:          "Uri to output", NULL},
morphbr@748: 
renatofilho@768: 	{"chunked", 'c', 0, G_OPTION_ARG_NONE, &chunked, 
renatofilho@768:          "Send package chunked", NULL},
renatofilho@768: 
renatofilho@777: 	{"deinterlace", 'd', 0, G_OPTION_ARG_NONE, &deinterlace, 
renatofilho@777:          "Use to deinterlace videos", NULL},
renatofilho@777: 
renatofilho@777: 
renatofilho@754:         {NULL}
renatofilho@754:     };
renatofilho@586: 
renatofilho@754:     g_type_init();
renatofilho@754:     g_thread_init(NULL);
renatofilho@789:     gnome_vfs_init ();
renatofilho@754:     mainloop = g_main_loop_new(NULL, FALSE);
renatofilho@588: 
renatofilho@754:     g_set_prgname("gmemcoder");
renatofilho@754:     context = g_option_context_new(NULL);
renatofilho@754:     g_option_context_set_help_enabled(context, TRUE);
renatofilho@754:     g_option_context_add_main_entries(context, options, NULL);
renatofilho@754:     g_option_context_add_group(context, gst_init_get_option_group());
renatofilho@754:     g_option_context_parse(context, &argc, &argv, NULL);
renatofilho@588: 
renatofilho@754:     gst_init(&argc, &argv);
renatofilho@586: 
renatofilho@754:     if (output_uri == NULL) {
renatofilho@754:         g_print("You need to specify output-uri.\nTry --help "
renatofilho@754:                 "for more information.\n");
renatofilho@754:         return 1;
renatofilho@754:     }
renatofilho@588: 
renatofilho@754:     if (input_file == NULL) {
renatofilho@754:         g_print("You need to specify input file\nTry --help "
renatofilho@754:                 "for more information.\n");
renatofilho@754:     }
renatofilho@586: 
renatofilho@754:     coder = g_mencoder_new();
renatofilho@754:     ch = g_io_channel_unix_new(0);
renatofilho@586: 
renatofilho@757:     if (audio_opts != NULL)
renatofilho@757:         aopts = g_strsplit(audio_opts, ",", 0);
renatofilho@757:     else
renatofilho@757:         aopts = NULL;
renatofilho@588: 
renatofilho@757:     if (video_opts != NULL)
renatofilho@757:         vopts = g_strsplit(video_opts, ",", 0);
renatofilho@757:     else
renatofilho@757:         vopts = NULL;
renatofilho@588: 
renatofilho@777:     ret = g_mencoder_setup_stream(coder, chunked, deinterlace, mux_name,
renatofilho@757:                                   video_encode, vopts, video_fps,
renatofilho@757:                                   video_rate, video_width, video_height,
renatofilho@757:                                   audio_encode, aopts, audio_rate, output_uri);
renatofilho@757: 
renatofilho@757:     if (ret == TRUE) {
renatofilho@757:         files = g_strsplit(input_file, ",", 0);
renatofilho@757:         for (i = 0; i < g_strv_length(files); i++) {
renatofilho@757:             if (!g_mencoder_append_uri(coder, files[i])) {
renatofilho@757:                 g_debug("Invalid uri: %s", files[i]);
renatofilho@757:             }
renatofilho@754:         }
renatofilho@757:         g_strfreev(files);
renatofilho@754:     }
morphbr@748: 
renatofilho@754:     g_strfreev(aopts);
renatofilho@754:     g_strfreev(vopts);
renatofilho@586: 
renatofilho@757:     if (ret == TRUE) {
renatofilho@757:         g_io_add_watch(ch, G_IO_IN, _io_channel_cb, coder);
renatofilho@757:         g_signal_connect(G_OBJECT(coder),
renatofilho@757:                          "eos", G_CALLBACK(_mencoder_eos_cb), mainloop);
renatofilho@586: 
renatofilho@757:         g_signal_connect(G_OBJECT(coder),
renatofilho@757:                          "error", G_CALLBACK(_mencoder_error_cb), mainloop);
renatofilho@586: 
renatofilho@757:         g_mencoder_play_stream(coder);
renatofilho@757:         g_main_loop_run(mainloop);
renatofilho@757:     }
renatofilho@586: 
renatofilho@754:     g_object_unref(coder);
renatofilho@754:     return 0;
renatofilho@586: }