vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Thu Jul  7 
23:12:58 2011 +0300| [d063eece351c0f0da7023c511143e95c6bd1eac8] | committer: 
Rémi Denis-Courmont

chroma_yuv_neon: packed to planar YUV422

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d063eece351c0f0da7023c511143e95c6bd1eac8
---

 modules/arm_neon/chroma_neon.h |    8 +++
 modules/arm_neon/chroma_yuv.c  |   80 ++++++++++++++++++++++++++++++++++
 modules/arm_neon/yuyv_i422.S   |   94 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 182 insertions(+), 0 deletions(-)

diff --git a/modules/arm_neon/chroma_neon.h b/modules/arm_neon/chroma_neon.h
index df8730e..204c5f1 100644
--- a/modules/arm_neon/chroma_neon.h
+++ b/modules/arm_neon/chroma_neon.h
@@ -56,3 +56,11 @@ void i422_yuyv_neon (struct yuv_pack *const out,
 void i422_uyvy_neon (struct yuv_pack *const out,
                      const struct yuv_planes *const in,
                      int width, int height);
+
+/* YUYV to I422 conversion. */
+void yuyv_i422_neon (struct yuv_planes *const out,
+                     const struct yuv_pack *const in, int width, int height);
+
+/* UYVY to I422 conversion. */
+void uyvy_i422_neon (struct yuv_planes *const out,
+                     const struct yuv_pack *const in, int width, int height);
diff --git a/modules/arm_neon/chroma_yuv.c b/modules/arm_neon/chroma_yuv.c
index 3ac30fb..fc9ca0f 100644
--- a/modules/arm_neon/chroma_yuv.c
+++ b/modules/arm_neon/chroma_yuv.c
@@ -121,6 +121,43 @@ static void I422_VYUY (filter_t *filter, picture_t *src, 
picture_t *dst)
 VIDEO_FILTER_WRAPPER (I422_VYUY)
 
 
+/* Packedr YUV422 to planar YUV422 */
+static void YUYV_I422 (filter_t *filter, picture_t *src, picture_t *dst)
+{
+    DEFINE_PLANES(out, dst);
+    DEFINE_PACK(in, src);
+    yuyv_i422_neon (&out, &in, filter->fmt_in.video.i_width,
+                    filter->fmt_in.video.i_height);
+}
+VIDEO_FILTER_WRAPPER (YUYV_I422)
+
+static void YVYU_I422 (filter_t *filter, picture_t *src, picture_t *dst)
+{
+    DEFINE_PLANES_SWAP(out, dst);
+    DEFINE_PACK(in, src);
+    yuyv_i422_neon (&out, &in, filter->fmt_in.video.i_width,
+                    filter->fmt_in.video.i_height);
+}
+VIDEO_FILTER_WRAPPER (YVYU_I422)
+
+static void UYVY_I422 (filter_t *filter, picture_t *src, picture_t *dst)
+{
+    DEFINE_PLANES(out, dst);
+    DEFINE_PACK(in, src);
+    uyvy_i422_neon (&out, &in, filter->fmt_in.video.i_width,
+                    filter->fmt_in.video.i_height);
+}
+VIDEO_FILTER_WRAPPER (UYVY_I422)
+
+static void VYUY_I422 (filter_t *filter, picture_t *src, picture_t *dst)
+{
+    DEFINE_PLANES_SWAP(out, dst);
+    DEFINE_PACK(in, src);
+    uyvy_i422_neon (&out, &in, filter->fmt_in.video.i_width,
+                    filter->fmt_in.video.i_height);
+}
+VIDEO_FILTER_WRAPPER (VYUY_I422)
+
 static int Open (vlc_object_t *obj)
 {
     filter_t *filter = (filter_t *)obj;
@@ -133,6 +170,7 @@ static int Open (vlc_object_t *obj)
 
     switch (filter->fmt_in.video.i_chroma)
     {
+        /* Planar to packed */
         case VLC_CODEC_I420:
             switch (filter->fmt_out.video.i_chroma)
             {
@@ -193,6 +231,48 @@ static int Open (vlc_object_t *obj)
             }
             break;
 
+        /* Packed to planar */
+        case VLC_CODEC_YUYV:
+            switch (filter->fmt_out.video.i_chroma)
+            {
+                case VLC_CODEC_I422:
+                    filter->pf_video_filter = YUYV_I422_Filter;
+                    break;
+                default:
+                    return VLC_EGENERIC;
+            }
+
+        case VLC_CODEC_UYVY:
+            switch (filter->fmt_out.video.i_chroma)
+            {
+                case VLC_CODEC_I422:
+                    filter->pf_video_filter = UYVY_I422_Filter;
+                    break;
+                default:
+                    return VLC_EGENERIC;
+            }
+
+        case VLC_CODEC_YVYU:
+            switch (filter->fmt_out.video.i_chroma)
+            {
+                case VLC_CODEC_I422:
+                    filter->pf_video_filter = YVYU_I422_Filter;
+                    break;
+                default:
+                    return VLC_EGENERIC;
+            }
+
+
+        case VLC_CODEC_VYUY:
+            switch (filter->fmt_out.video.i_chroma)
+            {
+                case VLC_CODEC_I422:
+                    filter->pf_video_filter = VYUY_I422_Filter;
+                    break;
+                default:
+                    return VLC_EGENERIC;
+            }
+
         default:
             return VLC_EGENERIC;
     }
diff --git a/modules/arm_neon/yuyv_i422.S b/modules/arm_neon/yuyv_i422.S
new file mode 100644
index 0000000..41e4708
--- /dev/null
+++ b/modules/arm_neon/yuyv_i422.S
@@ -0,0 +1,94 @@
+ @*****************************************************************************
+ @ yuyv_i422_neon.S : ARM NEONv1 packed to planar YUV422 conversion
+ @*****************************************************************************
+ @ Copyright (C) 2011 Rémi Denis-Courmont
+ @
+ @ This program 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.
+ @
+ @ This program 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 General Public License for more details.
+ @
+ @ You should have received a copy of the GNU Lesser General Public License
+ @ along with this program; if not, write to the Free Software Foundation,
+ @ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ @****************************************************************************/
+
+       .fpu neon
+       .text
+
+#define I      r0
+#define IPAD   r1
+#define WIDTH  r2
+#define HEIGHT r3
+#define Y      r4
+#define U      r5
+#define V      r6
+#define COUNT  ip
+#define YPAD   lr
+
+       .align
+       .global yuyv_i422_neon
+       .type   yuyv_i422_neon, %function
+yuyv_i422_neon:
+       push            {r4-r6,lr}
+       ldmia           r0,     {Y, U, V, YPAD}
+       ldmia           r1,     {I, IPAD}
+       cmp             HEIGHT, #0
+       sub             YPAD,   YPAD,   WIDTH
+       sub             IPAD,   IPAD,   WIDTH,  lsl #1
+1:
+       movgts          COUNT,  WIDTH
+       pople           {r4-r6,pc}
+2:
+       pld             [I, #64]
+       subs            COUNT,  COUNT,  #16
+       vld1.u8         {q0-q1},        [I,:128]!
+       vuzp.u8         q0,     q1
+       @ TODO: unroll (1 cycle stall)
+       vuzp.u8         d2,     d3
+       vst1.u8         {q0},           [Y,:128]!
+       vst1.u8         {d2},           [U,:64]!
+       vst1.u8         {d3},           [V,:64]!
+       bgt             2b
+
+       subs            HEIGHT, #1
+       add             I,      I,      IPAD
+       add             Y,      Y,      YPAD
+       add             U,      U,      YPAD,   lsr #1
+       add             V,      V,      YPAD,   lsr #1
+       b               1b
+
+       .global uyvy_i422_neon
+       .type   uyvy_i422_neon, %function
+uyvy_i422_neon:
+       push            {r4-r6,lr}
+       ldmia           r0,     {Y, U, V, YPAD}
+       ldmia           r1,     {I, IPAD}
+       cmp             HEIGHT, #0
+       sub             YPAD,   YPAD,   WIDTH
+       sub             IPAD,   IPAD,   WIDTH,  lsl #1
+1:
+       movgts          COUNT,  WIDTH
+       pople           {r4-r6,pc}
+2:
+       pld             [I, #64]
+       subs            COUNT,  COUNT,  #16
+       vld1.u8         {q0-q1},        [I,:128]!
+       vuzp.u8         q0,     q1
+       vuzp.u8         d0,     d1
+       vst1.u8         {q1},           [Y,:128]!
+       vst1.u8         {d0},           [U,:64]!
+       vst1.u8         {d1},           [V,:64]!
+       bgt             2b
+
+       subs            HEIGHT, #1
+       add             I,      I,      IPAD
+       add             Y,      Y,      YPAD
+       add             U,      U,      YPAD,   lsr #1
+       add             V,      V,      YPAD,   lsr #1
+       b               1b

_______________________________________________
vlc-commits mailing list
[email protected]
http://mailman.videolan.org/listinfo/vlc-commits

Reply via email to