[gst-cvs] gst-ffmpeg: ffmpeg: add support for G721

Wim Taymans wtay at kemper.freedesktop.org
Wed Sep 9 04:35:53 PDT 2009


Module: gst-ffmpeg
Branch: master
Commit: 669a0e359a294e5efc6187f4c723eadcc25ea2c3
URL:    http://cgit.freedesktop.org/gstreamer/gst-ffmpeg/commit/?id=669a0e359a294e5efc6187f4c723eadcc25ea2c3

Author: Wim Taymans <wim.taymans at collabora.co.uk>
Date:   Wed Sep  9 13:33:53 2009 +0200

ffmpeg: add support for G721

Add support for g721, which is like G726 but with 1 channel, 8KHz and a bitrate
of 32000.

Fixes #594454

---

 ext/ffmpeg/gstffmpegcodecmap.c |   40 ++++++++++++++++++++++++++++++++++------
 1 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/ext/ffmpeg/gstffmpegcodecmap.c b/ext/ffmpeg/gstffmpegcodecmap.c
index 5e3aebb..0e9dda1 100644
--- a/ext/ffmpeg/gstffmpegcodecmap.c
+++ b/ext/ffmpeg/gstffmpegcodecmap.c
@@ -309,7 +309,6 @@ gst_ff_vid_caps_new (AVCodecContext * context, enum CodecID codec_id,
 
 /* same for audio - now with channels/sample rate
  */
-
 static GstCaps *
 gst_ff_aud_caps_new (AVCodecContext * context, enum CodecID codec_id,
     const char *mimetype, const char *fieldname, ...)
@@ -1165,6 +1164,23 @@ gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
       caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-alaw", NULL);
       break;
 
+    case CODEC_ID_ADPCM_G726:
+    {
+      /* the G726 decoder can also handle G721 */
+      caps = gst_ff_aud_caps_new (context, codec_id, "audio/x-adpcm",
+          "layout", G_TYPE_STRING, "g726", NULL);
+      if (context)
+        gst_caps_set_simple (caps,
+            "block_align", G_TYPE_INT, context->block_align,
+            "bitrate", G_TYPE_INT, context->bit_rate, NULL);
+
+      if (!encode) {
+        gst_caps_append (caps, gst_caps_new_simple ("audio/x-adpcm",
+                "layout", G_TYPE_STRING, "g721",
+                "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, 8000, NULL));
+      }
+      break;
+    }
     case CODEC_ID_ADPCM_IMA_QT:
     case CODEC_ID_ADPCM_IMA_WAV:
     case CODEC_ID_ADPCM_IMA_DK3:
@@ -1180,7 +1196,6 @@ gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
     case CODEC_ID_ADPCM_XA:
     case CODEC_ID_ADPCM_ADX:
     case CODEC_ID_ADPCM_EA:
-    case CODEC_ID_ADPCM_G726:
     case CODEC_ID_ADPCM_CT:
     case CODEC_ID_ADPCM_SWF:
     case CODEC_ID_ADPCM_YAMAHA:
@@ -1242,9 +1257,6 @@ gst_ffmpeg_codecid_to_caps (enum CodecID codec_id,
         case CODEC_ID_ADPCM_EA:
           layout = "ea";
           break;
-        case CODEC_ID_ADPCM_G726:
-          layout = "g726";
-          break;
         case CODEC_ID_ADPCM_CT:
           layout = "ct";
           break;
@@ -1794,6 +1806,7 @@ gst_ffmpeg_caps_to_smpfmt (const GstCaps * caps,
   GstStructure *structure;
   gint depth = 0, width = 0, endianness = 0;
   gboolean signedness = FALSE;
+  const gchar *name;
 
   g_return_if_fail (gst_caps_get_size (caps) == 1);
   structure = gst_caps_get_structure (caps, 0);
@@ -1806,7 +1819,9 @@ gst_ffmpeg_caps_to_smpfmt (const GstCaps * caps,
   if (!raw)
     return;
 
-  if (!strcmp (gst_structure_get_name (structure), "audio/x-raw-float")) {
+  name = gst_structure_get_name (structure);
+
+  if (!strcmp (name, "audio/x-raw-float")) {
     /* FLOAT */
     if (gst_structure_get_int (structure, "width", &width) &&
         gst_structure_get_int (structure, "endianness", &endianness)) {
@@ -2273,7 +2288,18 @@ gst_ffmpeg_caps_with_codecid (enum CodecID codec_id,
         }
     }
     case CODEC_ID_ADPCM_G726:
+    {
+      const gchar *layout;
+
+      if ((layout = gst_structure_get_string (str, "layout"))) {
+        if (!strcmp (layout, "g721")) {
+          context->sample_rate = 8000;
+          context->channels = 1;
+          context->bit_rate = 32000;
+        }
+      }
       break;
+    }
     default:
       break;
   }
@@ -2925,6 +2951,8 @@ gst_ffmpeg_caps_to_codecid (const GstCaps * caps, AVCodecContext * context)
       id = CODEC_ID_ADPCM_EA;
     } else if (!strcmp (layout, "g726")) {
       id = CODEC_ID_ADPCM_G726;
+    } else if (!strcmp (layout, "g721")) {
+      id = CODEC_ID_ADPCM_G726;
     } else if (!strcmp (layout, "ct")) {
       id = CODEC_ID_ADPCM_CT;
     } else if (!strcmp (layout, "swf")) {





More information about the Gstreamer-commits mailing list