gst_plugins_base/tests/check/libs/audio.c
changeset 2 5505e8908944
parent 0 0e761a78d257
equal deleted inserted replaced
1:4c282e7dd6d3 2:5505e8908944
       
     1 /* GStreamer
       
     2  *
       
     3  * unit tests for audio support library
       
     4  *
       
     5  * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
       
     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 #ifdef HAVE_CONFIG_H
       
    24 #include "config.h"
       
    25 #endif
       
    26 
       
    27 #include <gst/check/gstcheck.h>
       
    28 
       
    29 #include <gst/audio/audio.h>
       
    30 #include <gst/audio/multichannel.h>
       
    31 #include <string.h>
       
    32 
       
    33 static gboolean
       
    34 structure_contains_channel_positions (const GstStructure * s)
       
    35 {
       
    36   return (gst_structure_get_value (s, "channel-positions") != NULL);
       
    37 }
       
    38 
       
    39 #if 0
       
    40 static gboolean
       
    41 fixed_caps_have_channel_positions (const GstCaps * caps)
       
    42 {
       
    43   GstStructure *s;
       
    44 
       
    45   fail_unless (caps != NULL);
       
    46 
       
    47   s = gst_caps_get_structure (caps, 0);
       
    48   fail_unless (s != NULL);
       
    49 
       
    50   return structure_contains_channel_positions (s);
       
    51 }
       
    52 #endif
       
    53 
       
    54 GST_START_TEST (test_multichannel_checks)
       
    55 {
       
    56   GstAudioChannelPosition pos_2_mixed[2] = {
       
    57     GST_AUDIO_CHANNEL_POSITION_FRONT_MONO,
       
    58     GST_AUDIO_CHANNEL_POSITION_NONE
       
    59   };
       
    60   GstAudioChannelPosition pos_2_none[2] = {
       
    61     GST_AUDIO_CHANNEL_POSITION_NONE,
       
    62     GST_AUDIO_CHANNEL_POSITION_NONE
       
    63   };
       
    64   GstAudioChannelPosition pos_2_flr[2] = {
       
    65     GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
       
    66     GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
       
    67   };
       
    68   GstAudioChannelPosition pos_2_frr[2] = {
       
    69     GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
       
    70     GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
       
    71   };
       
    72   GstStructure *s;
       
    73 
       
    74   s = gst_structure_new ("audio/x-raw-int", "channels", G_TYPE_INT, 2, NULL);
       
    75 
       
    76   /* this should not work and issue a warning: FRONT_MONO + NONE */
       
    77   _gst_check_expecting_log = TRUE;
       
    78   gst_audio_set_channel_positions (s, pos_2_mixed);
       
    79   _gst_check_expecting_log = FALSE;
       
    80   fail_if (structure_contains_channel_positions (s));
       
    81 
       
    82   /* this should work: NONE + NONE */
       
    83   gst_audio_set_channel_positions (s, pos_2_none);
       
    84   fail_unless (structure_contains_channel_positions (s));
       
    85   gst_structure_remove_field (s, "channel-positions");
       
    86 
       
    87   /* this should also work: FRONT_LEFT + FRONT_RIGHT */
       
    88   gst_audio_set_channel_positions (s, pos_2_flr);
       
    89   fail_unless (structure_contains_channel_positions (s));
       
    90   gst_structure_remove_field (s, "channel-positions");
       
    91 
       
    92   /* this should not work and issue a warning: FRONT_RIGHT twice */
       
    93   _gst_check_expecting_log = TRUE;
       
    94   gst_audio_set_channel_positions (s, pos_2_frr);
       
    95   _gst_check_expecting_log = FALSE;
       
    96 
       
    97 /* FIXME: did I misunderstand _set_structure_channel_positions_list? */
       
    98 #if  0
       
    99   /* this should not work and issue a warning: FRONT_RIGHT twice */
       
   100   _gst_check_expecting_log = TRUE;
       
   101   gst_audio_set_structure_channel_positions_list (s, pos_2_frr, 2);
       
   102   _gst_check_expecting_log = FALSE;
       
   103 
       
   104   /* this should not work and issue a warning: FRONT_MONO + NONE */
       
   105   _gst_check_expecting_log = TRUE;
       
   106   gst_audio_set_structure_channel_positions_list (s, pos_2_mixed, 2);
       
   107   _gst_check_expecting_log = FALSE;
       
   108 
       
   109   /* this should not work either (channel count mismatch) */
       
   110   _gst_check_expecting_log = TRUE;
       
   111   gst_audio_set_structure_channel_positions_list (s, pos_2_none, 44);
       
   112   _gst_check_expecting_log = FALSE;
       
   113   fail_if (structure_contains_channel_positions (s));
       
   114 #endif
       
   115 
       
   116   gst_structure_free (s);
       
   117 }
       
   118 
       
   119 GST_END_TEST;
       
   120 
       
   121 GST_START_TEST (test_buffer_clipping_time)
       
   122 {
       
   123   GstSegment s;
       
   124   GstBuffer *buf;
       
   125   GstBuffer *ret;
       
   126   guint8 *data;
       
   127 
       
   128   /* Clip start and end */
       
   129   buf = gst_buffer_new ();
       
   130   data = (guint8 *) g_malloc (1000);
       
   131   GST_BUFFER_SIZE (buf) = 1000;
       
   132   GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = data;
       
   133 
       
   134   gst_segment_init (&s, GST_FORMAT_TIME);
       
   135   gst_segment_set_newsegment (&s, FALSE, 1.0, GST_FORMAT_TIME, 4 * GST_SECOND,
       
   136       8 * GST_SECOND, 4 * GST_SECOND);
       
   137 
       
   138   GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
       
   139   GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
       
   140   GST_BUFFER_OFFSET (buf) = 200;
       
   141   GST_BUFFER_OFFSET_END (buf) = 1200;
       
   142 
       
   143   ret = gst_audio_buffer_clip (buf, &s, 100, 1);
       
   144   fail_unless (ret != NULL);
       
   145 
       
   146   fail_unless (GST_BUFFER_TIMESTAMP (ret) == 4 * GST_SECOND);
       
   147   fail_unless (GST_BUFFER_DURATION (ret) == 4 * GST_SECOND);
       
   148   fail_unless (GST_BUFFER_OFFSET (ret) == 400);
       
   149   fail_unless (GST_BUFFER_OFFSET_END (ret) == 800);
       
   150   fail_unless (GST_BUFFER_DATA (ret) == data + 200);
       
   151   fail_unless (GST_BUFFER_SIZE (ret) == 400);
       
   152 
       
   153   gst_buffer_unref (ret);
       
   154 
       
   155   /* Clip only start */
       
   156   buf = gst_buffer_new ();
       
   157   data = (guint8 *) g_malloc (1000);
       
   158   GST_BUFFER_SIZE (buf) = 1000;
       
   159   GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = data;
       
   160 
       
   161   gst_segment_init (&s, GST_FORMAT_TIME);
       
   162   gst_segment_set_newsegment (&s, FALSE, 1.0, GST_FORMAT_TIME, 4 * GST_SECOND,
       
   163       12 * GST_SECOND, 4 * GST_SECOND);
       
   164 
       
   165   GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
       
   166   GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
       
   167   GST_BUFFER_OFFSET (buf) = 200;
       
   168   GST_BUFFER_OFFSET_END (buf) = 1200;
       
   169 
       
   170   ret = gst_audio_buffer_clip (buf, &s, 100, 1);
       
   171   fail_unless (ret != NULL);
       
   172 
       
   173   fail_unless (GST_BUFFER_TIMESTAMP (ret) == 4 * GST_SECOND);
       
   174   fail_unless (GST_BUFFER_DURATION (ret) == 8 * GST_SECOND);
       
   175   fail_unless (GST_BUFFER_OFFSET (ret) == 400);
       
   176   fail_unless (GST_BUFFER_OFFSET_END (ret) == 1200);
       
   177   fail_unless (GST_BUFFER_DATA (ret) == data + 200);
       
   178   fail_unless (GST_BUFFER_SIZE (ret) == 800);
       
   179 
       
   180   gst_buffer_unref (ret);
       
   181 
       
   182   /* Clip only stop */
       
   183   buf = gst_buffer_new ();
       
   184   data = (guint8 *) g_malloc (1000);
       
   185   GST_BUFFER_SIZE (buf) = 1000;
       
   186   GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = data;
       
   187 
       
   188   gst_segment_init (&s, GST_FORMAT_TIME);
       
   189   gst_segment_set_newsegment (&s, FALSE, 1.0, GST_FORMAT_TIME, 2 * GST_SECOND,
       
   190       10 * GST_SECOND, 2 * GST_SECOND);
       
   191 
       
   192   GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
       
   193   GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
       
   194   GST_BUFFER_OFFSET (buf) = 200;
       
   195   GST_BUFFER_OFFSET_END (buf) = 1200;
       
   196 
       
   197   ret = gst_audio_buffer_clip (buf, &s, 100, 1);
       
   198   fail_unless (ret != NULL);
       
   199 
       
   200   fail_unless (GST_BUFFER_TIMESTAMP (ret) == 2 * GST_SECOND);
       
   201   fail_unless (GST_BUFFER_DURATION (ret) == 8 * GST_SECOND);
       
   202   fail_unless (GST_BUFFER_OFFSET (ret) == 200);
       
   203   fail_unless (GST_BUFFER_OFFSET_END (ret) == 1000);
       
   204   fail_unless (GST_BUFFER_DATA (ret) == data);
       
   205   fail_unless (GST_BUFFER_SIZE (ret) == 800);
       
   206 
       
   207   gst_buffer_unref (ret);
       
   208 
       
   209   /* Buffer outside segment */
       
   210   buf = gst_buffer_new ();
       
   211   data = (guint8 *) g_malloc (1000);
       
   212   GST_BUFFER_SIZE (buf) = 1000;
       
   213   GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = data;
       
   214 
       
   215   gst_segment_init (&s, GST_FORMAT_TIME);
       
   216   gst_segment_set_newsegment (&s, FALSE, 1.0, GST_FORMAT_TIME, 12 * GST_SECOND,
       
   217       20 * GST_SECOND, 12 * GST_SECOND);
       
   218 
       
   219   GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
       
   220   GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
       
   221   GST_BUFFER_OFFSET (buf) = 200;
       
   222   GST_BUFFER_OFFSET_END (buf) = 1200;
       
   223 
       
   224   ret = gst_audio_buffer_clip (buf, &s, 100, 1);
       
   225   fail_unless (ret == NULL);
       
   226 
       
   227   /* Clip start and end but don't touch duration and offset_end */
       
   228   buf = gst_buffer_new ();
       
   229   data = (guint8 *) g_malloc (1000);
       
   230   GST_BUFFER_SIZE (buf) = 1000;
       
   231   GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = data;
       
   232 
       
   233   gst_segment_init (&s, GST_FORMAT_TIME);
       
   234   gst_segment_set_newsegment (&s, FALSE, 1.0, GST_FORMAT_TIME, 4 * GST_SECOND,
       
   235       8 * GST_SECOND, 4 * GST_SECOND);
       
   236 
       
   237   GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
       
   238   GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
       
   239   GST_BUFFER_OFFSET (buf) = 200;
       
   240   GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
       
   241 
       
   242   ret = gst_audio_buffer_clip (buf, &s, 100, 1);
       
   243   fail_unless (ret != NULL);
       
   244 
       
   245   fail_unless (GST_BUFFER_TIMESTAMP (ret) == 4 * GST_SECOND);
       
   246   fail_unless (GST_BUFFER_DURATION (ret) == GST_CLOCK_TIME_NONE);
       
   247   fail_unless (GST_BUFFER_OFFSET (ret) == 400);
       
   248   fail_unless (GST_BUFFER_OFFSET_END (ret) == GST_BUFFER_OFFSET_NONE);
       
   249   fail_unless (GST_BUFFER_DATA (ret) == data + 200);
       
   250   fail_unless (GST_BUFFER_SIZE (ret) == 400);
       
   251 
       
   252   gst_buffer_unref (ret);
       
   253 
       
   254   /* If the buffer has no timestamp it should assert()
       
   255    * FIXME: check if return value is the same as the input buffer.
       
   256    *        probably can't be done because the assert() does a SIGABRT.
       
   257    */
       
   258   buf = gst_buffer_new ();
       
   259   data = (guint8 *) g_malloc (1000);
       
   260   GST_BUFFER_SIZE (buf) = 1000;
       
   261   GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = data;
       
   262 
       
   263   gst_segment_init (&s, GST_FORMAT_TIME);
       
   264   gst_segment_set_newsegment (&s, FALSE, 1.0, GST_FORMAT_TIME, 0 * GST_SECOND,
       
   265       10 * GST_SECOND, 0 * GST_SECOND);
       
   266 
       
   267   GST_BUFFER_TIMESTAMP (buf) = GST_CLOCK_TIME_NONE;
       
   268   GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
       
   269   GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
       
   270   GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
       
   271 
       
   272   ret = gst_audio_buffer_clip (buf, &s, 100, 1);
       
   273   fail_unless (ret == buf);
       
   274 
       
   275   gst_buffer_unref (buf);
       
   276 
       
   277   /* If the format is not TIME or DEFAULT it should assert()
       
   278    * FIXME: check if return value is the same as the input buffer.
       
   279    *        probably can't be done because the assert() does a SIGABRT.
       
   280    */
       
   281   buf = gst_buffer_new ();
       
   282   data = (guint8 *) g_malloc (1000);
       
   283   GST_BUFFER_SIZE (buf) = 1000;
       
   284   GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = data;
       
   285 
       
   286   gst_segment_init (&s, GST_FORMAT_PERCENT);
       
   287   gst_segment_set_newsegment (&s, FALSE, 1.0, GST_FORMAT_PERCENT, 0, 10, 0);
       
   288 
       
   289   GST_BUFFER_TIMESTAMP (buf) = 0 * GST_SECOND;
       
   290   GST_BUFFER_DURATION (buf) = 0;
       
   291   GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
       
   292   GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
       
   293 
       
   294   ASSERT_CRITICAL (ret = gst_audio_buffer_clip (buf, &s, 100, 1));
       
   295 
       
   296   gst_buffer_unref (buf);
       
   297 
       
   298 }
       
   299 
       
   300 GST_END_TEST;
       
   301 
       
   302 GST_START_TEST (test_buffer_clipping_samples)
       
   303 {
       
   304   GstSegment s;
       
   305   GstBuffer *buf;
       
   306   GstBuffer *ret;
       
   307   guint8 *data;
       
   308 
       
   309   /* Clip start and end */
       
   310   buf = gst_buffer_new ();
       
   311   data = (guint8 *) g_malloc (1000);
       
   312   GST_BUFFER_SIZE (buf) = 1000;
       
   313   GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = data;
       
   314 
       
   315   gst_segment_init (&s, GST_FORMAT_DEFAULT);
       
   316   gst_segment_set_newsegment (&s, FALSE, 1.0, GST_FORMAT_DEFAULT, 400,
       
   317       800, 400);
       
   318 
       
   319   GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
       
   320   GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
       
   321   GST_BUFFER_OFFSET (buf) = 200;
       
   322   GST_BUFFER_OFFSET_END (buf) = 1200;
       
   323 
       
   324   ret = gst_audio_buffer_clip (buf, &s, 100, 1);
       
   325   fail_unless (ret != NULL);
       
   326 
       
   327   fail_unless (GST_BUFFER_TIMESTAMP (ret) == 4 * GST_SECOND);
       
   328   fail_unless (GST_BUFFER_DURATION (ret) == 4 * GST_SECOND);
       
   329   fail_unless (GST_BUFFER_OFFSET (ret) == 400);
       
   330   fail_unless (GST_BUFFER_OFFSET_END (ret) == 800);
       
   331   fail_unless (GST_BUFFER_DATA (ret) == data + 200);
       
   332   fail_unless (GST_BUFFER_SIZE (ret) == 400);
       
   333 
       
   334   gst_buffer_unref (ret);
       
   335 
       
   336   /* Clip only start */
       
   337   buf = gst_buffer_new ();
       
   338   data = (guint8 *) g_malloc (1000);
       
   339   GST_BUFFER_SIZE (buf) = 1000;
       
   340   GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = data;
       
   341 
       
   342   gst_segment_init (&s, GST_FORMAT_DEFAULT);
       
   343   gst_segment_set_newsegment (&s, FALSE, 1.0, GST_FORMAT_DEFAULT, 400,
       
   344       1200, 400);
       
   345 
       
   346   GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
       
   347   GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
       
   348   GST_BUFFER_OFFSET (buf) = 200;
       
   349   GST_BUFFER_OFFSET_END (buf) = 1200;
       
   350 
       
   351   ret = gst_audio_buffer_clip (buf, &s, 100, 1);
       
   352   fail_unless (ret != NULL);
       
   353 
       
   354   fail_unless (GST_BUFFER_TIMESTAMP (ret) == 4 * GST_SECOND);
       
   355   fail_unless (GST_BUFFER_DURATION (ret) == 8 * GST_SECOND);
       
   356   fail_unless (GST_BUFFER_OFFSET (ret) == 400);
       
   357   fail_unless (GST_BUFFER_OFFSET_END (ret) == 1200);
       
   358   fail_unless (GST_BUFFER_DATA (ret) == data + 200);
       
   359   fail_unless (GST_BUFFER_SIZE (ret) == 800);
       
   360 
       
   361   gst_buffer_unref (ret);
       
   362 
       
   363   /* Clip only stop */
       
   364   buf = gst_buffer_new ();
       
   365   data = (guint8 *) g_malloc (1000);
       
   366   GST_BUFFER_SIZE (buf) = 1000;
       
   367   GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = data;
       
   368 
       
   369   gst_segment_init (&s, GST_FORMAT_DEFAULT);
       
   370   gst_segment_set_newsegment (&s, FALSE, 1.0, GST_FORMAT_DEFAULT, 200,
       
   371       1000, 200);
       
   372 
       
   373   GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
       
   374   GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
       
   375   GST_BUFFER_OFFSET (buf) = 200;
       
   376   GST_BUFFER_OFFSET_END (buf) = 1200;
       
   377 
       
   378   ret = gst_audio_buffer_clip (buf, &s, 100, 1);
       
   379   fail_unless (ret != NULL);
       
   380 
       
   381   fail_unless (GST_BUFFER_TIMESTAMP (ret) == 2 * GST_SECOND);
       
   382   fail_unless (GST_BUFFER_DURATION (ret) == 8 * GST_SECOND);
       
   383   fail_unless (GST_BUFFER_OFFSET (ret) == 200);
       
   384   fail_unless (GST_BUFFER_OFFSET_END (ret) == 1000);
       
   385   fail_unless (GST_BUFFER_DATA (ret) == data);
       
   386   fail_unless (GST_BUFFER_SIZE (ret) == 800);
       
   387 
       
   388   gst_buffer_unref (ret);
       
   389 
       
   390   /* Buffer outside segment */
       
   391   buf = gst_buffer_new ();
       
   392   data = (guint8 *) g_malloc (1000);
       
   393   GST_BUFFER_SIZE (buf) = 1000;
       
   394   GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = data;
       
   395 
       
   396   gst_segment_init (&s, GST_FORMAT_DEFAULT);
       
   397   gst_segment_set_newsegment (&s, FALSE, 1.0, GST_FORMAT_DEFAULT, 1200,
       
   398       2000, 1200);
       
   399 
       
   400   GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
       
   401   GST_BUFFER_DURATION (buf) = 10 * GST_SECOND;
       
   402   GST_BUFFER_OFFSET (buf) = 200;
       
   403   GST_BUFFER_OFFSET_END (buf) = 1200;
       
   404 
       
   405   ret = gst_audio_buffer_clip (buf, &s, 100, 1);
       
   406   fail_unless (ret == NULL);
       
   407 
       
   408   /* Clip start and end but don't touch duration and offset_end */
       
   409   buf = gst_buffer_new ();
       
   410   data = (guint8 *) g_malloc (1000);
       
   411   GST_BUFFER_SIZE (buf) = 1000;
       
   412   GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = data;
       
   413 
       
   414   gst_segment_init (&s, GST_FORMAT_DEFAULT);
       
   415   gst_segment_set_newsegment (&s, FALSE, 1.0, GST_FORMAT_DEFAULT, 400,
       
   416       800, 400);
       
   417 
       
   418   GST_BUFFER_TIMESTAMP (buf) = 2 * GST_SECOND;
       
   419   GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
       
   420   GST_BUFFER_OFFSET (buf) = 200;
       
   421   GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
       
   422 
       
   423   ret = gst_audio_buffer_clip (buf, &s, 100, 1);
       
   424   fail_unless (ret != NULL);
       
   425 
       
   426   fail_unless (GST_BUFFER_TIMESTAMP (ret) == 4 * GST_SECOND);
       
   427   fail_unless (GST_BUFFER_DURATION (ret) == GST_CLOCK_TIME_NONE);
       
   428   fail_unless (GST_BUFFER_OFFSET (ret) == 400);
       
   429   fail_unless (GST_BUFFER_OFFSET_END (ret) == GST_BUFFER_OFFSET_NONE);
       
   430   fail_unless (GST_BUFFER_DATA (ret) == data + 200);
       
   431   fail_unless (GST_BUFFER_SIZE (ret) == 400);
       
   432 
       
   433   gst_buffer_unref (ret);
       
   434 
       
   435   /* If the buffer has no offset it should assert()
       
   436    * FIXME: check if return value is the same as the input buffer.
       
   437    *        probably can't be done because the assert() does a SIGABRT.
       
   438    */
       
   439   buf = gst_buffer_new ();
       
   440   data = (guint8 *) g_malloc (1000);
       
   441   GST_BUFFER_SIZE (buf) = 1000;
       
   442   GST_BUFFER_DATA (buf) = GST_BUFFER_MALLOCDATA (buf) = data;
       
   443 
       
   444   gst_segment_init (&s, GST_FORMAT_DEFAULT);
       
   445   gst_segment_set_newsegment (&s, FALSE, 1.0, GST_FORMAT_DEFAULT, 0, 10, 0);
       
   446 
       
   447   GST_BUFFER_TIMESTAMP (buf) = 0 * GST_SECOND;
       
   448   GST_BUFFER_DURATION (buf) = GST_CLOCK_TIME_NONE;
       
   449   GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
       
   450   GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
       
   451 
       
   452   ASSERT_CRITICAL (ret = gst_audio_buffer_clip (buf, &s, 100, 1));
       
   453 
       
   454   gst_buffer_unref (buf);
       
   455 }
       
   456 
       
   457 GST_END_TEST;
       
   458 
       
   459 static void
       
   460 init_value_to_channel_layout (GValue * val, GstAudioChannelPosition pos1,
       
   461     GstAudioChannelPosition pos2)
       
   462 {
       
   463   GValue pos = { 0, };
       
   464 
       
   465   g_value_init (val, GST_TYPE_ARRAY);
       
   466   g_value_init (&pos, GST_TYPE_AUDIO_CHANNEL_POSITION);
       
   467   g_value_set_enum (&pos, pos1);
       
   468   gst_value_array_append_value (val, &pos);
       
   469   g_value_set_enum (&pos, pos2);
       
   470   gst_value_array_append_value (val, &pos);
       
   471   g_value_unset (&pos);
       
   472 }
       
   473 
       
   474 GST_START_TEST (test_channel_layout_value_intersect)
       
   475 {
       
   476   GValue layout = { 0, };
       
   477   GValue list = { 0, };
       
   478   GValue res = { 0, };
       
   479 
       
   480   g_value_init (&list, GST_TYPE_LIST);
       
   481   init_value_to_channel_layout (&layout, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
       
   482       GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT);
       
   483   gst_value_list_append_value (&list, &layout);
       
   484   g_value_unset (&layout);
       
   485   init_value_to_channel_layout (&layout, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
       
   486       GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT);
       
   487   gst_value_list_append_value (&list, &layout);
       
   488   g_value_unset (&layout);
       
   489 
       
   490   init_value_to_channel_layout (&layout, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
       
   491       GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT);
       
   492 
       
   493   /* we should get the second layout in the list, as it matches the input */
       
   494   fail_unless (gst_value_intersect (&res, &layout, &list));
       
   495   g_value_unset (&layout);
       
   496   fail_unless (GST_VALUE_HOLDS_ARRAY (&res));
       
   497   fail_unless_equals_int (gst_value_array_get_size (&res), 2);
       
   498   fail_unless_equals_int (g_value_get_enum (gst_value_array_get_value (&res,
       
   499               0)), GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT);
       
   500   fail_unless_equals_int (g_value_get_enum (gst_value_array_get_value (&res,
       
   501               1)), GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT);
       
   502   g_value_unset (&res);
       
   503 
       
   504   /* this (with rear position) should not yield any results */
       
   505   init_value_to_channel_layout (&layout, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
       
   506       GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT);
       
   507   fail_if (gst_value_intersect (&res, &layout, &list));
       
   508   g_value_unset (&layout);
       
   509 
       
   510   g_value_unset (&list);
       
   511 }
       
   512 
       
   513 GST_END_TEST;
       
   514 
       
   515 static Suite *
       
   516 audio_suite (void)
       
   517 {
       
   518   Suite *s = suite_create ("audio support library");
       
   519   TCase *tc_chain = tcase_create ("general");
       
   520 
       
   521   suite_add_tcase (s, tc_chain);
       
   522   tcase_add_test (tc_chain, test_multichannel_checks);
       
   523   tcase_add_test (tc_chain, test_buffer_clipping_time);
       
   524   tcase_add_test (tc_chain, test_buffer_clipping_samples);
       
   525   tcase_add_test (tc_chain, test_channel_layout_value_intersect);
       
   526 
       
   527   return s;
       
   528 }
       
   529 
       
   530 int
       
   531 main (int argc, char **argv)
       
   532 {
       
   533   int nf;
       
   534 
       
   535   Suite *s = audio_suite ();
       
   536   SRunner *sr = srunner_create (s);
       
   537 
       
   538   gst_check_init (&argc, &argv);
       
   539 
       
   540   srunner_run_all (sr, CK_NORMAL);
       
   541   nf = srunner_ntests_failed (sr);
       
   542   srunner_free (sr);
       
   543 
       
   544   return nf;
       
   545 }