gmyth-stream/gmencoder/src/main.c
author melunko
Wed Feb 27 11:00:07 2008 +0000 (2008-02-27)
branchtrunk
changeset 931 e8e3219edf5f
parent 898 4fbbacbbca34
permissions -rw-r--r--
[svn r940] Fixed Renato e-mail address in the copyright
renatofilho@898
     1
/* 
renatofilho@898
     2
 *  arch-tag: GMencoder main file
renatofilho@898
     3
 *
melunko@931
     4
 *  Copyright (C) 2007 INdT - Renato Filho <renato.filho@indt.org.br>
renatofilho@898
     5
 *
renatofilho@898
     6
 *  This program is free software; you can redistribute it and/or modify
renatofilho@898
     7
 *  it under the terms of the GNU General Public License as published by
renatofilho@898
     8
 *  the Free Software Foundation; either version 2 of the License, or
renatofilho@898
     9
 *  (at your option) any later version.
renatofilho@898
    10
 *
renatofilho@898
    11
 *  This program is distributed in the hope that it will be useful,
renatofilho@898
    12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
renatofilho@898
    13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
renatofilho@898
    14
 *  GNU General Public License for more details.
renatofilho@898
    15
 *
renatofilho@898
    16
 *  You should have received a copy of the GNU General Public License
renatofilho@898
    17
 *  along with this program; if not, write to the Free Software
renatofilho@898
    18
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.
renatofilho@898
    19
 *
renatofilho@898
    20
 */
renatofilho@898
    21
renatofilho@586
    22
#include <sys/stat.h>
renatofilho@586
    23
#include <fcntl.h>
renatofilho@586
    24
#include <unistd.h>
renatofilho@586
    25
#include <string.h>
renatofilho@586
    26
renatofilho@586
    27
#include <gst/gst.h>
morphbr@748
    28
#include <glib.h>
renatofilho@789
    29
#include <libgnomevfs/gnome-vfs.h>
renatofilho@586
    30
renatofilho@588
    31
#include "gmencoder.h"
renatofilho@586
    32
renatofilho@588
    33
#define FILE_OUT  1
renatofilho@586
    34
renatofilho@586
    35
static GMainLoop *mainloop = NULL;
renatofilho@754
    36
/*
renatofilho@754
    37
 * Options 
renatofilho@754
    38
 */
renatofilho@754
    39
static gchar   *input_file = NULL;
renatofilho@754
    40
static gchar   *video_encode = NULL;
renatofilho@754
    41
static gchar   *video_opts = NULL;
renatofilho@754
    42
static gdouble  video_fps = 0.0;
renatofilho@754
    43
static gint     video_rate = 0;
renatofilho@754
    44
static gint     video_width = 0;
renatofilho@754
    45
static gint     video_height = 0;
renatofilho@754
    46
static gchar   *audio_encode = NULL;
renatofilho@754
    47
static gchar   *audio_opts = NULL;
renatofilho@754
    48
static double   audio_rate = 0.0;
renatofilho@754
    49
static gchar   *mux_name = NULL;
renatofilho@754
    50
static gchar   *output_uri = NULL;
renatofilho@768
    51
static gboolean chunked = FALSE;
renatofilho@777
    52
static gboolean deinterlace = FALSE;
renatofilho@586
    53
renatofilho@586
    54
renatofilho@678
    55
renatofilho@786
    56
static gboolean
renatofilho@752
    57
_quit(gpointer data)
renatofilho@678
    58
{
renatofilho@780
    59
    //g_object_unref(data);
renatofilho@754
    60
    g_main_loop_quit(mainloop);
renatofilho@754
    61
    return FALSE;
renatofilho@678
    62
}
renatofilho@678
    63
renatofilho@586
    64
static void
renatofilho@752
    65
_mencoder_eos_cb(GMencoder * mencoder, gpointer data)
morphbr@748
    66
{
renatofilho@760
    67
    g_print("PROGRESS: 100\n");
renatofilho@754
    68
    g_idle_add(_quit, mencoder);
renatofilho@586
    69
}
renatofilho@586
    70
renatofilho@678
    71
renatofilho@586
    72
static void
renatofilho@752
    73
_mencoder_error_cb(GMencoder * mencoder, const gchar * msg, gpointer data)
renatofilho@586
    74
{
renatofilho@754
    75
    g_print("Error: %s\n", msg);
renatofilho@754
    76
    g_idle_add(_quit, mencoder);
renatofilho@586
    77
}
renatofilho@586
    78
renatofilho@754
    79
static          gboolean
renatofilho@752
    80
_io_channel_cb(GIOChannel * ch, GIOCondition condition, gpointer data)
renatofilho@586
    81
{
renatofilho@754
    82
    GString        *cmd = g_string_new("");
renatofilho@754
    83
    g_io_channel_read_line_string(ch, cmd, NULL, NULL);
renatofilho@586
    84
renatofilho@754
    85
    if (strcmp(cmd->str, "PLAY\n") == 0) {
renatofilho@754
    86
        g_mencoder_play_stream(G_MENCODER(data));
renatofilho@754
    87
    } else if (strcmp(cmd->str, "PAUSE\n") == 0) {
renatofilho@754
    88
        g_mencoder_pause_stream(G_MENCODER(data));
renatofilho@754
    89
    } else if (strcmp(cmd->str, "STOP\n") == 0) {
renatofilho@754
    90
        g_mencoder_close_stream(G_MENCODER(data));
renatofilho@754
    91
    } else if (strcmp(cmd->str, "QUIT\n") == 0) {
renatofilho@754
    92
        g_mencoder_close_stream(G_MENCODER(data));
renatofilho@754
    93
        g_main_loop_quit(mainloop);
renatofilho@754
    94
    }
renatofilho@754
    95
    g_string_free(cmd, TRUE);
renatofilho@754
    96
    return TRUE;
renatofilho@586
    97
}
renatofilho@586
    98
morphbr@748
    99
int
renatofilho@752
   100
main(int argc, char **argv)
renatofilho@586
   101
{
renatofilho@754
   102
    GMencoder      *coder = NULL;
renatofilho@754
   103
    GIOChannel     *ch;
renatofilho@754
   104
    gchar         **vopts;
renatofilho@754
   105
    gchar         **aopts;
renatofilho@754
   106
    gchar         **files;
renatofilho@754
   107
    gint            i;
renatofilho@757
   108
    gboolean      ret;
renatofilho@588
   109
renatofilho@754
   110
    GOptionContext *context;
renatofilho@754
   111
    static const GOptionEntry options[] = {
renatofilho@754
   112
        {"input-files", 'i', 0, G_OPTION_ARG_STRING, &input_file,
renatofilho@754
   113
         "Input File", NULL},
morphbr@748
   114
renatofilho@754
   115
        {"video-encode", 0, 0, G_OPTION_ARG_STRING, &video_encode,
renatofilho@754
   116
         "GstElementName for used to video encode", NULL},
morphbr@748
   117
renatofilho@754
   118
        {"video-opts", 0, 0, G_OPTION_ARG_STRING, &video_opts,
renatofilho@754
   119
         "Properties to set on video element", NULL},
morphbr@748
   120
renatofilho@754
   121
        {"video-fps", 0, 0, G_OPTION_ARG_DOUBLE, &video_fps,
renatofilho@754
   122
         "Video FPS", NULL},
morphbr@748
   123
renatofilho@754
   124
        {"video-rate", 0, 0, G_OPTION_ARG_INT, &video_rate,
renatofilho@754
   125
         "Video rate", NULL},
morphbr@748
   126
renatofilho@754
   127
        {"video-width", 0, 0, G_OPTION_ARG_INT, &video_width,
renatofilho@754
   128
         "Video width", NULL},
morphbr@748
   129
renatofilho@754
   130
        {"video-height", 0, 0, G_OPTION_ARG_INT, &video_height,
renatofilho@754
   131
         "Video height", NULL},
morphbr@748
   132
renatofilho@754
   133
        {"audio-encode", 0, 0, G_OPTION_ARG_STRING, &audio_encode,
renatofilho@754
   134
         "GstElementName for use to audio encode", NULL},
morphbr@748
   135
renatofilho@754
   136
        {"audio-opts", 0, 0, G_OPTION_ARG_STRING, &audio_opts,
renatofilho@754
   137
         "Properties to set on audio element", NULL},
morphbr@748
   138
renatofilho@754
   139
        {"audio-rate", 0, 0, G_OPTION_ARG_INT, &audio_rate,
renatofilho@754
   140
         "Audio rate", NULL},
morphbr@748
   141
renatofilho@754
   142
        {"mux-element", 0, 0, G_OPTION_ARG_STRING, &mux_name,
renatofilho@754
   143
         "GstElementName for use to mux file", NULL},
morphbr@748
   144
renatofilho@754
   145
        {"output-uri", 'o', 0, G_OPTION_ARG_STRING, &output_uri,
renatofilho@754
   146
         "Uri to output", NULL},
morphbr@748
   147
renatofilho@768
   148
	{"chunked", 'c', 0, G_OPTION_ARG_NONE, &chunked, 
renatofilho@768
   149
         "Send package chunked", NULL},
renatofilho@768
   150
renatofilho@777
   151
	{"deinterlace", 'd', 0, G_OPTION_ARG_NONE, &deinterlace, 
renatofilho@777
   152
         "Use to deinterlace videos", NULL},
renatofilho@777
   153
renatofilho@777
   154
renatofilho@754
   155
        {NULL}
renatofilho@754
   156
    };
renatofilho@586
   157
renatofilho@754
   158
    g_type_init();
renatofilho@754
   159
    g_thread_init(NULL);
renatofilho@789
   160
    gnome_vfs_init ();
renatofilho@754
   161
    mainloop = g_main_loop_new(NULL, FALSE);
renatofilho@588
   162
renatofilho@754
   163
    g_set_prgname("gmemcoder");
renatofilho@754
   164
    context = g_option_context_new(NULL);
renatofilho@754
   165
    g_option_context_set_help_enabled(context, TRUE);
renatofilho@754
   166
    g_option_context_add_main_entries(context, options, NULL);
renatofilho@754
   167
    g_option_context_add_group(context, gst_init_get_option_group());
renatofilho@754
   168
    g_option_context_parse(context, &argc, &argv, NULL);
renatofilho@588
   169
renatofilho@754
   170
    gst_init(&argc, &argv);
renatofilho@586
   171
renatofilho@754
   172
    if (output_uri == NULL) {
renatofilho@754
   173
        g_print("You need to specify output-uri.\nTry --help "
renatofilho@754
   174
                "for more information.\n");
renatofilho@754
   175
        return 1;
renatofilho@754
   176
    }
renatofilho@588
   177
renatofilho@754
   178
    if (input_file == NULL) {
renatofilho@754
   179
        g_print("You need to specify input file\nTry --help "
renatofilho@754
   180
                "for more information.\n");
renatofilho@754
   181
    }
renatofilho@586
   182
renatofilho@754
   183
    coder = g_mencoder_new();
renatofilho@754
   184
    ch = g_io_channel_unix_new(0);
renatofilho@586
   185
renatofilho@757
   186
    if (audio_opts != NULL)
renatofilho@757
   187
        aopts = g_strsplit(audio_opts, ",", 0);
renatofilho@757
   188
    else
renatofilho@757
   189
        aopts = NULL;
renatofilho@588
   190
renatofilho@757
   191
    if (video_opts != NULL)
renatofilho@757
   192
        vopts = g_strsplit(video_opts, ",", 0);
renatofilho@757
   193
    else
renatofilho@757
   194
        vopts = NULL;
renatofilho@588
   195
renatofilho@777
   196
    ret = g_mencoder_setup_stream(coder, chunked, deinterlace, mux_name,
renatofilho@757
   197
                                  video_encode, vopts, video_fps,
renatofilho@757
   198
                                  video_rate, video_width, video_height,
renatofilho@757
   199
                                  audio_encode, aopts, audio_rate, output_uri);
renatofilho@757
   200
renatofilho@757
   201
    if (ret == TRUE) {
renatofilho@757
   202
        files = g_strsplit(input_file, ",", 0);
renatofilho@757
   203
        for (i = 0; i < g_strv_length(files); i++) {
renatofilho@757
   204
            if (!g_mencoder_append_uri(coder, files[i])) {
renatofilho@757
   205
                g_debug("Invalid uri: %s", files[i]);
renatofilho@757
   206
            }
renatofilho@754
   207
        }
renatofilho@757
   208
        g_strfreev(files);
renatofilho@754
   209
    }
morphbr@748
   210
renatofilho@754
   211
    g_strfreev(aopts);
renatofilho@754
   212
    g_strfreev(vopts);
renatofilho@586
   213
renatofilho@757
   214
    if (ret == TRUE) {
renatofilho@757
   215
        g_io_add_watch(ch, G_IO_IN, _io_channel_cb, coder);
renatofilho@757
   216
        g_signal_connect(G_OBJECT(coder),
renatofilho@757
   217
                         "eos", G_CALLBACK(_mencoder_eos_cb), mainloop);
renatofilho@586
   218
renatofilho@757
   219
        g_signal_connect(G_OBJECT(coder),
renatofilho@757
   220
                         "error", G_CALLBACK(_mencoder_error_cb), mainloop);
renatofilho@586
   221
renatofilho@757
   222
        g_mencoder_play_stream(coder);
renatofilho@757
   223
        g_main_loop_run(mainloop);
renatofilho@757
   224
    }
renatofilho@586
   225
renatofilho@754
   226
    g_object_unref(coder);
renatofilho@754
   227
    return 0;
renatofilho@586
   228
}