1; **********
2; *
3; * File Name:  omxVCM4P2_DecodePadMV_PVOP_s.s
4; * OpenMAX DL: v1.0.2
5; * Revision:   12290
6; * Date:       Wednesday, April 9, 2008
7; *
8; * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
9; *
10; *
11; *
12; **
13; * Function: omxVCM4P2_DecodePadMV_PVOP
14; *
15; * Description:
16; * Decodes and pads four motion vectors of the non-intra macroblock in P-VOP.
17; * The motion vector padding process is specified in subclause 7.6.1.6 of
18; * ISO/IEC 14496-2.
19; *
20; * Remarks:
21; *
22; *
23; * Parameters:
24; * [in]    ppBitStream        pointer to the pointer to the current byte in
25; *                            the bit stream buffer
26; * [in]    pBitOffset         pointer to the bit position in the byte pointed
27; *                            to by *ppBitStream. *pBitOffset is valid within
28; *                            [0-7].
29; * [in]    pSrcMVLeftMB       pointers to the motion vector buffers of the
30; *                           macroblocks specially at the left side of the current macroblock
31; *                     respectively.
32; * [in]    pSrcMVUpperMB      pointers to the motion vector buffers of the
33; *                     macroblocks specially at the upper side of the current macroblock
34; *                     respectively.
35; * [in]    pSrcMVUpperRightMB pointers to the motion vector buffers of the
36; *                     macroblocks specially at the upper-right side of the current macroblock
37; *                     respectively.
38; * [in]    fcodeForward       a code equal to vop_fcode_forward in MPEG-4
39; *                     bit stream syntax
40; * [in]    MBType         the type of the current macroblock. If MBType
41; *                     is not equal to OMX_VC_INTER4V, the destination
42; *                     motion vector buffer is still filled with the
43; *                     same decoded vector.
44; * [out]   ppBitStream         *ppBitStream is updated after the block is decoded,
45; *                     so that it points to the current byte in the bit
46; *                     stream buffer
47; * [out]   pBitOffset         *pBitOffset is updated so that it points to the
48; *                     current bit position in the byte pointed by
49; *                     *ppBitStream
50; * [out]   pDstMVCurMB         pointer to the motion vector buffer of the current
51; *                     macroblock which contains four decoded motion vectors
52; *
53; * Return Value:
54; * OMX_Sts_NoErr -no error
55; *
56; *
57; * OMX_Sts_Err - status error
58; *
59; *
60
61        INCLUDE omxtypes_s.h
62        INCLUDE armCOMM_s.h
63        INCLUDE armCOMM_BitDec_s.h
64        INCLUDE omxVC_s.h
65
66       M_VARIANTS ARM1136JS
67
68
69
70
71        IF ARM1136JS
72
73;//Input Arguments
74
75ppBitStream           RN 0
76pBitOffset            RN 1
77pSrcMVLeftMB          RN 2
78pSrcMVUpperMB         RN 3
79pSrcMVUpperRightMB    RN 4
80pDstMVCurMB           RN 5
81fcodeForward          RN 6
82MBType                RN 7
83
84;//Local Variables
85
86zero                  RN 4
87one                   RN 4
88scaleFactor           RN 1
89
90
91Return                RN 0
92
93VlcMVD                RN 0
94index                 RN 4
95Count                 RN 7
96
97mvHorData             RN 4
98mvHorResidual         RN 0
99
100mvVerData             RN 4
101mvVerResidual         RN 0
102
103temp                  RN 1
104
105temp1                 RN 3
106High                  RN 4
107Low                   RN 2
108Range                 RN 1
109
110BlkCount              RN 14
111
112diffMVdx              RN 0
113diffMVdy              RN 1
114
115;// Scratch Registers
116
117RBitStream            RN 8
118RBitCount             RN 9
119RBitBuffer            RN 10
120
121T1                    RN 11
122T2                    RN 12
123LR                    RN 14
124
125       IMPORT          armVCM4P2_aVlcMVD
126       IMPORT          omxVCM4P2_FindMVpred
127
128       ;// Allocate stack memory
129
130       M_ALLOC4        ppDstMVCurMB,4
131       M_ALLOC4        pDstMVPredME,4
132       M_ALLOC4        pBlkCount,4
133
134       M_ALLOC4        pppBitStream,4
135       M_ALLOC4        ppBitOffset,4
136       M_ALLOC4        ppSrcMVLeftMB,4
137       M_ALLOC4        ppSrcMVUpperMB,4
138
139       M_ALLOC4        pdiffMVdx,4
140       M_ALLOC4        pdiffMVdy,4
141       M_ALLOC4        pHigh,4
142
143
144
145
146       M_START   omxVCM4P2_DecodePadMV_PVOP,r11
147
148       M_ARG           pSrcMVUpperRightMBonStack,4           ;// pointer to  pSrcMVUpperRightMB on stack
149       M_ARG           pDstMVCurMBonStack,4                  ;// pointer to pDstMVCurMB on stack
150       M_ARG           fcodeForwardonStack,4                 ;// pointer to fcodeForward on stack
151       M_ARG           MBTypeonStack,4                       ;// pointer to MBType on stack
152
153
154
155
156
157       ;// Initializing the BitStream Macro
158
159       M_BD_INIT0      ppBitStream, pBitOffset, RBitStream, RBitBuffer, RBitCount
160       M_LDR           MBType,MBTypeonStack                  ;// Load MBType from stack
161       M_LDR           pDstMVCurMB,pDstMVCurMBonStack        ;// Load pDstMVCurMB from stack
162       MOV             zero,#0
163
164       TEQ             MBType,#OMX_VC_INTRA                  ;// Check if MBType=OMX_VC_INTRA
165       TEQNE           MBType,#OMX_VC_INTRA_Q                ;// check if MBType=OMX_VC_INTRA_Q
166       STREQ           zero,[pDstMVCurMB]
167       M_BD_INIT1      T1, T2, T2
168       STREQ           zero,[pDstMVCurMB,#4]
169       M_BD_INIT2      T1, T2, T2
170       STREQ           zero,[pDstMVCurMB,#4]
171       MOVEQ           Return,#OMX_Sts_NoErr
172       MOV             BlkCount,#0
173       STREQ           zero,[pDstMVCurMB,#4]
174
175       BEQ             ExitOK
176
177       TEQ             MBType,#OMX_VC_INTER4V                ;// Check if MBType=OMX_VC_INTER4V
178       TEQNE           MBType,#OMX_VC_INTER4V_Q              ;// Check if MBType=OMX_VC_INTER4V_Q
179       MOVEQ           Count,#4
180
181       TEQ             MBType,#OMX_VC_INTER                  ;// Check if MBType=OMX_VC_INTER
182       TEQNE           MBType,#OMX_VC_INTER_Q                ;// Check if MBType=OMX_VC_INTER_Q
183       MOVEQ           Count,#1
184
185       M_LDR           fcodeForward,fcodeForwardonStack      ;// Load fcodeForward  from stack
186
187       ;// Storing the values temporarily on stack
188
189       M_STR           ppBitStream,pppBitStream
190       M_STR           pBitOffset,ppBitOffset
191
192
193       SUB             temp,fcodeForward,#1                  ;// temp=fcodeForward-1
194       MOV             one,#1
195       M_STR           pSrcMVLeftMB,ppSrcMVLeftMB
196       LSL             scaleFactor,one,temp                  ;// scaleFactor=1<<(fcodeForward-1)
197       M_STR           pSrcMVUpperMB,ppSrcMVUpperMB
198       LSL             scaleFactor,scaleFactor,#5
199       M_STR           scaleFactor,pHigh                     ;// [pHigh]=32*scaleFactor
200
201       ;// VLD Decoding
202
203
204Loop
205
206       LDR             VlcMVD, =armVCM4P2_aVlcMVD        ;// Load the optimized MVD VLC table
207
208       ;// Horizontal Data and Residual calculation
209
210       LDR             temp,=0xFFF
211       M_BD_VLD        index,T1,T2,VlcMVD,3,2                ;// variable lenght decoding using the macro
212
213       TEQ             index,temp
214       BEQ             ExitError                             ;// Exit with an Error Message if the decoded symbol is an invalied symbol
215
216       SUB             mvHorData,index,#32                   ;// mvHorData=index-32
217       MOV             mvHorResidual,#1                      ;// mvHorResidual=1
218       CMP             fcodeForward,#1
219       TEQNE           mvHorData,#0
220       MOVEQ           diffMVdx,mvHorData                    ;// if scaleFactor=1(fcodeForward=1) or mvHorData=0 diffMVdx=mvHorData
221       BEQ             VerticalData
222
223       SUB             temp,fcodeForward,#1
224       M_BD_VREAD8     mvHorResidual,temp,T1,T2              ;// get mvHorResidual from bitstream if fcodeForward>1 and mvHorData!=0
225
226       CMP             mvHorData,#0
227       RSBLT           mvHorData,mvHorData,#0                ;// mvHorData=abs(mvHorData)
228       SUB             mvHorResidual,mvHorResidual,fcodeForward
229       SMLABB          diffMVdx,mvHorData,fcodeForward,mvHorResidual ;// diffMVdx=abs(mvHorData)*fcodeForward+mvHorResidual-fcodeForward
230       ADD             diffMVdx,diffMVdx,#1
231       RSBLT           diffMVdx,diffMVdx,#0
232
233       ;// Vertical Data and Residual calculation
234
235VerticalData
236
237       M_STR           diffMVdx,pdiffMVdx                    ;// Store the diffMVdx on stack
238       LDR             VlcMVD, =armVCM4P2_aVlcMVD        ;// Loading the address of optimized VLC tables
239
240       LDR             temp,=0xFFF
241       M_BD_VLD        index,T1,T2,VlcMVD,3,2                ;// VLC decoding using the macro
242
243       TEQ             index,temp
244       BEQ             ExitError                             ;// Exit with an Error Message if an Invalied Symbol occurs
245
246       SUB             mvVerData,index,#32                   ;// mvVerData=index-32
247       MOV             mvVerResidual,#1
248       CMP             fcodeForward,#1
249       TEQNE           mvVerData,#0
250       MOVEQ           diffMVdy,mvVerData                    ;// diffMVdy = mvVerData if scaleFactor=1(fcodeForward=1) or mvVerData=0
251       BEQ             FindMVPred
252
253       SUB             temp,fcodeForward,#1
254       M_BD_VREAD8     mvVerResidual,temp,T1,T2              ;// Get mvVerResidual from bit stream if fcodeForward>1 and mnVerData!=0
255
256
257       CMP             mvVerData,#0
258       RSBLT           mvVerData,mvVerData,#0
259       SUB             mvVerResidual,mvVerResidual,fcodeForward
260       SMLABB          diffMVdy,mvVerData,fcodeForward,mvVerResidual ;// diffMVdy=abs(mvVerData)*fcodeForward+mvVerResidual-fcodeForward
261       ADD             diffMVdy,diffMVdy,#1
262       RSBLT           diffMVdy,diffMVdy,#0
263
264       ;//Calling the Function omxVCM4P2_FindMVpred
265
266FindMVPred
267
268       M_STR           diffMVdy,pdiffMVdy
269       ADD             temp,pDstMVCurMB,BlkCount,LSL #2      ;// temp=pDstMVCurMB[BlkCount]
270       M_STR           temp,ppDstMVCurMB                     ;// store temp on stack for passing as an argument to FindMVPred
271
272       MOV             temp,#0
273       M_STR           temp,pDstMVPredME                     ;// Pass pDstMVPredME=NULL as an argument
274       M_STR           BlkCount,pBlkCount                    ;// Passs BlkCount as Argument through stack
275
276       MOV             temp,pSrcMVLeftMB                     ;// temp (RN 1)=pSrcMVLeftMB
277       M_LDR           pSrcMVUpperRightMB,pSrcMVUpperRightMBonStack
278       MOV             pSrcMVLeftMB,pSrcMVUpperMB            ;// pSrcMVLeftMB ( RN 2) = pSrcMVUpperMB
279       MOV             ppBitStream,pDstMVCurMB               ;// ppBitStream  ( RN 0) = pDstMVCurMB
280       MOV             pSrcMVUpperMB,pSrcMVUpperRightMB      ;// pSrcMVUpperMB( RN 3) = pSrcMVUpperRightMB
281       BL              omxVCM4P2_FindMVpred              ;// Branch to subroutine omxVCM4P2_FindMVpred
282
283       ;// Store Horizontal Motion Vector
284
285       M_LDR           BlkCount,pBlkCount                    ;// Load BlkCount from stack
286       M_LDR           High,pHigh                            ;// High=32*scaleFactor
287       LSL             temp1,BlkCount,#2                     ;// temp=BlkCount*4
288       M_LDR           diffMVdx,pdiffMVdx                    ;// Laad diffMVdx
289
290       LDRSH           temp,[pDstMVCurMB,temp1]              ;// temp=pDstMVCurMB[BlkCount]
291
292
293       RSB             Low,High,#0                           ;// Low = -32*scaleFactor
294       ADD             diffMVdx,temp,diffMVdx                ;// diffMVdx=pDstMVCurMB[BlkCount]+diffMVdx
295       ADD             Range,High,High                       ;// Range=64*ScaleFactor
296       SUB             High,High,#1                          ;// High= 32*scaleFactor-1
297
298       CMP             diffMVdx,Low                          ;// If diffMVdx<Low
299       ADDLT           diffMVdx,diffMVdx,Range               ;// diffMVdx+=Range
300
301       CMP             diffMVdx,High
302       SUBGT           diffMVdx,diffMVdx,Range               ;// If diffMVdx > High diffMVdx-=Range
303       STRH            diffMVdx,[pDstMVCurMB,temp1]
304
305       ;// Store Vertical
306
307       ADD             temp1,temp1,#2                        ;// temp1=4*BlkCount+2
308       M_LDR           diffMVdx,pdiffMVdy                    ;// Laad diffMVdy
309       LDRSH           temp,[pDstMVCurMB,temp1]              ;// temp=pDstMVCurMB[BlkCount].diffMVdy
310       ADD             BlkCount,BlkCount,#1                  ;// BlkCount=BlkCount+1
311       ADD             diffMVdx,temp,diffMVdx
312       CMP             diffMVdx,Low
313       ADDLT           diffMVdx,diffMVdx,Range               ;// If diffMVdy<Low  diffMVdy+=Range
314       CMP             diffMVdx,High
315       SUBGT           diffMVdx,diffMVdx,Range               ;// If diffMVdy > High diffMVdy-=Range
316       STRH            diffMVdx,[pDstMVCurMB,temp1]
317
318       CMP             BlkCount,Count
319       M_LDR           pSrcMVLeftMB,ppSrcMVLeftMB
320       M_LDR           pSrcMVUpperMB,ppSrcMVUpperMB
321
322       BLT             Loop                                  ;// If BlkCount<Count Continue the Loop
323
324
325       ;// If MBType=OMX_VC_INTER or MBtype=OMX_VC_INTER_Q copy pDstMVCurMB[0] to
326       ;// pDstMVCurMB[1], pDstMVCurMB[2], pDstMVCurMB[3]
327
328       M_LDR           MBType,MBTypeonStack
329
330       TEQ             MBType,#OMX_VC_INTER
331       TEQNE           MBType,#OMX_VC_INTER_Q
332       LDREQ           temp,[pDstMVCurMB]
333       M_LDR           ppBitStream,pppBitStream
334       STREQ           temp,[pDstMVCurMB,#4]
335
336       STREQ           temp,[pDstMVCurMB,#8]
337       STREQ           temp,[pDstMVCurMB,#12]
338
339
340       M_LDR           pBitOffset,ppBitOffset
341       ;//Ending the macro
342       M_BD_FINI       ppBitStream,pBitOffset                 ;// Finishing the Macro
343
344
345       MOV             Return,#OMX_Sts_NoErr
346       B               ExitOK
347
348ExitError
349
350       M_LDR           ppBitStream,pppBitStream
351       M_LDR           pBitOffset,ppBitOffset
352       ;//Ending the macro
353       M_BD_FINI       ppBitStream,pBitOffset
354
355       MOV             Return,#OMX_Sts_Err
356
357ExitOK
358
359       M_END
360       ENDIF
361       END
362
363
364
365