Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3769 | Serge | 1 | /* |
2 | * All Video Processing kernels |
||
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 | |||
11 | #define DI_ENABLE |
||
12 | |||
13 | #include "DNDI.inc" |
||
14 | |||
15 | #undef nY_NUM_OF_ROWS |
||
16 | #define nY_NUM_OF_ROWS 8 // Number of Y rows per block (4 rows for each frame) |
||
17 | #undef nUV_NUM_OF_ROWS |
||
18 | #define nUV_NUM_OF_ROWS 8 // Number of U/V rows per block |
||
19 | |||
20 | #undef nSMPL_RESP_LEN |
||
21 | #define nSMPL_RESP_LEN nSMPL_RESP_LEN_DNDI // set the number of GRF |
||
22 | #undef nDPW_BLOCK_SIZE_HIST |
||
23 | #define nDPW_BLOCK_SIZE_HIST nBLOCK_WIDTH_4+nBLOCK_HEIGHT_1 // HIST Block Size for Write is 4x2 |
||
24 | #undef nDPW_BLOCK_SIZE_DN |
||
25 | #define nDPW_BLOCK_SIZE_DN nBLOCK_WIDTH_16+nBLOCK_HEIGHT_4 // DN Block Size for Write is 16x4 |
||
26 | #undef nDPR_BLOCK_SIZE_UV |
||
27 | #define nDPR_BLOCK_SIZE_UV nBLOCK_WIDTH_8+nBLOCK_HEIGHT_2 // DN Block Size for UV Write/Read is 8x2 |
||
28 | |||
29 | ////////////////////////////////////// Run the DN Algorithm /////////////////////////////////////// |
||
30 | #include "DNDI_Command.asm" |
||
31 | |||
32 | ////////////////////////////////////// Rearrange for Internal Planar ////////////////////////////// |
||
33 | // move the previous frame Y component to internal planar format |
||
34 | $for (0; |
||
35 | mov (16) uwDEST_Y(%1,0)<1> ubRESP(nDI_PREV_FRAME_LUMA_OFFSET,%1*16) |
||
36 | } |
||
37 | // move the previous frame U,V components to internal planar format |
||
38 | $for (0; |
||
39 | mov (8) uwDEST_U(0,%1*8)<1> ubRESP(nDI_PREV_FRAME_CHROMA_OFFSET,%1*16+1)<16;8,2> //U pixels |
||
40 | mov (8) uwDEST_V(0,%1*8)<1> ubRESP(nDI_PREV_FRAME_CHROMA_OFFSET,%1*16)<16;8,2> //V pixels |
||
41 | } |
||
42 | // move the current frame Y component to internal planar format |
||
43 | $for (0; |
||
44 | mov (16) uwDEST_Y(%1+4,0)<1> ubRESP(nDI_CURR_FRAME_LUMA_OFFSET,%1*16) |
||
45 | } |
||
46 | // move the current frame U,V components to internal planar format |
||
47 | $for (0; |
||
48 | mov (8) uwDEST_U(2,%1*8)<1> ubRESP(nDI_CURR_FRAME_CHROMA_OFFSET,%1*16+1)<16;8,2> //U pixels |
||
49 | mov (8) uwDEST_V(2,%1*8)<1> ubRESP(nDI_CURR_FRAME_CHROMA_OFFSET,%1*16)<16;8,2> //V pixels |
||
50 | } |
||
51 | |||
52 | ////////////////////////////////////// Save the STMM Data for Next Run ///////////////////////// |
||
53 | // Write STMM to memory |
||
54 | shr (1) rMSGSRC.0<1>:ud wORIX<0;1,0>:w 1:w // X origin / 2 |
||
55 | mov (1) rMSGSRC.1<1>:ud wORIY<0;1,0>:w // Y origin |
||
56 | mov (1) rMSGSRC.2<1>:ud nDPW_BLOCK_SIZE_STMM:ud // block width and height (8x4) |
||
57 | mov (8) mudMSGHDR_STMM(0)<1> rMSGSRC.0<8;8,1>:ud // message header |
||
58 | mov (8) mudMSGHDR_STMM(1)<1> udRESP(nDI_STMM_OFFSET,0) // Move STMM to MRF |
||
59 | send (8) dNULLREG mMSGHDR_STMM udDUMMY_NULL nDATAPORT_WRITE nDPMW_MSGDSC+nDPMW_MSG_LEN_STMM+nBI_STMM_HISTORY_OUTPUT:ud |
||
60 | |||
61 | ////////////////////////////////////// Save the History Data for Next Run ///////////////////////// |
||
62 | #include "DI_Hist_Save.asm" |
||
63 | |||
64 | ////////////////////////////////////// Save the DN Curr Frame for Next Run //////////////////////// |
||
65 | add (4) pCF_Y_OFFSET<1>:uw ubSRC_CF_OFFSET<4;4,1>:ub npDN_YUV:w |
||
66 | // check top/bottom field first |
||
67 | cmp.e.f0.0 (1) null<1>:w ubTFLD_FIRST<0;1,0>:ub 1:w |
||
68 | (f0.0) jmpi (1) TOP_FIELD_FIRST |
||
69 | |||
70 | BOTTOM_FIELD_FIRST: |
||
71 | $for (0,0; |
||
72 | mov (4) mudMSGHDR_DN(1,%1*4)<1> udRESP(nDI_CURR_2ND_FIELD_LUMA_OFFSET,%2*4)<4;4,1> // 2nd field luma from current frame (line 0,2) |
||
73 | mov (4) mudMSGHDR_DN(1,%1*4+4)<1> udRESP(nDI_CURR_FRAME_LUMA_OFFSET+%2,4)<4;4,1> // 1st field luma from current frame (line 1,3) |
||
74 | } |
||
75 | jmpi (1) SAVE_DN_CURR |
||
76 | |||
77 | TOP_FIELD_FIRST: |
||
78 | $for (0,0; |
||
79 | mov (4) mudMSGHDR_DN(1,%1*4)<1> udRESP(nDI_CURR_FRAME_LUMA_OFFSET+%2,0)<4;4,1> // 2nd field luma from current frame (line 0,2) |
||
80 | mov (4) mudMSGHDR_DN(1,%1*4+4)<1> udRESP(nDI_CURR_2ND_FIELD_LUMA_OFFSET,%2*4)<4;4,1> // 1st field luma from current frame (line 1,3) |
||
81 | } |
||
82 | SAVE_DN_CURR: |
||
83 | mov (2) rMSGSRC.0<1>:ud wORIX<2;2,1>:w // X origin and Y origin |
||
84 | mov (1) rMSGSRC.2<1>:ud nDPW_BLOCK_SIZE_DN:ud // block width and height (16x4) |
||
85 | mov (8) mudMSGHDR_DN(0)<1> rMSGSRC.0<8;8,1>:ud |
||
86 | send (8) dNULLREG mMSGHDR_DN udDUMMY_NULL nDATAPORT_WRITE nDPMW_MSGDSC+nDPMW_MSG_LEN_PL_DN_DI+nBI_DESTINATION_Y:ud |
||
87 | |||
88 | |||
89 | /////////////////////////////IMC3 UV Copy 422///////////////////////////////////////////////////// |
||
90 | //Read UV through DATAPORT |
||
91 | add (2) rMSGSRC.0<1>:d wORIX<2;2,1>:w wSRC_H_ORI_OFFSET<2;2,1>:w // Source Y Block origin |
||
92 | asr (2) rMSGSRC.0<1>:d rMSGSRC.0<2;2,1>:d 1:w // U/V block origin should be half of Y's |
||
93 | mov (1) rMSGSRC.2<1>:ud nDPR_BLOCK_SIZE_UV:ud // U/V block width and height (8x2) |
||
94 | mov (8) mudMSGHDR_DN<1> rMSGSRC<8;8,1>:ud |
||
95 | send (4) udBOT_U_IO(0)<1> mMSGHDR_DN udDUMMY_NULL nDATAPORT_READ nDPMR_MSGDSC+nRESLEN_1+nBI_CURRENT_SRC_U:ud |
||
96 | send (4) udBOT_V_IO(0)<1> mMSGHDR_DN udDUMMY_NULL nDATAPORT_READ nDPMR_MSGDSC+nRESLEN_1+nBI_CURRENT_SRC_V:ud |
||
97 | |||
98 | //Write UV through DATAPORT |
||
99 | mov (2) rMSGSRC.0<1>:ud wORIX<2;2,1>:w // X origin and Y origin |
||
100 | asr (2) rMSGSRC.0<1>:d wORIX<2;2,1>:w 1:w // U/V block origin should be half of Y's |
||
101 | mov (1) rMSGSRC.2<1>:ud nDPR_BLOCK_SIZE_UV:ud // block width and height (8x2) |
||
102 | mov (8) mudMSGHDR_DN(0)<1> rMSGSRC.0<8;8,1>:ud |
||
103 | mov (4) mudMSGHDR_DN(1)<1> udBOT_U_IO(0)<4;4,1> |
||
104 | send (4) dNULLREG mMSGHDR_DN udDUMMY_NULL nDATAPORT_WRITE nDPMW_MSGDSC+nMSGLEN_1+nBI_DESTINATION_U:ud |
||
105 | mov (4) mudMSGHDR_DN(1)<1> udBOT_V_IO(0)<4;4,1> |
||
106 | send (4) dNULLREG mMSGHDR_DN udDUMMY_NULL nDATAPORT_WRITE nDPMW_MSGDSC+nMSGLEN_1+nBI_DESTINATION_V:ud4;4,1>1>4;4,1>1>8;8,1>1>1>2;2,1>1>2;2,1>1>1>1>8;8,1>1>1>2;2,1>1>2;2,1>2;2,1>1>8;8,1>1>1>2;2,1>1>4;4,1>1>4;4,1>1>4;4,1>1>4;4,1>1>0;1,0>1>4;4,1>1>1>8;8,1>1>1>0;1,0>1>0;1,0>1>16;8,2>1>16;8,2>1>1>16;8,2>1>16;8,2>1>1>2010> |