gmyth-stream/gmemcoder/src/main.c
author morphbr
Tue Jun 12 22:13:46 2007 +0100 (2007-06-12)
branchtrunk
changeset 748 bf9dac4bdc5d
parent 691 726550e48c21
child 752 b7f71ba285da
permissions -rw-r--r--
[svn r754] * GMencoder:
- Fixed identation

* GMyth-Streamer:
- Bug fixes
- Status bug fix for mythtv files
     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 /* Options */
    15 static gchar*   input_file      = NULL;
    16 static gchar*   video_encode    = NULL;
    17 static gchar*   video_opts      = NULL;
    18 static gdouble  video_fps       = 0.0;
    19 static gint     video_rate      = 0;
    20 static gint     video_width     = 0;
    21 static gint     video_height    = 0;
    22 static gchar*   audio_encode    = NULL;
    23 static gchar*   audio_opts      = NULL;
    24 static double   audio_rate      = 0.0;
    25 static gchar*   mux_name        = NULL;
    26 static gchar*   output_uri      = NULL;
    27 
    28 
    29 
    30 static gboolean
    31 _quit (gpointer data)
    32 {
    33     g_object_unref (data);
    34     g_main_loop_quit (mainloop);
    35     return FALSE;
    36 }
    37 
    38 static void
    39 _mencoder_eos_cb (GMencoder *mencoder, gpointer data)
    40 {
    41     g_print ("EOS\n");
    42     g_idle_add (_quit, mencoder);
    43 }
    44 
    45 
    46 static void
    47 _mencoder_error_cb (GMencoder *mencoder, const gchar* msg, gpointer data)
    48 {
    49     g_print ("Error: %s\n", msg);
    50     g_idle_add (_quit, mencoder);
    51 }
    52 
    53 static gboolean
    54 _io_channel_cb (GIOChannel *ch,
    55                 GIOCondition condition,
    56                 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,
   160                              output_uri);
   161 
   162     files = g_strsplit (input_file, ",", 0);
   163     for (i=0; i < g_strv_length (files); i++) {
   164         if (!g_mencoder_append_uri (coder, files[i])) {
   165             g_debug ("Invalid uri: %s", files[i]);
   166         }
   167     }
   168 
   169     g_strfreev (files);
   170     g_strfreev (aopts);
   171     g_strfreev (vopts);
   172 
   173 
   174     g_io_add_watch (ch, G_IO_IN, _io_channel_cb, coder);
   175 
   176     g_signal_connect (G_OBJECT (coder),
   177                       "eos",
   178                       G_CALLBACK (_mencoder_eos_cb),
   179                       mainloop);
   180 
   181     g_signal_connect (G_OBJECT (coder),
   182                       "error",
   183                       G_CALLBACK (_mencoder_error_cb),
   184                       mainloop);
   185 
   186     g_mencoder_play_stream (coder);
   187 
   188     g_debug ("RUNNING..");
   189     g_main_loop_run (mainloop);
   190     g_debug ("DONE");
   191     g_object_unref (coder);
   192 
   193     return 0;
   194 }