summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/recorder/jpeg_load.c61
1 files changed, 29 insertions, 32 deletions
diff --git a/apps/recorder/jpeg_load.c b/apps/recorder/jpeg_load.c
index 5ffa4a54a0..65ddd2a9e4 100644
--- a/apps/recorder/jpeg_load.c
+++ b/apps/recorder/jpeg_load.c
@@ -183,6 +183,19 @@ INLINE unsigned range_limit(int value)
183#endif 183#endif
184} 184}
185 185
186INLINE unsigned scale_output(int value)
187{
188#if defined(CPU_ARM) && ARM_ARCH >= 6
189 asm (
190 "usat %[v], #8, %[v], asr #18\n"
191 : [v] "+r" (value)
192 );
193 return value;
194#else
195 return range_limit(value >> 18);
196#endif
197}
198
186/* IDCT implementation */ 199/* IDCT implementation */
187 200
188 201
@@ -804,38 +817,22 @@ static void jpeg_idct16h(int16_t *ws, unsigned char *out, int16_t *end, int rows
804 817
805 /* Final output stage */ 818 /* Final output stage */
806 819
807 out[JPEG_PIX_SZ*0] = range_limit((int) RIGHT_SHIFT(tmp20 + tmp0, 820 out[JPEG_PIX_SZ*0] = scale_output(tmp20 + tmp0);
808 DS_OUT)); 821 out[JPEG_PIX_SZ*15] = scale_output(tmp20 - tmp0);
809 out[JPEG_PIX_SZ*15] = range_limit((int) RIGHT_SHIFT(tmp20 - tmp0, 822 out[JPEG_PIX_SZ*1] = scale_output(tmp21 + tmp1);
810 DS_OUT)); 823 out[JPEG_PIX_SZ*14] = scale_output(tmp21 - tmp1);
811 out[JPEG_PIX_SZ*1] = range_limit((int) RIGHT_SHIFT(tmp21 + tmp1, 824 out[JPEG_PIX_SZ*2] = scale_output(tmp22 + tmp2);
812 DS_OUT)); 825 out[JPEG_PIX_SZ*13] = scale_output(tmp22 - tmp2);
813 out[JPEG_PIX_SZ*14] = range_limit((int) RIGHT_SHIFT(tmp21 - tmp1, 826 out[JPEG_PIX_SZ*3] = scale_output(tmp23 + tmp3);
814 DS_OUT)); 827 out[JPEG_PIX_SZ*12] = scale_output(tmp23 - tmp3);
815 out[JPEG_PIX_SZ*2] = range_limit((int) RIGHT_SHIFT(tmp22 + tmp2, 828 out[JPEG_PIX_SZ*4] = scale_output(tmp24 + tmp10);
816 DS_OUT)); 829 out[JPEG_PIX_SZ*11] = scale_output(tmp24 - tmp10);
817 out[JPEG_PIX_SZ*13] = range_limit((int) RIGHT_SHIFT(tmp22 - tmp2, 830 out[JPEG_PIX_SZ*5] = scale_output(tmp25 + tmp11);
818 DS_OUT)); 831 out[JPEG_PIX_SZ*10] = scale_output(tmp25 - tmp11);
819 out[JPEG_PIX_SZ*3] = range_limit((int) RIGHT_SHIFT(tmp23 + tmp3, 832 out[JPEG_PIX_SZ*6] = scale_output(tmp26 + tmp12);
820 DS_OUT)); 833 out[JPEG_PIX_SZ*9] = scale_output(tmp26 - tmp12);
821 out[JPEG_PIX_SZ*12] = range_limit((int) RIGHT_SHIFT(tmp23 - tmp3, 834 out[JPEG_PIX_SZ*7] = scale_output(tmp27 + tmp13);
822 DS_OUT)); 835 out[JPEG_PIX_SZ*8] = scale_output(tmp27 - tmp13);
823 out[JPEG_PIX_SZ*4] = range_limit((int) RIGHT_SHIFT(tmp24 + tmp10,
824 DS_OUT));
825 out[JPEG_PIX_SZ*11] = range_limit((int) RIGHT_SHIFT(tmp24 - tmp10,
826 DS_OUT));
827 out[JPEG_PIX_SZ*5] = range_limit((int) RIGHT_SHIFT(tmp25 + tmp11,
828 DS_OUT));
829 out[JPEG_PIX_SZ*10] = range_limit((int) RIGHT_SHIFT(tmp25 - tmp11,
830 DS_OUT));
831 out[JPEG_PIX_SZ*6] = range_limit((int) RIGHT_SHIFT(tmp26 + tmp12,
832 DS_OUT));
833 out[JPEG_PIX_SZ*9] = range_limit((int) RIGHT_SHIFT(tmp26 - tmp12,
834 DS_OUT));
835 out[JPEG_PIX_SZ*7] = range_limit((int) RIGHT_SHIFT(tmp27 + tmp13,
836 DS_OUT));
837 out[JPEG_PIX_SZ*8] = range_limit((int) RIGHT_SHIFT(tmp27 - tmp13,
838 DS_OUT));
839 } 836 }
840} 837}
841#endif 838#endif