1 /*****************************************************************************
2 * vdec_motion.c : motion compensation routines
4 *****************************************************************************/
6 /*****************************************************************************
8 *****************************************************************************/
19 #include "vlc_thread.h"
22 #include "debug.h" /* ?? temporaire, requis par netlist.h */
25 #include "input_netlist.h"
26 #include "decoder_fifo.h"
28 #include "video_output.h"
30 #include "vdec_idct.h"
31 #include "video_decoder.h"
32 #include "vdec_motion.h"
34 #include "vpar_blocks.h"
35 #include "vpar_headers.h"
36 #include "vpar_synchro.h"
37 #include "video_parser.h"
38 #include "video_fifo.h"
40 /*****************************************************************************
41 * vdec_MotionComponent : last stage of motion compensation
42 *****************************************************************************/
43 static __inline__ void MotionComponent(
44 yuv_data_t * p_src, /* source block */
45 yuv_data_t * p_dest, /* dest block */
46 int i_width, /* (explicit) width of block */
47 int i_height, /* (explicit) height of block */
48 int i_stride, /* number of coeffs to jump
49 * between each predicted line */
50 int i_step, /* number of coeffs to jump to
51 * go to the next line of the
53 int i_select, /* half-pel vectors */
54 boolean_t b_average /* (explicit) averaging of several
57 int i_x, i_y, i_x1, i_y1;
62 /* Please note that b_average will be expanded at compile time */
67 /* !xh, !yh, !average */
68 for( i_y = 0; i_y < i_height; i_y += 4 )
70 for( i_y1 = 0; i_y1 < 4; i_y1++ )
72 for( i_x = 0; i_x < i_width; i_x += 8 )
74 for( i_x1 = 0; i_x1 < 8; i_x1++ )
76 p_dest[i_x+i_x1] = p_src[i_x+i_x1];
86 /* xh, !yh, !average */
87 for( i_y = 0; i_y < i_height; i_y += 4 )
89 for( i_y1 = 0; i_y1 < 4; i_y1++ )
91 for( i_x = 0; i_x < i_width; i_x += 8 )
93 for( i_x1 = 0; i_x1 < 8; i_x1++ )
95 p_dest[i_x+i_x1] = (unsigned int)(p_src[i_x+i_x1]
96 + p_src[i_x+i_x1 + 1] + 1)
107 /* !xh, yh, !average */
108 for( i_y = 0; i_y < i_height; i_y += 4 )
110 for( i_y1 = 0; i_y1 < 4; i_y1++ )
112 for( i_x = 0; i_x < i_width; i_x += 8 )
114 for( i_x1 = 0; i_x1 < 8; i_x1++ )
116 p_dest[i_x+i_x1] = (unsigned int)(p_src[i_x+i_x1] + 1
117 + p_src[i_x+i_x1 + i_step])
128 /* xh, yh, !average (3) */
129 for( i_y = 0; i_y < i_height; i_y += 4 )
131 for( i_y1 = 0; i_y1 < 4; i_y1++ )
133 for( i_x = 0; i_x < i_width; i_x += 8 )
135 for( i_x1 = 0; i_x1 < 8; i_x1++ )
140 + p_src[i_x+i_x1 + 1]
141 + p_src[i_x+i_x1 + i_step]
142 + p_src[i_x+i_x1 + i_step + 1]
160 /* !xh, !yh, average */
161 for( i_y = 0; i_y < i_height; i_y += 4 )
163 for( i_y1 = 0; i_y1 < 4; i_y1++ )
165 for( i_x = 0; i_x < i_width; i_x += 8 )
167 for( i_x1 = 0; i_x1 < 8; i_x1++ )
169 i_dummy = p_dest[i_x + i_x1] + p_src[i_x + i_x1];
170 p_dest[i_x + i_x1] = (i_dummy + 1) >> 1;
180 /* xh, !yh, average */
181 for( i_y = 0; i_y < i_height; i_y += 4 )
183 for( i_y1 = 0; i_y1 < 4; i_y1++ )
185 for( i_x = 0; i_x < i_width; i_x += 8 )
187 for( i_x1 = 0; i_x1 < 8; i_x1++ )
189 i_dummy = p_dest[i_x+i_x1]
190 + ((unsigned int)(p_src[i_x+i_x1]
191 + p_src[i_x+i_x1 + 1] + 1) >> 1);
192 p_dest[i_x + i_x1] = (i_dummy + 1) >> 1;
202 /* !xh, yh, average */
203 for( i_y = 0; i_y < i_height; i_y += 4 )
205 for( i_y1 = 0; i_y1 < 4; i_y1++ )
207 for( i_x = 0; i_x < i_width; i_x += 8 )
209 for( i_x1 = 0; i_x1 < 8; i_x1++ )
211 i_dummy = p_dest[i_x+i_x1]
212 + ((unsigned int)(p_src[i_x+i_x1] + 1
213 + p_src[i_x+i_x1 + i_step]) >> 1);
214 p_dest[i_x + i_x1] = (i_dummy + 1) >> 1;
224 /* xh, yh, average */
225 for( i_y = 0; i_y < i_height; i_y += 4 )
227 for( i_y1 = 0; i_y1 < 4; i_y1++ )
229 for( i_x = 0; i_x < i_width; i_x += 8 )
231 for( i_x1 = 0; i_x1 < 8; i_x1++ )
233 i_dummy = p_dest[i_x+i_x1]
236 + p_src[i_x+i_x1 + 1]
237 + p_src[i_x+i_x1 + i_step]
238 + p_src[i_x+i_x1 + i_step + 1]
240 p_dest[i_x + i_x1] = (i_dummy + 1) >> 1;
252 /*****************************************************************************
253 * Motion420 : motion compensation for a 4:2:0 macroblock
254 *****************************************************************************/
255 static __inline__ void Motion420(
256 macroblock_t * p_mb, /* destination macroblock */
257 picture_t * p_source, /* source picture */
258 boolean_t b_source_field, /* source field */
259 boolean_t b_dest_field, /* destination field */
260 int i_mv_x, int i_mv_y, /* motion vector coordinates,
262 int i_l_stride, /* number of coeffs to jump to
263 * go to the next predicted
266 int i_height, /* height of the block to
267 * predict, in luminance
269 int i_offset, /* position of the first
270 * predicted line (explicit) */
271 boolean_t b_average /* (explicit) averaging of
272 * several predictions */ )
274 /* Temporary variables to avoid recalculating things twice */
275 int i_source_offset, i_dest_offset, i_c_height, i_c_select;
277 i_source_offset = (p_mb->i_l_x + (i_mv_x >> 1))
278 + (p_mb->i_motion_l_y + i_offset
281 * p_mb->p_picture->i_width;
282 if( i_source_offset >= p_source->i_width * p_source->i_height )
284 fprintf( stderr, "vdec error: bad motion vector\n" );
289 MotionComponent( /* source */
290 p_source->p_y + i_source_offset,
294 + (p_mb->i_motion_l_y + b_dest_field)
295 * p_mb->p_picture->i_width,
296 /* prediction width and height */
299 i_l_stride, p_mb->i_l_stride,
301 ((i_mv_y & 1) << 1) | (i_mv_x & 1),
304 i_source_offset = (p_mb->i_c_x + ((i_mv_x/2) >> 1))
305 + ((p_mb->i_motion_c_y + (i_offset >> 1)
308 * p_mb->p_picture->i_chroma_width;
309 if( i_source_offset >= (p_source->i_width * p_source->i_height) / 4 )
311 fprintf( stderr, "vdec error: bad motion vector\n" );
315 i_dest_offset = (p_mb->i_c_x)
316 + (p_mb->i_motion_c_y + b_dest_field)
317 * p_mb->p_picture->i_chroma_width;
318 i_c_height = i_height >> 1;
319 i_c_select = (((i_mv_y/2) & 1) << 1) | ((i_mv_x/2) & 1);
322 MotionComponent( p_source->p_u
326 8, i_c_height, i_c_stride, p_mb->i_c_stride,
327 i_c_select, b_average );
330 MotionComponent( p_source->p_v
334 8, i_c_height, i_c_stride, p_mb->i_c_stride,
335 i_c_select, b_average );
338 /*****************************************************************************
339 * Motion422 : motion compensation for a 4:2:2 macroblock
340 *****************************************************************************/
341 static __inline__ void Motion422(
342 macroblock_t * p_mb, /* destination macroblock */
343 picture_t * p_source, /* source picture */
344 boolean_t b_source_field, /* source field */
345 boolean_t b_dest_field, /* destination field */
346 int i_mv_x, int i_mv_y, /* motion vector coordinates,
348 int i_l_stride, /* number of coeffs to jump to
349 * go to the next predicted
352 int i_height, /* height of the block to
353 * predict, in luminance
355 int i_offset, /* position of the first
356 * predicted line (explicit) */
357 boolean_t b_average /* (explicit) averaging of
358 * several predictions */ )
361 int i_source_offset, i_dest_offset, i_c_select;
364 MotionComponent( /* source */
366 + (p_mb->i_l_x + (i_mv_x >> 1))
367 + (p_mb->i_motion_l_y + i_offset
370 * p_mb->p_picture->i_width,
374 + (p_mb->i_motion_l_y + b_dest_field)
375 * p_mb->p_picture->i_width,
376 /* prediction width and height */
379 i_l_stride, p_mb->i_l_stride,
381 ((i_mv_y & 1) << 1) | (i_mv_x & 1),
384 i_source_offset = (p_mb->i_c_x + ((i_mv_x/2) >> 1))
385 + ((p_mb->i_motion_c_y + (i_offset)
388 * p_mb->p_picture->i_chroma_width;
389 i_dest_offset = (p_mb->i_c_x)
390 + (p_mb->i_motion_c_y + b_dest_field)
391 * p_mb->p_picture->i_chroma_width;
392 i_c_select = ((i_mv_y & 1) << 1) | ((i_mv_x/2) & 1);
395 MotionComponent( p_source->p_u
399 8, i_height, i_c_stride, p_mb->i_c_stride,
400 i_c_select, b_average );
403 MotionComponent( p_source->p_v
407 8, i_height, i_c_stride, p_mb->i_c_stride,
408 i_c_select, b_average );
412 /*****************************************************************************
413 * Motion444 : motion compensation for a 4:4:4 macroblock
414 *****************************************************************************/
415 static __inline__ void Motion444(
416 macroblock_t * p_mb, /* destination macroblock */
417 picture_t * p_source, /* source picture */
418 boolean_t b_source_field, /* source field */
419 boolean_t b_dest_field, /* destination field */
420 int i_mv_x, int i_mv_y, /* motion vector coordinates,
422 int i_l_stride, /* number of coeffs to jump to
423 * go to the next predicted
426 int i_height, /* height of the block to
427 * predict, in luminance
429 int i_offset, /* position of the first
430 * predicted line (explicit) */
431 boolean_t b_average /* (explicit) averaging of
432 * several predictions */ )
435 int i_source_offset, i_dest_offset, i_select;
437 i_source_offset = (p_mb->i_l_x + (i_mv_x >> 1))
438 + (p_mb->i_motion_l_y + i_offset
441 * p_mb->p_picture->i_width;
442 i_dest_offset = (p_mb->i_l_x)
443 + (p_mb->i_motion_l_y + b_dest_field)
444 * p_mb->p_picture->i_width;
445 i_select = ((i_mv_y & 1) << 1) | (i_mv_x & 1);
449 MotionComponent( p_source->p_y
453 16, i_height, i_l_stride, p_mb->i_l_stride,
454 i_select, b_average );
457 MotionComponent( p_source->p_u
461 16, i_height, i_l_stride, p_mb->i_l_stride,
462 i_select, b_average );
465 MotionComponent( p_source->p_v
469 16, i_height, i_l_stride, p_mb->i_l_stride,
470 i_select, b_average );
474 /*****************************************************************************
475 * vdec_MotionFieldField : motion compensation for field motion type (field)
476 *****************************************************************************/
477 #define FIELDFIELD( MOTION ) \
478 picture_t * p_pred; \
480 if( p_mb->i_mb_type & MB_MOTION_FORWARD ) \
482 if( p_mb->b_P_second \
483 && (p_mb->b_motion_field != p_mb->ppi_field_select[0][0]) )\
484 p_pred = p_mb->p_picture; \
486 p_pred = p_mb->p_forward; \
488 MOTION( p_mb, p_pred, p_mb->ppi_field_select[0][0], \
489 p_mb->b_motion_field, \
490 p_mb->pppi_motion_vectors[0][0][0], \
491 p_mb->pppi_motion_vectors[0][0][1], \
492 p_mb->i_l_stride, p_mb->i_c_stride, 16, 0, 0 ); \
494 if( p_mb->i_mb_type & MB_MOTION_BACKWARD ) \
496 MOTION( p_mb, p_mb->p_backward, \
497 p_mb->ppi_field_select[0][1], \
498 p_mb->b_motion_field, \
499 p_mb->pppi_motion_vectors[0][1][0], \
500 p_mb->pppi_motion_vectors[0][1][1], \
501 p_mb->i_l_stride, p_mb->i_c_stride, 16, 0, 1 ); \
504 else /* MB_MOTION_BACKWARD */ \
506 MOTION( p_mb, p_mb->p_backward, p_mb->ppi_field_select[0][1], \
507 p_mb->b_motion_field, \
508 p_mb->pppi_motion_vectors[0][1][0], \
509 p_mb->pppi_motion_vectors[0][1][1], \
510 p_mb->i_l_stride, p_mb->i_c_stride, 16, 0, 0 ); \
514 void vdec_MotionFieldField420( macroblock_t * p_mb )
516 FIELDFIELD( Motion420 )
519 void vdec_MotionFieldField422( macroblock_t * p_mb )
521 //FIELDFIELD( Motion422 )
524 void vdec_MotionFieldField444( macroblock_t * p_mb )
526 //FIELDFIELD( Motion444 )
529 /*****************************************************************************
530 * vdec_MotionField16x8XXX : motion compensation for 16x8 motion type (field)
531 *****************************************************************************/
532 #define FIELD16X8( MOTION ) \
534 picture_t * p_pred; \
536 if( p_mb->i_mb_type & MB_MOTION_FORWARD ) \
538 if( p_mb->b_P_second \
539 && (p_mb->b_motion_field != p_mb->ppi_field_select[0][0]) )\
540 p_pred = p_mb->p_picture; \
542 p_pred = p_mb->p_forward; \
544 MOTION( p_mb, p_pred, p_mb->ppi_field_select[0][0], \
545 p_mb->b_motion_field, \
546 p_mb->pppi_motion_vectors[0][0][0], \
547 p_mb->pppi_motion_vectors[0][0][1], \
548 p_mb->i_l_stride, p_mb->i_c_stride, 8, 0, 0 ); \
550 if( p_mb->b_P_second \
551 && (p_mb->b_motion_field != p_mb->ppi_field_select[1][0]) )\
552 p_pred = p_mb->p_picture; \
554 p_pred = p_mb->p_forward; \
556 MOTION( p_mb, p_pred, p_mb->ppi_field_select[1][0], \
557 p_mb->b_motion_field, \
558 p_mb->pppi_motion_vectors[1][0][0], \
559 p_mb->pppi_motion_vectors[1][0][1], \
560 p_mb->i_l_stride, p_mb->i_c_stride, 8, 8, 0 ); \
562 if( p_mb->i_mb_type & MB_MOTION_BACKWARD ) \
564 MOTION( p_mb, p_mb->p_backward, \
565 p_mb->ppi_field_select[0][1], \
566 p_mb->b_motion_field, \
567 p_mb->pppi_motion_vectors[0][1][0], \
568 p_mb->pppi_motion_vectors[0][1][1], \
569 p_mb->i_l_stride, p_mb->i_c_stride, 8, 0, 1 ); \
571 MOTION( p_mb, p_mb->p_backward, \
572 p_mb->ppi_field_select[1][1], \
573 p_mb->b_motion_field, \
574 p_mb->pppi_motion_vectors[1][1][0], \
575 p_mb->pppi_motion_vectors[1][1][1], \
576 p_mb->i_l_stride, p_mb->i_c_stride, 8, 8, 1 ); \
580 else /* MB_MOTION_BACKWARD */ \
582 MOTION( p_mb, p_mb->p_backward, p_mb->ppi_field_select[0][1], \
583 p_mb->b_motion_field, \
584 p_mb->pppi_motion_vectors[0][1][0], \
585 p_mb->pppi_motion_vectors[0][1][1], \
586 p_mb->i_l_stride, p_mb->i_c_stride, 8, 0, 0 ); \
588 MOTION( p_mb, p_mb->p_backward, p_mb->ppi_field_select[1][1], \
589 p_mb->b_motion_field, \
590 p_mb->pppi_motion_vectors[1][1][0], \
591 p_mb->pppi_motion_vectors[1][1][1], \
592 p_mb->i_l_stride, p_mb->i_c_stride, 8, 8, 0 ); \
596 void vdec_MotionField16x8420( macroblock_t * p_mb )
598 FIELD16X8( Motion420 )
601 void vdec_MotionField16x8422( macroblock_t * p_mb )
603 //FIELD16X8( Motion422 )
606 void vdec_MotionField16x8444( macroblock_t * p_mb )
608 //FIELD16X8( Motion444 )
611 /*****************************************************************************
612 * vdec_MotionFieldDMVXXX : motion compensation for dmv motion type (field)
613 *****************************************************************************/
614 #define FIELDDMV( MOTION ) \
616 /* This is necessarily a MOTION_FORWARD only macroblock, in a P \
618 picture_t * p_pred; \
620 /* predict from field of same parity */ \
621 MOTION( p_mb, p_mb->p_forward, \
622 p_mb->b_motion_field, p_mb->b_motion_field, \
623 p_mb->pppi_motion_vectors[0][0][0], \
624 p_mb->pppi_motion_vectors[0][0][1], \
625 p_mb->i_l_stride, p_mb->i_c_stride, 16, 0, 0 ); \
627 if( p_mb->b_P_second ) \
628 p_pred = p_mb->p_picture; \
630 p_pred = p_mb->p_forward; \
632 /* predict from field of opposite parity */ \
633 MOTION( p_mb, p_pred, !p_mb->b_motion_field, p_mb->b_motion_field, \
634 p_mb->ppi_dmv[0][0], p_mb->ppi_dmv[0][1], \
635 p_mb->i_l_stride, p_mb->i_c_stride, 16, 0, 1 ); \
638 void vdec_MotionFieldDMV420( macroblock_t * p_mb )
640 FIELDDMV( Motion420 )
643 void vdec_MotionFieldDMV422( macroblock_t * p_mb )
645 //FIELDDMV( Motion422 )
648 void vdec_MotionFieldDMV444( macroblock_t * p_mb )
650 //FIELDDMV( Motion444 )
653 /*****************************************************************************
654 * vdec_MotionFrameFrameXXX : motion compensation for frame motion type (frame)
655 *****************************************************************************/
656 #define FRAMEFRAME( MOTION ) \
658 if( p_mb->i_mb_type & MB_MOTION_FORWARD ) \
660 MOTION( p_mb, p_mb->p_forward, 0, 0, \
661 p_mb->pppi_motion_vectors[0][0][0], \
662 p_mb->pppi_motion_vectors[0][0][1], \
663 p_mb->i_l_stride, p_mb->i_c_stride, 16, 0, 0 ); \
665 if( p_mb->i_mb_type & MB_MOTION_BACKWARD ) \
667 MOTION( p_mb, p_mb->p_backward, 0, 0, \
668 p_mb->pppi_motion_vectors[0][1][0], \
669 p_mb->pppi_motion_vectors[0][1][1], \
670 p_mb->i_l_stride, p_mb->i_c_stride, 16, 0, 1 ); \
674 else /* MB_MOTION_BACKWARD */ \
676 MOTION( p_mb, p_mb->p_backward, 0, 0, \
677 p_mb->pppi_motion_vectors[0][1][0], \
678 p_mb->pppi_motion_vectors[0][1][1], \
679 p_mb->i_l_stride, p_mb->i_c_stride, 16, 0, 0 ); \
683 void vdec_MotionFrameFrame420( macroblock_t * p_mb )
685 FRAMEFRAME( Motion420 )
688 void vdec_MotionFrameFrame422( macroblock_t * p_mb )
690 //FRAMEFRAME( Motion422 )
693 void vdec_MotionFrameFrame444( macroblock_t * p_mb )
695 //FRAMEFRAME( Motion444 )
698 /*****************************************************************************
699 * vdec_MotionFrameFieldXXX : motion compensation for field motion type (frame)
700 *****************************************************************************/
701 #define FRAMEFIELD( MOTION ) \
703 int i_l_stride = p_mb->i_l_stride << 1; \
704 int i_c_stride = p_mb->i_c_stride << 1; \
706 if( p_mb->i_mb_type & MB_MOTION_FORWARD ) \
708 MOTION( p_mb, p_mb->p_forward, p_mb->ppi_field_select[0][0], 0, \
709 p_mb->pppi_motion_vectors[0][0][0], \
710 p_mb->pppi_motion_vectors[0][0][1], \
711 i_l_stride, i_c_stride, 8, 0, 0 ); \
713 MOTION( p_mb, p_mb->p_forward, p_mb->ppi_field_select[1][0], 1, \
714 p_mb->pppi_motion_vectors[1][0][0], \
715 p_mb->pppi_motion_vectors[1][0][1], \
716 i_l_stride, i_c_stride, 8, 0, 0 ); \
718 if( p_mb->i_mb_type & MB_MOTION_BACKWARD ) \
720 MOTION( p_mb, p_mb->p_backward, \
721 p_mb->ppi_field_select[0][1], 0, \
722 p_mb->pppi_motion_vectors[0][1][0], \
723 p_mb->pppi_motion_vectors[0][1][1], \
724 i_l_stride, i_c_stride, 8, 0, 1 ); \
726 MOTION( p_mb, p_mb->p_backward, \
727 p_mb->ppi_field_select[1][1], 1, \
728 p_mb->pppi_motion_vectors[1][1][0], \
729 p_mb->pppi_motion_vectors[1][1][1], \
730 i_l_stride, i_c_stride, 8, 0, 1 ); \
734 else /* MB_MOTION_BACKWARD only */ \
736 MOTION( p_mb, p_mb->p_backward, p_mb->ppi_field_select[0][1], 0,\
737 p_mb->pppi_motion_vectors[0][1][0], \
738 p_mb->pppi_motion_vectors[0][1][1], \
739 i_l_stride, i_c_stride, 8, 0, 0 ); \
741 MOTION( p_mb, p_mb->p_backward, p_mb->ppi_field_select[1][1], 1,\
742 p_mb->pppi_motion_vectors[1][1][0], \
743 p_mb->pppi_motion_vectors[1][1][1], \
744 i_l_stride, i_c_stride, 8, 0, 0 ); \
748 void vdec_MotionFrameField420( macroblock_t * p_mb )
750 FRAMEFIELD( Motion420 )
753 void vdec_MotionFrameField422( macroblock_t * p_mb )
755 //FRAMEFIELD( Motion422 )
758 void vdec_MotionFrameField444( macroblock_t * p_mb )
760 //FRAMEFIELD( Motion444 )
763 /*****************************************************************************
764 * vdec_MotionFrameDMVXXX : motion compensation for dmv motion type (frame)
765 *****************************************************************************/
766 #define FRAMEDMV( MOTION ) \
768 /* This is necessarily a MOTION_FORWARD only macroblock, in a P \
771 /* predict top field from top field */ \
772 MOTION( p_mb, p_mb->p_forward, 0, 0, \
773 p_mb->pppi_motion_vectors[0][0][0], \
774 p_mb->pppi_motion_vectors[0][0][1], \
776 p_mb->i_l_stride << 1, p_mb->i_c_stride << 1, 8, 0, 0 ); \
778 /* predict and add to top field from bottom field */ \
779 MOTION( p_mb, p_mb->p_forward, 1, 0, \
780 p_mb->ppi_dmv[0][0], p_mb->ppi_dmv[0][1], \
781 p_mb->i_l_stride << 1, p_mb->i_c_stride << 1, 8, 0, 1 ); \
783 /* predict bottom field from bottom field */ \
784 MOTION( p_mb, p_mb->p_forward, 1, 1, \
785 p_mb->pppi_motion_vectors[0][0][0], \
786 p_mb->pppi_motion_vectors[0][0][1], \
788 p_mb->i_l_stride << 1, p_mb->i_c_stride << 1, 8, 0, 0 ); \
790 /* predict and add to bottom field from top field */ \
791 MOTION( p_mb, p_mb->p_forward, 1, 0, \
792 p_mb->ppi_dmv[1][0], p_mb->ppi_dmv[1][1], \
793 p_mb->i_l_stride << 1, p_mb->i_c_stride << 1, 8, 0, 1 ); \
796 void vdec_MotionFrameDMV420( macroblock_t * p_mb )
798 FRAMEDMV( Motion420 )
801 void vdec_MotionFrameDMV422( macroblock_t * p_mb )
803 //FRAMEDMV( Motion422 )
806 void vdec_MotionFrameDMV444( macroblock_t * p_mb )
808 //FRAMEDMV( Motion444 )