All of lore.kernel.org
 help / color / mirror / Atom feed
From: Koen Kooi <koen@dominion.thruhere.net>
To: openembedded-devel@lists.openembedded.org
Subject: Re: [PATCH 1/2] gstreamer: move old versions to obsolete
Date: Thu, 17 Mar 2011 13:47:13 +0100	[thread overview]
Message-ID: <ilsvsh$e2q$1@dough.gmane.org> (raw)
In-Reply-To: <1300365679-20067-1-git-send-email-Martin.Jansa@gmail.com>

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 17-03-11 13:41, Martin Jansa wrote:
> Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>

Git didn't pick up renames properly, but looks good otherwise:

Acked-by: Koen Kooi <koen@dominion.thruhere.net>

> ---
>  recipes/gstreamer/gst-ffmpeg/armv5.patch           | 1509 -------------------
>  recipes/gstreamer/gst-ffmpeg/autotools.patch       |   21 -
>  recipes/gstreamer/gst-ffmpeg_0.10.2.bb             |   35 -
>  recipes/gstreamer/gst-plugins-bad_0.10.20.bb       |   16 -
>  .../gstreamer/gst-plugins-base/fix-playbin2.patch  |   26 -
>  .../gst-plugins-base_rowstride.patch               | 1577 --------------------
>  recipes/gstreamer/gst-plugins-base_0.10.25.bb      |   19 -
>  recipes/gstreamer/gst-plugins-base_0.10.31.bb      |   26 -
>  .../fix-unit-scale-asseration.patch                |   33 -
>  recipes/gstreamer/gst-plugins-good_0.10.15.bb      |   16 -
>  recipes/gstreamer/gst-rtsp_0.10.4.bb               |    4 -
>  recipes/gstreamer/gst-rtsp_0.10.5.bb               |    4 -
>  recipes/gstreamer/gstreamer/po-makefile-fix.patch  |   12 -
>  .../registry-do-not-look-into-debug-dirs.patch     |   39 -
>  recipes/gstreamer/gstreamer_0.10.17.bb             |   10 -
>  recipes/gstreamer/gstreamer_0.10.25.bb             |    6 -
>  recipes/gstreamer/gstreamer_0.10.31.bb             |   15 -
>  recipes/obsolete/gstreamer/gst-ffmpeg/armv5.patch  | 1509 +++++++++++++++++++
>  .../obsolete/gstreamer/gst-ffmpeg/autotools.patch  |   21 +
>  recipes/obsolete/gstreamer/gst-ffmpeg_0.10.2.bb    |   35 +
>  .../obsolete/gstreamer/gst-plugins-bad_0.10.20.bb  |   16 +
>  .../gstreamer/gst-plugins-base/fix-playbin2.patch  |   26 +
>  .../gst-plugins-base_rowstride.patch               | 1577 ++++++++++++++++++++
>  .../obsolete/gstreamer/gst-plugins-base_0.10.25.bb |   19 +
>  .../obsolete/gstreamer/gst-plugins-base_0.10.31.bb |   26 +
>  .../fix-unit-scale-asseration.patch                |   33 +
>  .../obsolete/gstreamer/gst-plugins-good_0.10.15.bb |   16 +
>  recipes/obsolete/gstreamer/gst-rtsp_0.10.4.bb      |    4 +
>  recipes/obsolete/gstreamer/gst-rtsp_0.10.5.bb      |    4 +
>  .../gstreamer/gstreamer/po-makefile-fix.patch      |   12 +
>  .../registry-do-not-look-into-debug-dirs.patch     |   39 +
>  recipes/obsolete/gstreamer/gstreamer_0.10.17.bb    |   10 +
>  recipes/obsolete/gstreamer/gstreamer_0.10.25.bb    |    6 +
>  recipes/obsolete/gstreamer/gstreamer_0.10.31.bb    |   15 +
>  34 files changed, 3368 insertions(+), 3368 deletions(-)
>  delete mode 100644 recipes/gstreamer/gst-ffmpeg/armv5.patch
>  delete mode 100644 recipes/gstreamer/gst-ffmpeg/autotools.patch
>  delete mode 100644 recipes/gstreamer/gst-ffmpeg_0.10.2.bb
>  delete mode 100644 recipes/gstreamer/gst-plugins-bad_0.10.20.bb
>  delete mode 100644 recipes/gstreamer/gst-plugins-base/fix-playbin2.patch
>  delete mode 100644 recipes/gstreamer/gst-plugins-base/gst-plugins-base_rowstride.patch
>  delete mode 100644 recipes/gstreamer/gst-plugins-base_0.10.25.bb
>  delete mode 100644 recipes/gstreamer/gst-plugins-base_0.10.31.bb
>  delete mode 100644 recipes/gstreamer/gst-plugins-good/fix-unit-scale-asseration.patch
>  delete mode 100644 recipes/gstreamer/gst-plugins-good_0.10.15.bb
>  delete mode 100644 recipes/gstreamer/gst-rtsp_0.10.4.bb
>  delete mode 100644 recipes/gstreamer/gst-rtsp_0.10.5.bb
>  delete mode 100644 recipes/gstreamer/gstreamer/po-makefile-fix.patch
>  delete mode 100644 recipes/gstreamer/gstreamer/registry-do-not-look-into-debug-dirs.patch
>  delete mode 100644 recipes/gstreamer/gstreamer_0.10.17.bb
>  delete mode 100644 recipes/gstreamer/gstreamer_0.10.25.bb
>  delete mode 100644 recipes/gstreamer/gstreamer_0.10.31.bb
>  create mode 100644 recipes/obsolete/gstreamer/gst-ffmpeg/armv5.patch
>  create mode 100644 recipes/obsolete/gstreamer/gst-ffmpeg/autotools.patch
>  create mode 100644 recipes/obsolete/gstreamer/gst-ffmpeg_0.10.2.bb
>  create mode 100644 recipes/obsolete/gstreamer/gst-plugins-bad_0.10.20.bb
>  create mode 100644 recipes/obsolete/gstreamer/gst-plugins-base/fix-playbin2.patch
>  create mode 100644 recipes/obsolete/gstreamer/gst-plugins-base/gst-plugins-base_rowstride.patch
>  create mode 100644 recipes/obsolete/gstreamer/gst-plugins-base_0.10.25.bb
>  create mode 100644 recipes/obsolete/gstreamer/gst-plugins-base_0.10.31.bb
>  create mode 100644 recipes/obsolete/gstreamer/gst-plugins-good/fix-unit-scale-asseration.patch
>  create mode 100644 recipes/obsolete/gstreamer/gst-plugins-good_0.10.15.bb
>  create mode 100644 recipes/obsolete/gstreamer/gst-rtsp_0.10.4.bb
>  create mode 100644 recipes/obsolete/gstreamer/gst-rtsp_0.10.5.bb
>  create mode 100644 recipes/obsolete/gstreamer/gstreamer/po-makefile-fix.patch
>  create mode 100644 recipes/obsolete/gstreamer/gstreamer/registry-do-not-look-into-debug-dirs.patch
>  create mode 100644 recipes/obsolete/gstreamer/gstreamer_0.10.17.bb
>  create mode 100644 recipes/obsolete/gstreamer/gstreamer_0.10.25.bb
>  create mode 100644 recipes/obsolete/gstreamer/gstreamer_0.10.31.bb
> 
> diff --git a/recipes/gstreamer/gst-ffmpeg/armv5.patch b/recipes/gstreamer/gst-ffmpeg/armv5.patch
> deleted file mode 100644
> index 794709c..0000000
> --- a/recipes/gstreamer/gst-ffmpeg/armv5.patch
> +++ /dev/null
> @@ -1,1509 +0,0 @@
> -diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/configure.ac gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/configure.ac
> ---- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/configure.ac	2006-09-23 15:35:21.000000000 +0200
> -+++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/configure.ac	2007-05-01 12:23:39.000000000 +0200
> -@@ -190,7 +190,7 @@
> -     ARCH_X86=yes
> -     ;;
> -   # armv4l is a subset of armv5tel
> --  armv4l|armv5tel)
> -+  arm|armv4l|armv5tel|armv5te)
> -     TARGET_ARCH="armv4l"
> -     ARCH_ARMV4L=yes
> -     ;;
> -@@ -364,11 +364,8 @@
> - AC_FF_ALLOW_DISABLE(HAVE_IWMMXT, iwmmxt, use ARM/IWMMXT optimizations,[
> -   if test x$TARGET_ARCH = xarmv4l; then
> -     AC_MSG_CHECKING(for support of IWMMXT optimizations)
> --    AC_TRY_RUN([
> --        int main () {
> -+    AC_TRY_COMPILE(,[
> -           __asm__ __volatile__ ("wunpckelub wr6, wr4");
> --          return 0;
> --        }
> -       ],[ HAVE_IWMMXT=yes && AC_MSG_RESULT(yes) ],[
> -         HAVE_IWMMXT=no && AC_MSG_RESULT(no) ])
> -   else
> -@@ -376,6 +373,19 @@
> -   fi
> - ])
> - 
> -+dnl ARMV5TE
> -+AC_FF_ALLOW_DISABLE(HAVE_ARMV5TE, armv5te, use ARMV5TE optimizations,[
> -+  if test x$TARGET_ARCH = xarmv4l; then
> -+    AC_MSG_CHECKING(for support of ARMV5TE specific instructions)
> -+    AC_TRY_COMPILE(, [
> -+          __asm__ __volatile__ ("smulbb a4,ip,a3");
> -+      ],[ HAVE_ARMV5TE=yes && AC_MSG_RESULT(yes) ],[
> -+        HAVE_ARMV5TE=no && AC_MSG_RESULT(no) ])
> -+  else
> -+    HAVE_ARMV5TE=no
> -+  fi
> -+])
> -+
> - dnl GProf (-p)
> - AC_FF_ALLOW_ENABLE(HAVE_GPROF, gprof, profiling with gprof,[
> -   GPROF_FLAGS="-p"
> -diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_arm.c gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_arm.c
> ---- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_arm.c	2006-09-20 20:55:37.000000000 +0200
> -+++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_arm.c	2007-05-01 12:23:40.000000000 +0200
> -  * ARMv4L optimized DSP utils
> -  * Copyright (c) 2001 Lionel Ulmer.
> -  *
> -- * This library is free software; you can redistribute it and/or
> -+ * This file is part of FFmpeg.
> -+ *
> -+ * FFmpeg is free software; you can redistribute it and/or
> -  * modify it under the terms of the GNU Lesser General Public
> -  * License as published by the Free Software Foundation; either
> -- * version 2 of the License, or (at your option) any later version.
> -+ * version 2.1 of the License, or (at your option) any later version.
> -  *
> -- * This library is distributed in the hope that it will be useful,
> -+ * FFmpeg 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
> -  * Lesser General Public License for more details.
> -  *
> -  * You should have received a copy of the GNU Lesser General Public
> -- * License along with this library; if not, write to the Free Software
> -+ * License along with FFmpeg; if not, write to the Free Software
> -  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> -  */
> - 
> --#include "dsputil.h"
> -+#include "../dsputil.h"
> - #ifdef HAVE_IPP
> - #include "ipp.h"
> - #endif
> -@@ -27,6 +29,12 @@
> - extern void j_rev_dct_ARM(DCTELEM *data);
> - extern void simple_idct_ARM(DCTELEM *data);
> - 
> -+extern void simple_idct_armv5te(DCTELEM *data);
> -+extern void simple_idct_put_armv5te(uint8_t *dest, int line_size,
> -+                                    DCTELEM *data);
> -+extern void simple_idct_add_armv5te(uint8_t *dest, int line_size,
> -+                                    DCTELEM *data);
> -+
> - /* XXX: local hack */
> - static void (*ff_put_pixels_clamped)(const DCTELEM *block, uint8_t *pixels, int line_size);
> - static void (*ff_add_pixels_clamped)(const DCTELEM *block, uint8_t *pixels, int line_size);
> -@@ -196,8 +204,10 @@
> -     ff_add_pixels_clamped = c->add_pixels_clamped;
> - 
> -     if(idct_algo == FF_IDCT_AUTO){
> --#ifdef HAVE_IPP
> -+#if defined(HAVE_IPP)
> -         idct_algo = FF_IDCT_IPP;
> -+#elif defined(HAVE_ARMV5TE)
> -+        idct_algo = FF_IDCT_SIMPLEARMV5TE;
> - #else
> -         idct_algo = FF_IDCT_ARM;
> - #endif
> -@@ -213,6 +223,13 @@
> -         c->idct_add= simple_idct_ARM_add;
> -         c->idct    = simple_idct_ARM;
> -         c->idct_permutation_type= FF_NO_IDCT_PERM;
> -+#ifdef HAVE_ARMV5TE
> -+    } else if (idct_algo==FF_IDCT_SIMPLEARMV5TE){
> -+        c->idct_put= simple_idct_put_armv5te;
> -+        c->idct_add= simple_idct_add_armv5te;
> -+        c->idct    = simple_idct_armv5te;
> -+        c->idct_permutation_type = FF_NO_IDCT_PERM;
> -+#endif
> - #ifdef HAVE_IPP
> -     } else if (idct_algo==FF_IDCT_IPP){
> -         c->idct_put= simple_idct_ipp_put;
> ---- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_arm_s.S	2006-02-19 00:04:59.000000000 +0100
> -+++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_arm_s.S	2007-05-01 12:23:40.000000000 +0200
> -@@ -2,20 +2,29 @@
> - @ ARMv4L optimized DSP utils
> - @ Copyright (c) 2004 AGAWA Koji <i (AT) atty (DOT) jp>
> - @
> --@ This library is free software; you can redistribute it and/or
> -+@ This file is part of FFmpeg.
> -+@
> -+@ FFmpeg is free software; you can redistribute it and/or
> - @ modify it under the terms of the GNU Lesser General Public
> - @ License as published by the Free Software Foundation; either
> --@ version 2 of the License, or (at your option) any later version.
> -+@ version 2.1 of the License, or (at your option) any later version.
> - @
> --@ This library is distributed in the hope that it will be useful,
> -+@ FFmpeg 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
> - @ Lesser General Public License for more details.
> - @
> - @ You should have received a copy of the GNU Lesser General Public
> --@ License along with this library; if not, write to the Free Software
> -+@ License along with FFmpeg; if not, write to the Free Software
> - @ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> - @
> -+#if defined(__ARM_ARCH_5__) || \
> -+    defined(__ARM_ARCH_5T__) || \
> -+    defined(__ARM_ARCH_5TE__)
> -+#define PLD(code...)   code
> -+#else
> -+#define PLD(code...)
> -+#endif
> - 
> - .macro  ADJ_ALIGN_QUADWORD_D shift, Rd0, Rd1, Rd2, Rd3, Rn0, Rn1, Rn2, Rn3, Rn4
> -         mov \Rd0, \Rn0, lsr #(\shift * 8)
> -@@ -74,7 +83,7 @@
> - put_pixels16_arm:
> -         @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h)
> -         @ block = word aligned, pixles = unaligned
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         stmfd sp!, {r4-r11, lr} @ R14 is also called LR
> -         adr r5, 5f
> -         ands r4, r1, #3
> -@@ -85,7 +94,7 @@
> -         ldmia r1, {r4-r7}
> -         add r1, r1, r2
> -         stmia r0, {r4-r7}
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         subs r3, r3, #1
> -         add r0, r0, r2
> -         bne 1b
> -@@ -95,7 +104,7 @@
> -         ldmia r1, {r4-r8}
> -         add r1, r1, r2
> -         ADJ_ALIGN_QUADWORD_D 1, r9, r10, r11, r12, r4, r5, r6, r7, r8
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         subs r3, r3, #1
> -         stmia r0, {r9-r12}
> -         add r0, r0, r2
> -@@ -106,7 +115,7 @@
> -         ldmia r1, {r4-r8}
> -         add r1, r1, r2
> -         ADJ_ALIGN_QUADWORD_D 2, r9, r10, r11, r12, r4, r5, r6, r7, r8
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         subs r3, r3, #1
> -         stmia r0, {r9-r12}
> -         add r0, r0, r2
> -@@ -117,7 +126,7 @@
> -         ldmia r1, {r4-r8}
> -         add r1, r1, r2
> -         ADJ_ALIGN_QUADWORD_D 3, r9, r10, r11, r12, r4, r5, r6, r7, r8
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         subs r3, r3, #1
> -         stmia r0, {r9-r12}
> -         add r0, r0, r2
> -@@ -136,7 +145,7 @@
> - put_pixels8_arm:
> -         @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h)
> -         @ block = word aligned, pixles = unaligned
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         stmfd sp!, {r4-r5,lr} @ R14 is also called LR
> -         adr r5, 5f
> -         ands r4, r1, #3
> -@@ -147,7 +156,7 @@
> -         ldmia r1, {r4-r5}
> -         add r1, r1, r2
> -         subs r3, r3, #1
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         stmia r0, {r4-r5}
> -         add r0, r0, r2
> -         bne 1b
> -@@ -157,7 +166,7 @@
> -         ldmia r1, {r4-r5, r12}
> -         add r1, r1, r2
> -         ADJ_ALIGN_DOUBLEWORD 1, r4, r5, r12
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         subs r3, r3, #1
> -         stmia r0, {r4-r5}
> -         add r0, r0, r2
> -@@ -168,7 +177,7 @@
> -         ldmia r1, {r4-r5, r12}
> -         add r1, r1, r2
> -         ADJ_ALIGN_DOUBLEWORD 2, r4, r5, r12
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         subs r3, r3, #1
> -         stmia r0, {r4-r5}
> -         add r0, r0, r2
> -@@ -179,7 +188,7 @@
> -         ldmia r1, {r4-r5, r12}
> -         add r1, r1, r2
> -         ADJ_ALIGN_DOUBLEWORD 3, r4, r5, r12
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         subs r3, r3, #1
> -         stmia r0, {r4-r5}
> -         add r0, r0, r2
> -@@ -198,7 +207,7 @@
> - put_pixels8_x2_arm:
> -         @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h)
> -         @ block = word aligned, pixles = unaligned
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         stmfd sp!, {r4-r10,lr} @ R14 is also called LR
> -         adr r5, 5f
> -         ands r4, r1, #3
> -@@ -210,7 +219,7 @@
> -         ldmia r1, {r4-r5, r10}
> -         add r1, r1, r2
> -         ADJ_ALIGN_DOUBLEWORD_D 1, r6, r7, r4, r5, r10
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         RND_AVG32 r8, r9, r4, r5, r6, r7, r12
> -         subs r3, r3, #1
> -         stmia r0, {r8-r9}
> -@@ -223,7 +232,7 @@
> -         add r1, r1, r2
> -         ADJ_ALIGN_DOUBLEWORD_D 1, r6, r7, r4, r5, r10
> -         ADJ_ALIGN_DOUBLEWORD_D 2, r8, r9, r4, r5, r10
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         RND_AVG32 r4, r5, r6, r7, r8, r9, r12
> -         subs r3, r3, #1
> -         stmia r0, {r4-r5}
> -@@ -236,7 +245,7 @@
> -         add r1, r1, r2
> -         ADJ_ALIGN_DOUBLEWORD_D 2, r6, r7, r4, r5, r10
> -         ADJ_ALIGN_DOUBLEWORD_D 3, r8, r9, r4, r5, r10
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         RND_AVG32 r4, r5, r6, r7, r8, r9, r12
> -         subs r3, r3, #1
> -         stmia r0, {r4-r5}
> -@@ -248,7 +257,7 @@
> -         ldmia r1, {r4-r5, r10}
> -         add r1, r1, r2
> -         ADJ_ALIGN_DOUBLEWORD_D 3, r6, r7, r4, r5, r10
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         RND_AVG32 r8, r9, r6, r7, r5, r10, r12
> -         subs r3, r3, #1
> -         stmia r0, {r8-r9}
> -@@ -267,7 +276,7 @@
> - put_no_rnd_pixels8_x2_arm:
> -         @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h)
> -         @ block = word aligned, pixles = unaligned
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         stmfd sp!, {r4-r10,lr} @ R14 is also called LR
> -         adr r5, 5f
> -         ands r4, r1, #3
> -@@ -279,7 +288,7 @@
> -         ldmia r1, {r4-r5, r10}
> -         add r1, r1, r2
> -         ADJ_ALIGN_DOUBLEWORD_D 1, r6, r7, r4, r5, r10
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         NO_RND_AVG32 r8, r9, r4, r5, r6, r7, r12
> -         subs r3, r3, #1
> -         stmia r0, {r8-r9}
> -@@ -292,7 +301,7 @@
> -         add r1, r1, r2
> -         ADJ_ALIGN_DOUBLEWORD_D 1, r6, r7, r4, r5, r10
> -         ADJ_ALIGN_DOUBLEWORD_D 2, r8, r9, r4, r5, r10
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         NO_RND_AVG32 r4, r5, r6, r7, r8, r9, r12
> -         subs r3, r3, #1
> -         stmia r0, {r4-r5}
> -@@ -305,7 +314,7 @@
> -         add r1, r1, r2
> -         ADJ_ALIGN_DOUBLEWORD_D 2, r6, r7, r4, r5, r10
> -         ADJ_ALIGN_DOUBLEWORD_D 3, r8, r9, r4, r5, r10
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         NO_RND_AVG32 r4, r5, r6, r7, r8, r9, r12
> -         subs r3, r3, #1
> -         stmia r0, {r4-r5}
> -@@ -317,7 +326,7 @@
> -         ldmia r1, {r4-r5, r10}
> -         add r1, r1, r2
> -         ADJ_ALIGN_DOUBLEWORD_D 3, r6, r7, r4, r5, r10
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         NO_RND_AVG32 r8, r9, r6, r7, r5, r10, r12
> -         subs r3, r3, #1
> -         stmia r0, {r8-r9}
> -@@ -338,7 +347,7 @@
> - put_pixels8_y2_arm:
> -         @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h)
> -         @ block = word aligned, pixles = unaligned
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         stmfd sp!, {r4-r11,lr} @ R14 is also called LR
> -         adr r5, 5f
> -         ands r4, r1, #3
> -@@ -352,13 +361,13 @@
> -         add r1, r1, r2
> - 6:      ldmia r1, {r6-r7}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         RND_AVG32 r8, r9, r4, r5, r6, r7, r12
> -         ldmia r1, {r4-r5}
> -         add r1, r1, r2
> -         stmia r0, {r8-r9}
> -         add r0, r0, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         RND_AVG32 r8, r9, r6, r7, r4, r5, r12
> -         subs r3, r3, #1
> -         stmia r0, {r8-r9}
> -@@ -369,18 +378,18 @@
> - 2:
> -         ldmia r1, {r4-r6}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 1, r4, r5, r6
> - 6:      ldmia r1, {r7-r9}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 1, r7, r8, r9
> -         RND_AVG32 r10, r11, r4, r5, r7, r8, r12
> -         stmia r0, {r10-r11}
> -         add r0, r0, r2
> -         ldmia r1, {r4-r6}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 1, r4, r5, r6
> -         subs r3, r3, #1
> -         RND_AVG32 r10, r11, r7, r8, r4, r5, r12
> -@@ -392,18 +401,18 @@
> - 3:
> -         ldmia r1, {r4-r6}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 2, r4, r5, r6
> - 6:      ldmia r1, {r7-r9}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 2, r7, r8, r9
> -         RND_AVG32 r10, r11, r4, r5, r7, r8, r12
> -         stmia r0, {r10-r11}
> -         add r0, r0, r2
> -         ldmia r1, {r4-r6}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 2, r4, r5, r6
> -         subs r3, r3, #1
> -         RND_AVG32 r10, r11, r7, r8, r4, r5, r12
> -@@ -415,18 +424,18 @@
> - 4:
> -         ldmia r1, {r4-r6}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 3, r4, r5, r6
> - 6:      ldmia r1, {r7-r9}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 3, r7, r8, r9
> -         RND_AVG32 r10, r11, r4, r5, r7, r8, r12
> -         stmia r0, {r10-r11}
> -         add r0, r0, r2
> -         ldmia r1, {r4-r6}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 3, r4, r5, r6
> -         subs r3, r3, #1
> -         RND_AVG32 r10, r11, r7, r8, r4, r5, r12
> -@@ -447,7 +456,7 @@
> - put_no_rnd_pixels8_y2_arm:
> -         @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h)
> -         @ block = word aligned, pixles = unaligned
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         stmfd sp!, {r4-r11,lr} @ R14 is also called LR
> -         adr r5, 5f
> -         ands r4, r1, #3
> -@@ -461,13 +470,13 @@
> -         add r1, r1, r2
> - 6:      ldmia r1, {r6-r7}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         NO_RND_AVG32 r8, r9, r4, r5, r6, r7, r12
> -         ldmia r1, {r4-r5}
> -         add r1, r1, r2
> -         stmia r0, {r8-r9}
> -         add r0, r0, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         NO_RND_AVG32 r8, r9, r6, r7, r4, r5, r12
> -         subs r3, r3, #1
> -         stmia r0, {r8-r9}
> -@@ -478,18 +487,18 @@
> - 2:
> -         ldmia r1, {r4-r6}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 1, r4, r5, r6
> - 6:      ldmia r1, {r7-r9}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 1, r7, r8, r9
> -         NO_RND_AVG32 r10, r11, r4, r5, r7, r8, r12
> -         stmia r0, {r10-r11}
> -         add r0, r0, r2
> -         ldmia r1, {r4-r6}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 1, r4, r5, r6
> -         subs r3, r3, #1
> -         NO_RND_AVG32 r10, r11, r7, r8, r4, r5, r12
> -@@ -501,18 +510,18 @@
> - 3:
> -         ldmia r1, {r4-r6}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 2, r4, r5, r6
> - 6:      ldmia r1, {r7-r9}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 2, r7, r8, r9
> -         NO_RND_AVG32 r10, r11, r4, r5, r7, r8, r12
> -         stmia r0, {r10-r11}
> -         add r0, r0, r2
> -         ldmia r1, {r4-r6}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 2, r4, r5, r6
> -         subs r3, r3, #1
> -         NO_RND_AVG32 r10, r11, r7, r8, r4, r5, r12
> -@@ -524,18 +533,18 @@
> - 4:
> -         ldmia r1, {r4-r6}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 3, r4, r5, r6
> - 6:      ldmia r1, {r7-r9}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 3, r7, r8, r9
> -         NO_RND_AVG32 r10, r11, r4, r5, r7, r8, r12
> -         stmia r0, {r10-r11}
> -         add r0, r0, r2
> -         ldmia r1, {r4-r6}
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         ADJ_ALIGN_DOUBLEWORD 3, r4, r5, r6
> -         subs r3, r3, #1
> -         NO_RND_AVG32 r10, r11, r7, r8, r4, r5, r12
> -@@ -562,7 +571,7 @@
> -         ldmia r1, {r8-r10}
> - .endif
> -         add r1, r1, r2
> --        pld [r1]
> -+        PLD ( pld [r1] )
> - .if \align == 0
> -         ADJ_ALIGN_DOUBLEWORD_D 1, r4, r5, r6, r7, r8
> - .elseif \align == 1
> -@@ -624,7 +633,7 @@
> - put_pixels8_xy2_arm:
> -         @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h)
> -         @ block = word aligned, pixles = unaligned
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         stmfd sp!, {r4-r11,lr} @ R14 is also called LR
> -         adrl r12, 5f
> -         ands r4, r1, #3
> -@@ -661,7 +670,7 @@
> - put_no_rnd_pixels8_xy2_arm:
> -         @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h)
> -         @ block = word aligned, pixles = unaligned
> --        pld [r1]
> -+        PLD ( pld [r1] )
> -         stmfd sp!, {r4-r11,lr} @ R14 is also called LR
> -         adrl r12, 5f
> -         ands r4, r1, #3
> -diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_iwmmxt.c gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_iwmmxt.c
> ---- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_iwmmxt.c	2006-02-19 00:04:59.000000000 +0100
> -+++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_iwmmxt.c	2007-05-01 12:23:40.000000000 +0200
> -@@ -2,18 +2,20 @@
> -  * iWMMXt optimized DSP utils
> -  * Copyright (c) 2004 AGAWA Koji
> -  *
> -- * This library is free software; you can redistribute it and/or
> -+ * This file is part of FFmpeg.
> -+ *
> -+ * FFmpeg is free software; you can redistribute it and/or
> -  * modify it under the terms of the GNU Lesser General Public
> -  * License as published by the Free Software Foundation; either
> -- * version 2 of the License, or (at your option) any later version.
> -+ * version 2.1 of the License, or (at your option) any later version.
> -  *
> -- * This library is distributed in the hope that it will be useful,
> -+ * FFmpeg 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
> -  * Lesser General Public License for more details.
> -  *
> -  * You should have received a copy of the GNU Lesser General Public
> -- * License along with this library; if not, write to the Free Software
> -+ * License along with FFmpeg; if not, write to the Free Software
> -  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> -  */
> - 
> -diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_iwmmxt_rnd.h gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_iwmmxt_rnd.h
> ---- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_iwmmxt_rnd.h	2006-09-20 20:55:37.000000000 +0200
> -+++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_iwmmxt_rnd.h	2007-05-01 12:23:40.000000000 +0200
> -@@ -2,18 +2,20 @@
> -  * iWMMXt optimized DSP utils
> -  * copyright (c) 2004 AGAWA Koji
> -  *
> -- * This library is free software; you can redistribute it and/or
> -+ * This file is part of FFmpeg.
> -+ *
> -+ * FFmpeg is free software; you can redistribute it and/or
> -  * modify it under the terms of the GNU Lesser General Public
> -  * License as published by the Free Software Foundation; either
> -- * version 2 of the License, or (at your option) any later version.
> -+ * version 2.1 of the License, or (at your option) any later version.
> -  *
> -- * This library is distributed in the hope that it will be useful,
> -+ * FFmpeg 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
> -  * Lesser General Public License for more details.
> -  *
> -  * You should have received a copy of the GNU Lesser General Public
> -- * License along with this library; if not, write to the Free Software
> -+ * License along with FFmpeg; if not, write to the Free Software
> -  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> -  */
> - 
> -diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/Makefile.am gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/Makefile.am
> ---- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/Makefile.am	2006-09-22 06:07:23.000000000 +0200
> -+++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/Makefile.am	2007-05-01 12:23:40.000000000 +0200
> -@@ -7,9 +7,14 @@
> - iwmmxt_libs = libiwmmxt.la
> - endif
> - 
> -+if HAVE_ARMV5TE
> -+armv5te_libs = libarmv5te.la
> -+endif
> -+
> - noinst_LTLIBRARIES = \
> - 	libarmv4l.la \
> --	$(iwmmxt_libs)
> -+	$(iwmmxt_libs) \
> -+	$(armv5te_libs)
> - 
> - libarmv4l_la_SOURCES = \
> - 	jrevdct_arm.S \
> -@@ -18,6 +23,9 @@
> - 	dsputil_arm.c \
> - 	mpegvideo_arm.c
> - 
> -+libarmv5te_la_SOURCES = \
> -+	simple_idct_armv5te.S
> -+
> - libiwmmxt_la_SOURCES = \
> - 	dsputil_iwmmxt.c \
> - 	mpegvideo_iwmmxt.c
> -diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/mathops.h gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/mathops.h
> ---- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/mathops.h	2006-09-22 06:07:23.000000000 +0200
> -+++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/mathops.h	2007-05-01 12:23:40.000000000 +0200
> -@@ -2,18 +2,20 @@
> -  * simple math operations
> -  * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al
> -  *
> -- * This library is free software; you can redistribute it and/or
> -+ * This file is part of FFmpeg.
> -+ *
> -+ * FFmpeg is free software; you can redistribute it and/or
> -  * modify it under the terms of the GNU Lesser General Public
> -  * License as published by the Free Software Foundation; either
> -- * version 2 of the License, or (at your option) any later version.
> -+ * version 2.1 of the License, or (at your option) any later version.
> -  *
> -- * This library is distributed in the hope that it will be useful,
> -+ * FFmpeg 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
> -  * Lesser General Public License for more details.
> -  *
> -  * You should have received a copy of the GNU Lesser General Public
> -- * License along with this library; if not, write to the Free Software
> -+ * License along with FFmpeg; if not, write to the Free Software
> -  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> -  */
> - 
> -@@ -39,9 +41,9 @@
> - #   define MAC16(rt, ra, rb) \
> -         asm ("smlabb %0, %2, %3, %0" : "=r" (rt) : "0" (rt), "r" (ra), "r" (rb));
> - /* signed 16x16 -> 32 multiply */
> --#   define MUL16(ra, rb) \
> --        ({ int __rt;\
> --         asm ("smulbb %0, %1, %2" : "=r" (__rt) : "r" (ra), "r" (rb));
> -+#   define MUL16(ra, rb)                                                \
> -+        ({ int __rt;                                                    \
> -+         asm ("smulbb %0, %1, %2" : "=r" (__rt) : "r" (ra), "r" (rb));  \
> -          __rt; })
> - 
> - #endif
> -diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/mpegvideo_arm.c gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/mpegvideo_arm.c
> ---- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/mpegvideo_arm.c	2006-02-19 00:04:59.000000000 +0100
> -+++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/mpegvideo_arm.c	2007-05-01 12:23:40.000000000 +0200
> -@@ -1,25 +1,27 @@
> - /*
> -  * Copyright (c) 2002 Michael Niedermayer
> -  *
> -- * This library is free software; you can redistribute it and/or
> -+ * This file is part of FFmpeg.
> -+ *
> -+ * FFmpeg is free software; you can redistribute it and/or
> -  * modify it under the terms of the GNU Lesser General Public
> -  * License as published by the Free Software Foundation; either
> -- * version 2 of the License, or (at your option) any later version.
> -+ * version 2.1 of the License, or (at your option) any later version.
> -  *
> -- * This library is distributed in the hope that it will be useful,
> -+ * FFmpeg 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
> -  * Lesser General Public License for more details.
> -  *
> -  * You should have received a copy of the GNU Lesser General Public
> -- * License along with this library; if not, write to the Free Software
> -+ * License along with FFmpeg; if not, write to the Free Software
> -  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> -  *
> -  */
> - 
> --#include "dsputil.h"
> --#include "mpegvideo.h"
> --#include "avcodec.h"
> -+#include "../dsputil.h"
> -+#include "../mpegvideo.h"
> -+#include "../avcodec.h"
> - 
> - extern void MPV_common_init_iwmmxt(MpegEncContext *s);
> - 
> -diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/mpegvideo_iwmmxt.c gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/mpegvideo_iwmmxt.c
> ---- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/mpegvideo_iwmmxt.c	2006-09-20 20:55:37.000000000 +0200
> -+++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/mpegvideo_iwmmxt.c	2007-05-01 12:23:40.000000000 +0200
> -@@ -1,18 +1,20 @@
> - /*
> -  * copyright (c) 2004 AGAWA Koji
> -  *
> -- * This library is free software; you can redistribute it and/or
> -+ * This file is part of FFmpeg.
> -+ *
> -+ * FFmpeg is free software; you can redistribute it and/or
> -  * modify it under the terms of the GNU Lesser General Public
> -  * License as published by the Free Software Foundation; either
> -- * version 2 of the License, or (at your option) any later version.
> -+ * version 2.1 of the License, or (at your option) any later version.
> -  *
> -- * This library is distributed in the hope that it will be useful,
> -+ * FFmpeg 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
> -  * Lesser General Public License for more details.
> -  *
> -  * You should have received a copy of the GNU Lesser General Public
> -- * License along with this library; if not, write to the Free Software
> -+ * License along with FFmpeg; if not, write to the Free Software
> -  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> -  */
> - 
> -diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/simple_idct_arm.S gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/simple_idct_arm.S
> ---- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/simple_idct_arm.S	2006-09-20 20:55:37.000000000 +0200
> -+++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/simple_idct_arm.S	2007-05-01 12:23:40.000000000 +0200
> -@@ -5,18 +5,20 @@
> -  *
> -  * Author: Frederic Boulay <dilb@handhelds.org>
> -  *
> -- * This library is free software; you can redistribute it and/or
> -+ * This file is part of FFmpeg.
> -+ *
> -+ * FFmpeg is free software; you can redistribute it and/or
> -  * modify it under the terms of the GNU Lesser General Public
> -  * License as published by the Free Software Foundation; either
> -- * version 2 of the License, or (at your option) any later version.
> -+ * version 2.1 of the License, or (at your option) any later version.
> -  *
> -- * This library is distributed in the hope that it will be useful,
> -+ * FFmpeg 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
> -  * Lesser General Public License for more details.
> -  *
> -  * You should have received a copy of the GNU Lesser General Public
> -- * License along with this library; if not, write to the Free Software
> -+ * License along with FFmpeg; if not, write to the Free Software
> -  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> -  *
> -  * The function defined in this file, is derived from the simple_idct function
> -diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/simple_idct_armv5te.S gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/simple_idct_armv5te.S
> ---- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/simple_idct_armv5te.S	1970-01-01 01:00:00.000000000 +0100
> -+++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/simple_idct_armv5te.S	2007-05-01 12:23:40.000000000 +0200
> -@@ -0,0 +1,718 @@
> -+/*
> -+ * Simple IDCT
> -+ *
> -+ * Copyright (c) 2001 Michael Niedermayer <michaelni@gmx.at>
> -+ * Copyright (c) 2006 Mans Rullgard <mru@inprovide.com>
> -+ *
> -+ * This file is part of FFmpeg.
> -+ *
> -+ * FFmpeg is free software; you can redistribute it and/or
> -+ * modify it under the terms of the GNU Lesser General Public
> -+ * License as published by the Free Software Foundation; either
> -+ * version 2.1 of the License, or (at your option) any later version.
> -+ *
> -+ * FFmpeg 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
> -+ * Lesser General Public License for more details.
> -+ *
> -+ * You should have received a copy of the GNU Lesser General Public
> -+ * License along with FFmpeg; if not, write to the Free Software
> -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> -+ */
> -+
> -+#define W1  22725   /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
> -+#define W2  21407   /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
> -+#define W3  19266   /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
> -+#define W4  16383   /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
> -+#define W5  12873   /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
> -+#define W6  8867    /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
> -+#define W7  4520    /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
> -+#define ROW_SHIFT 11
> -+#define COL_SHIFT 20
> -+
> -+#define W13 (W1 | (W3 << 16))
> -+#define W26 (W2 | (W6 << 16))
> -+#define W57 (W5 | (W7 << 16))
> -+
> -+        .text
> -+        .align
> -+w13:    .long W13
> -+w26:    .long W26
> -+w57:    .long W57
> -+
> -+        .align
> -+        .func idct_row_armv5te
> -+idct_row_armv5te:
> -+        str    lr, [sp, #-4]!
> -+
> -+        ldrd   v1, [a1, #8]
> -+        ldrd   a3, [a1]              /* a3 = row[1:0], a4 = row[3:2] */
> -+        orrs   v1, v1, v2
> -+        cmpeq  v1, a4
> -+        cmpeq  v1, a3, lsr #16
> -+        beq    row_dc_only
> -+
> -+        mov    v1, #(1<<(ROW_SHIFT-1))
> -+        mov    ip, #16384
> -+        sub    ip, ip, #1            /* ip = W4 */
> -+        smlabb v1, ip, a3, v1        /* v1 = W4*row[0]+(1<<(RS-1)) */
> -+        ldr    ip, [pc, #(w26-.-8)]  /* ip = W2 | (W6 << 16) */
> -+        smultb a2, ip, a4
> -+        smulbb lr, ip, a4
> -+        add    v2, v1, a2
> -+        sub    v3, v1, a2
> -+        sub    v4, v1, lr
> -+        add    v1, v1, lr
> -+
> -+        ldr    ip, [pc, #(w13-.-8)]  /* ip = W1 | (W3 << 16) */
> -+        ldr    lr, [pc, #(w57-.-8)]  /* lr = W5 | (W7 << 16) */
> -+        smulbt v5, ip, a3
> -+        smultt v6, lr, a4
> -+        smlatt v5, ip, a4, v5
> -+        smultt a2, ip, a3
> -+        smulbt v7, lr, a3
> -+        sub    v6, v6, a2
> -+        smulbt a2, ip, a4
> -+        smultt fp, lr, a3
> -+        sub    v7, v7, a2
> -+        smulbt a2, lr, a4
> -+        ldrd   a3, [a1, #8]          /* a3=row[5:4] a4=row[7:6] */
> -+        sub    fp, fp, a2
> -+
> -+        orrs   a2, a3, a4
> -+        beq    1f
> -+
> -+        smlabt v5, lr, a3, v5
> -+        smlabt v6, ip, a3, v6
> -+        smlatt v5, lr, a4, v5
> -+        smlabt v6, lr, a4, v6
> -+        smlatt v7, lr, a3, v7
> -+        smlatt fp, ip, a3, fp
> -+        smulbt a2, ip, a4
> -+        smlatt v7, ip, a4, v7
> -+        sub    fp, fp, a2
> -+
> -+        ldr    ip, [pc, #(w26-.-8)]  /* ip = W2 | (W6 << 16) */
> -+        mov    a2, #16384
> -+        sub    a2, a2, #1            /* a2 =  W4 */
> -+        smulbb a2, a2, a3            /* a2 =  W4*row[4] */
> -+        smultb lr, ip, a4            /* lr =  W6*row[6] */
> -+        add    v1, v1, a2            /* v1 += W4*row[4] */
> -+        add    v1, v1, lr            /* v1 += W6*row[6] */
> -+        add    v4, v4, a2            /* v4 += W4*row[4] */
> -+        sub    v4, v4, lr            /* v4 -= W6*row[6] */
> -+        smulbb lr, ip, a4            /* lr =  W2*row[6] */
> -+        sub    v2, v2, a2            /* v2 -= W4*row[4] */
> -+        sub    v2, v2, lr            /* v2 -= W2*row[6] */
> -+        sub    v3, v3, a2            /* v3 -= W4*row[4] */
> -+        add    v3, v3, lr            /* v3 += W2*row[6] */
> -+
> -+1:      add    a2, v1, v5
> -+        mov    a3, a2, lsr #11
> -+        bic    a3, a3, #0x1f0000
> -+        sub    a2, v2, v6
> -+        mov    a2, a2, lsr #11
> -+        add    a3, a3, a2, lsl #16
> -+        add    a2, v3, v7
> -+        mov    a4, a2, lsr #11
> -+        bic    a4, a4, #0x1f0000
> -+        add    a2, v4, fp
> -+        mov    a2, a2, lsr #11
> -+        add    a4, a4, a2, lsl #16
> -+        strd   a3, [a1]
> -+
> -+        sub    a2, v4, fp
> -+        mov    a3, a2, lsr #11
> -+        bic    a3, a3, #0x1f0000
> -+        sub    a2, v3, v7
> -+        mov    a2, a2, lsr #11
> -+        add    a3, a3, a2, lsl #16
> -+        add    a2, v2, v6
> -+        mov    a4, a2, lsr #11
> -+        bic    a4, a4, #0x1f0000
> -+        sub    a2, v1, v5
> -+        mov    a2, a2, lsr #11
> -+        add    a4, a4, a2, lsl #16
> -+        strd   a3, [a1, #8]
> -+
> -+        ldr    pc, [sp], #4
> -+
> -+row_dc_only:
> -+        orr    a3, a3, a3, lsl #16
> -+        bic    a3, a3, #0xe000
> -+        mov    a3, a3, lsl #3
> -+        mov    a4, a3
> -+        strd   a3, [a1]
> -+        strd   a3, [a1, #8]
> -+
> -+        ldr    pc, [sp], #4
> -+        .endfunc
> -+
> -+        .macro idct_col
> -+        ldr    a4, [a1]              /* a4 = col[1:0] */
> -+        mov    ip, #16384
> -+        sub    ip, ip, #1            /* ip = W4 */
> -+#if 0
> -+        mov    v1, #(1<<(COL_SHIFT-1))
> -+        smlabt v2, ip, a4, v1        /* v2 = W4*col[1] + (1<<(COL_SHIFT-1)) */
> -+        smlabb v1, ip, a4, v1        /* v1 = W4*col[0] + (1<<(COL_SHIFT-1)) */
> -+        ldr    a4, [a1, #(16*4)]
> -+#else
> -+        mov    v1, #((1<<(COL_SHIFT-1))/W4) /* this matches the C version */
> -+        add    v2, v1, a4, asr #16
> -+        rsb    v2, v2, v2, lsl #14
> -+        mov    a4, a4, lsl #16
> -+        add    v1, v1, a4, asr #16
> -+        ldr    a4, [a1, #(16*4)]
> -+        rsb    v1, v1, v1, lsl #14
> -+#endif
> -+
> -+        smulbb lr, ip, a4
> -+        smulbt a3, ip, a4
> -+        sub    v3, v1, lr
> -+        sub    v5, v1, lr
> -+        add    v7, v1, lr
> -+        add    v1, v1, lr
> -+        sub    v4, v2, a3
> -+        sub    v6, v2, a3
> -+        add    fp, v2, a3
> -+        ldr    ip, [pc, #(w26-.-8)]
> -+        ldr    a4, [a1, #(16*2)]
> -+        add    v2, v2, a3
> -+
> -+        smulbb lr, ip, a4
> -+        smultb a3, ip, a4
> -+        add    v1, v1, lr
> -+        sub    v7, v7, lr
> -+        add    v3, v3, a3
> -+        sub    v5, v5, a3
> -+        smulbt lr, ip, a4
> -+        smultt a3, ip, a4
> -+        add    v2, v2, lr
> -+        sub    fp, fp, lr
> -+        add    v4, v4, a3
> -+        ldr    a4, [a1, #(16*6)]
> -+        sub    v6, v6, a3
> -+
> -+        smultb lr, ip, a4
> -+        smulbb a3, ip, a4
> -+        add    v1, v1, lr
> -+        sub    v7, v7, lr
> -+        sub    v3, v3, a3
> -+        add    v5, v5, a3
> -+        smultt lr, ip, a4
> -+        smulbt a3, ip, a4
> -+        add    v2, v2, lr
> -+        sub    fp, fp, lr
> -+        sub    v4, v4, a3
> -+        add    v6, v6, a3
> -+
> -+        stmfd  sp!, {v1, v2, v3, v4, v5, v6, v7, fp}
> -+
> -+        ldr    ip, [pc, #(w13-.-8)]
> -+        ldr    a4, [a1, #(16*1)]
> -+        ldr    lr, [pc, #(w57-.-8)]
> -+        smulbb v1, ip, a4
> -+        smultb v3, ip, a4
> -+        smulbb v5, lr, a4
> -+        smultb v7, lr, a4
> -+        smulbt v2, ip, a4
> -+        smultt v4, ip, a4
> -+        smulbt v6, lr, a4
> -+        smultt fp, lr, a4
> -+        rsb    v4, v4, #0
> -+        ldr    a4, [a1, #(16*3)]
> -+        rsb    v3, v3, #0
> -+
> -+        smlatb v1, ip, a4, v1
> -+        smlatb v3, lr, a4, v3
> -+        smulbb a3, ip, a4
> -+        smulbb a2, lr, a4
> -+        sub    v5, v5, a3
> -+        sub    v7, v7, a2
> -+        smlatt v2, ip, a4, v2
> -+        smlatt v4, lr, a4, v4
> -+        smulbt a3, ip, a4
> -+        smulbt a2, lr, a4
> -+        sub    v6, v6, a3
> -+        ldr    a4, [a1, #(16*5)]
> -+        sub    fp, fp, a2
> -+
> -+        smlabb v1, lr, a4, v1
> -+        smlabb v3, ip, a4, v3
> -+        smlatb v5, lr, a4, v5
> -+        smlatb v7, ip, a4, v7
> -+        smlabt v2, lr, a4, v2
> -+        smlabt v4, ip, a4, v4
> -+        smlatt v6, lr, a4, v6
> -+        ldr    a3, [a1, #(16*7)]
> -+        smlatt fp, ip, a4, fp
> -+
> -+        smlatb v1, lr, a3, v1
> -+        smlabb v3, lr, a3, v3
> -+        smlatb v5, ip, a3, v5
> -+        smulbb a4, ip, a3
> -+        smlatt v2, lr, a3, v2
> -+        sub    v7, v7, a4
> -+        smlabt v4, lr, a3, v4
> -+        smulbt a4, ip, a3
> -+        smlatt v6, ip, a3, v6
> -+        sub    fp, fp, a4
> -+        .endm
> -+
> -+        .align
> -+        .func idct_col_armv5te
> -+idct_col_armv5te:
> -+        str    lr, [sp, #-4]!
> -+
> -+        idct_col
> -+
> -+        ldmfd  sp!, {a3, a4}
> -+        adds   a2, a3, v1
> -+        mov    a2, a2, lsr #20
> -+        orrmi  a2, a2, #0xf000
> -+        add    ip, a4, v2
> -+        mov    ip, ip, asr #20
> -+        orr    a2, a2, ip, lsl #16
> -+        str    a2, [a1]
> -+        subs   a3, a3, v1
> -+        mov    a2, a3, lsr #20
> -+        orrmi  a2, a2, #0xf000
> -+        sub    a4, a4, v2
> -+        mov    a4, a4, asr #20
> -+        orr    a2, a2, a4, lsl #16
> -+        ldmfd  sp!, {a3, a4}
> -+        str    a2, [a1, #(16*7)]
> -+
> -+        subs   a2, a3, v3
> -+        mov    a2, a2, lsr #20
> -+        orrmi  a2, a2, #0xf000
> -+        sub    ip, a4, v4
> -+        mov    ip, ip, asr #20
> -+        orr    a2, a2, ip, lsl #16
> -+        str    a2, [a1, #(16*1)]
> -+        adds   a3, a3, v3
> -+        mov    a2, a3, lsr #20
> -+        orrmi  a2, a2, #0xf000
> -+        add    a4, a4, v4
> -+        mov    a4, a4, asr #20
> -+        orr    a2, a2, a4, lsl #16
> -+        ldmfd  sp!, {a3, a4}
> -+        str    a2, [a1, #(16*6)]
> -+
> -+        adds   a2, a3, v5
> -+        mov    a2, a2, lsr #20
> -+        orrmi  a2, a2, #0xf000
> -+        add    ip, a4, v6
> -+        mov    ip, ip, asr #20
> -+        orr    a2, a2, ip, lsl #16
> -+        str    a2, [a1, #(16*2)]
> -+        subs   a3, a3, v5
> -+        mov    a2, a3, lsr #20
> -+        orrmi  a2, a2, #0xf000
> -+        sub    a4, a4, v6
> -+        mov    a4, a4, asr #20
> -+        orr    a2, a2, a4, lsl #16
> -+        ldmfd  sp!, {a3, a4}
> -+        str    a2, [a1, #(16*5)]
> -+
> -+        adds   a2, a3, v7
> -+        mov    a2, a2, lsr #20
> -+        orrmi  a2, a2, #0xf000
> -+        add    ip, a4, fp
> -+        mov    ip, ip, asr #20
> -+        orr    a2, a2, ip, lsl #16
> -+        str    a2, [a1, #(16*3)]
> -+        subs   a3, a3, v7
> -+        mov    a2, a3, lsr #20
> -+        orrmi  a2, a2, #0xf000
> -+        sub    a4, a4, fp
> -+        mov    a4, a4, asr #20
> -+        orr    a2, a2, a4, lsl #16
> -+        str    a2, [a1, #(16*4)]
> -+
> -+        ldr    pc, [sp], #4
> -+        .endfunc
> -+
> -+        .align
> -+        .func idct_col_put_armv5te
> -+idct_col_put_armv5te:
> -+        str    lr, [sp, #-4]!
> -+
> -+        idct_col
> -+
> -+        ldmfd  sp!, {a3, a4}
> -+        ldr    lr, [sp, #32]
> -+        add    a2, a3, v1
> -+        movs   a2, a2, asr #20
> -+        movmi  a2, #0
> -+        cmp    a2, #255
> -+        movgt  a2, #255
> -+        add    ip, a4, v2
> -+        movs   ip, ip, asr #20
> -+        movmi  ip, #0
> -+        cmp    ip, #255
> -+        movgt  ip, #255
> -+        orr    a2, a2, ip, lsl #8
> -+        sub    a3, a3, v1
> -+        movs   a3, a3, asr #20
> -+        movmi  a3, #0
> -+        cmp    a3, #255
> -+        movgt  a3, #255
> -+        sub    a4, a4, v2
> -+        movs   a4, a4, asr #20
> -+        movmi  a4, #0
> -+        cmp    a4, #255
> -+        ldr    v1, [sp, #28]
> -+        movgt  a4, #255
> -+        strh   a2, [v1]
> -+        add    a2, v1, #2
> -+        str    a2, [sp, #28]
> -+        orr    a2, a3, a4, lsl #8
> -+        rsb    v2, lr, lr, lsl #3
> -+        ldmfd  sp!, {a3, a4}
> -+        strh   a2, [v2, v1]!
> -+
> -+        sub    a2, a3, v3
> -+        movs   a2, a2, asr #20
> -+        movmi  a2, #0
> -+        cmp    a2, #255
> -+        movgt  a2, #255
> -+        sub    ip, a4, v4
> -+        movs   ip, ip, asr #20
> -+        movmi  ip, #0
> -+        cmp    ip, #255
> -+        movgt  ip, #255
> -+        orr    a2, a2, ip, lsl #8
> -+        strh   a2, [v1, lr]!
> -+        add    a3, a3, v3
> -+        movs   a2, a3, asr #20
> -+        movmi  a2, #0
> -+        cmp    a2, #255
> -+        movgt  a2, #255
> -+        add    a4, a4, v4
> -+        movs   a4, a4, asr #20
> -+        movmi  a4, #0
> -+        cmp    a4, #255
> -+        movgt  a4, #255
> -+        orr    a2, a2, a4, lsl #8
> -+        ldmfd  sp!, {a3, a4}
> -+        strh   a2, [v2, -lr]!
> -+
> -+        add    a2, a3, v5
> -+        movs   a2, a2, asr #20
> -+        movmi  a2, #0
> -+        cmp    a2, #255
> -+        movgt  a2, #255
> -+        add    ip, a4, v6
> -+        movs   ip, ip, asr #20
> -+        movmi  ip, #0
> -+        cmp    ip, #255
> -+        movgt  ip, #255
> -+        orr    a2, a2, ip, lsl #8
> -+        strh   a2, [v1, lr]!
> -+        sub    a3, a3, v5
> -+        movs   a2, a3, asr #20
> -+        movmi  a2, #0
> -+        cmp    a2, #255
> -+        movgt  a2, #255
> -+        sub    a4, a4, v6
> -+        movs   a4, a4, asr #20
> -+        movmi  a4, #0
> -+        cmp    a4, #255
> -+        movgt  a4, #255
> -+        orr    a2, a2, a4, lsl #8
> -+        ldmfd  sp!, {a3, a4}
> -+        strh   a2, [v2, -lr]!
> -+
> -+        add    a2, a3, v7
> -+        movs   a2, a2, asr #20
> -+        movmi  a2, #0
> -+        cmp    a2, #255
> -+        movgt  a2, #255
> -+        add    ip, a4, fp
> -+        movs   ip, ip, asr #20
> -+        movmi  ip, #0
> -+        cmp    ip, #255
> -+        movgt  ip, #255
> -+        orr    a2, a2, ip, lsl #8
> -+        strh   a2, [v1, lr]
> -+        sub    a3, a3, v7
> -+        movs   a2, a3, asr #20
> -+        movmi  a2, #0
> -+        cmp    a2, #255
> -+        movgt  a2, #255
> -+        sub    a4, a4, fp
> -+        movs   a4, a4, asr #20
> -+        movmi  a4, #0
> -+        cmp    a4, #255
> -+        movgt  a4, #255
> -+        orr    a2, a2, a4, lsl #8
> -+        strh   a2, [v2, -lr]
> -+
> -+        ldr    pc, [sp], #4
> -+        .endfunc
> -+
> -+        .align
> -+        .func idct_col_add_armv5te
> -+idct_col_add_armv5te:
> -+        str    lr, [sp, #-4]!
> -+
> -+        idct_col
> -+
> -+        ldr    lr, [sp, #36]
> -+
> -+        ldmfd  sp!, {a3, a4}
> -+        ldrh   ip, [lr]
> -+        add    a2, a3, v1
> -+        mov    a2, a2, asr #20
> -+        sub    a3, a3, v1
> -+        and    v1, ip, #255
> -+        adds   a2, a2, v1
> -+        movmi  a2, #0
> -+        cmp    a2, #255
> -+        movgt  a2, #255
> -+        add    v1, a4, v2
> -+        mov    v1, v1, asr #20
> -+        adds   v1, v1, ip, lsr #8
> -+        movmi  v1, #0
> -+        cmp    v1, #255
> -+        movgt  v1, #255
> -+        orr    a2, a2, v1, lsl #8
> -+        ldr    v1, [sp, #32]
> -+        sub    a4, a4, v2
> -+        rsb    v2, v1, v1, lsl #3
> -+        ldrh   ip, [v2, lr]!
> -+        strh   a2, [lr]
> -+        mov    a3, a3, asr #20
> -+        and    a2, ip, #255
> -+        adds   a3, a3, a2
> -+        movmi  a3, #0
> -+        cmp    a3, #255
> -+        movgt  a3, #255
> -+        mov    a4, a4, asr #20
> -+        adds   a4, a4, ip, lsr #8
> -+        movmi  a4, #0
> -+        cmp    a4, #255
> -+        movgt  a4, #255
> -+        add    a2, lr, #2
> -+        str    a2, [sp, #28]
> -+        orr    a2, a3, a4, lsl #8
> -+        strh   a2, [v2]
> -+
> -+        ldmfd  sp!, {a3, a4}
> -+        ldrh   ip, [lr, v1]!
> -+        sub    a2, a3, v3
> -+        mov    a2, a2, asr #20
> -+        add    a3, a3, v3
> -+        and    v3, ip, #255
> -+        adds   a2, a2, v3
> -+        movmi  a2, #0
> -+        cmp    a2, #255
> -+        movgt  a2, #255
> -+        sub    v3, a4, v4
> -+        mov    v3, v3, asr #20
> -+        adds   v3, v3, ip, lsr #8
> -+        movmi  v3, #0
> -+        cmp    v3, #255
> -+        movgt  v3, #255
> -+        orr    a2, a2, v3, lsl #8
> -+        add    a4, a4, v4
> -+        ldrh   ip, [v2, -v1]!
> -+        strh   a2, [lr]
> -+        mov    a3, a3, asr #20
> -+        and    a2, ip, #255
> -+        adds   a3, a3, a2
> -+        movmi  a3, #0
> -+        cmp    a3, #255
> -+        movgt  a3, #255
> -+        mov    a4, a4, asr #20
> -+        adds   a4, a4, ip, lsr #8
> -+        movmi  a4, #0
> -+        cmp    a4, #255
> -+        movgt  a4, #255
> -+        orr    a2, a3, a4, lsl #8
> -+        strh   a2, [v2]
> -+
> -+        ldmfd  sp!, {a3, a4}
> -+        ldrh   ip, [lr, v1]!
> -+        add    a2, a3, v5
> -+        mov    a2, a2, asr #20
> -+        sub    a3, a3, v5
> -+        and    v3, ip, #255
> -+        adds   a2, a2, v3
> -+        movmi  a2, #0
> -+        cmp    a2, #255
> -+        movgt  a2, #255
> -+        add    v3, a4, v6
> -+        mov    v3, v3, asr #20
> -+        adds   v3, v3, ip, lsr #8
> -+        movmi  v3, #0
> -+        cmp    v3, #255
> -+        movgt  v3, #255
> -+        orr    a2, a2, v3, lsl #8
> -+        sub    a4, a4, v6
> -+        ldrh   ip, [v2, -v1]!
> -+        strh   a2, [lr]
> -+        mov    a3, a3, asr #20
> -+        and    a2, ip, #255
> -+        adds   a3, a3, a2
> -+        movmi  a3, #0
> -+        cmp    a3, #255
> -+        movgt  a3, #255
> -+        mov    a4, a4, asr #20
> -+        adds   a4, a4, ip, lsr #8
> -+        movmi  a4, #0
> -+        cmp    a4, #255
> -+        movgt  a4, #255
> -+        orr    a2, a3, a4, lsl #8
> -+        strh   a2, [v2]
> -+
> -+        ldmfd  sp!, {a3, a4}
> -+        ldrh   ip, [lr, v1]!
> -+        add    a2, a3, v7
> -+        mov    a2, a2, asr #20
> -+        sub    a3, a3, v7
> -+        and    v3, ip, #255
> -+        adds   a2, a2, v3
> -+        movmi  a2, #0
> -+        cmp    a2, #255
> -+        movgt  a2, #255
> -+        add    v3, a4, fp
> -+        mov    v3, v3, asr #20
> -+        adds   v3, v3, ip, lsr #8
> -+        movmi  v3, #0
> -+        cmp    v3, #255
> -+        movgt  v3, #255
> -+        orr    a2, a2, v3, lsl #8
> -+        sub    a4, a4, fp
> -+        ldrh   ip, [v2, -v1]!
> -+        strh   a2, [lr]
> -+        mov    a3, a3, asr #20
> -+        and    a2, ip, #255
> -+        adds   a3, a3, a2
> -+        movmi  a3, #0
> -+        cmp    a3, #255
> -+        movgt  a3, #255
> -+        mov    a4, a4, asr #20
> -+        adds   a4, a4, ip, lsr #8
> -+        movmi  a4, #0
> -+        cmp    a4, #255
> -+        movgt  a4, #255
> -+        orr    a2, a3, a4, lsl #8
> -+        strh   a2, [v2]
> -+
> -+        ldr    pc, [sp], #4
> -+        .endfunc
> -+
> -+        .align
> -+        .global simple_idct_armv5te
> -+        .func simple_idct_armv5te
> -+simple_idct_armv5te:
> -+        stmfd  sp!, {v1, v2, v3, v4, v5, v6, v7, fp, lr}
> -+
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+
> -+        sub    a1, a1, #(16*7)
> -+
> -+        bl     idct_col_armv5te
> -+        add    a1, a1, #4
> -+        bl     idct_col_armv5te
> -+        add    a1, a1, #4
> -+        bl     idct_col_armv5te
> -+        add    a1, a1, #4
> -+        bl     idct_col_armv5te
> -+
> -+        ldmfd  sp!, {v1, v2, v3, v4, v5, v6, v7, fp, pc}
> -+        .endfunc
> -+
> -+        .align
> -+        .global simple_idct_add_armv5te
> -+        .func simple_idct_add_armv5te
> -+simple_idct_add_armv5te:
> -+        stmfd  sp!, {a1, a2, v1, v2, v3, v4, v5, v6, v7, fp, lr}
> -+
> -+        mov    a1, a3
> -+
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+
> -+        sub    a1, a1, #(16*7)
> -+
> -+        bl     idct_col_add_armv5te
> -+        add    a1, a1, #4
> -+        bl     idct_col_add_armv5te
> -+        add    a1, a1, #4
> -+        bl     idct_col_add_armv5te
> -+        add    a1, a1, #4
> -+        bl     idct_col_add_armv5te
> -+
> -+        add    sp, sp, #8
> -+        ldmfd  sp!, {v1, v2, v3, v4, v5, v6, v7, fp, pc}
> -+        .endfunc
> -+
> -+        .align
> -+        .global simple_idct_put_armv5te
> -+        .func simple_idct_put_armv5te
> -+simple_idct_put_armv5te:
> -+        stmfd  sp!, {a1, a2, v1, v2, v3, v4, v5, v6, v7, fp, lr}
> -+
> -+        mov    a1, a3
> -+
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+        add    a1, a1, #16
> -+        bl     idct_row_armv5te
> -+
> -+        sub    a1, a1, #(16*7)
> -+
> -+        bl     idct_col_put_armv5te
> -+        add    a1, a1, #4
> -+        bl     idct_col_put_armv5te
> -+        add    a1, a1, #4
> -+        bl     idct_col_put_armv5te
> -+        add    a1, a1, #4
> -+        bl     idct_col_put_armv5te
> -+
> -+        add    sp, sp, #8
> -+        ldmfd  sp!, {v1, v2, v3, v4, v5, v6, v7, fp, pc}
> -+        .endfunc
> -diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/avcodec.h gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/avcodec.h
> ---- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/avcodec.h	2006-09-20 20:55:36.000000000 +0200
> -+++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/avcodec.h	2007-05-01 12:23:40.000000000 +0200
> -@@ -1217,6 +1217,7 @@
> - #define FF_IDCT_IPP          13
> - #define FF_IDCT_XVIDMMX      14
> - #define FF_IDCT_CAVS         15
> -+#define FF_IDCT_SIMPLEARMV5TE 16
> - 
> -     /**
> -      * slice count.
> -diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/Makefile.am gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/Makefile.am
> ---- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/Makefile.am	2006-09-22 06:07:23.000000000 +0200
> -+++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/Makefile.am	2007-05-01 12:23:40.000000000 +0200
> -@@ -19,7 +19,10 @@
> - if HAVE_IWMMXT
> - iwmmxt_libs = armv4l/libiwmmxt.la
> - endif
> --armv4l_libs = armv4l/libarmv4l.la $(iwmmxt_libs)
> -+if HAVE_ARMV5TE
> -+armv5te_libs = armv4l/libarmv5te.la
> -+endif
> -+armv4l_libs = armv4l/libarmv4l.la $(iwmmxt_libs) $(armv5te_libs)
> - armv4l_dirs = armv4l
> - endif
> - 
> diff --git a/recipes/gstreamer/gst-ffmpeg/autotools.patch b/recipes/gstreamer/gst-ffmpeg/autotools.patch
> deleted file mode 100644
> index 76e7ac6..0000000
> --- a/recipes/gstreamer/gst-ffmpeg/autotools.patch
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -Index: gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/configure.ac
> -===================================================================
> ---- gst-ffmpeg-0.10.2.orig/gst-libs/ext/ffmpeg/configure.ac	2008-08-20 00:20:19.177850039 +0200
> -+++ gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/configure.ac	2008-08-20 00:26:24.567809464 +0200
> -@@ -27,13 +27,15 @@
> - 
> - AM_MAINTAINER_MODE
> - AC_GNU_SOURCE
> -+
> -+AC_PROG_LIBTOOL
> - AM_PROG_AS
> - AC_PROG_CC
> -+AC_PROG_CXX
> - AC_PROG_INSTALL
> - AC_SYS_LARGEFILE
> - AC_STDC_HEADERS
> - AM_DISABLE_STATIC
> --AC_PROG_LIBTOOL
> - 
> - dnl Warning for anyone using these custom macros.
> - dnl before asking me questions on why it doesn't work and why you
> diff --git a/recipes/gstreamer/gst-ffmpeg_0.10.2.bb b/recipes/gstreamer/gst-ffmpeg_0.10.2.bb
> deleted file mode 100644
> index 5164bbd..0000000
> --- a/recipes/gstreamer/gst-ffmpeg_0.10.2.bb
> +++ /dev/null
> @@ -1,35 +0,0 @@
> -DESCRIPTION = "FFmpeg-based GStreamer plug-in"
> -SECTION = "multimedia"
> -PRIORITY = "optional"
> -LICENSE = "LGPL"
> -HOMEPAGE = "http://www.gstreamer.net/"
> -DEPENDS = "gstreamer gst-plugins-base zlib"
> -PR = "r2"
> -
> -inherit autotools pkgconfig
> -
> -SRC_URI = "http://gstreamer.freedesktop.org/src/${PN}/${PN}-${PV}.tar.bz2 \
> -	   file://armv5.patch \
> -	   file://autotools.patch \
> -          "
> -
> -FILES_${PN} += "${libdir}/gstreamer-0.10/*.so"
> -FILES_${PN}-dbg += "${libdir}/gstreamer-0.10/.debug"
> -FILES_${PN}-dev += "${libdir}/gstreamer-0.10/*.la ${libdir}/gstreamer-0.10/*.a"
> -
> -EXTRA_OECONF = "--disable-sdltest --disable-ffplay --disable-freetypetest \
> -		--disable-vorbis --disable-vorbistest --disable-encoders \
> -		--disable-v4l --disable-audio-oss --disable-dv1394 \
> -		--disable-vhook --disable-ffmpeg --disable-ffserver \
> -		--enable-pp --disable-decoder-vorbis"
> -
> -# We do this because the install program is called with -s which causes it to
> -# call "strip" and it then mangles cross compiled stuff..
> -PATH_prepend := "${TOOLCHAIN_PATH}/${TARGET_SYS}/bin:"
> -
> -# Hack to get STAGING_LIBDIR into the linker path when building ffmpeg
> -CC = "${CCACHE} ${HOST_PREFIX}gcc ${TARGET_CC_ARCH} -L${STAGING_LIBDIR}"
> -
> -
> -SRC_URI[md5sum] = "3c7fb1cd1308b1972a76b86bb29fc890"
> -SRC_URI[sha256sum] = "ffa7c89bccab5d1be53b6fcedcf7a5c071d585cf522fee5864add05d350f5842"
> diff --git a/recipes/gstreamer/gst-plugins-bad_0.10.20.bb b/recipes/gstreamer/gst-plugins-bad_0.10.20.bb
> deleted file mode 100644
> index 17f20eb..0000000
> --- a/recipes/gstreamer/gst-plugins-bad_0.10.20.bb
> +++ /dev/null
> @@ -1,16 +0,0 @@
> -require gst-plugins.inc
> -
> -SRC_URI[archive.md5sum] = "7c84766f6d24f41ba90c3f6141012ab8"
> -SRC_URI[archive.sha256sum] = "1031dff866df976a957f34039addbab4c0753406299a275f4cf1780e1dbe2a90"
> -
> -DEPENDS += "orc-native orc libcdaudio gst-plugins-base openssl directfb libmodplug librsvg"
> -
> -PR = "${INC_PR}.2"
> -
> -# We don't have vdpau headers in OE and it creates crosscompile badness.
> -# Also, mpeg2enc and mplex from mjpegtools don't build, because of AC_TRY_RUN.
> -EXTRA_OECONF += " \
> -        --disable-mpeg2enc \
> -        --disable-mplex \
> -        --disable-vdpau \
> -"
> diff --git a/recipes/gstreamer/gst-plugins-base/fix-playbin2.patch b/recipes/gstreamer/gst-plugins-base/fix-playbin2.patch
> deleted file mode 100644
> index 8aba3b6..0000000
> --- a/recipes/gstreamer/gst-plugins-base/fix-playbin2.patch
> +++ /dev/null
> @@ -1,26 +0,0 @@
> -From 0fe6b6e8abb131471d5bd04d7f7e27ca98a67659 Mon Sep 17 00:00:00 2001
> -From: Brijesh Singh <brijesh.ksingh@gmail.com>
> -Date: Wed, 13 Jan 2010 08:39:54 +0000
> -Subject: playsink: Fix handling of the native audio/video flags
> -
> -Fixes bug #606687.
> ----
> -
> ---- /tmp/gstplaysink.c	2010-01-23 12:23:20.000000000 +0100
> -+++ gst-plugins-base-0.10.25/gst/playback/gstplaysink.c	2010-01-23 12:27:51.000000000 +0100
> -@@ -1880,12 +1880,13 @@
> -      * pick one and ignore the other then instead of erroring out?) */
> -     if (need_text && need_subp)
> -       goto subs_and_text;
> --  } else if (flags & GST_PLAY_FLAG_VIDEO && playsink->video_pad) {
> -+  } else if (((flags & GST_PLAY_FLAG_VIDEO)
> -+          || (flags & GST_PLAY_FLAG_NATIVE_VIDEO)) && playsink->video_pad) {
> -     /* we have video and we are requested to show it */
> -     need_video = TRUE;
> -   }
> -   if (playsink->audio_pad) {
> --    if (flags & GST_PLAY_FLAG_AUDIO) {
> -+    if ((flags & GST_PLAY_FLAG_AUDIO) || (flags & GST_PLAY_FLAG_NATIVE_AUDIO)) {
> -       need_audio = TRUE;
> -     }
> -     if (playsink->audio_pad_raw) {
> diff --git a/recipes/gstreamer/gst-plugins-base/gst-plugins-base_rowstride.patch b/recipes/gstreamer/gst-plugins-base/gst-plugins-base_rowstride.patch
> deleted file mode 100644
> index 3c0cffa..0000000
> --- a/recipes/gstreamer/gst-plugins-base/gst-plugins-base_rowstride.patch
> +++ /dev/null
> @@ -1,1577 +0,0 @@
> -From 32a7af0874fe13774c65919941c3be59b72c646a Mon Sep 17 00:00:00 2001
> -From: Rob Clark <rob@ti.com>
> -Date: Thu, 30 Jul 2009 14:50:05 -0500
> -Subject: [PATCH] add rowstride support to video utility functions
> -
> -This is a combination of 7 commits:
> -* add rowstride support to video utility functions
> -* stridetransform: skeletal implementation of stridetransform element
> -* stridetransform: implement caps negotiation and related parts
> -* stridetransform: implement transform function
> -* audioconvert: add NEON acceleration for some conversions
> -* add gst_stride_transform_transform_size()
> -* fix a small typo..  need to use the smaller of {new_width, orig_width} for the line-by-line copy to avoid overwriting past end of buffer
> ----
> - configure.ac                        |    2 +
> - gst-libs/gst/video/gstvideofilter.c |    8 +-
> - gst-libs/gst/video/video.c          |  234 +++++++++++++++---
> - gst-libs/gst/video/video.h          |   39 ++-
> - gst/audioconvert/Makefile.am        |    1 +
> - gst/audioconvert/armv7.c            |  209 ++++++++++++++++
> - gst/audioconvert/audioconvert.c     |   20 +-
> - gst/audioconvert/gstaudioquantize.c |    4 +-
> - gst/audioconvert/gstchannelmix.c    |    4 +-
> - gst/stride/Makefile.am              |   15 ++
> - gst/stride/gststridetransform.c     |  471 +++++++++++++++++++++++++++++++++++
> - gst/stride/gststridetransform.h     |   80 ++++++
> - gst/stride/plugin.c                 |   45 ++++
> - 13 files changed, 1064 insertions(+), 68 deletions(-)
> - create mode 100644 gst/audioconvert/armv7.c
> - create mode 100644 gst/stride/Makefile.am
> - create mode 100644 gst/stride/gststridetransform.c
> - create mode 100644 gst/stride/gststridetransform.h
> - create mode 100644 gst/stride/plugin.c
> -
> -diff --git a/configure.ac b/configure.ac
> -index 6a39c73..5da8ac2 100644
> ---- a/configure.ac
> -+++ b/configure.ac
> -@@ -319,6 +319,7 @@ AG_GST_CHECK_PLUGIN(ffmpegcolorspace)
> - AG_GST_CHECK_PLUGIN(gdp)
> - AG_GST_CHECK_PLUGIN(playback)
> - AG_GST_CHECK_PLUGIN(audioresample)
> -+AG_GST_CHECK_PLUGIN(stride)
> - AG_GST_CHECK_PLUGIN(subparse)
> - AG_GST_CHECK_PLUGIN(tcp)
> - AG_GST_CHECK_PLUGIN(typefind)
> -@@ -739,6 +740,7 @@ gst/ffmpegcolorspace/Makefile
> - gst/gdp/Makefile
> - gst/playback/Makefile
> - gst/audioresample/Makefile
> -+gst/stride/Makefile
> - gst/subparse/Makefile
> - gst/tcp/Makefile
> - gst/typefind/Makefile
> -diff --git a/gst-libs/gst/video/gstvideofilter.c b/gst-libs/gst/video/gstvideofilter.c
> -index 2d08a60..6b2d7b7 100644
> ---- a/gst-libs/gst/video/gstvideofilter.c
> -+++ b/gst-libs/gst/video/gstvideofilter.c
> -@@ -21,7 +21,7 @@
> -  /**
> -  * SECTION:gstvideofilter
> -  * @short_description: Base class for video filters
> -- * 
> -+ *
> -  * <refsect2>
> -  * <para>
> -  * Provides useful functions and a base class for video filters.
> -@@ -78,14 +78,14 @@ gst_video_filter_get_unit_size (GstBaseTransform * btrans, GstCaps * caps,
> -     guint * size)
> - {
> -   GstVideoFormat fmt;
> --  gint width, height;
> -+  gint width, height, rowstride;
> - 
> --  if (!gst_video_format_parse_caps (caps, &fmt, &width, &height)) {
> -+  if (!gst_video_format_parse_caps_strided (caps, &fmt, &width, &height, &rowstride)) {
> -     GST_WARNING_OBJECT (btrans, "Failed to parse caps %" GST_PTR_FORMAT, caps);
> -     return FALSE;
> -   }
> - 
> --  *size = gst_video_format_get_size (fmt, width, height);
> -+  *size = gst_video_format_get_size_strided (fmt, width, height, rowstride);
> - 
> -   GST_DEBUG_OBJECT (btrans, "Returning size %u bytes for caps %"
> -       GST_PTR_FORMAT, *size, caps);
> -diff --git a/gst-libs/gst/video/video.c b/gst-libs/gst/video/video.c
> -index ab1d8c0..1815bf1 100644
> ---- a/gst-libs/gst/video/video.c
> -+++ b/gst-libs/gst/video/video.c
> -@@ -31,7 +31,7 @@
> -  *
> -  * <refsect2>
> -  * <para>
> -- * This library contains some helper functions and includes the 
> -+ * This library contains some helper functions and includes the
> -  * videosink and videofilter base classes.
> -  * </para>
> -  * </refsect2>
> -@@ -51,7 +51,7 @@ static GstVideoFormat gst_video_format_from_rgb24_masks (int red_mask,
> -  *
> -  * A convenience function to retrieve a GValue holding the framerate
> -  * from the caps on a pad.
> -- * 
> -+ *
> -  * The pad needs to have negotiated caps containing a framerate property.
> -  *
> -  * Returns: NULL if the pad has no configured caps or the configured caps
> -@@ -104,7 +104,7 @@ gst_video_frame_rate (GstPad * pad)
> -  *
> -  * Inspect the caps of the provided pad and retrieve the width and height of
> -  * the video frames it is configured for.
> -- * 
> -+ *
> -  * The pad needs to have negotiated caps containing width and height properties.
> -  *
> -  * Returns: TRUE if the width and height could be retrieved.
> -@@ -156,13 +156,13 @@ gst_video_get_size (GstPad * pad, gint * width, gint * height)
> -  * @display_par_n: Numerator of the pixel aspect ratio of the display device
> -  * @display_par_d: Denominator of the pixel aspect ratio of the display device
> -  *
> -- * Given the Pixel Aspect Ratio and size of an input video frame, and the 
> -- * pixel aspect ratio of the intended display device, calculates the actual 
> -+ * Given the Pixel Aspect Ratio and size of an input video frame, and the
> -+ * pixel aspect ratio of the intended display device, calculates the actual
> -  * display ratio the video will be rendered with.
> -  *
> -- * Returns: A boolean indicating success and a calculated Display Ratio in the 
> -- * dar_n and dar_d parameters. 
> -- * The return value is FALSE in the case of integer overflow or other error. 
> -+ * Returns: A boolean indicating success and a calculated Display Ratio in the
> -+ * dar_n and dar_d parameters.
> -+ * The return value is FALSE in the case of integer overflow or other error.
> -  *
> -  * Since: 0.10.7
> -  */
> -@@ -250,28 +250,15 @@ gst_video_format_parse_caps_interlaced (GstCaps * caps, gboolean * interlaced)
> - }
> - 
> - /**
> -- * gst_video_format_parse_caps:
> -- * @caps: the #GstCaps to parse
> -- * @format: the #GstVideoFormat of the video represented by @caps (output)
> -- * @width: the width of the video represented by @caps, may be NULL (output)
> -- * @height: the height of the video represented by @caps, may be NULL (output)
> -- *
> -- * Determines the #GstVideoFormat of @caps and places it in the location
> -- * pointed to by @format.  Extracts the size of the video and places it
> -- * in the location pointed to by @width and @height.  If @caps does not
> -- * represent one of the raw video formats listed in #GstVideoFormat, the
> -- * function will fail and return FALSE.
> -- *
> -- * Since: 0.10.16
> -- *
> -- * Returns: TRUE if @caps was parsed correctly.
> -+ * see gst_video_format_parse_caps_strided and gst_video_format_parse_caps
> -  */
> --gboolean
> --gst_video_format_parse_caps (GstCaps * caps, GstVideoFormat * format,
> --    int *width, int *height)
> -+static gboolean
> -+parse_caps (GstCaps * caps, GstVideoFormat * format, gint *width, gint *height,
> -+    gboolean stride_ok, gint *rowstride)
> - {
> -   GstStructure *structure;
> -   gboolean ok = TRUE;
> -+  gboolean strided = FALSE;
> - 
> -   if (!gst_caps_is_fixed (caps))
> -     return FALSE;
> -@@ -279,7 +266,10 @@ gst_video_format_parse_caps (GstCaps * caps, GstVideoFormat * format,
> -   structure = gst_caps_get_structure (caps, 0);
> - 
> -   if (format) {
> --    if (gst_structure_has_name (structure, "video/x-raw-yuv")) {
> -+    if (gst_structure_has_name (structure, "video/x-raw-yuv") ||
> -+        (stride_ok &&
> -+            gst_structure_has_name (structure, "video/x-raw-yuv-strided") &&
> -+            (strided=TRUE) /* single '=' intentional */)) {
> -       guint32 fourcc;
> - 
> -       ok &= gst_structure_get_fourcc (structure, "format", &fourcc);
> -@@ -288,7 +278,10 @@ gst_video_format_parse_caps (GstCaps * caps, GstVideoFormat * format,
> -       if (*format == GST_VIDEO_FORMAT_UNKNOWN) {
> -         ok = FALSE;
> -       }
> --    } else if (gst_structure_has_name (structure, "video/x-raw-rgb")) {
> -+    } else if (gst_structure_has_name (structure, "video/x-raw-rgb") ||
> -+        (stride_ok &&
> -+            gst_structure_has_name (structure, "video/x-raw-rgb-strided") &&
> -+            (strided=TRUE) /* single '=' intentional */)) {
> -       int depth;
> -       int bpp;
> -       int endianness;
> -@@ -333,6 +326,10 @@ gst_video_format_parse_caps (GstCaps * caps, GstVideoFormat * format,
> -     }
> -   }
> - 
> -+  /* note: should we require that the caps have these fields, even if
> -+   * the caller does not particularly request them??
> -+   */
> -+
> -   if (width) {
> -     ok &= gst_structure_get_int (structure, "width", width);
> -   }
> -@@ -341,11 +338,70 @@ gst_video_format_parse_caps (GstCaps * caps, GstVideoFormat * format,
> -     ok &= gst_structure_get_int (structure, "height", height);
> -   }
> - 
> -+  if (rowstride) {
> -+    if (strided) {
> -+      ok &= gst_structure_get_int (structure, "rowstride", rowstride);
> -+    } else {
> -+      *rowstride = 0;  /* not a strided format */
> -+    }
> -+  }
> -+
> -   return ok;
> - }
> - 
> - 
> - /**
> -+ * gst_video_format_parse_caps_strided:
> -+ * @caps: the #GstCaps to parse
> -+ * @format: the #GstVideoFormat of the video represented by @caps (output)
> -+ * @width: the width of the video represented by @caps, may be NULL (output)
> -+ * @height: the height of the video represented by @caps, may be NULL (output)
> -+ * @rowstride: the rowstride (in bytes) represented by @caps, or 0 if there
> -+ *    is no rowstride, may be NULL (output)
> -+ *
> -+ * Determines the #GstVideoFormat of @caps and places it in the location
> -+ * pointed to by @format.  Extracts the size of the video and places it
> -+ * in the location pointed to by @width and @height.  Extracts the row-
> -+ * stride and places it in the location pointed to by @rowstride.  If
> -+ * @caps does not represent one of the raw video formats listed in
> -+ * #GstVideoFormat, the function will fail and return FALSE.
> -+ *
> -+ * Since: ???
> -+ *
> -+ * Returns: TRUE if @caps was parsed correctly.
> -+ */
> -+gboolean
> -+gst_video_format_parse_caps_strided (GstCaps * caps, GstVideoFormat * format,
> -+    int *width, int *height, int *rowstride)
> -+{
> -+  return parse_caps (caps, format, width, height, TRUE, rowstride);
> -+}
> -+
> -+/**
> -+ * gst_video_format_parse_caps:
> -+ * @caps: the #GstCaps to parse
> -+ * @format: the #GstVideoFormat of the video represented by @caps (output)
> -+ * @width: the width of the video represented by @caps, may be NULL (output)
> -+ * @height: the height of the video represented by @caps, may be NULL (output)
> -+ *
> -+ * Determines the #GstVideoFormat of @caps and places it in the location
> -+ * pointed to by @format.  Extracts the size of the video and places it
> -+ * in the location pointed to by @width and @height.  If @caps does not
> -+ * represent one of the raw video formats listed in #GstVideoFormat, the
> -+ * function will fail and return FALSE.
> -+ *
> -+ * Since: 0.10.16
> -+ *
> -+ * Returns: TRUE if @caps was parsed correctly.
> -+ */
> -+gboolean
> -+gst_video_format_parse_caps (GstCaps * caps, GstVideoFormat * format,
> -+    int *width, int *height)
> -+{
> -+  return parse_caps (caps, format, width, height, FALSE, NULL);
> -+}
> -+
> -+/**
> -  * gst_video_parse_caps_framerate:
> -  * @caps: pointer to a #GstCaps instance
> -  * @fps_n: pointer to integer to hold numerator of frame rate (output)
> -@@ -444,10 +500,11 @@ gst_video_format_new_caps_interlaced (GstVideoFormat format, int width,
> - }
> - 
> - /**
> -- * gst_video_format_new_caps:
> -+ * gst_video_format_new_caps_strided:
> -  * @format: the #GstVideoFormat describing the raw video format
> -  * @width: width of video
> -  * @height: height of video
> -+ * @rowstride: the rowstride (in bytes), or 0 if no rowstride
> -  * @framerate_n: numerator of frame rate
> -  * @framerate_d: denominator of frame rate
> -  * @par_n: numerator of pixel aspect ratio
> -@@ -455,26 +512,29 @@ gst_video_format_new_caps_interlaced (GstVideoFormat format, int width,
> -  *
> -  * Creates a new #GstCaps object based on the parameters provided.
> -  *
> -- * Since: 0.10.16
> -+ * Since: ???
> -  *
> -  * Returns: a new #GstCaps object, or NULL if there was an error
> -  */
> - GstCaps *
> --gst_video_format_new_caps (GstVideoFormat format, int width, int height,
> -+gst_video_format_new_caps_strided (GstVideoFormat format,
> -+    int width, int height, int rowstride,
> -     int framerate_n, int framerate_d, int par_n, int par_d)
> - {
> -+  GstCaps *caps = NULL;
> -+
> -   g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, NULL);
> -   g_return_val_if_fail (width > 0 && height > 0, NULL);
> - 
> -   if (gst_video_format_is_yuv (format)) {
> --    return gst_caps_new_simple ("video/x-raw-yuv",
> -+    caps = gst_caps_new_simple (
> -+        rowstride ? "video/x-raw-yuv-strided" : "video/x-raw-yuv",
> -         "format", GST_TYPE_FOURCC, gst_video_format_to_fourcc (format),
> -         "width", G_TYPE_INT, width,
> -         "height", G_TYPE_INT, height,
> -         "framerate", GST_TYPE_FRACTION, framerate_n, framerate_d,
> -         "pixel-aspect-ratio", GST_TYPE_FRACTION, par_n, par_d, NULL);
> --  }
> --  if (gst_video_format_is_rgb (format)) {
> -+  } else if (gst_video_format_is_rgb (format)) {
> -     GstCaps *caps;
> -     int red_mask;
> -     int blue_mask;
> -@@ -526,7 +586,8 @@ gst_video_format_new_caps (GstVideoFormat format, int width, int height,
> -         mask >> (8 * gst_video_format_get_component_offset (format, 2, width,
> -             height));
> - 
> --    caps = gst_caps_new_simple ("video/x-raw-rgb",
> -+    caps = gst_caps_new_simple (
> -+        rowstride ? "video/x-raw-rgb-strided" : "video/x-raw-rgb",
> -         "bpp", G_TYPE_INT, bpp,
> -         "depth", G_TYPE_INT, depth,
> -         "endianness", G_TYPE_INT, G_BIG_ENDIAN,
> -@@ -543,9 +604,39 @@ gst_video_format_new_caps (GstVideoFormat format, int width, int height,
> -               height));
> -       gst_caps_set_simple (caps, "alpha_mask", G_TYPE_INT, alpha_mask, NULL);
> -     }
> --    return caps;
> -+  } else {
> -+    return NULL;
> -+  }
> -+
> -+  if (rowstride) {
> -+    gst_caps_set_simple (caps, "rowstride", G_TYPE_INT, rowstride, NULL);
> -   }
> --  return NULL;
> -+
> -+  return caps;
> -+}
> -+
> -+/**
> -+ * gst_video_format_new_caps:
> -+ * @format: the #GstVideoFormat describing the raw video format
> -+ * @width: width of video
> -+ * @height: height of video
> -+ * @framerate_n: numerator of frame rate
> -+ * @framerate_d: denominator of frame rate
> -+ * @par_n: numerator of pixel aspect ratio
> -+ * @par_d: denominator of pixel aspect ratio
> -+ *
> -+ * Creates a new #GstCaps object based on the parameters provided.
> -+ *
> -+ * Since: 0.10.16
> -+ *
> -+ * Returns: a new #GstCaps object, or NULL if there was an error
> -+ */
> -+GstCaps *
> -+gst_video_format_new_caps (GstVideoFormat format, int width, int height,
> -+    int framerate_n, int framerate_d, int par_n, int par_d)
> -+{
> -+  return gst_video_format_new_caps_strided (format, width, height, 0,
> -+      framerate_n, framerate_d, par_n, par_d);
> - }
> - 
> - /**
> -@@ -643,7 +734,7 @@ gst_video_format_to_fourcc (GstVideoFormat format)
> -  * @blue_mask: blue bit mask
> -  *
> -  * Converts red, green, blue bit masks into the corresponding
> -- * #GstVideoFormat.  
> -+ * #GstVideoFormat.
> -  *
> -  * Since: 0.10.16
> -  *
> -@@ -796,7 +887,7 @@ gst_video_format_is_yuv (GstVideoFormat format)
> - /**
> -  * gst_video_format_has_alpha:
> -  * @format: a #GstVideoFormat
> -- * 
> -+ *
> -  * Returns TRUE or FALSE depending on if the video format provides an
> -  * alpha channel.
> -  *
> -@@ -1328,6 +1419,71 @@ gst_video_format_get_size (GstVideoFormat format, int width, int height)
> - }
> - 
> - /**
> -+ * gst_video_format_get_size_strided:
> -+ * @format: a #GstVideoFormat
> -+ * @width: the width of video (in pixels)
> -+ * @height: the height of video (in pixels)
> -+ * @rowstride: the rowstride (in bytes), or 0 if no rowstride (in which
> -+ *    case the returned value is same as #gst_video_format_get_size())
> -+ *
> -+ * Calculates the total number of bytes in the raw video format, for a buffer
> -+ * which may have a rowstride in bytes
> -+ *
> -+ * Since: ???
> -+ *
> -+ * Returns: size (in bytes) of raw video format
> -+ */
> -+int
> -+gst_video_format_get_size_strided (GstVideoFormat format,
> -+    int width, int height, int rowstride)
> -+{
> -+  if(!rowstride)
> -+    return gst_video_format_get_size (format, width, height);
> -+
> -+  g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, 0);
> -+  g_return_val_if_fail (width > 0 && height > 0, 0);
> -+
> -+  switch (format) {
> -+    /* all packed formats have the same calculation, ie. rowstride * height
> -+     */
> -+    case GST_VIDEO_FORMAT_RGBx:
> -+    case GST_VIDEO_FORMAT_BGRx:
> -+    case GST_VIDEO_FORMAT_xRGB:
> -+    case GST_VIDEO_FORMAT_xBGR:
> -+    case GST_VIDEO_FORMAT_RGBA:
> -+    case GST_VIDEO_FORMAT_BGRA:
> -+    case GST_VIDEO_FORMAT_ARGB:
> -+    case GST_VIDEO_FORMAT_ABGR:
> -+    case GST_VIDEO_FORMAT_RGB:
> -+    case GST_VIDEO_FORMAT_BGR:
> -+    case GST_VIDEO_FORMAT_YUY2:
> -+    case GST_VIDEO_FORMAT_YVYU:
> -+    case GST_VIDEO_FORMAT_UYVY:
> -+    case GST_VIDEO_FORMAT_AYUV:
> -+    case GST_VIDEO_FORMAT_v210:
> -+    case GST_VIDEO_FORMAT_v216:
> -+      return GST_ROUND_UP_4 (rowstride * height);
> -+
> -+    /* these planar formats have 2x sub-sampling in the vertical direction,
> -+     * so U/V have half as many rows as Y:
> -+     */
> -+    case GST_VIDEO_FORMAT_I420:
> -+    case GST_VIDEO_FORMAT_YV12:
> -+      return GST_ROUND_UP_4 (2 * rowstride * height);
> -+
> -+    /* these planar formats have no sub-sampling in the vertical direction,
> -+     * so each plane has 'height' number of rows
> -+     */
> -+    case GST_VIDEO_FORMAT_Y41B:
> -+    case GST_VIDEO_FORMAT_Y42B:
> -+    case GST_VIDEO_FORMAT_Y444:
> -+      return GST_ROUND_UP_4 (3 * rowstride * height);
> -+    default:
> -+      return 0;
> -+  }
> -+}
> -+
> -+/**
> -  * gst_video_format_convert:
> -  * @format: a #GstVideoFormat
> -  * @width: the width of video
> -diff --git a/gst-libs/gst/video/video.h b/gst-libs/gst/video/video.h
> -index 162a766..ed20179 100644
> ---- a/gst-libs/gst/video/video.h
> -+++ b/gst-libs/gst/video/video.h
> -@@ -33,7 +33,7 @@ G_BEGIN_DECLS
> -  * @GST_VIDEO_FORMAT_I420: planar 4:2:0 YUV
> -  * @GST_VIDEO_FORMAT_YV12: planar 4:2:0 YVU (like I420 but UV planes swapped)
> -  * @GST_VIDEO_FORMAT_YUY2: packed 4:2:2 YUV (Y0-U0-Y1-V0 Y2-U2-Y3-V2 Y4 ...)
> -- * @GST_VIDEO_FORMAT_UYVY: packed 4:2:2 YUV (U0-Y0-V0-Y1 U2-Y2-V2-Y3 U4 ...) 
> -+ * @GST_VIDEO_FORMAT_UYVY: packed 4:2:2 YUV (U0-Y0-V0-Y1 U2-Y2-V2-Y3 U4 ...)
> -  * @GST_VIDEO_FORMAT_AYUV: packed 4:4:4 YUV with alpha channel (A0-Y0-U0-V0 ...)
> -  * @GST_VIDEO_FORMAT_RGBx: sparse rgb packed into 32 bit, space last
> -  * @GST_VIDEO_FORMAT_BGRx: sparse reverse rgb packed into 32 bit, space last
> -@@ -167,13 +167,13 @@ typedef enum {
> - 
> - #define GST_VIDEO_CAPS_RGBx \
> -     __GST_VIDEO_CAPS_MAKE_32 (1, 2, 3)
> --  
> -+
> - #define GST_VIDEO_CAPS_xRGB \
> -     __GST_VIDEO_CAPS_MAKE_32 (2, 3, 4)
> --  
> -+
> - #define GST_VIDEO_CAPS_BGRx \
> -     __GST_VIDEO_CAPS_MAKE_32 (3, 2, 1)
> --  
> -+
> - #define GST_VIDEO_CAPS_xBGR \
> -     __GST_VIDEO_CAPS_MAKE_32 (4, 3, 2)
> - 
> -@@ -181,13 +181,13 @@ typedef enum {
> - 
> - #define GST_VIDEO_CAPS_RGBA \
> -     __GST_VIDEO_CAPS_MAKE_32A (1, 2, 3, 4)
> --  
> -+
> - #define GST_VIDEO_CAPS_ARGB \
> -     __GST_VIDEO_CAPS_MAKE_32A (2, 3, 4, 1)
> --  
> -+
> - #define GST_VIDEO_CAPS_BGRA \
> -     __GST_VIDEO_CAPS_MAKE_32A (3, 2, 1, 4)
> --  
> -+
> - #define GST_VIDEO_CAPS_ABGR \
> -     __GST_VIDEO_CAPS_MAKE_32A (4, 3, 2, 1)
> - 
> -@@ -203,9 +203,9 @@ typedef enum {
> -   #define GST_VIDEO_CAPS_BGRx_HOST_ENDIAN \
> -       GST_VIDEO_CAPS_xRGB
> - #endif
> --      
> -+
> - /* 15/16 bit */
> --  
> -+
> - #define GST_VIDEO_CAPS_RGB_16                                           \
> -             "video/x-raw-rgb, "                                         \
> -             "bpp = (int) 16, "                                          \
> -@@ -237,6 +237,16 @@ typedef enum {
> -         "height = " GST_VIDEO_SIZE_RANGE ", "                           \
> -         "framerate = " GST_VIDEO_FPS_RANGE
> - 
> -+
> -+#define GST_VIDEO_CAPS_YUV_STRIDED(fourcc, rowstride)                   \
> -+        GST_VIDEO_CAPS_YUV(fourcc) "; "                                 \
> -+        "video/x-raw-yuv-strided, "                                     \
> -+        "format = (fourcc) " fourcc ", "                                \
> -+        "rowstride = (int) " rowstride ", "                             \
> -+        "width = " GST_VIDEO_SIZE_RANGE ", "                            \
> -+        "height = " GST_VIDEO_SIZE_RANGE ", "                           \
> -+        "framerate = " GST_VIDEO_FPS_RANGE
> -+
> - /* buffer flags */
> - 
> - /**
> -@@ -276,13 +286,15 @@ gboolean gst_video_get_size   (GstPad *pad,
> -                                gint   *height);
> - 
> - gboolean gst_video_calculate_display_ratio (guint *dar_n, guint *dar_d,
> --            guint video_width, guint video_height, 
> --            guint video_par_n, guint video_par_d, 
> -+            guint video_width, guint video_height,
> -+            guint video_par_n, guint video_par_d,
> -             guint display_par_n, guint display_par_d);
> - 
> - gboolean gst_video_format_parse_caps (GstCaps *caps, GstVideoFormat *format,
> -     int *width, int *height);
> - gboolean gst_video_format_parse_caps_interlaced (GstCaps *caps, gboolean *interlaced);
> -+gboolean gst_video_format_parse_caps_strided (GstCaps * caps, GstVideoFormat * format,
> -+    int *width, int *height, int *rowstride);
> - gboolean gst_video_parse_caps_framerate (GstCaps *caps,
> -     int *fps_n, int *fps_d);
> - gboolean gst_video_parse_caps_pixel_aspect_ratio (GstCaps *caps,
> -@@ -293,6 +305,9 @@ GstCaps * gst_video_format_new_caps (GstVideoFormat format,
> - GstCaps * gst_video_format_new_caps_interlaced (GstVideoFormat format,
> -     int width, int height, int framerate_n, int framerate_d,
> - 						int par_n, int par_d, gboolean interlaced);
> -+GstCaps * gst_video_format_new_caps_strided (GstVideoFormat format,
> -+    int width, int height, int rowstride,
> -+    int framerate_n, int framerate_d, int par_n, int par_d);
> - GstVideoFormat gst_video_format_from_fourcc (guint32 fourcc);
> - guint32 gst_video_format_to_fourcc (GstVideoFormat format);
> - gboolean gst_video_format_is_rgb (GstVideoFormat format);
> -@@ -308,6 +323,8 @@ int gst_video_format_get_component_height (GstVideoFormat format, int component,
> - int gst_video_format_get_component_offset (GstVideoFormat format, int component,
> -     int width, int height);
> - int gst_video_format_get_size (GstVideoFormat format, int width, int height);
> -+int gst_video_format_get_size_strided (GstVideoFormat format,
> -+    int width, int height, int rowstride);
> - gboolean gst_video_format_convert (GstVideoFormat format, int width, int height,
> -     int fps_n, int fps_d,
> -     GstFormat src_format, gint64 src_value,
> -diff --git a/gst/audioconvert/Makefile.am b/gst/audioconvert/Makefile.am
> -index 94978bb..2d273db 100644
> ---- a/gst/audioconvert/Makefile.am
> -+++ b/gst/audioconvert/Makefile.am
> -@@ -5,6 +5,7 @@ libgstaudioconvert_la_SOURCES = \
> - 	audioconvert.c \
> - 	gstchannelmix.c \
> - 	gstaudioquantize.c \
> -+	armv7.c \
> - 	plugin.c
> - 
> - libgstaudioconvert_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
> -diff --git a/gst/audioconvert/armv7.c b/gst/audioconvert/armv7.c
> -new file mode 100644
> -index 0000000..e39d29d
> ---- /dev/null
> -+++ b/gst/audioconvert/armv7.c
> -@@ -0,0 +1,209 @@
> -+/* GStreamer
> -+ *
> -+ * Copyright (C) 2009 Texas Instruments, Inc - http://www.ti.com/
> -+ *
> -+ * Description: NEON/VFP accelerated functions for armv7 architecture
> -+ *  Created on: Aug 8, 2009
> -+ *      Author: Rob Clark <rob@ti.com>
> -+ *
> -+ * 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.
> -+ */
> -+
> -+#ifdef __ARM_NEON__
> -+#include <arm_neon.h>
> -+#include <string.h>
> -+
> -+#include "audioconvert.h"
> -+
> -+
> -+void
> -+gst_audio_quantize_quantize_signed_tpdf_none (AudioConvertCtx *ctx,
> -+    gint32 *src, gint32 *dst, gint count)
> -+{
> -+  static guint32 state[4] = {
> -+      0xdeadbeef,
> -+      0x305b8cc9,
> -+      0x6c46ec93,
> -+      0xad13b0cd
> -+  };
> -+
> -+  gint scale = ctx->out_scale;
> -+  count *= ctx->out.channels;
> -+
> -+  if (scale > 0) {
> -+    guint32 mask = 0xffffffff & (0xffffffff << scale);
> -+    guint32 bias = (1U << (scale - 1)) >> 1;
> -+    gint32 dither = (1<<(scale - 1));
> -+
> -+    int32x4_t  vrand;
> -+    uint32x4_t vstate;
> -+    uint32x4_t v12345;
> -+    int32x4_t  vtmp;
> -+    uint32x4_t vmask;
> -+
> -+    vstate = vld1q_u32 (state);
> -+    v12345 = vmovq_n_u32 (12345);
> -+    vmask  = vmovq_n_u32 (mask);
> -+
> -+    /* until we have less 4 words less to process, use vector instructions
> -+     * to do everything 4x at a time:
> -+     */
> -+    for (;;count-=4) {
> -+      int64x2_t  vtmp_lo;
> -+      int64x2_t  vtmp_hi;
> -+      uint32x4_t vstate2;
> -+      int32x2_t  vrand_lo;
> -+      int32x2_t  vrand_hi;
> -+
> -+      /* generate next eight random words: (see gst_fast_random_uint32())
> -+       *
> -+       *    state = state * 1103515245 + 12345
> -+       */
> -+      vstate2 = vmulq_n_u32 (vstate, 1103515245);
> -+      vstate2 = vaddq_u32 (vstate2, v12345);
> -+      vstate  = vmulq_n_u32 (vstate2, 1103515245);
> -+      vstate  = vaddq_u32 (vstate2, v12345);
> -+
> -+      /* generate next four scaled random values:
> -+       *
> -+       *    gint32 start = bias - dither;
> -+       *    gint32 end = bias + dither - 1;
> -+       *    gint64 tmp1 = gst_fast_random_uint32 ();
> -+       *    gint64 tmp2 = gst_fast_random_uint32 ();
> -+       *    rand = (gint32)(((tmp1+tmp2) * (end - start)) / (1LLU<<32) + start);
> -+       *
> -+       * need to split vstate and vstate2 into 2*2 int64x2_t and add....
> -+       */
> -+      vstate2 = vaddq_u32 (vstate, vstate2);     /* tmp1+tmp2 */
> -+      vtmp_lo = vreinterpretq_s64_u64 (          /* * (end-start) */
> -+          vmull_n_u32 (vget_low_u32 (vstate2), (2*dither) - 1));
> -+      vtmp_hi = vreinterpretq_s64_u64 (          /* * (end-start) */
> -+          vmull_n_u32 (vget_high_u32 (vstate2), (2*dither) - 1));
> -+
> -+      vtmp_lo = vshrq_n_s64 (vtmp_lo, 32);       /* / (1LLU<<32) */
> -+      vtmp_hi = vshrq_n_s64 (vtmp_hi, 32);       /* / (1LLU<<32) */
> -+
> -+
> -+      /* now want to put vtmp_hi and vtmp_lo back together..
> -+       * then add 'start' (bias-dither).. which is negative..
> -+       */
> -+      vrand_lo = vmovn_s64 (vtmp_lo);
> -+      vrand_hi = vmovn_s64 (vtmp_hi);
> -+      vrand    = vcombine_s32 (vrand_lo, vrand_hi);
> -+      vrand    = vaddq_s32 (vrand, vmovq_n_s32 (bias-dither));
> -+
> -+      /* load next 4 words:
> -+       */
> -+      vtmp = vld1q_s32 (src);
> -+      src += 4;
> -+
> -+      /* perform saturating add of random noise... we don't want the
> -+       * value to wrap around:
> -+       *
> -+       * XXX I *think* vqaddq will handle saturation for underflow too..
> -+       */
> -+      vtmp = vqaddq_s32 (vtmp, vrand);
> -+      vtmp = vreinterpretq_s32_u32 (
> -+          vandq_u32 (vreinterpretq_u32_s32 (vtmp), vmask));
> -+
> -+      /* we check for less than four remaining words at the end, before
> -+       * we store the result back.. the assumption is that it shouldn't
> -+       * cause a segfault to read past the end of 'src', and there is no
> -+       * harm in processing a few garbage words.  But we definitely don't
> -+       * want to write past the end of 'dst'
> -+       */
> -+      if (count<4) break;
> -+
> -+      /* store 4 words to result:
> -+       */
> -+      vst1q_s32 (dst, vtmp);
> -+      dst += 4;
> -+    }
> -+
> -+    vst1q_u32 (state, vstate);
> -+
> -+    /* at this point, we could have 0-3 result bytes in vtmp to write
> -+     * back out to 'dst':
> -+     */
> -+    if (count) {
> -+      gint32 tmpdst[4];
> -+      gint32 *tmpp = tmpdst;
> -+
> -+      vst1q_s32 (tmpdst, vtmp);
> -+
> -+      while (count--) {
> -+        *dst++ = *tmpp++;
> -+      }
> -+    }
> -+
> -+  } else {
> -+    memmove (dst, src, count);
> -+  }
> -+}
> -+
> -+void
> -+gst_audio_convert_unpack_float_le (gfloat * src, gint32 * dst, gint s, gint count)
> -+{
> -+  float32x4_t vsrc;
> -+  float32x4_t v05;
> -+  int32x4_t   vdst;
> -+
> -+  v05 = vmovq_n_f32 (0.5);
> -+
> -+  for (;;count-=4) {
> -+
> -+    /* load next 4 words:
> -+     */
> -+    vsrc = vld1q_f32 ((float32_t *)src);
> -+    src += 4;
> -+
> -+    /* convert to int:
> -+     */
> -+    vsrc = vmulq_n_f32 (vsrc, 2147483647.0);
> -+    vsrc = vaddq_f32 (vsrc, v05);
> -+    vdst = vcvtq_s32_f32 (vsrc);
> -+
> -+    /* we check for less than four remaining words at the end, before
> -+     * we store the result back.. the assumption is that it shouldn't
> -+     * cause a segfault to read past the end of 'src', and there is no
> -+     * harm in processing a few garbage words.  But we definitely don't
> -+     * want to write past the end of 'dst'
> -+     */
> -+    if (count<4) break;
> -+
> -+    /* store 4 words to result:
> -+     */
> -+    vst1q_s32 (dst, vdst);
> -+    dst += 4;
> -+  }
> -+
> -+  /* at this point, we could have 0-3 result bytes in vtmp to write
> -+   * back out to 'dst':
> -+   */
> -+  if (count) {
> -+    gint32 tmpdst[4];
> -+    gint32 *tmpp = tmpdst;
> -+
> -+    vst1q_s32 (tmpdst, vdst);
> -+
> -+    while (count--) {
> -+      *dst++ = *tmpp++;
> -+    }
> -+  }
> -+}
> -+
> -+
> -+#endif
> -diff --git a/gst/audioconvert/audioconvert.c b/gst/audioconvert/audioconvert.c
> -index 4780324..c18d217 100644
> ---- a/gst/audioconvert/audioconvert.c
> -+++ b/gst/audioconvert/audioconvert.c
> -@@ -38,11 +38,11 @@
> -  * unpack code
> -  */
> - #define MAKE_UNPACK_FUNC_NAME(name)                                     \
> --audio_convert_unpack_##name
> -+gst_audio_convert_unpack_##name
> - 
> - /* unpack from integer to signed integer 32 */
> - #define MAKE_UNPACK_FUNC_II(name, stride, sign, READ_FUNC)              \
> --static void                                                             \
> -+void __attribute__((weak))                                              \
> - MAKE_UNPACK_FUNC_NAME (name) (guint8 *src, gint32 *dst,                 \
> -         gint scale, gint count)                                         \
> - {                                                                       \
> -@@ -54,7 +54,7 @@ MAKE_UNPACK_FUNC_NAME (name) (guint8 *src, gint32 *dst,                 \
> - 
> - /* unpack from float to signed integer 32 */
> - #define MAKE_UNPACK_FUNC_FI(name, type, READ_FUNC)                            \
> --static void                                                                   \
> -+void __attribute__((weak))                                                    \
> - MAKE_UNPACK_FUNC_NAME (name) (type * src, gint32 * dst, gint s, gint count)   \
> - {                                                                             \
> -   gdouble temp;                                                               \
> -@@ -68,7 +68,7 @@ MAKE_UNPACK_FUNC_NAME (name) (type * src, gint32 * dst, gint s, gint count)   \
> - 
> - /* unpack from float to float 64 (double) */
> - #define MAKE_UNPACK_FUNC_FF(name, type, FUNC)                                 \
> --static void                                                                   \
> -+void __attribute__((weak))                                                    \
> - MAKE_UNPACK_FUNC_NAME (name) (type * src, gdouble * dst, gint s,              \
> -     gint count)                                                               \
> - {                                                                             \
> -@@ -78,7 +78,7 @@ MAKE_UNPACK_FUNC_NAME (name) (type * src, gdouble * dst, gint s,              \
> - 
> - /* unpack from int to float 64 (double) */
> - #define MAKE_UNPACK_FUNC_IF(name, stride, sign, READ_FUNC)                    \
> --static void                                                                   \
> -+void __attribute__((weak))                                                    \
> - MAKE_UNPACK_FUNC_NAME (name) (guint8 * src, gdouble * dst, gint scale,        \
> -     gint count)                                                               \
> - {                                                                             \
> -@@ -158,7 +158,7 @@ audio_convert_pack_##name
> - 
> - /* pack from signed integer 32 to integer */
> - #define MAKE_PACK_FUNC_II(name, stride, sign, WRITE_FUNC)               \
> --static void                                                             \
> -+void __attribute__((weak))                                              \
> - MAKE_PACK_FUNC_NAME (name) (gint32 *src, guint8 * dst,                  \
> -         gint scale, gint count)                                         \
> - {                                                                       \
> -@@ -172,7 +172,7 @@ MAKE_PACK_FUNC_NAME (name) (gint32 *src, guint8 * dst,                  \
> - 
> - /* pack from signed integer 32 to float */
> - #define MAKE_PACK_FUNC_IF(name, type, FUNC)                             \
> --static void                                                             \
> -+void __attribute__((weak))                                              \
> - MAKE_PACK_FUNC_NAME (name) (gint32 * src, type * dst, gint scale,       \
> -     gint count)                                                         \
> - {                                                                       \
> -@@ -182,7 +182,7 @@ MAKE_PACK_FUNC_NAME (name) (gint32 * src, type * dst, gint scale,       \
> - 
> - /* pack from float 64 (double) to float */
> - #define MAKE_PACK_FUNC_FF(name, type, FUNC)                             \
> --static void                                                             \
> -+void __attribute__((weak))                                              \
> - MAKE_PACK_FUNC_NAME (name) (gdouble * src, type * dst, gint s,          \
> -     gint count)                                                         \
> - {                                                                       \
> -@@ -194,7 +194,7 @@ MAKE_PACK_FUNC_NAME (name) (gdouble * src, type * dst, gint s,          \
> -  * the floats are already in the correct range. Only a cast is needed.
> -  */
> - #define MAKE_PACK_FUNC_FI_S(name, stride, WRITE_FUNC)                   \
> --static void                                                             \
> -+void __attribute__((weak))                                              \
> - MAKE_PACK_FUNC_NAME (name) (gdouble * src, guint8 * dst, gint scale,    \
> -     gint count)                                                         \
> - {                                                                       \
> -@@ -212,7 +212,7 @@ MAKE_PACK_FUNC_NAME (name) (gdouble * src, guint8 * dst, gint scale,    \
> -  * and an addition of 2^(target_depth-1) to get in the correct unsigned
> -  * range. */
> - #define MAKE_PACK_FUNC_FI_U(name, stride, WRITE_FUNC)                   \
> --static void                                                             \
> -+void __attribute__((weak))                                              \
> - MAKE_PACK_FUNC_NAME (name) (gdouble * src, guint8 * dst, gint scale,    \
> -     gint count)                                                         \
> - {                                                                       \
> -diff --git a/gst/audioconvert/gstaudioquantize.c b/gst/audioconvert/gstaudioquantize.c
> -index 2155397..be959c4 100644
> ---- a/gst/audioconvert/gstaudioquantize.c
> -+++ b/gst/audioconvert/gstaudioquantize.c
> -@@ -46,7 +46,7 @@ gst_audio_quantize_quantize_##name
> - 
> - #define MAKE_QUANTIZE_FUNC_I(name, DITHER_INIT_FUNC, ADD_DITHER_FUNC,   \
> -                              ROUND_FUNC)                                \
> --static void                                                             \
> -+void __attribute__((weak))                                              \
> - MAKE_QUANTIZE_FUNC_NAME (name) (AudioConvertCtx *ctx, gint32 *src,      \
> -                                 gint32 *dst, gint count)                \
> - {                                                                       \
> -@@ -86,7 +86,7 @@ MAKE_QUANTIZE_FUNC_NAME (name) (AudioConvertCtx *ctx, gint32 *src,      \
> - #define MAKE_QUANTIZE_FUNC_F(name, DITHER_INIT_FUNC, NS_INIT_FUNC,      \
> -                              ADD_NS_FUNC, ADD_DITHER_FUNC,              \
> -                              UPDATE_ERROR_FUNC)                         \
> --static void                                                             \
> -+void __attribute__((weak))                                              \
> - MAKE_QUANTIZE_FUNC_NAME (name) (AudioConvertCtx *ctx, gdouble *src,     \
> -                                 gdouble *dst, gint count)               \
> - {                                                                       \
> -diff --git a/gst/audioconvert/gstchannelmix.c b/gst/audioconvert/gstchannelmix.c
> -index 1dbfcce..9ace1cb 100644
> ---- a/gst/audioconvert/gstchannelmix.c
> -+++ b/gst/audioconvert/gstchannelmix.c
> -@@ -663,7 +663,7 @@ gst_channel_mix_passthrough (AudioConvertCtx * this)
> - 
> - /* IMPORTANT: out_data == in_data is possible, make sure to not overwrite data
> -  * you might need later on! */
> --void
> -+void __attribute__((weak))
> - gst_channel_mix_mix_int (AudioConvertCtx * this,
> -     gint32 * in_data, gint32 * out_data, gint samples)
> - {
> -@@ -702,7 +702,7 @@ gst_channel_mix_mix_int (AudioConvertCtx * this,
> -   }
> - }
> - 
> --void
> -+void __attribute__((weak))
> - gst_channel_mix_mix_float (AudioConvertCtx * this,
> -     gdouble * in_data, gdouble * out_data, gint samples)
> - {
> -diff --git a/gst/stride/Makefile.am b/gst/stride/Makefile.am
> -new file mode 100644
> -index 0000000..1adc197
> ---- /dev/null
> -+++ b/gst/stride/Makefile.am
> -@@ -0,0 +1,15 @@
> -+plugin_LTLIBRARIES = libgststridetransform.la
> -+
> -+libgststridetransform_la_SOURCES = \
> -+	gststridetransform.c \
> -+	plugin.c
> -+
> -+libgststridetransform_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
> -+libgststridetransform_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
> -+libgststridetransform_la_LIBADD = \
> -+	$(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
> -+	$(GST_BASE_LIBS) $(GST_LIBS) $(LIBM)
> -+libgststridetransform_la_LIBTOOLFLAGS = --tag=disable-static
> -+
> -+noinst_HEADERS = \
> -+	gststridetransform.h
> -diff --git a/gst/stride/gststridetransform.c b/gst/stride/gststridetransform.c
> -new file mode 100644
> -index 0000000..ea52500
> ---- /dev/null
> -+++ b/gst/stride/gststridetransform.c
> -@@ -0,0 +1,471 @@
> -+/* GStreamer
> -+ *
> -+ * Copyright (C) 2009 Texas Instruments, Inc - http://www.ti.com/
> -+ *
> -+ * Description: V4L2 sink element
> -+ *  Created on: Jul 30, 2009
> -+ *      Author: Rob Clark <rob@ti.com>
> -+ *
> -+ * 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-stridetransform
> -+ *
> -+ * stridetransform can be used to convert between video buffers
> -+ * with and without stride, or between buffers with differing
> -+ * stride
> -+ *
> -+ * <refsect2>
> -+ * <title>Example launch lines</title>
> -+ * |[
> -+ * gst-launch videotestsrc ! video/x-raw-yuv,format=(fourcc)YUY2,width=320,height=240,framerate=30/1 !
> -+ * stridetransform ! video/x-raw-yuv-strided,format=(fourcc)YUY2,width=320,height=240,rowstride=700,framerate=30/1 !
> -+ * stridetransform ! video/x-raw-yuv,format=(fourcc)YUY2,width=320,height=240,framerate=30/1 !
> -+ * v4l2sink
> -+ * ]| This pipeline ???? TODO
> -+ * </refsect2>
> -+ */
> -+
> -+
> -+#ifdef HAVE_CONFIG_H
> -+#include <config.h>
> -+#endif
> -+
> -+#include <string.h>
> -+#include <gst/video/video.h>
> -+
> -+#include "gst/gst-i18n-plugin.h"
> -+#include "gststridetransform.h"
> -+
> -+
> -+static const GstElementDetails stridetransform_details =
> -+GST_ELEMENT_DETAILS ("Stride transform",
> -+    "Filter/Converter/Video",
> -+    "Convert between video buffers with and without stride, or with differing stride",
> -+    "Rob Clark <rob@ti.com>,");
> -+
> -+
> -+/* TODO: add rgb formats too! */
> -+#define SUPPORTED_CAPS                                                        \
> -+  GST_VIDEO_CAPS_YUV_STRIDED ("{ I420, YV12, YUY2, UYVY }", "[ 0, max ]")
> -+
> -+
> -+static GstStaticPadTemplate src_template =
> -+GST_STATIC_PAD_TEMPLATE ("src",
> -+    GST_PAD_SRC,
> -+    GST_PAD_ALWAYS,
> -+    GST_STATIC_CAPS (SUPPORTED_CAPS)
> -+    );
> -+
> -+static GstStaticPadTemplate sink_template =
> -+GST_STATIC_PAD_TEMPLATE ("sink",
> -+    GST_PAD_SINK,
> -+    GST_PAD_ALWAYS,
> -+    GST_STATIC_CAPS (SUPPORTED_CAPS)
> -+    );
> -+
> -+
> -+GST_DEBUG_CATEGORY (stridetransform_debug);
> -+#define GST_CAT_DEFAULT stridetransform_debug
> -+
> -+/* type functions */
> -+static void gst_stride_transform_dispose (GObject *obj);
> -+
> -+/* GstBaseTransform functions */
> -+static gboolean gst_stride_transform_get_unit_size (GstBaseTransform *base,
> -+    GstCaps *caps, guint *size);
> -+static gboolean gst_stride_transform_transform_size (GstBaseTransform *base,
> -+    GstPadDirection direction,
> -+    GstCaps *caps, guint size,
> -+    GstCaps *othercaps, guint *othersize);
> -+static GstCaps *gst_stride_transform_transform_caps (GstBaseTransform *base,
> -+    GstPadDirection direction, GstCaps *caps);
> -+static gboolean gst_stride_transform_set_caps (GstBaseTransform *base,
> -+    GstCaps *incaps, GstCaps *outcaps);
> -+static GstFlowReturn gst_stride_transform_transform (GstBaseTransform *base,
> -+    GstBuffer *inbuf, GstBuffer *outbuf);
> -+static GstFlowReturn gst_stride_transform_transform_ip (GstBaseTransform *base,
> -+    GstBuffer *buf);
> -+
> -+GST_BOILERPLATE (GstStrideTransform, gst_stride_transform, GstVideoFilter, GST_TYPE_VIDEO_FILTER);
> -+
> -+
> -+static void
> -+gst_stride_transform_base_init (gpointer g_class)
> -+{
> -+  GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
> -+
> -+  GST_DEBUG_CATEGORY_INIT (stridetransform_debug, "stride", 0, "stride transform element");
> -+
> -+  gst_element_class_set_details (gstelement_class, &stridetransform_details);
> -+
> -+  gst_element_class_add_pad_template (gstelement_class,
> -+      gst_static_pad_template_get (&sink_template));
> -+  gst_element_class_add_pad_template (gstelement_class,
> -+      gst_static_pad_template_get (&src_template));
> -+}
> -+
> -+static void
> -+gst_stride_transform_class_init (GstStrideTransformClass *klass)
> -+{
> -+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
> -+  GstBaseTransformClass *basetransform_class = GST_BASE_TRANSFORM_CLASS (klass);
> -+
> -+  gobject_class->dispose = gst_stride_transform_dispose;
> -+
> -+  basetransform_class->get_unit_size =
> -+      GST_DEBUG_FUNCPTR (gst_stride_transform_get_unit_size);
> -+  basetransform_class->transform_size =
> -+      GST_DEBUG_FUNCPTR (gst_stride_transform_transform_size);
> -+  basetransform_class->transform_caps =
> -+      GST_DEBUG_FUNCPTR (gst_stride_transform_transform_caps);
> -+  basetransform_class->set_caps =
> -+      GST_DEBUG_FUNCPTR (gst_stride_transform_set_caps);
> -+  basetransform_class->transform_ip =
> -+      GST_DEBUG_FUNCPTR (gst_stride_transform_transform_ip);
> -+  basetransform_class->transform =
> -+      GST_DEBUG_FUNCPTR (gst_stride_transform_transform);
> -+
> -+  basetransform_class->passthrough_on_same_caps = TRUE;
> -+}
> -+
> -+static void
> -+gst_stride_transform_init (GstStrideTransform *self, GstStrideTransformClass *klass)
> -+{
> -+  GST_DEBUG_OBJECT (self, "not implemented");
> -+}
> -+
> -+
> -+static void
> -+gst_stride_transform_dispose (GObject *object)
> -+{
> -+  GstStrideTransform *self = GST_STRIDE_TRANSFORM (object);
> -+  GST_DEBUG_OBJECT (self, "not implemented");
> -+  G_OBJECT_CLASS (parent_class)->dispose (object);
> -+}
> -+
> -+/**
> -+ * figure out the required buffer size based on @caps
> -+ */
> -+static gboolean
> -+gst_stride_transform_get_unit_size (GstBaseTransform *base,
> -+    GstCaps *caps, guint *size)
> -+{
> -+  GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
> -+  GstVideoFormat format;
> -+  gint width, height, rowstride;
> -+
> -+  g_return_val_if_fail (gst_video_format_parse_caps_strided (
> -+      caps, &format, &width, &height, &rowstride), FALSE);
> -+
> -+  *size = gst_video_format_get_size_strided (format, width, height, rowstride);
> -+
> -+  GST_DEBUG_OBJECT (self,
> -+      "format=%d, width=%d, height=%d, rowstride=%d -> size=%d",
> -+      format, width, height, rowstride, *size);
> -+
> -+  return TRUE;
> -+}
> -+
> -+/**
> -+ * Default transform_size function is no good, as it assumes that the output
> -+ * buffer size is a multiple of the unit size.. which doesn't hold true.
> -+ */
> -+static gboolean
> -+gst_stride_transform_transform_size (GstBaseTransform *base,
> -+    GstPadDirection direction,
> -+    GstCaps *caps, guint size,
> -+    GstCaps *othercaps, guint *othersize)
> -+{
> -+  GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
> -+  guint idx = (direction == GST_PAD_SINK) ? 0 : 1;
> -+
> -+  if (self->cached_caps[idx] != othercaps)
> -+  {
> -+    if (!gst_stride_transform_get_unit_size (base, othercaps,
> -+        &(self->cached_size[idx])))
> -+    {
> -+      return FALSE;
> -+    }
> -+  }
> -+
> -+  *othersize = self->cached_size[idx];
> -+
> -+  return TRUE;
> -+}
> -+
> -+
> -+
> -+/**
> -+ * helper to add all fields, other than rowstride to @caps, copied from @s.
> -+ */
> -+static void
> -+add_all_fields (GstCaps *caps, const gchar *name, GstStructure *s, gboolean rowstride)
> -+{
> -+  gint idx;
> -+  GstStructure *new_s = gst_structure_new (name, NULL);
> -+
> -+  if (rowstride) {
> -+    gst_structure_set (new_s, "rowstride", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
> -+  }
> -+
> -+  idx = gst_structure_n_fields (s) - 1;
> -+  while (idx >= 0) {
> -+    const gchar *name = gst_structure_nth_field_name (s, idx);
> -+    if (strcmp ("rowstride", name)) {
> -+      const GValue *val = gst_structure_get_value (s, name);
> -+      gst_structure_set_value (new_s, name, val);
> -+    }
> -+    idx--;
> -+  }
> -+
> -+  gst_caps_merge_structure (caps, new_s);
> -+}
> -+
> -+
> -+/**
> -+ * we can transform @caps to strided or non-strided caps with otherwise
> -+ * identical parameters
> -+ */
> -+static GstCaps *
> -+gst_stride_transform_transform_caps (GstBaseTransform *base,
> -+    GstPadDirection direction, GstCaps *caps)
> -+{
> -+  GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
> -+  GstCaps *ret;
> -+  GstStructure *s;
> -+
> -+  g_return_val_if_fail (GST_CAPS_IS_SIMPLE (caps), NULL);
> -+
> -+  GST_DEBUG_OBJECT (self, "direction=%d, caps=%p", direction, caps);
> -+  LOG_CAPS (self, caps);
> -+
> -+  ret = gst_caps_new_empty ();
> -+  s = gst_caps_get_structure (caps, 0);
> -+
> -+  if (gst_structure_has_name (s, "video/x-raw-yuv") ||
> -+      gst_structure_has_name (s, "video/x-raw-yuv-strided")) {
> -+
> -+    add_all_fields (ret, "video/x-raw-yuv", s, FALSE);
> -+    add_all_fields (ret, "video/x-raw-yuv-strided", s, TRUE);
> -+
> -+  } else if (gst_structure_has_name (s, "video/x-raw-rgb") ||
> -+      gst_structure_has_name (s, "video/x-raw-rgb-strided")) {
> -+
> -+    add_all_fields (ret, "video/x-raw-rgb", s, FALSE);
> -+    add_all_fields (ret, "video/x-raw-rgb-strided", s, TRUE);
> -+
> -+  }
> -+
> -+  LOG_CAPS (self, ret);
> -+
> -+  return ret;
> -+}
> -+
> -+/**
> -+ * at this point, we have identical fourcc, width, and height for @incaps
> -+ * and @outcaps..  so we need to extract these to use for transforming,
> -+ * plus the requested rowstride of the @incaps and @outcaps
> -+ */
> -+static gboolean
> -+gst_stride_transform_set_caps (GstBaseTransform *base,
> -+    GstCaps *incaps, GstCaps *outcaps)
> -+{
> -+  GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
> -+  GstVideoFormat format;
> -+  gint width, height;
> -+
> -+  LOG_CAPS (self, incaps);
> -+  LOG_CAPS (self, outcaps);
> -+
> -+  g_return_val_if_fail (gst_video_format_parse_caps_strided (incaps,
> -+      &self->format, &self->width, &self->height, &self->in_rowstride), FALSE);
> -+  g_return_val_if_fail (gst_video_format_parse_caps_strided (outcaps,
> -+      &format, &width, &height, &self->out_rowstride), FALSE);
> -+
> -+  g_return_val_if_fail (self->format == format, FALSE);
> -+  g_return_val_if_fail (self->width  == width,  FALSE);
> -+  g_return_val_if_fail (self->height == height, FALSE);
> -+
> -+  return TRUE;
> -+}
> -+
> -+/* ************************************************************************* */
> -+
> -+/**
> -+ * Convert from one stride to another... like memmove, but can convert stride in
> -+ * the process.  This function is not aware of pixels, only of bytes.  So widths
> -+ * are given in bytes, not pixels.  The new_buf and orig_buf can point to the
> -+ * same buffers to do an in-place conversion, but the buffer should be large
> -+ * enough.
> -+ */
> -+static void
> -+stridemove (guchar *new_buf, guchar *orig_buf, gint new_width, gint orig_width, gint height)
> -+{
> -+  int row;
> -+
> -+  GST_DEBUG ("new_buf=%p, orig_buf=%p, new_width=%d, orig_width=%d, height=%d",
> -+      new_buf, orig_buf, new_width, orig_width, height);
> -+  /* if increasing the stride, work from bottom-up to avoid overwriting data
> -+   * that has not been moved yet.. otherwise, work in the opposite order,
> -+   * for the same reason.
> -+   */
> -+  if (new_width > orig_width) {
> -+    for (row=height-1; row>=0; row--) {
> -+      memmove (new_buf+(new_width*row), orig_buf+(orig_width*row), orig_width);
> -+    }
> -+  } else {
> -+    for (row=0; row<height; row++) {
> -+      memmove (new_buf+(new_width*row), orig_buf+(orig_width*row), new_width);
> -+    }
> -+  }
> -+}
> -+
> -+
> -+/**
> -+ * Convert from a non-strided buffer to strided.  The two buffer pointers could
> -+ * be pointing to the same memory block for in-place transform.. assuming that
> -+ * the buffer is large enough
> -+ *
> -+ * @strided:    the pointer to the resulting strided buffer
> -+ * @unstrided:  the pointer to the initial unstrided buffer
> -+ * @fourcc:     the color format
> -+ * @stride:     the stride, in bytes
> -+ * @width:      the width in pixels
> -+ * @height:     the height in pixels
> -+ */
> -+static GstFlowReturn
> -+stridify (GstStrideTransform *self, guchar *strided, guchar *unstrided)
> -+{
> -+  gint width  = self->width;
> -+  gint height = self->height;
> -+  gint stride = self->out_rowstride;
> -+
> -+  switch (self->format) {
> -+#if 0 /* TODO */
> -+    case GST_VIDEO_FORMAT_NV12:
> -+      g_return_val_if_fail (stride >= width, GST_FLOW_ERROR);
> -+      stridemove (strided, unstrided, stride, width, height * 1.5);
> -+      return GST_FLOW_OK;
> -+#endif
> -+    case GST_VIDEO_FORMAT_I420:
> -+    case GST_VIDEO_FORMAT_YV12:
> -+      g_return_val_if_fail (stride >= width, GST_FLOW_ERROR);
> -+      stridemove (
> -+          strided + (int)(height*stride*1.5),
> -+          unstrided + (int)(height*width*1.5),
> -+          stride, width/2, height);                             /* move U/V */
> -+      stridemove (
> -+          strided + (height*stride),
> -+          unstrided + (height*width),
> -+          stride, width/2, height);                             /* move V/U */
> -+      stridemove (strided, unstrided, stride, width, height);   /* move Y */
> -+      return GST_FLOW_OK;
> -+    case GST_VIDEO_FORMAT_YUY2:
> -+    case GST_VIDEO_FORMAT_UYVY:
> -+      g_return_val_if_fail (stride >= (width*2), GST_FLOW_ERROR);
> -+      stridemove (strided, unstrided, stride, width*2, height);
> -+      return GST_FLOW_OK;
> -+    default:
> -+      GST_WARNING ("unknown color format!\n");
> -+      return GST_FLOW_ERROR;
> -+  }
> -+}
> -+
> -+
> -+/**
> -+ * Convert from a strided buffer to non-strided.  The two buffer pointers could
> -+ * be pointing to the same memory block for in-place transform..
> -+ *
> -+ * @unstrided:  the pointer to the resulting unstrided buffer
> -+ * @strided:    the pointer to the initial strided buffer
> -+ */
> -+static GstFlowReturn
> -+unstridify (GstStrideTransform *self, guchar *unstrided, guchar *strided)
> -+{
> -+  gint width  = self->width;
> -+  gint height = self->height;
> -+  gint stride = self->in_rowstride;
> -+
> -+  switch (self->format) {
> -+#if 0 /* TODO */
> -+    case GST_VIDEO_FORMAT_NV12:
> -+      g_return_val_if_fail (stride >= width, GST_FLOW_ERROR);
> -+      stridemove (unstrided, strided, width, stride, height * 1.5);
> -+      return GST_FLOW_OK;
> -+#endif
> -+    case GST_VIDEO_FORMAT_I420:
> -+    case GST_VIDEO_FORMAT_YV12:
> -+      g_return_val_if_fail (stride >= width, GST_FLOW_ERROR);
> -+      stridemove (unstrided, strided, width, stride, height);   /* move Y */
> -+      stridemove (
> -+          unstrided + (height*width),
> -+          strided + (height*stride),
> -+          width/2, stride, height);                             /* move V/U */
> -+      stridemove (
> -+          unstrided + (int)(height*width*1.5),
> -+          strided + (int)(height*stride*1.5),
> -+          width/2, stride, height);                             /* move U/V */
> -+      return GST_FLOW_OK;
> -+    case GST_VIDEO_FORMAT_YUY2:
> -+    case GST_VIDEO_FORMAT_UYVY:
> -+      g_return_val_if_fail (stride >= (width*2), GST_FLOW_ERROR);
> -+      stridemove (unstrided, strided, width*2, stride, height);
> -+      return GST_FLOW_OK;
> -+    default:
> -+      GST_WARNING ("unknown color format!\n");
> -+      return GST_FLOW_ERROR;
> -+  }
> -+}
> -+
> -+
> -+static GstFlowReturn
> -+gst_stride_transform_transform (GstBaseTransform *base,
> -+    GstBuffer *inbuf, GstBuffer *outbuf)
> -+{
> -+  GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
> -+
> -+  GST_DEBUG_OBJECT (self, "inbuf=%p (size=%d), outbuf=%p (size=%d)",
> -+      inbuf, GST_BUFFER_SIZE (inbuf),
> -+      outbuf, GST_BUFFER_SIZE (outbuf));
> -+
> -+  if (self->in_rowstride && self->out_rowstride) {
> -+    GST_DEBUG_OBJECT (self, "not implemented");  // TODO
> -+    return GST_FLOW_ERROR;
> -+  } else if (self->in_rowstride) {
> -+    return unstridify (self,
> -+        GST_BUFFER_DATA (outbuf), GST_BUFFER_DATA (inbuf));
> -+  } else if (self->out_rowstride) {
> -+    return stridify (self,
> -+        GST_BUFFER_DATA (outbuf), GST_BUFFER_DATA (inbuf));
> -+  }
> -+
> -+  GST_DEBUG_OBJECT (self, "this shouldn't happen!  in_rowstride=%d, out_rowstride=%d",
> -+      self->in_rowstride, self->out_rowstride);
> -+
> -+  return GST_FLOW_ERROR;
> -+}
> -+
> -+static GstFlowReturn
> -+gst_stride_transform_transform_ip (GstBaseTransform *base,
> -+    GstBuffer *buf)
> -+{
> -+  /* transform function is safe to call with same buffer ptr:
> -+   */
> -+  return gst_stride_transform_transform (base, buf, buf);
> -+}
> -diff --git a/gst/stride/gststridetransform.h b/gst/stride/gststridetransform.h
> -new file mode 100644
> -index 0000000..481959e
> ---- /dev/null
> -+++ b/gst/stride/gststridetransform.h
> -@@ -0,0 +1,80 @@
> -+/* GStreamer
> -+ *
> -+ * Copyright (C) 2009 Texas Instruments, Inc - http://www.ti.com/
> -+ *
> -+ * Description: V4L2 sink element
> -+ *  Created on: Jul 2, 2009
> -+ *      Author: Rob Clark <rob@ti.com>
> -+ *
> -+ * 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 __GSTSTRIDETRANSFORM_H__
> -+#define __GSTSTRIDETRANSFORM_H__
> -+
> -+
> -+#include <gst/video/gstvideofilter.h>
> -+#include <gst/video/video.h>
> -+
> -+
> -+G_BEGIN_DECLS
> -+
> -+#define GST_TYPE_STRIDE_TRANSFORM \
> -+  (gst_stride_transform_get_type())
> -+#define GST_STRIDE_TRANSFORM(obj) \
> -+  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_STRIDE_TRANSFORM,GstStrideTransform))
> -+#define GST_STRIDE_TRANSFORM_CLASS(klass) \
> -+  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_STRIDE_TRANSFORM,GstStrideTransformClass))
> -+#define GST_IS_STRIDE_TRANSFORM(obj) \
> -+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_STRIDE_TRANSFORM))
> -+#define GST_IS_STRIDE_TRANSFORM_CLASS(klass) \
> -+  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_STRIDE_TRANSFORM))
> -+
> -+typedef struct _GstStrideTransform GstStrideTransform;
> -+typedef struct _GstStrideTransformClass GstStrideTransformClass;
> -+
> -+/**
> -+ * GstStrideTransform:
> -+ *
> -+ * Opaque datastructure.
> -+ */
> -+struct _GstStrideTransform {
> -+  GstVideoFilter videofilter;
> -+
> -+  /*< private >*/
> -+  GstVideoFormat format;
> -+  gint width, height;
> -+  gint in_rowstride;
> -+  gint out_rowstride;
> -+
> -+  /* for caching the tranform_size() results.. */
> -+  GstCaps *cached_caps[2];
> -+  guint cached_size[2];
> -+};
> -+
> -+struct _GstStrideTransformClass {
> -+  GstVideoFilterClass parent_class;
> -+};
> -+
> -+GType gst_stride_transform_get_type (void);
> -+
> -+G_END_DECLS
> -+
> -+
> -+#define LOG_CAPS(obj, caps)  GST_DEBUG_OBJECT (obj, "%s: %"GST_PTR_FORMAT, #caps, caps)
> -+
> -+
> -+#endif /* __GSTSTRIDETRANSFORM_H__ */
> -diff --git a/gst/stride/plugin.c b/gst/stride/plugin.c
> -new file mode 100644
> -index 0000000..7672bdc
> ---- /dev/null
> -+++ b/gst/stride/plugin.c
> -@@ -0,0 +1,45 @@
> -+/* GStreamer
> -+ *
> -+ * Copyright (C) 2009 Texas Instruments, Inc - http://www.ti.com/
> -+ *
> -+ * Description: V4L2 sink element
> -+ *  Created on: Jul 30, 2009
> -+ *      Author: Rob Clark <rob@ti.com>
> -+ *
> -+ * 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.
> -+ */
> -+
> -+#ifdef HAVE_CONFIG_H
> -+#include "config.h"
> -+#endif
> -+
> -+#include "gststridetransform.h"
> -+
> -+static gboolean
> -+plugin_init (GstPlugin * plugin)
> -+{
> -+  if (!gst_element_register (plugin, "stridetransform",
> -+          GST_RANK_PRIMARY, gst_stride_transform_get_type ()))
> -+    return FALSE;
> -+
> -+  return TRUE;
> -+}
> -+
> -+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
> -+    GST_VERSION_MINOR,
> -+    "stridetransform",
> -+    "Convert video from strided to non-strided, or between different row-strides",
> -+    plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
> --- 
> -1.6.3.1
> -
> diff --git a/recipes/gstreamer/gst-plugins-base_0.10.25.bb b/recipes/gstreamer/gst-plugins-base_0.10.25.bb
> deleted file mode 100644
> index 9e82171..0000000
> --- a/recipes/gstreamer/gst-plugins-base_0.10.25.bb
> +++ /dev/null
> @@ -1,19 +0,0 @@
> -require gst-plugins.inc
> -
> -SRC_URI += "file://fix-playbin2.patch \
> -            file://gst-plugins-base_rowstride.patch \
> -"
> -
> -PR = "${INC_PR}.4"
> -
> -PROVIDES += "gst-plugins"
> -
> -# gst-plugins-base only builds the alsa plugin
> -# if alsa has been built and is present.  You will
> -# not get an error if this is not present, just 
> -# a missing alsa plugin
> -DEPENDS += "cdparanoia pango libtheora alsa-lib libsm virtual/libx11 freetype  libxv libxrandr"
> -
> -
> -SRC_URI[archive.md5sum] = "d29669dd79276c5cd94e1613c03cd9ab"
> -SRC_URI[archive.sha256sum] = "0ab2f7e1d818e7af1be99c4eae02ba69d4a1b8f7e3527929a6426f1daa0d4607"
> diff --git a/recipes/gstreamer/gst-plugins-base_0.10.31.bb b/recipes/gstreamer/gst-plugins-base_0.10.31.bb
> deleted file mode 100644
> index b68fffb..0000000
> --- a/recipes/gstreamer/gst-plugins-base_0.10.31.bb
> +++ /dev/null
> @@ -1,26 +0,0 @@
> -require gst-plugins.inc
> -
> -SRC_URI += " \
> -            file://ivorbis-thumb.patch \
> -"
> -
> -SRC_URI[archive.md5sum] = "9baa0d87e81c88b2477a3554ab629c46"
> -SRC_URI[archive.sha256sum] = "abb006c78222cfb69d31e983268d1d5219e9d4e0da24c6c4cd687968af7a33bd"
> -
> -PR = "${INC_PR}.1"
> -
> -PROVIDES += "gst-plugins"
> -
> -# gst-plugins-base only builds the alsa plugin
> -# if alsa has been built and is present.  You will
> -# not get an error if this is not present, just
> -# a missing alsa plugin
> -DEPENDS += "udev cdparanoia pango libtheora alsa-lib libsm virtual/libx11 freetype  libxv libxrandr gtk+"
> -
> -# Needs a udev that enabled gudev, which isn't the default
> -EXTRA_OECONF_append = " --with-gudev"
> -
> -do_configure_prepend() {
> -	sed -i -e s:QtGui:NoQtGui:g ${S}/configure.ac
> -}
> -
> diff --git a/recipes/gstreamer/gst-plugins-good/fix-unit-scale-asseration.patch b/recipes/gstreamer/gst-plugins-good/fix-unit-scale-asseration.patch
> deleted file mode 100644
> index 749c491..0000000
> --- a/recipes/gstreamer/gst-plugins-good/fix-unit-scale-asseration.patch
> +++ /dev/null
> @@ -1,33 +0,0 @@
> -diff -uNr gst-plugins-good-0.10.15/sys/v4l2/gstv4l2src.c gst-plugins-good-0.10.15.new/sys/v4l2/gstv4l2src.c
> ---- gst-plugins-good-0.10.15/sys/v4l2/gstv4l2src.c	2009-05-11 19:00:07.000000000 -0500
> -+++ gst-plugins-good-0.10.15.new/sys/v4l2/gstv4l2src.c	2009-06-22 09:51:50.000000000 -0500
> -@@ -1377,14 +1377,22 @@
> -       timestamp = gst_clock_get_time (clock) - timestamp;
> -       gst_object_unref (clock);
> - 
> --      latency =
> --          gst_util_uint64_scale_int (GST_SECOND, v4l2src->fps_d,
> --          v4l2src->fps_n);
> -+      /* we must have a framerate */
> -+      if (v4l2src->fps_n <= 0 || v4l2src->fps_d <= 0) {
> -+        GST_WARNING_OBJECT (src,
> -+            "Can't give latency since framerate isn't fixated !");
> -+        timestamp = GST_CLOCK_TIME_NONE;
> -+      }
> -+      else {
> -+        latency =
> -+            gst_util_uint64_scale_int (GST_SECOND, v4l2src->fps_d,
> -+            v4l2src->fps_n);
> - 
> --      if (timestamp > latency)
> --        timestamp -= latency;
> --      else
> --        timestamp = 0;
> -+        if (timestamp > latency)
> -+          timestamp -= latency;
> -+        else
> -+          timestamp = 0;
> -+      }
> -     }
> - 
> -     /* FIXME: use the timestamp from the buffer itself! */
> diff --git a/recipes/gstreamer/gst-plugins-good_0.10.15.bb b/recipes/gstreamer/gst-plugins-good_0.10.15.bb
> deleted file mode 100644
> index f2b0a5a..0000000
> --- a/recipes/gstreamer/gst-plugins-good_0.10.15.bb
> +++ /dev/null
> @@ -1,16 +0,0 @@
> -require gst-plugins.inc
> -
> -PR = "r6"
> -
> -SRC_URI += "file://fix-unit-scale-asseration.patch"
> -
> -inherit gconf 
> -
> -DEPENDS += "libsoup-2.4 flac gst-plugins-base openssl popt esound"
> -
> -PACKAGES =+ "gst-plugin-gconfelements"
> -FILES_gst-plugin-gconfelements += "${sysconfdir}/gconf"
> -
> -
> -SRC_URI[archive.md5sum] = "19bc6cc07951b3382d1ac8525b20e83f"
> -SRC_URI[archive.sha256sum] = "831f450a0fa18c881b00ec50e8916ed66ca0fecb53cd1939f0abcc02930f9847"
> diff --git a/recipes/gstreamer/gst-rtsp_0.10.4.bb b/recipes/gstreamer/gst-rtsp_0.10.4.bb
> deleted file mode 100644
> index 265f0f7..0000000
> --- a/recipes/gstreamer/gst-rtsp_0.10.4.bb
> +++ /dev/null
> @@ -1,4 +0,0 @@
> -require gst-rtsp.inc
> -
> -SRC_URI[md5sum] = "8daaca1299aeb42c6aac47b30291005b"
> -SRC_URI[sha256sum] = "1ebf3571d16dbab401f2ebf0362e3d67457fb88711ad15a4ab51bd3730267fb7"
> diff --git a/recipes/gstreamer/gst-rtsp_0.10.5.bb b/recipes/gstreamer/gst-rtsp_0.10.5.bb
> deleted file mode 100644
> index dbaddc3..0000000
> --- a/recipes/gstreamer/gst-rtsp_0.10.5.bb
> +++ /dev/null
> @@ -1,4 +0,0 @@
> -require gst-rtsp.inc
> -
> -SRC_URI[md5sum] = "caca55e2ff497c0a327df3bc65a4a662"
> -SRC_URI[sha256sum] = "a6f0a0c6c466683ee688aa8475623850fdacb549b2339a502831fdd3d74f984e"
> diff --git a/recipes/gstreamer/gstreamer/po-makefile-fix.patch b/recipes/gstreamer/gstreamer/po-makefile-fix.patch
> deleted file mode 100644
> index 1cf665e..0000000
> --- a/recipes/gstreamer/gstreamer/po-makefile-fix.patch
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -diff -urN gstreamer-0.10.17.orig/po/Makefile.in.in gstreamer-0.10.17/po/Makefile.in.in
> ---- gstreamer-0.10.17.orig/po/Makefile.in.in	2008-01-25 16:21:31.000000000 +0100
> -+++ gstreamer-0.10.17/po/Makefile.in.in	2008-09-08 14:41:21.000000000 +0200
> -@@ -30,7 +30,7 @@
> - INSTALL = @INSTALL@
> - INSTALL_DATA = @INSTALL_DATA@
> - MKINSTALLDIRS = @MKINSTALLDIRS@
> --mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS)" ;; *) echo "$(top_builddir)/$(MKINSTALLDIRS)" ;; esac`
> -+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
> - 
> - GMSGFMT = @GMSGFMT@
> - MSGFMT = @MSGFMT@
> diff --git a/recipes/gstreamer/gstreamer/registry-do-not-look-into-debug-dirs.patch b/recipes/gstreamer/gstreamer/registry-do-not-look-into-debug-dirs.patch
> deleted file mode 100644
> index 6733e6b..0000000
> --- a/recipes/gstreamer/gstreamer/registry-do-not-look-into-debug-dirs.patch
> +++ /dev/null
> @@ -1,39 +0,0 @@
> -Work around a glibc 2.6.1 bug with dlopen. We try to dlopen a .so file that
> -only contains debug symbols (e.g. no architecture is set in the elf header)
> -
> -
> -#0  0x4000a88c in _dl_relocate_object () from /lib/ld-linux.so.3
> -(gdb) bt
> -#0  0x4000a88c in _dl_relocate_object () from /lib/ld-linux.so.3
> -#1  0x40011f68 in dl_open_worker () from /lib/ld-linux.so.3
> -#2  0x4000d7e4 in _dl_catch_error () from /lib/ld-linux.so.3
> -#3  0x400117d8 in _dl_open () from /lib/ld-linux.so.3
> -#4  0x402fba84 in dlopen_doit () from /lib/libdl.so.2
> -#5  0x4000d7e4 in _dl_catch_error () from /lib/ld-linux.so.3
> -#6  0x402fbf50 in _dlerror_run () from /lib/libdl.so.2
> -#7  0x402fb9bc in dlopen@@GLIBC_2.4 () from /lib/libdl.so.2
> -#8  0x402f2790 in g_module_open () from /usr/lib/libgmodule-2.0.so.0
> -#9  0x40078784 in gst_plugin_load_file (
> -    filename=0x10a6c8 "/usr/lib/gstreamer-0.10/.debug/libgstcoreindexers.so", 
> -    error=0x0) at gstplugin.c:481
> -#10 0x4007e3c4 in gst_registry_scan_path_level (registry=0x27828, 
> -    path=0x10a6a0 "/usr/lib/gstreamer-0.10/.debug", level=1) at gstregistry.c:891
> -#11 0x4007df04 in gst_registry_scan_path_level (registry=0x27828, 
> -
> -
> -Index: gstreamer-0.10.17/gst/gstregistry.c
> -===================================================================
> ---- gstreamer-0.10.17.orig/gst/gstregistry.c	2008-11-14 23:30:48.000000000 +0100
> -+++ gstreamer-0.10.17/gst/gstregistry.c	2008-11-14 23:32:39.000000000 +0100
> -@@ -813,7 +813,10 @@
> -     GST_LOG_OBJECT (registry, "examining file: %s", filename);
> - 
> -     if (g_file_test (filename, G_FILE_TEST_IS_DIR)) {
> --      if (level > 0) {
> -+      if (g_str_has_suffix (filename, ".debug")) {
> -+        GST_LOG_OBJECT (registry,
> -+            "found directory, not descending into .debug directory");
> -+      } else if (level > 0) {
> -         GST_LOG_OBJECT (registry, "found directory, recursing");
> -         changed |= gst_registry_scan_path_level (registry, filename, level - 1);
> -       } else {
> diff --git a/recipes/gstreamer/gstreamer_0.10.17.bb b/recipes/gstreamer/gstreamer_0.10.17.bb
> deleted file mode 100644
> index dd01e16..0000000
> --- a/recipes/gstreamer/gstreamer_0.10.17.bb
> +++ /dev/null
> @@ -1,10 +0,0 @@
> -require gstreamer.inc
> -
> -PR = "r4"
> -
> -SRC_URI += "file://po-makefile-fix.patch \
> -            file://registry-do-not-look-into-debug-dirs.patch "
> -
> -
> -SRC_URI[archive.md5sum] = "3232416ea6fceab628236d67a7d0a44a"
> -SRC_URI[archive.sha256sum] = "442862dc93e734aa58f13bcf3914dc7a40d3fa28f0ae2152c80457438dc3569c"
> diff --git a/recipes/gstreamer/gstreamer_0.10.25.bb b/recipes/gstreamer/gstreamer_0.10.25.bb
> deleted file mode 100644
> index 6ba8a6d..0000000
> --- a/recipes/gstreamer/gstreamer_0.10.25.bb
> +++ /dev/null
> @@ -1,6 +0,0 @@
> -require gstreamer.inc
> -
> -EXTRA_OECONF += "ac_cv_func_register_printf_function=no"
> -
> -SRC_URI[archive.md5sum] = "88544e034a051baf472983791d233076"
> -SRC_URI[archive.sha256sum] = "39b2ba7b3bfa8df6d998a9461e7091c27757e36a53e93969d7d9982a56526578"
> diff --git a/recipes/gstreamer/gstreamer_0.10.31.bb b/recipes/gstreamer/gstreamer_0.10.31.bb
> deleted file mode 100644
> index 8b8eb77..0000000
> --- a/recipes/gstreamer/gstreamer_0.10.31.bb
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -require gstreamer.inc
> -
> -PR = "r2"
> -
> -SRC_URI[archive.md5sum] = "a21fb08bdb578d972c7c14e77da8fbb6"
> -SRC_URI[archive.sha256sum] = "7f737e6d047c1ebeb4e1e0725fc377c5d9f12ee89186de7960be3cbba709ab84"
> -
> -SRC_URI += " \
> -             file://0001-add-GstQueryBuffers-query.patch \
> -             file://0002-gstevent-add-crop-event.patch \
> -             file://0003-basetransform-don-t-do-unnecessary-pad_alloc.patch \
> -"
> -
> -EXTRA_OECONF += "ac_cv_func_register_printf_function=no"
> -
> diff --git a/recipes/obsolete/gstreamer/gst-ffmpeg/armv5.patch b/recipes/obsolete/gstreamer/gst-ffmpeg/armv5.patch
> new file mode 100644
> index 0000000..794709c
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gst-ffmpeg/armv5.patch
> @@ -0,0 +1,1509 @@
> +diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/configure.ac gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/configure.ac
> +--- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/configure.ac	2006-09-23 15:35:21.000000000 +0200
> ++++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/configure.ac	2007-05-01 12:23:39.000000000 +0200
> +@@ -190,7 +190,7 @@
> +     ARCH_X86=yes
> +     ;;
> +   # armv4l is a subset of armv5tel
> +-  armv4l|armv5tel)
> ++  arm|armv4l|armv5tel|armv5te)
> +     TARGET_ARCH="armv4l"
> +     ARCH_ARMV4L=yes
> +     ;;
> +@@ -364,11 +364,8 @@
> + AC_FF_ALLOW_DISABLE(HAVE_IWMMXT, iwmmxt, use ARM/IWMMXT optimizations,[
> +   if test x$TARGET_ARCH = xarmv4l; then
> +     AC_MSG_CHECKING(for support of IWMMXT optimizations)
> +-    AC_TRY_RUN([
> +-        int main () {
> ++    AC_TRY_COMPILE(,[
> +           __asm__ __volatile__ ("wunpckelub wr6, wr4");
> +-          return 0;
> +-        }
> +       ],[ HAVE_IWMMXT=yes && AC_MSG_RESULT(yes) ],[
> +         HAVE_IWMMXT=no && AC_MSG_RESULT(no) ])
> +   else
> +@@ -376,6 +373,19 @@
> +   fi
> + ])
> + 
> ++dnl ARMV5TE
> ++AC_FF_ALLOW_DISABLE(HAVE_ARMV5TE, armv5te, use ARMV5TE optimizations,[
> ++  if test x$TARGET_ARCH = xarmv4l; then
> ++    AC_MSG_CHECKING(for support of ARMV5TE specific instructions)
> ++    AC_TRY_COMPILE(, [
> ++          __asm__ __volatile__ ("smulbb a4,ip,a3");
> ++      ],[ HAVE_ARMV5TE=yes && AC_MSG_RESULT(yes) ],[
> ++        HAVE_ARMV5TE=no && AC_MSG_RESULT(no) ])
> ++  else
> ++    HAVE_ARMV5TE=no
> ++  fi
> ++])
> ++
> + dnl GProf (-p)
> + AC_FF_ALLOW_ENABLE(HAVE_GPROF, gprof, profiling with gprof,[
> +   GPROF_FLAGS="-p"
> +diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_arm.c gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_arm.c
> +--- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_arm.c	2006-09-20 20:55:37.000000000 +0200
> ++++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_arm.c	2007-05-01 12:23:40.000000000 +0200
> +  * ARMv4L optimized DSP utils
> +  * Copyright (c) 2001 Lionel Ulmer.
> +  *
> +- * This library is free software; you can redistribute it and/or
> ++ * This file is part of FFmpeg.
> ++ *
> ++ * FFmpeg is free software; you can redistribute it and/or
> +  * modify it under the terms of the GNU Lesser General Public
> +  * License as published by the Free Software Foundation; either
> +- * version 2 of the License, or (at your option) any later version.
> ++ * version 2.1 of the License, or (at your option) any later version.
> +  *
> +- * This library is distributed in the hope that it will be useful,
> ++ * FFmpeg 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
> +  * Lesser General Public License for more details.
> +  *
> +  * You should have received a copy of the GNU Lesser General Public
> +- * License along with this library; if not, write to the Free Software
> ++ * License along with FFmpeg; if not, write to the Free Software
> +  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> +  */
> + 
> +-#include "dsputil.h"
> ++#include "../dsputil.h"
> + #ifdef HAVE_IPP
> + #include "ipp.h"
> + #endif
> +@@ -27,6 +29,12 @@
> + extern void j_rev_dct_ARM(DCTELEM *data);
> + extern void simple_idct_ARM(DCTELEM *data);
> + 
> ++extern void simple_idct_armv5te(DCTELEM *data);
> ++extern void simple_idct_put_armv5te(uint8_t *dest, int line_size,
> ++                                    DCTELEM *data);
> ++extern void simple_idct_add_armv5te(uint8_t *dest, int line_size,
> ++                                    DCTELEM *data);
> ++
> + /* XXX: local hack */
> + static void (*ff_put_pixels_clamped)(const DCTELEM *block, uint8_t *pixels, int line_size);
> + static void (*ff_add_pixels_clamped)(const DCTELEM *block, uint8_t *pixels, int line_size);
> +@@ -196,8 +204,10 @@
> +     ff_add_pixels_clamped = c->add_pixels_clamped;
> + 
> +     if(idct_algo == FF_IDCT_AUTO){
> +-#ifdef HAVE_IPP
> ++#if defined(HAVE_IPP)
> +         idct_algo = FF_IDCT_IPP;
> ++#elif defined(HAVE_ARMV5TE)
> ++        idct_algo = FF_IDCT_SIMPLEARMV5TE;
> + #else
> +         idct_algo = FF_IDCT_ARM;
> + #endif
> +@@ -213,6 +223,13 @@
> +         c->idct_add= simple_idct_ARM_add;
> +         c->idct    = simple_idct_ARM;
> +         c->idct_permutation_type= FF_NO_IDCT_PERM;
> ++#ifdef HAVE_ARMV5TE
> ++    } else if (idct_algo==FF_IDCT_SIMPLEARMV5TE){
> ++        c->idct_put= simple_idct_put_armv5te;
> ++        c->idct_add= simple_idct_add_armv5te;
> ++        c->idct    = simple_idct_armv5te;
> ++        c->idct_permutation_type = FF_NO_IDCT_PERM;
> ++#endif
> + #ifdef HAVE_IPP
> +     } else if (idct_algo==FF_IDCT_IPP){
> +         c->idct_put= simple_idct_ipp_put;
> +--- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_arm_s.S	2006-02-19 00:04:59.000000000 +0100
> ++++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_arm_s.S	2007-05-01 12:23:40.000000000 +0200
> +@@ -2,20 +2,29 @@
> + @ ARMv4L optimized DSP utils
> + @ Copyright (c) 2004 AGAWA Koji <i (AT) atty (DOT) jp>
> + @
> +-@ This library is free software; you can redistribute it and/or
> ++@ This file is part of FFmpeg.
> ++@
> ++@ FFmpeg is free software; you can redistribute it and/or
> + @ modify it under the terms of the GNU Lesser General Public
> + @ License as published by the Free Software Foundation; either
> +-@ version 2 of the License, or (at your option) any later version.
> ++@ version 2.1 of the License, or (at your option) any later version.
> + @
> +-@ This library is distributed in the hope that it will be useful,
> ++@ FFmpeg 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
> + @ Lesser General Public License for more details.
> + @
> + @ You should have received a copy of the GNU Lesser General Public
> +-@ License along with this library; if not, write to the Free Software
> ++@ License along with FFmpeg; if not, write to the Free Software
> + @ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> + @
> ++#if defined(__ARM_ARCH_5__) || \
> ++    defined(__ARM_ARCH_5T__) || \
> ++    defined(__ARM_ARCH_5TE__)
> ++#define PLD(code...)   code
> ++#else
> ++#define PLD(code...)
> ++#endif
> + 
> + .macro  ADJ_ALIGN_QUADWORD_D shift, Rd0, Rd1, Rd2, Rd3, Rn0, Rn1, Rn2, Rn3, Rn4
> +         mov \Rd0, \Rn0, lsr #(\shift * 8)
> +@@ -74,7 +83,7 @@
> + put_pixels16_arm:
> +         @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h)
> +         @ block = word aligned, pixles = unaligned
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         stmfd sp!, {r4-r11, lr} @ R14 is also called LR
> +         adr r5, 5f
> +         ands r4, r1, #3
> +@@ -85,7 +94,7 @@
> +         ldmia r1, {r4-r7}
> +         add r1, r1, r2
> +         stmia r0, {r4-r7}
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         subs r3, r3, #1
> +         add r0, r0, r2
> +         bne 1b
> +@@ -95,7 +104,7 @@
> +         ldmia r1, {r4-r8}
> +         add r1, r1, r2
> +         ADJ_ALIGN_QUADWORD_D 1, r9, r10, r11, r12, r4, r5, r6, r7, r8
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         subs r3, r3, #1
> +         stmia r0, {r9-r12}
> +         add r0, r0, r2
> +@@ -106,7 +115,7 @@
> +         ldmia r1, {r4-r8}
> +         add r1, r1, r2
> +         ADJ_ALIGN_QUADWORD_D 2, r9, r10, r11, r12, r4, r5, r6, r7, r8
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         subs r3, r3, #1
> +         stmia r0, {r9-r12}
> +         add r0, r0, r2
> +@@ -117,7 +126,7 @@
> +         ldmia r1, {r4-r8}
> +         add r1, r1, r2
> +         ADJ_ALIGN_QUADWORD_D 3, r9, r10, r11, r12, r4, r5, r6, r7, r8
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         subs r3, r3, #1
> +         stmia r0, {r9-r12}
> +         add r0, r0, r2
> +@@ -136,7 +145,7 @@
> + put_pixels8_arm:
> +         @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h)
> +         @ block = word aligned, pixles = unaligned
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         stmfd sp!, {r4-r5,lr} @ R14 is also called LR
> +         adr r5, 5f
> +         ands r4, r1, #3
> +@@ -147,7 +156,7 @@
> +         ldmia r1, {r4-r5}
> +         add r1, r1, r2
> +         subs r3, r3, #1
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         stmia r0, {r4-r5}
> +         add r0, r0, r2
> +         bne 1b
> +@@ -157,7 +166,7 @@
> +         ldmia r1, {r4-r5, r12}
> +         add r1, r1, r2
> +         ADJ_ALIGN_DOUBLEWORD 1, r4, r5, r12
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         subs r3, r3, #1
> +         stmia r0, {r4-r5}
> +         add r0, r0, r2
> +@@ -168,7 +177,7 @@
> +         ldmia r1, {r4-r5, r12}
> +         add r1, r1, r2
> +         ADJ_ALIGN_DOUBLEWORD 2, r4, r5, r12
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         subs r3, r3, #1
> +         stmia r0, {r4-r5}
> +         add r0, r0, r2
> +@@ -179,7 +188,7 @@
> +         ldmia r1, {r4-r5, r12}
> +         add r1, r1, r2
> +         ADJ_ALIGN_DOUBLEWORD 3, r4, r5, r12
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         subs r3, r3, #1
> +         stmia r0, {r4-r5}
> +         add r0, r0, r2
> +@@ -198,7 +207,7 @@
> + put_pixels8_x2_arm:
> +         @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h)
> +         @ block = word aligned, pixles = unaligned
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         stmfd sp!, {r4-r10,lr} @ R14 is also called LR
> +         adr r5, 5f
> +         ands r4, r1, #3
> +@@ -210,7 +219,7 @@
> +         ldmia r1, {r4-r5, r10}
> +         add r1, r1, r2
> +         ADJ_ALIGN_DOUBLEWORD_D 1, r6, r7, r4, r5, r10
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         RND_AVG32 r8, r9, r4, r5, r6, r7, r12
> +         subs r3, r3, #1
> +         stmia r0, {r8-r9}
> +@@ -223,7 +232,7 @@
> +         add r1, r1, r2
> +         ADJ_ALIGN_DOUBLEWORD_D 1, r6, r7, r4, r5, r10
> +         ADJ_ALIGN_DOUBLEWORD_D 2, r8, r9, r4, r5, r10
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         RND_AVG32 r4, r5, r6, r7, r8, r9, r12
> +         subs r3, r3, #1
> +         stmia r0, {r4-r5}
> +@@ -236,7 +245,7 @@
> +         add r1, r1, r2
> +         ADJ_ALIGN_DOUBLEWORD_D 2, r6, r7, r4, r5, r10
> +         ADJ_ALIGN_DOUBLEWORD_D 3, r8, r9, r4, r5, r10
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         RND_AVG32 r4, r5, r6, r7, r8, r9, r12
> +         subs r3, r3, #1
> +         stmia r0, {r4-r5}
> +@@ -248,7 +257,7 @@
> +         ldmia r1, {r4-r5, r10}
> +         add r1, r1, r2
> +         ADJ_ALIGN_DOUBLEWORD_D 3, r6, r7, r4, r5, r10
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         RND_AVG32 r8, r9, r6, r7, r5, r10, r12
> +         subs r3, r3, #1
> +         stmia r0, {r8-r9}
> +@@ -267,7 +276,7 @@
> + put_no_rnd_pixels8_x2_arm:
> +         @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h)
> +         @ block = word aligned, pixles = unaligned
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         stmfd sp!, {r4-r10,lr} @ R14 is also called LR
> +         adr r5, 5f
> +         ands r4, r1, #3
> +@@ -279,7 +288,7 @@
> +         ldmia r1, {r4-r5, r10}
> +         add r1, r1, r2
> +         ADJ_ALIGN_DOUBLEWORD_D 1, r6, r7, r4, r5, r10
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         NO_RND_AVG32 r8, r9, r4, r5, r6, r7, r12
> +         subs r3, r3, #1
> +         stmia r0, {r8-r9}
> +@@ -292,7 +301,7 @@
> +         add r1, r1, r2
> +         ADJ_ALIGN_DOUBLEWORD_D 1, r6, r7, r4, r5, r10
> +         ADJ_ALIGN_DOUBLEWORD_D 2, r8, r9, r4, r5, r10
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         NO_RND_AVG32 r4, r5, r6, r7, r8, r9, r12
> +         subs r3, r3, #1
> +         stmia r0, {r4-r5}
> +@@ -305,7 +314,7 @@
> +         add r1, r1, r2
> +         ADJ_ALIGN_DOUBLEWORD_D 2, r6, r7, r4, r5, r10
> +         ADJ_ALIGN_DOUBLEWORD_D 3, r8, r9, r4, r5, r10
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         NO_RND_AVG32 r4, r5, r6, r7, r8, r9, r12
> +         subs r3, r3, #1
> +         stmia r0, {r4-r5}
> +@@ -317,7 +326,7 @@
> +         ldmia r1, {r4-r5, r10}
> +         add r1, r1, r2
> +         ADJ_ALIGN_DOUBLEWORD_D 3, r6, r7, r4, r5, r10
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         NO_RND_AVG32 r8, r9, r6, r7, r5, r10, r12
> +         subs r3, r3, #1
> +         stmia r0, {r8-r9}
> +@@ -338,7 +347,7 @@
> + put_pixels8_y2_arm:
> +         @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h)
> +         @ block = word aligned, pixles = unaligned
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         stmfd sp!, {r4-r11,lr} @ R14 is also called LR
> +         adr r5, 5f
> +         ands r4, r1, #3
> +@@ -352,13 +361,13 @@
> +         add r1, r1, r2
> + 6:      ldmia r1, {r6-r7}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         RND_AVG32 r8, r9, r4, r5, r6, r7, r12
> +         ldmia r1, {r4-r5}
> +         add r1, r1, r2
> +         stmia r0, {r8-r9}
> +         add r0, r0, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         RND_AVG32 r8, r9, r6, r7, r4, r5, r12
> +         subs r3, r3, #1
> +         stmia r0, {r8-r9}
> +@@ -369,18 +378,18 @@
> + 2:
> +         ldmia r1, {r4-r6}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 1, r4, r5, r6
> + 6:      ldmia r1, {r7-r9}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 1, r7, r8, r9
> +         RND_AVG32 r10, r11, r4, r5, r7, r8, r12
> +         stmia r0, {r10-r11}
> +         add r0, r0, r2
> +         ldmia r1, {r4-r6}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 1, r4, r5, r6
> +         subs r3, r3, #1
> +         RND_AVG32 r10, r11, r7, r8, r4, r5, r12
> +@@ -392,18 +401,18 @@
> + 3:
> +         ldmia r1, {r4-r6}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 2, r4, r5, r6
> + 6:      ldmia r1, {r7-r9}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 2, r7, r8, r9
> +         RND_AVG32 r10, r11, r4, r5, r7, r8, r12
> +         stmia r0, {r10-r11}
> +         add r0, r0, r2
> +         ldmia r1, {r4-r6}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 2, r4, r5, r6
> +         subs r3, r3, #1
> +         RND_AVG32 r10, r11, r7, r8, r4, r5, r12
> +@@ -415,18 +424,18 @@
> + 4:
> +         ldmia r1, {r4-r6}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 3, r4, r5, r6
> + 6:      ldmia r1, {r7-r9}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 3, r7, r8, r9
> +         RND_AVG32 r10, r11, r4, r5, r7, r8, r12
> +         stmia r0, {r10-r11}
> +         add r0, r0, r2
> +         ldmia r1, {r4-r6}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 3, r4, r5, r6
> +         subs r3, r3, #1
> +         RND_AVG32 r10, r11, r7, r8, r4, r5, r12
> +@@ -447,7 +456,7 @@
> + put_no_rnd_pixels8_y2_arm:
> +         @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h)
> +         @ block = word aligned, pixles = unaligned
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         stmfd sp!, {r4-r11,lr} @ R14 is also called LR
> +         adr r5, 5f
> +         ands r4, r1, #3
> +@@ -461,13 +470,13 @@
> +         add r1, r1, r2
> + 6:      ldmia r1, {r6-r7}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         NO_RND_AVG32 r8, r9, r4, r5, r6, r7, r12
> +         ldmia r1, {r4-r5}
> +         add r1, r1, r2
> +         stmia r0, {r8-r9}
> +         add r0, r0, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         NO_RND_AVG32 r8, r9, r6, r7, r4, r5, r12
> +         subs r3, r3, #1
> +         stmia r0, {r8-r9}
> +@@ -478,18 +487,18 @@
> + 2:
> +         ldmia r1, {r4-r6}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 1, r4, r5, r6
> + 6:      ldmia r1, {r7-r9}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 1, r7, r8, r9
> +         NO_RND_AVG32 r10, r11, r4, r5, r7, r8, r12
> +         stmia r0, {r10-r11}
> +         add r0, r0, r2
> +         ldmia r1, {r4-r6}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 1, r4, r5, r6
> +         subs r3, r3, #1
> +         NO_RND_AVG32 r10, r11, r7, r8, r4, r5, r12
> +@@ -501,18 +510,18 @@
> + 3:
> +         ldmia r1, {r4-r6}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 2, r4, r5, r6
> + 6:      ldmia r1, {r7-r9}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 2, r7, r8, r9
> +         NO_RND_AVG32 r10, r11, r4, r5, r7, r8, r12
> +         stmia r0, {r10-r11}
> +         add r0, r0, r2
> +         ldmia r1, {r4-r6}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 2, r4, r5, r6
> +         subs r3, r3, #1
> +         NO_RND_AVG32 r10, r11, r7, r8, r4, r5, r12
> +@@ -524,18 +533,18 @@
> + 4:
> +         ldmia r1, {r4-r6}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 3, r4, r5, r6
> + 6:      ldmia r1, {r7-r9}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 3, r7, r8, r9
> +         NO_RND_AVG32 r10, r11, r4, r5, r7, r8, r12
> +         stmia r0, {r10-r11}
> +         add r0, r0, r2
> +         ldmia r1, {r4-r6}
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         ADJ_ALIGN_DOUBLEWORD 3, r4, r5, r6
> +         subs r3, r3, #1
> +         NO_RND_AVG32 r10, r11, r7, r8, r4, r5, r12
> +@@ -562,7 +571,7 @@
> +         ldmia r1, {r8-r10}
> + .endif
> +         add r1, r1, r2
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> + .if \align == 0
> +         ADJ_ALIGN_DOUBLEWORD_D 1, r4, r5, r6, r7, r8
> + .elseif \align == 1
> +@@ -624,7 +633,7 @@
> + put_pixels8_xy2_arm:
> +         @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h)
> +         @ block = word aligned, pixles = unaligned
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         stmfd sp!, {r4-r11,lr} @ R14 is also called LR
> +         adrl r12, 5f
> +         ands r4, r1, #3
> +@@ -661,7 +670,7 @@
> + put_no_rnd_pixels8_xy2_arm:
> +         @ void func(uint8_t *block, const uint8_t *pixels, int line_size, int h)
> +         @ block = word aligned, pixles = unaligned
> +-        pld [r1]
> ++        PLD ( pld [r1] )
> +         stmfd sp!, {r4-r11,lr} @ R14 is also called LR
> +         adrl r12, 5f
> +         ands r4, r1, #3
> +diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_iwmmxt.c gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_iwmmxt.c
> +--- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_iwmmxt.c	2006-02-19 00:04:59.000000000 +0100
> ++++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_iwmmxt.c	2007-05-01 12:23:40.000000000 +0200
> +@@ -2,18 +2,20 @@
> +  * iWMMXt optimized DSP utils
> +  * Copyright (c) 2004 AGAWA Koji
> +  *
> +- * This library is free software; you can redistribute it and/or
> ++ * This file is part of FFmpeg.
> ++ *
> ++ * FFmpeg is free software; you can redistribute it and/or
> +  * modify it under the terms of the GNU Lesser General Public
> +  * License as published by the Free Software Foundation; either
> +- * version 2 of the License, or (at your option) any later version.
> ++ * version 2.1 of the License, or (at your option) any later version.
> +  *
> +- * This library is distributed in the hope that it will be useful,
> ++ * FFmpeg 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
> +  * Lesser General Public License for more details.
> +  *
> +  * You should have received a copy of the GNU Lesser General Public
> +- * License along with this library; if not, write to the Free Software
> ++ * License along with FFmpeg; if not, write to the Free Software
> +  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> +  */
> + 
> +diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_iwmmxt_rnd.h gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_iwmmxt_rnd.h
> +--- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_iwmmxt_rnd.h	2006-09-20 20:55:37.000000000 +0200
> ++++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/dsputil_iwmmxt_rnd.h	2007-05-01 12:23:40.000000000 +0200
> +@@ -2,18 +2,20 @@
> +  * iWMMXt optimized DSP utils
> +  * copyright (c) 2004 AGAWA Koji
> +  *
> +- * This library is free software; you can redistribute it and/or
> ++ * This file is part of FFmpeg.
> ++ *
> ++ * FFmpeg is free software; you can redistribute it and/or
> +  * modify it under the terms of the GNU Lesser General Public
> +  * License as published by the Free Software Foundation; either
> +- * version 2 of the License, or (at your option) any later version.
> ++ * version 2.1 of the License, or (at your option) any later version.
> +  *
> +- * This library is distributed in the hope that it will be useful,
> ++ * FFmpeg 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
> +  * Lesser General Public License for more details.
> +  *
> +  * You should have received a copy of the GNU Lesser General Public
> +- * License along with this library; if not, write to the Free Software
> ++ * License along with FFmpeg; if not, write to the Free Software
> +  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> +  */
> + 
> +diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/Makefile.am gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/Makefile.am
> +--- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/Makefile.am	2006-09-22 06:07:23.000000000 +0200
> ++++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/Makefile.am	2007-05-01 12:23:40.000000000 +0200
> +@@ -7,9 +7,14 @@
> + iwmmxt_libs = libiwmmxt.la
> + endif
> + 
> ++if HAVE_ARMV5TE
> ++armv5te_libs = libarmv5te.la
> ++endif
> ++
> + noinst_LTLIBRARIES = \
> + 	libarmv4l.la \
> +-	$(iwmmxt_libs)
> ++	$(iwmmxt_libs) \
> ++	$(armv5te_libs)
> + 
> + libarmv4l_la_SOURCES = \
> + 	jrevdct_arm.S \
> +@@ -18,6 +23,9 @@
> + 	dsputil_arm.c \
> + 	mpegvideo_arm.c
> + 
> ++libarmv5te_la_SOURCES = \
> ++	simple_idct_armv5te.S
> ++
> + libiwmmxt_la_SOURCES = \
> + 	dsputil_iwmmxt.c \
> + 	mpegvideo_iwmmxt.c
> +diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/mathops.h gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/mathops.h
> +--- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/mathops.h	2006-09-22 06:07:23.000000000 +0200
> ++++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/mathops.h	2007-05-01 12:23:40.000000000 +0200
> +@@ -2,18 +2,20 @@
> +  * simple math operations
> +  * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al
> +  *
> +- * This library is free software; you can redistribute it and/or
> ++ * This file is part of FFmpeg.
> ++ *
> ++ * FFmpeg is free software; you can redistribute it and/or
> +  * modify it under the terms of the GNU Lesser General Public
> +  * License as published by the Free Software Foundation; either
> +- * version 2 of the License, or (at your option) any later version.
> ++ * version 2.1 of the License, or (at your option) any later version.
> +  *
> +- * This library is distributed in the hope that it will be useful,
> ++ * FFmpeg 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
> +  * Lesser General Public License for more details.
> +  *
> +  * You should have received a copy of the GNU Lesser General Public
> +- * License along with this library; if not, write to the Free Software
> ++ * License along with FFmpeg; if not, write to the Free Software
> +  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> +  */
> + 
> +@@ -39,9 +41,9 @@
> + #   define MAC16(rt, ra, rb) \
> +         asm ("smlabb %0, %2, %3, %0" : "=r" (rt) : "0" (rt), "r" (ra), "r" (rb));
> + /* signed 16x16 -> 32 multiply */
> +-#   define MUL16(ra, rb) \
> +-        ({ int __rt;\
> +-         asm ("smulbb %0, %1, %2" : "=r" (__rt) : "r" (ra), "r" (rb));
> ++#   define MUL16(ra, rb)                                                \
> ++        ({ int __rt;                                                    \
> ++         asm ("smulbb %0, %1, %2" : "=r" (__rt) : "r" (ra), "r" (rb));  \
> +          __rt; })
> + 
> + #endif
> +diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/mpegvideo_arm.c gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/mpegvideo_arm.c
> +--- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/mpegvideo_arm.c	2006-02-19 00:04:59.000000000 +0100
> ++++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/mpegvideo_arm.c	2007-05-01 12:23:40.000000000 +0200
> +@@ -1,25 +1,27 @@
> + /*
> +  * Copyright (c) 2002 Michael Niedermayer
> +  *
> +- * This library is free software; you can redistribute it and/or
> ++ * This file is part of FFmpeg.
> ++ *
> ++ * FFmpeg is free software; you can redistribute it and/or
> +  * modify it under the terms of the GNU Lesser General Public
> +  * License as published by the Free Software Foundation; either
> +- * version 2 of the License, or (at your option) any later version.
> ++ * version 2.1 of the License, or (at your option) any later version.
> +  *
> +- * This library is distributed in the hope that it will be useful,
> ++ * FFmpeg 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
> +  * Lesser General Public License for more details.
> +  *
> +  * You should have received a copy of the GNU Lesser General Public
> +- * License along with this library; if not, write to the Free Software
> ++ * License along with FFmpeg; if not, write to the Free Software
> +  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> +  *
> +  */
> + 
> +-#include "dsputil.h"
> +-#include "mpegvideo.h"
> +-#include "avcodec.h"
> ++#include "../dsputil.h"
> ++#include "../mpegvideo.h"
> ++#include "../avcodec.h"
> + 
> + extern void MPV_common_init_iwmmxt(MpegEncContext *s);
> + 
> +diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/mpegvideo_iwmmxt.c gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/mpegvideo_iwmmxt.c
> +--- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/mpegvideo_iwmmxt.c	2006-09-20 20:55:37.000000000 +0200
> ++++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/mpegvideo_iwmmxt.c	2007-05-01 12:23:40.000000000 +0200
> +@@ -1,18 +1,20 @@
> + /*
> +  * copyright (c) 2004 AGAWA Koji
> +  *
> +- * This library is free software; you can redistribute it and/or
> ++ * This file is part of FFmpeg.
> ++ *
> ++ * FFmpeg is free software; you can redistribute it and/or
> +  * modify it under the terms of the GNU Lesser General Public
> +  * License as published by the Free Software Foundation; either
> +- * version 2 of the License, or (at your option) any later version.
> ++ * version 2.1 of the License, or (at your option) any later version.
> +  *
> +- * This library is distributed in the hope that it will be useful,
> ++ * FFmpeg 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
> +  * Lesser General Public License for more details.
> +  *
> +  * You should have received a copy of the GNU Lesser General Public
> +- * License along with this library; if not, write to the Free Software
> ++ * License along with FFmpeg; if not, write to the Free Software
> +  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> +  */
> + 
> +diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/simple_idct_arm.S gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/simple_idct_arm.S
> +--- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/simple_idct_arm.S	2006-09-20 20:55:37.000000000 +0200
> ++++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/simple_idct_arm.S	2007-05-01 12:23:40.000000000 +0200
> +@@ -5,18 +5,20 @@
> +  *
> +  * Author: Frederic Boulay <dilb@handhelds.org>
> +  *
> +- * This library is free software; you can redistribute it and/or
> ++ * This file is part of FFmpeg.
> ++ *
> ++ * FFmpeg is free software; you can redistribute it and/or
> +  * modify it under the terms of the GNU Lesser General Public
> +  * License as published by the Free Software Foundation; either
> +- * version 2 of the License, or (at your option) any later version.
> ++ * version 2.1 of the License, or (at your option) any later version.
> +  *
> +- * This library is distributed in the hope that it will be useful,
> ++ * FFmpeg 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
> +  * Lesser General Public License for more details.
> +  *
> +  * You should have received a copy of the GNU Lesser General Public
> +- * License along with this library; if not, write to the Free Software
> ++ * License along with FFmpeg; if not, write to the Free Software
> +  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> +  *
> +  * The function defined in this file, is derived from the simple_idct function
> +diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/simple_idct_armv5te.S gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/simple_idct_armv5te.S
> +--- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/armv4l/simple_idct_armv5te.S	1970-01-01 01:00:00.000000000 +0100
> ++++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/armv4l/simple_idct_armv5te.S	2007-05-01 12:23:40.000000000 +0200
> +@@ -0,0 +1,718 @@
> ++/*
> ++ * Simple IDCT
> ++ *
> ++ * Copyright (c) 2001 Michael Niedermayer <michaelni@gmx.at>
> ++ * Copyright (c) 2006 Mans Rullgard <mru@inprovide.com>
> ++ *
> ++ * This file is part of FFmpeg.
> ++ *
> ++ * FFmpeg is free software; you can redistribute it and/or
> ++ * modify it under the terms of the GNU Lesser General Public
> ++ * License as published by the Free Software Foundation; either
> ++ * version 2.1 of the License, or (at your option) any later version.
> ++ *
> ++ * FFmpeg 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
> ++ * Lesser General Public License for more details.
> ++ *
> ++ * You should have received a copy of the GNU Lesser General Public
> ++ * License along with FFmpeg; if not, write to the Free Software
> ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> ++ */
> ++
> ++#define W1  22725   /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
> ++#define W2  21407   /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
> ++#define W3  19266   /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
> ++#define W4  16383   /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
> ++#define W5  12873   /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
> ++#define W6  8867    /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
> ++#define W7  4520    /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
> ++#define ROW_SHIFT 11
> ++#define COL_SHIFT 20
> ++
> ++#define W13 (W1 | (W3 << 16))
> ++#define W26 (W2 | (W6 << 16))
> ++#define W57 (W5 | (W7 << 16))
> ++
> ++        .text
> ++        .align
> ++w13:    .long W13
> ++w26:    .long W26
> ++w57:    .long W57
> ++
> ++        .align
> ++        .func idct_row_armv5te
> ++idct_row_armv5te:
> ++        str    lr, [sp, #-4]!
> ++
> ++        ldrd   v1, [a1, #8]
> ++        ldrd   a3, [a1]              /* a3 = row[1:0], a4 = row[3:2] */
> ++        orrs   v1, v1, v2
> ++        cmpeq  v1, a4
> ++        cmpeq  v1, a3, lsr #16
> ++        beq    row_dc_only
> ++
> ++        mov    v1, #(1<<(ROW_SHIFT-1))
> ++        mov    ip, #16384
> ++        sub    ip, ip, #1            /* ip = W4 */
> ++        smlabb v1, ip, a3, v1        /* v1 = W4*row[0]+(1<<(RS-1)) */
> ++        ldr    ip, [pc, #(w26-.-8)]  /* ip = W2 | (W6 << 16) */
> ++        smultb a2, ip, a4
> ++        smulbb lr, ip, a4
> ++        add    v2, v1, a2
> ++        sub    v3, v1, a2
> ++        sub    v4, v1, lr
> ++        add    v1, v1, lr
> ++
> ++        ldr    ip, [pc, #(w13-.-8)]  /* ip = W1 | (W3 << 16) */
> ++        ldr    lr, [pc, #(w57-.-8)]  /* lr = W5 | (W7 << 16) */
> ++        smulbt v5, ip, a3
> ++        smultt v6, lr, a4
> ++        smlatt v5, ip, a4, v5
> ++        smultt a2, ip, a3
> ++        smulbt v7, lr, a3
> ++        sub    v6, v6, a2
> ++        smulbt a2, ip, a4
> ++        smultt fp, lr, a3
> ++        sub    v7, v7, a2
> ++        smulbt a2, lr, a4
> ++        ldrd   a3, [a1, #8]          /* a3=row[5:4] a4=row[7:6] */
> ++        sub    fp, fp, a2
> ++
> ++        orrs   a2, a3, a4
> ++        beq    1f
> ++
> ++        smlabt v5, lr, a3, v5
> ++        smlabt v6, ip, a3, v6
> ++        smlatt v5, lr, a4, v5
> ++        smlabt v6, lr, a4, v6
> ++        smlatt v7, lr, a3, v7
> ++        smlatt fp, ip, a3, fp
> ++        smulbt a2, ip, a4
> ++        smlatt v7, ip, a4, v7
> ++        sub    fp, fp, a2
> ++
> ++        ldr    ip, [pc, #(w26-.-8)]  /* ip = W2 | (W6 << 16) */
> ++        mov    a2, #16384
> ++        sub    a2, a2, #1            /* a2 =  W4 */
> ++        smulbb a2, a2, a3            /* a2 =  W4*row[4] */
> ++        smultb lr, ip, a4            /* lr =  W6*row[6] */
> ++        add    v1, v1, a2            /* v1 += W4*row[4] */
> ++        add    v1, v1, lr            /* v1 += W6*row[6] */
> ++        add    v4, v4, a2            /* v4 += W4*row[4] */
> ++        sub    v4, v4, lr            /* v4 -= W6*row[6] */
> ++        smulbb lr, ip, a4            /* lr =  W2*row[6] */
> ++        sub    v2, v2, a2            /* v2 -= W4*row[4] */
> ++        sub    v2, v2, lr            /* v2 -= W2*row[6] */
> ++        sub    v3, v3, a2            /* v3 -= W4*row[4] */
> ++        add    v3, v3, lr            /* v3 += W2*row[6] */
> ++
> ++1:      add    a2, v1, v5
> ++        mov    a3, a2, lsr #11
> ++        bic    a3, a3, #0x1f0000
> ++        sub    a2, v2, v6
> ++        mov    a2, a2, lsr #11
> ++        add    a3, a3, a2, lsl #16
> ++        add    a2, v3, v7
> ++        mov    a4, a2, lsr #11
> ++        bic    a4, a4, #0x1f0000
> ++        add    a2, v4, fp
> ++        mov    a2, a2, lsr #11
> ++        add    a4, a4, a2, lsl #16
> ++        strd   a3, [a1]
> ++
> ++        sub    a2, v4, fp
> ++        mov    a3, a2, lsr #11
> ++        bic    a3, a3, #0x1f0000
> ++        sub    a2, v3, v7
> ++        mov    a2, a2, lsr #11
> ++        add    a3, a3, a2, lsl #16
> ++        add    a2, v2, v6
> ++        mov    a4, a2, lsr #11
> ++        bic    a4, a4, #0x1f0000
> ++        sub    a2, v1, v5
> ++        mov    a2, a2, lsr #11
> ++        add    a4, a4, a2, lsl #16
> ++        strd   a3, [a1, #8]
> ++
> ++        ldr    pc, [sp], #4
> ++
> ++row_dc_only:
> ++        orr    a3, a3, a3, lsl #16
> ++        bic    a3, a3, #0xe000
> ++        mov    a3, a3, lsl #3
> ++        mov    a4, a3
> ++        strd   a3, [a1]
> ++        strd   a3, [a1, #8]
> ++
> ++        ldr    pc, [sp], #4
> ++        .endfunc
> ++
> ++        .macro idct_col
> ++        ldr    a4, [a1]              /* a4 = col[1:0] */
> ++        mov    ip, #16384
> ++        sub    ip, ip, #1            /* ip = W4 */
> ++#if 0
> ++        mov    v1, #(1<<(COL_SHIFT-1))
> ++        smlabt v2, ip, a4, v1        /* v2 = W4*col[1] + (1<<(COL_SHIFT-1)) */
> ++        smlabb v1, ip, a4, v1        /* v1 = W4*col[0] + (1<<(COL_SHIFT-1)) */
> ++        ldr    a4, [a1, #(16*4)]
> ++#else
> ++        mov    v1, #((1<<(COL_SHIFT-1))/W4) /* this matches the C version */
> ++        add    v2, v1, a4, asr #16
> ++        rsb    v2, v2, v2, lsl #14
> ++        mov    a4, a4, lsl #16
> ++        add    v1, v1, a4, asr #16
> ++        ldr    a4, [a1, #(16*4)]
> ++        rsb    v1, v1, v1, lsl #14
> ++#endif
> ++
> ++        smulbb lr, ip, a4
> ++        smulbt a3, ip, a4
> ++        sub    v3, v1, lr
> ++        sub    v5, v1, lr
> ++        add    v7, v1, lr
> ++        add    v1, v1, lr
> ++        sub    v4, v2, a3
> ++        sub    v6, v2, a3
> ++        add    fp, v2, a3
> ++        ldr    ip, [pc, #(w26-.-8)]
> ++        ldr    a4, [a1, #(16*2)]
> ++        add    v2, v2, a3
> ++
> ++        smulbb lr, ip, a4
> ++        smultb a3, ip, a4
> ++        add    v1, v1, lr
> ++        sub    v7, v7, lr
> ++        add    v3, v3, a3
> ++        sub    v5, v5, a3
> ++        smulbt lr, ip, a4
> ++        smultt a3, ip, a4
> ++        add    v2, v2, lr
> ++        sub    fp, fp, lr
> ++        add    v4, v4, a3
> ++        ldr    a4, [a1, #(16*6)]
> ++        sub    v6, v6, a3
> ++
> ++        smultb lr, ip, a4
> ++        smulbb a3, ip, a4
> ++        add    v1, v1, lr
> ++        sub    v7, v7, lr
> ++        sub    v3, v3, a3
> ++        add    v5, v5, a3
> ++        smultt lr, ip, a4
> ++        smulbt a3, ip, a4
> ++        add    v2, v2, lr
> ++        sub    fp, fp, lr
> ++        sub    v4, v4, a3
> ++        add    v6, v6, a3
> ++
> ++        stmfd  sp!, {v1, v2, v3, v4, v5, v6, v7, fp}
> ++
> ++        ldr    ip, [pc, #(w13-.-8)]
> ++        ldr    a4, [a1, #(16*1)]
> ++        ldr    lr, [pc, #(w57-.-8)]
> ++        smulbb v1, ip, a4
> ++        smultb v3, ip, a4
> ++        smulbb v5, lr, a4
> ++        smultb v7, lr, a4
> ++        smulbt v2, ip, a4
> ++        smultt v4, ip, a4
> ++        smulbt v6, lr, a4
> ++        smultt fp, lr, a4
> ++        rsb    v4, v4, #0
> ++        ldr    a4, [a1, #(16*3)]
> ++        rsb    v3, v3, #0
> ++
> ++        smlatb v1, ip, a4, v1
> ++        smlatb v3, lr, a4, v3
> ++        smulbb a3, ip, a4
> ++        smulbb a2, lr, a4
> ++        sub    v5, v5, a3
> ++        sub    v7, v7, a2
> ++        smlatt v2, ip, a4, v2
> ++        smlatt v4, lr, a4, v4
> ++        smulbt a3, ip, a4
> ++        smulbt a2, lr, a4
> ++        sub    v6, v6, a3
> ++        ldr    a4, [a1, #(16*5)]
> ++        sub    fp, fp, a2
> ++
> ++        smlabb v1, lr, a4, v1
> ++        smlabb v3, ip, a4, v3
> ++        smlatb v5, lr, a4, v5
> ++        smlatb v7, ip, a4, v7
> ++        smlabt v2, lr, a4, v2
> ++        smlabt v4, ip, a4, v4
> ++        smlatt v6, lr, a4, v6
> ++        ldr    a3, [a1, #(16*7)]
> ++        smlatt fp, ip, a4, fp
> ++
> ++        smlatb v1, lr, a3, v1
> ++        smlabb v3, lr, a3, v3
> ++        smlatb v5, ip, a3, v5
> ++        smulbb a4, ip, a3
> ++        smlatt v2, lr, a3, v2
> ++        sub    v7, v7, a4
> ++        smlabt v4, lr, a3, v4
> ++        smulbt a4, ip, a3
> ++        smlatt v6, ip, a3, v6
> ++        sub    fp, fp, a4
> ++        .endm
> ++
> ++        .align
> ++        .func idct_col_armv5te
> ++idct_col_armv5te:
> ++        str    lr, [sp, #-4]!
> ++
> ++        idct_col
> ++
> ++        ldmfd  sp!, {a3, a4}
> ++        adds   a2, a3, v1
> ++        mov    a2, a2, lsr #20
> ++        orrmi  a2, a2, #0xf000
> ++        add    ip, a4, v2
> ++        mov    ip, ip, asr #20
> ++        orr    a2, a2, ip, lsl #16
> ++        str    a2, [a1]
> ++        subs   a3, a3, v1
> ++        mov    a2, a3, lsr #20
> ++        orrmi  a2, a2, #0xf000
> ++        sub    a4, a4, v2
> ++        mov    a4, a4, asr #20
> ++        orr    a2, a2, a4, lsl #16
> ++        ldmfd  sp!, {a3, a4}
> ++        str    a2, [a1, #(16*7)]
> ++
> ++        subs   a2, a3, v3
> ++        mov    a2, a2, lsr #20
> ++        orrmi  a2, a2, #0xf000
> ++        sub    ip, a4, v4
> ++        mov    ip, ip, asr #20
> ++        orr    a2, a2, ip, lsl #16
> ++        str    a2, [a1, #(16*1)]
> ++        adds   a3, a3, v3
> ++        mov    a2, a3, lsr #20
> ++        orrmi  a2, a2, #0xf000
> ++        add    a4, a4, v4
> ++        mov    a4, a4, asr #20
> ++        orr    a2, a2, a4, lsl #16
> ++        ldmfd  sp!, {a3, a4}
> ++        str    a2, [a1, #(16*6)]
> ++
> ++        adds   a2, a3, v5
> ++        mov    a2, a2, lsr #20
> ++        orrmi  a2, a2, #0xf000
> ++        add    ip, a4, v6
> ++        mov    ip, ip, asr #20
> ++        orr    a2, a2, ip, lsl #16
> ++        str    a2, [a1, #(16*2)]
> ++        subs   a3, a3, v5
> ++        mov    a2, a3, lsr #20
> ++        orrmi  a2, a2, #0xf000
> ++        sub    a4, a4, v6
> ++        mov    a4, a4, asr #20
> ++        orr    a2, a2, a4, lsl #16
> ++        ldmfd  sp!, {a3, a4}
> ++        str    a2, [a1, #(16*5)]
> ++
> ++        adds   a2, a3, v7
> ++        mov    a2, a2, lsr #20
> ++        orrmi  a2, a2, #0xf000
> ++        add    ip, a4, fp
> ++        mov    ip, ip, asr #20
> ++        orr    a2, a2, ip, lsl #16
> ++        str    a2, [a1, #(16*3)]
> ++        subs   a3, a3, v7
> ++        mov    a2, a3, lsr #20
> ++        orrmi  a2, a2, #0xf000
> ++        sub    a4, a4, fp
> ++        mov    a4, a4, asr #20
> ++        orr    a2, a2, a4, lsl #16
> ++        str    a2, [a1, #(16*4)]
> ++
> ++        ldr    pc, [sp], #4
> ++        .endfunc
> ++
> ++        .align
> ++        .func idct_col_put_armv5te
> ++idct_col_put_armv5te:
> ++        str    lr, [sp, #-4]!
> ++
> ++        idct_col
> ++
> ++        ldmfd  sp!, {a3, a4}
> ++        ldr    lr, [sp, #32]
> ++        add    a2, a3, v1
> ++        movs   a2, a2, asr #20
> ++        movmi  a2, #0
> ++        cmp    a2, #255
> ++        movgt  a2, #255
> ++        add    ip, a4, v2
> ++        movs   ip, ip, asr #20
> ++        movmi  ip, #0
> ++        cmp    ip, #255
> ++        movgt  ip, #255
> ++        orr    a2, a2, ip, lsl #8
> ++        sub    a3, a3, v1
> ++        movs   a3, a3, asr #20
> ++        movmi  a3, #0
> ++        cmp    a3, #255
> ++        movgt  a3, #255
> ++        sub    a4, a4, v2
> ++        movs   a4, a4, asr #20
> ++        movmi  a4, #0
> ++        cmp    a4, #255
> ++        ldr    v1, [sp, #28]
> ++        movgt  a4, #255
> ++        strh   a2, [v1]
> ++        add    a2, v1, #2
> ++        str    a2, [sp, #28]
> ++        orr    a2, a3, a4, lsl #8
> ++        rsb    v2, lr, lr, lsl #3
> ++        ldmfd  sp!, {a3, a4}
> ++        strh   a2, [v2, v1]!
> ++
> ++        sub    a2, a3, v3
> ++        movs   a2, a2, asr #20
> ++        movmi  a2, #0
> ++        cmp    a2, #255
> ++        movgt  a2, #255
> ++        sub    ip, a4, v4
> ++        movs   ip, ip, asr #20
> ++        movmi  ip, #0
> ++        cmp    ip, #255
> ++        movgt  ip, #255
> ++        orr    a2, a2, ip, lsl #8
> ++        strh   a2, [v1, lr]!
> ++        add    a3, a3, v3
> ++        movs   a2, a3, asr #20
> ++        movmi  a2, #0
> ++        cmp    a2, #255
> ++        movgt  a2, #255
> ++        add    a4, a4, v4
> ++        movs   a4, a4, asr #20
> ++        movmi  a4, #0
> ++        cmp    a4, #255
> ++        movgt  a4, #255
> ++        orr    a2, a2, a4, lsl #8
> ++        ldmfd  sp!, {a3, a4}
> ++        strh   a2, [v2, -lr]!
> ++
> ++        add    a2, a3, v5
> ++        movs   a2, a2, asr #20
> ++        movmi  a2, #0
> ++        cmp    a2, #255
> ++        movgt  a2, #255
> ++        add    ip, a4, v6
> ++        movs   ip, ip, asr #20
> ++        movmi  ip, #0
> ++        cmp    ip, #255
> ++        movgt  ip, #255
> ++        orr    a2, a2, ip, lsl #8
> ++        strh   a2, [v1, lr]!
> ++        sub    a3, a3, v5
> ++        movs   a2, a3, asr #20
> ++        movmi  a2, #0
> ++        cmp    a2, #255
> ++        movgt  a2, #255
> ++        sub    a4, a4, v6
> ++        movs   a4, a4, asr #20
> ++        movmi  a4, #0
> ++        cmp    a4, #255
> ++        movgt  a4, #255
> ++        orr    a2, a2, a4, lsl #8
> ++        ldmfd  sp!, {a3, a4}
> ++        strh   a2, [v2, -lr]!
> ++
> ++        add    a2, a3, v7
> ++        movs   a2, a2, asr #20
> ++        movmi  a2, #0
> ++        cmp    a2, #255
> ++        movgt  a2, #255
> ++        add    ip, a4, fp
> ++        movs   ip, ip, asr #20
> ++        movmi  ip, #0
> ++        cmp    ip, #255
> ++        movgt  ip, #255
> ++        orr    a2, a2, ip, lsl #8
> ++        strh   a2, [v1, lr]
> ++        sub    a3, a3, v7
> ++        movs   a2, a3, asr #20
> ++        movmi  a2, #0
> ++        cmp    a2, #255
> ++        movgt  a2, #255
> ++        sub    a4, a4, fp
> ++        movs   a4, a4, asr #20
> ++        movmi  a4, #0
> ++        cmp    a4, #255
> ++        movgt  a4, #255
> ++        orr    a2, a2, a4, lsl #8
> ++        strh   a2, [v2, -lr]
> ++
> ++        ldr    pc, [sp], #4
> ++        .endfunc
> ++
> ++        .align
> ++        .func idct_col_add_armv5te
> ++idct_col_add_armv5te:
> ++        str    lr, [sp, #-4]!
> ++
> ++        idct_col
> ++
> ++        ldr    lr, [sp, #36]
> ++
> ++        ldmfd  sp!, {a3, a4}
> ++        ldrh   ip, [lr]
> ++        add    a2, a3, v1
> ++        mov    a2, a2, asr #20
> ++        sub    a3, a3, v1
> ++        and    v1, ip, #255
> ++        adds   a2, a2, v1
> ++        movmi  a2, #0
> ++        cmp    a2, #255
> ++        movgt  a2, #255
> ++        add    v1, a4, v2
> ++        mov    v1, v1, asr #20
> ++        adds   v1, v1, ip, lsr #8
> ++        movmi  v1, #0
> ++        cmp    v1, #255
> ++        movgt  v1, #255
> ++        orr    a2, a2, v1, lsl #8
> ++        ldr    v1, [sp, #32]
> ++        sub    a4, a4, v2
> ++        rsb    v2, v1, v1, lsl #3
> ++        ldrh   ip, [v2, lr]!
> ++        strh   a2, [lr]
> ++        mov    a3, a3, asr #20
> ++        and    a2, ip, #255
> ++        adds   a3, a3, a2
> ++        movmi  a3, #0
> ++        cmp    a3, #255
> ++        movgt  a3, #255
> ++        mov    a4, a4, asr #20
> ++        adds   a4, a4, ip, lsr #8
> ++        movmi  a4, #0
> ++        cmp    a4, #255
> ++        movgt  a4, #255
> ++        add    a2, lr, #2
> ++        str    a2, [sp, #28]
> ++        orr    a2, a3, a4, lsl #8
> ++        strh   a2, [v2]
> ++
> ++        ldmfd  sp!, {a3, a4}
> ++        ldrh   ip, [lr, v1]!
> ++        sub    a2, a3, v3
> ++        mov    a2, a2, asr #20
> ++        add    a3, a3, v3
> ++        and    v3, ip, #255
> ++        adds   a2, a2, v3
> ++        movmi  a2, #0
> ++        cmp    a2, #255
> ++        movgt  a2, #255
> ++        sub    v3, a4, v4
> ++        mov    v3, v3, asr #20
> ++        adds   v3, v3, ip, lsr #8
> ++        movmi  v3, #0
> ++        cmp    v3, #255
> ++        movgt  v3, #255
> ++        orr    a2, a2, v3, lsl #8
> ++        add    a4, a4, v4
> ++        ldrh   ip, [v2, -v1]!
> ++        strh   a2, [lr]
> ++        mov    a3, a3, asr #20
> ++        and    a2, ip, #255
> ++        adds   a3, a3, a2
> ++        movmi  a3, #0
> ++        cmp    a3, #255
> ++        movgt  a3, #255
> ++        mov    a4, a4, asr #20
> ++        adds   a4, a4, ip, lsr #8
> ++        movmi  a4, #0
> ++        cmp    a4, #255
> ++        movgt  a4, #255
> ++        orr    a2, a3, a4, lsl #8
> ++        strh   a2, [v2]
> ++
> ++        ldmfd  sp!, {a3, a4}
> ++        ldrh   ip, [lr, v1]!
> ++        add    a2, a3, v5
> ++        mov    a2, a2, asr #20
> ++        sub    a3, a3, v5
> ++        and    v3, ip, #255
> ++        adds   a2, a2, v3
> ++        movmi  a2, #0
> ++        cmp    a2, #255
> ++        movgt  a2, #255
> ++        add    v3, a4, v6
> ++        mov    v3, v3, asr #20
> ++        adds   v3, v3, ip, lsr #8
> ++        movmi  v3, #0
> ++        cmp    v3, #255
> ++        movgt  v3, #255
> ++        orr    a2, a2, v3, lsl #8
> ++        sub    a4, a4, v6
> ++        ldrh   ip, [v2, -v1]!
> ++        strh   a2, [lr]
> ++        mov    a3, a3, asr #20
> ++        and    a2, ip, #255
> ++        adds   a3, a3, a2
> ++        movmi  a3, #0
> ++        cmp    a3, #255
> ++        movgt  a3, #255
> ++        mov    a4, a4, asr #20
> ++        adds   a4, a4, ip, lsr #8
> ++        movmi  a4, #0
> ++        cmp    a4, #255
> ++        movgt  a4, #255
> ++        orr    a2, a3, a4, lsl #8
> ++        strh   a2, [v2]
> ++
> ++        ldmfd  sp!, {a3, a4}
> ++        ldrh   ip, [lr, v1]!
> ++        add    a2, a3, v7
> ++        mov    a2, a2, asr #20
> ++        sub    a3, a3, v7
> ++        and    v3, ip, #255
> ++        adds   a2, a2, v3
> ++        movmi  a2, #0
> ++        cmp    a2, #255
> ++        movgt  a2, #255
> ++        add    v3, a4, fp
> ++        mov    v3, v3, asr #20
> ++        adds   v3, v3, ip, lsr #8
> ++        movmi  v3, #0
> ++        cmp    v3, #255
> ++        movgt  v3, #255
> ++        orr    a2, a2, v3, lsl #8
> ++        sub    a4, a4, fp
> ++        ldrh   ip, [v2, -v1]!
> ++        strh   a2, [lr]
> ++        mov    a3, a3, asr #20
> ++        and    a2, ip, #255
> ++        adds   a3, a3, a2
> ++        movmi  a3, #0
> ++        cmp    a3, #255
> ++        movgt  a3, #255
> ++        mov    a4, a4, asr #20
> ++        adds   a4, a4, ip, lsr #8
> ++        movmi  a4, #0
> ++        cmp    a4, #255
> ++        movgt  a4, #255
> ++        orr    a2, a3, a4, lsl #8
> ++        strh   a2, [v2]
> ++
> ++        ldr    pc, [sp], #4
> ++        .endfunc
> ++
> ++        .align
> ++        .global simple_idct_armv5te
> ++        .func simple_idct_armv5te
> ++simple_idct_armv5te:
> ++        stmfd  sp!, {v1, v2, v3, v4, v5, v6, v7, fp, lr}
> ++
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++
> ++        sub    a1, a1, #(16*7)
> ++
> ++        bl     idct_col_armv5te
> ++        add    a1, a1, #4
> ++        bl     idct_col_armv5te
> ++        add    a1, a1, #4
> ++        bl     idct_col_armv5te
> ++        add    a1, a1, #4
> ++        bl     idct_col_armv5te
> ++
> ++        ldmfd  sp!, {v1, v2, v3, v4, v5, v6, v7, fp, pc}
> ++        .endfunc
> ++
> ++        .align
> ++        .global simple_idct_add_armv5te
> ++        .func simple_idct_add_armv5te
> ++simple_idct_add_armv5te:
> ++        stmfd  sp!, {a1, a2, v1, v2, v3, v4, v5, v6, v7, fp, lr}
> ++
> ++        mov    a1, a3
> ++
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++
> ++        sub    a1, a1, #(16*7)
> ++
> ++        bl     idct_col_add_armv5te
> ++        add    a1, a1, #4
> ++        bl     idct_col_add_armv5te
> ++        add    a1, a1, #4
> ++        bl     idct_col_add_armv5te
> ++        add    a1, a1, #4
> ++        bl     idct_col_add_armv5te
> ++
> ++        add    sp, sp, #8
> ++        ldmfd  sp!, {v1, v2, v3, v4, v5, v6, v7, fp, pc}
> ++        .endfunc
> ++
> ++        .align
> ++        .global simple_idct_put_armv5te
> ++        .func simple_idct_put_armv5te
> ++simple_idct_put_armv5te:
> ++        stmfd  sp!, {a1, a2, v1, v2, v3, v4, v5, v6, v7, fp, lr}
> ++
> ++        mov    a1, a3
> ++
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++        add    a1, a1, #16
> ++        bl     idct_row_armv5te
> ++
> ++        sub    a1, a1, #(16*7)
> ++
> ++        bl     idct_col_put_armv5te
> ++        add    a1, a1, #4
> ++        bl     idct_col_put_armv5te
> ++        add    a1, a1, #4
> ++        bl     idct_col_put_armv5te
> ++        add    a1, a1, #4
> ++        bl     idct_col_put_armv5te
> ++
> ++        add    sp, sp, #8
> ++        ldmfd  sp!, {v1, v2, v3, v4, v5, v6, v7, fp, pc}
> ++        .endfunc
> +diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/avcodec.h gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/avcodec.h
> +--- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/avcodec.h	2006-09-20 20:55:36.000000000 +0200
> ++++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/avcodec.h	2007-05-01 12:23:40.000000000 +0200
> +@@ -1217,6 +1217,7 @@
> + #define FF_IDCT_IPP          13
> + #define FF_IDCT_XVIDMMX      14
> + #define FF_IDCT_CAVS         15
> ++#define FF_IDCT_SIMPLEARMV5TE 16
> + 
> +     /**
> +      * slice count.
> +diff  -Nur gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/Makefile.am gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/Makefile.am
> +--- gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/libavcodec/Makefile.am	2006-09-22 06:07:23.000000000 +0200
> ++++ gst-ffmpeg-0.10.2.new/gst-libs/ext/ffmpeg/libavcodec/Makefile.am	2007-05-01 12:23:40.000000000 +0200
> +@@ -19,7 +19,10 @@
> + if HAVE_IWMMXT
> + iwmmxt_libs = armv4l/libiwmmxt.la
> + endif
> +-armv4l_libs = armv4l/libarmv4l.la $(iwmmxt_libs)
> ++if HAVE_ARMV5TE
> ++armv5te_libs = armv4l/libarmv5te.la
> ++endif
> ++armv4l_libs = armv4l/libarmv4l.la $(iwmmxt_libs) $(armv5te_libs)
> + armv4l_dirs = armv4l
> + endif
> + 
> diff --git a/recipes/obsolete/gstreamer/gst-ffmpeg/autotools.patch b/recipes/obsolete/gstreamer/gst-ffmpeg/autotools.patch
> new file mode 100644
> index 0000000..76e7ac6
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gst-ffmpeg/autotools.patch
> @@ -0,0 +1,21 @@
> +Index: gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/configure.ac
> +===================================================================
> +--- gst-ffmpeg-0.10.2.orig/gst-libs/ext/ffmpeg/configure.ac	2008-08-20 00:20:19.177850039 +0200
> ++++ gst-ffmpeg-0.10.2/gst-libs/ext/ffmpeg/configure.ac	2008-08-20 00:26:24.567809464 +0200
> +@@ -27,13 +27,15 @@
> + 
> + AM_MAINTAINER_MODE
> + AC_GNU_SOURCE
> ++
> ++AC_PROG_LIBTOOL
> + AM_PROG_AS
> + AC_PROG_CC
> ++AC_PROG_CXX
> + AC_PROG_INSTALL
> + AC_SYS_LARGEFILE
> + AC_STDC_HEADERS
> + AM_DISABLE_STATIC
> +-AC_PROG_LIBTOOL
> + 
> + dnl Warning for anyone using these custom macros.
> + dnl before asking me questions on why it doesn't work and why you
> diff --git a/recipes/obsolete/gstreamer/gst-ffmpeg_0.10.2.bb b/recipes/obsolete/gstreamer/gst-ffmpeg_0.10.2.bb
> new file mode 100644
> index 0000000..5164bbd
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gst-ffmpeg_0.10.2.bb
> @@ -0,0 +1,35 @@
> +DESCRIPTION = "FFmpeg-based GStreamer plug-in"
> +SECTION = "multimedia"
> +PRIORITY = "optional"
> +LICENSE = "LGPL"
> +HOMEPAGE = "http://www.gstreamer.net/"
> +DEPENDS = "gstreamer gst-plugins-base zlib"
> +PR = "r2"
> +
> +inherit autotools pkgconfig
> +
> +SRC_URI = "http://gstreamer.freedesktop.org/src/${PN}/${PN}-${PV}.tar.bz2 \
> +	   file://armv5.patch \
> +	   file://autotools.patch \
> +          "
> +
> +FILES_${PN} += "${libdir}/gstreamer-0.10/*.so"
> +FILES_${PN}-dbg += "${libdir}/gstreamer-0.10/.debug"
> +FILES_${PN}-dev += "${libdir}/gstreamer-0.10/*.la ${libdir}/gstreamer-0.10/*.a"
> +
> +EXTRA_OECONF = "--disable-sdltest --disable-ffplay --disable-freetypetest \
> +		--disable-vorbis --disable-vorbistest --disable-encoders \
> +		--disable-v4l --disable-audio-oss --disable-dv1394 \
> +		--disable-vhook --disable-ffmpeg --disable-ffserver \
> +		--enable-pp --disable-decoder-vorbis"
> +
> +# We do this because the install program is called with -s which causes it to
> +# call "strip" and it then mangles cross compiled stuff..
> +PATH_prepend := "${TOOLCHAIN_PATH}/${TARGET_SYS}/bin:"
> +
> +# Hack to get STAGING_LIBDIR into the linker path when building ffmpeg
> +CC = "${CCACHE} ${HOST_PREFIX}gcc ${TARGET_CC_ARCH} -L${STAGING_LIBDIR}"
> +
> +
> +SRC_URI[md5sum] = "3c7fb1cd1308b1972a76b86bb29fc890"
> +SRC_URI[sha256sum] = "ffa7c89bccab5d1be53b6fcedcf7a5c071d585cf522fee5864add05d350f5842"
> diff --git a/recipes/obsolete/gstreamer/gst-plugins-bad_0.10.20.bb b/recipes/obsolete/gstreamer/gst-plugins-bad_0.10.20.bb
> new file mode 100644
> index 0000000..17f20eb
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gst-plugins-bad_0.10.20.bb
> @@ -0,0 +1,16 @@
> +require gst-plugins.inc
> +
> +SRC_URI[archive.md5sum] = "7c84766f6d24f41ba90c3f6141012ab8"
> +SRC_URI[archive.sha256sum] = "1031dff866df976a957f34039addbab4c0753406299a275f4cf1780e1dbe2a90"
> +
> +DEPENDS += "orc-native orc libcdaudio gst-plugins-base openssl directfb libmodplug librsvg"
> +
> +PR = "${INC_PR}.2"
> +
> +# We don't have vdpau headers in OE and it creates crosscompile badness.
> +# Also, mpeg2enc and mplex from mjpegtools don't build, because of AC_TRY_RUN.
> +EXTRA_OECONF += " \
> +        --disable-mpeg2enc \
> +        --disable-mplex \
> +        --disable-vdpau \
> +"
> diff --git a/recipes/obsolete/gstreamer/gst-plugins-base/fix-playbin2.patch b/recipes/obsolete/gstreamer/gst-plugins-base/fix-playbin2.patch
> new file mode 100644
> index 0000000..8aba3b6
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gst-plugins-base/fix-playbin2.patch
> @@ -0,0 +1,26 @@
> +From 0fe6b6e8abb131471d5bd04d7f7e27ca98a67659 Mon Sep 17 00:00:00 2001
> +From: Brijesh Singh <brijesh.ksingh@gmail.com>
> +Date: Wed, 13 Jan 2010 08:39:54 +0000
> +Subject: playsink: Fix handling of the native audio/video flags
> +
> +Fixes bug #606687.
> +---
> +
> +--- /tmp/gstplaysink.c	2010-01-23 12:23:20.000000000 +0100
> ++++ gst-plugins-base-0.10.25/gst/playback/gstplaysink.c	2010-01-23 12:27:51.000000000 +0100
> +@@ -1880,12 +1880,13 @@
> +      * pick one and ignore the other then instead of erroring out?) */
> +     if (need_text && need_subp)
> +       goto subs_and_text;
> +-  } else if (flags & GST_PLAY_FLAG_VIDEO && playsink->video_pad) {
> ++  } else if (((flags & GST_PLAY_FLAG_VIDEO)
> ++          || (flags & GST_PLAY_FLAG_NATIVE_VIDEO)) && playsink->video_pad) {
> +     /* we have video and we are requested to show it */
> +     need_video = TRUE;
> +   }
> +   if (playsink->audio_pad) {
> +-    if (flags & GST_PLAY_FLAG_AUDIO) {
> ++    if ((flags & GST_PLAY_FLAG_AUDIO) || (flags & GST_PLAY_FLAG_NATIVE_AUDIO)) {
> +       need_audio = TRUE;
> +     }
> +     if (playsink->audio_pad_raw) {
> diff --git a/recipes/obsolete/gstreamer/gst-plugins-base/gst-plugins-base_rowstride.patch b/recipes/obsolete/gstreamer/gst-plugins-base/gst-plugins-base_rowstride.patch
> new file mode 100644
> index 0000000..3c0cffa
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gst-plugins-base/gst-plugins-base_rowstride.patch
> @@ -0,0 +1,1577 @@
> +From 32a7af0874fe13774c65919941c3be59b72c646a Mon Sep 17 00:00:00 2001
> +From: Rob Clark <rob@ti.com>
> +Date: Thu, 30 Jul 2009 14:50:05 -0500
> +Subject: [PATCH] add rowstride support to video utility functions
> +
> +This is a combination of 7 commits:
> +* add rowstride support to video utility functions
> +* stridetransform: skeletal implementation of stridetransform element
> +* stridetransform: implement caps negotiation and related parts
> +* stridetransform: implement transform function
> +* audioconvert: add NEON acceleration for some conversions
> +* add gst_stride_transform_transform_size()
> +* fix a small typo..  need to use the smaller of {new_width, orig_width} for the line-by-line copy to avoid overwriting past end of buffer
> +---
> + configure.ac                        |    2 +
> + gst-libs/gst/video/gstvideofilter.c |    8 +-
> + gst-libs/gst/video/video.c          |  234 +++++++++++++++---
> + gst-libs/gst/video/video.h          |   39 ++-
> + gst/audioconvert/Makefile.am        |    1 +
> + gst/audioconvert/armv7.c            |  209 ++++++++++++++++
> + gst/audioconvert/audioconvert.c     |   20 +-
> + gst/audioconvert/gstaudioquantize.c |    4 +-
> + gst/audioconvert/gstchannelmix.c    |    4 +-
> + gst/stride/Makefile.am              |   15 ++
> + gst/stride/gststridetransform.c     |  471 +++++++++++++++++++++++++++++++++++
> + gst/stride/gststridetransform.h     |   80 ++++++
> + gst/stride/plugin.c                 |   45 ++++
> + 13 files changed, 1064 insertions(+), 68 deletions(-)
> + create mode 100644 gst/audioconvert/armv7.c
> + create mode 100644 gst/stride/Makefile.am
> + create mode 100644 gst/stride/gststridetransform.c
> + create mode 100644 gst/stride/gststridetransform.h
> + create mode 100644 gst/stride/plugin.c
> +
> +diff --git a/configure.ac b/configure.ac
> +index 6a39c73..5da8ac2 100644
> +--- a/configure.ac
> ++++ b/configure.ac
> +@@ -319,6 +319,7 @@ AG_GST_CHECK_PLUGIN(ffmpegcolorspace)
> + AG_GST_CHECK_PLUGIN(gdp)
> + AG_GST_CHECK_PLUGIN(playback)
> + AG_GST_CHECK_PLUGIN(audioresample)
> ++AG_GST_CHECK_PLUGIN(stride)
> + AG_GST_CHECK_PLUGIN(subparse)
> + AG_GST_CHECK_PLUGIN(tcp)
> + AG_GST_CHECK_PLUGIN(typefind)
> +@@ -739,6 +740,7 @@ gst/ffmpegcolorspace/Makefile
> + gst/gdp/Makefile
> + gst/playback/Makefile
> + gst/audioresample/Makefile
> ++gst/stride/Makefile
> + gst/subparse/Makefile
> + gst/tcp/Makefile
> + gst/typefind/Makefile
> +diff --git a/gst-libs/gst/video/gstvideofilter.c b/gst-libs/gst/video/gstvideofilter.c
> +index 2d08a60..6b2d7b7 100644
> +--- a/gst-libs/gst/video/gstvideofilter.c
> ++++ b/gst-libs/gst/video/gstvideofilter.c
> +@@ -21,7 +21,7 @@
> +  /**
> +  * SECTION:gstvideofilter
> +  * @short_description: Base class for video filters
> +- * 
> ++ *
> +  * <refsect2>
> +  * <para>
> +  * Provides useful functions and a base class for video filters.
> +@@ -78,14 +78,14 @@ gst_video_filter_get_unit_size (GstBaseTransform * btrans, GstCaps * caps,
> +     guint * size)
> + {
> +   GstVideoFormat fmt;
> +-  gint width, height;
> ++  gint width, height, rowstride;
> + 
> +-  if (!gst_video_format_parse_caps (caps, &fmt, &width, &height)) {
> ++  if (!gst_video_format_parse_caps_strided (caps, &fmt, &width, &height, &rowstride)) {
> +     GST_WARNING_OBJECT (btrans, "Failed to parse caps %" GST_PTR_FORMAT, caps);
> +     return FALSE;
> +   }
> + 
> +-  *size = gst_video_format_get_size (fmt, width, height);
> ++  *size = gst_video_format_get_size_strided (fmt, width, height, rowstride);
> + 
> +   GST_DEBUG_OBJECT (btrans, "Returning size %u bytes for caps %"
> +       GST_PTR_FORMAT, *size, caps);
> +diff --git a/gst-libs/gst/video/video.c b/gst-libs/gst/video/video.c
> +index ab1d8c0..1815bf1 100644
> +--- a/gst-libs/gst/video/video.c
> ++++ b/gst-libs/gst/video/video.c
> +@@ -31,7 +31,7 @@
> +  *
> +  * <refsect2>
> +  * <para>
> +- * This library contains some helper functions and includes the 
> ++ * This library contains some helper functions and includes the
> +  * videosink and videofilter base classes.
> +  * </para>
> +  * </refsect2>
> +@@ -51,7 +51,7 @@ static GstVideoFormat gst_video_format_from_rgb24_masks (int red_mask,
> +  *
> +  * A convenience function to retrieve a GValue holding the framerate
> +  * from the caps on a pad.
> +- * 
> ++ *
> +  * The pad needs to have negotiated caps containing a framerate property.
> +  *
> +  * Returns: NULL if the pad has no configured caps or the configured caps
> +@@ -104,7 +104,7 @@ gst_video_frame_rate (GstPad * pad)
> +  *
> +  * Inspect the caps of the provided pad and retrieve the width and height of
> +  * the video frames it is configured for.
> +- * 
> ++ *
> +  * The pad needs to have negotiated caps containing width and height properties.
> +  *
> +  * Returns: TRUE if the width and height could be retrieved.
> +@@ -156,13 +156,13 @@ gst_video_get_size (GstPad * pad, gint * width, gint * height)
> +  * @display_par_n: Numerator of the pixel aspect ratio of the display device
> +  * @display_par_d: Denominator of the pixel aspect ratio of the display device
> +  *
> +- * Given the Pixel Aspect Ratio and size of an input video frame, and the 
> +- * pixel aspect ratio of the intended display device, calculates the actual 
> ++ * Given the Pixel Aspect Ratio and size of an input video frame, and the
> ++ * pixel aspect ratio of the intended display device, calculates the actual
> +  * display ratio the video will be rendered with.
> +  *
> +- * Returns: A boolean indicating success and a calculated Display Ratio in the 
> +- * dar_n and dar_d parameters. 
> +- * The return value is FALSE in the case of integer overflow or other error. 
> ++ * Returns: A boolean indicating success and a calculated Display Ratio in the
> ++ * dar_n and dar_d parameters.
> ++ * The return value is FALSE in the case of integer overflow or other error.
> +  *
> +  * Since: 0.10.7
> +  */
> +@@ -250,28 +250,15 @@ gst_video_format_parse_caps_interlaced (GstCaps * caps, gboolean * interlaced)
> + }
> + 
> + /**
> +- * gst_video_format_parse_caps:
> +- * @caps: the #GstCaps to parse
> +- * @format: the #GstVideoFormat of the video represented by @caps (output)
> +- * @width: the width of the video represented by @caps, may be NULL (output)
> +- * @height: the height of the video represented by @caps, may be NULL (output)
> +- *
> +- * Determines the #GstVideoFormat of @caps and places it in the location
> +- * pointed to by @format.  Extracts the size of the video and places it
> +- * in the location pointed to by @width and @height.  If @caps does not
> +- * represent one of the raw video formats listed in #GstVideoFormat, the
> +- * function will fail and return FALSE.
> +- *
> +- * Since: 0.10.16
> +- *
> +- * Returns: TRUE if @caps was parsed correctly.
> ++ * see gst_video_format_parse_caps_strided and gst_video_format_parse_caps
> +  */
> +-gboolean
> +-gst_video_format_parse_caps (GstCaps * caps, GstVideoFormat * format,
> +-    int *width, int *height)
> ++static gboolean
> ++parse_caps (GstCaps * caps, GstVideoFormat * format, gint *width, gint *height,
> ++    gboolean stride_ok, gint *rowstride)
> + {
> +   GstStructure *structure;
> +   gboolean ok = TRUE;
> ++  gboolean strided = FALSE;
> + 
> +   if (!gst_caps_is_fixed (caps))
> +     return FALSE;
> +@@ -279,7 +266,10 @@ gst_video_format_parse_caps (GstCaps * caps, GstVideoFormat * format,
> +   structure = gst_caps_get_structure (caps, 0);
> + 
> +   if (format) {
> +-    if (gst_structure_has_name (structure, "video/x-raw-yuv")) {
> ++    if (gst_structure_has_name (structure, "video/x-raw-yuv") ||
> ++        (stride_ok &&
> ++            gst_structure_has_name (structure, "video/x-raw-yuv-strided") &&
> ++            (strided=TRUE) /* single '=' intentional */)) {
> +       guint32 fourcc;
> + 
> +       ok &= gst_structure_get_fourcc (structure, "format", &fourcc);
> +@@ -288,7 +278,10 @@ gst_video_format_parse_caps (GstCaps * caps, GstVideoFormat * format,
> +       if (*format == GST_VIDEO_FORMAT_UNKNOWN) {
> +         ok = FALSE;
> +       }
> +-    } else if (gst_structure_has_name (structure, "video/x-raw-rgb")) {
> ++    } else if (gst_structure_has_name (structure, "video/x-raw-rgb") ||
> ++        (stride_ok &&
> ++            gst_structure_has_name (structure, "video/x-raw-rgb-strided") &&
> ++            (strided=TRUE) /* single '=' intentional */)) {
> +       int depth;
> +       int bpp;
> +       int endianness;
> +@@ -333,6 +326,10 @@ gst_video_format_parse_caps (GstCaps * caps, GstVideoFormat * format,
> +     }
> +   }
> + 
> ++  /* note: should we require that the caps have these fields, even if
> ++   * the caller does not particularly request them??
> ++   */
> ++
> +   if (width) {
> +     ok &= gst_structure_get_int (structure, "width", width);
> +   }
> +@@ -341,11 +338,70 @@ gst_video_format_parse_caps (GstCaps * caps, GstVideoFormat * format,
> +     ok &= gst_structure_get_int (structure, "height", height);
> +   }
> + 
> ++  if (rowstride) {
> ++    if (strided) {
> ++      ok &= gst_structure_get_int (structure, "rowstride", rowstride);
> ++    } else {
> ++      *rowstride = 0;  /* not a strided format */
> ++    }
> ++  }
> ++
> +   return ok;
> + }
> + 
> + 
> + /**
> ++ * gst_video_format_parse_caps_strided:
> ++ * @caps: the #GstCaps to parse
> ++ * @format: the #GstVideoFormat of the video represented by @caps (output)
> ++ * @width: the width of the video represented by @caps, may be NULL (output)
> ++ * @height: the height of the video represented by @caps, may be NULL (output)
> ++ * @rowstride: the rowstride (in bytes) represented by @caps, or 0 if there
> ++ *    is no rowstride, may be NULL (output)
> ++ *
> ++ * Determines the #GstVideoFormat of @caps and places it in the location
> ++ * pointed to by @format.  Extracts the size of the video and places it
> ++ * in the location pointed to by @width and @height.  Extracts the row-
> ++ * stride and places it in the location pointed to by @rowstride.  If
> ++ * @caps does not represent one of the raw video formats listed in
> ++ * #GstVideoFormat, the function will fail and return FALSE.
> ++ *
> ++ * Since: ???
> ++ *
> ++ * Returns: TRUE if @caps was parsed correctly.
> ++ */
> ++gboolean
> ++gst_video_format_parse_caps_strided (GstCaps * caps, GstVideoFormat * format,
> ++    int *width, int *height, int *rowstride)
> ++{
> ++  return parse_caps (caps, format, width, height, TRUE, rowstride);
> ++}
> ++
> ++/**
> ++ * gst_video_format_parse_caps:
> ++ * @caps: the #GstCaps to parse
> ++ * @format: the #GstVideoFormat of the video represented by @caps (output)
> ++ * @width: the width of the video represented by @caps, may be NULL (output)
> ++ * @height: the height of the video represented by @caps, may be NULL (output)
> ++ *
> ++ * Determines the #GstVideoFormat of @caps and places it in the location
> ++ * pointed to by @format.  Extracts the size of the video and places it
> ++ * in the location pointed to by @width and @height.  If @caps does not
> ++ * represent one of the raw video formats listed in #GstVideoFormat, the
> ++ * function will fail and return FALSE.
> ++ *
> ++ * Since: 0.10.16
> ++ *
> ++ * Returns: TRUE if @caps was parsed correctly.
> ++ */
> ++gboolean
> ++gst_video_format_parse_caps (GstCaps * caps, GstVideoFormat * format,
> ++    int *width, int *height)
> ++{
> ++  return parse_caps (caps, format, width, height, FALSE, NULL);
> ++}
> ++
> ++/**
> +  * gst_video_parse_caps_framerate:
> +  * @caps: pointer to a #GstCaps instance
> +  * @fps_n: pointer to integer to hold numerator of frame rate (output)
> +@@ -444,10 +500,11 @@ gst_video_format_new_caps_interlaced (GstVideoFormat format, int width,
> + }
> + 
> + /**
> +- * gst_video_format_new_caps:
> ++ * gst_video_format_new_caps_strided:
> +  * @format: the #GstVideoFormat describing the raw video format
> +  * @width: width of video
> +  * @height: height of video
> ++ * @rowstride: the rowstride (in bytes), or 0 if no rowstride
> +  * @framerate_n: numerator of frame rate
> +  * @framerate_d: denominator of frame rate
> +  * @par_n: numerator of pixel aspect ratio
> +@@ -455,26 +512,29 @@ gst_video_format_new_caps_interlaced (GstVideoFormat format, int width,
> +  *
> +  * Creates a new #GstCaps object based on the parameters provided.
> +  *
> +- * Since: 0.10.16
> ++ * Since: ???
> +  *
> +  * Returns: a new #GstCaps object, or NULL if there was an error
> +  */
> + GstCaps *
> +-gst_video_format_new_caps (GstVideoFormat format, int width, int height,
> ++gst_video_format_new_caps_strided (GstVideoFormat format,
> ++    int width, int height, int rowstride,
> +     int framerate_n, int framerate_d, int par_n, int par_d)
> + {
> ++  GstCaps *caps = NULL;
> ++
> +   g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, NULL);
> +   g_return_val_if_fail (width > 0 && height > 0, NULL);
> + 
> +   if (gst_video_format_is_yuv (format)) {
> +-    return gst_caps_new_simple ("video/x-raw-yuv",
> ++    caps = gst_caps_new_simple (
> ++        rowstride ? "video/x-raw-yuv-strided" : "video/x-raw-yuv",
> +         "format", GST_TYPE_FOURCC, gst_video_format_to_fourcc (format),
> +         "width", G_TYPE_INT, width,
> +         "height", G_TYPE_INT, height,
> +         "framerate", GST_TYPE_FRACTION, framerate_n, framerate_d,
> +         "pixel-aspect-ratio", GST_TYPE_FRACTION, par_n, par_d, NULL);
> +-  }
> +-  if (gst_video_format_is_rgb (format)) {
> ++  } else if (gst_video_format_is_rgb (format)) {
> +     GstCaps *caps;
> +     int red_mask;
> +     int blue_mask;
> +@@ -526,7 +586,8 @@ gst_video_format_new_caps (GstVideoFormat format, int width, int height,
> +         mask >> (8 * gst_video_format_get_component_offset (format, 2, width,
> +             height));
> + 
> +-    caps = gst_caps_new_simple ("video/x-raw-rgb",
> ++    caps = gst_caps_new_simple (
> ++        rowstride ? "video/x-raw-rgb-strided" : "video/x-raw-rgb",
> +         "bpp", G_TYPE_INT, bpp,
> +         "depth", G_TYPE_INT, depth,
> +         "endianness", G_TYPE_INT, G_BIG_ENDIAN,
> +@@ -543,9 +604,39 @@ gst_video_format_new_caps (GstVideoFormat format, int width, int height,
> +               height));
> +       gst_caps_set_simple (caps, "alpha_mask", G_TYPE_INT, alpha_mask, NULL);
> +     }
> +-    return caps;
> ++  } else {
> ++    return NULL;
> ++  }
> ++
> ++  if (rowstride) {
> ++    gst_caps_set_simple (caps, "rowstride", G_TYPE_INT, rowstride, NULL);
> +   }
> +-  return NULL;
> ++
> ++  return caps;
> ++}
> ++
> ++/**
> ++ * gst_video_format_new_caps:
> ++ * @format: the #GstVideoFormat describing the raw video format
> ++ * @width: width of video
> ++ * @height: height of video
> ++ * @framerate_n: numerator of frame rate
> ++ * @framerate_d: denominator of frame rate
> ++ * @par_n: numerator of pixel aspect ratio
> ++ * @par_d: denominator of pixel aspect ratio
> ++ *
> ++ * Creates a new #GstCaps object based on the parameters provided.
> ++ *
> ++ * Since: 0.10.16
> ++ *
> ++ * Returns: a new #GstCaps object, or NULL if there was an error
> ++ */
> ++GstCaps *
> ++gst_video_format_new_caps (GstVideoFormat format, int width, int height,
> ++    int framerate_n, int framerate_d, int par_n, int par_d)
> ++{
> ++  return gst_video_format_new_caps_strided (format, width, height, 0,
> ++      framerate_n, framerate_d, par_n, par_d);
> + }
> + 
> + /**
> +@@ -643,7 +734,7 @@ gst_video_format_to_fourcc (GstVideoFormat format)
> +  * @blue_mask: blue bit mask
> +  *
> +  * Converts red, green, blue bit masks into the corresponding
> +- * #GstVideoFormat.  
> ++ * #GstVideoFormat.
> +  *
> +  * Since: 0.10.16
> +  *
> +@@ -796,7 +887,7 @@ gst_video_format_is_yuv (GstVideoFormat format)
> + /**
> +  * gst_video_format_has_alpha:
> +  * @format: a #GstVideoFormat
> +- * 
> ++ *
> +  * Returns TRUE or FALSE depending on if the video format provides an
> +  * alpha channel.
> +  *
> +@@ -1328,6 +1419,71 @@ gst_video_format_get_size (GstVideoFormat format, int width, int height)
> + }
> + 
> + /**
> ++ * gst_video_format_get_size_strided:
> ++ * @format: a #GstVideoFormat
> ++ * @width: the width of video (in pixels)
> ++ * @height: the height of video (in pixels)
> ++ * @rowstride: the rowstride (in bytes), or 0 if no rowstride (in which
> ++ *    case the returned value is same as #gst_video_format_get_size())
> ++ *
> ++ * Calculates the total number of bytes in the raw video format, for a buffer
> ++ * which may have a rowstride in bytes
> ++ *
> ++ * Since: ???
> ++ *
> ++ * Returns: size (in bytes) of raw video format
> ++ */
> ++int
> ++gst_video_format_get_size_strided (GstVideoFormat format,
> ++    int width, int height, int rowstride)
> ++{
> ++  if(!rowstride)
> ++    return gst_video_format_get_size (format, width, height);
> ++
> ++  g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, 0);
> ++  g_return_val_if_fail (width > 0 && height > 0, 0);
> ++
> ++  switch (format) {
> ++    /* all packed formats have the same calculation, ie. rowstride * height
> ++     */
> ++    case GST_VIDEO_FORMAT_RGBx:
> ++    case GST_VIDEO_FORMAT_BGRx:
> ++    case GST_VIDEO_FORMAT_xRGB:
> ++    case GST_VIDEO_FORMAT_xBGR:
> ++    case GST_VIDEO_FORMAT_RGBA:
> ++    case GST_VIDEO_FORMAT_BGRA:
> ++    case GST_VIDEO_FORMAT_ARGB:
> ++    case GST_VIDEO_FORMAT_ABGR:
> ++    case GST_VIDEO_FORMAT_RGB:
> ++    case GST_VIDEO_FORMAT_BGR:
> ++    case GST_VIDEO_FORMAT_YUY2:
> ++    case GST_VIDEO_FORMAT_YVYU:
> ++    case GST_VIDEO_FORMAT_UYVY:
> ++    case GST_VIDEO_FORMAT_AYUV:
> ++    case GST_VIDEO_FORMAT_v210:
> ++    case GST_VIDEO_FORMAT_v216:
> ++      return GST_ROUND_UP_4 (rowstride * height);
> ++
> ++    /* these planar formats have 2x sub-sampling in the vertical direction,
> ++     * so U/V have half as many rows as Y:
> ++     */
> ++    case GST_VIDEO_FORMAT_I420:
> ++    case GST_VIDEO_FORMAT_YV12:
> ++      return GST_ROUND_UP_4 (2 * rowstride * height);
> ++
> ++    /* these planar formats have no sub-sampling in the vertical direction,
> ++     * so each plane has 'height' number of rows
> ++     */
> ++    case GST_VIDEO_FORMAT_Y41B:
> ++    case GST_VIDEO_FORMAT_Y42B:
> ++    case GST_VIDEO_FORMAT_Y444:
> ++      return GST_ROUND_UP_4 (3 * rowstride * height);
> ++    default:
> ++      return 0;
> ++  }
> ++}
> ++
> ++/**
> +  * gst_video_format_convert:
> +  * @format: a #GstVideoFormat
> +  * @width: the width of video
> +diff --git a/gst-libs/gst/video/video.h b/gst-libs/gst/video/video.h
> +index 162a766..ed20179 100644
> +--- a/gst-libs/gst/video/video.h
> ++++ b/gst-libs/gst/video/video.h
> +@@ -33,7 +33,7 @@ G_BEGIN_DECLS
> +  * @GST_VIDEO_FORMAT_I420: planar 4:2:0 YUV
> +  * @GST_VIDEO_FORMAT_YV12: planar 4:2:0 YVU (like I420 but UV planes swapped)
> +  * @GST_VIDEO_FORMAT_YUY2: packed 4:2:2 YUV (Y0-U0-Y1-V0 Y2-U2-Y3-V2 Y4 ...)
> +- * @GST_VIDEO_FORMAT_UYVY: packed 4:2:2 YUV (U0-Y0-V0-Y1 U2-Y2-V2-Y3 U4 ...) 
> ++ * @GST_VIDEO_FORMAT_UYVY: packed 4:2:2 YUV (U0-Y0-V0-Y1 U2-Y2-V2-Y3 U4 ...)
> +  * @GST_VIDEO_FORMAT_AYUV: packed 4:4:4 YUV with alpha channel (A0-Y0-U0-V0 ...)
> +  * @GST_VIDEO_FORMAT_RGBx: sparse rgb packed into 32 bit, space last
> +  * @GST_VIDEO_FORMAT_BGRx: sparse reverse rgb packed into 32 bit, space last
> +@@ -167,13 +167,13 @@ typedef enum {
> + 
> + #define GST_VIDEO_CAPS_RGBx \
> +     __GST_VIDEO_CAPS_MAKE_32 (1, 2, 3)
> +-  
> ++
> + #define GST_VIDEO_CAPS_xRGB \
> +     __GST_VIDEO_CAPS_MAKE_32 (2, 3, 4)
> +-  
> ++
> + #define GST_VIDEO_CAPS_BGRx \
> +     __GST_VIDEO_CAPS_MAKE_32 (3, 2, 1)
> +-  
> ++
> + #define GST_VIDEO_CAPS_xBGR \
> +     __GST_VIDEO_CAPS_MAKE_32 (4, 3, 2)
> + 
> +@@ -181,13 +181,13 @@ typedef enum {
> + 
> + #define GST_VIDEO_CAPS_RGBA \
> +     __GST_VIDEO_CAPS_MAKE_32A (1, 2, 3, 4)
> +-  
> ++
> + #define GST_VIDEO_CAPS_ARGB \
> +     __GST_VIDEO_CAPS_MAKE_32A (2, 3, 4, 1)
> +-  
> ++
> + #define GST_VIDEO_CAPS_BGRA \
> +     __GST_VIDEO_CAPS_MAKE_32A (3, 2, 1, 4)
> +-  
> ++
> + #define GST_VIDEO_CAPS_ABGR \
> +     __GST_VIDEO_CAPS_MAKE_32A (4, 3, 2, 1)
> + 
> +@@ -203,9 +203,9 @@ typedef enum {
> +   #define GST_VIDEO_CAPS_BGRx_HOST_ENDIAN \
> +       GST_VIDEO_CAPS_xRGB
> + #endif
> +-      
> ++
> + /* 15/16 bit */
> +-  
> ++
> + #define GST_VIDEO_CAPS_RGB_16                                           \
> +             "video/x-raw-rgb, "                                         \
> +             "bpp = (int) 16, "                                          \
> +@@ -237,6 +237,16 @@ typedef enum {
> +         "height = " GST_VIDEO_SIZE_RANGE ", "                           \
> +         "framerate = " GST_VIDEO_FPS_RANGE
> + 
> ++
> ++#define GST_VIDEO_CAPS_YUV_STRIDED(fourcc, rowstride)                   \
> ++        GST_VIDEO_CAPS_YUV(fourcc) "; "                                 \
> ++        "video/x-raw-yuv-strided, "                                     \
> ++        "format = (fourcc) " fourcc ", "                                \
> ++        "rowstride = (int) " rowstride ", "                             \
> ++        "width = " GST_VIDEO_SIZE_RANGE ", "                            \
> ++        "height = " GST_VIDEO_SIZE_RANGE ", "                           \
> ++        "framerate = " GST_VIDEO_FPS_RANGE
> ++
> + /* buffer flags */
> + 
> + /**
> +@@ -276,13 +286,15 @@ gboolean gst_video_get_size   (GstPad *pad,
> +                                gint   *height);
> + 
> + gboolean gst_video_calculate_display_ratio (guint *dar_n, guint *dar_d,
> +-            guint video_width, guint video_height, 
> +-            guint video_par_n, guint video_par_d, 
> ++            guint video_width, guint video_height,
> ++            guint video_par_n, guint video_par_d,
> +             guint display_par_n, guint display_par_d);
> + 
> + gboolean gst_video_format_parse_caps (GstCaps *caps, GstVideoFormat *format,
> +     int *width, int *height);
> + gboolean gst_video_format_parse_caps_interlaced (GstCaps *caps, gboolean *interlaced);
> ++gboolean gst_video_format_parse_caps_strided (GstCaps * caps, GstVideoFormat * format,
> ++    int *width, int *height, int *rowstride);
> + gboolean gst_video_parse_caps_framerate (GstCaps *caps,
> +     int *fps_n, int *fps_d);
> + gboolean gst_video_parse_caps_pixel_aspect_ratio (GstCaps *caps,
> +@@ -293,6 +305,9 @@ GstCaps * gst_video_format_new_caps (GstVideoFormat format,
> + GstCaps * gst_video_format_new_caps_interlaced (GstVideoFormat format,
> +     int width, int height, int framerate_n, int framerate_d,
> + 						int par_n, int par_d, gboolean interlaced);
> ++GstCaps * gst_video_format_new_caps_strided (GstVideoFormat format,
> ++    int width, int height, int rowstride,
> ++    int framerate_n, int framerate_d, int par_n, int par_d);
> + GstVideoFormat gst_video_format_from_fourcc (guint32 fourcc);
> + guint32 gst_video_format_to_fourcc (GstVideoFormat format);
> + gboolean gst_video_format_is_rgb (GstVideoFormat format);
> +@@ -308,6 +323,8 @@ int gst_video_format_get_component_height (GstVideoFormat format, int component,
> + int gst_video_format_get_component_offset (GstVideoFormat format, int component,
> +     int width, int height);
> + int gst_video_format_get_size (GstVideoFormat format, int width, int height);
> ++int gst_video_format_get_size_strided (GstVideoFormat format,
> ++    int width, int height, int rowstride);
> + gboolean gst_video_format_convert (GstVideoFormat format, int width, int height,
> +     int fps_n, int fps_d,
> +     GstFormat src_format, gint64 src_value,
> +diff --git a/gst/audioconvert/Makefile.am b/gst/audioconvert/Makefile.am
> +index 94978bb..2d273db 100644
> +--- a/gst/audioconvert/Makefile.am
> ++++ b/gst/audioconvert/Makefile.am
> +@@ -5,6 +5,7 @@ libgstaudioconvert_la_SOURCES = \
> + 	audioconvert.c \
> + 	gstchannelmix.c \
> + 	gstaudioquantize.c \
> ++	armv7.c \
> + 	plugin.c
> + 
> + libgstaudioconvert_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
> +diff --git a/gst/audioconvert/armv7.c b/gst/audioconvert/armv7.c
> +new file mode 100644
> +index 0000000..e39d29d
> +--- /dev/null
> ++++ b/gst/audioconvert/armv7.c
> +@@ -0,0 +1,209 @@
> ++/* GStreamer
> ++ *
> ++ * Copyright (C) 2009 Texas Instruments, Inc - http://www.ti.com/
> ++ *
> ++ * Description: NEON/VFP accelerated functions for armv7 architecture
> ++ *  Created on: Aug 8, 2009
> ++ *      Author: Rob Clark <rob@ti.com>
> ++ *
> ++ * 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.
> ++ */
> ++
> ++#ifdef __ARM_NEON__
> ++#include <arm_neon.h>
> ++#include <string.h>
> ++
> ++#include "audioconvert.h"
> ++
> ++
> ++void
> ++gst_audio_quantize_quantize_signed_tpdf_none (AudioConvertCtx *ctx,
> ++    gint32 *src, gint32 *dst, gint count)
> ++{
> ++  static guint32 state[4] = {
> ++      0xdeadbeef,
> ++      0x305b8cc9,
> ++      0x6c46ec93,
> ++      0xad13b0cd
> ++  };
> ++
> ++  gint scale = ctx->out_scale;
> ++  count *= ctx->out.channels;
> ++
> ++  if (scale > 0) {
> ++    guint32 mask = 0xffffffff & (0xffffffff << scale);
> ++    guint32 bias = (1U << (scale - 1)) >> 1;
> ++    gint32 dither = (1<<(scale - 1));
> ++
> ++    int32x4_t  vrand;
> ++    uint32x4_t vstate;
> ++    uint32x4_t v12345;
> ++    int32x4_t  vtmp;
> ++    uint32x4_t vmask;
> ++
> ++    vstate = vld1q_u32 (state);
> ++    v12345 = vmovq_n_u32 (12345);
> ++    vmask  = vmovq_n_u32 (mask);
> ++
> ++    /* until we have less 4 words less to process, use vector instructions
> ++     * to do everything 4x at a time:
> ++     */
> ++    for (;;count-=4) {
> ++      int64x2_t  vtmp_lo;
> ++      int64x2_t  vtmp_hi;
> ++      uint32x4_t vstate2;
> ++      int32x2_t  vrand_lo;
> ++      int32x2_t  vrand_hi;
> ++
> ++      /* generate next eight random words: (see gst_fast_random_uint32())
> ++       *
> ++       *    state = state * 1103515245 + 12345
> ++       */
> ++      vstate2 = vmulq_n_u32 (vstate, 1103515245);
> ++      vstate2 = vaddq_u32 (vstate2, v12345);
> ++      vstate  = vmulq_n_u32 (vstate2, 1103515245);
> ++      vstate  = vaddq_u32 (vstate2, v12345);
> ++
> ++      /* generate next four scaled random values:
> ++       *
> ++       *    gint32 start = bias - dither;
> ++       *    gint32 end = bias + dither - 1;
> ++       *    gint64 tmp1 = gst_fast_random_uint32 ();
> ++       *    gint64 tmp2 = gst_fast_random_uint32 ();
> ++       *    rand = (gint32)(((tmp1+tmp2) * (end - start)) / (1LLU<<32) + start);
> ++       *
> ++       * need to split vstate and vstate2 into 2*2 int64x2_t and add....
> ++       */
> ++      vstate2 = vaddq_u32 (vstate, vstate2);     /* tmp1+tmp2 */
> ++      vtmp_lo = vreinterpretq_s64_u64 (          /* * (end-start) */
> ++          vmull_n_u32 (vget_low_u32 (vstate2), (2*dither) - 1));
> ++      vtmp_hi = vreinterpretq_s64_u64 (          /* * (end-start) */
> ++          vmull_n_u32 (vget_high_u32 (vstate2), (2*dither) - 1));
> ++
> ++      vtmp_lo = vshrq_n_s64 (vtmp_lo, 32);       /* / (1LLU<<32) */
> ++      vtmp_hi = vshrq_n_s64 (vtmp_hi, 32);       /* / (1LLU<<32) */
> ++
> ++
> ++      /* now want to put vtmp_hi and vtmp_lo back together..
> ++       * then add 'start' (bias-dither).. which is negative..
> ++       */
> ++      vrand_lo = vmovn_s64 (vtmp_lo);
> ++      vrand_hi = vmovn_s64 (vtmp_hi);
> ++      vrand    = vcombine_s32 (vrand_lo, vrand_hi);
> ++      vrand    = vaddq_s32 (vrand, vmovq_n_s32 (bias-dither));
> ++
> ++      /* load next 4 words:
> ++       */
> ++      vtmp = vld1q_s32 (src);
> ++      src += 4;
> ++
> ++      /* perform saturating add of random noise... we don't want the
> ++       * value to wrap around:
> ++       *
> ++       * XXX I *think* vqaddq will handle saturation for underflow too..
> ++       */
> ++      vtmp = vqaddq_s32 (vtmp, vrand);
> ++      vtmp = vreinterpretq_s32_u32 (
> ++          vandq_u32 (vreinterpretq_u32_s32 (vtmp), vmask));
> ++
> ++      /* we check for less than four remaining words at the end, before
> ++       * we store the result back.. the assumption is that it shouldn't
> ++       * cause a segfault to read past the end of 'src', and there is no
> ++       * harm in processing a few garbage words.  But we definitely don't
> ++       * want to write past the end of 'dst'
> ++       */
> ++      if (count<4) break;
> ++
> ++      /* store 4 words to result:
> ++       */
> ++      vst1q_s32 (dst, vtmp);
> ++      dst += 4;
> ++    }
> ++
> ++    vst1q_u32 (state, vstate);
> ++
> ++    /* at this point, we could have 0-3 result bytes in vtmp to write
> ++     * back out to 'dst':
> ++     */
> ++    if (count) {
> ++      gint32 tmpdst[4];
> ++      gint32 *tmpp = tmpdst;
> ++
> ++      vst1q_s32 (tmpdst, vtmp);
> ++
> ++      while (count--) {
> ++        *dst++ = *tmpp++;
> ++      }
> ++    }
> ++
> ++  } else {
> ++    memmove (dst, src, count);
> ++  }
> ++}
> ++
> ++void
> ++gst_audio_convert_unpack_float_le (gfloat * src, gint32 * dst, gint s, gint count)
> ++{
> ++  float32x4_t vsrc;
> ++  float32x4_t v05;
> ++  int32x4_t   vdst;
> ++
> ++  v05 = vmovq_n_f32 (0.5);
> ++
> ++  for (;;count-=4) {
> ++
> ++    /* load next 4 words:
> ++     */
> ++    vsrc = vld1q_f32 ((float32_t *)src);
> ++    src += 4;
> ++
> ++    /* convert to int:
> ++     */
> ++    vsrc = vmulq_n_f32 (vsrc, 2147483647.0);
> ++    vsrc = vaddq_f32 (vsrc, v05);
> ++    vdst = vcvtq_s32_f32 (vsrc);
> ++
> ++    /* we check for less than four remaining words at the end, before
> ++     * we store the result back.. the assumption is that it shouldn't
> ++     * cause a segfault to read past the end of 'src', and there is no
> ++     * harm in processing a few garbage words.  But we definitely don't
> ++     * want to write past the end of 'dst'
> ++     */
> ++    if (count<4) break;
> ++
> ++    /* store 4 words to result:
> ++     */
> ++    vst1q_s32 (dst, vdst);
> ++    dst += 4;
> ++  }
> ++
> ++  /* at this point, we could have 0-3 result bytes in vtmp to write
> ++   * back out to 'dst':
> ++   */
> ++  if (count) {
> ++    gint32 tmpdst[4];
> ++    gint32 *tmpp = tmpdst;
> ++
> ++    vst1q_s32 (tmpdst, vdst);
> ++
> ++    while (count--) {
> ++      *dst++ = *tmpp++;
> ++    }
> ++  }
> ++}
> ++
> ++
> ++#endif
> +diff --git a/gst/audioconvert/audioconvert.c b/gst/audioconvert/audioconvert.c
> +index 4780324..c18d217 100644
> +--- a/gst/audioconvert/audioconvert.c
> ++++ b/gst/audioconvert/audioconvert.c
> +@@ -38,11 +38,11 @@
> +  * unpack code
> +  */
> + #define MAKE_UNPACK_FUNC_NAME(name)                                     \
> +-audio_convert_unpack_##name
> ++gst_audio_convert_unpack_##name
> + 
> + /* unpack from integer to signed integer 32 */
> + #define MAKE_UNPACK_FUNC_II(name, stride, sign, READ_FUNC)              \
> +-static void                                                             \
> ++void __attribute__((weak))                                              \
> + MAKE_UNPACK_FUNC_NAME (name) (guint8 *src, gint32 *dst,                 \
> +         gint scale, gint count)                                         \
> + {                                                                       \
> +@@ -54,7 +54,7 @@ MAKE_UNPACK_FUNC_NAME (name) (guint8 *src, gint32 *dst,                 \
> + 
> + /* unpack from float to signed integer 32 */
> + #define MAKE_UNPACK_FUNC_FI(name, type, READ_FUNC)                            \
> +-static void                                                                   \
> ++void __attribute__((weak))                                                    \
> + MAKE_UNPACK_FUNC_NAME (name) (type * src, gint32 * dst, gint s, gint count)   \
> + {                                                                             \
> +   gdouble temp;                                                               \
> +@@ -68,7 +68,7 @@ MAKE_UNPACK_FUNC_NAME (name) (type * src, gint32 * dst, gint s, gint count)   \
> + 
> + /* unpack from float to float 64 (double) */
> + #define MAKE_UNPACK_FUNC_FF(name, type, FUNC)                                 \
> +-static void                                                                   \
> ++void __attribute__((weak))                                                    \
> + MAKE_UNPACK_FUNC_NAME (name) (type * src, gdouble * dst, gint s,              \
> +     gint count)                                                               \
> + {                                                                             \
> +@@ -78,7 +78,7 @@ MAKE_UNPACK_FUNC_NAME (name) (type * src, gdouble * dst, gint s,              \
> + 
> + /* unpack from int to float 64 (double) */
> + #define MAKE_UNPACK_FUNC_IF(name, stride, sign, READ_FUNC)                    \
> +-static void                                                                   \
> ++void __attribute__((weak))                                                    \
> + MAKE_UNPACK_FUNC_NAME (name) (guint8 * src, gdouble * dst, gint scale,        \
> +     gint count)                                                               \
> + {                                                                             \
> +@@ -158,7 +158,7 @@ audio_convert_pack_##name
> + 
> + /* pack from signed integer 32 to integer */
> + #define MAKE_PACK_FUNC_II(name, stride, sign, WRITE_FUNC)               \
> +-static void                                                             \
> ++void __attribute__((weak))                                              \
> + MAKE_PACK_FUNC_NAME (name) (gint32 *src, guint8 * dst,                  \
> +         gint scale, gint count)                                         \
> + {                                                                       \
> +@@ -172,7 +172,7 @@ MAKE_PACK_FUNC_NAME (name) (gint32 *src, guint8 * dst,                  \
> + 
> + /* pack from signed integer 32 to float */
> + #define MAKE_PACK_FUNC_IF(name, type, FUNC)                             \
> +-static void                                                             \
> ++void __attribute__((weak))                                              \
> + MAKE_PACK_FUNC_NAME (name) (gint32 * src, type * dst, gint scale,       \
> +     gint count)                                                         \
> + {                                                                       \
> +@@ -182,7 +182,7 @@ MAKE_PACK_FUNC_NAME (name) (gint32 * src, type * dst, gint scale,       \
> + 
> + /* pack from float 64 (double) to float */
> + #define MAKE_PACK_FUNC_FF(name, type, FUNC)                             \
> +-static void                                                             \
> ++void __attribute__((weak))                                              \
> + MAKE_PACK_FUNC_NAME (name) (gdouble * src, type * dst, gint s,          \
> +     gint count)                                                         \
> + {                                                                       \
> +@@ -194,7 +194,7 @@ MAKE_PACK_FUNC_NAME (name) (gdouble * src, type * dst, gint s,          \
> +  * the floats are already in the correct range. Only a cast is needed.
> +  */
> + #define MAKE_PACK_FUNC_FI_S(name, stride, WRITE_FUNC)                   \
> +-static void                                                             \
> ++void __attribute__((weak))                                              \
> + MAKE_PACK_FUNC_NAME (name) (gdouble * src, guint8 * dst, gint scale,    \
> +     gint count)                                                         \
> + {                                                                       \
> +@@ -212,7 +212,7 @@ MAKE_PACK_FUNC_NAME (name) (gdouble * src, guint8 * dst, gint scale,    \
> +  * and an addition of 2^(target_depth-1) to get in the correct unsigned
> +  * range. */
> + #define MAKE_PACK_FUNC_FI_U(name, stride, WRITE_FUNC)                   \
> +-static void                                                             \
> ++void __attribute__((weak))                                              \
> + MAKE_PACK_FUNC_NAME (name) (gdouble * src, guint8 * dst, gint scale,    \
> +     gint count)                                                         \
> + {                                                                       \
> +diff --git a/gst/audioconvert/gstaudioquantize.c b/gst/audioconvert/gstaudioquantize.c
> +index 2155397..be959c4 100644
> +--- a/gst/audioconvert/gstaudioquantize.c
> ++++ b/gst/audioconvert/gstaudioquantize.c
> +@@ -46,7 +46,7 @@ gst_audio_quantize_quantize_##name
> + 
> + #define MAKE_QUANTIZE_FUNC_I(name, DITHER_INIT_FUNC, ADD_DITHER_FUNC,   \
> +                              ROUND_FUNC)                                \
> +-static void                                                             \
> ++void __attribute__((weak))                                              \
> + MAKE_QUANTIZE_FUNC_NAME (name) (AudioConvertCtx *ctx, gint32 *src,      \
> +                                 gint32 *dst, gint count)                \
> + {                                                                       \
> +@@ -86,7 +86,7 @@ MAKE_QUANTIZE_FUNC_NAME (name) (AudioConvertCtx *ctx, gint32 *src,      \
> + #define MAKE_QUANTIZE_FUNC_F(name, DITHER_INIT_FUNC, NS_INIT_FUNC,      \
> +                              ADD_NS_FUNC, ADD_DITHER_FUNC,              \
> +                              UPDATE_ERROR_FUNC)                         \
> +-static void                                                             \
> ++void __attribute__((weak))                                              \
> + MAKE_QUANTIZE_FUNC_NAME (name) (AudioConvertCtx *ctx, gdouble *src,     \
> +                                 gdouble *dst, gint count)               \
> + {                                                                       \
> +diff --git a/gst/audioconvert/gstchannelmix.c b/gst/audioconvert/gstchannelmix.c
> +index 1dbfcce..9ace1cb 100644
> +--- a/gst/audioconvert/gstchannelmix.c
> ++++ b/gst/audioconvert/gstchannelmix.c
> +@@ -663,7 +663,7 @@ gst_channel_mix_passthrough (AudioConvertCtx * this)
> + 
> + /* IMPORTANT: out_data == in_data is possible, make sure to not overwrite data
> +  * you might need later on! */
> +-void
> ++void __attribute__((weak))
> + gst_channel_mix_mix_int (AudioConvertCtx * this,
> +     gint32 * in_data, gint32 * out_data, gint samples)
> + {
> +@@ -702,7 +702,7 @@ gst_channel_mix_mix_int (AudioConvertCtx * this,
> +   }
> + }
> + 
> +-void
> ++void __attribute__((weak))
> + gst_channel_mix_mix_float (AudioConvertCtx * this,
> +     gdouble * in_data, gdouble * out_data, gint samples)
> + {
> +diff --git a/gst/stride/Makefile.am b/gst/stride/Makefile.am
> +new file mode 100644
> +index 0000000..1adc197
> +--- /dev/null
> ++++ b/gst/stride/Makefile.am
> +@@ -0,0 +1,15 @@
> ++plugin_LTLIBRARIES = libgststridetransform.la
> ++
> ++libgststridetransform_la_SOURCES = \
> ++	gststridetransform.c \
> ++	plugin.c
> ++
> ++libgststridetransform_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
> ++libgststridetransform_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
> ++libgststridetransform_la_LIBADD = \
> ++	$(top_builddir)/gst-libs/gst/video/libgstvideo-@GST_MAJORMINOR@.la \
> ++	$(GST_BASE_LIBS) $(GST_LIBS) $(LIBM)
> ++libgststridetransform_la_LIBTOOLFLAGS = --tag=disable-static
> ++
> ++noinst_HEADERS = \
> ++	gststridetransform.h
> +diff --git a/gst/stride/gststridetransform.c b/gst/stride/gststridetransform.c
> +new file mode 100644
> +index 0000000..ea52500
> +--- /dev/null
> ++++ b/gst/stride/gststridetransform.c
> +@@ -0,0 +1,471 @@
> ++/* GStreamer
> ++ *
> ++ * Copyright (C) 2009 Texas Instruments, Inc - http://www.ti.com/
> ++ *
> ++ * Description: V4L2 sink element
> ++ *  Created on: Jul 30, 2009
> ++ *      Author: Rob Clark <rob@ti.com>
> ++ *
> ++ * 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-stridetransform
> ++ *
> ++ * stridetransform can be used to convert between video buffers
> ++ * with and without stride, or between buffers with differing
> ++ * stride
> ++ *
> ++ * <refsect2>
> ++ * <title>Example launch lines</title>
> ++ * |[
> ++ * gst-launch videotestsrc ! video/x-raw-yuv,format=(fourcc)YUY2,width=320,height=240,framerate=30/1 !
> ++ * stridetransform ! video/x-raw-yuv-strided,format=(fourcc)YUY2,width=320,height=240,rowstride=700,framerate=30/1 !
> ++ * stridetransform ! video/x-raw-yuv,format=(fourcc)YUY2,width=320,height=240,framerate=30/1 !
> ++ * v4l2sink
> ++ * ]| This pipeline ???? TODO
> ++ * </refsect2>
> ++ */
> ++
> ++
> ++#ifdef HAVE_CONFIG_H
> ++#include <config.h>
> ++#endif
> ++
> ++#include <string.h>
> ++#include <gst/video/video.h>
> ++
> ++#include "gst/gst-i18n-plugin.h"
> ++#include "gststridetransform.h"
> ++
> ++
> ++static const GstElementDetails stridetransform_details =
> ++GST_ELEMENT_DETAILS ("Stride transform",
> ++    "Filter/Converter/Video",
> ++    "Convert between video buffers with and without stride, or with differing stride",
> ++    "Rob Clark <rob@ti.com>,");
> ++
> ++
> ++/* TODO: add rgb formats too! */
> ++#define SUPPORTED_CAPS                                                        \
> ++  GST_VIDEO_CAPS_YUV_STRIDED ("{ I420, YV12, YUY2, UYVY }", "[ 0, max ]")
> ++
> ++
> ++static GstStaticPadTemplate src_template =
> ++GST_STATIC_PAD_TEMPLATE ("src",
> ++    GST_PAD_SRC,
> ++    GST_PAD_ALWAYS,
> ++    GST_STATIC_CAPS (SUPPORTED_CAPS)
> ++    );
> ++
> ++static GstStaticPadTemplate sink_template =
> ++GST_STATIC_PAD_TEMPLATE ("sink",
> ++    GST_PAD_SINK,
> ++    GST_PAD_ALWAYS,
> ++    GST_STATIC_CAPS (SUPPORTED_CAPS)
> ++    );
> ++
> ++
> ++GST_DEBUG_CATEGORY (stridetransform_debug);
> ++#define GST_CAT_DEFAULT stridetransform_debug
> ++
> ++/* type functions */
> ++static void gst_stride_transform_dispose (GObject *obj);
> ++
> ++/* GstBaseTransform functions */
> ++static gboolean gst_stride_transform_get_unit_size (GstBaseTransform *base,
> ++    GstCaps *caps, guint *size);
> ++static gboolean gst_stride_transform_transform_size (GstBaseTransform *base,
> ++    GstPadDirection direction,
> ++    GstCaps *caps, guint size,
> ++    GstCaps *othercaps, guint *othersize);
> ++static GstCaps *gst_stride_transform_transform_caps (GstBaseTransform *base,
> ++    GstPadDirection direction, GstCaps *caps);
> ++static gboolean gst_stride_transform_set_caps (GstBaseTransform *base,
> ++    GstCaps *incaps, GstCaps *outcaps);
> ++static GstFlowReturn gst_stride_transform_transform (GstBaseTransform *base,
> ++    GstBuffer *inbuf, GstBuffer *outbuf);
> ++static GstFlowReturn gst_stride_transform_transform_ip (GstBaseTransform *base,
> ++    GstBuffer *buf);
> ++
> ++GST_BOILERPLATE (GstStrideTransform, gst_stride_transform, GstVideoFilter, GST_TYPE_VIDEO_FILTER);
> ++
> ++
> ++static void
> ++gst_stride_transform_base_init (gpointer g_class)
> ++{
> ++  GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
> ++
> ++  GST_DEBUG_CATEGORY_INIT (stridetransform_debug, "stride", 0, "stride transform element");
> ++
> ++  gst_element_class_set_details (gstelement_class, &stridetransform_details);
> ++
> ++  gst_element_class_add_pad_template (gstelement_class,
> ++      gst_static_pad_template_get (&sink_template));
> ++  gst_element_class_add_pad_template (gstelement_class,
> ++      gst_static_pad_template_get (&src_template));
> ++}
> ++
> ++static void
> ++gst_stride_transform_class_init (GstStrideTransformClass *klass)
> ++{
> ++  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
> ++  GstBaseTransformClass *basetransform_class = GST_BASE_TRANSFORM_CLASS (klass);
> ++
> ++  gobject_class->dispose = gst_stride_transform_dispose;
> ++
> ++  basetransform_class->get_unit_size =
> ++      GST_DEBUG_FUNCPTR (gst_stride_transform_get_unit_size);
> ++  basetransform_class->transform_size =
> ++      GST_DEBUG_FUNCPTR (gst_stride_transform_transform_size);
> ++  basetransform_class->transform_caps =
> ++      GST_DEBUG_FUNCPTR (gst_stride_transform_transform_caps);
> ++  basetransform_class->set_caps =
> ++      GST_DEBUG_FUNCPTR (gst_stride_transform_set_caps);
> ++  basetransform_class->transform_ip =
> ++      GST_DEBUG_FUNCPTR (gst_stride_transform_transform_ip);
> ++  basetransform_class->transform =
> ++      GST_DEBUG_FUNCPTR (gst_stride_transform_transform);
> ++
> ++  basetransform_class->passthrough_on_same_caps = TRUE;
> ++}
> ++
> ++static void
> ++gst_stride_transform_init (GstStrideTransform *self, GstStrideTransformClass *klass)
> ++{
> ++  GST_DEBUG_OBJECT (self, "not implemented");
> ++}
> ++
> ++
> ++static void
> ++gst_stride_transform_dispose (GObject *object)
> ++{
> ++  GstStrideTransform *self = GST_STRIDE_TRANSFORM (object);
> ++  GST_DEBUG_OBJECT (self, "not implemented");
> ++  G_OBJECT_CLASS (parent_class)->dispose (object);
> ++}
> ++
> ++/**
> ++ * figure out the required buffer size based on @caps
> ++ */
> ++static gboolean
> ++gst_stride_transform_get_unit_size (GstBaseTransform *base,
> ++    GstCaps *caps, guint *size)
> ++{
> ++  GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
> ++  GstVideoFormat format;
> ++  gint width, height, rowstride;
> ++
> ++  g_return_val_if_fail (gst_video_format_parse_caps_strided (
> ++      caps, &format, &width, &height, &rowstride), FALSE);
> ++
> ++  *size = gst_video_format_get_size_strided (format, width, height, rowstride);
> ++
> ++  GST_DEBUG_OBJECT (self,
> ++      "format=%d, width=%d, height=%d, rowstride=%d -> size=%d",
> ++      format, width, height, rowstride, *size);
> ++
> ++  return TRUE;
> ++}
> ++
> ++/**
> ++ * Default transform_size function is no good, as it assumes that the output
> ++ * buffer size is a multiple of the unit size.. which doesn't hold true.
> ++ */
> ++static gboolean
> ++gst_stride_transform_transform_size (GstBaseTransform *base,
> ++    GstPadDirection direction,
> ++    GstCaps *caps, guint size,
> ++    GstCaps *othercaps, guint *othersize)
> ++{
> ++  GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
> ++  guint idx = (direction == GST_PAD_SINK) ? 0 : 1;
> ++
> ++  if (self->cached_caps[idx] != othercaps)
> ++  {
> ++    if (!gst_stride_transform_get_unit_size (base, othercaps,
> ++        &(self->cached_size[idx])))
> ++    {
> ++      return FALSE;
> ++    }
> ++  }
> ++
> ++  *othersize = self->cached_size[idx];
> ++
> ++  return TRUE;
> ++}
> ++
> ++
> ++
> ++/**
> ++ * helper to add all fields, other than rowstride to @caps, copied from @s.
> ++ */
> ++static void
> ++add_all_fields (GstCaps *caps, const gchar *name, GstStructure *s, gboolean rowstride)
> ++{
> ++  gint idx;
> ++  GstStructure *new_s = gst_structure_new (name, NULL);
> ++
> ++  if (rowstride) {
> ++    gst_structure_set (new_s, "rowstride", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
> ++  }
> ++
> ++  idx = gst_structure_n_fields (s) - 1;
> ++  while (idx >= 0) {
> ++    const gchar *name = gst_structure_nth_field_name (s, idx);
> ++    if (strcmp ("rowstride", name)) {
> ++      const GValue *val = gst_structure_get_value (s, name);
> ++      gst_structure_set_value (new_s, name, val);
> ++    }
> ++    idx--;
> ++  }
> ++
> ++  gst_caps_merge_structure (caps, new_s);
> ++}
> ++
> ++
> ++/**
> ++ * we can transform @caps to strided or non-strided caps with otherwise
> ++ * identical parameters
> ++ */
> ++static GstCaps *
> ++gst_stride_transform_transform_caps (GstBaseTransform *base,
> ++    GstPadDirection direction, GstCaps *caps)
> ++{
> ++  GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
> ++  GstCaps *ret;
> ++  GstStructure *s;
> ++
> ++  g_return_val_if_fail (GST_CAPS_IS_SIMPLE (caps), NULL);
> ++
> ++  GST_DEBUG_OBJECT (self, "direction=%d, caps=%p", direction, caps);
> ++  LOG_CAPS (self, caps);
> ++
> ++  ret = gst_caps_new_empty ();
> ++  s = gst_caps_get_structure (caps, 0);
> ++
> ++  if (gst_structure_has_name (s, "video/x-raw-yuv") ||
> ++      gst_structure_has_name (s, "video/x-raw-yuv-strided")) {
> ++
> ++    add_all_fields (ret, "video/x-raw-yuv", s, FALSE);
> ++    add_all_fields (ret, "video/x-raw-yuv-strided", s, TRUE);
> ++
> ++  } else if (gst_structure_has_name (s, "video/x-raw-rgb") ||
> ++      gst_structure_has_name (s, "video/x-raw-rgb-strided")) {
> ++
> ++    add_all_fields (ret, "video/x-raw-rgb", s, FALSE);
> ++    add_all_fields (ret, "video/x-raw-rgb-strided", s, TRUE);
> ++
> ++  }
> ++
> ++  LOG_CAPS (self, ret);
> ++
> ++  return ret;
> ++}
> ++
> ++/**
> ++ * at this point, we have identical fourcc, width, and height for @incaps
> ++ * and @outcaps..  so we need to extract these to use for transforming,
> ++ * plus the requested rowstride of the @incaps and @outcaps
> ++ */
> ++static gboolean
> ++gst_stride_transform_set_caps (GstBaseTransform *base,
> ++    GstCaps *incaps, GstCaps *outcaps)
> ++{
> ++  GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
> ++  GstVideoFormat format;
> ++  gint width, height;
> ++
> ++  LOG_CAPS (self, incaps);
> ++  LOG_CAPS (self, outcaps);
> ++
> ++  g_return_val_if_fail (gst_video_format_parse_caps_strided (incaps,
> ++      &self->format, &self->width, &self->height, &self->in_rowstride), FALSE);
> ++  g_return_val_if_fail (gst_video_format_parse_caps_strided (outcaps,
> ++      &format, &width, &height, &self->out_rowstride), FALSE);
> ++
> ++  g_return_val_if_fail (self->format == format, FALSE);
> ++  g_return_val_if_fail (self->width  == width,  FALSE);
> ++  g_return_val_if_fail (self->height == height, FALSE);
> ++
> ++  return TRUE;
> ++}
> ++
> ++/* ************************************************************************* */
> ++
> ++/**
> ++ * Convert from one stride to another... like memmove, but can convert stride in
> ++ * the process.  This function is not aware of pixels, only of bytes.  So widths
> ++ * are given in bytes, not pixels.  The new_buf and orig_buf can point to the
> ++ * same buffers to do an in-place conversion, but the buffer should be large
> ++ * enough.
> ++ */
> ++static void
> ++stridemove (guchar *new_buf, guchar *orig_buf, gint new_width, gint orig_width, gint height)
> ++{
> ++  int row;
> ++
> ++  GST_DEBUG ("new_buf=%p, orig_buf=%p, new_width=%d, orig_width=%d, height=%d",
> ++      new_buf, orig_buf, new_width, orig_width, height);
> ++  /* if increasing the stride, work from bottom-up to avoid overwriting data
> ++   * that has not been moved yet.. otherwise, work in the opposite order,
> ++   * for the same reason.
> ++   */
> ++  if (new_width > orig_width) {
> ++    for (row=height-1; row>=0; row--) {
> ++      memmove (new_buf+(new_width*row), orig_buf+(orig_width*row), orig_width);
> ++    }
> ++  } else {
> ++    for (row=0; row<height; row++) {
> ++      memmove (new_buf+(new_width*row), orig_buf+(orig_width*row), new_width);
> ++    }
> ++  }
> ++}
> ++
> ++
> ++/**
> ++ * Convert from a non-strided buffer to strided.  The two buffer pointers could
> ++ * be pointing to the same memory block for in-place transform.. assuming that
> ++ * the buffer is large enough
> ++ *
> ++ * @strided:    the pointer to the resulting strided buffer
> ++ * @unstrided:  the pointer to the initial unstrided buffer
> ++ * @fourcc:     the color format
> ++ * @stride:     the stride, in bytes
> ++ * @width:      the width in pixels
> ++ * @height:     the height in pixels
> ++ */
> ++static GstFlowReturn
> ++stridify (GstStrideTransform *self, guchar *strided, guchar *unstrided)
> ++{
> ++  gint width  = self->width;
> ++  gint height = self->height;
> ++  gint stride = self->out_rowstride;
> ++
> ++  switch (self->format) {
> ++#if 0 /* TODO */
> ++    case GST_VIDEO_FORMAT_NV12:
> ++      g_return_val_if_fail (stride >= width, GST_FLOW_ERROR);
> ++      stridemove (strided, unstrided, stride, width, height * 1.5);
> ++      return GST_FLOW_OK;
> ++#endif
> ++    case GST_VIDEO_FORMAT_I420:
> ++    case GST_VIDEO_FORMAT_YV12:
> ++      g_return_val_if_fail (stride >= width, GST_FLOW_ERROR);
> ++      stridemove (
> ++          strided + (int)(height*stride*1.5),
> ++          unstrided + (int)(height*width*1.5),
> ++          stride, width/2, height);                             /* move U/V */
> ++      stridemove (
> ++          strided + (height*stride),
> ++          unstrided + (height*width),
> ++          stride, width/2, height);                             /* move V/U */
> ++      stridemove (strided, unstrided, stride, width, height);   /* move Y */
> ++      return GST_FLOW_OK;
> ++    case GST_VIDEO_FORMAT_YUY2:
> ++    case GST_VIDEO_FORMAT_UYVY:
> ++      g_return_val_if_fail (stride >= (width*2), GST_FLOW_ERROR);
> ++      stridemove (strided, unstrided, stride, width*2, height);
> ++      return GST_FLOW_OK;
> ++    default:
> ++      GST_WARNING ("unknown color format!\n");
> ++      return GST_FLOW_ERROR;
> ++  }
> ++}
> ++
> ++
> ++/**
> ++ * Convert from a strided buffer to non-strided.  The two buffer pointers could
> ++ * be pointing to the same memory block for in-place transform..
> ++ *
> ++ * @unstrided:  the pointer to the resulting unstrided buffer
> ++ * @strided:    the pointer to the initial strided buffer
> ++ */
> ++static GstFlowReturn
> ++unstridify (GstStrideTransform *self, guchar *unstrided, guchar *strided)
> ++{
> ++  gint width  = self->width;
> ++  gint height = self->height;
> ++  gint stride = self->in_rowstride;
> ++
> ++  switch (self->format) {
> ++#if 0 /* TODO */
> ++    case GST_VIDEO_FORMAT_NV12:
> ++      g_return_val_if_fail (stride >= width, GST_FLOW_ERROR);
> ++      stridemove (unstrided, strided, width, stride, height * 1.5);
> ++      return GST_FLOW_OK;
> ++#endif
> ++    case GST_VIDEO_FORMAT_I420:
> ++    case GST_VIDEO_FORMAT_YV12:
> ++      g_return_val_if_fail (stride >= width, GST_FLOW_ERROR);
> ++      stridemove (unstrided, strided, width, stride, height);   /* move Y */
> ++      stridemove (
> ++          unstrided + (height*width),
> ++          strided + (height*stride),
> ++          width/2, stride, height);                             /* move V/U */
> ++      stridemove (
> ++          unstrided + (int)(height*width*1.5),
> ++          strided + (int)(height*stride*1.5),
> ++          width/2, stride, height);                             /* move U/V */
> ++      return GST_FLOW_OK;
> ++    case GST_VIDEO_FORMAT_YUY2:
> ++    case GST_VIDEO_FORMAT_UYVY:
> ++      g_return_val_if_fail (stride >= (width*2), GST_FLOW_ERROR);
> ++      stridemove (unstrided, strided, width*2, stride, height);
> ++      return GST_FLOW_OK;
> ++    default:
> ++      GST_WARNING ("unknown color format!\n");
> ++      return GST_FLOW_ERROR;
> ++  }
> ++}
> ++
> ++
> ++static GstFlowReturn
> ++gst_stride_transform_transform (GstBaseTransform *base,
> ++    GstBuffer *inbuf, GstBuffer *outbuf)
> ++{
> ++  GstStrideTransform *self = GST_STRIDE_TRANSFORM (base);
> ++
> ++  GST_DEBUG_OBJECT (self, "inbuf=%p (size=%d), outbuf=%p (size=%d)",
> ++      inbuf, GST_BUFFER_SIZE (inbuf),
> ++      outbuf, GST_BUFFER_SIZE (outbuf));
> ++
> ++  if (self->in_rowstride && self->out_rowstride) {
> ++    GST_DEBUG_OBJECT (self, "not implemented");  // TODO
> ++    return GST_FLOW_ERROR;
> ++  } else if (self->in_rowstride) {
> ++    return unstridify (self,
> ++        GST_BUFFER_DATA (outbuf), GST_BUFFER_DATA (inbuf));
> ++  } else if (self->out_rowstride) {
> ++    return stridify (self,
> ++        GST_BUFFER_DATA (outbuf), GST_BUFFER_DATA (inbuf));
> ++  }
> ++
> ++  GST_DEBUG_OBJECT (self, "this shouldn't happen!  in_rowstride=%d, out_rowstride=%d",
> ++      self->in_rowstride, self->out_rowstride);
> ++
> ++  return GST_FLOW_ERROR;
> ++}
> ++
> ++static GstFlowReturn
> ++gst_stride_transform_transform_ip (GstBaseTransform *base,
> ++    GstBuffer *buf)
> ++{
> ++  /* transform function is safe to call with same buffer ptr:
> ++   */
> ++  return gst_stride_transform_transform (base, buf, buf);
> ++}
> +diff --git a/gst/stride/gststridetransform.h b/gst/stride/gststridetransform.h
> +new file mode 100644
> +index 0000000..481959e
> +--- /dev/null
> ++++ b/gst/stride/gststridetransform.h
> +@@ -0,0 +1,80 @@
> ++/* GStreamer
> ++ *
> ++ * Copyright (C) 2009 Texas Instruments, Inc - http://www.ti.com/
> ++ *
> ++ * Description: V4L2 sink element
> ++ *  Created on: Jul 2, 2009
> ++ *      Author: Rob Clark <rob@ti.com>
> ++ *
> ++ * 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 __GSTSTRIDETRANSFORM_H__
> ++#define __GSTSTRIDETRANSFORM_H__
> ++
> ++
> ++#include <gst/video/gstvideofilter.h>
> ++#include <gst/video/video.h>
> ++
> ++
> ++G_BEGIN_DECLS
> ++
> ++#define GST_TYPE_STRIDE_TRANSFORM \
> ++  (gst_stride_transform_get_type())
> ++#define GST_STRIDE_TRANSFORM(obj) \
> ++  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_STRIDE_TRANSFORM,GstStrideTransform))
> ++#define GST_STRIDE_TRANSFORM_CLASS(klass) \
> ++  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_STRIDE_TRANSFORM,GstStrideTransformClass))
> ++#define GST_IS_STRIDE_TRANSFORM(obj) \
> ++  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_STRIDE_TRANSFORM))
> ++#define GST_IS_STRIDE_TRANSFORM_CLASS(klass) \
> ++  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_STRIDE_TRANSFORM))
> ++
> ++typedef struct _GstStrideTransform GstStrideTransform;
> ++typedef struct _GstStrideTransformClass GstStrideTransformClass;
> ++
> ++/**
> ++ * GstStrideTransform:
> ++ *
> ++ * Opaque datastructure.
> ++ */
> ++struct _GstStrideTransform {
> ++  GstVideoFilter videofilter;
> ++
> ++  /*< private >*/
> ++  GstVideoFormat format;
> ++  gint width, height;
> ++  gint in_rowstride;
> ++  gint out_rowstride;
> ++
> ++  /* for caching the tranform_size() results.. */
> ++  GstCaps *cached_caps[2];
> ++  guint cached_size[2];
> ++};
> ++
> ++struct _GstStrideTransformClass {
> ++  GstVideoFilterClass parent_class;
> ++};
> ++
> ++GType gst_stride_transform_get_type (void);
> ++
> ++G_END_DECLS
> ++
> ++
> ++#define LOG_CAPS(obj, caps)  GST_DEBUG_OBJECT (obj, "%s: %"GST_PTR_FORMAT, #caps, caps)
> ++
> ++
> ++#endif /* __GSTSTRIDETRANSFORM_H__ */
> +diff --git a/gst/stride/plugin.c b/gst/stride/plugin.c
> +new file mode 100644
> +index 0000000..7672bdc
> +--- /dev/null
> ++++ b/gst/stride/plugin.c
> +@@ -0,0 +1,45 @@
> ++/* GStreamer
> ++ *
> ++ * Copyright (C) 2009 Texas Instruments, Inc - http://www.ti.com/
> ++ *
> ++ * Description: V4L2 sink element
> ++ *  Created on: Jul 30, 2009
> ++ *      Author: Rob Clark <rob@ti.com>
> ++ *
> ++ * 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.
> ++ */
> ++
> ++#ifdef HAVE_CONFIG_H
> ++#include "config.h"
> ++#endif
> ++
> ++#include "gststridetransform.h"
> ++
> ++static gboolean
> ++plugin_init (GstPlugin * plugin)
> ++{
> ++  if (!gst_element_register (plugin, "stridetransform",
> ++          GST_RANK_PRIMARY, gst_stride_transform_get_type ()))
> ++    return FALSE;
> ++
> ++  return TRUE;
> ++}
> ++
> ++GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
> ++    GST_VERSION_MINOR,
> ++    "stridetransform",
> ++    "Convert video from strided to non-strided, or between different row-strides",
> ++    plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
> +-- 
> +1.6.3.1
> +
> diff --git a/recipes/obsolete/gstreamer/gst-plugins-base_0.10.25.bb b/recipes/obsolete/gstreamer/gst-plugins-base_0.10.25.bb
> new file mode 100644
> index 0000000..9e82171
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gst-plugins-base_0.10.25.bb
> @@ -0,0 +1,19 @@
> +require gst-plugins.inc
> +
> +SRC_URI += "file://fix-playbin2.patch \
> +            file://gst-plugins-base_rowstride.patch \
> +"
> +
> +PR = "${INC_PR}.4"
> +
> +PROVIDES += "gst-plugins"
> +
> +# gst-plugins-base only builds the alsa plugin
> +# if alsa has been built and is present.  You will
> +# not get an error if this is not present, just 
> +# a missing alsa plugin
> +DEPENDS += "cdparanoia pango libtheora alsa-lib libsm virtual/libx11 freetype  libxv libxrandr"
> +
> +
> +SRC_URI[archive.md5sum] = "d29669dd79276c5cd94e1613c03cd9ab"
> +SRC_URI[archive.sha256sum] = "0ab2f7e1d818e7af1be99c4eae02ba69d4a1b8f7e3527929a6426f1daa0d4607"
> diff --git a/recipes/obsolete/gstreamer/gst-plugins-base_0.10.31.bb b/recipes/obsolete/gstreamer/gst-plugins-base_0.10.31.bb
> new file mode 100644
> index 0000000..b68fffb
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gst-plugins-base_0.10.31.bb
> @@ -0,0 +1,26 @@
> +require gst-plugins.inc
> +
> +SRC_URI += " \
> +            file://ivorbis-thumb.patch \
> +"
> +
> +SRC_URI[archive.md5sum] = "9baa0d87e81c88b2477a3554ab629c46"
> +SRC_URI[archive.sha256sum] = "abb006c78222cfb69d31e983268d1d5219e9d4e0da24c6c4cd687968af7a33bd"
> +
> +PR = "${INC_PR}.1"
> +
> +PROVIDES += "gst-plugins"
> +
> +# gst-plugins-base only builds the alsa plugin
> +# if alsa has been built and is present.  You will
> +# not get an error if this is not present, just
> +# a missing alsa plugin
> +DEPENDS += "udev cdparanoia pango libtheora alsa-lib libsm virtual/libx11 freetype  libxv libxrandr gtk+"
> +
> +# Needs a udev that enabled gudev, which isn't the default
> +EXTRA_OECONF_append = " --with-gudev"
> +
> +do_configure_prepend() {
> +	sed -i -e s:QtGui:NoQtGui:g ${S}/configure.ac
> +}
> +
> diff --git a/recipes/obsolete/gstreamer/gst-plugins-good/fix-unit-scale-asseration.patch b/recipes/obsolete/gstreamer/gst-plugins-good/fix-unit-scale-asseration.patch
> new file mode 100644
> index 0000000..749c491
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gst-plugins-good/fix-unit-scale-asseration.patch
> @@ -0,0 +1,33 @@
> +diff -uNr gst-plugins-good-0.10.15/sys/v4l2/gstv4l2src.c gst-plugins-good-0.10.15.new/sys/v4l2/gstv4l2src.c
> +--- gst-plugins-good-0.10.15/sys/v4l2/gstv4l2src.c	2009-05-11 19:00:07.000000000 -0500
> ++++ gst-plugins-good-0.10.15.new/sys/v4l2/gstv4l2src.c	2009-06-22 09:51:50.000000000 -0500
> +@@ -1377,14 +1377,22 @@
> +       timestamp = gst_clock_get_time (clock) - timestamp;
> +       gst_object_unref (clock);
> + 
> +-      latency =
> +-          gst_util_uint64_scale_int (GST_SECOND, v4l2src->fps_d,
> +-          v4l2src->fps_n);
> ++      /* we must have a framerate */
> ++      if (v4l2src->fps_n <= 0 || v4l2src->fps_d <= 0) {
> ++        GST_WARNING_OBJECT (src,
> ++            "Can't give latency since framerate isn't fixated !");
> ++        timestamp = GST_CLOCK_TIME_NONE;
> ++      }
> ++      else {
> ++        latency =
> ++            gst_util_uint64_scale_int (GST_SECOND, v4l2src->fps_d,
> ++            v4l2src->fps_n);
> + 
> +-      if (timestamp > latency)
> +-        timestamp -= latency;
> +-      else
> +-        timestamp = 0;
> ++        if (timestamp > latency)
> ++          timestamp -= latency;
> ++        else
> ++          timestamp = 0;
> ++      }
> +     }
> + 
> +     /* FIXME: use the timestamp from the buffer itself! */
> diff --git a/recipes/obsolete/gstreamer/gst-plugins-good_0.10.15.bb b/recipes/obsolete/gstreamer/gst-plugins-good_0.10.15.bb
> new file mode 100644
> index 0000000..f2b0a5a
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gst-plugins-good_0.10.15.bb
> @@ -0,0 +1,16 @@
> +require gst-plugins.inc
> +
> +PR = "r6"
> +
> +SRC_URI += "file://fix-unit-scale-asseration.patch"
> +
> +inherit gconf 
> +
> +DEPENDS += "libsoup-2.4 flac gst-plugins-base openssl popt esound"
> +
> +PACKAGES =+ "gst-plugin-gconfelements"
> +FILES_gst-plugin-gconfelements += "${sysconfdir}/gconf"
> +
> +
> +SRC_URI[archive.md5sum] = "19bc6cc07951b3382d1ac8525b20e83f"
> +SRC_URI[archive.sha256sum] = "831f450a0fa18c881b00ec50e8916ed66ca0fecb53cd1939f0abcc02930f9847"
> diff --git a/recipes/obsolete/gstreamer/gst-rtsp_0.10.4.bb b/recipes/obsolete/gstreamer/gst-rtsp_0.10.4.bb
> new file mode 100644
> index 0000000..265f0f7
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gst-rtsp_0.10.4.bb
> @@ -0,0 +1,4 @@
> +require gst-rtsp.inc
> +
> +SRC_URI[md5sum] = "8daaca1299aeb42c6aac47b30291005b"
> +SRC_URI[sha256sum] = "1ebf3571d16dbab401f2ebf0362e3d67457fb88711ad15a4ab51bd3730267fb7"
> diff --git a/recipes/obsolete/gstreamer/gst-rtsp_0.10.5.bb b/recipes/obsolete/gstreamer/gst-rtsp_0.10.5.bb
> new file mode 100644
> index 0000000..dbaddc3
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gst-rtsp_0.10.5.bb
> @@ -0,0 +1,4 @@
> +require gst-rtsp.inc
> +
> +SRC_URI[md5sum] = "caca55e2ff497c0a327df3bc65a4a662"
> +SRC_URI[sha256sum] = "a6f0a0c6c466683ee688aa8475623850fdacb549b2339a502831fdd3d74f984e"
> diff --git a/recipes/obsolete/gstreamer/gstreamer/po-makefile-fix.patch b/recipes/obsolete/gstreamer/gstreamer/po-makefile-fix.patch
> new file mode 100644
> index 0000000..1cf665e
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gstreamer/po-makefile-fix.patch
> @@ -0,0 +1,12 @@
> +diff -urN gstreamer-0.10.17.orig/po/Makefile.in.in gstreamer-0.10.17/po/Makefile.in.in
> +--- gstreamer-0.10.17.orig/po/Makefile.in.in	2008-01-25 16:21:31.000000000 +0100
> ++++ gstreamer-0.10.17/po/Makefile.in.in	2008-09-08 14:41:21.000000000 +0200
> +@@ -30,7 +30,7 @@
> + INSTALL = @INSTALL@
> + INSTALL_DATA = @INSTALL_DATA@
> + MKINSTALLDIRS = @MKINSTALLDIRS@
> +-mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS)" ;; *) echo "$(top_builddir)/$(MKINSTALLDIRS)" ;; esac`
> ++mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
> + 
> + GMSGFMT = @GMSGFMT@
> + MSGFMT = @MSGFMT@
> diff --git a/recipes/obsolete/gstreamer/gstreamer/registry-do-not-look-into-debug-dirs.patch b/recipes/obsolete/gstreamer/gstreamer/registry-do-not-look-into-debug-dirs.patch
> new file mode 100644
> index 0000000..6733e6b
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gstreamer/registry-do-not-look-into-debug-dirs.patch
> @@ -0,0 +1,39 @@
> +Work around a glibc 2.6.1 bug with dlopen. We try to dlopen a .so file that
> +only contains debug symbols (e.g. no architecture is set in the elf header)
> +
> +
> +#0  0x4000a88c in _dl_relocate_object () from /lib/ld-linux.so.3
> +(gdb) bt
> +#0  0x4000a88c in _dl_relocate_object () from /lib/ld-linux.so.3
> +#1  0x40011f68 in dl_open_worker () from /lib/ld-linux.so.3
> +#2  0x4000d7e4 in _dl_catch_error () from /lib/ld-linux.so.3
> +#3  0x400117d8 in _dl_open () from /lib/ld-linux.so.3
> +#4  0x402fba84 in dlopen_doit () from /lib/libdl.so.2
> +#5  0x4000d7e4 in _dl_catch_error () from /lib/ld-linux.so.3
> +#6  0x402fbf50 in _dlerror_run () from /lib/libdl.so.2
> +#7  0x402fb9bc in dlopen@@GLIBC_2.4 () from /lib/libdl.so.2
> +#8  0x402f2790 in g_module_open () from /usr/lib/libgmodule-2.0.so.0
> +#9  0x40078784 in gst_plugin_load_file (
> +    filename=0x10a6c8 "/usr/lib/gstreamer-0.10/.debug/libgstcoreindexers.so", 
> +    error=0x0) at gstplugin.c:481
> +#10 0x4007e3c4 in gst_registry_scan_path_level (registry=0x27828, 
> +    path=0x10a6a0 "/usr/lib/gstreamer-0.10/.debug", level=1) at gstregistry.c:891
> +#11 0x4007df04 in gst_registry_scan_path_level (registry=0x27828, 
> +
> +
> +Index: gstreamer-0.10.17/gst/gstregistry.c
> +===================================================================
> +--- gstreamer-0.10.17.orig/gst/gstregistry.c	2008-11-14 23:30:48.000000000 +0100
> ++++ gstreamer-0.10.17/gst/gstregistry.c	2008-11-14 23:32:39.000000000 +0100
> +@@ -813,7 +813,10 @@
> +     GST_LOG_OBJECT (registry, "examining file: %s", filename);
> + 
> +     if (g_file_test (filename, G_FILE_TEST_IS_DIR)) {
> +-      if (level > 0) {
> ++      if (g_str_has_suffix (filename, ".debug")) {
> ++        GST_LOG_OBJECT (registry,
> ++            "found directory, not descending into .debug directory");
> ++      } else if (level > 0) {
> +         GST_LOG_OBJECT (registry, "found directory, recursing");
> +         changed |= gst_registry_scan_path_level (registry, filename, level - 1);
> +       } else {
> diff --git a/recipes/obsolete/gstreamer/gstreamer_0.10.17.bb b/recipes/obsolete/gstreamer/gstreamer_0.10.17.bb
> new file mode 100644
> index 0000000..dd01e16
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gstreamer_0.10.17.bb
> @@ -0,0 +1,10 @@
> +require gstreamer.inc
> +
> +PR = "r4"
> +
> +SRC_URI += "file://po-makefile-fix.patch \
> +            file://registry-do-not-look-into-debug-dirs.patch "
> +
> +
> +SRC_URI[archive.md5sum] = "3232416ea6fceab628236d67a7d0a44a"
> +SRC_URI[archive.sha256sum] = "442862dc93e734aa58f13bcf3914dc7a40d3fa28f0ae2152c80457438dc3569c"
> diff --git a/recipes/obsolete/gstreamer/gstreamer_0.10.25.bb b/recipes/obsolete/gstreamer/gstreamer_0.10.25.bb
> new file mode 100644
> index 0000000..6ba8a6d
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gstreamer_0.10.25.bb
> @@ -0,0 +1,6 @@
> +require gstreamer.inc
> +
> +EXTRA_OECONF += "ac_cv_func_register_printf_function=no"
> +
> +SRC_URI[archive.md5sum] = "88544e034a051baf472983791d233076"
> +SRC_URI[archive.sha256sum] = "39b2ba7b3bfa8df6d998a9461e7091c27757e36a53e93969d7d9982a56526578"
> diff --git a/recipes/obsolete/gstreamer/gstreamer_0.10.31.bb b/recipes/obsolete/gstreamer/gstreamer_0.10.31.bb
> new file mode 100644
> index 0000000..8b8eb77
> --- /dev/null
> +++ b/recipes/obsolete/gstreamer/gstreamer_0.10.31.bb
> @@ -0,0 +1,15 @@
> +require gstreamer.inc
> +
> +PR = "r2"
> +
> +SRC_URI[archive.md5sum] = "a21fb08bdb578d972c7c14e77da8fbb6"
> +SRC_URI[archive.sha256sum] = "7f737e6d047c1ebeb4e1e0725fc377c5d9f12ee89186de7960be3cbba709ab84"
> +
> +SRC_URI += " \
> +             file://0001-add-GstQueryBuffers-query.patch \
> +             file://0002-gstevent-add-crop-event.patch \
> +             file://0003-basetransform-don-t-do-unnecessary-pad_alloc.patch \
> +"
> +
> +EXTRA_OECONF += "ac_cv_func_register_printf_function=no"
> +

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (Darwin)

iD8DBQFNggLHMkyGM64RGpERAqWtAJ9v+OxJV5yuVgozfbm92cEZVDfjlwCfePjl
ijQHPTRqYEFZHhxoOfWT0O4=
=id+E
-----END PGP SIGNATURE-----




      parent reply	other threads:[~2011-03-17 12:49 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-17 12:41 [PATCH 1/2] gstreamer: move old versions to obsolete Martin Jansa
2011-03-17 12:41 ` [PATCH 2/2] gst-plugins: define disjunctive PACKAGES_DYNAMIC for each pack base/good/bad/ugly Martin Jansa
2011-03-17 13:30   ` Koen Kooi
2011-03-17 13:52     ` Martin Jansa
2011-04-06 16:12     ` [PATCHv2 1/3] gst-plugins-good-0.10.26: move to obsolete Martin Jansa
2011-04-06 16:12       ` [PATCHv2 2/3] gst-plugins: define disjunctive PACKAGES_DYNAMIC for each pack base/good/bad/ugly Martin Jansa
2011-04-06 16:26         ` Robert Foerster
2011-04-10 14:29         ` Mike Westerhof
2011-04-06 16:12       ` [PATCHv2 3/3] generate-packages-dynamic-list: contrib script to generate " Martin Jansa
2011-04-10 14:29         ` Mike Westerhof
2011-03-17 13:43   ` [PATCH 2/2] gst-plugins: define " Phil Blundell
2011-03-17 12:47 ` Koen Kooi [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='ilsvsh$e2q$1@dough.gmane.org' \
    --to=koen@dominion.thruhere.net \
    --cc=openembedded-devel@lists.openembedded.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.