Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Decode Intra_8x8 macroblock
  3.  * Copyright © <2010>, Intel Corporation.
  4.  *
  5.  * This program is licensed under the terms and conditions of the
  6.  * Eclipse Public License (EPL), version 1.0.  The full text of the EPL is at
  7.  * http://www.opensource.org/licenses/eclipse-1.0.php.
  8.  *
  9.  */
  10. // Kernel name: Intra_8x8.asm
  11. //
  12. // Decoding of Intra_8x8 macroblock
  13. //
  14. //  $Revision: 12 $
  15. //  $Date: 10/18/06 4:10p $
  16. //
  17.  
  18. // ----------------------------------------------------
  19. //  Main: Intra_8x8
  20. // ----------------------------------------------------
  21.  
  22. #define INTRA_8X8
  23.  
  24. .kernel Intra_8x8
  25. INTRA_8x8:
  26.  
  27. #ifdef _DEBUG
  28. // WA for FULSIM so we'll know which kernel is being debugged
  29. mov (1) acc0:ud 0x01aa55a5:ud
  30. #endif
  31.  
  32. #include "SetupForHWMC.asm"
  33.  
  34. #define         REG_INTRA_PRED_AVAIL    REG_INTRA_TEMP_4
  35. #define         INTRA_PRED_AVAIL                REG_INTRA_TEMP_4.4
  36.  
  37. // Offset where 8x8 predicted data blocks are stored
  38. #define PREDBLK0        0*GRFWIB
  39. #define PREDBLK1        4*GRFWIB
  40. #define PREDBLK2        8*GRFWIB
  41. #define PREDBLK3        12*GRFWIB
  42.  
  43. #ifdef SW_SCOREBOARD
  44.  
  45. // Update "E" flag with "F" flag information
  46.         mov (1) REG_INTRA_TEMP_0<1>:w   REG_INTRA_PRED_AVAIL_FLAG_WORD<0;1,0>:w         // Store original Intra_Pred_Avail_Flag
  47.         and.nz.f0.0 (1) NULLREG REG_MBAFF_PIC   MBAFF_PIC       // Is current MBAFF picture
  48.         and.z.f0.1 (1) NULLREG  REG_INTRA_PRED_AVAIL_FLAG       INTRA_PRED_LEFT_TH_AVAIL_FLAG   // Is "A" not available?
  49.         (f0.0) and.z.f0.0 (1) NULLREG   REG_FIELD_MACROBLOCK_FLAG       FIELD_MACROBLOCK_FLAG   // Is current frame MB?
  50.         (f0.1) and.nz.f0.1 (1) NULLREG  REG_INTRA_PRED_8X8_BLK2_AVAIL_FLAG      INTRA_PRED_8X8_BLK2_AVAIL_FLAG  // Is "F" flag set?
  51.         (f0.0.allv) or (1)      REG_INTRA_PRED_AVAIL_FLAG_WORD<1>:w     REG_INTRA_PRED_AVAIL_FLAG_WORD<0;1,0>:w INTRA_PRED_LEFT_BH_AVAIL_FLAG   // Set "E" to 1 if all conditions meet
  52.  
  53.    CALL(scoreboard_start_intra,1)
  54.         mov (1) REG_INTRA_PRED_AVAIL_FLAG_WORD<1>:w     REG_INTRA_TEMP_0<0;1,0>:w               // Restore original Intra_Pred_Avail_Flag
  55. #endif
  56.  
  57. #ifdef SW_SCOREBOARD    
  58.         wait    n0:ud           //      Now wait for scoreboard to response
  59. #endif
  60.  
  61. //
  62. //  Decode Y blocks
  63. //
  64. //      Load reference data from neighboring macroblocks
  65.    CALL(load_Intra_Ref_Y,1)
  66.  
  67.         mov     (1)     PERROR<1>:w     ERRBUF*GRFWIB:w                 // Pointer to macroblock error data
  68.         mov     (1)     PDECBUF_UD<1>:ud        0x00010001*PREDBUF*GRFWIB+0x00100000:ud // Pointers to predicted data
  69.         shr (2) REG_INTRA_PRED_AVAIL<1>:w       REG_INTRA_PRED_AVAIL_FLAG_BYTE<0;1,0>:ub        0x40:v
  70.        
  71. #if 1
  72.         mov (4) REF_LEFT_D(0,0)<1>      0:ud            // This is to make validation easier. Without it, DRAM mismatch occurs.
  73. #endif
  74.  
  75. //      Intra predict Intra_8x8 luma blocks
  76. //
  77. //      Sub-macroblock 0 *****************
  78.         mov     (16)    REF_TOP_W(0)<1> REG_INTRA_REF_TOP<16;16,1>:w            // Copy entire top reference data
  79.         and.nz.f0.0 (8) NULLREG         REG_INTRA_PRED_AVAIL_FLAG       INTRA_PRED_UP_LEFT_AVAIL_FLAG   // Is "D" available?
  80.         (-f0.0) mov (1) REF_TOP(0,-1)<1>        INTRA_REF_TOP(0)REGION(1,0)             // p[-1,-1] = p[0,-1]
  81.  
  82.         mov     (8)             REF_LEFT(0,2)<1>        INTRA_REF_LEFT(0)       // Left reference data, (leave 2 for reference filtering)
  83.         (-f0.0) mov (1)         REF_LEFT(0,1)<1>        INTRA_REF_LEFT(0)REGION(1,0)                    // p[-1,-1]=p[-1,0]
  84.         (f0.0.any2h)  mov (2)           REF_LEFT(0,0)<1>        INTRA_REF_TOP(0,-1)REGION(1,0)  // p'[-1,y] (y=0,1) = p[-1,-1]
  85.         and.nz.f0.1 (1) NULLREG         REG_INTRA_PRED_AVAIL_FLAG       INTRA_PRED_UP_AVAIL_FLAG        // Is "B" available?
  86.         (f0.1) mov      (1)             REF_LEFT(0,0)<1>        INTRA_REF_TOP(0,0)REGION(1,0)   // p[0,-1] for left filtering
  87.         and.nz.f0.1 (1) NULLREG         REG_INTRA_PRED_AVAIL_FLAG       INTRA_PRED_LEFT_TH_AVAIL_FLAG   // Is "A" available?
  88.         (-f0.1) mov     (1)             REF_LEFT(0,2)<1>        INTRA_REF_TOP(0,-1)REGION(1,0)  // p'[-1,2] = p[-1,-1]
  89.  
  90.         and     (1)             PRED_MODE<1>:w  INTRA_PRED_MODE(0)REGION(1,0)   0x0F:w          // Intra pred mode for current block
  91.         mov (1)         INTRA_PRED_AVAIL<1>:w   REG_INTRA_PRED_AVAIL<0;1,0>:w           // Top/Left neighbor available flags
  92.         CALL(intra_Pred_8x8_Y,1)
  93.     add (1)             PERROR<1>:w     PERROR<0;1,0>:w 0x0080:w        // Pointers to next error block
  94.  
  95. //      Sub-macroblock 1 *****************
  96.         mov     (16)    REF_TOP0(0)<1>  INTRA_REF_TOP(0,4)      // Top reference data
  97.         and.nz.f0.1 (8) NULLREG         REG_INTRA_PRED_AVAIL_FLAG       INTRA_PRED_UP_RIGHT_AVAIL_FLAG  // Is "C" available?
  98.         (f0.1.any8h)  mov (8)   REF_TOP(0,8)<1> INTRA_REF_TOP(0,16)<8;8,1>              // Take data from "C"
  99.         (-f0.1.any8h) mov (8)   REF_TOP(0,8)<1> INTRA_REF_TOP(0,15)REGION(1,0)  // Repeat last pixel from "B"
  100.  
  101.         mov     (4)             REF_LEFT(0,2)<1>        DEC_Y(0,14)<16;1,0>             // Left reference data (top half) (leave 2 for reference filtering)
  102.         mov     (4)             REF_LEFT(0,6)<1>        DEC_Y(2,14)<16;1,0>             // Left reference data (bottom half)
  103.         mov     (2)             REF_LEFT(0,0)<1>        INTRA_REF_TOP(0,7)REGION(1,0)           // p'[-1,y] (y=0,1) = p[-1,-1]
  104.         and.nz.f0.1 (1) NULLREG         REG_INTRA_PRED_AVAIL_FLAG       INTRA_PRED_UP_AVAIL_FLAG        // Is "B" available?
  105.         (f0.1)  mov     (1)             REF_LEFT(0,0)<1>        INTRA_REF_TOP(0,8)REGION(1,0)   // p[-1,-1] for left filtering
  106.         (-f0.1) mov     (1)             REF_LEFT(0,1)<1>        DEC_Y(0,14)REGION(1,0)  // p[-1,-1] = p[-1,0]
  107.  
  108.         shr     (1)             PRED_MODE<1>:w  INTRA_PRED_MODE(0)REGION(1,0)   4:w             // Intra pred mode for current block
  109.         add     (2)             PPREDBUF_Y<1>:w PPREDBUF_Y<2;2,1>:w     4*GRFWIB:w                      // Pointer to predicted sub-macroblock 1
  110.         or (1)          INTRA_PRED_AVAIL<1>:w   REG_INTRA_PRED_AVAIL<0;1,0>:w   1:w             // Left neighbor is available
  111.         CALL(intra_Pred_8x8_Y,1)
  112.     add (1)             PERROR<1>:w     PERROR<0;1,0>:w 0x0080:w        // Pointers to next error block
  113.  
  114. //      Pack constructed data from word-aligned to byte-aligned format and interlace Y0 and Y1(every two Y rows)
  115. //      to speed up save_8x8_Y module later
  116. //      PPREDBUF_Y now points to sub-macroblock Y1
  117.         mov (32)        r[PPREDBUF_Y,-PREDBLK1]<1>:ub           DEC_Y(0)<32;16,2> {Compr}       // First 4 Y0 rows
  118.         mov (32)        r[PPREDBUF_Y,0-PREDBLK1+32]<1>:ub       DEC_Y(4)<32;16,2> {Compr}       // First 4 Y1 rows
  119.         mov (32)        r[PPREDBUF_Y,0-PREDBLK1+64]<1>:ub       DEC_Y(2)<32;16,2> {Compr}       // Second 4 Y0 rows
  120.         mov (32)        r[PPREDBUF_Y,0-PREDBLK1+96]<1>:ub       DEC_Y(6)<32;16,2> {Compr}       // Second 4 Y1 rows
  121.  
  122. //      Sub-macroblock 2 *****************
  123. //      Intra_8x8 special available flag handling
  124.         and.nz.f0.0 (1) NULLREG REG_MBAFF_PIC   MBAFF_PIC       // Is current MBAFF picture
  125.         and.z.f0.1 (1) NULLREG  REG_INTRA_PRED_AVAIL_FLAG       INTRA_PRED_LEFT_TH_AVAIL_FLAG   // Is "A" not available?
  126.         (f0.0) and.z.f0.0 (1) NULLREG   REG_FIELD_MACROBLOCK_FLAG       FIELD_MACROBLOCK_FLAG   // Is current frame MB?
  127.         (f0.1) and.nz.f0.1 (1) NULLREG  REG_INTRA_PRED_8X8_BLK2_AVAIL_FLAG      INTRA_PRED_8X8_BLK2_AVAIL_FLAG  // Is special intra_8x8 available flag set?
  128.         (f0.0.allv) mov (1)     REF_TOP(0,-1)<1>        INTRA_REF_LEFT0(0,31)REGION(1,0)        // Top-left reference data
  129.         (f0.0.allv) jmpi (1)    INTRA_8x8_BLK2
  130. //      Done intra_8x8 special available flag handling
  131.  
  132.         and.nz.f0.0 (8) NULLREG REG_INTRA_PRED_AVAIL_FLAG       INTRA_PRED_LEFT_TH_AVAIL_FLAG   // Is top-half "A" available?
  133.         (f0.0.any4h) mov (4)    REF_TOP0(0)<1>          INTRA_REF_LEFT0(0,28)REGION(4,1)        // Top-left reference data
  134.         (-f0.0) mov (1) REF_TOP(0,-1)<1>        DEC_Y(2,24)REGION(1,0)  // p[-1,-1] = p[0,-1]
  135. INTRA_8x8_BLK2:
  136.         mov     (8)             REF_TOP(0)<1>           DEC_Y(2,24)REGION(8,1)          // Top reference data
  137.         mov     (8)             REF_TOP(0,8)<1>         DEC_Y(3,24)REGION(8,1)          // Top reference data
  138.  
  139.         mov     (8)             REF_LEFT(0,2)<1>        INTRA_REF_LEFT(1)                       // Left reference data,  (leave 2 for reference filtering)
  140.         mov (1)         REF_LEFT(0,0)<1>        DEC_Y(2,24)REGION(1,0)          // p'[-1,0] = p[0,-1] since "B" is always available
  141.         (f0.0) mov      (1)     REF_LEFT(0,1)<1>        INTRA_REF_LEFT(0,28)REGION(1,0) // p[-1,1] = p[-1,-1] if top-half "A" available
  142.         (-f0.0) mov (1) REF_LEFT(0,1)<1>        INTRA_REF_LEFT(1)REGION(1,0)    // p[-1,1] = p[-1,0]
  143.         and.nz.f0.1 (1) NULLREG REG_INTRA_PRED_AVAIL_FLAG       INTRA_PRED_LEFT_BH_AVAIL_FLAG   // Is bottom-half "A" available?
  144.         (-f0.1) mov     (1)     REF_LEFT(0,2)<1>        INTRA_REF_LEFT(0,28)REGION(1,0) // p'[-1,2] = p[-1,-1]
  145.  
  146.         and     (1)             PRED_MODE<1>:w                  INTRA_PRED_MODE(0,1)REGION(1,0) 0x0F:// Intra pred mode for current block
  147.         or (1)          INTRA_PRED_AVAIL<1>:w   REG_INTRA_PRED_AVAIL.1<0;1,0>:w 2:w             // Top neighbor is available
  148.         CALL(intra_Pred_8x8_Y,1)
  149.     add (1)             PERROR<1>:w     PERROR<0;1,0>:w 0x0080:w        // Pointers to next error block
  150.  
  151. //      Sub-macroblock 3 *****************
  152.         mov     (4)             REF_TOP0(0)<1>          DEC_Y(2,28)REGION(4,1)          // Top-left reference data
  153.         mov     (8)             REF_TOP(0)<1>           DEC_Y(3,24)REGION(8,1)          // Top reference data
  154.         mov     (16)    REF_TOP(0,8)<1>         DEC_Y(3,31)REGION(1,0)          // Top-right reference data
  155.  
  156.         mov (4)         REF_LEFT(0,2)<1>        DEC_Y(4,14)<16;1,0>             // Left reference data (top half) (leave 2 for reference filtering)
  157.         mov (4)         REF_LEFT(0,6)<1>        DEC_Y(6,14)<16;1,0>             // Left reference data (bottom half)
  158.         mov (1)         REF_LEFT(0,0)<1>        DEC_Y(3,24)REGION(1,0)  // p[-1,0] = p[0,-1]
  159.         mov (1)         REF_LEFT(0,1)<1>        DEC_Y(2,31)REGION(1,0)  // p[-1,1] = p[-1,-1]
  160.  
  161.         shr     (1)             PRED_MODE<1>:w  INTRA_PRED_MODE(0,1)REGION(1,0) 4:w             // Intra pred mode for current block
  162.         add     (2)             PPREDBUF_Y<1>:w PPREDBUF_Y<2;2,1>:w     4*GRFWIB:w      // Pointer to predicted sub-macroblock 3
  163.         or (1)          INTRA_PRED_AVAIL<1>:w   REG_INTRA_PRED_AVAIL<0;1,0>:w   3:w             // Top and Left neighbor are available
  164.         CALL(intra_Pred_8x8_Y,1)
  165.  
  166. //      Pack constructed data from word-aligned to byte-aligned format
  167. //      to speed up save_8x8_Y module later
  168. //      PPREDBUF_Y now points to sub-macroblock Y1
  169.         mov (32)        r[PPREDBUF_Y,-PREDBLK1]<1>:ub           DEC_Y(4)<32;16,2> {Compr}       // First 4 Y2 rows
  170.         mov (32)        r[PPREDBUF_Y,0-PREDBLK1+32]<1>:ub       DEC_Y(8)<32;16,2> {Compr}       // First 4 Y3 rows
  171.         mov (32)        r[PPREDBUF_Y,0-PREDBLK1+64]<1>:ub       DEC_Y(6)<32;16,2> {Compr}       // Second 4 Y2 rows
  172.         mov (32)        r[PPREDBUF_Y,0-PREDBLK1+96]<1>:ub       DEC_Y(10)<32;16,2> {Compr}      // Second 4 Y3 rows
  173.  
  174. //      All 4 sub-macroblock (containing 4 intra_8x8 blocks) have be constructed
  175. //      Save constructed Y picture
  176.         CALL(save_8x8_Y,1)              // Save Intra_8x8 predicted luma data.
  177. //
  178. //  Decode U/V blocks
  179. //
  180. //      Note: The decoding for chroma blocks will be the same for all intra prediction mode
  181. //
  182.         CALL(decode_Chroma_Intra,1)
  183.  
  184. #ifdef SW_SCOREBOARD
  185.     #include "scoreboard_update.asm"
  186. #endif
  187.  
  188. // Terminate the thread
  189. //
  190.     #include "EndIntraThread.asm"
  191.  
  192. // End of Intra_8x8
  193.