[mupen64plus-rsp-hle] 138/167: Fix JPEG decoding for Bottom of the 9th

Sven Eckelmann ecsv-guest at moszumanska.debian.org
Thu Nov 26 06:02:34 UTC 2015


This is an automated email from the git hooks/post-receive script.

ecsv-guest pushed a commit to branch armhf_test
in repository mupen64plus-rsp-hle.

commit 66d0d70aa94560f768aca8e02a5ea075b1a42a72
Author: Sven Eckelmann <sven at narfation.org>
Date:   Fri Dec 13 18:22:04 2013 +0100

    Fix JPEG decoding for Bottom of the 9th
---
 debian/changelog                                |   7 ++
 debian/patches/jpeg_dispatching_278b0.patch     |  19 +++
 debian/patches/jpeg_memory_alloc_reduce.patch   |  35 ++++++
 debian/patches/jpeg_memory_alloc_refactor.patch | 151 ++++++++++++++++++++++++
 debian/patches/jpeg_memory_alloc_stack.patch    |  39 ++++++
 debian/patches/series                           |   4 +
 6 files changed, 255 insertions(+)

diff --git a/debian/changelog b/debian/changelog
index bcb80b8..a6c2b5f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,6 +1,13 @@
 mupen64plus-rsp-hle (2.0-2) UNRELEASED; urgency=low
 
   * Upgraded to policy 3.9.5, no changes required
+  * debian/patches:
+    - Add jpeg_dispatching_278b0.patch, Bottom of the 9th jpeg task dispatching
+    - Add jpeg_memory_alloc_reduce.patch, macroblock memory allocation was
+      bigger than needed
+    - Add jpeg_memory_alloc_stack.patch, Refactor standard macroblock decoder
+    - Add jpeg_memory_alloc_refactor.patch, Avoid dynamic memory allocation for
+      macroblocks
 
  -- Sven Eckelmann <sven at narfation.org>  Sat, 16 Nov 2013 18:12:30 +0100
 
diff --git a/debian/patches/jpeg_dispatching_278b0.patch b/debian/patches/jpeg_dispatching_278b0.patch
new file mode 100644
index 0000000..7e53747
--- /dev/null
+++ b/debian/patches/jpeg_dispatching_278b0.patch
@@ -0,0 +1,19 @@
+Description: Bottom of the 9th jpeg task dispatching
+Author: Bobby Smiles <bobby.smiles32 at gmail.com>
+
+---
+diff --git a/src/main.c b/src/main.c
+index ff6525aefab5587ab3f87c7a82aea0b119c6e641..396321f77680acc9126fa7d17c09e823ce9c67c5 100644
+--- a/src/main.c
++++ b/src/main.c
+@@ -226,7 +226,9 @@ static void normal_task_dispatching()
+         case 0x2caa6: jpeg_decode_PS(); return;
+ 
+         /* JPEG: found in Ogre Battle, Bottom of the 9th */
+-        case 0x130de: jpeg_decode_OB(); return;
++        case 0x130de:
++        case 0x278b0:
++            jpeg_decode_OB(); return;
+     }
+ 
+     handle_unknown_task(sum);
diff --git a/debian/patches/jpeg_memory_alloc_reduce.patch b/debian/patches/jpeg_memory_alloc_reduce.patch
new file mode 100644
index 0000000..67de863
--- /dev/null
+++ b/debian/patches/jpeg_memory_alloc_reduce.patch
@@ -0,0 +1,35 @@
+Description: macroblock memory allocation was bigger than needed
+Author: Bobby Smiles <bobby.smiles32 at gmail.com>
+
+---
+diff --git a/src/jpeg.c b/src/jpeg.c
+index 28fcc8bdd9223ed545b56023742c85b899b5c7bc..2083220bff8b451096e2158d9221a13d8c177d01 100755
+--- a/src/jpeg.c
++++ b/src/jpeg.c
+@@ -250,7 +250,7 @@ static void jpeg_decode_std(const char * const version, const std_macroblock_dec
+     }
+     
+     subblock_count = mode + 4;
+-    macroblock_size = 2*subblock_count*SUBBLOCK_SIZE;
++    macroblock_size = subblock_count*SUBBLOCK_SIZE;
+ 
+     rdram_read_many_u16((uint16_t*)qtables[0], qtableY_ptr, SUBBLOCK_SIZE);
+     rdram_read_many_u16((uint16_t*)qtables[1], qtableU_ptr, SUBBLOCK_SIZE);
+@@ -265,7 +265,7 @@ static void jpeg_decode_std(const char * const version, const std_macroblock_dec
+ 
+     for (mb = 0; mb < macroblock_count; ++mb)
+     {
+-        rdram_read_many_u16((uint16_t*)macroblock, address, macroblock_size >> 1);
++        rdram_read_many_u16((uint16_t*)macroblock, address, macroblock_size);
+         decode_mb(macroblock, subblock_count, (const int16_t (*)[SUBBLOCK_SIZE])qtables);
+ 
+         if (mode == 0)
+@@ -277,7 +277,7 @@ static void jpeg_decode_std(const char * const version, const std_macroblock_dec
+             EmitTilesMode2(emit_line, macroblock, address);
+         }
+ 
+-        address += macroblock_size;
++        address += 2*macroblock_size;
+     }
+     free(macroblock);
+ }
diff --git a/debian/patches/jpeg_memory_alloc_refactor.patch b/debian/patches/jpeg_memory_alloc_refactor.patch
new file mode 100644
index 0000000..ac1d8dc
--- /dev/null
+++ b/debian/patches/jpeg_memory_alloc_refactor.patch
@@ -0,0 +1,151 @@
+Description: Refactor standard macroblock decoder
+Author: Bobby Smiles <bobby.smiles32 at gmail.com>
+
+---
+diff --git a/src/jpeg.c b/src/jpeg.c
+index e1a3fefee96ac54dd13534c16a80f2c5fbc100f8..3db2e8969d0fef64e7e85884bc8df8eb04a2f6d4 100755
+--- a/src/jpeg.c
++++ b/src/jpeg.c
+@@ -33,7 +33,7 @@
+ #define SUBBLOCK_SIZE 64
+ 
+ typedef void (*tile_line_emitter_t)(const int16_t *y, const int16_t *u, uint32_t address);
+-typedef void (*std_macroblock_decoder_t)(int16_t *macroblock, unsigned int subblock_count, const int16_t qtables[3][SUBBLOCK_SIZE]);
++typedef void (*subblock_transform_t)(int16_t* dst, const int16_t* src);
+ 
+ /* rdram operations */
+ // FIXME: these functions deserve their own module
+@@ -43,7 +43,10 @@ static uint32_t rdram_read_u32(uint32_t address);
+ static void rdram_write_many_u32(const uint32_t *src, uint32_t address, unsigned int count);
+ 
+ /* standard jpeg ucode decoder */
+-static void jpeg_decode_std(const char * const version, const std_macroblock_decoder_t decode_mb, const tile_line_emitter_t emit_line);
++static void jpeg_decode_std(const char * const version,
++        const subblock_transform_t transform_luma,
++        const subblock_transform_t transform_chroma,
++        const tile_line_emitter_t emit_line);
+ 
+ /* helper functions */
+ static uint8_t clamp_u8(int16_t x);
+@@ -60,9 +63,11 @@ static void EmitYUVTileLine(const int16_t *y, const int16_t *u, uint32_t address
+ static void EmitRGBATileLine(const int16_t *y, const int16_t *u, uint32_t address);
+ 
+ /* macroblocks operations */
+-static void DecodeMacroblock1(int16_t *macroblock, int32_t *y_dc, int32_t *u_dc, int32_t *v_dc, const int16_t *qtable);
+-static void DecodeMacroblock2(int16_t *macroblock, unsigned int subblock_count, const int16_t qtables[3][SUBBLOCK_SIZE]);
+-static void DecodeMacroblock3(int16_t *macroblock, unsigned int subblock_count, const int16_t qtables[3][SUBBLOCK_SIZE]);
++static void decode_macroblock_ob(int16_t *macroblock, int32_t *y_dc, int32_t *u_dc, int32_t *v_dc, const int16_t *qtable);
++static void decode_macroblock_std(
++        const subblock_transform_t transform_luma,
++        const subblock_transform_t transform_chroma,
++        int16_t *macroblock, unsigned int subblock_count, const int16_t qtables[3][SUBBLOCK_SIZE]);
+ static void EmitTilesMode0(const tile_line_emitter_t emit_line, const int16_t *macroblock, uint32_t address);
+ static void EmitTilesMode2(const tile_line_emitter_t emit_line, const int16_t *macroblock, uint32_t address);
+ 
+@@ -145,7 +150,7 @@ static const float IDCT_K[10] =
+  **************************************************************************/
+ void jpeg_decode_PS0()
+ {
+-    jpeg_decode_std("PS0", DecodeMacroblock3, EmitYUVTileLine);
++    jpeg_decode_std("PS0", RescaleYSubBlock, RescaleUVSubBlock, EmitYUVTileLine);
+ }
+ 
+ /***************************************************************************
+@@ -154,7 +159,7 @@ void jpeg_decode_PS0()
+  **************************************************************************/
+ void jpeg_decode_PS()
+ {
+-    jpeg_decode_std("PS", DecodeMacroblock2, EmitRGBATileLine);
++    jpeg_decode_std("PS", NULL, NULL, EmitRGBATileLine);
+ }
+ 
+ /***************************************************************************
+@@ -197,7 +202,7 @@ void jpeg_decode_OB()
+         int16_t macroblock[6*SUBBLOCK_SIZE];
+ 
+         rdram_read_many_u16((uint16_t*)macroblock, address, 6*SUBBLOCK_SIZE);
+-        DecodeMacroblock1(macroblock, &y_dc, &u_dc, &v_dc, (qscale != 0) ? qtable : NULL);
++        decode_macroblock_ob(macroblock, &y_dc, &u_dc, &v_dc, (qscale != 0) ? qtable : NULL);
+         EmitTilesMode2(EmitYUVTileLine, macroblock, address);
+ 
+         address += (2*6*SUBBLOCK_SIZE);
+@@ -206,7 +211,10 @@ void jpeg_decode_OB()
+ 
+ 
+ /* local functions */
+-static void jpeg_decode_std(const char * const version, const std_macroblock_decoder_t decode_mb, const tile_line_emitter_t emit_line)
++static void jpeg_decode_std(const char * const version,
++        const subblock_transform_t transform_luma,
++        const subblock_transform_t transform_chroma,
++        const tile_line_emitter_t emit_line)
+ {
+     int16_t qtables[3][SUBBLOCK_SIZE];
+     unsigned int mb;
+@@ -259,7 +267,8 @@ static void jpeg_decode_std(const char * const version, const std_macroblock_dec
+     for (mb = 0; mb < macroblock_count; ++mb)
+     {
+         rdram_read_many_u16((uint16_t*)macroblock, address, macroblock_size);
+-        decode_mb(macroblock, subblock_count, (const int16_t (*)[SUBBLOCK_SIZE])qtables);
++        decode_macroblock_std(transform_luma, transform_chroma,
++                macroblock, subblock_count, (const int16_t (*)[SUBBLOCK_SIZE])qtables);
+ 
+         if (mode == 0)
+         {
+@@ -399,7 +408,7 @@ static void EmitTilesMode2(const tile_line_emitter_t emit_line, const int16_t *m
+     }
+ }
+ 
+-static void DecodeMacroblock1(int16_t *macroblock, int32_t *y_dc, int32_t *u_dc, int32_t *v_dc, const int16_t *qtable)
++static void decode_macroblock_ob(int16_t *macroblock, int32_t *y_dc, int32_t *u_dc, int32_t *v_dc, const int16_t *qtable)
+ {
+     int sb;
+ 
+@@ -426,28 +435,10 @@ static void DecodeMacroblock1(int16_t *macroblock, int32_t *y_dc, int32_t *u_dc,
+     }
+ }
+ 
+-static void DecodeMacroblock2(int16_t *macroblock, unsigned int subblock_count, const int16_t qtables[3][SUBBLOCK_SIZE])
+-{
+-    unsigned int sb;
+-    unsigned int q = 0;
+-
+-    for (sb = 0; sb < subblock_count; ++sb)
+-    {
+-        int16_t tmp_sb[SUBBLOCK_SIZE];
+-        const int isChromaSubBlock = (subblock_count - sb <= 2);
+-
+-        if (isChromaSubBlock) { ++q; }
+-
+-        MultSubBlocks(macroblock, macroblock, qtables[q], 4);
+-        ZigZagSubBlock(tmp_sb, macroblock);
+-        InverseDCTSubBlock(macroblock, tmp_sb);
+-
+-        macroblock += SUBBLOCK_SIZE;
+-    }
+-
+-}
+-
+-static void DecodeMacroblock3(int16_t *macroblock, unsigned int subblock_count, const int16_t qtables[3][SUBBLOCK_SIZE])
++static void decode_macroblock_std(
++        const subblock_transform_t transform_luma,
++        const subblock_transform_t transform_chroma,
++        int16_t *macroblock, unsigned int subblock_count, const int16_t qtables[3][SUBBLOCK_SIZE])
+ {
+     unsigned int sb;
+     unsigned int q = 0;
+@@ -465,11 +456,13 @@ static void DecodeMacroblock3(int16_t *macroblock, unsigned int subblock_count,
+ 
+         if (isChromaSubBlock)
+         {
+-            RescaleUVSubBlock(macroblock, macroblock);
++            if (transform_chroma != NULL)
++                transform_chroma(macroblock, macroblock);
+         }
+         else
+         {
+-            RescaleYSubBlock(macroblock, macroblock);
++            if (transform_luma != NULL)
++                transform_luma(macroblock, macroblock);
+         }
+ 
+         macroblock += SUBBLOCK_SIZE;
diff --git a/debian/patches/jpeg_memory_alloc_stack.patch b/debian/patches/jpeg_memory_alloc_stack.patch
new file mode 100644
index 0000000..524e63c
--- /dev/null
+++ b/debian/patches/jpeg_memory_alloc_stack.patch
@@ -0,0 +1,39 @@
+Description: Avoid dynamic memory allocation for macroblocks
+Author: Bobby Smiles <bobby.smiles32 at gmail.com>
+
+---
+diff --git a/src/jpeg.c b/src/jpeg.c
+index 2083220bff8b451096e2158d9221a13d8c177d01..e1a3fefee96ac54dd13534c16a80f2c5fbc100f8 100755
+--- a/src/jpeg.c
++++ b/src/jpeg.c
+@@ -218,7 +218,7 @@ static void jpeg_decode_std(const char * const version, const std_macroblock_dec
+     uint32_t qtableV_ptr;
+     unsigned int subblock_count;
+     unsigned int macroblock_size;
+-    int16_t *macroblock;
++    int16_t macroblock[6*SUBBLOCK_SIZE]; /* macroblock contains at most 6 subblobcks */
+     const OSTask_t * const task = get_task();
+ 
+     if (task->flags & 0x1)
+@@ -256,13 +256,6 @@ static void jpeg_decode_std(const char * const version, const std_macroblock_dec
+     rdram_read_many_u16((uint16_t*)qtables[1], qtableU_ptr, SUBBLOCK_SIZE);
+     rdram_read_many_u16((uint16_t*)qtables[2], qtableV_ptr, SUBBLOCK_SIZE);
+ 
+-    macroblock = malloc(sizeof(*macroblock) * macroblock_size);
+-    if (!macroblock)
+-    {
+-        DebugMessage(M64MSG_WARNING, "jpeg_decode_%s: could not allocate macroblock", version);
+-        return;
+-    }
+-
+     for (mb = 0; mb < macroblock_count; ++mb)
+     {
+         rdram_read_many_u16((uint16_t*)macroblock, address, macroblock_size);
+@@ -279,7 +272,6 @@ static void jpeg_decode_std(const char * const version, const std_macroblock_dec
+ 
+         address += 2*macroblock_size;
+     }
+-    free(macroblock);
+ }
+ 
+ static uint8_t clamp_u8(int16_t x)
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..f9aa81a
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,4 @@
+jpeg_dispatching_278b0.patch
+jpeg_memory_alloc_reduce.patch
+jpeg_memory_alloc_stack.patch
+jpeg_memory_alloc_refactor.patch

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/mupen64plus-rsp-hle.git



More information about the Pkg-games-commits mailing list