gmyth-stream/gmemcoder/src/gmemcoder.c
author melunko
Mon Apr 23 19:16:24 2007 +0100 (2007-04-23)
branchtrunk
changeset 587 747b409e4f01
permissions -rw-r--r--
[svn r593] Fixed internal reference to gmyth.h. We can not include this header in src/gmyth_* files. Also fixed gmyth_debug link error. In the current implementation we need to include gmyth_debug.h in all files using gmyth_debug(), otherwise we will get library linking error
renatofilho@586
     1
#ifdef HAVE_CONFIG_H
renatofilho@586
     2
#include "config.h"
renatofilho@586
     3
#endif
renatofilho@586
     4
renatofilho@586
     5
#include <glib.h>
renatofilho@586
     6
#include <gst/gst.h>
renatofilho@586
     7
#include <string.h>
renatofilho@586
     8
renatofilho@586
     9
#include "gmemcoder.h"
renatofilho@586
    10
renatofilho@586
    11
#define G_MENCODER_GET_PRIVATE(obj) \
renatofilho@586
    12
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), G_TYPE_MENCODER, GMencoderPrivate))
renatofilho@586
    13
renatofilho@586
    14
renatofilho@586
    15
typedef struct _GMencoderPrivate GMencoderPrivate;
renatofilho@586
    16
renatofilho@586
    17
struct _GMencoderPrivate
renatofilho@586
    18
{    
renatofilho@586
    19
	GstElement *pipe;
renatofilho@586
    20
	GstElement *abin;
renatofilho@586
    21
	GstElement *vbin;
renatofilho@586
    22
	GstElement *sink;
renatofilho@586
    23
	gboolean ready;
renatofilho@586
    24
};
renatofilho@586
    25
renatofilho@586
    26
enum {
renatofilho@586
    27
  READY,
renatofilho@586
    28
  PAUSED,
renatofilho@586
    29
  PLAYING,
renatofilho@586
    30
  STOPED,
renatofilho@586
    31
  EOS,
renatofilho@586
    32
  ERROR,
renatofilho@586
    33
  LAST_SIGNAL
renatofilho@586
    34
};
renatofilho@586
    35
renatofilho@586
    36
static void g_mencoder_class_init       (GMencoderClass *klass);
renatofilho@586
    37
static void g_mencoder_init             (GMencoder *object);
renatofilho@586
    38
static void g_mencoder_dispose  	    (GObject *object);
renatofilho@586
    39
static void g_mencoder_finalize 	    (GObject *object);
renatofilho@586
    40
static gboolean 
renatofilho@586
    41
            _pipeline_bus_cb            (GstBus     *bus,
renatofilho@586
    42
		                                 GstMessage *msg,
renatofilho@586
    43
		                                 gpointer    user_data);
renatofilho@586
    44
renatofilho@586
    45
static void _decodebin_new_pad_cb 		(GstElement* object,
renatofilho@586
    46
				                         GstPad* pad,
renatofilho@586
    47
				                         gboolean flag,
renatofilho@586
    48
				                         gpointer user_data);
renatofilho@586
    49
static void  _decodebin_unknown_type_cb (GstElement* object,
renatofilho@586
    50
		                         	     GstPad* pad,
renatofilho@586
    51
                                         GstCaps* caps,
renatofilho@586
    52
                                         gpointer user_data);
renatofilho@586
    53
renatofilho@586
    54
static guint g_mencoder_signals[LAST_SIGNAL] = { 0 };
renatofilho@586
    55
renatofilho@586
    56
G_DEFINE_TYPE(GMencoder, g_mencoder, G_TYPE_OBJECT)
renatofilho@586
    57
renatofilho@586
    58
static void
renatofilho@586
    59
g_mencoder_class_init (GMencoderClass *klass)
renatofilho@586
    60
{   
renatofilho@586
    61
	GObjectClass *object_class;
renatofilho@586
    62
renatofilho@586
    63
	object_class = (GObjectClass *) klass;
renatofilho@586
    64
renatofilho@586
    65
	g_type_class_add_private (klass, sizeof (GMencoderPrivate));
renatofilho@586
    66
        
renatofilho@586
    67
	object_class->dispose  = g_mencoder_dispose;
renatofilho@586
    68
	object_class->finalize = g_mencoder_finalize;	
renatofilho@586
    69
	
renatofilho@586
    70
    g_mencoder_signals[READY] =
renatofilho@586
    71
        g_signal_new ("ready",
renatofilho@586
    72
    		  G_OBJECT_CLASS_TYPE (object_class),
renatofilho@586
    73
    		  G_SIGNAL_RUN_FIRST,
renatofilho@586
    74
    		  0, NULL, NULL,
renatofilho@586
    75
    		  g_cclosure_marshal_VOID__VOID,
renatofilho@586
    76
    		  G_TYPE_NONE, 0);
renatofilho@586
    77
renatofilho@586
    78
    g_mencoder_signals[PAUSED] =
renatofilho@586
    79
        g_signal_new ("paused",
renatofilho@586
    80
    		  G_OBJECT_CLASS_TYPE (object_class),
renatofilho@586
    81
    		  G_SIGNAL_RUN_FIRST,
renatofilho@586
    82
    		  0, NULL, NULL,
renatofilho@586
    83
    		  g_cclosure_marshal_VOID__VOID,
renatofilho@586
    84
    		  G_TYPE_NONE, 0);
renatofilho@586
    85
    		  
renatofilho@586
    86
    g_mencoder_signals[PLAYING] =
renatofilho@586
    87
        g_signal_new ("playing",
renatofilho@586
    88
    		  G_OBJECT_CLASS_TYPE (object_class),
renatofilho@586
    89
    		  G_SIGNAL_RUN_FIRST,
renatofilho@586
    90
    		  0, NULL, NULL,
renatofilho@586
    91
              g_cclosure_marshal_VOID__VOID,
renatofilho@586
    92
    		  G_TYPE_NONE, 0);
renatofilho@586
    93
renatofilho@586
    94
    g_mencoder_signals[STOPED] =
renatofilho@586
    95
        g_signal_new ("stoped",
renatofilho@586
    96
    		  G_OBJECT_CLASS_TYPE (object_class),
renatofilho@586
    97
    		  G_SIGNAL_RUN_FIRST,
renatofilho@586
    98
    		  0, NULL, NULL,
renatofilho@586
    99
    		  g_cclosure_marshal_VOID__VOID,
renatofilho@586
   100
    		  G_TYPE_NONE, 0);
renatofilho@586
   101
renatofilho@586
   102
    g_mencoder_signals[EOS] =
renatofilho@586
   103
        g_signal_new ("eos",
renatofilho@586
   104
    		  G_OBJECT_CLASS_TYPE (object_class),
renatofilho@586
   105
    		  G_SIGNAL_RUN_FIRST,
renatofilho@586
   106
    		  0, NULL, NULL,
renatofilho@586
   107
    		  g_cclosure_marshal_VOID__VOID,
renatofilho@586
   108
    		  G_TYPE_NONE, 0);
renatofilho@586
   109
    		  
renatofilho@586
   110
    		  
renatofilho@586
   111
    g_mencoder_signals[ERROR] =
renatofilho@586
   112
        g_signal_new ("error",
renatofilho@586
   113
    		  G_OBJECT_CLASS_TYPE (object_class),
renatofilho@586
   114
    		  G_SIGNAL_RUN_FIRST,
renatofilho@586
   115
    		  0, NULL, NULL,
renatofilho@586
   116
    		  g_cclosure_marshal_VOID__STRING,
renatofilho@586
   117
    		  G_TYPE_NONE, 1, G_TYPE_STRING);	
renatofilho@586
   118
}
renatofilho@586
   119
renatofilho@586
   120
static void
renatofilho@586
   121
g_mencoder_init (GMencoder *self)
renatofilho@586
   122
{
renatofilho@586
   123
}
renatofilho@586
   124
renatofilho@586
   125
static void 
renatofilho@586
   126
g_mencoder_dispose (GObject *object)
renatofilho@586
   127
{
renatofilho@586
   128
}
renatofilho@586
   129
renatofilho@586
   130
static void 
renatofilho@586
   131
g_mencoder_finalize (GObject *object)
renatofilho@586
   132
{
renatofilho@586
   133
	g_mencoder_close_stream (G_MENCODER (object));
renatofilho@586
   134
}
renatofilho@586
   135
renatofilho@586
   136
GMencoder*  
renatofilho@586
   137
g_mencoder_new (void)
renatofilho@586
   138
{
renatofilho@586
   139
    return g_object_new (G_TYPE_MENCODER, NULL);
renatofilho@586
   140
}
renatofilho@586
   141
renatofilho@586
   142
renatofilho@586
   143
gboolean
renatofilho@586
   144
g_mencoder_setup_stream (GMencoder *self, 
renatofilho@586
   145
                         const gchar* uri, 
renatofilho@586
   146
                         guint width, guint height,
renatofilho@586
   147
                         gint out_fd)
renatofilho@586
   148
{
renatofilho@586
   149
	GstBus *bus = NULL;
renatofilho@586
   150
	GstElement *pipe = NULL;
renatofilho@586
   151
	GstElement *decode = NULL;
renatofilho@586
   152
	GstElement *fdsink = NULL;
renatofilho@586
   153
    GstElement *mux = NULL;
renatofilho@586
   154
renatofilho@586
   155
	GstCaps *vscale_caps = NULL;
renatofilho@586
   156
	GstPad *asinkpad = NULL;
renatofilho@586
   157
	GstPad *vsinkpad = NULL;
renatofilho@586
   158
    GstPad *video_src_pad = NULL;
renatofilho@586
   159
    GstPad *audio_src_pad = NULL;
renatofilho@586
   160
    GstPad *mux_pad = NULL;
renatofilho@586
   161
	GstElement *src = NULL;
renatofilho@586
   162
	GstElement *vbin, *vqueue, *vcolorspace, *vscale, *vrate, *vencode, *vqueue_src;
renatofilho@586
   163
	GstElement *abin, *aqueue, *aconvert, *aencode, *aqueue_src;
renatofilho@586
   164
	GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE (self);
renatofilho@586
   165
	
renatofilho@586
   166
	vbin = vqueue = vscale = vrate = vencode = vqueue_src = NULL;
renatofilho@586
   167
	abin = aqueue = aconvert = aencode = aqueue_src = NULL;
renatofilho@586
   168
renatofilho@586
   169
	pipe = gst_pipeline_new ("pipe");
renatofilho@586
   170
	src = gst_element_make_from_uri (GST_URI_SRC, uri, "src");
renatofilho@586
   171
	if (src == NULL) 
renatofilho@586
   172
		goto error;
renatofilho@586
   173
renatofilho@586
   174
	decode = gst_element_factory_make ("decodebin", "decode");
renatofilho@586
   175
	if (decode == NULL) 
renatofilho@586
   176
		goto error;
renatofilho@586
   177
	
renatofilho@586
   178
    mux = gst_element_factory_make ("ffmux_mpeg", "mux");
renatofilho@586
   179
    if (mux == NULL)
renatofilho@586
   180
        goto error;
renatofilho@586
   181
renatofilho@586
   182
    fdsink = gst_element_factory_make ("fdsink", "sink");
renatofilho@586
   183
    if (fdsink == NULL)
renatofilho@586
   184
        goto error;
renatofilho@586
   185
renatofilho@586
   186
    g_debug ("Setting fd to %d", out_fd);
renatofilho@586
   187
    g_object_set (G_OBJECT (fdsink), "fd", out_fd, NULL);        		
renatofilho@586
   188
	
renatofilho@586
   189
	//queue ! videoscale ! video/x-raw-yuv,width=240,height=144 ! videorate ! ffenc_h263p bitrate=256000 me-method=2 ! rtph263ppay ! udpsink  host=224.0.0.1 port=5000
renatofilho@586
   190
renatofilho@586
   191
	vbin    = gst_bin_new ("vbin");
renatofilho@586
   192
	vqueue	= gst_element_factory_make ("queue", "vqueue");
renatofilho@586
   193
	vscale  = gst_element_factory_make ("videoscale", "vscale");
renatofilho@586
   194
	vcolorspace = gst_element_factory_make ("ffmpegcolorspace", "colorspace");
renatofilho@586
   195
	vrate   = gst_element_factory_make ("videorate", "vrate");
renatofilho@586
   196
	vencode = gst_element_factory_make ("ffenc_mpeg1video", "vencode");
renatofilho@586
   197
	vqueue_src = gst_element_factory_make ("queue", "queue_src");
renatofilho@586
   198
renatofilho@586
   199
	
renatofilho@586
   200
	if ((vbin == NULL) || (vqueue == NULL) || (vcolorspace == NULL) 
renatofilho@586
   201
	    || (vscale == NULL) || (vrate == NULL) 
renatofilho@586
   202
		|| (vencode == NULL) || (vqueue_src == NULL)) {
renatofilho@586
   203
		g_warning ("Video elements not found");
renatofilho@586
   204
		goto error;
renatofilho@586
   205
	}
renatofilho@586
   206
renatofilho@586
   207
	g_object_set (G_OBJECT (vencode), "bitrate", 200, "pass", 2, "quantizer", 5, NULL);
renatofilho@586
   208
		
renatofilho@586
   209
	gst_bin_add_many (GST_BIN (vbin), vqueue, vscale, vcolorspace, vrate, vencode, vqueue_src, NULL);
renatofilho@586
   210
    gst_element_link (vqueue, vscale);
renatofilho@586
   211
renatofilho@586
   212
	
renatofilho@586
   213
	vscale_caps = gst_caps_new_simple ("video/x-raw-yuv",
renatofilho@586
   214
					   "width", G_TYPE_INT, 320,
renatofilho@586
   215
					   "height", G_TYPE_INT, 288,                           
renatofilho@586
   216
					   NULL);
renatofilho@586
   217
					   	
renatofilho@586
   218
	if (gst_element_link_filtered (vscale, vcolorspace, vscale_caps) == FALSE) {
renatofilho@586
   219
	    g_warning ("Fail to resize video");
renatofilho@586
   220
	    goto error;
renatofilho@586
   221
	}
renatofilho@586
   222
	
renatofilho@586
   223
	if (gst_element_link (vcolorspace, vrate) == FALSE) {
renatofilho@586
   224
	    g_warning ("Fail to link video elements");
renatofilho@586
   225
	    goto error;
renatofilho@586
   226
	}
renatofilho@586
   227
renatofilho@586
   228
    gst_caps_unref (vscale_caps);
renatofilho@586
   229
renatofilho@586
   230
	vscale_caps = gst_caps_new_simple ("video/x-raw-yuv",
renatofilho@586
   231
					   "framerate", GST_TYPE_FRACTION, 10, 1, NULL);
renatofilho@586
   232
renatofilho@586
   233
    if (gst_element_link_filtered (vrate, vencode, vscale_caps) == FALSE) { 
renatofilho@586
   234
        g_warning ("Fail to link vrate with vencode.");
renatofilho@586
   235
        goto error;
renatofilho@586
   236
renatofilho@586
   237
    }
renatofilho@586
   238
renatofilho@586
   239
    gst_element_link (vencode, vqueue_src);
renatofilho@586
   240
renatofilho@586
   241
	// ghost pad the video  bin
renatofilho@586
   242
   	vsinkpad = gst_element_get_pad (vqueue, "sink");
renatofilho@586
   243
   	gst_element_add_pad (vbin, gst_ghost_pad_new ("sink", vsinkpad));	
renatofilho@586
   244
	gst_object_unref (vsinkpad);
renatofilho@586
   245
	
renatofilho@586
   246
   	video_src_pad = gst_element_get_pad (vqueue_src, "src");
renatofilho@586
   247
   	gst_element_add_pad (vbin, gst_ghost_pad_new ("src", video_src_pad));	
renatofilho@586
   248
	gst_object_unref (video_src_pad);
renatofilho@586
   249
renatofilho@586
   250
renatofilho@586
   251
    //audio/x-raw-int ! queue ! audioconvert ! faac ! rtpmp4gpay !  udpsink name=upd_audio host=224.0.0.1 port=5002	
renatofilho@586
   252
	abin 	= gst_bin_new ("abin");
renatofilho@586
   253
	aqueue	= gst_element_factory_make ("queue", "aqueue");
renatofilho@586
   254
	aconvert= gst_element_factory_make ("audioconvert", "aconvert");
renatofilho@586
   255
	aencode = gst_element_factory_make ("lame", "aencode");
renatofilho@586
   256
	aqueue_src= gst_element_factory_make ("queue", "aqueue_src");	
renatofilho@586
   257
renatofilho@586
   258
	if ((abin == NULL) || (aqueue == NULL) || (aconvert == NULL) 
renatofilho@586
   259
		|| (aencode == NULL) || (aqueue_src == NULL)) {
renatofilho@586
   260
		g_warning ("Audio elements not found");
renatofilho@586
   261
		goto error;
renatofilho@586
   262
	}
renatofilho@586
   263
renatofilho@586
   264
	gst_bin_add_many (GST_BIN (abin), aqueue, aconvert, aencode, aqueue_src, NULL);
renatofilho@586
   265
	gst_element_link_many (aqueue, aconvert, aencode, aqueue_src, NULL);
renatofilho@586
   266
renatofilho@586
   267
renatofilho@586
   268
	// ghost pad the audio bin
renatofilho@586
   269
   	asinkpad = gst_element_get_pad (aqueue, "sink");
renatofilho@586
   270
   	gst_element_add_pad (abin, gst_ghost_pad_new("sink", asinkpad));
renatofilho@586
   271
	gst_object_unref (asinkpad);
renatofilho@586
   272
	
renatofilho@586
   273
   	audio_src_pad = gst_element_get_pad (aqueue_src, "src");
renatofilho@586
   274
   	gst_element_add_pad (abin, gst_ghost_pad_new("src", audio_src_pad));
renatofilho@586
   275
    gst_object_unref (audio_src_pad);
renatofilho@586
   276
	
renatofilho@586
   277
	
renatofilho@586
   278
	// Finish Pipe
renatofilho@586
   279
	gst_bin_add_many (GST_BIN (pipe), src, decode, abin, vbin, mux, fdsink, NULL);
renatofilho@586
   280
	gst_element_link (src, decode);
renatofilho@586
   281
renatofilho@586
   282
    //Link bins with mux
renatofilho@586
   283
    audio_src_pad = gst_element_get_pad (abin, "src");
renatofilho@586
   284
    mux_pad = gst_element_get_pad (mux, "audio_0");
renatofilho@586
   285
    if (gst_pad_link (audio_src_pad, mux_pad) != GST_PAD_LINK_OK) {
renatofilho@586
   286
        g_warning ("Fail link audio and mux");
renatofilho@586
   287
        goto error;
renatofilho@586
   288
   
renatofilho@586
   289
    }
renatofilho@586
   290
	gst_object_unref (audio_src_pad);
renatofilho@586
   291
    gst_object_unref (mux_pad);
renatofilho@586
   292
    audio_src_pad = NULL;
renatofilho@586
   293
    mux_pad = NULL;
renatofilho@586
   294
renatofilho@586
   295
    video_src_pad = gst_element_get_pad (vbin, "src");
renatofilho@586
   296
    mux_pad = gst_element_get_pad (mux, "video_0");
renatofilho@586
   297
    if (gst_pad_link (video_src_pad, mux_pad) != GST_PAD_LINK_OK) {
renatofilho@586
   298
        g_warning ("Fail link video and mux");
renatofilho@586
   299
        goto error;
renatofilho@586
   300
    }
renatofilho@586
   301
    gst_object_unref (video_src_pad);
renatofilho@586
   302
    gst_object_unref (mux_pad);
renatofilho@586
   303
    video_src_pad = NULL;
renatofilho@586
   304
    mux_pad = NULL;
renatofilho@586
   305
renatofilho@586
   306
    //Link mux with sink
renatofilho@586
   307
    gst_element_link (mux, fdsink);
renatofilho@586
   308
renatofilho@586
   309
	bus = gst_pipeline_get_bus (GST_PIPELINE (pipe));
renatofilho@586
   310
	gst_bus_add_watch (bus, _pipeline_bus_cb, self);
renatofilho@586
   311
	gst_object_unref (bus);
renatofilho@586
   312
renatofilho@586
   313
	g_signal_connect (G_OBJECT (decode), 
renatofilho@586
   314
				"new-decoded-pad",
renatofilho@586
   315
				G_CALLBACK (_decodebin_new_pad_cb),
renatofilho@586
   316
				self);
renatofilho@586
   317
	
renatofilho@586
   318
	g_signal_connect (G_OBJECT (decode),
renatofilho@586
   319
				"unknown-type",
renatofilho@586
   320
				G_CALLBACK (_decodebin_unknown_type_cb),
renatofilho@586
   321
				self);
renatofilho@586
   322
renatofilho@586
   323
	g_debug ("Setting pipe to PAUSE");
renatofilho@586
   324
renatofilho@586
   325
	priv->pipe = pipe;
renatofilho@586
   326
	priv->abin = abin;
renatofilho@586
   327
	priv->vbin = vbin;
renatofilho@586
   328
	priv->sink = fdsink;
renatofilho@586
   329
	priv->ready = FALSE;
renatofilho@586
   330
	
renatofilho@586
   331
	gst_element_set_state (pipe, GST_STATE_PAUSED);	   	
renatofilho@586
   332
    g_debug ("End SETUP");
renatofilho@586
   333
	return  TRUE;
renatofilho@586
   334
	
renatofilho@586
   335
error:
renatofilho@586
   336
	g_warning ("Invalid uri");
renatofilho@586
   337
renatofilho@586
   338
	if (pipe != NULL)
renatofilho@586
   339
		gst_object_unref (pipe);
renatofilho@586
   340
renatofilho@586
   341
	if (src != NULL)
renatofilho@586
   342
		gst_object_unref (src);
renatofilho@586
   343
renatofilho@586
   344
	if (decode != NULL)
renatofilho@586
   345
		gst_object_unref (decode);
renatofilho@586
   346
renatofilho@586
   347
	if (vscale_caps != NULL)
renatofilho@586
   348
		gst_caps_unref  (vscale_caps);
renatofilho@586
   349
renatofilho@586
   350
	if (vbin != NULL)
renatofilho@586
   351
		gst_object_unref (vbin);
renatofilho@586
   352
renatofilho@586
   353
	if (vqueue != NULL)
renatofilho@586
   354
		gst_object_unref (vqueue);
renatofilho@586
   355
renatofilho@586
   356
	if (vrate != NULL)
renatofilho@586
   357
		gst_object_unref (vrate);
renatofilho@586
   358
renatofilho@586
   359
	if (vencode != NULL)
renatofilho@586
   360
		gst_object_unref (vencode);
renatofilho@586
   361
renatofilho@586
   362
	if (vqueue_src != NULL)
renatofilho@586
   363
		gst_object_unref (vqueue_src);
renatofilho@586
   364
renatofilho@586
   365
	if (abin != NULL)
renatofilho@586
   366
		gst_object_unref (abin);
renatofilho@586
   367
renatofilho@586
   368
	if (aqueue != NULL)
renatofilho@586
   369
		gst_object_unref (aqueue);
renatofilho@586
   370
renatofilho@586
   371
	if (aconvert != NULL)
renatofilho@586
   372
		gst_object_unref (aconvert);
renatofilho@586
   373
renatofilho@586
   374
	if (aencode != NULL)
renatofilho@586
   375
		gst_object_unref (aencode);
renatofilho@586
   376
renatofilho@586
   377
	if (aqueue_src != NULL)
renatofilho@586
   378
		gst_object_unref (aqueue_src);
renatofilho@586
   379
renatofilho@586
   380
    if (video_src_pad != NULL) {
renatofilho@586
   381
        gst_object_unref (video_src_pad);
renatofilho@586
   382
    }
renatofilho@586
   383
renatofilho@586
   384
    if (audio_src_pad != NULL) {
renatofilho@586
   385
        gst_object_unref (audio_src_pad);
renatofilho@586
   386
    }
renatofilho@586
   387
renatofilho@586
   388
    if (mux != NULL) {
renatofilho@586
   389
        gst_object_unref (mux);
renatofilho@586
   390
    }
renatofilho@586
   391
renatofilho@586
   392
    if (mux_pad != NULL) {
renatofilho@586
   393
        gst_object_unref (mux_pad);
renatofilho@586
   394
    }
renatofilho@586
   395
renatofilho@586
   396
	if (fdsink != NULL)
renatofilho@586
   397
		gst_object_unref (fdsink);
renatofilho@586
   398
renatofilho@586
   399
	return FALSE;
renatofilho@586
   400
}
renatofilho@586
   401
renatofilho@586
   402
gboolean 
renatofilho@586
   403
g_mencoder_play_stream (GMencoder *self)
renatofilho@586
   404
{
renatofilho@586
   405
    GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE (self);
renatofilho@586
   406
renatofilho@586
   407
    g_return_val_if_fail (priv->ready == TRUE, FALSE);
renatofilho@586
   408
    
renatofilho@586
   409
    if (gst_element_set_state (priv->pipe, GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE) {
renatofilho@586
   410
			g_debug ("PLAYING");
renatofilho@586
   411
			return TRUE;
renatofilho@586
   412
	}
renatofilho@586
   413
	return FALSE;
renatofilho@586
   414
}
renatofilho@586
   415
renatofilho@586
   416
gboolean
renatofilho@586
   417
g_mencoder_pause_stream (GMencoder *self)
renatofilho@586
   418
{
renatofilho@586
   419
    GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE (self);
renatofilho@586
   420
renatofilho@586
   421
    g_return_val_if_fail (priv->ready == TRUE, FALSE);
renatofilho@586
   422
    
renatofilho@586
   423
    if (gst_element_set_state (priv->pipe, GST_STATE_PAUSED) != GST_STATE_CHANGE_FAILURE) {
renatofilho@586
   424
			g_debug ("PAUSED");
renatofilho@586
   425
			return TRUE;
renatofilho@586
   426
	}
renatofilho@586
   427
	return FALSE;
renatofilho@586
   428
}
renatofilho@586
   429
renatofilho@586
   430
void
renatofilho@586
   431
g_mencoder_close_stream (GMencoder *self)
renatofilho@586
   432
{
renatofilho@586
   433
renatofilho@586
   434
    GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE (self);
renatofilho@586
   435
renatofilho@586
   436
    g_return_if_fail (priv->ready == TRUE);
renatofilho@586
   437
    
renatofilho@586
   438
    gst_element_set_state (priv->pipe, GST_STATE_NULL);
renatofilho@586
   439
    gst_object_unref (priv->pipe);
renatofilho@586
   440
    priv->pipe = NULL;
renatofilho@586
   441
    priv->abin = NULL;
renatofilho@586
   442
    priv->vbin = NULL;
renatofilho@586
   443
    priv->sink = NULL;
renatofilho@586
   444
    priv->ready = FALSE;
renatofilho@586
   445
}
renatofilho@586
   446
renatofilho@586
   447
static gboolean
renatofilho@586
   448
_pipeline_bus_cb (GstBus     *bus,
renatofilho@586
   449
		  GstMessage *msg,
renatofilho@586
   450
		  gpointer    user_data)
renatofilho@586
   451
{
renatofilho@586
   452
	switch (GST_MESSAGE_TYPE (msg)) 
renatofilho@586
   453
	{
renatofilho@586
   454
		case GST_MESSAGE_STATE_CHANGED:
renatofilho@586
   455
		{
renatofilho@586
   456
			GstState oldstate;
renatofilho@586
   457
			GstState newstate;
renatofilho@586
   458
			GstState pendingstate;
renatofilho@586
   459
renatofilho@586
   460
			GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE (user_data);
renatofilho@586
   461
renatofilho@586
   462
			gst_message_parse_state_changed (msg, &oldstate,
renatofilho@586
   463
				&newstate, &pendingstate);
renatofilho@586
   464
renatofilho@586
   465
            if (pendingstate != GST_STATE_VOID_PENDING)
renatofilho@586
   466
                break;
renatofilho@586
   467
renatofilho@586
   468
            if ((oldstate == GST_STATE_READY) && 
renatofilho@586
   469
                (newstate == GST_STATE_PAUSED)) {
renatofilho@586
   470
                    if (priv->ready) 
renatofilho@586
   471
                        g_signal_emit (user_data, g_mencoder_signals[PAUSED], 0);
renatofilho@586
   472
                    else {
renatofilho@586
   473
                        priv->ready = TRUE;
renatofilho@586
   474
                        g_signal_emit (user_data, g_mencoder_signals[READY], 0);
renatofilho@586
   475
                    }
renatofilho@586
   476
            } else if ((oldstate == GST_STATE_PAUSED) &&
renatofilho@586
   477
                       (newstate == GST_STATE_PLAYING)) {
renatofilho@586
   478
                        g_signal_emit (user_data, g_mencoder_signals[PLAYING], 0);
renatofilho@586
   479
            } else if ((oldstate == GST_STATE_READY) &&
renatofilho@586
   480
                       (newstate == GST_STATE_NULL)) {
renatofilho@586
   481
                        g_signal_emit (user_data, g_mencoder_signals[STOPED], 0);
renatofilho@586
   482
            }			
renatofilho@586
   483
            break;
renatofilho@586
   484
		}
renatofilho@586
   485
		case GST_MESSAGE_ERROR: 
renatofilho@586
   486
		{
renatofilho@586
   487
		    GError *error;
renatofilho@586
   488
		    gchar *debug;
renatofilho@586
   489
		    gchar *err_str;
renatofilho@586
   490
		    
renatofilho@586
   491
		    gst_message_parse_error (msg, &error, &debug);
renatofilho@586
   492
		    err_str = g_strdup_printf ("Error [%d] %s (%s)", error->code,
renatofilho@586
   493
		        error->message,
renatofilho@586
   494
		        debug);
renatofilho@586
   495
		    g_signal_emit (user_data, g_mencoder_signals[ERROR], 0, err_str);
renatofilho@586
   496
		    g_free (err_str);
renatofilho@586
   497
		    g_clear_error (&error);
renatofilho@586
   498
		    g_free (debug);
renatofilho@586
   499
		    break;
renatofilho@586
   500
		}
renatofilho@586
   501
		
renatofilho@586
   502
		case GST_MESSAGE_EOS:
renatofilho@586
   503
		    g_signal_emit (user_data, g_mencoder_signals[EOS], 0);
renatofilho@586
   504
		    break;		
renatofilho@586
   505
		default:
renatofilho@586
   506
			break;
renatofilho@586
   507
	}
renatofilho@586
   508
	return TRUE;
renatofilho@586
   509
}
renatofilho@586
   510
renatofilho@586
   511
static void 
renatofilho@586
   512
_decodebin_new_pad_cb (GstElement* object,
renatofilho@586
   513
                       GstPad* pad,
renatofilho@586
   514
                       gboolean flag,
renatofilho@586
   515
                       gpointer user_data)
renatofilho@586
   516
{
renatofilho@586
   517
	GstCaps *caps;
renatofilho@586
   518
	gchar *str_caps = NULL;
renatofilho@586
   519
    GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE (user_data);
renatofilho@586
   520
renatofilho@586
   521
	caps = gst_pad_get_caps (pad);
renatofilho@586
   522
	str_caps = gst_caps_to_string (caps);
renatofilho@586
   523
    g_debug ("CAPS : %s", str_caps);
renatofilho@586
   524
renatofilho@586
   525
	if (strstr (str_caps, "audio") != NULL) {
renatofilho@586
   526
		GstPad *apad = gst_element_get_pad (priv->abin, "sink");
renatofilho@586
   527
		g_debug ("Linked with Audio");
renatofilho@586
   528
		gst_pad_link (pad, apad);
renatofilho@586
   529
		gst_object_unref (apad);
renatofilho@586
   530
	} else if (strstr (str_caps, "video") != NULL) {
renatofilho@586
   531
		GstPad *vpad = gst_element_get_pad (priv->vbin, "sink");
renatofilho@586
   532
		g_debug ("Linked with Video");
renatofilho@586
   533
		gst_pad_link (pad, vpad);
renatofilho@586
   534
		gst_object_unref (vpad);
renatofilho@586
   535
	} else {
renatofilho@586
   536
		g_warning ("invalid caps %s", str_caps);
renatofilho@586
   537
	}
renatofilho@586
   538
renatofilho@586
   539
	g_free (str_caps);
renatofilho@586
   540
	gst_caps_unref (caps);
renatofilho@586
   541
	g_debug ("OK");
renatofilho@586
   542
}
renatofilho@586
   543
renatofilho@586
   544
static void 
renatofilho@586
   545
_decodebin_unknown_type_cb (GstElement* object,
renatofilho@586
   546
                            GstPad* pad,
renatofilho@586
   547
                            GstCaps* caps,
renatofilho@586
   548
                            gpointer user_data)
renatofilho@586
   549
{
renatofilho@586
   550
    g_warning  ("Unknown Type");
renatofilho@586
   551
}