1/*
2 * Copyright (C) 2007-2008 ARM Limited
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17/**
18 *
19 * File Name:  armVC.h
20 * OpenMAX DL: v1.0.2
21 * Revision:   9641
22 * Date:       Thursday, February 7, 2008
23 *
24 *
25 *
26 *
27 * File: armVideo.h
28 * Brief: Declares API's/Basic Data types used across the OpenMAX Video domain
29 *
30 */
31
32
33#ifndef _armVideo_H_
34#define _armVideo_H_
35
36#include "omxVC.h"
37#include "armCOMM_Bitstream.h"
38
39/**
40 * ARM specific state structure to hold Motion Estimation information.
41 */
42
43struct m4p2_MESpec
44{
45    OMXVCM4P2MEParams MEParams;
46    OMXVCM4P2MEMode   MEMode;
47};
48
49struct m4p10_MESpec
50{
51    OMXVCM4P10MEParams MEParams;
52    OMXVCM4P10MEMode   MEMode;
53};
54
55typedef struct m4p2_MESpec  ARMVCM4P2_MESpec;
56typedef struct m4p10_MESpec ARMVCM4P10_MESpec;
57
58/**
59 * Function: armVCM4P2_CompareMV
60 *
61 * Description:
62 * Performs comparision of motion vectors and SAD's to decide the
63 * best MV and SAD
64 *
65 * Remarks:
66 *
67 * Parameters:
68 * [in]     mvX     x coordinate of the candidate motion vector
69 * [in]     mvY     y coordinate of the candidate motion vector
70 * [in]     candSAD Candidate SAD
71 * [in]     bestMVX x coordinate of the best motion vector
72 * [in]     bestMVY y coordinate of the best motion vector
73 * [in]     bestSAD best SAD
74 *
75 * Return Value:
76 * OMX_INT -- 1 to indicate that the current sad is the best
77 *            0 to indicate that it is NOT the best SAD
78 */
79
80OMX_INT armVCM4P2_CompareMV (
81    OMX_S16 mvX,
82    OMX_S16 mvY,
83    OMX_INT candSAD,
84    OMX_S16 bestMVX,
85    OMX_S16 bestMVY,
86    OMX_INT bestSAD);
87
88/**
89 * Function: armVCM4P2_ACDCPredict
90 *
91 * Description:
92 * Performs adaptive DC/AC coefficient prediction for an intra block. Prior
93 * to the function call, prediction direction (predDir) should be selected
94 * as specified in subclause 7.4.3.1 of ISO/IEC 14496-2.
95 *
96 * Remarks:
97 *
98 * Parameters:
99 * [in] pSrcDst     pointer to the coefficient buffer which contains
100 *                          the quantized coefficient residuals (PQF) of the
101 *                          current block
102 * [in] pPredBufRow pointer to the coefficient row buffer
103 * [in] pPredBufCol pointer to the coefficient column buffer
104 * [in] curQP       quantization parameter of the current block. curQP
105 *                          may equal to predQP especially when the current
106 *                          block and the predictor block are in the same
107 *                          macroblock.
108 * [in] predQP      quantization parameter of the predictor block
109 * [in] predDir     indicates the prediction direction which takes one
110 *                          of the following values:
111 *                          OMX_VIDEO_HORIZONTAL    predict horizontally
112 *                          OMX_VIDEO_VERTICAL      predict vertically
113 * [in] ACPredFlag  a flag indicating if AC prediction should be
114 *                          performed. It is equal to ac_pred_flag in the bit
115 *                          stream syntax of MPEG-4
116 * [in] videoComp   video component type (luminance, chrominance or
117 *                          alpha) of the current block
118 * [in] flag        This flag defines the if one wants to use this functions to
119 *                  calculate PQF (set 1, prediction) or QF (set 0, reconstruction)
120 * [out]    pPreACPredict   pointer to the predicted coefficients buffer.
121 *                          Filled ONLY if it is not NULL
122 * [out]    pSrcDst     pointer to the coefficient buffer which contains
123 *                          the quantized coefficients (QF) of the current
124 *                          block
125 * [out]    pPredBufRow pointer to the updated coefficient row buffer
126 * [out]    pPredBufCol pointer to the updated coefficient column buffer
127 * [out]    pSumErr     pointer to the updated sum of the difference
128 *                      between predicted and unpredicted coefficients
129 *                      If this is NULL, do not update
130 *
131 * Return Value:
132 * Standard OMXResult result. See enumeration for possible result codes.
133 *
134 */
135
136OMXResult armVCM4P2_ACDCPredict(
137     OMX_S16 * pSrcDst,
138     OMX_S16 * pPreACPredict,
139     OMX_S16 * pPredBufRow,
140     OMX_S16 * pPredBufCol,
141     OMX_INT curQP,
142     OMX_INT predQP,
143     OMX_INT predDir,
144     OMX_INT ACPredFlag,
145     OMXVCM4P2VideoComponent  videoComp,
146     OMX_U8 flag,
147     OMX_INT *pSumErr
148);
149
150/**
151 * Function: armVCM4P2_SetPredDir
152 *
153 * Description:
154 * Performs detecting the prediction direction
155 *
156 * Remarks:
157 *
158 * Parameters:
159 * [in] blockIndex  block index indicating the component type and
160 *                          position as defined in subclause 6.1.3.8, of ISO/IEC
161 *                          14496-2. Furthermore, indexes 6 to 9 indicate the
162 *                          alpha blocks spatially corresponding to luminance
163 *                          blocks 0 to 3 in the same macroblock.
164 * [in] pCoefBufRow pointer to the coefficient row buffer
165 * [in] pQpBuf      pointer to the quantization parameter buffer
166 * [out]    predQP      quantization parameter of the predictor block
167 * [out]    predDir     indicates the prediction direction which takes one
168 *                          of the following values:
169 *                          OMX_VIDEO_HORIZONTAL    predict horizontally
170 *                          OMX_VIDEO_VERTICAL      predict vertically
171 *
172 * Return Value:
173 * Standard OMXResult result. See enumeration for possible result codes.
174 *
175 */
176
177OMXResult armVCM4P2_SetPredDir(
178     OMX_INT blockIndex,
179     OMX_S16 *pCoefBufRow,
180     OMX_S16 *pCoefBufCol,
181     OMX_INT *predDir,
182     OMX_INT *predQP,
183     const OMX_U8 *pQpBuf
184);
185
186/**
187 * Function: armVCM4P2_EncodeVLCZigzag_Intra
188 *
189 * Description:
190 * Performs zigzag scanning and VLC encoding for one intra block.
191 *
192 * Remarks:
193 *
194 * Parameters:
195 * [in] ppBitStream     pointer to the pointer to the current byte in
196 *                              the bit stream
197 * [in] pBitOffset      pointer to the bit position in the byte pointed
198 *                              by *ppBitStream. Valid within 0 to 7.
199 * [in] pQDctBlkCoef    pointer to the quantized DCT coefficient
200 * [in] predDir         AC prediction direction, which is used to decide
201 *                              the zigzag scan pattern. This takes one of the
202 *                              following values:
203 *                              OMX_VIDEO_NONE          AC prediction not used.
204 *                                                      Performs classical zigzag
205 *                                                      scan.
206 *                              OMX_VIDEO_HORIZONTAL    Horizontal prediction.
207 *                                                      Performs alternate-vertical
208 *                                                      zigzag scan.
209 *                              OMX_VIDEO_VERTICAL      Vertical prediction.
210 *                                                      Performs alternate-horizontal
211 *                                                      zigzag scan.
212 * [in] pattern         block pattern which is used to decide whether
213 *                              this block is encoded
214 * [in] start           start indicates whether the encoding begins with 0th element
215 *                      or 1st.
216 * [out]    ppBitStream     *ppBitStream is updated after the block is encoded,
217 *                              so that it points to the current byte in the bit
218 *                              stream buffer.
219 * [out]    pBitOffset      *pBitOffset is updated so that it points to the
220 *                              current bit position in the byte pointed by
221 *                              *ppBitStream.
222 *
223 * Return Value:
224 * Standard OMXResult result. See enumeration for possible result codes.
225 *
226 */
227
228OMXResult armVCM4P2_EncodeVLCZigzag_Intra(
229     OMX_U8 **ppBitStream,
230     OMX_INT *pBitOffset,
231     const OMX_S16 *pQDctBlkCoef,
232     OMX_U8 predDir,
233     OMX_U8 pattern,
234     OMX_INT shortVideoHeader,
235     OMX_U8 start
236);
237
238/**
239 * Function: armVCM4P2_DecodeVLCZigzag_Intra
240 *
241 * Description:
242 * Performs VLC decoding and inverse zigzag scan for one intra coded block.
243 *
244 * Remarks:
245 *
246 * Parameters:
247 * [in] ppBitStream     pointer to the pointer to the current byte in
248 *                              the bitstream buffer
249 * [in] pBitOffset      pointer to the bit position in the byte pointed
250 *                              to by *ppBitStream. *pBitOffset is valid within
251 *                              [0-7].
252 * [in] predDir         AC prediction direction which is used to decide
253 *                              the zigzag scan pattern. It takes one of the
254 *                              following values:
255 *                              OMX_VIDEO_NONE  AC prediction not used;
256 *                                              perform classical zigzag scan;
257 *                              OMX_VIDEO_HORIZONTAL    Horizontal prediction;
258 *                                                      perform alternate-vertical
259 *                                                      zigzag scan;
260 *                              OMX_VIDEO_VERTICAL      Vertical prediction;
261 *                                                      thus perform
262 *                                                      alternate-horizontal
263 *                                                      zigzag scan.
264 * [in] videoComp       video component type (luminance, chrominance or
265 *                              alpha) of the current block
266 * [in] shortVideoHeader binary flag indicating presence of short_video_header; escape modes 0-3 are used if shortVideoHeader==0,
267 *                           and escape mode 4 is used when shortVideoHeader==1.
268 * [in] start           start indicates whether the encoding begins with 0th element
269 *                      or 1st.
270 * [out]    ppBitStream     *ppBitStream is updated after the block is
271 *                              decoded, so that it points to the current byte
272 *                              in the bit stream buffer
273 * [out]    pBitOffset      *pBitOffset is updated so that it points to the
274 *                              current bit position in the byte pointed by
275 *                              *ppBitStream
276 * [out]    pDst            pointer to the coefficient buffer of current
277 *                              block. Should be 32-bit aligned
278 *
279 * Return Value:
280 * Standard OMXResult result. See enumeration for possible result codes.
281 *
282 */
283
284OMXResult armVCM4P2_DecodeVLCZigzag_Intra(
285     const OMX_U8 ** ppBitStream,
286     OMX_INT * pBitOffset,
287     OMX_S16 * pDst,
288     OMX_U8 predDir,
289     OMX_INT shortVideoHeader,
290     OMX_U8  start
291);
292
293/**
294 * Function: armVCM4P2_FillVLDBuffer
295 *
296 * Description:
297 * Performs filling of the coefficient buffer according to the run, level
298 * and sign, also updates the index
299 *
300 * Parameters:
301 * [in]  storeRun        Stored Run value (count of zeros)
302 * [in]  storeLevel      Stored Level value (non-zero value)
303 * [in]  sign            Flag indicating the sign of level
304 * [in]  last            status of the last flag
305 * [in]  pIndex          pointer to coefficient index in 8x8 matrix
306 * [out] pIndex          pointer to updated coefficient index in 8x8
307 *                       matrix
308 * [in]  pZigzagTable    pointer to the zigzag tables
309 * [out] pDst            pointer to the coefficient buffer of current
310 *                       block. Should be 32-bit aligned
311 * Return Value:
312 * Standard OMXResult result. See enumeration for possible result codes.
313 *
314 */
315
316OMXResult armVCM4P2_FillVLDBuffer(
317    OMX_U32 storeRun,
318    OMX_S16 * pDst,
319    OMX_S16 storeLevel,
320    OMX_U8  sign,
321    OMX_U8  last,
322    OMX_U8  * index,
323    const OMX_U8 * pZigzagTable
324);
325
326/**
327 * Function: armVCM4P2_GetVLCBits
328 *
329 * Description:
330 * Performs escape mode decision based on the run, run+, level, level+ and
331 * last combinations.
332 *
333 * Remarks:
334 *
335 * Parameters:
336 * [in]	ppBitStream		pointer to the pointer to the current byte in
337 *								the bit stream
338 * [in]	pBitOffset		pointer to the bit position in the byte pointed
339 *								by *ppBitStream. Valid within 0 to 7
340 * [in] shortVideoHeader binary flag indicating presence of short_video_header; escape modes 0-3 are used if shortVideoHeader==0,
341 *                           and escape mode 4 is used when shortVideoHeader==1.
342 * [in] start           start indicates whether the encoding begins with
343 *                      0th element or 1st.
344 * [in/out] pLast       pointer to last status flag
345 * [in] runBeginSingleLevelEntriesL0      The run value from which level
346 *                                        will be equal to 1: last == 0
347 * [in] IndexBeginSingleLevelEntriesL0    Array index in the VLC table
348 *                                        pointing to the
349 *                                        runBeginSingleLevelEntriesL0
350 * [in] runBeginSingleLevelEntriesL1      The run value from which level
351 *                                        will be equal to 1: last == 1
352 * [in] IndexBeginSingleLevelEntriesL1    Array index in the VLC table
353 *                                        pointing to the
354 *                                        runBeginSingleLevelEntriesL0
355 * [in] pRunIndexTableL0    Run Index table defined in
356 *                          armVCM4P2_Huff_Tables_VLC.c for last == 0
357 * [in] pVlcTableL0         VLC table for last == 0
358 * [in] pRunIndexTableL1    Run Index table defined in
359 *                          armVCM4P2_Huff_Tables_VLC.c for last == 1
360 * [in] pVlcTableL1         VLC table for last == 1
361 * [in] pLMAXTableL0        Level MAX table defined in
362 *                          armVCM4P2_Huff_Tables_VLC.c for last == 0
363 * [in] pLMAXTableL1        Level MAX table defined in
364 *                          armVCM4P2_Huff_Tables_VLC.c for last == 1
365 * [in] pRMAXTableL0        Run MAX table defined in
366 *                          armVCM4P2_Huff_Tables_VLC.c for last == 0
367 * [in] pRMAXTableL1        Run MAX table defined in
368 *                          armVCM4P2_Huff_Tables_VLC.c for last == 1
369 * [out]pDst			    pointer to the coefficient buffer of current
370 *							block. Should be 32-bit aligned
371 *
372 * Return Value:
373 * Standard OMXResult result. See enumeration for possible result codes.
374 *
375 */
376
377OMXResult armVCM4P2_GetVLCBits (
378              const OMX_U8 **ppBitStream,
379              OMX_INT * pBitOffset,
380			  OMX_S16 * pDst,
381			  OMX_INT shortVideoHeader,
382			  OMX_U8    start,
383			  OMX_U8  * pLast,
384			  OMX_U8    runBeginSingleLevelEntriesL0,
385			  OMX_U8    maxIndexForMultipleEntriesL0,
386			  OMX_U8    maxRunForMultipleEntriesL1,
387			  OMX_U8    maxIndexForMultipleEntriesL1,
388              const OMX_U8  * pRunIndexTableL0,
389              const ARM_VLC32 *pVlcTableL0,
390			  const OMX_U8  * pRunIndexTableL1,
391              const ARM_VLC32 *pVlcTableL1,
392              const OMX_U8  * pLMAXTableL0,
393              const OMX_U8  * pLMAXTableL1,
394              const OMX_U8  * pRMAXTableL0,
395              const OMX_U8  * pRMAXTableL1,
396              const OMX_U8  * pZigzagTable
397);
398
399/**
400 * Function: armVCM4P2_PutVLCBits
401 *
402 * Description:
403 * Checks the type of Escape Mode and put encoded bits for
404 * quantized DCT coefficients.
405 *
406 * Remarks:
407 *
408 * Parameters:
409 * [in]	 ppBitStream      pointer to the pointer to the current byte in
410 *						  the bit stream
411 * [in]	 pBitOffset       pointer to the bit position in the byte pointed
412 *                        by *ppBitStream. Valid within 0 to 7
413 * [in] shortVideoHeader binary flag indicating presence of short_video_header; escape modes 0-3 are used if shortVideoHeader==0,
414 *                           and escape mode 4 is used when shortVideoHeader==1.
415 * [in]  start            start indicates whether the encoding begins with
416 *                        0th element or 1st.
417 * [in]  maxStoreRunL0    Max store possible (considering last and inter/intra)
418 *                        for last = 0
419 * [in]  maxStoreRunL1    Max store possible (considering last and inter/intra)
420 *                        for last = 1
421 * [in]  maxRunForMultipleEntriesL0
422 *                        The run value after which level
423 *                        will be equal to 1:
424 *                        (considering last and inter/intra status) for last = 0
425 * [in]  maxRunForMultipleEntriesL1
426 *                        The run value after which level
427 *                        will be equal to 1:
428 *                        (considering last and inter/intra status) for last = 1
429 * [in]  pRunIndexTableL0 Run Index table defined in
430 *                        armVCM4P2_Huff_Tables_VLC.c for last == 0
431 * [in]  pVlcTableL0      VLC table for last == 0
432 * [in]  pRunIndexTableL1 Run Index table defined in
433 *                        armVCM4P2_Huff_Tables_VLC.c for last == 1
434 * [in]  pVlcTableL1      VLC table for last == 1
435 * [in]  pLMAXTableL0     Level MAX table defined in
436 *                        armVCM4P2_Huff_Tables_VLC.c for last == 0
437 * [in]  pLMAXTableL1     Level MAX table defined in
438 *                        armVCM4P2_Huff_Tables_VLC.c for last == 1
439 * [in]  pRMAXTableL0     Run MAX table defined in
440 *                        armVCM4P2_Huff_Tables_VLC.c for last == 0
441 * [in]  pRMAXTableL1     Run MAX table defined in
442 *                        armVCM4P2_Huff_Tables_VLC.c for last == 1
443 * [out] pQDctBlkCoef     pointer to the quantized DCT coefficient
444 * [out] ppBitStream      *ppBitStream is updated after the block is encoded
445 *                        so that it points to the current byte in the bit
446 *                        stream buffer.
447 * [out] pBitOffset       *pBitOffset is updated so that it points to the
448 *                        current bit position in the byte pointed by
449 *                        *ppBitStream.
450 *
451 * Return Value:
452 * Standard OMXResult result. See enumeration for possible result codes.
453 *
454 */
455
456
457OMXResult armVCM4P2_PutVLCBits (
458              OMX_U8 **ppBitStream,
459              OMX_INT * pBitOffset,
460              const OMX_S16 *pQDctBlkCoef,
461              OMX_INT shortVideoHeader,
462              OMX_U8 start,
463              OMX_U8 maxStoreRunL0,
464              OMX_U8 maxStoreRunL1,
465              OMX_U8  maxRunForMultipleEntriesL0,
466              OMX_U8  maxRunForMultipleEntriesL1,
467              const OMX_U8  * pRunIndexTableL0,
468              const ARM_VLC32 *pVlcTableL0,
469			  const OMX_U8  * pRunIndexTableL1,
470              const ARM_VLC32 *pVlcTableL1,
471              const OMX_U8  * pLMAXTableL0,
472              const OMX_U8  * pLMAXTableL1,
473              const OMX_U8  * pRMAXTableL0,
474              const OMX_U8  * pRMAXTableL1,
475              const OMX_U8  * pZigzagTable
476);
477/**
478 * Function: armVCM4P2_FillVLCBuffer
479 *
480 * Description:
481 * Performs calculating the VLC bits depending on the escape type and insert
482 * the same in the bitstream
483 *
484 * Remarks:
485 *
486 * Parameters:
487 * [in]	 ppBitStream		pointer to the pointer to the current byte in
488 *	                        the bit stream
489 * [in]	 pBitOffset         pointer to the bit position in the byte pointed
490 *                          by *ppBitStream. Valid within 0 to 7
491 * [in]  run                Run value (count of zeros) to be encoded
492 * [in]  level              Level value (non-zero value) to be encoded
493 * [in]  runPlus            Calculated as runPlus = run - (RMAX + 1)
494 * [in]  levelPlus          Calculated as
495 *                          levelPlus = sign(level)*[abs(level) - LMAX]
496 * [in]  fMode              Flag indicating the escape modes
497 * [in]  last               status of the last flag
498 * [in]  maxRunForMultipleEntries
499 *                          The run value after which level will be equal to 1:
500 *                          (considering last and inter/intra status)
501 * [in]  pRunIndexTable     Run Index table defined in
502 *                          armVCM4P2_Huff_tables_VLC.h
503 * [in]  pVlcTable          VLC table defined in armVCM4P2_Huff_tables_VLC.h
504 * [out] ppBitStream		*ppBitStream is updated after the block is encoded
505 *                          so that it points to the current byte in the bit
506 *                          stream buffer.
507 * [out] pBitOffset         *pBitOffset is updated so that it points to the
508 *                          current bit position in the byte pointed by
509 *                          *ppBitStream.
510 *
511 * Return Value:
512 * Standard OMXResult result. See enumeration for possible result codes.
513 *
514 */
515
516OMXResult armVCM4P2_FillVLCBuffer (
517              OMX_U8 **ppBitStream,
518              OMX_INT * pBitOffset,
519              OMX_U32 run,
520              OMX_S16 level,
521			  OMX_U32 runPlus,
522              OMX_S16 levelPlus,
523              OMX_U8  fMode,
524			  OMX_U8  last,
525              OMX_U8  maxRunForMultipleEntries,
526              const OMX_U8  *pRunIndexTable,
527              const ARM_VLC32 *pVlcTable
528);
529
530/**
531 * Function: armVCM4P2_CheckVLCEscapeMode
532 *
533 * Description:
534 * Performs escape mode decision based on the run, run+, level, level+ and
535 * last combinations.
536 *
537 * Remarks:
538 *
539 * Parameters:
540 * [in] run             Run value (count of zeros) to be encoded
541 * [in] level           Level value (non-zero value) to be encoded
542 * [in] runPlus         Calculated as runPlus = run - (RMAX + 1)
543 * [in] levelPlus       Calculated as
544 *                      levelPlus = sign(level)*[abs(level) - LMAX]
545 * [in] maxStoreRun     Max store possible (considering last and inter/intra)
546 * [in] maxRunForMultipleEntries
547 *                      The run value after which level
548 *                      will be equal to 1:
549 *                      (considering last and inter/intra status)
550 * [in] shortVideoHeader binary flag indicating presence of short_video_header; escape modes 0-3 are used if shortVideoHeader==0,
551 *                           and escape mode 4 is used when shortVideoHeader==1.
552 * [in] pRunIndexTable  Run Index table defined in
553 *                      armVCM4P2_Huff_Tables_VLC.c
554 *                      (considering last and inter/intra status)
555 *
556 *
557 * Return Value:
558 * Returns an Escape mode which can take values from 0 to 3
559 * 0 --> no escape mode, 1 --> escape type 1,
560 * 1 --> escape type 2, 3 --> escape type 3, check section 7.4.1.3
561 * in the MPEG ISO standard.
562 *
563 */
564
565OMX_U8 armVCM4P2_CheckVLCEscapeMode(
566     OMX_U32 run,
567     OMX_U32 runPlus,
568     OMX_S16 level,
569     OMX_S16 levelPlus,
570     OMX_U8  maxStoreRun,
571     OMX_U8  maxRunForMultipleEntries,
572     OMX_INT shortVideoHeader,
573     const OMX_U8  *pRunIndexTable
574);
575
576
577/**
578 * Function: armVCM4P2_BlockMatch_Integer
579 *
580 * Description:
581 * Performs a 16x16 block search; estimates motion vector and associated minimum SAD.
582 * Both the input and output motion vectors are represented using half-pixel units, and
583 * therefore a shift left or right by 1 bit may be required, respectively, to match the
584 * input or output MVs with other functions that either generate output MVs or expect
585 * input MVs represented using integer pixel units.
586 *
587 * Remarks:
588 *
589 * Parameters:
590 * [in]	pSrcRefBuf		pointer to the reference Y plane; points to the reference MB that
591 *                    corresponds to the location of the current macroblock in the current
592 *                    plane.
593 * [in]	refWidth		  width of the reference plane
594 * [in]	pRefRect		  pointer to the valid rectangular in reference plane. Relative to image origin.
595 *                    It's not limited to the image boundary, but depended on the padding. For example,
596 *                    if you pad 4 pixels outside the image border, then the value for left border
597 *                    can be -4
598 * [in]	pSrcCurrBuf		pointer to the current macroblock extracted from original plane (linear array,
599 *                    256 entries); must be aligned on an 8-byte boundary.
600 * [in] pCurrPointPos	position of the current macroblock in the current plane
601 * [in] pSrcPreMV		  pointer to predicted motion vector; NULL indicates no predicted MV
602 * [in] pSrcPreSAD		pointer to SAD associated with the predicted MV (referenced by pSrcPreMV)
603 * [in] searchRange		search range for 16X16 integer block,the units of it is full pixel,the search range
604 *                    is the same in all directions.It is in inclusive of the boundary and specified in
605 *                    terms of integer pixel units.
606 * [in] pMESpec			  vendor-specific motion estimation specification structure; must have been allocated
607 *                    and then initialized using omxVCM4P2_MEInit prior to calling the block matching
608 *                    function.
609 * [in] BlockSize     MacroBlock Size i.e either 16x16 or 8x8.
610 * [out]	pDstMV			pointer to estimated MV
611 * [out]	pDstSAD			pointer to minimum SAD
612 *
613 * Return Value:
614 * OMX_Sts_NoErr �C no error.
615 * OMX_Sts_BadArgErr �C bad arguments
616 *
617 */
618
619OMXResult armVCM4P2_BlockMatch_Integer(
620     const OMX_U8 *pSrcRefBuf,
621     OMX_INT refWidth,
622     const OMXRect *pRefRect,
623     const OMX_U8 *pSrcCurrBuf,
624     const OMXVCM4P2Coordinate *pCurrPointPos,
625     const OMXVCMotionVector *pSrcPreMV,
626     const OMX_INT *pSrcPreSAD,
627     void *pMESpec,
628     OMXVCMotionVector *pDstMV,
629     OMX_INT *pDstSAD,
630     OMX_U8 BlockSize
631);
632
633/**
634 * Function: armVCM4P2_BlockMatch_Half
635 *
636 * Description:
637 * Performs a 16x16 block match with half-pixel resolution.  Returns the estimated
638 * motion vector and associated minimum SAD.  This function estimates the half-pixel
639 * motion vector by interpolating the integer resolution motion vector referenced
640 * by the input parameter pSrcDstMV, i.e., the initial integer MV is generated
641 * externally.  The input parameters pSrcRefBuf and pSearchPointRefPos should be
642 * shifted by the winning MV of 16x16 integer search prior to calling BlockMatch_Half_16x16.
643 * The function BlockMatch_Integer_16x16 may be used for integer motion estimation.
644 *
645 * Remarks:
646 *
647 * Parameters:
648 * [in]	pSrcRefBuf		pointer to the reference Y plane; points to the reference MB
649 *                    that corresponds to the location of the current macroblock in
650 *                    the	current plane.
651 * [in]	refWidth		  width of the reference plane
652 * [in]	pRefRect		  reference plane valid region rectangle
653 * [in]	pSrcCurrBuf		pointer to the current macroblock extracted from original plane
654 *                    (linear array, 256 entries); must be aligned on an 8-byte boundary.
655 * [in]	pSearchPointRefPos	position of the starting point for half pixel search (specified
656 *                          in terms of integer pixel units) in the reference plane.
657 * [in]	rndVal			  rounding control bit for half pixel motion estimation;
658 *                    0=rounding control disabled; 1=rounding control enabled
659 * [in]	pSrcDstMV		pointer to the initial MV estimate; typically generated during a prior
660 *                  16X16 integer search and its unit is half pixel.
661 * [in] BlockSize     MacroBlock Size i.e either 16x16 or 8x8.
662 * [out]pSrcDstMV		pointer to estimated MV
663 * [out]pDstSAD			pointer to minimum SAD
664 *
665 * Return Value:
666 * OMX_Sts_NoErr �C no error
667 * OMX_Sts_BadArgErr �C bad arguments
668 *
669 */
670
671OMXResult armVCM4P2_BlockMatch_Half(
672     const OMX_U8 *pSrcRefBuf,
673     OMX_INT refWidth,
674     const OMXRect *pRefRect,
675     const OMX_U8 *pSrcCurrBuf,
676     const OMXVCM4P2Coordinate *pSearchPointRefPos,
677     OMX_INT rndVal,
678     OMXVCMotionVector *pSrcDstMV,
679     OMX_INT *pDstSAD,
680     OMX_U8 BlockSize
681);
682/**
683 * Function: armVCM4P2_PadMV
684 *
685 * Description:
686 * Performs motion vector padding for a macroblock.
687 *
688 * Remarks:
689 *
690 * Parameters:
691 * [in] pSrcDstMV       pointer to motion vector buffer of the current
692 *                              macroblock
693 * [in] pTransp         pointer to transparent status buffer of the
694 *                              current macroblock
695 * [out]    pSrcDstMV       pointer to motion vector buffer in which the
696 *                              motion vectors have been padded
697 * Return Value:
698 * Standard OMXResult result. See enumeration for possible result codes.
699 *
700 */
701
702OMXResult armVCM4P2_PadMV(
703     OMXVCMotionVector * pSrcDstMV,
704     OMX_U8 * pTransp
705);
706
707/*
708 * H.264 Specific Declarations
709 */
710/* Defines */
711#define ARM_M4P10_Q_OFFSET        (15)
712
713
714/* Dequant tables */
715
716extern const OMX_U8 armVCM4P10_PosToVCol4x4[16];
717extern const OMX_U8 armVCM4P10_PosToVCol2x2[4];
718extern const OMX_U8 armVCM4P10_VMatrix[6][3];
719extern const OMX_U32 armVCM4P10_MFMatrix[6][3];
720
721
722/*
723 * Description:
724 * This function perform the work required by the OpenMAX
725 * DecodeCoeffsToPair function and DecodeChromaDCCoeffsToPair.
726 * Since most of the code is common we share it here.
727 *
728 * Parameters:
729 * [in]	ppBitStream		Double pointer to current byte in bit stream buffer
730 * [in]	pOffset			Pointer to current bit position in the byte pointed
731 *								to by *ppBitStream
732 * [in]	sMaxNumCoeff	Maximum number of non-zero coefficients in current
733 *								block (4,15 or 16)
734 * [in]	nTable          Table number (0 to 4) according to the five columns
735 *                      of Table 9-5 in the H.264 spec
736 * [out]	ppBitStream		*ppBitStream is updated after each block is decoded
737 * [out]	pOffset			*pOffset is updated after each block is decoded
738 * [out]	pNumCoeff		Pointer to the number of nonzero coefficients in
739 *								this block
740 * [out]	ppPosCoefbuf	Double pointer to destination residual
741 *								coefficient-position pair buffer
742 * Return Value:
743 * Standard omxError result. See enumeration for possible result codes.
744
745 */
746
747OMXResult armVCM4P10_DecodeCoeffsToPair(
748     const OMX_U8** ppBitStream,
749     OMX_S32* pOffset,
750     OMX_U8* pNumCoeff,
751     OMX_U8**ppPosCoefbuf,
752     OMX_INT nTable,
753     OMX_INT sMaxNumCoeff
754 );
755
756/*
757 * Description:
758 * Perform DC style intra prediction, averaging upper and left block
759 *
760 * Parameters:
761 * [in]	pSrcLeft		Pointer to the buffer of 16 left coefficients:
762 *								p[x, y] (x = -1, y = 0..3)
763 * [in]	pSrcAbove		Pointer to the buffer of 16 above coefficients:
764 *								p[x,y] (x = 0..3, y = -1)
765 * [in]	leftStep		Step of left coefficient buffer
766 * [in]	dstStep			Step of the destination buffer
767 * [in]	availability	Neighboring 16x16 MB availability flag
768 * [out]	pDst			Pointer to the destination buffer
769 *
770 * Return Value:
771 * None
772 */
773
774void armVCM4P10_PredictIntraDC4x4(
775     const OMX_U8* pSrcLeft,
776     const OMX_U8 *pSrcAbove,
777     OMX_U8* pDst,
778     OMX_INT leftStep,
779     OMX_INT dstStep,
780     OMX_S32 availability
781);
782
783/*
784 * Description
785 * Unpack a 4x4 block of coefficient-residual pair values
786 *
787 * Parameters:
788 * [in]	ppSrc	Double pointer to residual coefficient-position pair
789 *						buffer output by CALVC decoding
790 * [out]	ppSrc	*ppSrc is updated to the start of next non empty block
791 * [out]	pDst	Pointer to unpacked 4x4 block
792 */
793
794void armVCM4P10_UnpackBlock4x4(
795     const OMX_U8 **ppSrc,
796     OMX_S16* pDst
797);
798
799/*
800 * Description
801 * Unpack a 2x2 block of coefficient-residual pair values
802 *
803 * Parameters:
804 * [in]	ppSrc	Double pointer to residual coefficient-position pair
805 *						buffer output by CALVC decoding
806 * [out]	ppSrc	*ppSrc is updated to the start of next non empty block
807 * [out]	pDst	Pointer to unpacked 4x4 block
808 */
809
810void armVCM4P10_UnpackBlock2x2(
811     const OMX_U8 **ppSrc,
812     OMX_S16* pDst
813);
814
815/*
816 * Description
817 * Deblock one boundary pixel
818 *
819 * Parameters:
820 * [in]	pQ0         Pointer to pixel q0
821 * [in] Step        Step between pixels q0 and q1
822 * [in] tC0         Edge threshold value
823 * [in] alpha       alpha threshold value
824 * [in] beta        beta threshold value
825 * [in] bS          deblocking strength
826 * [in] ChromaFlag  True for chroma blocks
827 * [out] pQ0        Deblocked pixels
828 *
829 */
830
831void armVCM4P10_DeBlockPixel(
832    OMX_U8 *pQ0,    /* pointer to the pixel q0 */
833    int Step,       /* step between pixels q0 and q1 */
834    int tC0,        /* edge threshold value */
835    int alpha,      /* alpha */
836    int beta,       /* beta */
837    int bS,         /* deblocking strength */
838    int ChromaFlag
839);
840
841/**
842 * Function: armVCM4P10_InterpolateHalfHor_Luma
843 *
844 * Description:
845 * This function performs interpolation for horizontal 1/2-pel positions
846 *
847 * Remarks:
848 *
849 *	[in]	pSrc			Pointer to top-left corner of block used to interpolate
850 													in the reconstructed frame plane
851 *	[in]	iSrcStep	Step of the source buffer.
852 *	[in]	iDstStep	Step of the destination(interpolation) buffer.
853 *	[in]	iWidth		Width of the current block
854 *	[in]	iHeight		Height of the current block
855 *	[out]	pDst	    Pointer to the interpolation buffer of the 1/2-pel
856 *
857 * Return Value:
858 * Standard OMXResult value.
859 *
860 */
861
862OMXResult armVCM4P10_InterpolateHalfHor_Luma(
863        const OMX_U8*		pSrc,
864		OMX_U32 	iSrcStep,
865		OMX_U8* 	pDst,
866		OMX_U32 	iDstStep,
867		OMX_U32 	iWidth,
868		OMX_U32 	iHeight
869);
870
871/**
872 * Function: armVCM4P10_InterpolateHalfVer_Luma
873 *
874 * Description:
875 * This function performs interpolation for vertical 1/2-pel positions
876 * around a full-pel position.
877 *
878 * Remarks:
879 *
880 *	[in]	pSrc			Pointer to top-left corner of block used to interpolate
881 *												in the reconstructed frame plane
882 *	[in]	iSrcStep	Step of the source buffer.
883 *	[in]	iDstStep	Step of the destination(interpolation) buffer.
884 *	[in]	iWidth		Width of the current block
885 *	[in]	iHeight		Height of the current block
886 *	[out]	pDst    	Pointer to the interpolation buffer of the 1/2-pel
887 *
888 * Return Value:
889 * Standard OMXResult value.
890 *
891 */
892
893OMXResult armVCM4P10_InterpolateHalfVer_Luma(
894	 const OMX_U8* 	pSrc,
895	 OMX_U32 	iSrcStep,
896 	 OMX_U8* 	pDst,
897 	 OMX_U32 	iDstStep,
898 	 OMX_U32 	iWidth,
899 	 OMX_U32 	iHeight
900);
901
902/**
903 * Function: armVCM4P10_InterpolateHalfDiag_Luma
904 *
905 * Description:
906 * This function performs interpolation for (1/2, 1/2)  positions
907 * around a full-pel position.
908 *
909 * Remarks:
910 *
911 *  [in]    pSrc        Pointer to top-left corner of block used to interpolate
912 *                      in the reconstructed frame plane
913 *  [in]    iSrcStep    Step of the source buffer.
914 *  [in]    iDstStep    Step of the destination(interpolation) buffer.
915 *  [in]    iWidth      Width of the current block
916 *  [in]    iHeight     Height of the current block
917 *  [out]   pDst        Pointer to the interpolation buffer of the (1/2,1/2)-pel
918 *
919 * Return Value:
920 * Standard OMXResult value.
921 *
922 */
923
924OMXResult armVCM4P10_InterpolateHalfDiag_Luma(
925        const OMX_U8*     pSrc,
926        OMX_U32     iSrcStep,
927        OMX_U8*     pDst,
928        OMX_U32     iDstStep,
929        OMX_U32     iWidth,
930        OMX_U32     iHeight
931);
932
933/*
934 * Description:
935 * Transform Residual 4x4 Coefficients
936 *
937 * Parameters:
938 * [in]  pSrc		Source 4x4 block
939 * [out] pDst		Destination 4x4 block
940 *
941 */
942
943void armVCM4P10_TransformResidual4x4(OMX_S16* pDst, OMX_S16 *pSrc);
944
945/*
946 * Description:
947 * Forward Transform Residual 4x4 Coefficients
948 *
949 * Parameters:
950 * [in]  pSrc		Source 4x4 block
951 * [out] pDst		Destination 4x4 block
952 *
953 */
954
955void armVCM4P10_FwdTransformResidual4x4(OMX_S16* pDst, OMX_S16 *pSrc);
956
957OMX_INT armVCM4P10_CompareMotionCostToMV (
958    OMX_S16  mvX,
959    OMX_S16  mvY,
960    OMXVCMotionVector diffMV,
961    OMX_INT candSAD,
962    OMXVCMotionVector *bestMV,
963    OMX_U32 nLamda,
964    OMX_S32 *pBestCost);
965
966/**
967 * Function: armVCCOMM_SAD
968 *
969 * Description:
970 * This function calculate the SAD for NxM blocks.
971 *
972 * Remarks:
973 *
974 * [in]		pSrcOrg		Pointer to the original block
975 * [in]		iStepOrg	Step of the original block buffer
976 * [in]		pSrcRef		Pointer to the reference block
977 * [in]		iStepRef	Step of the reference block buffer
978 * [in]		iHeight		Height of the block
979 * [in]		iWidth		Width of the block
980 * [out]	pDstSAD		Pointer of result SAD
981 *
982 * Return Value:
983 * Standard OMXResult value.
984 *
985 */
986OMXResult armVCCOMM_SAD(
987	const OMX_U8* 	pSrcOrg,
988	OMX_U32 	iStepOrg,
989	const OMX_U8* 	pSrcRef,
990	OMX_U32 	iStepRef,
991	OMX_S32*	pDstSAD,
992	OMX_U32		iHeight,
993	OMX_U32		iWidth);
994
995/**
996 * Function: armVCCOMM_Average
997 *
998 * Description:
999 * This function calculates the average of two blocks and stores the result.
1000 *
1001 * Remarks:
1002 *
1003 *	[in]	pPred0			Pointer to the top-left corner of reference block 0
1004 *	[in]	pPred1			Pointer to the top-left corner of reference block 1
1005 *	[in]	iPredStep0	    Step of reference block 0
1006 *	[in]	iPredStep1	    Step of reference block 1
1007 *	[in]	iDstStep 		Step of the destination buffer
1008 *	[in]	iWidth			Width of the blocks
1009 *	[in]	iHeight			Height of the blocks
1010 *	[out]	pDstPred		Pointer to the destination buffer
1011 *
1012 * Return Value:
1013 * Standard OMXResult value.
1014 *
1015 */
1016 OMXResult armVCCOMM_Average (
1017	 const OMX_U8* 	    pPred0,
1018	 const OMX_U8* 	    pPred1,
1019	 OMX_U32		iPredStep0,
1020	 OMX_U32		iPredStep1,
1021	 OMX_U8*		pDstPred,
1022	 OMX_U32		iDstStep,
1023	 OMX_U32		iWidth,
1024	 OMX_U32		iHeight
1025);
1026
1027/**
1028 * Function: armVCM4P10_SADQuar
1029 *
1030 * Description:
1031 * This function calculates the SAD between one block (pSrc) and the
1032 * average of the other two (pSrcRef0 and pSrcRef1)
1033 *
1034 * Remarks:
1035 *
1036 * [in]		pSrc				Pointer to the original block
1037 * [in]		pSrcRef0		Pointer to reference block 0
1038 * [in]		pSrcRef1		Pointer to reference block 1
1039 * [in]		iSrcStep 		Step of the original block buffer
1040 * [in]		iRefStep0		Step of reference block 0
1041 * [in]		iRefStep1 	Step of reference block 1
1042 * [in]		iHeight			Height of the block
1043 * [in]		iWidth			Width of the block
1044 * [out]	pDstSAD			Pointer of result SAD
1045 *
1046 * Return Value:
1047 * Standard OMXResult value.
1048 *
1049 */
1050OMXResult armVCM4P10_SADQuar(
1051	const OMX_U8* 	pSrc,
1052    const OMX_U8* 	pSrcRef0,
1053	const OMX_U8* 	pSrcRef1,
1054    OMX_U32 	iSrcStep,
1055    OMX_U32		iRefStep0,
1056    OMX_U32		iRefStep1,
1057    OMX_U32*	pDstSAD,
1058    OMX_U32     iHeight,
1059    OMX_U32     iWidth
1060);
1061
1062/**
1063 * Function: armVCM4P10_Interpolate_Chroma
1064 *
1065 * Description:
1066 * This function performs interpolation for chroma components.
1067 *
1068 * Remarks:
1069 *
1070 *  [in]    pSrc            Pointer to top-left corner of block used to
1071 *                                              interpolate in the reconstructed frame plane
1072 *  [in]    iSrcStep    Step of the source buffer.
1073 *  [in]    iDstStep    Step of the destination(interpolation) buffer.
1074 *  [in]    iWidth      Width of the current block
1075 *  [in]    iHeight     Height of the current block
1076 *  [in]    dx              Fractional part of horizontal motion vector
1077 *                                              component in 1/8 pixel unit (0~7)
1078 *  [in]    dy              Fractional part of vertical motion vector
1079 *                                              component in 1/8 pixel unit (0~7)
1080 *  [out]   pDst            Pointer to the interpolation buffer
1081 *
1082 * Return Value:
1083 * Standard OMXResult value.
1084 *
1085 */
1086 OMXResult armVCM4P10_Interpolate_Chroma(
1087        OMX_U8      *pSrc,
1088        OMX_U32     iSrcStep,
1089        OMX_U8      *pDst,
1090        OMX_U32     iDstStep,
1091        OMX_U32     iWidth,
1092        OMX_U32     iHeight,
1093        OMX_U32     dx,
1094        OMX_U32     dy
1095);
1096
1097/**
1098 * Function: armVCM4P10_Interpolate_Luma
1099 *
1100 * Description:
1101 * This function performs interpolation for luma components.
1102 *
1103 * Remarks:
1104 *
1105 *  [in]    pSrc            Pointer to top-left corner of block used to
1106 *                                              interpolate in the reconstructed frame plane
1107 *  [in]    iSrcStep    Step of the source buffer.
1108 *  [in]    iDstStep    Step of the destination(interpolation) buffer.
1109 *  [in]    iWidth      Width of the current block
1110 *  [in]    iHeight     Height of the current block
1111 *  [in]    dx              Fractional part of horizontal motion vector
1112 *                                              component in 1/4 pixel unit (0~3)
1113 *  [in]    dy              Fractional part of vertical motion vector
1114 *                                              component in 1/4 pixel unit (0~3)
1115 *  [out]   pDst            Pointer to the interpolation buffer
1116 *
1117 * Return Value:
1118 * Standard OMXResult value.
1119 *
1120 */
1121
1122 OMXResult armVCM4P10_Interpolate_Luma(
1123     const OMX_U8     *pSrc,
1124     OMX_U32    iSrcStep,
1125     OMX_U8     *pDst,
1126     OMX_U32    iDstStep,
1127     OMX_U32    iWidth,
1128     OMX_U32    iHeight,
1129     OMX_U32    dx,
1130     OMX_U32    dy
1131);
1132
1133/**
1134 * Function: omxVCH264_DequantTransformACFromPair_U8_S16_C1_DLx
1135 *
1136 * Description:
1137 * Reconstruct the 4x4 residual block from coefficient-position pair buffer,
1138 * perform dequantisation and integer inverse transformation for 4x4 block of
1139 * residuals and update the pair buffer pointer to next non-empty block.
1140 *
1141 * Remarks:
1142 *
1143 * Parameters:
1144 * [in]	ppSrc		Double pointer to residual coefficient-position
1145 *							pair buffer output by CALVC decoding
1146 * [in]	pDC			Pointer to the DC coefficient of this block, NULL
1147 *							if it doesn't exist
1148 * [in]	QP			Quantization parameter
1149 * [in] AC          Flag indicating if at least one non-zero coefficient exists
1150 * [out]	pDst		pointer to the reconstructed 4x4 block data
1151 *
1152 * Return Value:
1153 * Standard omxError result. See enumeration for possible result codes.
1154 *
1155 */
1156
1157OMXResult armVCM4P10_DequantTransformACFromPair_U8_S16_C1_DLx(
1158     OMX_U8 **ppSrc,
1159     OMX_S16 *pDst,
1160     OMX_INT QP,
1161     OMX_S16* pDC,
1162     int AC
1163);
1164
1165#endif  /*_armVideo_H_*/
1166
1167/*End of File*/
1168
1169