gst_plugins_base/tsrc/check/elements/audioconvert/src/audioconvert.c
changeset 0 0e761a78d257
child 8 4a7fac7dd34a
child 29 567bb019e3e3
equal deleted inserted replaced
-1:000000000000 0:0e761a78d257
       
     1 /* GStreamer
       
     2  *
       
     3  * unit test for audioconvert
       
     4  *
       
     5  * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
       
     6  *
       
     7  * This library is free software; you can redistribute it and/or
       
     8  * modify it under the terms of the GNU Library General Public
       
     9  * License as published by the Free Software Foundation; either
       
    10  * version 2 of the License, or (at your option) any later version.
       
    11  *
       
    12  * This library is distributed in the hope that it will be useful,
       
    13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
       
    15  * Library General Public License for more details.
       
    16  *
       
    17  * You should have received a copy of the GNU Library General Public
       
    18  * License along with this library; if not, write to the
       
    19  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
       
    20  * Boston, MA 02111-1307, USA.
       
    21  */
       
    22 
       
    23 #include <gst/gst_global.h>
       
    24 #include <unistd.h>
       
    25 
       
    26 //#include <glib_global.h>
       
    27 
       
    28 #define LOG_FILE "c:\\logs\\audioconvert_logs.txt" 
       
    29 #include "std_log_result.h" 
       
    30 #define LOG_FILENAME_LINE __FILE__, __LINE__
       
    31 
       
    32 #include <gst/floatcast/floatcast.h>
       
    33 #include <gst/check/gstcheck.h>
       
    34 
       
    35 #include <gst/audio/multichannel.h>
       
    36 
       
    37 
       
    38 #if EMULATOR
       
    39 GET_GLOBAL_VAR_FROM_TLS(buffers,gstcheck,GList*)
       
    40 #define buffers (*GET_GSTREAMER_WSD_VAR_NAME(buffers,gstcheck,g)())
       
    41 #else 
       
    42 extern GList *buffers;
       
    43 #endif
       
    44 
       
    45 #if EMULATOR
       
    46 static GET_GLOBAL_VAR_FROM_TLS(expecting_log,gstcheck,gboolean)
       
    47 #define _gst_check_expecting_log (*GET_GSTREAMER_WSD_VAR_NAME(expecting_log,gstcheck,g)())
       
    48 #else 
       
    49 gboolean _gst_check_expecting_log = FALSE;
       
    50 #endif
       
    51 
       
    52 #include <libgstreamer_wsd_solution.h>
       
    53 
       
    54 void create_xml(int result)
       
    55 {
       
    56     if(result)
       
    57         assert_failed = 1;
       
    58     
       
    59     testResultXml(xmlfile);
       
    60     close_log_file();
       
    61 }
       
    62 
       
    63 
       
    64 /* For ease of programming we use globals to keep refs for our floating
       
    65  * src and sink pads we create; otherwise we always have to do get_pad,
       
    66  * get_peer, and then remove references in every test function */
       
    67 static GstPad *mysrcpad, *mysinkpad;
       
    68 
       
    69 #define CONVERT_CAPS_TEMPLATE_STRING    \
       
    70   "audio/x-raw-float, " \
       
    71     "rate = (int) [ 1, MAX ], " \
       
    72     "channels = (int) [ 1, 8 ], " \
       
    73     "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \
       
    74     "width = (int) { 32, 64 };" \
       
    75   "audio/x-raw-int, " \
       
    76     "rate = (int) [ 1, MAX ], " \
       
    77     "channels = (int) [ 1, 8 ], " \
       
    78     "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \
       
    79     "width = (int) 32, " \
       
    80     "depth = (int) [ 1, 32 ], " \
       
    81     "signed = (boolean) { true, false }; " \
       
    82   "audio/x-raw-int, " \
       
    83     "rate = (int) [ 1, MAX ], " \
       
    84     "channels = (int) [ 1, 8 ], " \
       
    85     "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \
       
    86     "width = (int) 24, " \
       
    87     "depth = (int) [ 1, 24 ], " \
       
    88     "signed = (boolean) { true, false }; " \
       
    89   "audio/x-raw-int, " \
       
    90     "rate = (int) [ 1, MAX ], " \
       
    91     "channels = (int) [ 1, 8 ], " \
       
    92     "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \
       
    93     "width = (int) 16, " \
       
    94     "depth = (int) [ 1, 16 ], " \
       
    95     "signed = (boolean) { true, false }; " \
       
    96   "audio/x-raw-int, " \
       
    97     "rate = (int) [ 1, MAX ], " \
       
    98     "channels = (int) [ 1, 8 ], " \
       
    99     "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \
       
   100     "width = (int) 8, " \
       
   101     "depth = (int) [ 1, 8 ], " \
       
   102     "signed = (boolean) { true, false } "
       
   103 
       
   104 static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
       
   105     GST_PAD_SINK,
       
   106     GST_PAD_ALWAYS,
       
   107     GST_STATIC_CAPS (CONVERT_CAPS_TEMPLATE_STRING)
       
   108     );
       
   109 static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
       
   110     GST_PAD_SRC,
       
   111     GST_PAD_ALWAYS,
       
   112     GST_STATIC_CAPS (CONVERT_CAPS_TEMPLATE_STRING)
       
   113     );
       
   114 
       
   115 /* takes over reference for outcaps */
       
   116 static GstElement *
       
   117 setup_audioconvert (GstCaps * outcaps)
       
   118 {
       
   119   GstElement *audioconvert;
       
   120 
       
   121   GST_DEBUG ("setup_audioconvert with caps %" GST_PTR_FORMAT, outcaps);
       
   122   audioconvert = gst_check_setup_element ("audioconvert");
       
   123   g_object_set (G_OBJECT (audioconvert), "dithering", 0, NULL);
       
   124   g_object_set (G_OBJECT (audioconvert), "noise-shaping", 0, NULL);
       
   125   mysrcpad = gst_check_setup_src_pad (audioconvert, &srctemplate, NULL);
       
   126   mysinkpad = gst_check_setup_sink_pad (audioconvert, &sinktemplate, NULL);
       
   127   /* this installs a getcaps func that will always return the caps we set
       
   128    * later */
       
   129   gst_pad_use_fixed_caps (mysinkpad);
       
   130   gst_pad_set_caps (mysinkpad, outcaps);
       
   131   gst_caps_unref (outcaps);
       
   132   outcaps = gst_pad_get_negotiated_caps (mysinkpad);
       
   133   fail_unless (gst_caps_is_fixed (outcaps));
       
   134   gst_caps_unref (outcaps);
       
   135 
       
   136   gst_pad_set_active (mysrcpad, TRUE);
       
   137   gst_pad_set_active (mysinkpad, TRUE);
       
   138 
       
   139   return audioconvert;
       
   140 }
       
   141 
       
   142 static void
       
   143 cleanup_audioconvert (GstElement * audioconvert)
       
   144 {
       
   145   GST_DEBUG ("cleanup_audioconvert");
       
   146 
       
   147   gst_pad_set_active (mysrcpad, FALSE);
       
   148   gst_pad_set_active (mysinkpad, FALSE);
       
   149   gst_check_teardown_src_pad (audioconvert);
       
   150   gst_check_teardown_sink_pad (audioconvert);
       
   151   gst_check_teardown_element (audioconvert);
       
   152 }
       
   153 
       
   154 /* returns a newly allocated caps */
       
   155 static GstCaps *
       
   156 get_int_caps (guint channels, gchar * endianness, guint width,
       
   157     guint depth, gboolean signedness)
       
   158 {
       
   159   GstCaps *caps;
       
   160   gchar *string;
       
   161 
       
   162   string = g_strdup_printf ("audio/x-raw-int, "
       
   163       "rate = (int) 44100, "
       
   164       "channels = (int) %d, "
       
   165       "endianness = (int) %s, "
       
   166       "width = (int) %d, "
       
   167       "depth = (int) %d, "
       
   168       "signed = (boolean) %s ",
       
   169       channels, endianness, width, depth, signedness ? "true" : "false");
       
   170   GST_DEBUG ("creating caps from %s", string);
       
   171   caps = gst_caps_from_string (string);
       
   172   g_free (string);
       
   173   fail_unless (caps != NULL);
       
   174   GST_DEBUG ("returning caps %p", caps);
       
   175   return caps;
       
   176 }
       
   177 
       
   178 /* returns a newly allocated caps */
       
   179 static GstCaps *
       
   180 get_float_caps (guint channels, gchar * endianness, guint width)
       
   181 {
       
   182   GstCaps *caps;
       
   183   gchar *string;
       
   184 
       
   185   string = g_strdup_printf ("audio/x-raw-float, "
       
   186       "rate = (int) 44100, "
       
   187       "channels = (int) %d, "
       
   188       "endianness = (int) %s, "
       
   189       "width = (int) %d ", channels, endianness, width);
       
   190   GST_DEBUG ("creating caps from %s", string);
       
   191   caps = gst_caps_from_string (string);
       
   192   g_free (string);
       
   193   fail_unless (caps != NULL);
       
   194   GST_DEBUG ("returning caps %p", caps);
       
   195   return caps;
       
   196 }
       
   197 
       
   198 /* Copied from vorbis; the particular values used don't matter */
       
   199 static GstAudioChannelPosition channelpositions[][6] = {
       
   200   {                             /* Mono */
       
   201       GST_AUDIO_CHANNEL_POSITION_FRONT_MONO},
       
   202   {                             /* Stereo */
       
   203         GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
       
   204       GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT},
       
   205   {                             /* Stereo + Centre */
       
   206         GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
       
   207         GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
       
   208       GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT},
       
   209   {                             /* Quadraphonic */
       
   210         GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
       
   211         GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
       
   212         GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
       
   213         GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
       
   214       },
       
   215   {                             /* Stereo + Centre + rear stereo */
       
   216         GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
       
   217         GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
       
   218         GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
       
   219         GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
       
   220         GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
       
   221       },
       
   222   {                             /* Full 5.1 Surround */
       
   223         GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
       
   224         GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
       
   225         GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
       
   226         GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
       
   227         GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
       
   228         GST_AUDIO_CHANNEL_POSITION_LFE,
       
   229       }
       
   230 };
       
   231 
       
   232 /* these are a bunch of random positions, they are mostly just
       
   233  * different from the ones above, don't use elsewhere */
       
   234 static GstAudioChannelPosition mixed_up_positions[][6] = {
       
   235   {
       
   236       GST_AUDIO_CHANNEL_POSITION_FRONT_MONO},
       
   237   {
       
   238         GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
       
   239       GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT},
       
   240   {
       
   241         GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
       
   242         GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
       
   243       GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT},
       
   244   {
       
   245         GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
       
   246         GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
       
   247         GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
       
   248         GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
       
   249       },
       
   250   {
       
   251         GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
       
   252         GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
       
   253         GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
       
   254         GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
       
   255         GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
       
   256       },
       
   257   {
       
   258         GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
       
   259         GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
       
   260         GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
       
   261         GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
       
   262         GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
       
   263         GST_AUDIO_CHANNEL_POSITION_LFE,
       
   264       }
       
   265 };
       
   266 
       
   267 static void
       
   268 set_channel_positions (GstCaps * caps, int channels,
       
   269     GstAudioChannelPosition * channelpositions)
       
   270 {
       
   271   GValue chanpos = { 0 };
       
   272   GValue pos = { 0 };
       
   273   GstStructure *structure = gst_caps_get_structure (caps, 0);
       
   274   int c;
       
   275 
       
   276   g_value_init (&chanpos, GST_TYPE_ARRAY);
       
   277   g_value_init (&pos, GST_TYPE_AUDIO_CHANNEL_POSITION);
       
   278 
       
   279   for (c = 0; c < channels; c++) {
       
   280     g_value_set_enum (&pos, channelpositions[c]);
       
   281     gst_value_array_append_value (&chanpos, &pos);
       
   282   }
       
   283   g_value_unset (&pos);
       
   284 
       
   285   gst_structure_set_value (structure, "channel-positions", &chanpos);
       
   286   g_value_unset (&chanpos);
       
   287 }
       
   288 
       
   289 /* For channels > 2, caps have to have channel positions. This adds some simple
       
   290  * ones. Only implemented for channels between 1 and 6.
       
   291  */
       
   292 static GstCaps *
       
   293 get_float_mc_caps (guint channels, gchar * endianness, guint width,
       
   294     gboolean mixed_up_layout)
       
   295 {
       
   296   GstCaps *caps = get_float_caps (channels, endianness, width);
       
   297 
       
   298   if (channels <= 6) {
       
   299     if (mixed_up_layout)
       
   300       set_channel_positions (caps, channels, mixed_up_positions[channels - 1]);
       
   301     else
       
   302       set_channel_positions (caps, channels, channelpositions[channels - 1]);
       
   303   }
       
   304 
       
   305   return caps;
       
   306 }
       
   307 
       
   308 static GstCaps *
       
   309 get_int_mc_caps (guint channels, gchar * endianness, guint width,
       
   310     guint depth, gboolean signedness, gboolean mixed_up_layout)
       
   311 {
       
   312   GstCaps *caps = get_int_caps (channels, endianness, width, depth, signedness);
       
   313 
       
   314   if (channels <= 6) {
       
   315     if (mixed_up_layout)
       
   316       set_channel_positions (caps, channels, mixed_up_positions[channels - 1]);
       
   317     else
       
   318       set_channel_positions (caps, channels, channelpositions[channels - 1]);
       
   319   }
       
   320 
       
   321   return caps;
       
   322 }
       
   323 
       
   324 /* eats the refs to the caps */
       
   325 static void
       
   326 verify_convert (const gchar * which, void *in, int inlength,
       
   327     GstCaps * incaps, void *out, int outlength, GstCaps * outcaps)
       
   328 {
       
   329   GstBuffer *inbuffer, *outbuffer;
       
   330   GstElement *audioconvert;
       
   331 
       
   332   GST_DEBUG ("verifying conversion %s", which);
       
   333   GST_DEBUG ("incaps: %" GST_PTR_FORMAT, incaps);
       
   334   GST_DEBUG ("outcaps: %" GST_PTR_FORMAT, outcaps);
       
   335   ASSERT_CAPS_REFCOUNT (incaps, "incaps", 1);
       
   336   ASSERT_CAPS_REFCOUNT (outcaps, "outcaps", 1);
       
   337   audioconvert = setup_audioconvert (outcaps);
       
   338   ASSERT_CAPS_REFCOUNT (outcaps, "outcaps", 1);
       
   339 
       
   340   fail_unless (gst_element_set_state (audioconvert,
       
   341           GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
       
   342       "could not set to playing");
       
   343 
       
   344   GST_DEBUG ("Creating buffer of %d bytes", inlength);
       
   345   inbuffer = gst_buffer_new_and_alloc (inlength);
       
   346   memcpy (GST_BUFFER_DATA (inbuffer), in, inlength);
       
   347   gst_buffer_set_caps (inbuffer, incaps);
       
   348   ASSERT_CAPS_REFCOUNT (incaps, "incaps", 2);
       
   349   ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
       
   350 
       
   351   /* pushing gives away my reference ... */
       
   352   GST_DEBUG ("push it");
       
   353   fail_unless (gst_pad_push (mysrcpad, inbuffer) == GST_FLOW_OK);
       
   354   GST_DEBUG ("pushed it");
       
   355   /* ... and puts a new buffer on the global list */
       
   356   fail_unless (g_list_length (buffers) == 1);
       
   357   fail_if ((outbuffer = (GstBuffer *) buffers->data) == NULL);
       
   358 
       
   359   ASSERT_BUFFER_REFCOUNT (outbuffer, "outbuffer", 1);
       
   360   fail_unless_equals_int (GST_BUFFER_SIZE (outbuffer), outlength);
       
   361 
       
   362   if (memcmp (GST_BUFFER_DATA (outbuffer), out, outlength) != 0) {
       
   363     g_print ("\nInput data:\n");
       
   364     gst_util_dump_mem (in, inlength);
       
   365     g_print ("\nConverted data:\n");
       
   366     gst_util_dump_mem (GST_BUFFER_DATA (outbuffer), outlength);
       
   367     g_print ("\nExpected data:\n");
       
   368     gst_util_dump_mem (out, outlength);
       
   369   }
       
   370   fail_unless (memcmp (GST_BUFFER_DATA (outbuffer), out, outlength) == 0,
       
   371       "failed converting %s", which);
       
   372 
       
   373   /* make sure that the channel positions are not lost */
       
   374   {
       
   375     GstStructure *in_s, *out_s;
       
   376     gint out_chans;
       
   377 
       
   378     in_s = gst_caps_get_structure (incaps, 0);
       
   379     out_s = gst_caps_get_structure (GST_BUFFER_CAPS (outbuffer), 0);
       
   380     fail_unless (gst_structure_get_int (out_s, "channels", &out_chans));
       
   381 
       
   382     /* positions for 1 and 2 channels are implicit if not provided */
       
   383     if (out_chans > 2 && gst_structure_has_field (in_s, "channel-positions")) {
       
   384       if (!gst_structure_has_field (out_s, "channel-positions")) {
       
   385         g_error ("Channel layout got lost somewhere:\n\nIns : %s\nOuts: %s\n",
       
   386             gst_structure_to_string (in_s), gst_structure_to_string (out_s));
       
   387       }
       
   388     }
       
   389   }
       
   390 
       
   391   buffers = g_list_remove (buffers, outbuffer);
       
   392   gst_buffer_unref (outbuffer);
       
   393   fail_unless (gst_element_set_state (audioconvert,
       
   394           GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
       
   395   /* cleanup */
       
   396   GST_DEBUG ("cleanup audioconvert");
       
   397   cleanup_audioconvert (audioconvert);
       
   398   GST_DEBUG ("cleanup, unref incaps");
       
   399   ASSERT_CAPS_REFCOUNT (incaps, "incaps", 1);
       
   400   gst_caps_unref (incaps);
       
   401 }
       
   402 
       
   403 
       
   404 #define RUN_CONVERSION(which, inarray, in_get_caps, outarray, out_get_caps)    \
       
   405   verify_convert (which, inarray, sizeof (inarray),                            \
       
   406         in_get_caps, outarray, sizeof (outarray), out_get_caps)
       
   407 
       
   408 
       
   409 void test_int16()
       
   410 {
       
   411 	xmlfile = "test_int16";
       
   412     std_log(LOG_FILENAME_LINE, "Test Started test_int16");
       
   413   /* stereo to mono */
       
   414   {
       
   415     gint16 in[] = { 16384, -256, 1024, 1024 };
       
   416     gint16 out[] = { 8064, 1024 };
       
   417 
       
   418     RUN_CONVERSION ("int16 stereo to mono",
       
   419         in, get_int_caps (2, "BYTE_ORDER", 16, 16, TRUE),
       
   420         out, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE));
       
   421   }
       
   422   /* mono to stereo */
       
   423   {
       
   424     gint16 in[] = { 512, 1024 };
       
   425     gint16 out[] = { 512, 512, 1024, 1024 };
       
   426 
       
   427     RUN_CONVERSION ("int16 mono to stereo",
       
   428         in, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE),
       
   429         out, get_int_caps (2, "BYTE_ORDER", 16, 16, TRUE));
       
   430   }
       
   431   /* signed -> unsigned */
       
   432   {
       
   433     gint16 in[] = { 0, -32767, 32767, -32768 };
       
   434     guint16 out[] = { 32768, 1, 65535, 0 };
       
   435 
       
   436     RUN_CONVERSION ("int16 signed to unsigned",
       
   437         in, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE),
       
   438         out, get_int_caps (1, "BYTE_ORDER", 16, 16, FALSE));
       
   439     RUN_CONVERSION ("int16 unsigned to signed",
       
   440         out, get_int_caps (1, "BYTE_ORDER", 16, 16, FALSE),
       
   441         in, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE));
       
   442   }
       
   443   std_log(LOG_FILENAME_LINE, "Test Successful");
       
   444     create_xml(0);
       
   445 }
       
   446 
       
   447 
       
   448 
       
   449 
       
   450 void test_float32()
       
   451 {
       
   452 	xmlfile = "test_float32";
       
   453     std_log(LOG_FILENAME_LINE, "Test Started test_float32");
       
   454   /* stereo to mono */
       
   455   {
       
   456     gfloat in[] = { 0.6, -0.0078125, 0.03125, 0.03125 };
       
   457     gfloat out[] = { 0.29609375, 0.03125 };
       
   458 
       
   459     RUN_CONVERSION ("float32 stereo to mono",
       
   460         in, get_float_caps (2, "BYTE_ORDER", 32),
       
   461         out, get_float_caps (1, "BYTE_ORDER", 32));
       
   462   }
       
   463   /* mono to stereo */
       
   464   {
       
   465     gfloat in[] = { 0.015625, 0.03125 };
       
   466     gfloat out[] = { 0.015625, 0.015625, 0.03125, 0.03125 };
       
   467 
       
   468     RUN_CONVERSION ("float32 mono to stereo",
       
   469         in, get_float_caps (1, "BYTE_ORDER", 32),
       
   470         out, get_float_caps (2, "BYTE_ORDER", 32));
       
   471   }
       
   472   std_log(LOG_FILENAME_LINE, "Test Successful");
       
   473     create_xml(0);
       
   474 }
       
   475 
       
   476 
       
   477 
       
   478 
       
   479 void test_int_conversion()
       
   480 {
       
   481 	xmlfile = "test_int_conversion";
       
   482     std_log(LOG_FILENAME_LINE, "Test Started test_int_conversion");
       
   483   /* 8 <-> 16 signed */
       
   484   /* NOTE: if audioconvert was doing dithering we'd have a problem */
       
   485   {
       
   486     gint8 in[] = { 0, 1, 2, 127, -127 };
       
   487     gint16 out[] = { 0, 256, 512, 32512, -32512 };
       
   488 
       
   489     RUN_CONVERSION ("int 8bit to 16bit signed",
       
   490         in, get_int_caps (1, "BYTE_ORDER", 8, 8, TRUE),
       
   491         out, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE)
       
   492         );
       
   493     RUN_CONVERSION ("int 16bit signed to 8bit",
       
   494         out, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE),
       
   495         in, get_int_caps (1, "BYTE_ORDER", 8, 8, TRUE)
       
   496         );
       
   497   }
       
   498   /* 16 -> 8 signed */
       
   499   {
       
   500     gint16 in[] = { 0, 127, 128, 256, 256 + 127, 256 + 128 };
       
   501     gint8 out[] = { 0, 0, 1, 1, 1, 2 };
       
   502 
       
   503     RUN_CONVERSION ("16 bit to 8 signed",
       
   504         in, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE),
       
   505         out, get_int_caps (1, "BYTE_ORDER", 8, 8, TRUE)
       
   506         );
       
   507   }
       
   508   /* 8 unsigned <-> 16 signed */
       
   509   /* NOTE: if audioconvert was doing dithering we'd have a problem */
       
   510   {
       
   511     guint8 in[] = { 128, 129, 130, 255, 1 };
       
   512     gint16 out[] = { 0, 256, 512, 32512, -32512 };
       
   513     GstCaps *incaps, *outcaps;
       
   514 
       
   515     /* exploded for easier valgrinding */
       
   516     incaps = get_int_caps (1, "BYTE_ORDER", 8, 8, FALSE);
       
   517     outcaps = get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE);
       
   518     GST_DEBUG ("incaps: %" GST_PTR_FORMAT, incaps);
       
   519     GST_DEBUG ("outcaps: %" GST_PTR_FORMAT, outcaps);
       
   520     RUN_CONVERSION ("8 unsigned to 16 signed", in, incaps, out, outcaps);
       
   521     RUN_CONVERSION ("16 signed to 8 unsigned", out, get_int_caps (1,
       
   522             "BYTE_ORDER", 16, 16, TRUE), in, get_int_caps (1, "BYTE_ORDER", 8,
       
   523             8, FALSE)
       
   524         );
       
   525   }
       
   526   /* 8 <-> 24 signed */
       
   527   /* NOTE: if audioconvert was doing dithering we'd have a problem */
       
   528   {
       
   529     gint8 in[] = { 0, 1, 127 };
       
   530     guint8 out[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7f };
       
   531     /* out has the bytes in little-endian, so that's how they should be
       
   532      * interpreted during conversion */
       
   533 
       
   534     RUN_CONVERSION ("8 to 24 signed", in, get_int_caps (1, "BYTE_ORDER", 8, 8,
       
   535             TRUE), out, get_int_caps (1, "LITTLE_ENDIAN", 24, 24, TRUE)
       
   536         );
       
   537     RUN_CONVERSION ("24 signed to 8", out, get_int_caps (1, "LITTLE_ENDIAN", 24,
       
   538             24, TRUE), in, get_int_caps (1, "BYTE_ORDER", 8, 8, TRUE)
       
   539         );
       
   540   }
       
   541 
       
   542   /* 16 bit signed <-> unsigned */
       
   543   {
       
   544     gint16 in[] = { 0, 128, -128 };
       
   545     guint16 out[] = { 32768, 32896, 32640 };
       
   546     RUN_CONVERSION ("16 signed to 16 unsigned",
       
   547         in, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE),
       
   548         out, get_int_caps (1, "BYTE_ORDER", 16, 16, FALSE)
       
   549         );
       
   550     RUN_CONVERSION ("16 unsigned to 16 signed",
       
   551         out, get_int_caps (1, "BYTE_ORDER", 16, 16, FALSE),
       
   552         in, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE)
       
   553         );
       
   554   }
       
   555 
       
   556   /* 16 bit signed <-> 8 in 16 bit signed */
       
   557   /* NOTE: if audioconvert was doing dithering we'd have a problem */
       
   558   {
       
   559     gint16 in[] = { 0, 64 << 8, -64 << 8 };
       
   560     gint16 out[] = { 0, 64, -64 };
       
   561     RUN_CONVERSION ("16 signed to 8 in 16 signed",
       
   562         in, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE),
       
   563         out, get_int_caps (1, "BYTE_ORDER", 16, 8, TRUE)
       
   564         );
       
   565     RUN_CONVERSION ("8 in 16 signed to 16 signed",
       
   566         out, get_int_caps (1, "BYTE_ORDER", 16, 8, TRUE),
       
   567         in, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE)
       
   568         );
       
   569   }
       
   570 
       
   571   /* 16 bit unsigned <-> 8 in 16 bit unsigned */
       
   572   /* NOTE: if audioconvert was doing dithering we'd have a problem */
       
   573   {
       
   574     guint16 in[] = { 1 << 15, (1 << 15) - (64 << 8), (1 << 15) + (64 << 8) };
       
   575     guint16 out[] = { 1 << 7, (1 << 7) - 64, (1 << 7) + 64 };
       
   576     RUN_CONVERSION ("16 unsigned to 8 in 16 unsigned",
       
   577         in, get_int_caps (1, "BYTE_ORDER", 16, 16, FALSE),
       
   578         out, get_int_caps (1, "BYTE_ORDER", 16, 8, FALSE)
       
   579         );
       
   580     RUN_CONVERSION ("8 in 16 unsigned to 16 unsigned",
       
   581         out, get_int_caps (1, "BYTE_ORDER", 16, 8, FALSE),
       
   582         in, get_int_caps (1, "BYTE_ORDER", 16, 16, FALSE)
       
   583         );
       
   584   }
       
   585 
       
   586   /* 32 bit signed -> 16 bit signed for rounding check */
       
   587   /* NOTE: if audioconvert was doing dithering we'd have a problem */
       
   588   {
       
   589     gint32 in[] = { 0, G_MININT32, G_MAXINT32,
       
   590       (32 << 16), (32 << 16) + (1 << 15), (32 << 16) - (1 << 15),
       
   591       (32 << 16) + (2 << 15), (32 << 16) - (2 << 15),
       
   592       (-32 << 16) + (1 << 15), (-32 << 16) - (1 << 15),
       
   593       (-32 << 16) + (2 << 15), (-32 << 16) - (2 << 15),
       
   594       (-32 << 16)
       
   595     };
       
   596     gint16 out[] = { 0, G_MININT16, G_MAXINT16,
       
   597       32, 33, 32,
       
   598       33, 31,
       
   599       -31, -32,
       
   600       -31, -33,
       
   601       -32
       
   602     };
       
   603     RUN_CONVERSION ("32 signed to 16 signed for rounding",
       
   604         in, get_int_caps (1, "BYTE_ORDER", 32, 32, TRUE),
       
   605         out, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE)
       
   606         );
       
   607   }
       
   608 
       
   609   /* 32 bit signed -> 16 bit unsigned for rounding check */
       
   610   /* NOTE: if audioconvert was doing dithering we'd have a problem */
       
   611   {
       
   612     gint32 in[] = { 0, G_MININT32, G_MAXINT32,
       
   613       (32 << 16), (32 << 16) + (1 << 15), (32 << 16) - (1 << 15),
       
   614       (32 << 16) + (2 << 15), (32 << 16) - (2 << 15),
       
   615       (-32 << 16) + (1 << 15), (-32 << 16) - (1 << 15),
       
   616       (-32 << 16) + (2 << 15), (-32 << 16) - (2 << 15),
       
   617       (-32 << 16)
       
   618     };
       
   619     guint16 out[] = { (1 << 15), 0, G_MAXUINT16,
       
   620       (1 << 15) + 32, (1 << 15) + 33, (1 << 15) + 32,
       
   621       (1 << 15) + 33, (1 << 15) + 31,
       
   622       (1 << 15) - 31, (1 << 15) - 32,
       
   623       (1 << 15) - 31, (1 << 15) - 33,
       
   624       (1 << 15) - 32
       
   625     };
       
   626     RUN_CONVERSION ("32 signed to 16 unsigned for rounding",
       
   627         in, get_int_caps (1, "BYTE_ORDER", 32, 32, TRUE),
       
   628         out, get_int_caps (1, "BYTE_ORDER", 16, 16, FALSE)
       
   629         );
       
   630   }
       
   631   std_log(LOG_FILENAME_LINE, "Test Successful");
       
   632     create_xml(0);
       
   633 }
       
   634 
       
   635 void create_array_float(gfloat in_be[], float temp[], int len)
       
   636     {
       
   637         int i;
       
   638         for(i=0; i<len; i++)
       
   639                 in_be[i] = GFLOAT_TO_BE (temp[i]);
       
   640     }
       
   641 void create_array_double(gdouble in_be[], float temp[], int len)
       
   642     {
       
   643         int i;
       
   644         for(i=0; i<len; i++)
       
   645                 in_be[i] = GDOUBLE_TO_BE (temp[i]);
       
   646     }
       
   647 
       
   648 
       
   649 void test_float_conversion()
       
   650 {
       
   651     std_log(LOG_FILENAME_LINE, "Test Started test_float_conversion");
       
   652   /* 32 float <-> 16 signed */
       
   653   /* NOTE: if audioconvert was doing dithering we'd have a problem */
       
   654   {
       
   655     gfloat in_le[] =
       
   656         { GFLOAT_TO_LE (0.0), GFLOAT_TO_LE (1.0), GFLOAT_TO_LE (-1.0),
       
   657       GFLOAT_TO_LE (0.5), GFLOAT_TO_LE (-0.5), GFLOAT_TO_LE (1.1),
       
   658       GFLOAT_TO_LE (-1.1)
       
   659     };
       
   660     
       
   661 
       
   662     gfloat in_be[7];
       
   663     float temp[] = {0.0, 1.0, -1.0, 0.5, -0.5, 1.1, -1.1};  
       
   664     
       
   665     gint16 out[] = { 0, 32767, -32768, 16384, -16384, 32767, -32768 };
       
   666     
       
   667     create_array_float(in_be, temp, 7);
       
   668 
       
   669     /* only one direction conversion, the other direction does
       
   670      * not produce exactly the same as the input due to floating
       
   671      * point rounding errors etc. */
       
   672     RUN_CONVERSION ("32 float le to 16 signed",
       
   673         in_le, get_float_caps (1, "LITTLE_ENDIAN", 32),
       
   674         out, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE));
       
   675     RUN_CONVERSION ("32 float be to 16 signed",
       
   676         in_be, get_float_caps (1, "BIG_ENDIAN", 32),
       
   677         out, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE));
       
   678   }
       
   679 
       
   680 
       
   681   {
       
   682     gint16 in[] = { 0, -32768, 16384, -16384 };
       
   683     gfloat out[] = { 0.0, -1.0, 0.5, -0.5 };
       
   684 
       
   685     RUN_CONVERSION ("16 signed to 32 float",
       
   686         in, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE),
       
   687         out, get_float_caps (1, "BYTE_ORDER", 32));
       
   688   }
       
   689 
       
   690   /* 64 float <-> 16 signed */
       
   691   /* NOTE: if audioconvert was doing dithering we'd have a problem */
       
   692   {
       
   693     gdouble in_le[] =
       
   694         { GDOUBLE_TO_LE (0.0), GDOUBLE_TO_LE (1.0), GDOUBLE_TO_LE (-1.0),
       
   695       GDOUBLE_TO_LE (0.5), GDOUBLE_TO_LE (-0.5), GDOUBLE_TO_LE (1.1),
       
   696       GDOUBLE_TO_LE (-1.1)
       
   697     };
       
   698    
       
   699     gdouble in_be[7];
       
   700     float temp[] = {0.0, 1.0, -1.0, 0.5, -0.5, 1.1, -1.1}; 
       
   701         
       
   702     gint16 out[] = { 0, 32767, -32768, 16384, -16384, 32767, -32768 };
       
   703     create_array_double(in_be, temp, 7);
       
   704 
       
   705     /* only one direction conversion, the other direction does
       
   706      * not produce exactly the same as the input due to floating
       
   707      * point rounding errors etc. */
       
   708     RUN_CONVERSION ("64 float LE to 16 signed",
       
   709         in_le, get_float_caps (1, "LITTLE_ENDIAN", 64),
       
   710         out, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE));
       
   711     RUN_CONVERSION ("64 float BE to 16 signed",
       
   712         in_be, get_float_caps (1, "BIG_ENDIAN", 64),
       
   713         out, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE));
       
   714   }
       
   715   {
       
   716     gint16 in[] = { 0, -32768, 16384, -16384 };
       
   717     gdouble out[] = { 0.0,
       
   718       (gdouble) (-32768L << 16) / 2147483647.0, /* ~ -1.0 */
       
   719       (gdouble) (16384L << 16) / 2147483647.0,  /* ~  0.5 */
       
   720       (gdouble) (-16384L << 16) / 2147483647.0, /* ~ -0.5 */
       
   721     };
       
   722 
       
   723     RUN_CONVERSION ("16 signed to 64 float",
       
   724         in, get_int_caps (1, "BYTE_ORDER", 16, 16, TRUE),
       
   725         out, get_float_caps (1, "BYTE_ORDER", 64));
       
   726   }
       
   727   {
       
   728     gint32 in[] = { 0, (-1L << 31), (1L << 30), (-1L << 30) };
       
   729     gdouble out[] = { 0.0,
       
   730       (gdouble) (-1L << 31) / 2147483647.0,     /* ~ -1.0 */
       
   731       (gdouble) (1L << 30) / 2147483647.0,      /* ~  0.5 */
       
   732       (gdouble) (-1L << 30) / 2147483647.0,     /* ~ -0.5 */
       
   733     };
       
   734 
       
   735     RUN_CONVERSION ("32 signed to 64 float",
       
   736         in, get_int_caps (1, "BYTE_ORDER", 32, 32, TRUE),
       
   737         out, get_float_caps (1, "BYTE_ORDER", 64));
       
   738   }
       
   739 
       
   740   /* 64-bit float <-> 32-bit float */
       
   741   {
       
   742     gdouble in[] = { 0.0, 1.0, -1.0, 0.5, -0.5 };
       
   743     gfloat out[] = { 0.0, 1.0, -1.0, 0.5, -0.5 };
       
   744     
       
   745     RUN_CONVERSION ("64 float to 32 float",
       
   746         in, get_float_caps (1, "BYTE_ORDER", 64),
       
   747         out, get_float_caps (1, "BYTE_ORDER", 32));
       
   748 
       
   749     RUN_CONVERSION ("32 float to 64 float",
       
   750         out, get_float_caps (1, "BYTE_ORDER", 32),
       
   751         in, get_float_caps (1, "BYTE_ORDER", 64));
       
   752   }
       
   753 
       
   754   /* 32-bit float little endian <-> big endian */
       
   755   {
       
   756     gfloat le[] = { GFLOAT_TO_LE (0.0), GFLOAT_TO_LE (1.0), GFLOAT_TO_LE (-1.0),
       
   757       GFLOAT_TO_LE (0.5), GFLOAT_TO_LE (-0.5)
       
   758     };
       
   759   
       
   760     gfloat be[5];
       
   761     float temp[] = {0.0, 1.0, -1.0, 0.5, -0.5};
       
   762            
       
   763     create_array_float(be, temp, 5);
       
   764 
       
   765     RUN_CONVERSION ("32 float LE to BE",
       
   766         le, get_float_caps (1, "LITTLE_ENDIAN", 32),
       
   767         be, get_float_caps (1, "BIG_ENDIAN", 32));
       
   768 
       
   769     RUN_CONVERSION ("32 float BE to LE",
       
   770         be, get_float_caps (1, "BIG_ENDIAN", 32),
       
   771         le, get_float_caps (1, "LITTLE_ENDIAN", 32));
       
   772   }
       
   773 
       
   774   /* 64-bit float little endian <-> big endian */
       
   775   {
       
   776     gdouble le[] =
       
   777         { GDOUBLE_TO_LE (0.0), GDOUBLE_TO_LE (1.0), GDOUBLE_TO_LE (-1.0),
       
   778       GDOUBLE_TO_LE (0.5), GDOUBLE_TO_LE (-0.5)
       
   779     };
       
   780 
       
   781     gdouble be[5];
       
   782     float temp[] = {0.0, 1.0, -1.0, 0.5, -0.5}; 
       
   783         
       
   784     create_array_double(be, temp, 5);
       
   785 
       
   786     RUN_CONVERSION ("64 float LE to BE",
       
   787         le, get_float_caps (1, "LITTLE_ENDIAN", 64),
       
   788         be, get_float_caps (1, "BIG_ENDIAN", 64));
       
   789 
       
   790     RUN_CONVERSION ("64 float BE to LE",
       
   791         be, get_float_caps (1, "BIG_ENDIAN", 64),
       
   792         le, get_float_caps (1, "LITTLE_ENDIAN", 64));
       
   793   }
       
   794 
       
   795   std_log(LOG_FILENAME_LINE, "Test Successful");
       
   796     create_xml(0);
       
   797 }
       
   798 
       
   799 
       
   800 void test_multichannel_conversion()
       
   801 {
       
   802 	xmlfile = "test_multichannel_conversion";
       
   803     std_log(LOG_FILENAME_LINE, "Test Started test_multichannel_conversion");
       
   804   {
       
   805     /* Ensure that audioconvert prefers to convert to integer, rather than mix
       
   806      * to mono
       
   807      */
       
   808     gfloat in[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
       
   809     gfloat out[] = { 0.0, 0.0 };
       
   810 
       
   811     /* only one direction conversion, the other direction does
       
   812      * not produce exactly the same as the input due to floating
       
   813      * point rounding errors etc. */
       
   814     RUN_CONVERSION ("3 channels to 1", in, get_float_mc_caps (3,
       
   815             "BYTE_ORDER", 32, FALSE), out, get_float_caps (1, "BYTE_ORDER",
       
   816             32));
       
   817   }
       
   818   std_log(LOG_FILENAME_LINE, "Test Successful");
       
   819     create_xml(0);
       
   820 }
       
   821 
       
   822 
       
   823 
       
   824 
       
   825 void test_channel_remapping()
       
   826 {
       
   827 	xmlfile = "test_channel_remapping";
       
   828     std_log(LOG_FILENAME_LINE, "Test Started test_channel_remapping");
       
   829   /* float */
       
   830   {
       
   831     gfloat in[] = { 0.0, 1.0, -0.5 };
       
   832     gfloat out[] = { -0.5, 1.0, 0.0 };
       
   833     GstCaps *in_caps = get_float_mc_caps (3, "BYTE_ORDER", 32, FALSE);
       
   834     GstCaps *out_caps = get_float_mc_caps (3, "BYTE_ORDER", 32, TRUE);
       
   835 
       
   836     RUN_CONVERSION ("3 channels layout remapping float", in, in_caps,
       
   837         out, out_caps);
       
   838   }
       
   839 
       
   840   /* int */
       
   841   {
       
   842     guint16 in[] = { 0, 65535, 0x9999 };
       
   843     guint16 out[] = { 0x9999, 65535, 0 };
       
   844     GstCaps *in_caps = get_int_mc_caps (3, "BYTE_ORDER", 16, 16, FALSE, FALSE);
       
   845     GstCaps *out_caps = get_int_mc_caps (3, "BYTE_ORDER", 16, 16, FALSE, TRUE);
       
   846 
       
   847     RUN_CONVERSION ("3 channels layout remapping int", in, in_caps,
       
   848         out, out_caps);
       
   849   }
       
   850 
       
   851   /* TODO: float => int conversion with remapping and vice versa,
       
   852    *       int   => int conversion with remapping */
       
   853    std_log(LOG_FILENAME_LINE, "Test Successful");
       
   854     create_xml(0);
       
   855 }
       
   856 
       
   857 
       
   858 
       
   859 void test_caps_negotiation()
       
   860 {
       
   861   GstElement *src, *ac1, *ac2, *ac3, *sink;
       
   862   GstElement *pipeline;
       
   863   GstPad *ac3_src;
       
   864   GstCaps *caps1, *caps2;
       
   865 xmlfile = "test_caps_negotiation";
       
   866     std_log(LOG_FILENAME_LINE, "Test Started test_caps_negotiation");
       
   867   pipeline = gst_pipeline_new ("test");
       
   868 
       
   869   /* create elements */
       
   870   src = gst_element_factory_make ("audiotestsrc", "src");
       
   871   ac1 = gst_element_factory_make ("audioconvert", "ac1");
       
   872   ac2 = gst_element_factory_make ("audioconvert", "ac2");
       
   873   ac3 = gst_element_factory_make ("audioconvert", "ac3");
       
   874   sink = gst_element_factory_make ("fakesink", "sink");
       
   875   ac3_src = gst_element_get_pad (ac3, "src");
       
   876 
       
   877   /* test with 2 audioconvert elements */
       
   878   gst_bin_add_many (GST_BIN (pipeline), src, ac1, ac3, sink, NULL);
       
   879   gst_element_link_many (src, ac1, ac3, sink, NULL);
       
   880 
       
   881   /* Set to PAUSED and wait for PREROLL */
       
   882   fail_if (gst_element_set_state (pipeline, GST_STATE_PAUSED) ==
       
   883       GST_STATE_CHANGE_FAILURE, "Failed to set test pipeline to PAUSED");
       
   884   fail_if (gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE) !=
       
   885       GST_STATE_CHANGE_SUCCESS, "Failed to set test pipeline to PAUSED");
       
   886 
       
   887   caps1 = gst_pad_get_caps (ac3_src);
       
   888   fail_if (caps1 == NULL, "gst_pad_get_caps returned NULL");
       
   889   GST_DEBUG ("Caps size 1 : %d", gst_caps_get_size (caps1));
       
   890 
       
   891   fail_if (gst_element_set_state (pipeline, GST_STATE_READY) ==
       
   892       GST_STATE_CHANGE_FAILURE, "Failed to set test pipeline back to READY");
       
   893   fail_if (gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE) !=
       
   894       GST_STATE_CHANGE_SUCCESS, "Failed to set test pipeline back to READY");
       
   895 
       
   896   /* test with 3 audioconvert elements */
       
   897   gst_element_unlink (ac1, ac3);
       
   898   gst_bin_add (GST_BIN (pipeline), ac2);
       
   899   gst_element_link_many (ac1, ac2, ac3, NULL);
       
   900 
       
   901   fail_if (gst_element_set_state (pipeline, GST_STATE_PAUSED) ==
       
   902       GST_STATE_CHANGE_FAILURE, "Failed to set test pipeline back to PAUSED");
       
   903   fail_if (gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE) !=
       
   904       GST_STATE_CHANGE_SUCCESS, "Failed to set test pipeline back to PAUSED");
       
   905 
       
   906   caps2 = gst_pad_get_caps (ac3_src);
       
   907 
       
   908   fail_if (caps2 == NULL, "gst_pad_get_caps returned NULL");
       
   909   GST_DEBUG ("Caps size 2 : %d", gst_caps_get_size (caps2));
       
   910   fail_unless (gst_caps_get_size (caps1) == gst_caps_get_size (caps2));
       
   911 
       
   912   gst_caps_unref (caps1);
       
   913   gst_caps_unref (caps2);
       
   914 
       
   915   fail_if (gst_element_set_state (pipeline, GST_STATE_NULL) ==
       
   916       GST_STATE_CHANGE_FAILURE, "Failed to set test pipeline back to NULL");
       
   917   fail_if (gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE) !=
       
   918       GST_STATE_CHANGE_SUCCESS, "Failed to set test pipeline back to NULL");
       
   919 
       
   920   gst_object_unref (ac3_src);
       
   921   gst_object_unref (pipeline);
       
   922   std_log(LOG_FILENAME_LINE, "Test Successful");
       
   923     create_xml(0);
       
   924 }
       
   925 
       
   926 
       
   927 
       
   928 
       
   929 void (*fn[]) (void) = {
       
   930 test_int16,
       
   931 test_float32,
       
   932 test_int_conversion,
       
   933 test_float_conversion,
       
   934 test_multichannel_conversion,
       
   935 test_channel_remapping,
       
   936 test_caps_negotiation
       
   937 };
       
   938 
       
   939 char *args[] = {
       
   940 "test_int16",
       
   941 "test_float32",
       
   942 "test_int_conversion",
       
   943 "test_float_conversion",
       
   944 "test_multichannel_conversion",
       
   945 "test_channel_remapping",
       
   946 "test_caps_negotiation"
       
   947 };
       
   948 
       
   949 GST_CHECK_MAIN(audioconvert)
       
   950 
       
   951