23static void ( *LumaOp[ 8 ] ) ( u8* arg1, u16* arg2,
int arg3,
int arg4,
int var1,
int ta ) = {
24 _MPEG_put_luma, _MPEG_put_luma_X, _MPEG_put_luma_Y, _MPEG_put_luma_XY,
25 _MPEG_avg_luma, _MPEG_avg_luma_X, _MPEG_avg_luma_Y, _MPEG_avg_luma_XY
28static void ( *ChromaOp[ 8 ] ) ( u8* arg1, u16* arg2,
int arg3,
int arg4,
int var1,
int ta ) = {
29 _MPEG_put_chroma, _MPEG_put_chroma_X, _MPEG_put_chroma_Y, _MPEG_put_chroma_XY,
30 _MPEG_avg_chroma, _MPEG_avg_chroma_X, _MPEG_avg_chroma_Y, _MPEG_avg_chroma_XY
34 _MPEG_put_block_il, _MPEG_put_block_fr, _MPEG_put_block_fl
37static void ( *AddBlockOp[ 2 ][ 2 ] ) (
_MPEGMotions* ) = {
38 { _MPEG_add_block_frfr, _MPEG_add_block_frfl },
39 { _MPEG_add_block_ilfl, _MPEG_add_block_ilfl }
42static float s_FrameRate[ 16 ] = {
43 0.0F, ( ( 23.0F * 1000.0F ) / 1001.0F ),
44 24.0F, 25.0F, ( ( 30.0F * 1000.0F ) / 1001.0F ),
45 30.0F, 50.0F, ( ( 60.0F * 1000.0F ) / 1001.0F ),
46 60.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F
50static void* s_pInitCBParam;
52static void* _init_seq (
void );
53static void _destroy_seq (
void );
55static int _get_hdr (
void );
57static void _seq_header (
void );
58static void _gop_header (
void );
59static void _pic_header (
void );
60static void _ext_and_ud (
void );
61static void _ext_unknown (
void );
62static void _ext_seq (
void );
63static void _ext_seq_dsp (
void );
64static void _ext_qnt_mtx (
void );
65static void _ext_cpy_rgt (
void );
66static void _ext_seq_scl (
void );
67static void _ext_pic_dsp (
void );
68static void _ext_pic_cod (
void );
69static void _ext_pic_ssc (
void );
70static void _ext_pic_tsc (
void );
71static void _xtra_bitinf (
void );
73static int _get_next_picture (
void*, s64* );
74static int _get_first_picture (
void*, s64* );
76int ( *MPEG_Picture ) (
void*, s64* );
78static void ( *DoMC ) ( void );
80static void _mpeg12_picture_data (
void );
81static int _mpeg12_slice (
int );
82static int _mpeg12_dec_mb (
int*,
int*,
int[ 2 ][ 2 ][ 2 ],
int [ 2 ][ 2 ],
int[ 2 ] );
85 int ( *apDataCB ) (
void* ),
void* apDataCBParam,
90 memset ( &s_MPEG12Ctx, 0,
sizeof ( s_MPEG12Ctx ) );
92 _MPEG_Initialize ( &s_MPEG12Ctx, apDataCB, apDataCBParam, &s_MPEG12Ctx.m_SI.m_fEOF );
95 s_pInitCBParam = apInitCBParam;
98 s_MPEG12Ctx.m_SI.m_FrameCnt = 0;
99 s_MPEG12Ctx.m_SI.m_fEOF = 0;
100 s_MPEG12Ctx.m_SI.m_Profile = -1;
101 s_MPEG12Ctx.m_SI.m_Level = -1;
102 s_MPEG12Ctx.m_SI.m_ChromaFmt = MPEG_CHROMA_FORMAT_420;
103 s_MPEG12Ctx.m_SI.m_VideoFmt = MPEG_VIDEO_FORMAT_UNSPEC;
104 s_MPEG12Ctx.m_fMPEG2 = 0;
106 s_MPEG12Ctx.m_MC[ 0 ].m_pSPRBlk = (
void* )0x70000000;
107 s_MPEG12Ctx.m_MC[ 0 ].m_pSPRRes = (
void* )0x70000300;
108 s_MPEG12Ctx.m_MC[ 0 ].m_pSPRMC = (
void* )0x70000600;
109 s_MPEG12Ctx.m_MC[ 1 ].m_pSPRBlk = (
void* )0x70001E00;
110 s_MPEG12Ctx.m_MC[ 1 ].m_pSPRRes = (
void* )0x70002100;
111 s_MPEG12Ctx.m_MC[ 1 ].m_pSPRMC = (
void* )0x70002400;
113 MPEG_Picture = _get_first_picture;
117void MPEG_Destroy (
void ) {
124static void* _init_seq (
void ) {
126 int lMBWidth, lMBHeight;
128 if ( !s_MPEG12Ctx.m_fMPEG2 ) {
129 s_MPEG12Ctx.m_fProgSeq = 1;
130 s_MPEG12Ctx.m_PictStruct = _MPEG_PS_FRAME;
131 s_MPEG12Ctx.m_fFPFrmDCT = 1;
134 lMBWidth = ( s_MPEG12Ctx.m_SI.m_Width + 15 ) / 16;
135 lMBHeight = s_MPEG12Ctx.m_fMPEG2 && !s_MPEG12Ctx.m_fProgSeq ? 2 * ( ( s_MPEG12Ctx.m_SI.m_Height + 31 ) / 32 )
136 : ( s_MPEG12Ctx.m_SI.m_Height + 15 ) / 16;
138 if ( lMBWidth != s_MPEG12Ctx.m_MBWidth ||
139 lMBHeight != s_MPEG12Ctx.m_MBHeight
144 if ( s_MPEG12Ctx.m_pFwdFrame ) _destroy_seq ();
146 s_MPEG12Ctx.m_MBWidth = lMBWidth;
147 s_MPEG12Ctx.m_MBHeight = lMBHeight;
148 s_MPEG12Ctx.m_SI.m_Width = lMBWidth << 4;
149 s_MPEG12Ctx.m_SI.m_Height = lMBHeight << 4;
151 s_MPEG12Ctx.m_MBStride = lMBWidth * sizeof ( _MPEGMacroBlock8 );
153 lSize = lMBWidth * ( lMBHeight + 1 ) * sizeof ( _MPEGMacroBlock8 ) + sizeof ( _MPEGMacroBlock8 );
155 s_MPEG12Ctx.m_pFwdFrame = ( _MPEGMacroBlock8* )memalign ( 64, lSize );
156 s_MPEG12Ctx.m_pBckFrame = ( _MPEGMacroBlock8* )memalign ( 64, lSize );
157 s_MPEG12Ctx.m_pAuxFrame = ( _MPEGMacroBlock8* )memalign ( 64, lSize );
159 s_MPEG12Ctx.m_pMBXY = ( _MPEGMBXY* )malloc (
160 sizeof ( _MPEGMBXY ) * ( s_MPEG12Ctx.m_MBCount = s_MPEG12Ctx.m_MBWidth * s_MPEG12Ctx.m_MBHeight )
163 for ( i = 0; i < s_MPEG12Ctx.m_MBCount; ++i ) {
164 s_MPEG12Ctx.m_pMBXY[ i ].m_X = i % lMBWidth;
165 s_MPEG12Ctx.m_pMBXY[ i ].m_Y = i / lMBWidth;
170 return _init_cb ( s_pInitCBParam, &s_MPEG12Ctx.m_SI );
174static void _destroy_seq (
void ) {
176 MPEG_Picture = _get_first_picture;
178 if ( s_MPEG12Ctx.m_pAuxFrame ) {
179 free ( s_MPEG12Ctx.m_pAuxFrame );
180 s_MPEG12Ctx.m_pAuxFrame = NULL;
183 if ( s_MPEG12Ctx.m_pBckFrame ) {
184 free ( s_MPEG12Ctx.m_pBckFrame );
185 s_MPEG12Ctx.m_pBckFrame = NULL;
188 if ( s_MPEG12Ctx.m_pFwdFrame ) {
189 free ( s_MPEG12Ctx.m_pFwdFrame );
190 s_MPEG12Ctx.m_pFwdFrame = NULL;
193 if ( s_MPEG12Ctx.m_pMBXY ) {
194 free ( s_MPEG12Ctx.m_pMBXY );
195 s_MPEG12Ctx.m_pMBXY = NULL;
198 s_MPEG12Ctx.m_MBWidth =
199 s_MPEG12Ctx.m_MBHeight = 0;
203static int _get_hdr (
void ) {
208 lCode = _MPEG_NextStartCode (); _MPEG_GetBits ( 32 );
212 case _MPEG_CODE_SEQ_HDR:
216 case _MPEG_CODE_GRP_START:
220 case _MPEG_CODE_PIC_START:
224 case _MPEG_CODE_SEQ_END:
225 MPEG_Picture = _get_first_picture;
235static void _seq_header (
void ) {
237 s_MPEG12Ctx.m_SI.m_Width = _MPEG_GetBits ( 12 );
238 s_MPEG12Ctx.m_SI.m_Height = _MPEG_GetBits ( 12 );
241 s_MPEG12Ctx.m_SI.m_MSPerFrame = ( int )(
242 ( 1000.0F / s_FrameRate[ s_MPEG12Ctx.m_FRCode = _MPEG_GetBits ( 4 ) ] ) + 0.5F
244 _MPEG_GetBits ( 18 );
246 _MPEG_GetBits ( 10 );
249 if ( _MPEG_GetBits ( 1 ) )
251 else _MPEG_SetDefQM ( 0 );
253 if ( _MPEG_GetBits ( 1 ) )
255 else _MPEG_SetDefQM ( 1 );
261static void _gop_header (
void ) {
272 _MPEG_GetBits ( 27 );
278static void _pic_header (
void ) {
282 _MPEG_GetBits ( 10 );
283 lPicCT = _MPEG_GetBits ( 3 );
284 _MPEG_GetBits ( 16 );
286 if ( lPicCT == _MPEG_PT_P || lPicCT == _MPEG_PT_B ) {
287 s_MPEG12Ctx.m_FPFVector = _MPEG_GetBits ( 1 );
288 s_MPEG12Ctx.m_FwdFCode = _MPEG_GetBits ( 3 );
291 if ( lPicCT == _MPEG_PT_B ) {
292 s_MPEG12Ctx.m_FPBVector = _MPEG_GetBits ( 1 );
293 s_MPEG12Ctx.m_BckFCode = _MPEG_GetBits ( 3 );
299 _MPEG_SetPCT ( s_MPEG12Ctx.m_PictCodingType = lPicCT );
303static void _ext_and_ud (
void ) {
307 lCode = _MPEG_NextStartCode ();
309 while ( lCode == _MPEG_CODE_EXTENSION || lCode == _MPEG_CODE_USER_DATA ) {
311 if ( lCode == _MPEG_CODE_EXTENSION ) {
313 _MPEG_GetBits ( 32 );
314 lXID = _MPEG_GetBits ( 4 );
322 case _MPEG_XID_SEQUENCE:
326 case _MPEG_XID_DISPLAY:
330 case _MPEG_XID_QMATRIX:
334 case _MPEG_XID_COPYRIGHT:
338 case _MPEG_XID_SCALABLE:
346 case _MPEG_XID_PIC_DSP:
350 case _MPEG_XID_PIC_COD:
354 case _MPEG_XID_PIC_SSC:
358 case _MPEG_XID_PIC_TSC:
364 lCode = _MPEG_NextStartCode ();
368 _MPEG_GetBits ( 32 );
369 lCode = _MPEG_NextStartCode ();
377static void _ext_unknown (
void ) {
382static void _ext_seq (
void ) {
389 s_MPEG12Ctx.m_fMPEG2 = 1;
391 *(
volatile unsigned int* )0x10002010 &= 0xFF7FFFFF;
393 lProfLevel = _MPEG_GetBits ( 8 );
394 s_MPEG12Ctx.m_fProgSeq = _MPEG_GetBits ( 1 );
395 s_MPEG12Ctx.m_SI.m_ChromaFmt = _MPEG_GetBits ( 2 );
396 lHSzX = _MPEG_GetBits ( 2 );
397 lVSzX = _MPEG_GetBits ( 2 );
399 _MPEG_GetBits ( 12 );
403 lFRXn = _MPEG_GetBits ( 2 );
404 lFRXd = _MPEG_GetBits ( 5 );
406 _MPEG_GetBits ( 22 );
407 lFRXn = _MPEG_GetBits ( 2 );
408 lFRXd = _MPEG_GetBits ( 5 );
410 s_MPEG12Ctx.m_SI.m_MSPerFrame = ( int )(
412 s_FrameRate[ s_MPEG12Ctx.m_FRCode ] * ( ( lFRXn + 1.0F ) / ( lFRXd + 1.0F ) )
417 if( ( lProfLevel >> 7 ) & 1 ) {
419 if ( ( lProfLevel & 15 ) == 5 ) {
421 s_MPEG12Ctx.m_SI.m_Profile = MPEG_PROFILE_422;
422 s_MPEG12Ctx.m_SI.m_Level = MPEG_LEVEL_MAIN;
424 }
else s_MPEG12Ctx.m_SI.m_Profile = s_MPEG12Ctx.m_SI.m_Level = -1;
428 s_MPEG12Ctx.m_SI.m_Profile = lProfLevel >> 4;
429 s_MPEG12Ctx.m_SI.m_Level = lProfLevel & 0xF;
433 s_MPEG12Ctx.m_SI.m_Width = ( lHSzX << 12 ) | ( s_MPEG12Ctx.m_SI.m_Width & 0x0FFF );
434 s_MPEG12Ctx.m_SI.m_Height = ( lVSzX << 12 ) | ( s_MPEG12Ctx.m_SI.m_Height & 0x0FFF );
438static void _ext_seq_dsp (
void ) {
440 s_MPEG12Ctx.m_SI.m_VideoFmt = _MPEG_GetBits ( 3 );
442 if ( _MPEG_GetBits ( 1 ) ) {
448 _MPEG_GetBits ( 24 );
452 _MPEG_GetBits ( 14 );
454 _MPEG_GetBits ( 14 );
456 _MPEG_GetBits ( 29 );
460static void _ext_qnt_mtx (
void ) {
464 if ( _MPEG_GetBits ( 1 ) ) _MPEG_SetQM ( 0 );
465 if ( _MPEG_GetBits ( 1 ) ) _MPEG_SetQM ( 1 );
467 if ( _MPEG_GetBits ( 1 ) )
for ( i = 0; i < 16; ++i ) _MPEG_GetBits ( 32 );
468 if ( _MPEG_GetBits ( 1 ) )
for ( i = 0; i < 16; ++i ) _MPEG_GetBits ( 32 );
472static void _ext_cpy_rgt (
void ) {
479 _MPEG_GetBits ( 20 );
481 _MPEG_GetBits ( 22 );
483 _MPEG_GetBits ( 22 );
485 _MPEG_GetBits ( 32 );
486 _MPEG_GetBits ( 32 );
487 _MPEG_GetBits ( 20 );
491static void _ext_seq_scl (
void ) {
495static void _ext_pic_dsp (
void ) {
500 if ( s_MPEG12Ctx.m_fProgSeq ) {
502 if ( s_MPEG12Ctx.m_fRepFF )
503 lnFCO = s_MPEG12Ctx.m_fTopFF ? 3 : 2;
508 if ( s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME )
510 else lnFCO = s_MPEG12Ctx.m_fRepFF ? 3 : 2;
514 for ( i = 0; i < lnFCO; ++i ) {
515 _MPEG_GetBits ( 16 );
517 _MPEG_GetBits ( 16 );
523static void _ext_pic_cod (
void ) {
525 s_MPEG12Ctx.m_FCode[ 0 ][ 0 ] = _MPEG_GetBits ( 4 );
526 s_MPEG12Ctx.m_FCode[ 0 ][ 1 ] = _MPEG_GetBits ( 4 );
527 s_MPEG12Ctx.m_FCode[ 1 ][ 0 ] = _MPEG_GetBits ( 4 );
528 s_MPEG12Ctx.m_FCode[ 1 ][ 1 ] = _MPEG_GetBits ( 4 );
530 s_MPEG12Ctx.m_PictStruct = _MPEG_GetBits ( 2 );
531 s_MPEG12Ctx.m_fTopFF = _MPEG_GetBits ( 1 );
532 s_MPEG12Ctx.m_fFPFrmDCT = _MPEG_GetBits ( 1 );
533 s_MPEG12Ctx.m_fConsMV = _MPEG_GetBits ( 1 );
534 _MPEG_SetQSTIVFAS ();
535 s_MPEG12Ctx.m_fRepFF = _MPEG_GetBits ( 1 );
542 if ( _MPEG_GetBits ( 1 ) ) {
550 _MPEG_GetBits ( 20 );
556static void _ext_pic_ssc (
void ) {
560static void _ext_pic_tsc (
void ) {
564static void _xtra_bitinf (
void ) {
566 while ( _MPEG_GetBits ( 1 ) ) _MPEG_GetBits ( 8 );
570static int _get_first_picture (
void* apData, s64* apPTS ) {
572 int retVal = _get_hdr ();
576 s_MPEG12Ctx.m_SI.m_FrameCnt = 0;
578 apData = _init_seq ();
579 _mpeg12_picture_data ();
581 if ( s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME ) s_MPEG12Ctx.m_fSecField ^= 1;
583 MPEG_Picture = _get_next_picture;
585 if ( !s_MPEG12Ctx.m_fSecField ) ++s_MPEG12Ctx.m_SI.m_FrameCnt;
587 retVal = _get_next_picture ( apData, apPTS );
595static int _get_next_picture (
void* apData, s64* apPTS ) {
601 if ( ( retVal = _get_hdr () ) ) {
605 _mpeg12_picture_data ();
607 if ( ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME || s_MPEG12Ctx.m_fSecField ) && s_MPEG12Ctx.m_SI.m_FrameCnt ) {
611 if ( s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_B ) {
612 lpData = s_MPEG12Ctx.m_pAuxFrame;
613 *apPTS = s_MPEG12Ctx.m_AuxPTS;
615 lpData = s_MPEG12Ctx.m_pFwdFrame;
616 *apPTS = s_MPEG12Ctx.m_FwdPTS;
619 lfPic = _MPEG_CSCImage ( lpData, apData, s_MPEG12Ctx.m_MBCount );
623 if ( s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME ) s_MPEG12Ctx.m_fSecField ^= 1;
625 if ( !s_MPEG12Ctx.m_fSecField ) ++s_MPEG12Ctx.m_SI.m_FrameCnt;
637static void _mpeg12_do_next_mc (
void ) {
639 _MPEGMotions* lpMotions = &s_MPEG12Ctx.m_MC[ !s_MPEG12Ctx.m_CurMC ];
640 _MPEGMotion* lpMotion = &lpMotions -> m_Motion[ 0 ];
642 while ( lpMotion -> MC_Luma ) {
644 _MPEG_do_mc ( lpMotion );
649 lpMotions -> BlockOp ( lpMotions );
653static void _mpeg12_do_first_mc (
void ) {
655 DoMC = _mpeg12_do_next_mc;
659static void _mpeg12_picture_data (
void ) {
661 int lMBAMax = s_MPEG12Ctx.m_MBWidth * s_MPEG12Ctx.m_MBHeight;
665 if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME && s_MPEG12Ctx.m_fSecField ) s_MPEG12Ctx.m_fSecField = 0;
667 if ( s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_B ) {
668 s_MPEG12Ctx.m_pCurFrame = s_MPEG12Ctx.m_pAuxFrame;
669 s_MPEG12Ctx.m_AuxPTS = *s_pCurPTS;
671 if ( !s_MPEG12Ctx.m_fSecField ) {
672 lpMB = s_MPEG12Ctx.m_pFwdFrame;
673 lPTS = s_MPEG12Ctx.m_FwdPTS;
674 s_MPEG12Ctx.m_pFwdFrame = s_MPEG12Ctx.m_pBckFrame;
675 s_MPEG12Ctx.m_FwdPTS = s_MPEG12Ctx.m_BckPTS;
676 s_MPEG12Ctx.m_pBckFrame = lpMB;
677 s_MPEG12Ctx.m_BckPTS = lPTS;
679 s_MPEG12Ctx.m_pCurFrame = s_MPEG12Ctx.m_pBckFrame;
680 s_MPEG12Ctx.m_BckPTS = *s_pCurPTS;
682 s_MPEG12Ctx.m_pCurFrameY = (
unsigned char* )s_MPEG12Ctx.m_pCurFrame;
683 s_MPEG12Ctx.m_pCurFrameCbCr = (
unsigned char* )s_MPEG12Ctx.m_pCurFrame + 256;
684 if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD ) {
685 s_MPEG12Ctx.m_pCurFrameY += 16;
686 s_MPEG12Ctx.m_pCurFrameCbCr += 8;
689 if ( s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME ) lMBAMax >>= 1;
691 s_MPEG12Ctx.m_CurMC = 0;
692 DoMC = _mpeg12_do_first_mc;
694 while ( _mpeg12_slice ( lMBAMax ) >= 0 );
701static void _mpeg12_decode_motion_vector (
702 int* apPred,
int aRSize,
int aMotionCode,
int aMotionResidual,
int aFullPelVector
705 int lLim = 16 << aRSize;
706 int lVec = aFullPelVector ? *apPred >> 1 : *apPred;
708 if ( aMotionCode > 0 ) {
710 lVec += ( ( aMotionCode - 1 ) << aRSize ) + aMotionResidual + 1;
712 if ( lVec >= lLim ) lVec -= lLim + lLim;
714 }
else if ( aMotionCode < 0 ) {
716 lVec -= ( ( -aMotionCode - 1 ) << aRSize ) + aMotionResidual + 1;
718 if ( lVec < -lLim ) lVec += lLim + lLim;
722 *apPred = aFullPelVector ? lVec << 1 : lVec;
726static void _mpeg12_dual_prime_vector (
int aDMV[][ 2 ],
const int* apDMVector,
int aMVX,
int aMVY ) {
728 if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME ) {
730 if ( s_MPEG12Ctx.m_fTopFF ) {
732 aDMV[ 0 ][ 0 ] = ( ( aMVX + ( aMVX > 0 ) ) >> 1 ) + apDMVector[ 0 ];
733 aDMV[ 0 ][ 1 ] = ( ( aMVY + ( aMVY > 0 ) ) >> 1 ) + apDMVector[ 1 ] - 1;
735 aDMV[ 1 ][ 0 ] = ( ( 3 * aMVX + ( aMVX > 0 ) ) >> 1 ) + apDMVector[ 0 ];
736 aDMV[ 1 ][ 1 ] = ( ( 3 * aMVY + ( aMVY > 0 ) ) >> 1 ) + apDMVector[ 1 ] + 1;
740 aDMV[ 0 ][ 0 ] = ( ( 3 * aMVX + ( aMVX > 0 ) ) >> 1 ) + apDMVector[ 0 ];
741 aDMV[ 0 ][ 1 ] = ( ( 3 * aMVY + ( aMVY > 0 ) ) >> 1 ) + apDMVector[ 1 ] - 1;
743 aDMV[ 1 ][ 0 ] = ( ( aMVX + ( aMVX > 0 ) ) >> 1 ) + apDMVector[ 0 ];
744 aDMV[ 1 ][ 1 ] = ( ( aMVY + ( aMVY > 0 ) ) >> 1 ) + apDMVector[ 1 ] + 1;
750 aDMV[ 0 ][ 0 ] = ( ( aMVX + ( aMVX > 0 ) ) >> 1 ) + apDMVector[ 0 ];
751 aDMV[ 0 ][ 1 ] = ( ( aMVY + ( aMVY > 0 ) ) >> 1 ) + apDMVector[ 1 ];
753 if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_TOP_FIELD )
755 else ++aDMV[ 0 ][ 1 ];
761static void _mpeg12_motion_vector (
762 int* apPMV,
int* apDMVector,
int aHRSize,
int aVRSize,
int aDMV,
int aMVScale,
int aFullPelVector
765 int lMotionCode = _MPEG_GetMotionCode ();
766 int lMotionResidual = aHRSize && lMotionCode ? _MPEG_GetBits ( aHRSize ) : 0;
768 _mpeg12_decode_motion_vector (
769 &apPMV[ 0 ], aHRSize, lMotionCode, lMotionResidual, aFullPelVector
772 if ( aDMV ) apDMVector[ 0 ] = _MPEG_GetDMVector ();
774 s_MPEG12Ctx.m_fError = lMotionCode == -32768;
776 lMotionCode = _MPEG_GetMotionCode ();
777 lMotionResidual = aVRSize && lMotionCode ? _MPEG_GetBits ( aVRSize ) : 0;
779 if ( aMVScale ) apPMV[ 1 ] >>= 1;
781 _mpeg12_decode_motion_vector (
782 &apPMV[ 1 ], aVRSize, lMotionCode, lMotionResidual, aFullPelVector
785 if ( aMVScale ) apPMV[ 1 ] <<= 1;
787 if ( aDMV ) apDMVector[ 1 ] = _MPEG_GetDMVector ();
789 s_MPEG12Ctx.m_fError = lMotionCode == -32768;
793static void _mpeg12_motion_vectors (
794 int aPMV[ 2 ][ 2 ][ 2 ],
int aDMVector[ 2 ],
int aMVFS[ 2 ][ 2 ],
int aS,
int anMV,
795 int aMVFmt,
int aHRSize,
int aVRSize,
int aDMV,
int aMVScale
800 if ( aMVFmt == _MPEG_MV_FIELD && !aDMV ) aMVFS[ 1 ][ aS ] = aMVFS[ 0 ][ aS ] = _MPEG_GetBits ( 1 );
802 _mpeg12_motion_vector ( aPMV[ 0 ][ aS ], aDMVector, aHRSize, aVRSize, aDMV, aMVScale, 0 );
804 aPMV[ 1 ][ aS ][ 0 ] = aPMV[ 0 ][ aS ][ 0 ];
805 aPMV[ 1 ][ aS ][ 1 ] = aPMV[ 0 ][ aS ][ 1 ];
809 aMVFS[ 0 ][ aS ] = _MPEG_GetBits ( 1 );
810 _mpeg12_motion_vector ( aPMV[ 0 ][ aS ], aDMVector, aHRSize, aVRSize, aDMV, aMVScale, 0 );
812 aMVFS[ 1 ][ aS ] = _MPEG_GetBits ( 1 );
813 _mpeg12_motion_vector ( aPMV[ 1 ][ aS ], aDMVector, aHRSize, aVRSize, aDMV, aMVScale, 0 );
819static int _mpeg12_dec_mb (
820 int* apMBType,
int* apMotionType,
821 int aPMV[ 2 ][ 2 ][ 2 ],
int aMVFS[ 2 ][ 2 ],
int aDMVector[ 2 ]
834 lMBType = _MPEG_GetMBType ();
836 if ( !lMBType )
return 0;
838 lfIntra = lMBType & _MPEG_MBT_INTRA;
840 if ( lMBType & ( _MPEG_MBT_MOTION_FORWARD | _MPEG_MBT_MOTION_BACKWARD ) ) {
842 if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME )
843 lMotionType = s_MPEG12Ctx.m_fFPFrmDCT ? _MPEG_MC_FRAME : _MPEG_GetBits ( 2 );
844 else lMotionType = _MPEG_GetBits ( 2 );
846 }
else if ( lfIntra && s_MPEG12Ctx.m_fConsMV )
847 lMotionType = ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME ) ? _MPEG_MC_FRAME : _MPEG_MC_FIELD;
849 if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME ) {
850 lnMV = lMotionType == _MPEG_MC_FIELD ? 2 : 1;
851 lMVFmt = lMotionType == _MPEG_MC_FRAME ? _MPEG_MV_FRAME : _MPEG_MV_FIELD;
853 lnMV = ( lMotionType == _MPEG_MC_16X8 ) ? 2 : 1;
854 lMVFmt = _MPEG_MV_FIELD;
857 lDMV = lMotionType == _MPEG_MC_DMV;
858 lMVScale = lMVFmt == _MPEG_MV_FIELD && s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME;
859 lDCType = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME &&
860 !s_MPEG12Ctx.m_fFPFrmDCT &&
861 lMBType & ( _MPEG_MBT_PATTERN | _MPEG_MBT_INTRA ) ? _MPEG_GetBits ( 1 ) : 0;
863 if ( lMBType & _MPEG_MBT_QUANT ) s_MPEG12Ctx.m_QScale = _MPEG_GetBits ( 5 );
865 if ( ( lMBType & _MPEG_MBT_MOTION_FORWARD ) ||
866 ( lfIntra && s_MPEG12Ctx.m_fConsMV )
869 if ( s_MPEG12Ctx.m_fMPEG2 )
870 _mpeg12_motion_vectors (
871 aPMV, aDMVector, aMVFS, 0, lnMV, lMVFmt,
872 s_MPEG12Ctx.m_FCode[ 0 ][ 0 ] - 1, s_MPEG12Ctx.m_FCode[ 0 ][ 1 ] - 1, lDMV, lMVScale
874 else _mpeg12_motion_vector (
875 aPMV[ 0 ][ 0 ], aDMVector, s_MPEG12Ctx.m_FwdFCode - 1, s_MPEG12Ctx.m_FwdFCode - 1,
876 0, 0, s_MPEG12Ctx.m_FPFVector
880 if ( s_MPEG12Ctx.m_fError )
return 0;
882 if ( lMBType & _MPEG_MBT_MOTION_BACKWARD ) {
884 if ( s_MPEG12Ctx.m_fMPEG2 )
885 _mpeg12_motion_vectors (
886 aPMV, aDMVector, aMVFS, 1, lnMV, lMVFmt,
887 s_MPEG12Ctx.m_FCode[ 1 ][ 0 ] - 1, s_MPEG12Ctx.m_FCode[ 1 ][ 1 ] - 1, 0, lMVScale
889 else _mpeg12_motion_vector (
890 aPMV[ 0 ][ 1 ], aDMVector, s_MPEG12Ctx.m_BckFCode - 1, s_MPEG12Ctx.m_BckFCode - 1,
891 0, 0, s_MPEG12Ctx.m_FPBVector
895 if ( s_MPEG12Ctx.m_fError )
return 0;
897 if ( lfIntra && s_MPEG12Ctx.m_fConsMV ) _MPEG_GetBits ( 1 );
899 if ( lMBType & ( _MPEG_MBT_INTRA | _MPEG_MBT_PATTERN ) )
900 _MPEG_BDEC ( lfIntra, s_MPEG12Ctx.m_fDCRst, lDCType, s_MPEG12Ctx.m_QScale, s_MPEG12Ctx.m_pCurMotions -> m_pSPRBlk );
902 s_MPEG12Ctx.m_fDCRst = !lfIntra;
904 if ( lfIntra && !s_MPEG12Ctx.m_fConsMV )
905 aPMV[ 0 ][ 0 ][ 0 ] = aPMV[ 0 ][ 0 ][ 1 ] =
906 aPMV[ 1 ][ 0 ][ 0 ] = aPMV[ 1 ][ 0 ][ 1 ] =
907 aPMV[ 0 ][ 1 ][ 0 ] = aPMV[ 0 ][ 1 ][ 1 ] =
908 aPMV[ 1 ][ 1 ][ 0 ] = aPMV[ 1 ][ 1 ][ 1 ] = 0;
910 if ( ( s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P ) &&
911 !( lMBType & ( _MPEG_MBT_MOTION_FORWARD | _MPEG_MBT_INTRA ) )
914 aPMV[ 0 ][ 0 ][ 0 ] = aPMV[ 0 ][ 0 ][ 1 ] =
915 aPMV[ 1 ][ 0 ][ 0 ] = aPMV[ 1 ][ 0 ][ 1 ] = 0;
917 if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME )
918 lMotionType = _MPEG_MC_FRAME;
920 lMotionType = _MPEG_MC_FIELD;
921 aMVFS[ 0 ][ 0 ] = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD;
927 *apMotionType = lMotionType;
933static void _mpeg12_get_ref (
935 int aDX,
int aDY,
int aH,
int aFSrc,
int aFDst,
int afAvg
938 int lfInt = ( aH & 8 ) >> 3;
939 int lDXY = ( ( aDY & 1 ) << 1 ) | ( aDX & 1 );
940 int lUVXY = ( ( aDX & 2 ) >> 1 ) | ( aDY & 2 );
941 int lSrcX = aX + ( aDX >> 1 );
942 int lSrcY = ( ( anY + ( aDY >> 1 ) ) << lfInt ) + aFSrc;
943 int lMBX = lSrcX >> 4;
944 int lMBY = lSrcY >> 4;
945 _MPEGMotion* lpMotion = &s_MPEG12Ctx.m_pCurMotions -> m_Motion[ s_MPEG12Ctx.m_pCurMotions -> m_nMotions++ ];
949 __asm__ __volatile__(
952 "pnor $v0, $zero, $zero\n\t"
954 "pextlw %0, %3, %0\n\t"
955 "paddw $at, $at, $v0\n\t"
956 "pmaxw %0, %0, $zero\n\t"
957 "pminw %0, %0, $at\n\t"
958 "dsrl32 %1, %0, 0\n\t"
961 :
"=r"( lMBX ),
"=r"( lMBY ) :
"r"( lMBX ),
"r"( lMBY ),
"m"( s_MPEG12Ctx.m_MBWidth ) :
"at",
"v0"
964 lpMotion -> m_pSrc = (
unsigned char* )( apMBSrc + lMBX + lMBY * s_MPEG12Ctx.m_MBWidth );
965 lpMotion -> m_pDstY = (
short* )( s_MPEG12Ctx.m_pCurMotions -> m_pSPRRes + ( aFDst << 5 ) );
966 lpMotion -> m_pDstCbCr = (
short* )( s_MPEG12Ctx.m_pCurMotions -> m_pSPRRes + 512 + ( aFDst << 3 ) );
967 lpMotion -> m_X = lSrcX & 0xF;
968 lpMotion -> m_Y = lSrcY & 0xF;
969 lpMotion -> m_H = aH;
970 lpMotion -> m_fInt = lfInt;
971 lpMotion -> m_Field = aFSrc;
972 lpMotion -> MC_Luma = LumaOp [ lDXY + afAvg ];
973 lpMotion -> MC_Chroma = ChromaOp[ lUVXY + afAvg ];
977static void _mpeg12_get_refs (
978 int aBX,
int aBY,
int aMBType,
int aMotionType,
int aPMV[ 2 ][ 2 ][ 2 ],
979 int aMVFS[ 2 ][ 2 ],
int aDMVector[ 2 ]
984 s_MPEG12Ctx.m_pCurMotions -> m_nMotions = 0;
986 if ( ( aMBType & _MPEG_MBT_MOTION_FORWARD ) ||
987 ( s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P )
992 if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME ) {
994 if ( ( aMotionType == _MPEG_MC_FRAME ) ||
995 !( aMBType & _MPEG_MBT_MOTION_FORWARD )
999 s_MPEG12Ctx.m_pFwdFrame, aBX, aBY, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ],
1003 }
else if ( aMotionType == _MPEG_MC_FIELD ) {
1006 s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ] >> 1,
1007 8, aMVFS[ 0 ][ 0 ], 0, 0
1010 s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[ 1 ][ 0 ][ 0 ], aPMV[ 1 ][ 0 ][ 1 ] >> 1,
1011 8, aMVFS[ 1 ][ 0 ], 8, 0
1014 }
else if ( aMotionType == _MPEG_MC_DMV ) {
1016 _mpeg12_dual_prime_vector ( lDMV, aDMVector, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ] >> 1 );
1019 s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ] >> 1,
1023 s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, lDMV[ 0 ][ 0 ], lDMV[ 0 ][ 1 ],
1027 s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ] >> 1,
1031 s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, lDMV[ 1 ][ 0 ], lDMV[ 1 ][ 1 ],
1042 lCurField = ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD );
1043 lpMBSrc = ( s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P ) &&
1044 s_MPEG12Ctx.m_fSecField &&
1045 ( lCurField != aMVFS[ 0 ][ 0 ] ) ? s_MPEG12Ctx.m_pBckFrame
1046 : s_MPEG12Ctx.m_pFwdFrame;
1048 if ( ( aMotionType == _MPEG_MC_FIELD ) || !( aMBType & _MPEG_MBT_MOTION_FORWARD ) ) {
1051 lpMBSrc, aBX, aBY, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ], 8,
1052 aMVFS[ 0 ][ 0 ], 0, 0
1055 lpMBSrc, aBX, aBY + 8, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ], 8,
1056 aMVFS[ 0 ][ 0 ], 8, 0
1059 }
else if ( aMotionType == _MPEG_MC_16X8 ) {
1062 lpMBSrc, aBX, aBY, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ], 8,
1063 aMVFS[ 0 ][ 0 ], 0, 0
1066 lpMBSrc = ( s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P ) &&
1067 s_MPEG12Ctx.m_fSecField &&
1068 ( lCurField != aMVFS[ 1 ][ 0 ] ) ? s_MPEG12Ctx.m_pBckFrame
1069 : s_MPEG12Ctx.m_pFwdFrame;
1071 lpMBSrc, aBX, aBY + 8, aPMV[ 1 ][ 0 ][ 0 ], aPMV[ 1 ][ 0 ][ 1 ], 8,
1072 aMVFS[ 1 ][ 0 ], 8, 0
1075 }
else if ( aMotionType == _MPEG_MC_DMV ) {
1077 lpMBSrc = s_MPEG12Ctx.m_fSecField ? s_MPEG12Ctx.m_pBckFrame : s_MPEG12Ctx.m_pFwdFrame;
1079 _mpeg12_dual_prime_vector ( lDMV, aDMVector, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ] );
1082 s_MPEG12Ctx.m_pFwdFrame, aBX, aBY, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ], 16,
1086 lpMBSrc, aBX, aBY, lDMV[ 0 ][ 0 ], lDMV[ 0 ][ 1 ], 16, !lCurField, 1, 1
1097 if ( aMBType & _MPEG_MBT_MOTION_BACKWARD ) {
1099 if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME ) {
1101 if ( aMotionType == _MPEG_MC_FRAME ) {
1104 s_MPEG12Ctx.m_pBckFrame, aBX, aBY, aPMV[ 0 ][ 1 ][ 0 ], aPMV[ 0 ][ 1 ][ 1 ],
1111 s_MPEG12Ctx.m_pBckFrame, aBX, aBY >> 1, aPMV[ 0 ][ 1 ][ 0 ], aPMV[ 0 ][ 1 ][ 1 ] >> 1,
1112 8, aMVFS[ 0 ][ 1 ], 0, lfAdd
1115 s_MPEG12Ctx.m_pBckFrame, aBX, aBY >> 1, aPMV[ 1 ][ 1 ][ 0 ], aPMV[ 1 ][ 1 ][ 1 ] >> 1,
1116 8, aMVFS[ 1 ][ 1 ], 8, lfAdd
1123 if ( aMotionType == _MPEG_MC_FIELD ) {
1126 s_MPEG12Ctx.m_pBckFrame, aBX, aBY, aPMV[ 0 ][ 1 ][ 0 ], aPMV[ 0 ][ 1 ][ 1 ], 8,
1127 aMVFS[ 0 ][ 1 ], 0, lfAdd
1130 s_MPEG12Ctx.m_pBckFrame, aBX, aBY + 8, aPMV[ 0 ][ 1 ][ 0 ], aPMV[ 0 ][ 1 ][ 1 ], 8,
1131 aMVFS[ 0 ][ 1 ], 8, lfAdd
1134 }
else if ( aMotionType == _MPEG_MC_16X8 ) {
1137 s_MPEG12Ctx.m_pBckFrame, aBX, aBY, aPMV[ 0 ][ 1 ][ 0 ], aPMV[ 0 ][ 1 ][ 1 ],
1138 8, aMVFS[ 0 ][ 1 ], 0, lfAdd
1141 s_MPEG12Ctx.m_pBckFrame, aBX, aBY + 8, aPMV[ 1 ][ 1 ][ 0 ], aPMV[ 1 ][ 1 ][ 1 ],
1142 8, aMVFS[ 1 ][ 1 ], 8, lfAdd
1151 _MPEG_dma_ref_image (
1153 &s_MPEG12Ctx.m_pCurMotions -> m_Motion[ 0 ],
1154 s_MPEG12Ctx.m_pCurMotions -> m_nMotions, s_MPEG12Ctx.m_MBWidth
1159static void _mpeg2_mc (
1160 int aMBA,
int aMBType,
int aMotionType,
int aPMV[ 2 ][ 2 ][ 2 ],
1161 int aMVFS[ 2 ][ 2 ],
int aDMVector[ 2 ],
int aMBAI
1171 lBX = s_MPEG12Ctx.m_pMBXY[ aMBA ].m_X;
1172 lBY = s_MPEG12Ctx.m_pMBXY[ aMBA ].m_Y;
1173 lfField = s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME;
1174 lOffset = ( lBY * ( s_MPEG12Ctx.m_MBWidth << lfField ) + lBX ) *
sizeof (
_MPEGMacroBlock8 );
1175 lfIntra = aMBType & _MPEG_MBT_INTRA;
1176 lfNoSkip = aMBAI == 1;
1177 lfFiledMV = aMotionType & _MPEG_MC_FIELD;
1179 s_MPEG12Ctx.m_pCurMotions -> m_Stride = s_MPEG12Ctx.m_MBStride;
1180 s_MPEG12Ctx.m_pCurMotions -> m_pMBDstY = UNCACHED_SEG( s_MPEG12Ctx.m_pCurFrameY + lOffset );
1181 s_MPEG12Ctx.m_pCurMotions -> m_pMBDstCbCr = UNCACHED_SEG( s_MPEG12Ctx.m_pCurFrameCbCr + lOffset );
1187 _mpeg12_get_refs ( lBX, lBY, aMBType, aMotionType, aPMV, aMVFS, aDMVector );
1188 if ( lfNoSkip && ( aMBType & _MPEG_MBT_PATTERN ) )
1189 s_MPEG12Ctx.m_pCurMotions -> BlockOp = AddBlockOp[ lfField ][ lfFiledMV ];
1191 s_MPEG12Ctx.m_pCurMotions -> m_pSrc = s_MPEG12Ctx.m_pCurMotions -> m_pSPRRes;
1192 s_MPEG12Ctx.m_pCurMotions -> BlockOp = PutBlockOp[ !lfField + ( lfNoSkip && lfFiledMV && !lfField ) ];
1195 s_MPEG12Ctx.m_pCurMotions -> m_Motion[ 0 ].MC_Luma = NULL;
1196 s_MPEG12Ctx.m_pCurMotions -> m_pSrc = s_MPEG12Ctx.m_pCurMotions -> m_pSPRBlk;
1197 s_MPEG12Ctx.m_pCurMotions -> BlockOp = PutBlockOp[ !lfField ];
1202static int _mpeg12_slice (
int aMBAMax ) {
1204 int lPMV [ 2 ][ 2 ][ 2 ];
1205 int lMVFS [ 2 ][ 2 ];
1207 int lMBA, lMBAI, lMBType, lMotionType;
1210 s_MPEG12Ctx.m_fError = 0;
1211 lMBType = _MPEG_NextStartCode ();
1213 if ( lMBType < _MPEG_CODE_SLICE_MIN || lMBType > _MPEG_CODE_SLICE_MAX )
return -1;
1215 _MPEG_GetBits ( 32 );
1217 s_MPEG12Ctx.m_QScale = _MPEG_GetBits ( 5 );
1219 if ( _MPEG_GetBits ( 1 ) ) {
1220 _MPEG_GetBits ( 8 );
1224 lMBAI = _MPEG_GetMBAI ();
1228 lMBA = ( ( lMBType & 255 ) - 1 ) * s_MPEG12Ctx.m_MBWidth + lMBAI - 1;
1231 s_MPEG12Ctx.m_fDCRst = 1;
1233 lPMV[ 0 ][ 0 ][ 0 ] = lPMV[ 0 ][ 0 ][ 1 ] = lPMV[ 1 ][ 0 ][ 0 ] = lPMV[ 1 ][ 0 ][ 1 ] = 0;
1234 lPMV[ 0 ][ 1 ][ 0 ] = lPMV[ 0 ][ 1 ][ 1 ] = lPMV[ 1 ][ 1 ][ 0 ] = lPMV[ 1 ][ 1 ][ 1 ] = 0;
1240 s_MPEG12Ctx.m_pCurMotions = &s_MPEG12Ctx.m_MC[ s_MPEG12Ctx.m_CurMC ];
1242 if ( lMBA >= aMBAMax || !_MPEG_WaitBDEC () )
return -1;
1246 if ( !_MPEG_ShowBits ( 23 ) || s_MPEG12Ctx.m_fError ) {
1248 s_MPEG12Ctx.m_fError = 0;
1253 lMBAI = _MPEG_GetMBAI ();
1255 if ( !lMBAI )
goto resync;
1261 if ( lMBA >= aMBAMax )
return -1;
1265 retVal = _mpeg12_dec_mb ( &lMBType, &lMotionType, lPMV, lMVFS, lDMVector );
1267 if ( retVal < 0 )
return retVal;
1268 if ( !retVal )
goto resync;
1272 s_MPEG12Ctx.m_fDCRst = 1;
1274 if ( s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P )
1275 lPMV[ 0 ][ 0 ][ 0 ] = lPMV[ 0 ][ 0 ][ 1 ] =
1276 lPMV[ 1 ][ 0 ][ 0 ] = lPMV[ 1 ][ 0 ][ 1 ] = 0;
1277 if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME )
1278 lMotionType = _MPEG_MC_FRAME;
1280 lMotionType = _MPEG_MC_FIELD;
1282 lMVFS[ 0 ][ 1 ] = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD;
1285 lMBType &= ~_MPEG_MBT_INTRA;
1289 _mpeg2_mc ( lMBA, lMBType, lMotionType, lPMV, lMVFS, lDMVector, lMBAI );
1296 s_MPEG12Ctx.m_CurMC ^= 1;
1298 if ( lMBA >= aMBAMax )
return -1;