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