Added gst-plugins-base-subtitles0.10-0.10.34 for Meego Harmattan 1.2
[mafwsubrenderer] / gst-plugins-base-subtitles0.10 / debian / patches / 0014-NEON-optimized-version-of-uyvy_to_rgb24-function.patch
diff --git a/gst-plugins-base-subtitles0.10/debian/patches/0014-NEON-optimized-version-of-uyvy_to_rgb24-function.patch b/gst-plugins-base-subtitles0.10/debian/patches/0014-NEON-optimized-version-of-uyvy_to_rgb24-function.patch
new file mode 100644 (file)
index 0000000..05c6ccd
--- /dev/null
@@ -0,0 +1,161 @@
+From 324f67541827f4027b54d03b67c79e649980d0dc Mon Sep 17 00:00:00 2001
+From: Siarhei Siamashka <siarhei.siamashka@nokia.com>
+Date: Mon, 13 Jul 2009 17:29:02 +0300
+Subject: [PATCH] NEON optimized version of uyvy_to_rgb24 function
+
+---
+ gst/ffmpegcolorspace/imgconvert.c |  134 +++++++++++++++++++++++++++++++++++++
+ 1 files changed, 134 insertions(+), 0 deletions(-)
+
+diff --git a/gst/ffmpegcolorspace/imgconvert.c b/gst/ffmpegcolorspace/imgconvert.c
+index cb145bb..2436a20 100644
+--- a/gst/ffmpegcolorspace/imgconvert.c
++++ b/gst/ffmpegcolorspace/imgconvert.c
+@@ -827,6 +827,137 @@ img_copy (AVPicture * dst, const AVPicture * src,
+   }
+ }
++#ifdef __ARM_NEON__
++/*
++ * ARM NEON optimized implementation of UYVY -> RGB24 convertor
++ */
++static void
++uyvy422_to_rgb24_line_neon (uint8_t * dst, uint8_t * src, int n)
++{
++  /* and this is the NEON code itself */
++  static __attribute__ ((aligned (16))) uint16_t acc_r[8] = {
++    22840, 22840, 22840, 22840, 22840, 22840, 22840, 22840,
++  };
++  static __attribute__ ((aligned (16))) uint16_t acc_g[8] = {
++    17312, 17312, 17312, 17312, 17312, 17312, 17312, 17312,
++  };
++  static __attribute__ ((aligned (16))) uint16_t acc_b[8] = {
++    28832, 28832, 28832, 28832, 28832, 28832, 28832, 28832,
++  };
++  /* 
++   * Registers:
++   * q0, q1 : d0, d1, d2, d3  - are used for initial loading of YUV data
++   * q2     : d4, d5          - are used for storing converted RGB data
++   * q3     : d6, d7          - are used for temporary storage
++   *
++   * q4-q7 - reserved
++   *
++   * q8, q9 : d16, d17, d18, d19  - are used for expanded Y data
++   * q10    : d20, d21
++   * q11    : d22, d23
++   * q12    : d24, d25
++   * q13    : d26, d27            
++   * q13, q14, q15            - various constants (#16, #149, #204, #50, #104, #154)
++   */
++  asm volatile (".macro convert_macroblock size\n"
++      /* load up to 16 source pixels in UYVY format */
++      ".if \\size == 16\n"
++      "pld [%[src], #128]\n"
++      "vld1.32 {d0, d1, d2, d3}, [%[src]]!\n"
++      ".elseif \\size == 8\n"
++      "vld1.32 {d0, d1}, [%[src]]!\n"
++      ".elseif \\size == 4\n"
++      "vld1.32 {d0}, [%[src]]!\n"
++      ".elseif \\size == 2\n"
++      "vld1.32 {d0[0]}, [%[src]]!\n"
++      ".else\n" ".error \"unsupported macroblock size\"\n" ".endif\n"
++      /* convert from 'packed' to 'planar' representation */
++      "vuzp.8      d0, d1\n"    /* d1 - separated Y data (first 8 bytes) */
++      "vuzp.8      d2, d3\n"    /* d3 - separated Y data (next 8 bytes) */
++      "vuzp.8      d0, d2\n"    /* d0 - separated U data, d2 - separated V data */
++      /* split even and odd Y color components */
++      "vuzp.8      d1, d3\n"    /* d1 - evenY, d3 - oddY */
++      /* clip upper and lower boundaries */
++      "vqadd.u8    q0, q0, q4\n" "vqadd.u8    q1, q1, q4\n" "vqsub.u8    q0, q0, q5\n" "vqsub.u8    q1, q1, q5\n" "vshr.u8     d4, d2, #1\n"    /* d4 = V >> 1 */
++      "vmull.u8    q8, d1, d27\n"       /* q8 = evenY * 149 */
++      "vmull.u8    q9, d3, d27\n"       /* q9 = oddY * 149 */
++      "vld1.16     {d20, d21}, [%[acc_r], :128]\n"      /* q10 - initialize accumulator for red */
++      "vsubw.u8    q10, q10, d4\n"      /* red acc -= (V >> 1) */
++      "vmlsl.u8    q10, d2, d28\n"      /* red acc -= V * 204 */
++      "vld1.16     {d22, d23}, [%[acc_g], :128]\n"      /* q11 - initialize accumulator for green */
++      "vmlsl.u8    q11, d2, d30\n"      /* green acc -= V * 104 */
++      "vmlsl.u8    q11, d0, d29\n"      /* green acc -= U * 50 */
++      "vld1.16     {d24, d25}, [%[acc_b], :128]\n"      /* q12 - initialize accumulator for blue */
++      "vmlsl.u8    q12, d0, d30\n"      /* blue acc -= U * 104 */
++      "vmlsl.u8    q12, d0, d31\n"      /* blue acc -= U * 154 */
++      "vhsub.s16   q3, q8, q10\n"       /* calculate even red components */
++      "vhsub.s16   q10, q9, q10\n"      /* calculate odd red components */
++      "vqshrun.s16 d0, q3, #6\n"        /* right shift, narrow and saturate even red components */
++      "vqshrun.s16 d3, q10, #6\n"       /* right shift, narrow and saturate odd red components */
++      "vhadd.s16   q3, q8, q11\n"       /* calculate even green components */
++      "vhadd.s16   q11, q9, q11\n"      /* calculate odd green components */
++      "vqshrun.s16 d1, q3, #6\n"        /* right shift, narrow and saturate even green components */
++      "vqshrun.s16 d4, q11, #6\n"       /* right shift, narrow and saturate odd green components */
++      "vhsub.s16   q3, q8, q12\n"       /* calculate even blue components */
++      "vhsub.s16   q12, q9, q12\n"      /* calculate odd blue components */
++      "vqshrun.s16 d2, q3, #6\n"        /* right shift, narrow and saturate even blue components */
++      "vqshrun.s16 d5, q12, #6\n"       /* right shift, narrow and saturate odd blue components */
++      "vzip.8      d0, d3\n"    /* join even and odd red components */
++      "vzip.8      d1, d4\n"    /* join even and odd green components */
++      "vzip.8      d2, d5\n"    /* join even and odd blue components */
++      ".if \\size == 16\n" "vst3.8  {d0, d1, d2}, [%[dst]]!\n" "vst3.8  {d3, d4, d5}, [%[dst]]!\n" ".elseif \\size == 8\n" "vst3.8  {d0, d1, d2}, [%[dst]]!\n" ".elseif \\size == 4\n" "vst3.8  {d0[0], d1[0], d2[0]}, [%[dst]]!\n" "vst3.8  {d0[1], d1[1], d2[1]}, [%[dst]]!\n" "vst3.8  {d0[2], d1[2], d2[2]}, [%[dst]]!\n" "vst3.8  {d0[3], d1[3], d2[3]}, [%[dst]]!\n" ".elseif \\size == 2\n" "vst3.8  {d0[0], d1[0], d2[0]}, [%[dst]]!\n" "vst3.8  {d0[1], d1[1], d2[1]}, [%[dst]]!\n" ".else\n" ".error \"unsupported macroblock size\"\n" ".endif\n" ".endm\n" "vmov.u8     d8, #15\n"  /* add this to U/V to saturate upper boundary */
++      "vmov.u8     d9, #20\n"   /* add this to Y to saturate upper boundary */
++      "vmov.u8     d10, #31\n"  /* sub this from U/V to saturate lower boundary */
++      "vmov.u8     d11, #36\n"  /* sub this from Y to saturate lower boundary */
++      "vmov.u8     d26, #16\n"
++      "vmov.u8     d27, #149\n"
++      "vmov.u8     d28, #204\n"
++      "vmov.u8     d29, #50\n"
++      "vmov.u8     d30, #104\n"
++      "vmov.u8     d31, #154\n"
++      "subs        %[n], %[n], #16\n"
++      "blt         2f\n"
++      "1:\n"
++      "convert_macroblock 16\n"
++      "subs        %[n], %[n], #16\n"
++      "bge         1b\n"
++      "2:\n"
++      "tst         %[n], #8\n"
++      "beq         3f\n"
++      "convert_macroblock 8\n"
++      "3:\n"
++      "tst         %[n], #4\n"
++      "beq         4f\n"
++      "convert_macroblock 4\n"
++      "4:\n"
++      "tst         %[n], #2\n"
++      "beq         5f\n"
++      "convert_macroblock 2\n"
++      "5:\n"
++      ".purgem convert_macroblock\n":[src] "+&r" (src),[dst] "+&r" (dst),
++      [n] "+&r" (n)
++      :[acc_r] "r" (&acc_r[0]),[acc_g] "r" (&acc_g[0]),[acc_b] "r" (&acc_b[0])
++      :"cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11",        /* "d12", "d13", "d14", "d15", */
++      "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
++      "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31");
++}
++
++static void
++uyvy422_to_rgb24_neon (AVPicture * dst, const AVPicture * src,
++    int width, int height)
++{
++  uint8_t *s, *d;
++  d = dst->data[0];
++  s = src->data[0];
++  for (; height > 0; height--) {
++    uyvy422_to_rgb24_line_neon (d, s, width);
++    d += dst->linesize[0];
++    s += src->linesize[0];
++  }
++}
++
++#endif
++
+ /* XXX: totally non optimized */
+ static void
+@@ -3178,6 +3309,9 @@ static ConvertEntry convert_table[] = {
+   {PIX_FMT_YUV422, PIX_FMT_ABGR32, yuv422_to_abgr32},
+   {PIX_FMT_YUV422, PIX_FMT_ARGB32, yuv422_to_argb32},
++#ifdef __ARM_NEON__
++  {PIX_FMT_UYVY422, PIX_FMT_RGB24, uyvy422_to_rgb24_neon},
++#endif
+   {PIX_FMT_UYVY422, PIX_FMT_YUV420P, uyvy422_to_yuv420p},
+   {PIX_FMT_UYVY422, PIX_FMT_YUV422P, uyvy422_to_yuv422p},
+   {PIX_FMT_UYVY422, PIX_FMT_GRAY8, uyvy422_to_gray},