rpms/gstreamer-plugins-good/F-12 0001-Move-farsight-plugins-from-bad-to-good.patch, 1.3, 1.4

Bastien Nocera hadess at fedoraproject.org
Fri Jan 8 15:41:19 UTC 2010


Author: hadess

Update of /cvs/pkgs/rpms/gstreamer-plugins-good/F-12
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv28737

Modified Files:
	0001-Move-farsight-plugins-from-bad-to-good.patch 
Log Message:
add missing files

0001-Move-farsight-plugins-from-bad-to-good.patch:
 Makefile.am                           |    1 
 configure.ac                          |    6 
 farsight/Makefile.am                  |    1 
 farsight/autoconvert/Makefile.am      |    9 
 farsight/autoconvert/gstautoconvert.c | 1566 ++++++++++++++++++++++++++++++++++
 farsight/autoconvert/gstautoconvert.h |   69 +
 farsight/dtmf/Makefile.am             |   23 
 farsight/dtmf/gstdtmf.c               |   33 
 farsight/dtmf/gstdtmfdetect.c         |  308 ++++++
 farsight/dtmf/gstdtmfdetect.h         |   73 +
 farsight/dtmf/gstdtmfsrc.c            |  905 +++++++++++++++++++
 farsight/dtmf/gstdtmfsrc.h            |   98 ++
 farsight/dtmf/gstrtpdtmfcommon.h      |   23 
 farsight/dtmf/gstrtpdtmfdepay.c       |  555 ++++++++++++
 farsight/dtmf/gstrtpdtmfdepay.h       |   66 +
 farsight/dtmf/gstrtpdtmfsrc.c         | 1099 +++++++++++++++++++++++
 farsight/dtmf/gstrtpdtmfsrc.h         |  112 ++
 farsight/dtmf/tone_detect.c           |  499 ++++++++++
 farsight/dtmf/tone_detect.h           |   93 ++
 farsight/liveadder/Makefile.am        |   11 
 farsight/liveadder/liveadder.c        | 1548 +++++++++++++++++++++++++++++++++
 farsight/liveadder/liveadder.h        |  108 ++
 farsight/rtpmux/Makefile.am           |   13 
 farsight/rtpmux/gstrtpdtmfmux.c       |  327 +++++++
 farsight/rtpmux/gstrtpdtmfmux.h       |   68 +
 farsight/rtpmux/gstrtpmux.c           |  662 ++++++++++++++
 farsight/rtpmux/gstrtpmux.h           |   78 +
 farsight/rtpmux/gstrtpmuxer.c         |   48 +
 farsight/valve/Makefile.am            |    9 
 farsight/valve/gstvalve.c             |  311 ++++++
 farsight/valve/gstvalve.h             |   83 +
 31 files changed, 8804 insertions(+), 1 deletion(-)

Index: 0001-Move-farsight-plugins-from-bad-to-good.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gstreamer-plugins-good/F-12/0001-Move-farsight-plugins-from-bad-to-good.patch,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -p -r1.3 -r1.4
--- 0001-Move-farsight-plugins-from-bad-to-good.patch	8 Jan 2010 15:26:20 -0000	1.3
+++ 0001-Move-farsight-plugins-from-bad-to-good.patch	8 Jan 2010 15:41:19 -0000	1.4
@@ -1,4 +1,4 @@
-From 2957a90c63922e4856242ecfa0c766edeac12945 Mon Sep 17 00:00:00 2001
+From 8e4bf45af244adf60260a467d75ca4d2bfac0ff0 Mon Sep 17 00:00:00 2001
 From: Bastien Nocera <hadess at hadess.net>
 Date: Mon, 22 Jun 2009 16:09:04 +0100
 Subject: [PATCH] Move farsight plugins from -bad to -good
@@ -13,6 +13,8 @@ Subject: [PATCH] Move farsight plugins f
  farsight/autoconvert/gstautoconvert.h |   69 ++
  farsight/dtmf/Makefile.am             |   23 +
  farsight/dtmf/gstdtmf.c               |   33 +
+ farsight/dtmf/gstdtmfdetect.c         |  308 +++++++
+ farsight/dtmf/gstdtmfdetect.h         |   73 ++
  farsight/dtmf/gstdtmfsrc.c            |  905 +++++++++++++++++++
  farsight/dtmf/gstdtmfsrc.h            |   98 ++
  farsight/dtmf/gstrtpdtmfcommon.h      |   23 +
@@ -20,6 +22,8 @@ Subject: [PATCH] Move farsight plugins f
  farsight/dtmf/gstrtpdtmfdepay.h       |   66 ++
  farsight/dtmf/gstrtpdtmfsrc.c         | 1099 +++++++++++++++++++++++
  farsight/dtmf/gstrtpdtmfsrc.h         |  112 +++
+ farsight/dtmf/tone_detect.c           |  499 +++++++++++
+ farsight/dtmf/tone_detect.h           |   93 ++
  farsight/liveadder/Makefile.am        |   11 +
  farsight/liveadder/liveadder.c        | 1548 ++++++++++++++++++++++++++++++++
  farsight/liveadder/liveadder.h        |  108 +++
@@ -32,13 +36,15 @@ Subject: [PATCH] Move farsight plugins f
  farsight/valve/Makefile.am            |    9 +
  farsight/valve/gstvalve.c             |  311 +++++++
  farsight/valve/gstvalve.h             |   82 ++
- 28 files changed, 7832 insertions(+), 1 deletions(-)
+ 32 files changed, 8805 insertions(+), 1 deletions(-)
  create mode 100644 farsight/Makefile.am
  create mode 100644 farsight/autoconvert/Makefile.am
  create mode 100644 farsight/autoconvert/gstautoconvert.c
  create mode 100644 farsight/autoconvert/gstautoconvert.h
  create mode 100644 farsight/dtmf/Makefile.am
  create mode 100644 farsight/dtmf/gstdtmf.c
+ create mode 100644 farsight/dtmf/gstdtmfdetect.c
+ create mode 100644 farsight/dtmf/gstdtmfdetect.h
  create mode 100644 farsight/dtmf/gstdtmfsrc.c
  create mode 100644 farsight/dtmf/gstdtmfsrc.h
  create mode 100644 farsight/dtmf/gstrtpdtmfcommon.h
@@ -46,6 +52,8 @@ Subject: [PATCH] Move farsight plugins f
  create mode 100644 farsight/dtmf/gstrtpdtmfdepay.h
  create mode 100644 farsight/dtmf/gstrtpdtmfsrc.c
  create mode 100644 farsight/dtmf/gstrtpdtmfsrc.h
+ create mode 100644 farsight/dtmf/tone_detect.c
+ create mode 100644 farsight/dtmf/tone_detect.h
  create mode 100644 farsight/liveadder/Makefile.am
  create mode 100644 farsight/liveadder/liveadder.c
  create mode 100644 farsight/liveadder/liveadder.h
@@ -1825,6 +1833,399 @@ index 0000000..9d5854f
 +    GST_VERSION_MINOR,
 +    "dtmf", "DTMF plugins",
 +    plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
+diff --git a/farsight/dtmf/gstdtmfdetect.c b/farsight/dtmf/gstdtmfdetect.c
+new file mode 100644
+index 0000000..5cb7c2c
+--- /dev/null
++++ b/farsight/dtmf/gstdtmfdetect.c
+@@ -0,0 +1,308 @@
++/*
++ * GStreamer - DTMF Detection
++ *
++ *  Copyright 2009 Nokia Corporation
++ *  Copyright 2009 Collabora Ltd,
++ *   @author: Olivier Crete <olivier.crete at collabora.co.uk>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ *
++ */
++
++/**
++ * SECTION:element-dtmfdetect
++ * @short_description: Detects DTMF tones
++ *
++ * This element will detect DTMF tones and emit messages
++ *
++ * The message is called "dtmf-event" and has the following fields
++ * <informaltable>
++ * <tgroup cols='4'>
++ * <colspec colname='Name' />
++ * <colspec colname='Type' />
++ * <colspec colname='Possible values' />
++ * <colspec colname='Purpose' />
++ * <thead>
++ * <row>
++ * <entry>Name</entry>
++ * <entry>GType</entry>
++ * <entry>Possible values</entry>
++ * <entry>Purpose</entry>
++ * </row>
++ * </thead>
++ * <tbody>
++ * <row>
++ * <entry>type</entry>
++ * <entry>G_TYPE_INT</entry>
++ * <entry>0-1</entry>
++ * <entry>The application uses this field to specify which of the two methods
++ * specified in RFC 2833 to use. The value should be 0 for tones and 1 for
++ * named events. Tones are specified by their frequencies and events are specied
++ * by their number. This element can only take events as input. Do not confuse
++ * with "method" which specified the output.
++ * </entry>
++ * </row>
++  * <row>
++ * <entry>number</entry>
++ * <entry>G_TYPE_INT</entry>
++ * <entry>0-16</entry>
++ * <entry>The event number.</entry>
++ * </row>
++ * <row>
++ * <entry>method</entry>
++ * <entry>G_TYPE_INT</entry>
++ * <entry>2</entry>
++ * <entry>This field will always been 2 (ie sound) from this element.
++ * </entry>
++ * </row>
++ * </tbody>
++ * </tgroup>
++ * </informaltable>
++ */
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++
++#include "gstdtmfdetect.h"
++
++#include <string.h>
++
++GST_DEBUG_CATEGORY (dtmf_detect_debug);
++#define GST_CAT_DEFAULT (dtmf_detect_debug)
++
++/* elementfactory information */
++static const GstElementDetails gst_dtmf_detect_details =
++GST_ELEMENT_DETAILS ("DTMF detector element",
++    "Detect",
++    "This element detects DTMF tones",
++    "Olivier Crete <olivier.crete at collabora.co.uk>");
++
++
++static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
++    GST_PAD_SINK,
++    GST_PAD_ALWAYS,
++    GST_STATIC_CAPS ("audio/x-raw-int, "
++        "width = (int) 16, "
++        "depth = (int) 16, "
++        "endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", "
++        "signed = (bool) true, rate = (int) [1, MAX], channels = (int) 1"));
++
++static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
++    GST_PAD_SRC,
++    GST_PAD_ALWAYS,
++    GST_STATIC_CAPS ("audio/x-raw-int, "
++        "width = (int) 16, "
++        "depth = (int) 16, "
++        "endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", "
++        "signed = (bool) true, rate = (int) [1, MAX], channels = (int) 1"));
++
++/* signals and args */
++enum
++{
++  /* FILL ME */
++  LAST_SIGNAL
++};
++
++enum
++{
++  PROP_0,
++};
++
++static gboolean gst_dtmf_detect_set_caps (GstBaseTransform * trans,
++    GstCaps * incaps, GstCaps * outcaps);
++static GstFlowReturn gst_dtmf_detect_transform_ip (GstBaseTransform * trans,
++    GstBuffer * buf);
++static gboolean gst_dtmf_detect_event (GstBaseTransform * trans,
++    GstEvent * event);
++
++static void
++_do_init (GType type)
++{
++  GST_DEBUG_CATEGORY_INIT (dtmf_detect_debug, "dtmfdetect", 0, "dtmfdetect");
++}
++
++GST_BOILERPLATE_FULL (GstDtmfDetect, gst_dtmf_detect, GstBaseTransform,
++    GST_TYPE_BASE_TRANSFORM, _do_init);
++
++static void
++gst_dtmf_detect_base_init (gpointer klass)
++{
++  GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
++
++  gst_element_class_add_pad_template (element_class,
++      gst_static_pad_template_get (&srctemplate));
++  gst_element_class_add_pad_template (element_class,
++      gst_static_pad_template_get (&sinktemplate));
++
++  gst_element_class_set_details (element_class, &gst_dtmf_detect_details);
++}
++
++static void
++gst_dtmf_detect_class_init (GstDtmfDetectClass * klass)
++{
++  GstBaseTransformClass *gstbasetransform_class;
++
++  gstbasetransform_class = (GstBaseTransformClass *) klass;
++
++  gstbasetransform_class->set_caps =
++      GST_DEBUG_FUNCPTR (gst_dtmf_detect_set_caps);
++  gstbasetransform_class->transform_ip =
++      GST_DEBUG_FUNCPTR (gst_dtmf_detect_transform_ip);
++  gstbasetransform_class->event = GST_DEBUG_FUNCPTR (gst_dtmf_detect_event);
++}
++
++static void
++gst_dtmf_detect_init (GstDtmfDetect * dtmfdetect, GstDtmfDetectClass * klass)
++{
++  gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (dtmfdetect), TRUE);
++  gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (dtmfdetect), TRUE);
++}
++
++static gboolean
++gst_dtmf_detect_set_caps (GstBaseTransform * trans, GstCaps * incaps,
++    GstCaps * outcaps)
++{
++  GstDtmfDetect *self = GST_DTMF_DETECT (trans);
++  GstStructure *s = gst_caps_get_structure (incaps, 0);
++
++  if (!gst_structure_get_int (s, "rate", &self->rate))
++    return FALSE;
++
++  zap_dtmf_detect_init (&self->dtmf_state);
++
++  return TRUE;
++}
++
++
++static GstFlowReturn
++gst_dtmf_detect_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
++{
++  GstDtmfDetect *self = GST_DTMF_DETECT (trans);
++  int dtmf_count;
++  char dtmfbuf[MAX_DTMF_DIGITS] = "";
++  int i;
++
++  if (GST_BUFFER_IS_DISCONT (buf))
++    zap_dtmf_detect_init (&self->dtmf_state);
++
++
++  zap_dtmf_detect (&self->dtmf_state, (int16_t *) GST_BUFFER_DATA (buf),
++      GST_BUFFER_SIZE (buf) / 2, FALSE);
++
++  dtmf_count = zap_dtmf_get (&self->dtmf_state, dtmfbuf, MAX_DTMF_DIGITS);
++
++  if (dtmf_count)
++    GST_DEBUG_OBJECT (self, "Got %d DTMF events: %s", dtmf_count, dtmfbuf);
++  else
++    GST_LOG_OBJECT (self, "Got no DTMF events");
++
++  for (i = 0; i < dtmf_count; i++) {
++    GstMessage *dtmf_message = NULL;
++    GstStructure *structure;
++    gint dtmf_payload_event;
++
++    GST_DEBUG_OBJECT (self, "Got DTMF event %c", dtmfbuf[i]);
++
++    switch (dtmfbuf[i]) {
++      case '0':
++        dtmf_payload_event = 0;
++        break;
++      case '1':
++        dtmf_payload_event = 1;
++        break;
++      case '2':
++        dtmf_payload_event = 2;
++        break;
++      case '3':
++        dtmf_payload_event = 3;
++        break;
++      case '4':
++        dtmf_payload_event = 4;
++        break;
++      case '5':
++        dtmf_payload_event = 5;
++        break;
++      case '6':
++        dtmf_payload_event = 6;
++        break;
++      case '7':
++        dtmf_payload_event = 7;
++        break;
++      case '8':
++        dtmf_payload_event = 8;
++        break;
++      case '9':
++        dtmf_payload_event = 9;
++        break;
++      case '*':
++        dtmf_payload_event = 10;
++        break;
++      case '#':
++        dtmf_payload_event = 11;
++        break;
++      case 'A':
++        dtmf_payload_event = 12;
++        break;
++      case 'B':
++        dtmf_payload_event = 13;
++        break;
++      case 'C':
++        dtmf_payload_event = 14;
++        break;
++      case 'D':
++        dtmf_payload_event = 15;
++        break;
++      default:
++        continue;
++    }
++
++    structure = gst_structure_new ("dtmf-event",
++        "type", G_TYPE_INT, 1,
++        "number", G_TYPE_INT, dtmf_payload_event,
++        "method", G_TYPE_INT, 2, NULL);
++    dtmf_message = gst_message_new_element (GST_OBJECT (self), structure);
++    gst_element_post_message (GST_ELEMENT (self), dtmf_message);
++  }
++
++  return GST_FLOW_OK;
++}
++
++
++static gboolean
++gst_dtmf_detect_event (GstBaseTransform * trans, GstEvent * event)
++{
++  GstDtmfDetect *self = GST_DTMF_DETECT (trans);
++
++  switch (GST_EVENT_TYPE (event)) {
++    case GST_EVENT_FLUSH_STOP:
++      zap_dtmf_detect_init (&self->dtmf_state);
++      break;
++    default:
++      break;
++  }
++
++  return GST_CALL_PARENT_WITH_DEFAULT (GST_BASE_TRANSFORM_CLASS, event,
++      (trans, event), TRUE);
++}
++
++
++gboolean
++gst_dtmf_detect_plugin_init (GstPlugin * plugin)
++{
++  return gst_element_register (plugin, "dtmfdetect",
++      GST_RANK_MARGINAL, GST_TYPE_DTMF_DETECT);
++}
+diff --git a/farsight/dtmf/gstdtmfdetect.h b/farsight/dtmf/gstdtmfdetect.h
+new file mode 100644
+index 0000000..b3bfab9
+--- /dev/null
++++ b/farsight/dtmf/gstdtmfdetect.h
+@@ -0,0 +1,73 @@
++/*
++ * GStreamer - DTMF Detection
++ *
++ *  Copyright 2009 Nokia Corporation
++ *  Copyright 2009 Collabora Ltd,
++ *   @author: Olivier Crete <olivier.crete at collabora.co.uk>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ *
++ */
++
++#ifndef __GST_DTMF_DETECT_H__
++#define __GST_DTMF_DETECT_H__
++
++#include <gst/gst.h>
++#include <gst/base/gstbasetransform.h>
++
++#include "tone_detect.h"
++
++G_BEGIN_DECLS
++
++/* #define's don't like whitespacey bits */
++#define GST_TYPE_DTMF_DETECT \
++  (gst_dtmf_detect_get_type())
++#define GST_DTMF_DETECT(obj) \
++  (G_TYPE_CHECK_INSTANCE_CAST((obj), \
++  GST_TYPE_DTMF_DETECT,GstDtmfDetect))
++#define GST_DTMF_DETECT_CLASS(klass) \
++  (G_TYPE_CHECK_CLASS_CAST((klass), \
++  GST_TYPE_DTMF_DETECT,GstDtmfDetectClass))
++#define GST_IS_DTMF_DETECT(obj) \
++  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DTMF_DETECT))
++#define GST_IS_DTMF_DETECT_CLASS(obj) \
++  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DTMF_DETECT))
++
++typedef struct _GstDtmfDetect GstDtmfDetect;
++typedef struct _GstDtmfDetectClass GstDtmfDetectClass;
++typedef struct _GstDtmfDetectPrivate GstDtmfDetectPrivate;
++
++struct _GstDtmfDetect
++{
++  GstBaseTransform parent;
++
++  gint rate;
++
++  dtmf_detect_state_t dtmf_state;
++};
++
++struct _GstDtmfDetectClass
++{
++  GstBaseTransformClass parent_class;
++};
++
++GType gst_dtmf_detect_get_type (void);
++
++gboolean gst_dtmf_detect_plugin_init (GstPlugin *plugin);
++
++G_END_DECLS
++
++#endif /* __GST_DTMF_DETECT_H__ */
 diff --git a/farsight/dtmf/gstdtmfsrc.c b/farsight/dtmf/gstdtmfsrc.c
 new file mode 100644
 index 0000000..39699d8
@@ -4725,6 +5126,610 @@ index 0000000..b1a483a
 +
 +G_END_DECLS
 +#endif /* __GST_RTP_DTMF_SRC_H__ */
+diff --git a/farsight/dtmf/tone_detect.c b/farsight/dtmf/tone_detect.c
+new file mode 100644
+index 0000000..d8f1df1
+--- /dev/null
++++ b/farsight/dtmf/tone_detect.c
+@@ -0,0 +1,499 @@
++/* 
++ *   DTMF Receiver module, part of:
++ *      BSD Telephony Of Mexico "Zapata" Telecom Library, version 1.10  12/9/01
++ *
++ *   Part of the "Zapata" Computer Telephony Technology.
++ *
++ *   See http://www.bsdtelephony.com.mx
++ *
++ *
++ *  The technologies, software, hardware, designs, drawings, scheumatics, board
++ *  layouts and/or artwork, concepts, methodologies (including the use of all
++ *  of these, and that which is derived from the use of all of these), all other
++ *  intellectual properties contained herein, and all intellectual property
++ *  rights have been and shall continue to be expressly for the benefit of all
++ *  mankind, and are perpetually placed in the public domain, and may be used,
++ *  copied, and/or modified by anyone, in any manner, for any legal purpose,
++ *  without restriction.
++ *
++ *   This module written by Stephen Underwood.
++ */
++
++/*
++	tone_detect.c - General telephony tone detection, and specific
++                        detection of DTMF.
++
++        Copyright (C) 2001  Steve Underwood <steveu at coppice.org>
++
++        Despite my general liking of the GPL, I place this code in the
++        public domain for the benefit of all mankind - even the slimy
++        ones who might try to proprietize my work and use it to my
++        detriment.
++*/
++
++#include <math.h>
++#include <string.h>
++#include <stdio.h>
++#include <time.h>
++#include <fcntl.h>
++#include "tone_detect.h"
++
++#define FALSE   0
++#define TRUE    (!FALSE)
++
++//#define USE_3DNOW
++
++/* Basic DTMF specs:
++ *
++ * Minimum tone on = 40ms
++ * Minimum tone off = 50ms
++ * Maximum digit rate = 10 per second
++ * Normal twist <= 8dB accepted
++ * Reverse twist <= 4dB accepted
++ * S/N >= 15dB will detect OK
++ * Attenuation <= 26dB will detect OK
++ * Frequency tolerance +- 1.5% will detect, +-3.5% will reject
++ */
++
++#define SAMPLE_RATE                 8000.0
++
++#define DTMF_THRESHOLD              8.0e7
++#define FAX_THRESHOLD              8.0e7
++#define FAX_2ND_HARMONIC       		2.0     /* 4dB */
++#define DTMF_NORMAL_TWIST           6.3 /* 8dB */
++#define DTMF_REVERSE_TWIST          ((isradio) ? 4.0 : 2.5)     /* 4dB normal */
++#define DTMF_RELATIVE_PEAK_ROW      6.3 /* 8dB */
++#define DTMF_RELATIVE_PEAK_COL      6.3 /* 8dB */
++#define DTMF_2ND_HARMONIC_ROW       ((isradio) ? 1.7 : 2.5)     /* 4dB normal */
++#define DTMF_2ND_HARMONIC_COL       63.1        /* 18dB */
++
++static tone_detection_descriptor_t dtmf_detect_row[4];
++static tone_detection_descriptor_t dtmf_detect_col[4];
++static tone_detection_descriptor_t dtmf_detect_row_2nd[4];
++static tone_detection_descriptor_t dtmf_detect_col_2nd[4];
++static tone_detection_descriptor_t fax_detect;
++static tone_detection_descriptor_t fax_detect_2nd;
++
++static float dtmf_row[] = {
++  697.0, 770.0, 852.0, 941.0
++};
++
++static float dtmf_col[] = {
++  1209.0, 1336.0, 1477.0, 1633.0
++};
++
++static float fax_freq = 1100.0;
++
++static char dtmf_positions[] = "123A" "456B" "789C" "*0#D";
++
++static void
++goertzel_init (goertzel_state_t * s, tone_detection_descriptor_t * t)
++{
++  s->v2 = s->v3 = 0.0;
++  s->fac = t->fac;
++}
++
++/*- End of function --------------------------------------------------------*/
++
++#if defined(USE_3DNOW)
++static inline void
++_dtmf_goertzel_update (goertzel_state_t * s, float x[], int samples)
++{
++  int n;
++  float v;
++  int i;
++  float vv[16];
++
++  vv[4] = s[0].v2;
++  vv[5] = s[1].v2;
++  vv[6] = s[2].v2;
++  vv[7] = s[3].v2;
++  vv[8] = s[0].v3;
++  vv[9] = s[1].v3;
++  vv[10] = s[2].v3;
++  vv[11] = s[3].v3;
++  vv[12] = s[0].fac;
++  vv[13] = s[1].fac;
++  vv[14] = s[2].fac;
++  vv[15] = s[3].fac;
++
++  //v1 = s->v2;
++  //s->v2 = s->v3;
++  //s->v3 = s->fac*s->v2 - v1 + x[0];
++
++  __asm__ __volatile__ (" femms;\n"
++      " movq        16(%%edx),%%mm2;\n"
++      " movq        24(%%edx),%%mm3;\n"
++      " movq        32(%%edx),%%mm4;\n"
++      " movq        40(%%edx),%%mm5;\n"
++      " movq        48(%%edx),%%mm6;\n"
++      " movq        56(%%edx),%%mm7;\n"
++      " jmp         1f;\n"
++      " .align 32;\n"
++      " 1: ;\n"
++      " prefetch    (%%eax);\n"
++      " movq        %%mm3,%%mm1;\n"
++      " movq        %%mm2,%%mm0;\n"
++      " movq        %%mm5,%%mm3;\n"
++      " movq        %%mm4,%%mm2;\n"
++      " pfmul       %%mm7,%%mm5;\n"
++      " pfmul       %%mm6,%%mm4;\n"
++      " pfsub       %%mm1,%%mm5;\n"
++      " pfsub       %%mm0,%%mm4;\n"
++      " movq        (%%eax),%%mm0;\n"
++      " movq        %%mm0,%%mm1;\n"
++      " punpckldq   %%mm0,%%mm1;\n"
++      " add         $4,%%eax;\n"
++      " pfadd       %%mm1,%%mm5;\n"
++      " pfadd       %%mm1,%%mm4;\n"
++      " dec         %%ecx;\n"
++      " jnz         1b;\n"
++      " movq        %%mm2,16(%%edx);\n"
++      " movq        %%mm3,24(%%edx);\n"
++      " movq        %%mm4,32(%%edx);\n"
++      " movq        %%mm5,40(%%edx);\n"
++      " femms;\n"::"c" (samples), "a" (x), "d" (vv)
++      :"memory", "eax", "ecx");
++
++  s[0].v2 = vv[4];
++  s[1].v2 = vv[5];
++  s[2].v2 = vv[6];
++  s[3].v2 = vv[7];
++  s[0].v3 = vv[8];
++  s[1].v3 = vv[9];
++  s[2].v3 = vv[10];
++  s[3].v3 = vv[11];
++}
++#endif
++/*- End of function --------------------------------------------------------*/
++
++void
++zap_goertzel_update (goertzel_state_t * s, int16_t x[], int samples)
++{
++  int i;
++  float v1;
++
++  for (i = 0; i < samples; i++) {
++    v1 = s->v2;
++    s->v2 = s->v3;
++    s->v3 = s->fac * s->v2 - v1 + x[i];
++  }
++}
++
++/*- End of function --------------------------------------------------------*/
++
++float
++zap_goertzel_result (goertzel_state_t * s)
++{
++  return s->v3 * s->v3 + s->v2 * s->v2 - s->v2 * s->v3 * s->fac;
++}
++
++/*- End of function --------------------------------------------------------*/
++
++void
++zap_dtmf_detect_init (dtmf_detect_state_t * s)
++{
++  int i;
++  float theta;
++
++  s->hit1 = s->hit2 = 0;
++
++  for (i = 0; i < 4; i++) {
++    theta = 2.0 * M_PI * (dtmf_row[i] / SAMPLE_RATE);
++    dtmf_detect_row[i].fac = 2.0 * cos (theta);
++
++    theta = 2.0 * M_PI * (dtmf_col[i] / SAMPLE_RATE);
++    dtmf_detect_col[i].fac = 2.0 * cos (theta);
++
++    theta = 2.0 * M_PI * (dtmf_row[i] * 2.0 / SAMPLE_RATE);
++    dtmf_detect_row_2nd[i].fac = 2.0 * cos (theta);
++
++    theta = 2.0 * M_PI * (dtmf_col[i] * 2.0 / SAMPLE_RATE);
++    dtmf_detect_col_2nd[i].fac = 2.0 * cos (theta);
++
++    goertzel_init (&s->row_out[i], &dtmf_detect_row[i]);
++    goertzel_init (&s->col_out[i], &dtmf_detect_col[i]);
++    goertzel_init (&s->row_out2nd[i], &dtmf_detect_row_2nd[i]);
++    goertzel_init (&s->col_out2nd[i], &dtmf_detect_col_2nd[i]);
++
++    s->energy = 0.0;
++  }
++
++  /* Same for the fax dector */
++  theta = 2.0 * M_PI * (fax_freq / SAMPLE_RATE);
++  fax_detect.fac = 2.0 * cos (theta);
++  goertzel_init (&s->fax_tone, &fax_detect);
++
++  /* Same for the fax dector 2nd harmonic */
++  theta = 2.0 * M_PI * (fax_freq * 2.0 / SAMPLE_RATE);
++  fax_detect_2nd.fac = 2.0 * cos (theta);
++  goertzel_init (&s->fax_tone2nd, &fax_detect_2nd);
++
++  s->current_sample = 0;
++  s->detected_digits = 0;
++  s->lost_digits = 0;
++  s->digits[0] = '\0';
++  s->mhit = 0;
++}
++
++/*- End of function --------------------------------------------------------*/
++
++int
++zap_dtmf_detect (dtmf_detect_state_t * s,
++    int16_t amp[], int samples, int isradio)
++{
++
++  float row_energy[4];
++  float col_energy[4];
++  float fax_energy;
++  float fax_energy_2nd;
++  float famp;
++  float v1;
++  int i;
++  int j;
++  int sample;
++  int best_row;
++  int best_col;
++  int hit;
++  int limit;
++
++  hit = 0;
++  for (sample = 0; sample < samples; sample = limit) {
++    /* 102 is optimised to meet the DTMF specs. */
++    if ((samples - sample) >= (102 - s->current_sample))
++      limit = sample + (102 - s->current_sample);
++    else
++      limit = samples;
++#if defined(USE_3DNOW)
++    _dtmf_goertzel_update (s->row_out, amp + sample, limit - sample);
++    _dtmf_goertzel_update (s->col_out, amp + sample, limit - sample);
++    _dtmf_goertzel_update (s->row_out2nd, amp + sample, limit2 - sample);
++    _dtmf_goertzel_update (s->col_out2nd, amp + sample, limit2 - sample);
++    /* XXX Need to fax detect for 3dnow too XXX */
++#warning "Fax Support Broken"
++#else
++    /* The following unrolled loop takes only 35% (rough estimate) of the 
++       time of a rolled loop on the machine on which it was developed */
++    for (j = sample; j < limit; j++) {
++      famp = amp[j];
++
++      s->energy += famp * famp;
++
++      /* With GCC 2.95, the following unrolled code seems to take about 35%
++         (rough estimate) as long as a neat little 0-3 loop */
++      v1 = s->row_out[0].v2;
++      s->row_out[0].v2 = s->row_out[0].v3;
++      s->row_out[0].v3 = s->row_out[0].fac * s->row_out[0].v2 - v1 + famp;
++
++      v1 = s->col_out[0].v2;
++      s->col_out[0].v2 = s->col_out[0].v3;
++      s->col_out[0].v3 = s->col_out[0].fac * s->col_out[0].v2 - v1 + famp;
++
++      v1 = s->row_out[1].v2;
++      s->row_out[1].v2 = s->row_out[1].v3;
++      s->row_out[1].v3 = s->row_out[1].fac * s->row_out[1].v2 - v1 + famp;
++
++      v1 = s->col_out[1].v2;
++      s->col_out[1].v2 = s->col_out[1].v3;
++      s->col_out[1].v3 = s->col_out[1].fac * s->col_out[1].v2 - v1 + famp;
++
++      v1 = s->row_out[2].v2;
++      s->row_out[2].v2 = s->row_out[2].v3;
++      s->row_out[2].v3 = s->row_out[2].fac * s->row_out[2].v2 - v1 + famp;
++
++      v1 = s->col_out[2].v2;
++      s->col_out[2].v2 = s->col_out[2].v3;
++      s->col_out[2].v3 = s->col_out[2].fac * s->col_out[2].v2 - v1 + famp;
++
++      v1 = s->row_out[3].v2;
++      s->row_out[3].v2 = s->row_out[3].v3;
++      s->row_out[3].v3 = s->row_out[3].fac * s->row_out[3].v2 - v1 + famp;
++
++      v1 = s->col_out[3].v2;
++      s->col_out[3].v2 = s->col_out[3].v3;
++      s->col_out[3].v3 = s->col_out[3].fac * s->col_out[3].v2 - v1 + famp;
++
++      v1 = s->col_out2nd[0].v2;
++      s->col_out2nd[0].v2 = s->col_out2nd[0].v3;
++      s->col_out2nd[0].v3 =
++          s->col_out2nd[0].fac * s->col_out2nd[0].v2 - v1 + famp;
++
++      v1 = s->row_out2nd[0].v2;
++      s->row_out2nd[0].v2 = s->row_out2nd[0].v3;
++      s->row_out2nd[0].v3 =
++          s->row_out2nd[0].fac * s->row_out2nd[0].v2 - v1 + famp;
++
++      v1 = s->col_out2nd[1].v2;
++      s->col_out2nd[1].v2 = s->col_out2nd[1].v3;
++      s->col_out2nd[1].v3 =
++          s->col_out2nd[1].fac * s->col_out2nd[1].v2 - v1 + famp;
++
++      v1 = s->row_out2nd[1].v2;
++      s->row_out2nd[1].v2 = s->row_out2nd[1].v3;
++      s->row_out2nd[1].v3 =
++          s->row_out2nd[1].fac * s->row_out2nd[1].v2 - v1 + famp;
++
++      v1 = s->col_out2nd[2].v2;
++      s->col_out2nd[2].v2 = s->col_out2nd[2].v3;
++      s->col_out2nd[2].v3 =
++          s->col_out2nd[2].fac * s->col_out2nd[2].v2 - v1 + famp;
++
++      v1 = s->row_out2nd[2].v2;
++      s->row_out2nd[2].v2 = s->row_out2nd[2].v3;
++      s->row_out2nd[2].v3 =
++          s->row_out2nd[2].fac * s->row_out2nd[2].v2 - v1 + famp;
++
++      v1 = s->col_out2nd[3].v2;
++      s->col_out2nd[3].v2 = s->col_out2nd[3].v3;
++      s->col_out2nd[3].v3 =
++          s->col_out2nd[3].fac * s->col_out2nd[3].v2 - v1 + famp;
++
++      v1 = s->row_out2nd[3].v2;
++      s->row_out2nd[3].v2 = s->row_out2nd[3].v3;
++      s->row_out2nd[3].v3 =
++          s->row_out2nd[3].fac * s->row_out2nd[3].v2 - v1 + famp;
++
++      /* Update fax tone */
++      v1 = s->fax_tone.v2;
++      s->fax_tone.v2 = s->fax_tone.v3;
++      s->fax_tone.v3 = s->fax_tone.fac * s->fax_tone.v2 - v1 + famp;
++
++      v1 = s->fax_tone.v2;
++      s->fax_tone2nd.v2 = s->fax_tone2nd.v3;
++      s->fax_tone2nd.v3 = s->fax_tone2nd.fac * s->fax_tone2nd.v2 - v1 + famp;
++    }
++#endif
++    s->current_sample += (limit - sample);
++    if (s->current_sample < 102)
++      continue;
++
++    /* Detect the fax energy, too */
++    fax_energy = zap_goertzel_result (&s->fax_tone);
++
++    /* We are at the end of a DTMF detection block */
++    /* Find the peak row and the peak column */
++    row_energy[0] = zap_goertzel_result (&s->row_out[0]);
++    col_energy[0] = zap_goertzel_result (&s->col_out[0]);
++
++    for (best_row = best_col = 0, i = 1; i < 4; i++) {
++      row_energy[i] = zap_goertzel_result (&s->row_out[i]);
++      if (row_energy[i] > row_energy[best_row])
++        best_row = i;
++      col_energy[i] = zap_goertzel_result (&s->col_out[i]);
++      if (col_energy[i] > col_energy[best_col])
++        best_col = i;
++    }
++    hit = 0;
++    /* Basic signal level test and the twist test */
++    if (row_energy[best_row] >= DTMF_THRESHOLD
++        &&
++        col_energy[best_col] >= DTMF_THRESHOLD
++        &&
++        col_energy[best_col] < row_energy[best_row] * DTMF_REVERSE_TWIST
++        && col_energy[best_col] * DTMF_NORMAL_TWIST > row_energy[best_row]) {
++      /* Relative peak test */
++      for (i = 0; i < 4; i++) {
++        if ((i != best_col
++                && col_energy[i] * DTMF_RELATIVE_PEAK_COL >
++                col_energy[best_col])
++            || (i != best_row
++                && row_energy[i] * DTMF_RELATIVE_PEAK_ROW >
++                row_energy[best_row])) {
++          break;
++        }
++      }
++      /* ... and second harmonic test */
++      if (i >= 4
++          &&
++          (row_energy[best_row] + col_energy[best_col]) > 42.0 * s->energy
++          &&
++          zap_goertzel_result (&s->col_out2nd[best_col]) *
++          DTMF_2ND_HARMONIC_COL < col_energy[best_col]
++          && zap_goertzel_result (&s->row_out2nd[best_row]) *
++          DTMF_2ND_HARMONIC_ROW < row_energy[best_row]) {
++        hit = dtmf_positions[(best_row << 2) + best_col];
++        /* Look for two successive similar results */
++        /* The logic in the next test is:
++           We need two successive identical clean detects, with
++           something different preceeding it. This can work with
++           back to back differing digits. More importantly, it
++           can work with nasty phones that give a very wobbly start
++           to a digit. */
++        if (hit == s->hit3 && s->hit3 != s->hit2) {
++          s->mhit = hit;
++          s->digit_hits[(best_row << 2) + best_col]++;
++          s->detected_digits++;
++          if (s->current_digits < MAX_DTMF_DIGITS) {
++            s->digits[s->current_digits++] = hit;
++            s->digits[s->current_digits] = '\0';
++          } else {
++            s->lost_digits++;
++          }
++        }
++      }
++    }
++    if (!hit && (fax_energy >= FAX_THRESHOLD)
++        && (fax_energy > s->energy * 21.0)) {
++      fax_energy_2nd = zap_goertzel_result (&s->fax_tone2nd);
++      if (fax_energy_2nd * FAX_2ND_HARMONIC < fax_energy) {
++#if 0
++        printf ("Fax energy/Second Harmonic: %f/%f\n", fax_energy,
++            fax_energy_2nd);
++#endif
++        /* XXX Probably need better checking than just this the energy XXX */
++        hit = 'f';
++        s->fax_hits++;
++      }                         /* Don't reset fax hits counter */
++    } else {
++      if (s->fax_hits > 5) {
++        s->mhit = 'f';
++        s->detected_digits++;
++        if (s->current_digits < MAX_DTMF_DIGITS) {
++          s->digits[s->current_digits++] = hit;
++          s->digits[s->current_digits] = '\0';
++        } else {
++          s->lost_digits++;
++        }
++      }
++      s->fax_hits = 0;
++    }
++    s->hit1 = s->hit2;
++    s->hit2 = s->hit3;
++    s->hit3 = hit;
++    /* Reinitialise the detector for the next block */
++    for (i = 0; i < 4; i++) {
++      goertzel_init (&s->row_out[i], &dtmf_detect_row[i]);
++      goertzel_init (&s->col_out[i], &dtmf_detect_col[i]);
++      goertzel_init (&s->row_out2nd[i], &dtmf_detect_row_2nd[i]);
++      goertzel_init (&s->col_out2nd[i], &dtmf_detect_col_2nd[i]);
++    }
++    goertzel_init (&s->fax_tone, &fax_detect);
++    goertzel_init (&s->fax_tone2nd, &fax_detect_2nd);
++    s->energy = 0.0;
++    s->current_sample = 0;
++  }
++  if ((!s->mhit) || (s->mhit != hit)) {
++    s->mhit = 0;
++    return (0);
++  }
++  return (hit);
++}
++
++/*- End of function --------------------------------------------------------*/
++
++int
++zap_dtmf_get (dtmf_detect_state_t * s, char *buf, int max)
++{
++  if (max > s->current_digits)
++    max = s->current_digits;
++  if (max > 0) {
++    memcpy (buf, s->digits, max);
++    memmove (s->digits, s->digits + max, s->current_digits - max);
++    s->current_digits -= max;
++  }
++  buf[max] = '\0';
++  return max;
++}
++
++/*- End of function --------------------------------------------------------*/
++/*- End of file ------------------------------------------------------------*/
+diff --git a/farsight/dtmf/tone_detect.h b/farsight/dtmf/tone_detect.h
+new file mode 100644
+index 0000000..909c5ef
+--- /dev/null
++++ b/farsight/dtmf/tone_detect.h
+@@ -0,0 +1,93 @@
++/* 
++ *   Header file for DTMF Receiver module, part of:
++ *      BSD Telephony Of Mexico "Zapata" Telecom Library, version 1.10  12/9/01
++ *
++ *   Part of the "Zapata" Computer Telephony Technology.
++ *
++ *   See http://www.bsdtelephony.com.mx
++ *
++ *
++ *  The technologies, software, hardware, designs, drawings, scheumatics, board
++ *  layouts and/or artwork, concepts, methodologies (including the use of all
++ *  of these, and that which is derived from the use of all of these), all other
++ *  intellectual properties contained herein, and all intellectual property
++ *  rights have been and shall continue to be expressly for the benefit of all
++ *  mankind, and are perpetually placed in the public domain, and may be used,
++ *  copied, and/or modified by anyone, in any manner, for any legal purpose,
++ *  without restriction.
++ *
++ *   This module written by Stephen Underwood.
++ */
++/*
++	tone_detect.h - General telephony tone detection, and specific
++                        detection of DTMF.
++
++        Copyright (C) 2001  Steve Underwood <steveu at coppice.org>
++
++        Despite my general liking of the GPL, I place this code in the
++        public domain for the benefit of all mankind - even the slimy
++        ones who might try to proprietize my work and use it to my
++        detriment.
++*/
++
++#ifndef __TONE_DETECT_H__
++#define __TONE_DETECT_H__
++
++#include "_stdint.h"
++
++typedef struct
++{
++    float v2;
++    float v3;
++    float fac;
++} goertzel_state_t;
++
++#define	MAX_DTMF_DIGITS 128
++
++typedef struct
++{
++    int hit1;
++    int hit2;
++    int hit3;
++    int hit4;
++    int mhit;
++
++    goertzel_state_t row_out[4];
++    goertzel_state_t col_out[4];
++    goertzel_state_t row_out2nd[4];
++    goertzel_state_t col_out2nd[4];
++	goertzel_state_t fax_tone;
++	goertzel_state_t fax_tone2nd;
++    float energy;
++    
++    int current_sample;
++    char digits[MAX_DTMF_DIGITS + 1];
++    int current_digits;
++    int detected_digits;
++    int lost_digits;
++    int digit_hits[16];
++	int fax_hits;
++} dtmf_detect_state_t;
++
++typedef struct
++{
++    float fac;
++} tone_detection_descriptor_t;
++
++void zap_goertzel_update(goertzel_state_t *s,
++                     int16_t x[],
++                     int samples);
++float zap_goertzel_result (goertzel_state_t *s);
++
++void zap_dtmf_detect_init (dtmf_detect_state_t *s);
++int zap_dtmf_detect (dtmf_detect_state_t *s,
++                 int16_t amp[],
++                 int samples,
++		 int isradio);
++int zap_dtmf_get (dtmf_detect_state_t *s,
++              char *buf,
++              int max);
++
++#endif /* __TONE_DETECT_H__ */
++
++/*- End of file ------------------------------------------------------------*/
 diff --git a/farsight/liveadder/Makefile.am b/farsight/liveadder/Makefile.am
 new file mode 100644
 index 0000000..fcc971b




More information about the fedora-extras-commits mailing list