gmyth-stream/gmemcoder/src/main.c
author renatofilho
Fri Jun 22 16:14:21 2007 +0100 (2007-06-22)
branchtrunk
changeset 756 59623bb25c17
parent 752 b7f71ba285da
child 757 d03fc6221891
permissions -rw-r--r--
[svn r762] fixed bug with outputfile
     1 #include <sys/stat.h>
     2 #include <fcntl.h>
     3 #include <unistd.h>
     4 #include <string.h>
     5 
     6 #include <gst/gst.h>
     7 #include <glib.h>
     8 
     9 #include "gmencoder.h"
    10 
    11 #define FILE_OUT  1
    12 
    13 static GMainLoop *mainloop = NULL;
    14 /*
    15  * Options 
    16  */
    17 static gchar   *input_file = NULL;
    18 static gchar   *video_encode = NULL;
    19 static gchar   *video_opts = NULL;
    20 static gdouble  video_fps = 0.0;
    21 static gint     video_rate = 0;
    22 static gint     video_width = 0;
    23 static gint     video_height = 0;
    24 static gchar   *audio_encode = NULL;
    25 static gchar   *audio_opts = NULL;
    26 static double   audio_rate = 0.0;
    27 static gchar   *mux_name = NULL;
    28 static gchar   *output_uri = NULL;
    29 
    30 
    31 
    32 static          gboolean
    33 _quit(gpointer data)
    34 {
    35     g_object_unref(data);
    36     g_main_loop_quit(mainloop);
    37     return FALSE;
    38 }
    39 
    40 static void
    41 _mencoder_eos_cb(GMencoder * mencoder, gpointer data)
    42 {
    43     g_print("EOS\n");
    44     g_idle_add(_quit, mencoder);
    45 }
    46 
    47 
    48 static void
    49 _mencoder_error_cb(GMencoder * mencoder, const gchar * msg, gpointer data)
    50 {
    51     g_print("Error: %s\n", msg);
    52     g_idle_add(_quit, mencoder);
    53 }
    54 
    55 static          gboolean
    56 _io_channel_cb(GIOChannel * ch, GIOCondition condition, gpointer data)
    57 {
    58     GString        *cmd = g_string_new("");
    59     g_io_channel_read_line_string(ch, cmd, NULL, NULL);
    60 
    61     if (strcmp(cmd->str, "PLAY\n") == 0) {
    62         g_mencoder_play_stream(G_MENCODER(data));
    63     } else if (strcmp(cmd->str, "PAUSE\n") == 0) {
    64         g_mencoder_pause_stream(G_MENCODER(data));
    65     } else if (strcmp(cmd->str, "STOP\n") == 0) {
    66         g_mencoder_close_stream(G_MENCODER(data));
    67     } else if (strcmp(cmd->str, "QUIT\n") == 0) {
    68         g_mencoder_close_stream(G_MENCODER(data));
    69         g_main_loop_quit(mainloop);
    70     }
    71     g_string_free(cmd, TRUE);
    72     return TRUE;
    73 }
    74 
    75 int
    76 main(int argc, char **argv)
    77 {
    78     GMencoder      *coder = NULL;
    79     GIOChannel     *ch;
    80     gchar         **vopts;
    81     gchar         **aopts;
    82     gchar         **files;
    83     gint            i;
    84 
    85     GOptionContext *context;
    86     static const GOptionEntry options[] = {
    87         {"input-files", 'i', 0, G_OPTION_ARG_STRING, &input_file,
    88          "Input File", NULL},
    89 
    90         {"video-encode", 0, 0, G_OPTION_ARG_STRING, &video_encode,
    91          "GstElementName for used to video encode", NULL},
    92 
    93         {"video-opts", 0, 0, G_OPTION_ARG_STRING, &video_opts,
    94          "Properties to set on video element", NULL},
    95 
    96         {"video-fps", 0, 0, G_OPTION_ARG_DOUBLE, &video_fps,
    97          "Video FPS", NULL},
    98 
    99         {"video-rate", 0, 0, G_OPTION_ARG_INT, &video_rate,
   100          "Video rate", NULL},
   101 
   102         {"video-width", 0, 0, G_OPTION_ARG_INT, &video_width,
   103          "Video width", NULL},
   104 
   105         {"video-height", 0, 0, G_OPTION_ARG_INT, &video_height,
   106          "Video height", NULL},
   107 
   108         {"audio-encode", 0, 0, G_OPTION_ARG_STRING, &audio_encode,
   109          "GstElementName for use to audio encode", NULL},
   110 
   111         {"audio-opts", 0, 0, G_OPTION_ARG_STRING, &audio_opts,
   112          "Properties to set on audio element", NULL},
   113 
   114         {"audio-rate", 0, 0, G_OPTION_ARG_INT, &audio_rate,
   115          "Audio rate", NULL},
   116 
   117         {"mux-element", 0, 0, G_OPTION_ARG_STRING, &mux_name,
   118          "GstElementName for use to mux file", NULL},
   119 
   120         {"output-uri", 'o', 0, G_OPTION_ARG_STRING, &output_uri,
   121          "Uri to output", NULL},
   122 
   123         {NULL}
   124     };
   125 
   126     g_type_init();
   127     g_thread_init(NULL);
   128     mainloop = g_main_loop_new(NULL, FALSE);
   129 
   130     g_set_prgname("gmemcoder");
   131     context = g_option_context_new(NULL);
   132     g_option_context_set_help_enabled(context, TRUE);
   133     g_option_context_add_main_entries(context, options, NULL);
   134     g_option_context_add_group(context, gst_init_get_option_group());
   135     g_option_context_parse(context, &argc, &argv, NULL);
   136 
   137     gst_init(&argc, &argv);
   138 
   139     if (output_uri == NULL) {
   140         g_print("You need to specify output-uri.\nTry --help "
   141                 "for more information.\n");
   142         return 1;
   143     }
   144 
   145     if (input_file == NULL) {
   146         g_print("You need to specify input file\nTry --help "
   147                 "for more information.\n");
   148     }
   149 
   150     coder = g_mencoder_new();
   151     ch = g_io_channel_unix_new(0);
   152 
   153     aopts = g_strsplit(audio_opts, ",", 0);
   154     vopts = g_strsplit(video_opts, ",", 0);
   155 
   156     g_mencoder_setup_stream(coder, mux_name,
   157                             video_encode, vopts, video_fps,
   158                             video_rate, video_width, video_height,
   159                             audio_encode, aopts, audio_rate, output_uri);
   160 
   161     files = g_strsplit(input_file, ",", 0);
   162     for (i = 0; i < g_strv_length(files); i++) {
   163         if (!g_mencoder_append_uri(coder, files[i])) {
   164             g_debug("Invalid uri: %s", files[i]);
   165         }
   166     }
   167 
   168     g_strfreev(files);
   169     g_strfreev(aopts);
   170     g_strfreev(vopts);
   171 
   172 
   173     g_io_add_watch(ch, G_IO_IN, _io_channel_cb, coder);
   174 
   175     g_signal_connect(G_OBJECT(coder),
   176                      "eos", G_CALLBACK(_mencoder_eos_cb), mainloop);
   177 
   178     g_signal_connect(G_OBJECT(coder),
   179                      "error", G_CALLBACK(_mencoder_error_cb), mainloop);
   180 
   181     g_mencoder_play_stream(coder);
   182 
   183     g_debug("RUNNING..");
   184     g_main_loop_run(mainloop);
   185     g_debug("DONE");
   186     g_object_unref(coder);
   187 
   188     return 0;
   189 }