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