gst_plugins_good/gst/law/alaw-encode.c
changeset 26 69c7080681bf
parent 24 bc39b352897e
child 28 4ed5253bb6ba
equal deleted inserted replaced
24:bc39b352897e 26:69c7080681bf
     1 /* GStreamer PCM to A-Law conversion
       
     2  * Copyright (C) 2000 by Abramo Bagnara <abramo@alsa-project.org>
       
     3  *
       
     4  * This library is free software; you can redistribute it and/or
       
     5  * modify it under the terms of the GNU Library General Public
       
     6  * License as published by the Free Software Foundation; either
       
     7  * version 2.1 of the License, or (at your option) any later version.
       
     8  *
       
     9  * This library is distributed in the hope that it will be useful,
       
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
       
    12  * Library General Public License for more details.
       
    13  *
       
    14  * You should have received a copy of the GNU Library General Public
       
    15  * License along with this library; if not, write to the
       
    16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
       
    17  * Boston, MA 02111-1307, USA.
       
    18  */
       
    19 /**
       
    20  * SECTION:element-alawenc
       
    21  *
       
    22  * This element encode alaw audio. Alaw coding is also known as G.711.
       
    23  */
       
    24 
       
    25 #ifdef HAVE_CONFIG_H
       
    26 #include "config.h"
       
    27 #endif
       
    28 
       
    29 #include "alaw-encode.h"
       
    30 
       
    31 GST_DEBUG_CATEGORY_STATIC (alaw_enc_debug);
       
    32 #define GST_CAT_DEFAULT alaw_enc_debug
       
    33 
       
    34 extern GstStaticPadTemplate alaw_enc_src_factory;
       
    35 extern GstStaticPadTemplate alaw_enc_sink_factory;
       
    36 
       
    37 static GstFlowReturn gst_alaw_enc_chain (GstPad * pad, GstBuffer * buffer);
       
    38 
       
    39 GST_BOILERPLATE (GstALawEnc, gst_alaw_enc, GstElement, GST_TYPE_ELEMENT);
       
    40 
       
    41 /* some day we might have defines in gstconfig.h that tell us about the
       
    42  * desired cpu/memory/binary size trade-offs */
       
    43 #define GST_ALAW_ENC_USE_TABLE
       
    44 
       
    45 #ifdef GST_ALAW_ENC_USE_TABLE
       
    46 
       
    47 static const guint8 alaw_encode[2048 + 1] = {
       
    48   0xd5, 0xd4, 0xd7, 0xd6, 0xd1, 0xd0, 0xd3, 0xd2, 0xdd, 0xdc, 0xdf, 0xde,
       
    49   0xd9, 0xd8, 0xdb, 0xda, 0xc5, 0xc4, 0xc7, 0xc6, 0xc1, 0xc0, 0xc3, 0xc2,
       
    50   0xcd, 0xcc, 0xcf, 0xce, 0xc9, 0xc8, 0xcb, 0xca, 0xf5, 0xf5, 0xf4, 0xf4,
       
    51   0xf7, 0xf7, 0xf6, 0xf6, 0xf1, 0xf1, 0xf0, 0xf0, 0xf3, 0xf3, 0xf2, 0xf2,
       
    52   0xfd, 0xfd, 0xfc, 0xfc, 0xff, 0xff, 0xfe, 0xfe, 0xf9, 0xf9, 0xf8, 0xf8,
       
    53   0xfb, 0xfb, 0xfa, 0xfa, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4,
       
    54   0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe1, 0xe1, 0xe1, 0xe1,
       
    55   0xe0, 0xe0, 0xe0, 0xe0, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2,
       
    56   0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xef, 0xef, 0xef, 0xef,
       
    57   0xee, 0xee, 0xee, 0xee, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8,
       
    58   0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0x95, 0x95, 0x95, 0x95,
       
    59   0x95, 0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,
       
    60   0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, 0x96,
       
    61   0x96, 0x96, 0x96, 0x96, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
       
    62   0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x93, 0x93, 0x93, 0x93,
       
    63   0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,
       
    64   0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9c, 0x9c, 0x9c, 0x9c,
       
    65   0x9c, 0x9c, 0x9c, 0x9c, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f,
       
    66   0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x99, 0x99, 0x99, 0x99,
       
    67   0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,
       
    68   0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9a, 0x9a, 0x9a, 0x9a,
       
    69   0x9a, 0x9a, 0x9a, 0x9a, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,
       
    70   0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84,
       
    71   0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
       
    72   0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,
       
    73   0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,
       
    74   0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x81, 0x81, 0x81, 0x81,
       
    75   0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
       
    76   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
       
    77   0x80, 0x80, 0x80, 0x80, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,
       
    78   0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82,
       
    79   0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
       
    80   0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d,
       
    81   0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
       
    82   0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8f, 0x8f, 0x8f, 0x8f,
       
    83   0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f,
       
    84   0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e,
       
    85   0x8e, 0x8e, 0x8e, 0x8e, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,
       
    86   0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88,
       
    87   0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
       
    88   0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,
       
    89   0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
       
    90   0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0xb5, 0xb5, 0xb5, 0xb5,
       
    91   0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5,
       
    92   0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5,
       
    93   0xb5, 0xb5, 0xb5, 0xb5, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4,
       
    94   0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4,
       
    95   0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4,
       
    96   0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7,
       
    97   0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7,
       
    98   0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6,
       
    99   0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6,
       
   100   0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6,
       
   101   0xb6, 0xb6, 0xb6, 0xb6, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1,
       
   102   0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1,
       
   103   0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1,
       
   104   0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0,
       
   105   0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0,
       
   106   0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb3, 0xb3, 0xb3, 0xb3,
       
   107   0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3,
       
   108   0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3,
       
   109   0xb3, 0xb3, 0xb3, 0xb3, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2,
       
   110   0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2,
       
   111   0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2,
       
   112   0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd,
       
   113   0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd,
       
   114   0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc,
       
   115   0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc,
       
   116   0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc,
       
   117   0xbc, 0xbc, 0xbc, 0xbc, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
       
   118   0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
       
   119   0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
       
   120   0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe,
       
   121   0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe,
       
   122   0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xb9, 0xb9, 0xb9, 0xb9,
       
   123   0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9,
       
   124   0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9,
       
   125   0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8,
       
   126   0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8,
       
   127   0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8,
       
   128   0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
       
   129   0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
       
   130   0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba,
       
   131   0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
       
   132   0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
       
   133   0xba, 0xba, 0xba, 0xba, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
       
   134   0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
       
   135   0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
       
   136   0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
       
   137   0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
       
   138   0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4,
       
   139   0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
       
   140   0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
       
   141   0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
       
   142   0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
       
   143   0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
       
   144   0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
       
   145   0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
       
   146   0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
       
   147   0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
       
   148   0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7,
       
   149   0xa7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
       
   150   0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
       
   151   0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
       
   152   0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
       
   153   0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
       
   154   0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa1, 0xa1, 0xa1, 0xa1,
       
   155   0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
       
   156   0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
       
   157   0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
       
   158   0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
       
   159   0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
       
   160   0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
       
   161   0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
       
   162   0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
       
   163   0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
       
   164   0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0,
       
   165   0xa0, 0xa0, 0xa0, 0xa0, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
       
   166   0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
       
   167   0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
       
   168   0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
       
   169   0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
       
   170   0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2,
       
   171   0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
       
   172   0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
       
   173   0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
       
   174   0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
       
   175   0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2,
       
   176   0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
       
   177   0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
       
   178   0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
       
   179   0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
       
   180   0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad,
       
   181   0xad, 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
       
   182   0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
       
   183   0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
       
   184   0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
       
   185   0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
       
   186   0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xaf, 0xaf, 0xaf, 0xaf,
       
   187   0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
       
   188   0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
       
   189   0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
       
   190   0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
       
   191   0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
       
   192   0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
       
   193   0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
       
   194   0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
       
   195   0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
       
   196   0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
       
   197   0xae, 0xae, 0xae, 0xae, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
       
   198   0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
       
   199   0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
       
   200   0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
       
   201   0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
       
   202   0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8,
       
   203   0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
       
   204   0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
       
   205   0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
       
   206   0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
       
   207   0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
       
   208   0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
       
   209   0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
       
   210   0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
       
   211   0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
       
   212   0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
       
   213   0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
       
   214   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
       
   215   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
       
   216   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
       
   217   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
       
   218   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a
       
   219 };
       
   220 
       
   221 static inline guint8
       
   222 s16_to_alaw (gint16 pcm_val)
       
   223 {
       
   224   if (pcm_val >= 0)
       
   225     return alaw_encode[pcm_val / 16];
       
   226   else
       
   227     return (0x7F & alaw_encode[pcm_val / -16]);
       
   228 }
       
   229 
       
   230 #else /* GST_ALAW_ENC_USE_TABLE */
       
   231 
       
   232 /*
       
   233  * s16_to_alaw() - Convert a 16-bit linear PCM value to 8-bit A-law
       
   234  *
       
   235  * s16_to_alaw() accepts an 16-bit integer and encodes it as A-law data.
       
   236  *
       
   237  *              Linear Input Code       Compressed Code
       
   238  *      ------------------------        ---------------
       
   239  *      0000000wxyza                    000wxyz
       
   240  *      0000001wxyza                    001wxyz
       
   241  *      000001wxyzab                    010wxyz
       
   242  *      00001wxyzabc                    011wxyz
       
   243  *      0001wxyzabcd                    100wxyz
       
   244  *      001wxyzabcde                    101wxyz
       
   245  *      01wxyzabcdef                    110wxyz
       
   246  *      1wxyzabcdefg                    111wxyz
       
   247  *
       
   248  * For further information see John C. Bellamy's Digital Telephony, 1982,
       
   249  * John Wiley & Sons, pps 98-111 and 472-476.
       
   250  */
       
   251 
       
   252 static inline gint
       
   253 val_seg (gint val)
       
   254 {
       
   255   gint r = 1;
       
   256 
       
   257   val >>= 8;
       
   258   if (val & 0xf0) {
       
   259     val >>= 4;
       
   260     r += 4;
       
   261   }
       
   262   if (val & 0x0c) {
       
   263     val >>= 2;
       
   264     r += 2;
       
   265   }
       
   266   if (val & 0x02)
       
   267     r += 1;
       
   268   return r;
       
   269 }
       
   270 
       
   271 static inline guint8
       
   272 s16_to_alaw (gint pcm_val)
       
   273 {
       
   274   gint seg;
       
   275   guint8 mask;
       
   276   guint8 aval;
       
   277 
       
   278   if (pcm_val >= 0) {
       
   279     mask = 0xD5;
       
   280   } else {
       
   281     mask = 0x55;
       
   282     pcm_val = -pcm_val;
       
   283     if (pcm_val > 0x7fff)
       
   284       pcm_val = 0x7fff;
       
   285   }
       
   286 
       
   287   if (pcm_val < 256)
       
   288     aval = pcm_val >> 4;
       
   289   else {
       
   290     /* Convert the scaled magnitude to segment number. */
       
   291     seg = val_seg (pcm_val);
       
   292     aval = (seg << 4) | ((pcm_val >> (seg + 3)) & 0x0f);
       
   293   }
       
   294   return aval ^ mask;
       
   295 }
       
   296 
       
   297 #endif /* GST_ALAW_ENC_USE_TABLE */
       
   298 
       
   299 static GstCaps *
       
   300 gst_alaw_enc_getcaps (GstPad * pad)
       
   301 {
       
   302   GstALawEnc *alawenc;
       
   303   GstPad *otherpad;
       
   304   GstCaps *othercaps, *result;
       
   305   const GstCaps *templ;
       
   306   gchar *name;
       
   307   gint i;
       
   308 
       
   309   alawenc = GST_ALAW_ENC (GST_PAD_PARENT (pad));
       
   310 
       
   311   /* figure out the name of the caps we are going to return */
       
   312   if (pad == alawenc->srcpad) {
       
   313     name = "audio/x-alaw";
       
   314     otherpad = alawenc->sinkpad;
       
   315   } else {
       
   316     name = "audio/x-raw-int";
       
   317     otherpad = alawenc->srcpad;
       
   318   }
       
   319   /* get caps from the peer, this can return NULL when there is no peer */
       
   320   othercaps = gst_pad_peer_get_caps (otherpad);
       
   321 
       
   322   /* get the template caps to make sure we return something acceptable */
       
   323   templ = gst_pad_get_pad_template_caps (pad);
       
   324 
       
   325   if (othercaps) {
       
   326     /* there was a peer */
       
   327     othercaps = gst_caps_make_writable (othercaps);
       
   328 
       
   329     /* go through the caps and remove the fields we don't want */
       
   330     for (i = 0; i < gst_caps_get_size (othercaps); i++) {
       
   331       GstStructure *structure;
       
   332 
       
   333       structure = gst_caps_get_structure (othercaps, i);
       
   334 
       
   335       /* adjust the name */
       
   336       gst_structure_set_name (structure, name);
       
   337 
       
   338       if (pad == alawenc->srcpad) {
       
   339         /* remove the fields we don't want */
       
   340         gst_structure_remove_fields (structure, "width", "depth", "endianness",
       
   341             "signed", NULL);
       
   342       } else {
       
   343         /* add fixed fields */
       
   344         gst_structure_set (structure, "width", G_TYPE_INT, 16,
       
   345             "depth", G_TYPE_INT, 16,
       
   346             "endianness", G_TYPE_INT, G_BYTE_ORDER,
       
   347             "signed", G_TYPE_BOOLEAN, TRUE, NULL);
       
   348       }
       
   349     }
       
   350     /* filter against the allowed caps of the pad to return our result */
       
   351     result = gst_caps_intersect (othercaps, templ);
       
   352     gst_caps_unref (othercaps);
       
   353   } else {
       
   354     /* there was no peer, return the template caps */
       
   355     result = gst_caps_copy (templ);
       
   356   }
       
   357 
       
   358   return result;
       
   359 }
       
   360 
       
   361 static gboolean
       
   362 gst_alaw_enc_setcaps (GstPad * pad, GstCaps * caps)
       
   363 {
       
   364   GstALawEnc *alawenc;
       
   365   GstPad *otherpad;
       
   366   GstStructure *structure;
       
   367   gboolean ret;
       
   368   GstCaps *base_caps;
       
   369 
       
   370   alawenc = GST_ALAW_ENC (GST_PAD_PARENT (pad));
       
   371 
       
   372   structure = gst_caps_get_structure (caps, 0);
       
   373   gst_structure_get_int (structure, "channels", &alawenc->channels);
       
   374   gst_structure_get_int (structure, "rate", &alawenc->rate);
       
   375 
       
   376   if (pad == alawenc->sinkpad) {
       
   377     otherpad = alawenc->srcpad;
       
   378   } else {
       
   379     otherpad = alawenc->sinkpad;
       
   380   }
       
   381 
       
   382   base_caps = gst_caps_copy (gst_pad_get_pad_template_caps (otherpad));
       
   383   structure = gst_caps_get_structure (base_caps, 0);
       
   384   gst_structure_set (structure, "rate", G_TYPE_INT, alawenc->rate, NULL);
       
   385   gst_structure_set (structure, "channels", G_TYPE_INT, alawenc->channels,
       
   386       NULL);
       
   387 
       
   388   GST_DEBUG_OBJECT (alawenc, "rate=%d, channels=%d", alawenc->rate,
       
   389       alawenc->channels);
       
   390 
       
   391   ret = gst_pad_set_caps (otherpad, base_caps);
       
   392 
       
   393   gst_caps_unref (base_caps);
       
   394 
       
   395   return ret;
       
   396 }
       
   397 
       
   398 static void
       
   399 gst_alaw_enc_base_init (gpointer klass)
       
   400 {
       
   401   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
       
   402 
       
   403   gst_element_class_add_pad_template (element_class,
       
   404       gst_static_pad_template_get (&alaw_enc_src_factory));
       
   405   gst_element_class_add_pad_template (element_class,
       
   406       gst_static_pad_template_get (&alaw_enc_sink_factory));
       
   407 
       
   408   gst_element_class_set_details_simple (element_class,
       
   409       "A Law audio encoder", "Codec/Encoder/Audio",
       
   410       "Convert 16bit PCM to 8bit A law",
       
   411       "Zaheer Abbas Merali <zaheerabbas at merali dot org>");
       
   412 
       
   413   GST_DEBUG_CATEGORY_INIT (alaw_enc_debug, "alawenc", 0, "A Law audio encoder");
       
   414 }
       
   415 
       
   416 static void
       
   417 gst_alaw_enc_class_init (GstALawEncClass * klass)
       
   418 {
       
   419   /* nothing to do here for now */
       
   420 }
       
   421 
       
   422 static void
       
   423 gst_alaw_enc_init (GstALawEnc * alawenc, GstALawEncClass * klass)
       
   424 {
       
   425   alawenc->sinkpad =
       
   426       gst_pad_new_from_static_template (&alaw_enc_sink_factory, "sink");
       
   427   gst_pad_set_setcaps_function (alawenc->sinkpad,
       
   428       GST_DEBUG_FUNCPTR (gst_alaw_enc_setcaps));
       
   429   gst_pad_set_getcaps_function (alawenc->sinkpad,
       
   430       GST_DEBUG_FUNCPTR (gst_alaw_enc_getcaps));
       
   431   gst_pad_set_chain_function (alawenc->sinkpad,
       
   432       GST_DEBUG_FUNCPTR (gst_alaw_enc_chain));
       
   433   gst_element_add_pad (GST_ELEMENT (alawenc), alawenc->sinkpad);
       
   434 
       
   435   alawenc->srcpad =
       
   436       gst_pad_new_from_static_template (&alaw_enc_src_factory, "src");
       
   437   gst_pad_set_setcaps_function (alawenc->srcpad,
       
   438       GST_DEBUG_FUNCPTR (gst_alaw_enc_setcaps));
       
   439   gst_pad_set_getcaps_function (alawenc->srcpad,
       
   440       GST_DEBUG_FUNCPTR (gst_alaw_enc_getcaps));
       
   441   gst_pad_use_fixed_caps (alawenc->srcpad);
       
   442   gst_element_add_pad (GST_ELEMENT (alawenc), alawenc->srcpad);
       
   443 
       
   444   /* init rest */
       
   445   alawenc->channels = 0;
       
   446   alawenc->rate = 0;
       
   447 }
       
   448 
       
   449 static GstFlowReturn
       
   450 gst_alaw_enc_chain (GstPad * pad, GstBuffer * buffer)
       
   451 {
       
   452   GstALawEnc *alawenc;
       
   453   gint16 *linear_data;
       
   454   guint linear_size;
       
   455   guint8 *alaw_data;
       
   456   guint alaw_size;
       
   457   GstBuffer *outbuf;
       
   458   gint i;
       
   459   GstFlowReturn ret;
       
   460   GstClockTime timestamp, duration;
       
   461 
       
   462   alawenc = GST_ALAW_ENC (GST_PAD_PARENT (pad));
       
   463 
       
   464   if (G_UNLIKELY (alawenc->rate == 0 || alawenc->channels == 0))
       
   465     goto not_negotiated;
       
   466 
       
   467   linear_data = (gint16 *) GST_BUFFER_DATA (buffer);
       
   468   linear_size = GST_BUFFER_SIZE (buffer);
       
   469 
       
   470   alaw_size = linear_size / 2;
       
   471 
       
   472   timestamp = GST_BUFFER_TIMESTAMP (buffer);
       
   473   duration = GST_BUFFER_DURATION (buffer);
       
   474 
       
   475   GST_LOG_OBJECT (alawenc, "buffer with ts=%" GST_TIME_FORMAT,
       
   476       GST_TIME_ARGS (timestamp));
       
   477 
       
   478   ret =
       
   479       gst_pad_alloc_buffer_and_set_caps (alawenc->srcpad,
       
   480       GST_BUFFER_OFFSET_NONE, alaw_size, GST_PAD_CAPS (alawenc->srcpad),
       
   481       &outbuf);
       
   482   if (ret != GST_FLOW_OK)
       
   483     goto done;
       
   484 
       
   485   if (duration == GST_CLOCK_TIME_NONE) {
       
   486     duration = gst_util_uint64_scale_int (alaw_size,
       
   487         GST_SECOND, alawenc->rate * alawenc->channels);
       
   488   }
       
   489 
       
   490   if (GST_BUFFER_SIZE (outbuf) < alaw_size) {
       
   491     /* pad-alloc can return a smaller buffer */
       
   492     gst_buffer_unref (outbuf);
       
   493     outbuf = gst_buffer_new_and_alloc (alaw_size);
       
   494   }
       
   495 
       
   496   alaw_data = (guint8 *) GST_BUFFER_DATA (outbuf);
       
   497 
       
   498   /* copy discont flag */
       
   499   if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT))
       
   500     GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT);
       
   501 
       
   502   GST_BUFFER_TIMESTAMP (outbuf) = timestamp;
       
   503   GST_BUFFER_DURATION (outbuf) = duration;
       
   504 
       
   505   gst_buffer_set_caps (outbuf, GST_PAD_CAPS (alawenc->srcpad));
       
   506 
       
   507   for (i = 0; i < alaw_size; i++) {
       
   508     alaw_data[i] = s16_to_alaw (linear_data[i]);
       
   509   }
       
   510 
       
   511   ret = gst_pad_push (alawenc->srcpad, outbuf);
       
   512 
       
   513 done:
       
   514 
       
   515   gst_buffer_unref (buffer);
       
   516 
       
   517   return ret;
       
   518 
       
   519 not_negotiated:
       
   520   {
       
   521     ret = GST_FLOW_NOT_NEGOTIATED;
       
   522     goto done;
       
   523   }
       
   524 }