// 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; }