[gst-devel] [PATCH] typefinding: extend AAC typefinder for LOAS stream

André Dieb andre.dieb at gmail.com
Thu Jul 8 18:19:43 CEST 2010


Hello,

You might be interested in this thread:
https://bugzilla.gnome.org/show_bug.cgi?id=615740

On Thu, Jul 8, 2010 at 10:43 AM, Andrzej K. Haczewski
<ahaczewski at gmail.com>wrote:

>
> Signed-off-by: Andrzej K. Haczewski <ahaczewski at gmail.com>
> ---
>  gst/typefind/gsttypefindfunctions.c |   54
> +++++++++++++++++++++++++++++++++-
>  1 files changed, 52 insertions(+), 2 deletions(-)
>
> Hello all,
>
> Here's a little patch to detect LOAS MPEG-4 streams that carry AAC. I also
> included additional file extensions for AAC. As the original typefind name
> did not reflect the new capability, I also altered it to better reflect its
> purpose, as it is currently capable of detecting any type of stream that
> AAC can be natively transported in. Feel free to review and comment.
>
> Regards,
> Andrzej K. Haczewski
>
> diff --git a/gst/typefind/gsttypefindfunctions.c
> b/gst/typefind/gsttypefindfunctions.c
> index 07d8747..25c08fc 100644
> --- a/gst/typefind/gsttypefindfunctions.c
> +++ b/gst/typefind/gsttypefindfunctions.c
> @@ -679,6 +679,8 @@ aac_type_find (GstTypeFind * tf, gpointer unused)
>      * again a valid syncpoint on the next one (28 bits) for certainty. We
>      * require 4 kB, which is quite a lot, since frames are generally
> 200-400
>      * bytes.
> +     * LOAS has 2 possible syncwords, which are 11 bits and 16 bits long.
> +     * The following stream syntax depends on which one is found.
>      */
>     if (G_UNLIKELY (!data_scan_ctx_ensure_data (tf, &c, 6)))
>       break;
> @@ -756,6 +758,54 @@ aac_type_find (GstTypeFind * tf, gpointer unused)
>       }
>
>       GST_DEBUG ("No next frame found... (should have been at 0x%x)", len);
> +    } else if (G_UNLIKELY (((snc & 0xffe0) == 0x56e0) || (snc == 0x4de1)))
> {
> +      /* LOAS frame */
> +
> +      GST_DEBUG ("Found one LOAS syncword at offset 0x%" G_GINT64_MODIFIER
> +          "x, tracing next...", c.offset);
> +
> +      /* check length of frame for each type of detectable LOAS streams */
> +      if (snc == 0x4de1) {
> +        /* EPAudioSyncStream */
> +        len = ((c.data[2] & 0x0f) << 9) | (c.data[3] << 1) |
> +            ((c.data[4] & 0x80) >> 7);
> +        /* add size of EP sync stream header */
> +        len += 7;
> +      } else {
> +        /* AudioSyncStream */
> +        len = ((c.data[1] & 0x1f) << 8) | c.data[2];
> +        /* add size of sync stream header */
> +        len += 3;
> +      }
> +
> +      if (len == 0 || !data_scan_ctx_ensure_data (tf, &c, len + 2)) {
> +        GST_DEBUG ("Wrong sync or next frame not within reach, len=%u",
> len);
> +        goto next;
> +      }
> +
> +      /* check if there's a second LOAS frame */
> +      snc = GST_READ_UINT16_BE (c.data + len);
> +      if (((snc & 0xffe0) == 0x56e0) || (snc == 0x4de1)) {
> +        GstCaps *caps;
> +
> +        GST_DEBUG ("Found second LOAS syncword at offset 0x%"
> +            G_GINT64_MODIFIER "x, framelen %u", c.offset, len);
> +
> +        /* Set additional field to indicate which type of LOAS stream is
> found.
> +         * It is purely informational field as receiving element have to
> parse
> +         * the stream anyway. */
> +        caps = gst_caps_new_simple ("audio/mpeg",
> +            "framed", G_TYPE_BOOLEAN, FALSE,
> +            "mpegversion", G_TYPE_INT, 4,
> +            "stream-type", G_TYPE_STRING, "loas",
> +            "error-resilient", G_TYPE_BOOLEAN, (snc == 0x4de1), NULL);
> +
> +        gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, caps);
> +        gst_caps_unref (caps);
> +        break;
> +      }
> +
> +      GST_DEBUG ("No next frame found... (should have been at 0x%x)",
> len);
>     } else if (!memcmp (c.data, "ADIF", 4)) {
>       /* ADIF header */
>       gst_type_find_suggest_simple (tf, GST_TYPE_FIND_LIKELY, "audio/mpeg",
> @@ -3923,7 +3973,7 @@ plugin_init (GstPlugin * plugin)
>   static const gchar *compress_exts[] = { "Z", NULL };
>   static const gchar *m4a_exts[] = { "m4a", NULL };
>   static const gchar *q3gp_exts[] = { "3gp", NULL };
> -  static const gchar *aac_exts[] = { "aac", NULL };
> +  static const gchar *aac_exts[] = { "aac", "adts", "adif", "loas", NULL
> };
>   static const gchar *spc_exts[] = { "spc", NULL };
>   static const gchar *wavpack_exts[] = { "wv", "wvp", NULL };
>   static const gchar *wavpack_correction_exts[] = { "wvc", NULL };
> @@ -4156,7 +4206,7 @@ plugin_init (GstPlugin * plugin)
>       NULL, CMML_CAPS, NULL, NULL);
>   TYPE_FIND_REGISTER_START_WITH (plugin, "application/x-executable",
>       GST_RANK_MARGINAL, NULL, "\177ELF", 4, GST_TYPE_FIND_MAXIMUM);
> -  TYPE_FIND_REGISTER (plugin, "adts_mpeg_stream", GST_RANK_SECONDARY,
> +  TYPE_FIND_REGISTER (plugin, "audio/aac", GST_RANK_SECONDARY,
>       aac_type_find, aac_exts, AAC_CAPS, NULL, NULL);
>   TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-spc", GST_RANK_SECONDARY,
>       spc_exts, "SNES-SPC700 Sound File Data", 27, GST_TYPE_FIND_MAXIMUM);
> --
> 1.7.1
>
>
>
> ------------------------------------------------------------------------------
> This SF.net email is sponsored by Sprint
> What will you do first with EVO, the first 4G phone?
> Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
>



-- 
André Dieb Martins
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20100708/e4682388/attachment.htm>


More information about the gstreamer-devel mailing list