Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Set dependency control HW scoreboard kernel for MBAFF picture
  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: SetHWScoreboard_MBAFF.asm
  11. //
  12. // Set dependency control HW scoreboard kernel for MBAFF picture
  13. //
  14.  
  15. // ----------------------------------------------------
  16. //  Main: SetHWScoreboard_MBAFF
  17. // ----------------------------------------------------
  18.  
  19. .kernel SetHWScoreboard_MBAFF
  20.  
  21. SETHWSCOREBOARD_MBAFF:
  22.  
  23. #ifdef _DEBUG
  24. // WA for FULSIM so we'll know which kernel is being debugged
  25. mov (1) acc0:ud 0xf1aa55a5:ud
  26. #endif
  27.  
  28. #include "header.inc"
  29. #include "SetHWScoreboard_header.inc"
  30.  
  31. //
  32. //  Now, begin source code....
  33. //
  34.  
  35. .code
  36.  
  37. //      Separate the TotalMB so TotalMB will be multiple of 8
  38. //      and RemainderMB will hold the TotalMB%8
  39. //
  40.         and.z.f0.1 (1)  RemainderMB<1>:uw       TotalMB<0;1,0>:uw       0x0007:uw       // number of %8 commands
  41.         and.z.f0.0 (1)  TotalMB<1>:uw           TotalMB<0;1,0>:uw       0xfff8:uw       // Number of 8-command blocks
  42.  
  43. //      Initialize common DAP read header
  44. //
  45.         mov (8) MRF_READ_HEADER_SRC<1>:ud       r0.0<8;8,1>:ud
  46.         shl (1) MRF_READ_HEADER_SRC.2<1>:ud     StartingMB<0;1,0>:uw    6:uw    // Byte-aligned offset being read
  47.  
  48. //      Initialize Inter DAP write header
  49.         mov (8) MRF_INTER_WRITE_HEADER<1>:ud    r0.0<8;8,1>:ud
  50.  
  51.         (f0.0) jmpi (1) SetHWScoreboard_MBAFF_Remainder                                         // Jump if TatalMB < 8
  52.  
  53. //------------------------------------------------------------------------
  54. //      Command buffer parsing loop
  55. //      Each loop will handle 8 commands
  56. //------------------------------------------------------------------------
  57. //
  58. SetHWScoreboard_MBAFF_Loop:
  59. //      Load block 0 (Commands 0/1)
  60.         mov (8) MRF_READ_HEADER0.0<1>:ud        MRF_READ_HEADER_SRC.0<8;8,1>:ud
  61.         send (16)       CMD_BUFFER_W(0)<1>      MRF_READ_HEADER0        null:uw DAPREAD RESP_LEN(4)+OWBRMSGDSC_SC+OWORD_8+BI_CMD_BUFFER
  62.  
  63. //      Load block 1  (Commands 2/3)
  64.         mov (8) MRF_READ_HEADER1.0<1>:ud        MRF_READ_HEADER_SRC.0<8;8,1>:ud
  65.         add     (1)     MRF_READ_HEADER1.2<1>:ud        MRF_READ_HEADER_SRC.2<0;1,0>:ud         128:ud          // Point to next 2-command block
  66.         send (16)       CMD_BUFFER_W(4)<1>      MRF_READ_HEADER1        null:uw DAPREAD RESP_LEN(4)+OWBRMSGDSC_SC+OWORD_8+BI_CMD_BUFFER
  67.  
  68. //      Load block 2  (Commands 4/5)
  69.         mov (8) MRF_READ_HEADER2.0<1>:ud        MRF_READ_HEADER_SRC.0<8;8,1>:ud
  70.         add     (1)     MRF_READ_HEADER2.2<1>:ud        MRF_READ_HEADER_SRC.2<0;1,0>:ud         256:ud          // Point to next 2-command block
  71.         send (16)       CMD_BUFFER_W(8)<1>      MRF_READ_HEADER2        null:uw DAPREAD RESP_LEN(4)+OWBRMSGDSC_SC+OWORD_8+BI_CMD_BUFFER
  72.  
  73. //      Load block 3  (Commands 6/7)
  74.         mov (8) MRF_READ_HEADER3.0<1>:ud        MRF_READ_HEADER_SRC.0<8;8,1>:ud
  75.         add     (1)     MRF_READ_HEADER3.2<1>:ud        MRF_READ_HEADER_SRC.2<0;1,0>:ud         384:ud          // Point to next 2-command block
  76.         send (16)       CMD_BUFFER_W(12)<1>     MRF_READ_HEADER3        null:uw DAPREAD RESP_LEN(4)+OWBRMSGDSC_SC+OWORD_8+BI_CMD_BUFFER
  77.  
  78. //      Start parsing commands
  79.    $for(0; <16; 2) {
  80. //      Adjust MB Y origin for field MBs
  81. //
  82.         mov (2) TEMP_FD_X_W<1>:uw       CMD_BUFFER_B(%1,20)<2;2,1>                                      // Initialize temp (X,Y) location
  83.         and.nz.f0.1 (8) NULLREG CMD_BUFFER_D(%1,4)<0;1,0>       IS_BOT_FD:ud            // Is it a "Bottom Field MB"?
  84.         and.nz.f0.0 (8) NULLREG CMD_BUFFER_D(%1,4)<0;1,0>       IS_FIELD_MB:ud          // Is it a "Field MB"?
  85.         mul (8) acc0<1>:w       CMD_BUFFER_B(%1,21)<0;1,0>      2:w
  86.         (-f0.1) mov (1) TEMP_FD_Y_W<1>:w        acc0<0;1,0>:w
  87.         (f0.1) add (1)  TEMP_FD_Y_W<1>:w        acc0<0;1,0>:w   1:w
  88.         (-f0.0) mov (1) TEMP_FD_Y_W<1>:w        CMD_BUFFER_B(%1,21)<0;1,0>                      // Discard field MB Y origin handling
  89.  
  90.         and.nz.f0.0 (8) NULLREG CMD_BUFFER_D(%1,4)<0;1,0>       IS_INTRA_MB:ud          // Is it an "Intra" MB?
  91.         and.nz.f0.1     (8)     NULLREG TEMP_FD_Y_W<0;1,0>:uw   BIT0                                    // Is it "Bottom MB"?
  92.         or (1)  CMD_BUFFER_D(%1,2)<1>   CMD_BUFFER_D(%1,2)<0;1,0>       BIT21           // Set "Use Scoreboard"
  93.         mov (2) CMD_BUFFER_W(%1,2)<1>   TEMP_FD_X_W<2;2,1>:uw                                   // Set scoreboard (X,Y) for inter MB
  94.         (f0.0) jmpi (1) SET_SB_MBAFF_INTRA_%1                                                                   // Jump if intra MB.
  95.  
  96. //      Inter Macroblock
  97. //      Output MEDIA_OBJECT command in raster scan order
  98.         mul (16) acc0<1>:uw     TEMP_FD_Y_W<0;1,0>:uw   PicWidthMB<0;1,0>:uw            // MB offset = Y*W
  99.         add (16) acc0<1>:uw     acc0<8;8,1>:uw                  TEMP_FD_X_W<0;1,0>:uw           // MB offset = Y*W+X
  100.         shl (1) MRF_INTER_WRITE_HEADER.2<1>:ud  acc0.2<0;1,0>:uw        6:uw            // Byte-aligned MB offset
  101.         mov (16)        MRF_INTER_WRITE_DATA0<1>:ud     CMD_BUFFER_D(%1)<8;8,1> {Compr} // Copy entire command to inter buffer
  102.         mov     (16)    CMD_BUFFER_D(%1)<1>             0:ud    {Compr}                                         // Clear original command
  103.         send (16)       NULLREGW        MRF_INTER_WRITE_HEADER  null:uw DAPWRITE        MSG_LEN(2)+OWBWMSGDSC+OWORD_4+BI_CMD_BUFFER
  104.         jmpi (1)        NEXT_MB_MBAFF_%1                        // Done for inter MB. Move to next MB.
  105.  
  106. SET_SB_MBAFF_INTRA_%1:
  107. //      Intra MB
  108. //
  109.         and.nz.f0.0 (8) NULLREG CMD_BUFFER_D(%1,4)<0;1,0>       IS_FIELD_MB:ud          // Is it an "Field" MB?
  110.         (f0.1) sel (2)  MB_MASK_D<1>:ud         BOT_FD_MASK1_D<2;2,1>:ud        TOP_FD_MASK1_D<2;2,1>:ud        // Assume field MB
  111.         mov (1) TEMP_INTRA_FLAG_W<1>:uw         CMD_BUFFER_W(%1,14)<0;1,0>                      // Don't want to alter original in-line data
  112.         (f0.0) jmpi (1) SET_SB_MBAFF_%1                                 // Jump if it's really field MB
  113.  
  114. //      Frame MB
  115. //
  116. //      Derive E'
  117.         and.nz.f0.0     (8)     NULLREG CMD_BUFFER_W(%1,14)<0;1,0>      E_FLAG          // Is "E" = 1
  118.         (f0.1) sel (2)  MB_MASK_D<1>:ud         BOT_FM_MASK1_D<2;2,1>:ud        TOP_FM_MASK1_D<2;2,1>:ud
  119.         and.z.f0.1 (8)  NULLREG CMD_BUFFER_W(%1,14)<0;1,0>      A_FLAG          // "A" = 0?
  120.         (f0.0) jmpi (1) SET_SB_MBAFF_%1                         // If "E" flag = 1, skip the rest of derivation
  121.         (f0.1) and.nz.f0.1 (8)  NULLREG CMD_BUFFER_D(%1,4)<0;1,0>       IS_INTRA8X8
  122.         (f0.1) and.nz.f0.1 (8)  NULLREG CMD_BUFFER_W(%1,14)<0;1,0>      F_FLAG
  123.         (f0.1) or (1)   TEMP_INTRA_FLAG_W<1>:uw CMD_BUFFER_W(%1,14)<0;1,0>      E_FLAG
  124.  
  125. SET_SB_MBAFF_%1:
  126.         and.nz.f0.1     (16)    NULLREGW        TEMP_INTRA_FLAG_W<0;1,0>:uw     MB_MASK_B<0;8,1>:ub
  127.         shl     (1)     CMD_BUFFER_W(%1,2)<1>   f0.1<0;1,0>:uw  12:w            // Masks 0-3
  128.         and (1) CMD_BUFFER_W(%1,3)<1>   f0.1<0;1,0>:uw  0xf000:uw       // Masks 4-7
  129.  
  130.         mov (2) CMD_BUFFER_B(%1,4)<2>   TEMP_FD_X_B<4;2,2>:ub           // Set scoreboard (X,Y) for intra MB
  131.  
  132. NEXT_MB_MBAFF_%1:
  133.         }
  134.  
  135.         add.z.f0.0 (1)  TotalMB<1>:w    TotalMB<0;1,0>:w        -8:w                            // Update remaining number of 8-command blocks
  136.  
  137. //      Output modified intra commands
  138. //      Write block 0
  139.         mov (8) MRF_INTRA_WRITE_HEADER.0<1>:ud  MRF_READ_HEADER_SRC.0<8;8,1>:ud
  140.     $for(0; <4; 2) {
  141.         mov (16)        MRF_CMD_BUF_D(%1)<1>    CMD_BUFFER_D(%1)<8;8,1> {Compr}
  142.         }
  143.         send (16)       NULLREGW        MRF_INTRA_WRITE_HEADER  null:uw DAPWRITE        MSG_LEN(4)+OWBWMSGDSC+OWORD_8+BI_CMD_BUFFER
  144.  
  145. //      Write block 1
  146.         mov (8) m1.0<1>:ud      MRF_READ_HEADER_SRC.0<8;8,1>:ud
  147.         add     (1)     m1.2<1>:ud      MRF_READ_HEADER_SRC.2<0;1,0>:ud         128:ud          // Point to next 2-command block
  148.         mov (16)        m2<1>:ud        CMD_BUFFER_D(4)<8;8,1>  {Compr}
  149.         mov (16)        m4<1>:ud        CMD_BUFFER_D(6)<8;8,1>  {Compr}
  150.         send (16)       NULLREGW        m1      null:uw DAPWRITE        MSG_LEN(4)+OWBWMSGDSC+OWORD_8+BI_CMD_BUFFER
  151.  
  152. //      Write block 2
  153.         add     (1)     MRF_INTRA_WRITE_HEADER.2<1>:ud  MRF_READ_HEADER_SRC.2<0;1,0>:ud         256:ud          // Point to next 2-command block
  154.     $for(0; <4; 2) {
  155.         mov (16)        MRF_CMD_BUF_D(%1)<1>    CMD_BUFFER_D(%1+8)<8;8,1>       {Compr}
  156.         }
  157.         send (16)       NULLREGW        MRF_INTRA_WRITE_HEADER  null:uw DAPWRITE        MSG_LEN(4)+OWBWMSGDSC+OWORD_8+BI_CMD_BUFFER
  158.  
  159. //      Write block 3
  160.         add     (1)     m1.2<1>:ud      MRF_READ_HEADER_SRC.2<0;1,0>:ud         384:ud          // Point to next 2-command block
  161.         mov (16)        m2<1>:ud        CMD_BUFFER_D(12)<8;8,1> {Compr}
  162.         mov (16)        m4<1>:ud        CMD_BUFFER_D(14)<8;8,1> {Compr}
  163.         send (16)       NULLREGW        m1      null:uw DAPWRITE        MSG_LEN(4)+OWBWMSGDSC+OWORD_8+BI_CMD_BUFFER
  164.  
  165. //      Update message header for next DAP read
  166.         add (1) MRF_READ_HEADER_SRC.2<1>:ud     MRF_READ_HEADER_SRC.2<0;1,0>:ud 512:ud  // Point to next block of 8-commands
  167.  
  168.         cmp.z.f0.1 (1)  NULLREG RemainderMB<0;1,0>:w    0:uw            // Check if remaining MB = 0
  169.         (-f0.0) jmpi (1)        SetHWScoreboard_MBAFF_Loop                      // Continue if more command blocks remain
  170.  
  171. SetHWScoreboard_MBAFF_Remainder:
  172. //      f0.1 should have been set to indicate if RemainderMB = 0
  173. //
  174.         (f0.1) jmpi (1) SetHWScoreboard_MBAFF_Done                              // Stop if all commands have been updated
  175.  
  176. //      Blindly load next 8 commands anyway
  177. //
  178. //      Load block 0 (Commands 0/1)
  179.         mov (8) MRF_READ_HEADER0.0<1>:ud        MRF_READ_HEADER_SRC.0<8;8,1>:ud
  180.         send (16)       CMD_BUFFER_W(0)<1>      MRF_READ_HEADER0        null:uw DAPREAD RESP_LEN(4)+OWBRMSGDSC_SC+OWORD_8+BI_CMD_BUFFER
  181.  
  182. //      Load block 1  (Commands 2/3)
  183.         mov (8) MRF_READ_HEADER1.0<1>:ud        MRF_READ_HEADER_SRC.0<8;8,1>:ud
  184.         add     (1)     MRF_READ_HEADER1.2<1>:ud        MRF_READ_HEADER_SRC.2<0;1,0>:ud         128:ud          // Point to next 2-command block
  185.         send (16)       CMD_BUFFER_W(4)<1>      MRF_READ_HEADER1        null:uw DAPREAD RESP_LEN(4)+OWBRMSGDSC_SC+OWORD_8+BI_CMD_BUFFER
  186.  
  187. //      Load block 2  (Commands 4/5)
  188.         mov (8) MRF_READ_HEADER2.0<1>:ud        MRF_READ_HEADER_SRC.0<8;8,1>:ud
  189.         add     (1)     MRF_READ_HEADER2.2<1>:ud        MRF_READ_HEADER_SRC.2<0;1,0>:ud         256:ud          // Point to next 2-command block
  190.         send (16)       CMD_BUFFER_W(8)<1>      MRF_READ_HEADER2        null:uw DAPREAD RESP_LEN(4)+OWBRMSGDSC_SC+OWORD_8+BI_CMD_BUFFER
  191.  
  192. //      Load block 3  (Commands 6/7)
  193.         mov (8) MRF_READ_HEADER3.0<1>:ud        MRF_READ_HEADER_SRC.0<8;8,1>:ud
  194.         add     (1)     MRF_READ_HEADER3.2<1>:ud        MRF_READ_HEADER_SRC.2<0;1,0>:ud         384:ud          // Point to next 2-command block
  195.         send (16)       CMD_BUFFER_W(12)<1>     MRF_READ_HEADER3        null:uw DAPREAD RESP_LEN(4)+OWBRMSGDSC_SC+OWORD_8+BI_CMD_BUFFER
  196.  
  197. //      Initialize necessary pointers
  198.         mov (1) a0.1<1>:ud      ((CMD_BUFFER_REG_OFF+1)*0x10000+CMD_BUFFER_REG_OFF)*32  // a0.2:w points to command buffer (first half)
  199.                                                                                                                                                         // a0.3:w points to command buffer (second half)
  200. //      Initialize Inter DAP write header
  201.         mov (8) MRF_INTER_WRITE_HEADER<1>:ud    r0.0<8;8,1>:ud
  202.  
  203. SetHWScoreboard_MBAFF_Remainder_Loop:
  204. //      Adjust MB Y origin for field MBs
  205. //
  206.         mov (2) TEMP_FD_X_W<1>:uw       r[a0.2,5*4]<2;2,1>:ub                                   // Initialize temp (X,Y) location
  207.         and.nz.f0.1 (8) NULLREG r[a0.2,4*4]<0;1,0>:ud   IS_BOT_FD:ud            // Is it a "Bottom Field MB"?
  208.         and.nz.f0.0 (8) NULLREG r[a0.2,4*4]<0;1,0>:ud   IS_FIELD_MB:ud          // Is it a "Field MB"?
  209.         mul (8) acc0<1>:w       r[a0.2,21]<0;1,0>:ub    2:w
  210.         (-f0.1) mov (1) TEMP_FD_Y_W<1>:w        acc0<0;1,0>:w
  211.         (f0.1) add (1)  TEMP_FD_Y_W<1>:w        acc0<0;1,0>:w   1:w
  212.         (-f0.0) mov (1) TEMP_FD_Y_W<1>:w        r[a0.2,5*4+1]<0;1,0>:ub                 // Discard field MB Y origin handling
  213.  
  214.         and.nz.f0.0 (8) NULLREG r[a0.2,4*4]<0;1,0>:ud   IS_INTRA_MB:ud          // Is it an "Intra" MB?
  215.         add.z.f0.1 (1)  RemainderMB<1>:w        RemainderMB<0;1,0>:w    -1:w    // Decrement MB #
  216.         or (1)  r[a0.2,2*4]<1>:ud       r[a0.2,2*4]<0;1,0>:ud   BIT21:ud                // Set "Use Scoreboard"
  217.         mov (2) r[a0.2,2*2]<1>:uw       TEMP_FD_X_W<2;2,1>:uw                                   // Set scoreboard (X,Y) for inter MB
  218.         (f0.0) jmpi (1) SET_SB_MBAFF_REM_INTRA                                                          // Jump if intra MB.
  219.  
  220. //      Inter Macroblock
  221. //      Output MEDIA_OBJECT command in raster scan order
  222.         mul (16) acc0<1>:uw     TEMP_FD_Y_W<0;1,0>:uw   PicWidthMB<0;1,0>:uw    // MB offset = Y*W
  223.         add (16) acc0<1>:uw     acc0<8;8,1>:uw                  TEMP_FD_X_W<0;1,0>:uw   // MB offset = Y*W+X
  224.         shl (1) MRF_INTER_WRITE_HEADER.2<1>:ud  acc0.2<0;1,0>:uw        6:uw    // Byte-aligned MB offset
  225.         mov (16)        MRF_INTER_WRITE_DATA0<1>:ud     r[a0.2]<8;8,1>:ud {Compr}       // Copy entire command to inter buffer
  226.         mov     (16)    r[a0.2]<1>:ud           0:ud    {Compr}                                                 // Clear original command
  227.         send (16)       NULLREGW        MRF_INTER_WRITE_HEADER  null:uw DAPWRITE        MSG_LEN(2)+OWBWMSGDSC+OWORD_4+BI_CMD_BUFFER
  228.         jmpi (1)        Output_MBAFF_Remainder_Intra                                                    // Done for inter MB. Move to dump intra MB.
  229.  
  230. SET_SB_MBAFF_REM_INTRA:
  231. //      Intra MB
  232. //
  233.         and.nz.f0.1     (8)     NULLREG TEMP_FD_Y_W<0;1,0>:uw   BIT0:ud                 // Is it "Bottom MB"?
  234.         and.nz.f0.0 (8) NULLREG r[a0.2,4*4]<0;1,0>:ud   IS_FIELD_MB:ud  // Is it "Field MB"?
  235.         mov (1) TEMP_INTRA_FLAG_W<1>:uw r[a0.2,14*2]<0;1,0>:uw                  // Don't want to alter original in-line data
  236.         (f0.1) sel (2)  MB_MASK_D<1>:ud         BOT_FD_MASK1_D<2;2,1>:ud        TOP_FD_MASK1_D<2;2,1>:ud        // Assume field MB
  237.         (f0.0) jmpi (1) SET_SB_MBAFF_REM                                        // Jump if it's really field MB
  238.  
  239. //      Frame MB
  240. //
  241. //      Derive E'
  242.         and.nz.f0.0     (8)     NULLREG r[a0.2,14*2]<0;1,0>:uw  E_FLAG          // Is "E" = 1
  243.         (f0.1) sel (2)  MB_MASK_D<1>:ud         BOT_FM_MASK1_D<2;2,1>:ud        TOP_FM_MASK1_D<2;2,1>:ud
  244.         and.z.f0.1 (8)  NULLREG r[a0.2,14*2]<0;1,0>:uw  A_FLAG          // "A" = 0?
  245.         (f0.0) jmpi (1) SET_SB_MBAFF_REM                                // If "E" flag = 1, skip the rest of derivation
  246.         (f0.1) and.nz.f0.1 (8)  NULLREG r[a0.2,4*4]<0;1,0>:ud   IS_INTRA8X8
  247.         (f0.1) and.nz.f0.1 (8)  NULLREG r[a0.2,14*2]<0;1,0>:uw  F_FLAG
  248.         (f0.1) or (1)   TEMP_INTRA_FLAG_W<1>:uw r[a0.2,14*2]<0;1,0>:uw  E_FLAG
  249.  
  250. SET_SB_MBAFF_REM:
  251.         and.nz.f0.0     (16)    NULLREGW        TEMP_INTRA_FLAG_W<0;1,0>:uw     MB_MASK_B<0;8,1>:ub
  252.         add.z.f0.1 (1)  RemainderMB<1>:w        RemainderMB<0;1,0>:w    0:w             // Check remaining MB #
  253.         shl     (1)     r[a0.2,2*2]<1>:uw       f0.0<0;1,0>:uw  12:w            // Masks 0-3
  254.         and (1) r[a0.2,3*2]<1>:uw       f0.0<0;1,0>:uw  0xf000:uw       // Masks 4-7
  255.  
  256.         mov (2) r[a0.2,4*1]<2>:ub       TEMP_FD_X_B<4;2,2>:ub           // Set scoreboard (X,Y) for intra MB
  257.  
  258. Output_MBAFF_Remainder_Intra:
  259. //      Intra MB command always output
  260.         mov (8) MRF_INTRA_WRITE_HEADER.0<1>:ud  MRF_READ_HEADER_SRC.0<8;8,1>:ud
  261.         mov (16)        MRF_CMD_BUF_D(0)<1>             r[a0.2]<8;8,1>:ud       {Compr}         // Copy entire command to intra buffer
  262.         send (16)       NULLREGW        MRF_INTRA_WRITE_HEADER  null:uw DAPWRITE        MSG_LEN(2)+OWBWMSGDSC+OWORD_4+BI_CMD_BUFFER
  263.  
  264.         add     (1)     MRF_READ_HEADER_SRC.2<1>:ud             MRF_READ_HEADER_SRC.2<0;1,0>:ud         64:ud   // Point to next command
  265.         add (1) a0.1<1>:ud      a0.1<0;1,0>:ud  0x00400040:ud                                   // Update pointers
  266.         (-f0.1) jmpi (1)        SetHWScoreboard_MBAFF_Remainder_Loop
  267.  
  268. // All MBs have been decoded. Terminate the thread now
  269. //
  270. SetHWScoreboard_MBAFF_Done:
  271.     END_THREAD
  272.  
  273. #if !defined(COMBINED_KERNEL)           // For standalone kernel only
  274. .end_code
  275.  
  276. .end_kernel
  277. #endif
  278.  
  279. // End of SetHWScoreboard_MBAFF
  280.