All pastes #456425 Raw Edit

fannagoganna

public text v1 · immutable
#456425 ·published 2007-04-24 20:17 UTC
rendered paste body
// connect signals to decodebin
void cb_newpad(GstElement *decode, GstPad *pad, gboolean last, gpointer data) {
	GstCaps *caps;
	GstStructure *str;
	GstPad *linkedpad;
	
	// get the sink pad for GstElement 
	linkedpad = gst_element_get_pad(GST_ELEMENT(data), "sink");
	if (GST_PAD_IS_LINKED(linkedpad)) {
		gst_object_unref(linkedpad);
		return;
	}
	
	// check media type, and then LINK if works
	caps = gst_pad_get_caps(pad);
	str = gst_caps_get_structure(caps, 0);
	if (regex_search(std::string(gst_structure_get_name(str)), boost::regex("audioin")))  gst_pad_link(pad, linkedpad);
	else if (regex_search(std::string(gst_structure_get_name(str)), boost::regex("videoin"))) gst_pad_link(pad, linkedpad);
	else { // return if doesn't
		gst_caps_unref(caps);
		gst_object_unref(linkedpad);
		return;
	}
	gst_caps_unref(caps);
}

// signal bus messaging system
gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data) {
	GMainLoop *loop = (GMainLoop *) data;
	switch (GST_MESSAGE_TYPE (msg)) {
	case GST_MESSAGE_EOS:
		g_main_loop_quit (loop);
		break;
	case GST_MESSAGE_ERROR:
		gchar *debug;
		GError *err;
		gst_message_parse_error (msg, &err, &debug);
		g_free(debug);
		g_print("Error: %s\n", err->message);
		g_error_free (err);
		g_main_loop_quit (loop);
		break;
	default:
		break;
	}
	return TRUE;
}

// convert an audiovisual mms to an avi
bool mms_to_avi(std::string mmsURL, std::string aviURL) {
	if (!regex_search(mmsURL, boost::regex("\\.mms$"))) return false;
	if (!regex_search(aviURL, boost::regex("\\.avi$"))) return false;
	
	// pipeline and elements
	GMainLoop *loop = g_main_loop_new(NULL, FALSE);
	GstElement *pipeline = gst_pipeline_new("mms to avi pipeline");
	GstElement *filesrc = gst_element_factory_make("mmssrc", "mms source");
	g_object_set(G_OBJECT(filesrc), "location", mmsURL.c_str(), NULL);
	GstElement *decode = gst_element_factory_make("decodebin", "decoder");
      gst_element_link(filesrc, decode);
	
	// video stream
	GstElement *videoin = gst_element_factory_make("videoscale", "videoin");
	GstCaps *video_cap = gst_caps_new_simple("video/x-raw-yuv", "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC('I','4','2','0'), "framerate", G_TYPE_DOUBLE, 29.97, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1, "width", G_TYPE_INT, 640, "height", G_TYPE_INT, 480, NULL);
	GstElement *ffenvid = gst_element_factory_make("ffenc_mpeg4", "ffenvid");
 	g_object_set(G_OBJECT(ffenvid), "bitrate", 512, NULL);
	
	// audio stream
	GstElement *audioin = gst_element_factory_make("audioconvert", "audioin");
	GstElement *audioco = gst_element_factory_make("audioresample", "audioco");
	GstCaps *audio_cap = gst_caps_new_simple("audio/x-raw-int", "rate", G_TYPE_INT, 44100, "channels", G_TYPE_INT, 2, NULL);
	GstElement *lameenc = gst_element_factory_make("lame", "lameenc");
	g_object_set(G_OBJECT(lameenc), "bitrate", 64, NULL);
	
	// connect the decodebin
	g_signal_connect(decode, "new-decoded-pad", G_CALLBACK(cb_newpad), videoin);
	g_signal_connect(decode, "new-decoded-pad", G_CALLBACK(cb_newpad), audioin);
	
	gst_caps_unref(audio_cap);
	gst_caps_unref(video_cap);
	return true;
}