gstreamer_test_apps/QtGSTPlayer/record_play.c
changeset 9 2a0f36a70380
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gstreamer_test_apps/QtGSTPlayer/record_play.c	Mon May 03 12:47:24 2010 +0300
@@ -0,0 +1,855 @@
+
+
+#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;
+    
+}