renatofilho@898: /* renatofilho@898: * arch-tag: GMencoder main file renatofilho@898: * renatofilho@898: * Copyright (C) 2007 INdT - Renato Filho renatofilho@898: * renatofilho@898: * This program is free software; you can redistribute it and/or modify renatofilho@898: * it under the terms of the GNU General Public License as published by renatofilho@898: * the Free Software Foundation; either version 2 of the License, or renatofilho@898: * (at your option) any later version. renatofilho@898: * renatofilho@898: * This program is distributed in the hope that it will be useful, renatofilho@898: * but WITHOUT ANY WARRANTY; without even the implied warranty of renatofilho@898: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the renatofilho@898: * GNU General Public License for more details. renatofilho@898: * renatofilho@898: * You should have received a copy of the GNU General Public License renatofilho@898: * along with this program; if not, write to the Free Software renatofilho@898: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. renatofilho@898: * renatofilho@898: */ renatofilho@898: renatofilho@586: #include renatofilho@586: #include renatofilho@586: #include renatofilho@586: #include renatofilho@586: renatofilho@586: #include morphbr@748: #include renatofilho@789: #include 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: }