--- a/QtGSTPlayer/record_play.c Fri Apr 16 15:15:52 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,855 +0,0 @@
-
-
-#include <stdlib.h>
-#include <string.h>
-#include <gst/gst.h>
-#include "record_play.h"
-
-
-GstElement *bin;
-extern int mCurrentState;
-
-static GstElement *
-create_video_output ()
-{
- static gboolean have_video = FALSE;
- GstBin *bin;
- GstElement *queue, *sink;
- GstPad *pad;
-
- if (have_video) {
- //g_print ("Already playing a video stream. Ignoring this one\n");
- return NULL;
- }
-
- /* create a new bin to hold the elements */
- if((bin = (GstBin*) gst_bin_new (NULL)) == NULL)
- //bin = (GstBin*) gst_pipeline_new("pipeline");
- return NULL;
-
- /* Queue to ensure all streams can push data */
- queue = gst_element_factory_make ("queue", "q");
- if(queue == NULL)
- return NULL;/* Queue should always be available */
- /* Set the queue to buffer 1/10 of a second of raw video */
- g_object_set (queue, "max-size-time", (GstClockTime) GST_SECOND / 10,
- "max-size-bytes", 0, "max-size-buffers", 0, NULL);
-
-// cs = gst_element_factory_make ("ffmpegcolorspace", "cs");
-// if (!cs)
-// goto no_output;
-
- /* and a video sink */
- sink = gst_element_factory_make ("fakesink"/*autovideosink*/, "sink");
- if (!sink)
- goto no_output;
-
- /* add objects to the main pipeline */
- gst_bin_add_many (GST_BIN (bin), queue, sink, NULL);
-
- /* Link the elements */
- gst_element_link_many (queue, sink, NULL);
-
- /* Retrieve the sinkpad from the queue and 'ghost' it onto
- * the bin so that the caller can find it generically */
- pad = gst_element_get_pad (queue, "sink");
- gst_element_add_pad (GST_ELEMENT (bin), gst_ghost_pad_new ("sink", pad));
- gst_object_unref (pad);
-
- //have_video = TRUE;
-
- return GST_ELEMENT (bin);
-
- /* ERRORS */
-no_output:
- {
- //g_print ("Could not create either ffmpegcolorspace or autovideosink for output");
- return NULL;
- }
-}
-
-static GstElement *
-create_audio_output ()
-{
- static gboolean have_audio = FALSE;
- GstBin *bin;
- GstElement *queue, *audioconvert,*audioresample, *sink;
- GstPad *pad;
-
- if (have_audio) {
- //g_print ("Already playing an audio stream. Ignoring this one\n");
- return NULL;
- }
-
- /* create a new bin to hold the elements */
- bin = (GstBin*) gst_bin_new (NULL);
- if(!bin)
- goto no_output;
-
- /* Queue to ensure all streams can push data */
- queue = gst_element_factory_make ("queue", "q");
- if (!queue) /* Queue should always be available */
- goto no_output;
- /* Set the queue to buffer 1/10 of a second of raw audio */
- g_object_set (queue, "max-size-time", (GstClockTime) GST_SECOND / 10,
- "max-size-bytes", 0, "max-size-buffers", 0, NULL);
-
- /* an audio converter to convert floating-point audio samples to int format */
- audioconvert = gst_element_factory_make ("audioconvert", "ac");
- if (!audioconvert)
- goto no_output;
-
- /* an audio converter to convert floating-point audio samples to int format */
- audioresample = gst_element_factory_make ("audioresample", "audioresample");
- if (!audioresample)
- goto no_output;
-
- /* and an audio sink */
- sink = gst_element_factory_make ("autoaudiosink", "sink");
- if (!sink)
- goto no_output;
-
- /* add objects to the bin */
- gst_bin_add_many (GST_BIN (bin), queue, audioconvert,audioresample, sink, NULL);
-
- /* link the elements */
- gst_element_link_many (queue, audioconvert,audioresample, sink, NULL);
-
- /* Retrieve the sinkpad from the queue element and 'ghost' it onto
- * the bin so that the caller can find it generically */
- pad = gst_element_get_pad (queue, "sink");
- gst_element_add_pad (GST_ELEMENT (bin), gst_ghost_pad_new ("sink", pad));
- gst_object_unref (pad);
-
- //have_audio = TRUE;
-
- return GST_ELEMENT (bin);
-
- /* ERRORS */
-no_output:
- {
- //g_print ("Could not create either ffmpegcolorspace or autovideosink for output");
- return NULL;
- }
-}
-
-static void
-new_decoded_pad (GstElement * element, GstPad * pad, gboolean last,
- GstBin *top_pipeline)
-{
- GstPad *out_pad;
- GstElement *output = NULL;
- GstCaps *caps;
- GstStructure *s;
- const gchar *stream_type;
-
- /* Decide which output we are creating based on the stream contents */
- caps = gst_pad_get_caps (pad);
- if (caps == NULL) {
- //g_print ("Decodebin produced an unknown stream - ignoring\n");
- return;
- }
-
- s = gst_caps_get_structure (caps, 0);
- if(s == NULL)/* Caps on a pad should always have exactly one entry */
- return;
-
- stream_type = gst_structure_get_name (s);
-
- if (g_str_has_prefix (stream_type, "video/x-raw-")) {
- /* Is a new video stream */
- //g_print ("Encountered a new video stream\n");
- output = create_video_output ();
- }
- else if (g_str_has_prefix (stream_type, "audio/x-raw-")) {
- //g_print ("Encountered a new audio stream\n");
- output = create_audio_output ();
- }
- else {
- //g_print ("Found unknown stream of type %s - ignoring\n", stream_type);
- }
-
- /* If no renderer was created, ignore this stream */
- if (output == NULL)
- return;
-
- /* Add the output into our pipeline */
- gst_bin_add (top_pipeline, output);
-
- /* If we created a output pipeline, retrieve the sink pad from it */
- out_pad = gst_element_get_pad (output, "sink");
- g_return_if_fail (out_pad != NULL);
-
- /* Attempt to link the new pad to the output */
- if (gst_pad_link (pad, out_pad) != GST_PAD_LINK_OK) {
- //g_print ("Failed to add the rendering pipeline for this new data stream\n");
- gst_bin_remove (top_pipeline, output);
- gst_object_unref (out_pad);
- return;
- }
- gst_object_unref (out_pad);
-
- /* New output renderer is successfully linked in the pipeline.
- * Change its state to playing so it is ready to receive data */
- gst_element_set_state (output, GST_STATE_PLAYING);
-}
-
-static void
-print_tag (const GstTagList * list, const gchar * tag, gpointer unused)
-{
- gint i, count;
-
- count = gst_tag_list_get_tag_size (list, tag);
-
- for (i = 0; i < count; i++) {
- gchar *str;
-
- if (gst_tag_get_type (tag) == G_TYPE_STRING) {
- if (!gst_tag_list_get_string_index (list, tag, i, &str))
- g_assert_not_reached ();
- } else {
- str =
- g_strdup_value_contents (gst_tag_list_get_value_index (list, tag, i));
- }
-
- if (i == 0) {
- //g_print (" %15s: %s\n", gst_tag_get_nick (tag), str);
- } else {
- //g_print (" : %s\n", str);
- }
-
- g_free (str);
- }
-}
-
-
-
-static gboolean
-bus_call (GstBus *bus,
- GstMessage *message,
- gpointer data)
-{
- switch (GST_MESSAGE_TYPE (message)){
- case GST_MESSAGE_EOS:
- gst_message_unref (message);
- gst_element_set_state (bin, GST_STATE_NULL);
- /* Unreffing the bin will clean up all its children too */
- gst_object_unref (bin);
- mCurrentState = NONE;
- break;
- case GST_MESSAGE_ERROR:{
- GError *gerror;
- gchar *debug;
-
- gst_message_parse_error (message, &gerror, &debug);
- gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
- gst_message_unref (message);
- g_error_free (gerror);
- g_free (debug);
- gst_element_set_state (bin, GST_STATE_NULL);
- /* Unreffing the bin will clean up all its children too */
- gst_object_unref (bin);
- mCurrentState = NONE;
- break;
- }
- case GST_MESSAGE_WARNING:{
- GError *gerror;
- gchar *debug;
-
- gst_message_parse_warning (message, &gerror, &debug);
- gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
- gst_message_unref (message);
- g_error_free (gerror);
- g_free (debug);
- break;
- }
- case GST_MESSAGE_TAG:
- {
- GstTagList *tags;
-
- gst_message_parse_tag (message, &tags);
- if (tags) {
- //g_print ("TAGS received from element \"%s\".\n",
- // GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))));
-
- gst_tag_list_foreach (tags, print_tag, NULL);
- gst_tag_list_free (tags);
- tags = NULL;
- }
- break;
- }
- default:
- gst_message_unref (message);
- break;
- }
- return TRUE;
-}
-
-
-
-//static void
-//event_loop (GstElement * pipe)
-//{
-// GstBus *bus;
-// GstMessage *message = NULL;
-//
-// bus = gst_element_get_bus (GST_ELEMENT (pipe));
-//
-// while (TRUE) {
-// message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1);
-//
-// g_assert (message != NULL);
-//
-// switch (message->type) {
-// case GST_MESSAGE_EOS:
-// gst_message_unref (message);
-// return;
-// case GST_MESSAGE_ERROR:{
-// GError *gerror;
-// gchar *debug;
-//
-// gst_message_parse_error (message, &gerror, &debug);
-// gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
-// gst_message_unref (message);
-// g_error_free (gerror);
-// g_free (debug);
-// return;
-// }
-// case GST_MESSAGE_WARNING:{
-// GError *gerror;
-// gchar *debug;
-//
-// gst_message_parse_warning (message, &gerror, &debug);
-// gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
-// gst_message_unref (message);
-// g_error_free (gerror);
-// g_free (debug);
-// break;
-// }
-// case GST_MESSAGE_TAG:
-// {
-// GstTagList *tags;
-//
-// gst_message_parse_tag (message, &tags);
-// if (tags) {
-// //g_print ("TAGS received from element \"%s\".\n",
-// GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))));
-//
-// gst_tag_list_foreach (tags, print_tag, NULL);
-// gst_tag_list_free (tags);
-// tags = NULL;
-// }
-// break;
-// }
-// default:
-// gst_message_unref (message);
-// break;
-// }
-// }
-//}
-
-int
-gst_play_file (const char* file)
-{
- GstElement *filesrc, *decodebin, *sink;
- GstCaps* caps;
- //int length = strlen( file );
- //gst_init (&argc, &argv);
-
- if (file == NULL) {
- //g_print ("file is not present");
- goto no_output;
- }
-
- //g_print ("Constructing pipeline\n");
-
- /* create a new bin to hold the elements */
- bin = gst_pipeline_new ("pipeline");
- if(!bin)
- goto no_output;
-
- /* create a disk reader */
- filesrc = gst_element_factory_make ("filesrc", "disk_source");
- if(!filesrc)
- goto no_output;
-
- g_object_set (G_OBJECT (filesrc), "location", file, NULL);
-
- if( g_str_has_suffix (file, "raw") )
- {
- sink = gst_element_factory_make ("devsoundsink", "sink");
- caps = gst_caps_new_simple ("audio/x-raw-int",
- "width", G_TYPE_INT, 16,
- "depth", G_TYPE_INT, 16,
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, G_BYTE_ORDER,
- "rate", G_TYPE_INT, 8000,
- "channels", G_TYPE_INT, 1, NULL);
- gst_bin_add_many (GST_BIN (bin), filesrc, sink, NULL);
-
- gst_element_link_filtered (filesrc, sink, caps);
- }
- else if( g_str_has_suffix (file, "g711") )
- {
- sink = gst_element_factory_make ("devsoundsink", "sink");
- caps = gst_caps_new_simple ("audio/x-alaw",
- "width", G_TYPE_INT, 16,
- "depth", G_TYPE_INT, 16,
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, G_BYTE_ORDER,
- "rate", G_TYPE_INT, 8000,
- "channels", G_TYPE_INT, 1, NULL);
- gst_bin_add_many (GST_BIN (bin), filesrc, sink, NULL);
-
- gst_element_link_filtered (filesrc, sink, caps);
- }
- else if( g_str_has_suffix (file, "g729") )
- {
- sink = gst_element_factory_make ("devsoundsink", "sink");
- caps = gst_caps_new_simple ("audio/g729",
- "width", G_TYPE_INT, 16,
- "depth", G_TYPE_INT, 16,
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, G_BYTE_ORDER,
- "rate", G_TYPE_INT, 8000,
- "channels", G_TYPE_INT, 1, NULL);
- gst_bin_add_many (GST_BIN (bin), filesrc, sink, NULL);
-
- gst_element_link_filtered (filesrc, sink, caps);
- }
- else if( g_str_has_suffix (file, "ilbc") )
- {
- sink = gst_element_factory_make ("devsoundsink", "sink");
-
- caps = gst_caps_new_simple ("audio/ilbc",
- "width", G_TYPE_INT, 16,
- "depth", G_TYPE_INT, 16,
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, G_BYTE_ORDER,
- "rate", G_TYPE_INT, 8000,
- "channels", G_TYPE_INT, 1, NULL);
-
- gst_bin_add_many (GST_BIN (bin), filesrc, sink, NULL);
-
- gst_element_link_filtered (filesrc, sink, caps);
- }
- else if( g_str_has_suffix (file, "amr") )
- {
- sink = gst_element_factory_make ("devsoundsink", "sink");
- caps = gst_caps_new_simple ("audio/amr",
- "width", G_TYPE_INT, 8,
- "depth", G_TYPE_INT, 8,
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, G_BYTE_ORDER,
- "rate", G_TYPE_INT, 8000,
- "channels", G_TYPE_INT, 1, NULL);
- gst_bin_add_many (GST_BIN (bin), filesrc, sink, NULL);
-
- //gst_element_link (source, sink);
- gst_element_link_filtered (filesrc, sink, caps);
- }
-
- else
- {
- /* Create the decodebin */
- decodebin = gst_element_factory_make ("decodebin", NULL);
- if (!decodebin) {
- //g_print ("could not find the \"decodebin\" element\n");
- return -1;
- }
-
- /* add objects to the main pipeline */
- gst_bin_add_many (GST_BIN (bin), filesrc, decodebin, NULL);
-
- /* link the elements. */
- gst_element_link_many (filesrc, decodebin, NULL);
-
- /* Connect to decodebin's 'new-decoded-pad' signal to detect when it produces
- * a new stream */
- g_signal_connect (G_OBJECT (decodebin), "new-decoded-pad",
- G_CALLBACK (new_decoded_pad), bin);
- }
-
- gst_bus_add_watch( gst_pipeline_get_bus (GST_PIPELINE (bin)), bus_call, NULL);
- //g_print ("Starting playback\n");
- /* start playing */
- gst_element_set_state (bin, GST_STATE_PLAYING);
- return 0;
-
-no_output:
- return -1;
-
-}
-
-
-int
-gst_record_file (int type)
-{
- GstElement *audiosrc, *filesink;
- char* carray = NULL;
- GstCaps* caps;
- //g_print ("Constructing pipeline\n");
-
- /* switch case for recording type*/
- switch( type )
- {
- case RECORD_RAW:
- caps = gst_caps_new_simple ("audio/x-raw-int",
- "width", G_TYPE_INT, 16,
- "depth", G_TYPE_INT, 16,
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, G_BYTE_ORDER,
- "rate", G_TYPE_INT, 8000,
- "channels", G_TYPE_INT, 1, NULL);
-
- carray = "c:\\data\\sounds\\Digital\\record.raw";
- break;
-
- case RECORD_AMR:
- {
- return gst_record_amr();
- }
- break;
-
- case RECORD_G711:
-
- caps = gst_caps_new_simple ("audio/x-alaw",
- "width", G_TYPE_INT, 8,
- "depth", G_TYPE_INT, 8,
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, G_BYTE_ORDER,
- "rate", G_TYPE_INT, 8000,
- "channels", G_TYPE_INT, 1, NULL);
-
- carray = "c:\\data\\sounds\\Digital\\record.g711";
- break;
-
- case RECORD_G729: //
-
- caps = gst_caps_new_simple ("audio/g729",
- "width", G_TYPE_INT, 16,
- "depth", G_TYPE_INT, 16,
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, G_BYTE_ORDER,
- "rate", G_TYPE_INT, 8000,
- "channels", G_TYPE_INT, 1, NULL);
-
- carray = "c:\\data\\sounds\\Digital\\record.g729";
- break;
-
- case RECORD_ILBC: //
-
- caps = gst_caps_new_simple ("audio/ilbc",
- "width", G_TYPE_INT, 16,
- "depth", G_TYPE_INT, 16,
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, G_BYTE_ORDER,
- "rate", G_TYPE_INT, 8000,
- "channels", G_TYPE_INT, 1, NULL);
-
- carray = "c:\\data\\sounds\\Digital\\record.ilbc";
- break;
- case RECORD_WAV:
- {
- return gst_record_wav();
- }
- break;
- case RECORD_AAC:
- {
- return gst_record_aac();
- }
- break;
- default:
- return -1;
- break;
- }
- /* create a new bin to hold the elements */
- bin = gst_pipeline_new ("pipeline");
- if(!bin)
- goto no_output;
-
- /* create a disk reader */
- audiosrc = gst_element_factory_make ("devsoundsrc", "audio_source");
- if(!audiosrc)
- goto no_output;
-
- /* Create the decodebin */
- filesink = gst_element_factory_make ("filesink", NULL);
- if(!filesink)
- goto no_output;
-
- g_object_set (G_OBJECT (audiosrc),
- "blocksize", 1280,
- NULL);
-
- g_object_set (G_OBJECT (filesink), "location", carray,"buffer-size",1280, NULL);
-
- /* add objects to the main pipeline */
- gst_bin_add_many (GST_BIN (bin), audiosrc, filesink, NULL);
-
- /* link the elements. */
- gst_element_link_filtered (audiosrc, filesink, caps);
- //gst_element_link_many (audiosrc, filesink, NULL);
- gst_bus_add_watch( gst_pipeline_get_bus (GST_PIPELINE (bin)), bus_call, NULL);
-
- //g_print ("Starting recoring\n");
- /* start playing */
- gst_element_set_state (bin, GST_STATE_PLAYING);
-
- /* Run event loop listening for bus messages until EOS or ERROR */
- //event_loop (bin);
-
-// //g_print ("Finished playback - stopping pipeline\n");
-//
-// /* stop the bin */
-// gst_element_set_state (bin, GST_STATE_NULL);
-//
-// /* Unreffing the bin will clean up all its children too */
-// gst_object_unref (bin);
-//
- return 0;
-no_output:
- return -1;
-
-}
-
-
-int
-gst_record_wav ()
-{
- GstElement *audiosrc, *filesink, *wavenc;
- char* carray = NULL;
- GstCaps* caps;
-
- //g_print ("Constructing pipeline\n");
-
- /* create a new bin to hold the elements */
- bin = gst_pipeline_new ("pipeline");
- if(!bin)
- goto no_output;
-
- /* create a disk reader */
- audiosrc = gst_element_factory_make ("devsoundsrc", "audio_source");
- if(!audiosrc)
- goto no_output;
-
- /* Create the decodebin */
- filesink = gst_element_factory_make ("filesink", NULL);
- if(!filesink)
- goto no_output;
-
- wavenc = gst_element_factory_make ("wavenc", NULL);
- if(!wavenc)
- goto no_output;
-
- caps = gst_caps_new_simple ("audio/x-raw-int",
- "width", G_TYPE_INT, 16,
- "depth", G_TYPE_INT, 16,
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, G_BYTE_ORDER,
- "rate", G_TYPE_INT, 16000,
- "channels", G_TYPE_INT, 1, NULL);
-
- carray = "c:\\data\\sounds\\Digital\\record.wav";
-
- g_object_set (G_OBJECT (audiosrc),
- "blocksize", 1280,
- NULL);
-
- g_object_set (G_OBJECT (filesink), "location", carray,"buffer-size",1280, NULL);
-
- /* add objects to the main pipeline */
- gst_bin_add_many (GST_BIN (bin), audiosrc,wavenc, filesink, NULL);
-
- /* link the elements. */
- gst_element_link_filtered (audiosrc, wavenc, caps);
- gst_element_link (wavenc, filesink);
- gst_bus_add_watch( gst_pipeline_get_bus (GST_PIPELINE (bin)), bus_call, NULL);
- //g_print ("Starting recoring\n");
- /* start playing */
- gst_element_set_state (bin, GST_STATE_PLAYING);
-
- return 0;
-
-no_output:
- return -1;
-}
-
-int gst_pause()
-{
- gst_element_set_state (bin, GST_STATE_PAUSED);
- return 0;
-}
-
-int gst_resume()
-{
- gst_element_set_state (bin, GST_STATE_PLAYING);
- return 0;
-}
-
-
-int gst_record_stop()
-{
- gst_element_send_event (bin, gst_event_new_eos ());
- //gst_element_set_state (bin, GST_STATE_NULL);
- return 0;
-}
-
-
-int gst_seek()
-{
-// need to implement..
-}
-
-int gst_get_events()
-{
- return g_main_context_iteration(NULL, FALSE);
- //return 0;
-}
-
-int gst_unref()
-{
- //g_print ("Finished playback - stopping pipeline\n");
- /* stop the bin */
- gst_element_set_state (bin, GST_STATE_NULL);
- /* Unreffing the bin will clean up all its children too */
- gst_object_unref (bin);
- return 0;
-}
-
-int gst_record_aac()
-{
- GstElement *audiosrc,*filesink,*aacenc, *mp4mux;
- GstBus *bus;
- GstPad *mp4sinkpad,*aacencsrcpad;
- char* carray = NULL;
- GstCaps* caps;
-
- /*create a pipeline*/
- bin = gst_pipeline_new ("pipeline");
- if(!bin)
- goto no_output;
- /* create a disk reader */
- audiosrc = gst_element_factory_make ("devsoundsrc", "audio_source");
- if(!audiosrc)
- goto no_output;
-
- /* Create the decodebin */
- filesink = gst_element_factory_make ("filesink", NULL);
- if(!filesink)
- goto no_output;
- //setting num-buffers
- //g_object_set (G_OBJECT (audiosrc), "num-buffers", 5000 , NULL);
- g_object_set (G_OBJECT (audiosrc),
- "blocksize", 1280,
- NULL);
-
- aacenc = gst_element_factory_make("nokiaaacenc", "nokiaaacenc");
- if(!aacenc)
- goto no_output;
- mp4mux = gst_element_factory_make("mp4mux", "mp4mux");
- if(!mp4mux)
- goto no_output;
- caps = gst_caps_new_simple("audio/x-raw-int",
- "width", G_TYPE_INT, 16,
- "depth", G_TYPE_INT, 16,
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, G_BYTE_ORDER,
- "rate", G_TYPE_INT, 8000,
- "channels", G_TYPE_INT, 1, NULL);
- carray = "c:\\data\\sounds\\Digital\\record.mp4";
-
-
- g_object_set(G_OBJECT (filesink), "location", carray, NULL);
- bus = gst_pipeline_get_bus(GST_PIPELINE (bin));
-
- gst_bus_add_watch(bus, bus_call, NULL);
-
- gst_object_unref(bus);
-
-
- //add objects to the main pipeline
- gst_bin_add_many(GST_BIN (bin),audiosrc,aacenc,mp4mux,filesink, NULL);
-
- gst_element_link_filtered (audiosrc, aacenc, caps);
-
- mp4sinkpad = gst_element_get_request_pad( mp4mux, "audio_%d");
-
- aacencsrcpad = gst_element_get_pad( aacenc, "src");
- if (gst_pad_link (aacencsrcpad,mp4sinkpad) != GST_PAD_LINK_OK) {
-
- g_print("gst_pad_link (aacencsrcpad,mp4sinkpad) failed");
-
- return -1;
- }
- //gst_element_link (aacenc, filesink);
- gst_element_link (mp4mux, filesink);
-
- gst_caps_unref (caps);
-
-
- gst_element_set_state(bin, GST_STATE_PLAYING);
-
- return 0;
-no_output:
- return -1;
-}
-
-int gst_record_amr()
-{
- GstElement *audiosrc, *filesink, *amrmux;
- GstBus *bus;
- char* carray = NULL;
- GstCaps* caps;
- /* create a new bin to hold the elements */
- bin = gst_pipeline_new ("pipeline");
- if(!bin)
- goto no_output;
- //g_print ("pipeline created");
- audiosrc = gst_element_factory_make ("devsoundsrc", "audio_source");
- // encoder = gst_element_factory_make ("wavenc", NULL);
- if(!audiosrc)
- goto no_output;
-
- amrmux = gst_element_factory_make ("amrmux", "muxer");
- if(!amrmux)
- goto no_output;
-
- filesink = gst_element_factory_make("filesink", "filesink");
- if(!filesink)
- goto no_output;
-
- caps = gst_caps_new_simple ("audio/amr",
- "width", G_TYPE_INT, 8,
- "depth", G_TYPE_INT, 8,
- "signed",G_TYPE_BOOLEAN, TRUE,
- "endianness",G_TYPE_INT, G_BYTE_ORDER,
- "rate", G_TYPE_INT, 8000,
- "channels", G_TYPE_INT, 1, NULL);
- carray = "c:\\data\\sounds\\Digital\\record.amr";
-
- g_object_set (G_OBJECT (audiosrc),
- "blocksize", 1280,
- NULL);
-
- g_object_set(G_OBJECT (filesink), "location", carray, NULL);
-
- bus = gst_pipeline_get_bus (GST_PIPELINE (bin));
- gst_bus_add_watch (bus, bus_call, NULL);
- gst_object_unref (bus);
-
-
- /* add objects to the main pipeline */
- gst_bin_add_many(GST_BIN (bin),audiosrc,amrmux,filesink , NULL);
- /* link the elements */
- gst_element_link_filtered (audiosrc, amrmux, caps);
-
- gst_element_link( amrmux, filesink );
-
- gst_element_set_state (bin, GST_STATE_PLAYING);
-
- return 0;
-no_output:
- return -1;
-
-}