24static void (*LumaOp[8])(
_MPEGMotion *m, u8 *a2,
short *a3,
int a4,
int var1,
int ta, int, int) = {
25 _MPEG_put_luma, _MPEG_put_luma_X, _MPEG_put_luma_Y, _MPEG_put_luma_XY,
26 _MPEG_avg_luma, _MPEG_avg_luma_X, _MPEG_avg_luma_Y, _MPEG_avg_luma_XY};
28static void (*ChromaOp[8])(
_MPEGMotion *m, u8 *a2,
short *a3,
int a4,
int var1,
int ta, int, int) = {
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};
33 _MPEG_put_block_il, _MPEG_put_block_fr, _MPEG_put_block_fl};
36 {_MPEG_add_block_frfr, _MPEG_add_block_frfl},
37 {_MPEG_add_block_ilfl, _MPEG_add_block_ilfl}};
39static float s_FrameRate[16] = {
40 0.0F, ((23.0F * 1000.0F) / 1001.0F),
41 24.0F, 25.0F, ((30.0F * 1000.0F) / 1001.0F),
42 30.0F, 50.0F, ((60.0F * 1000.0F) / 1001.0F),
43 60.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F};
46static void *s_pInitCBParam;
48static void *_init_seq(
void);
49static void _destroy_seq(
void);
51static int _get_hdr(
void);
53static void _seq_header(
void);
54static void _gop_header(
void);
55static void _pic_header(
void);
56static void _ext_and_ud(
void);
57static void _ext_unknown(
void);
58static void _ext_seq(
void);
59static void _ext_seq_dsp(
void);
60static void _ext_qnt_mtx(
void);
61static void _ext_cpy_rgt(
void);
62static void _ext_seq_scl(
void);
63static void _ext_pic_dsp(
void);
64static void _ext_pic_cod(
void);
65static void _ext_pic_ssc(
void);
66static void _ext_pic_tsc(
void);
67static void _xtra_bitinf(
void);
69static int _get_next_picture(
void *, s64 *);
70static int _get_first_picture(
void *, s64 *);
72int (*MPEG_Picture)(
void *, s64 *);
74static void (*DoMC)(void);
76static void _mpeg12_picture_data(
void);
77static int _mpeg12_slice(
int);
78static int _mpeg12_dec_mb(
int *,
int *,
int[2][2][2],
int[2][2],
int[2]);
81 int (*apDataCB)(
void *),
void *apDataCBParam,
85 memset(&s_MPEG12Ctx, 0,
sizeof(s_MPEG12Ctx));
87 _MPEG_Initialize(&s_MPEG12Ctx, apDataCB, apDataCBParam, &s_MPEG12Ctx.m_SI.m_fEOF);
90 s_pInitCBParam = apInitCBParam;
93 s_MPEG12Ctx.m_SI.m_FrameCnt = 0;
94 s_MPEG12Ctx.m_SI.m_fEOF = 0;
95 s_MPEG12Ctx.m_SI.m_Profile = -1;
96 s_MPEG12Ctx.m_SI.m_Level = -1;
97 s_MPEG12Ctx.m_SI.m_ChromaFmt = MPEG_CHROMA_FORMAT_420;
98 s_MPEG12Ctx.m_SI.m_VideoFmt = MPEG_VIDEO_FORMAT_UNSPEC;
99 s_MPEG12Ctx.m_fMPEG2 = 0;
101 s_MPEG12Ctx.m_MC[0].m_pSPRBlk = (
void *)0x70000000;
102 s_MPEG12Ctx.m_MC[0].m_pSPRRes = (
void *)0x70000300;
103 s_MPEG12Ctx.m_MC[0].m_pSPRMC = (
void *)0x70000600;
104 s_MPEG12Ctx.m_MC[1].m_pSPRBlk = (
void *)0x70001E00;
105 s_MPEG12Ctx.m_MC[1].m_pSPRRes = (
void *)0x70002100;
106 s_MPEG12Ctx.m_MC[1].m_pSPRMC = (
void *)0x70002400;
108 MPEG_Picture = _get_first_picture;
111void MPEG_Destroy(
void)
117static void *_init_seq(
void)
119 int lMBWidth, lMBHeight;
122 if (!s_MPEG12Ctx.m_fMPEG2) {
123 s_MPEG12Ctx.m_fProgSeq = 1;
124 s_MPEG12Ctx.m_PictStruct = _MPEG_PS_FRAME;
125 s_MPEG12Ctx.m_fFPFrmDCT = 1;
128 lMBWidth = (s_MPEG12Ctx.m_SI.m_Width + 15) / 16;
129 if (s_MPEG12Ctx.m_fMPEG2 && !s_MPEG12Ctx.m_fProgSeq) {
130 lMBHeight = 2 * ((s_MPEG12Ctx.m_SI.m_Height + 31) / 32);
132 lMBHeight = (s_MPEG12Ctx.m_SI.m_Height + 15) / 16;
135 if (lMBWidth != s_MPEG12Ctx.m_MBWidth || lMBHeight != s_MPEG12Ctx.m_MBHeight) {
136 unsigned int lAllocSize;
139 if (s_MPEG12Ctx.m_pFwdFrame)
142 s_MPEG12Ctx.m_MBWidth = lMBWidth;
143 s_MPEG12Ctx.m_MBHeight = lMBHeight;
144 s_MPEG12Ctx.m_SI.m_Width = lMBWidth << 4;
145 s_MPEG12Ctx.m_SI.m_Height = lMBHeight << 4;
151 s_MPEG12Ctx.m_MBCount = s_MPEG12Ctx.m_MBWidth * s_MPEG12Ctx.m_MBHeight;
153 lAllocSize = (lSize * 3) + (s_MPEG12Ctx.m_MBCount *
sizeof(
_MPEGMBXY));
155 pA = memalign(64, lAllocSize);
157 s_MPEG12Ctx.m_pFrameArena = pA;
166 for (i = 0; i < s_MPEG12Ctx.m_MBCount; ++i) {
167 s_MPEG12Ctx.m_pMBXY[i].m_X = i % lMBWidth;
168 s_MPEG12Ctx.m_pMBXY[i].m_Y = i / lMBWidth;
172 return _init_cb(s_pInitCBParam, &s_MPEG12Ctx.m_SI);
175static void _destroy_seq(
void)
177 MPEG_Picture = _get_first_picture;
179 if (s_MPEG12Ctx.m_pFrameArena) {
180 free(s_MPEG12Ctx.m_pFrameArena);
181 s_MPEG12Ctx.m_pAuxFrame = NULL;
182 s_MPEG12Ctx.m_pBckFrame = NULL;
183 s_MPEG12Ctx.m_pFwdFrame = NULL;
184 s_MPEG12Ctx.m_pMBXY = NULL;
187 s_MPEG12Ctx.m_MBWidth = 0;
188 s_MPEG12Ctx.m_MBHeight = 0;
196static int _get_hdr(
void)
199 unsigned int lCode = _MPEG_NextStartCode();
203 case _MPEG_CODE_SEQ_HDR:
206 case _MPEG_CODE_GRP_START:
209 case _MPEG_CODE_PIC_START:
212 case _MPEG_CODE_SEQ_END:
213 MPEG_Picture = _get_first_picture;
219static void _seq_header(
void)
221 s_MPEG12Ctx.m_SI.m_Width = _MPEG_GetBits(12);
222 s_MPEG12Ctx.m_SI.m_Height = _MPEG_GetBits(12);
225 s_MPEG12Ctx.m_SI.m_MSPerFrame = (int)((1000.0F / s_FrameRate[s_MPEG12Ctx.m_FRCode = _MPEG_GetBits(4)]) + 0.5F);
231 if (_MPEG_GetBits(1))
236 if (_MPEG_GetBits(1))
244static void _gop_header(
void)
261static void _pic_header(
void)
266 lPicCT = _MPEG_GetBits(3);
269 if (lPicCT == _MPEG_PT_P || lPicCT == _MPEG_PT_B) {
270 s_MPEG12Ctx.m_FPFVector = _MPEG_GetBits(1);
271 s_MPEG12Ctx.m_FwdFCode = _MPEG_GetBits(3);
274 if (lPicCT == _MPEG_PT_B) {
275 s_MPEG12Ctx.m_FPBVector = _MPEG_GetBits(1);
276 s_MPEG12Ctx.m_BckFCode = _MPEG_GetBits(3);
282 _MPEG_SetPCT(s_MPEG12Ctx.m_PictCodingType = lPicCT);
285static void _ext_and_ud(
void)
288 lCode = _MPEG_NextStartCode();
290 while (lCode == _MPEG_CODE_EXTENSION || lCode == _MPEG_CODE_USER_DATA) {
291 if (lCode == _MPEG_CODE_EXTENSION) {
293 lXID = _MPEG_GetBits(4);
299 case _MPEG_XID_SEQUENCE:
302 case _MPEG_XID_DISPLAY:
305 case _MPEG_XID_QMATRIX:
308 case _MPEG_XID_COPYRIGHT:
311 case _MPEG_XID_SCALABLE:
317 case _MPEG_XID_PIC_DSP:
320 case _MPEG_XID_PIC_COD:
323 case _MPEG_XID_PIC_SSC:
326 case _MPEG_XID_PIC_TSC:
331 lCode = _MPEG_NextStartCode();
334 lCode = _MPEG_NextStartCode();
339static void _ext_unknown(
void) {}
341static void _ext_seq(
void)
348 s_MPEG12Ctx.m_fMPEG2 = 1;
352 lProfLevel = _MPEG_GetBits(8);
353 s_MPEG12Ctx.m_fProgSeq = _MPEG_GetBits(1);
354 s_MPEG12Ctx.m_SI.m_ChromaFmt = _MPEG_GetBits(2);
355 lHSzX = _MPEG_GetBits(2);
356 lVSzX = _MPEG_GetBits(2);
362 lFRXn = _MPEG_GetBits(2);
363 lFRXd = _MPEG_GetBits(5);
366 lFRXn = _MPEG_GetBits(2);
367 lFRXd = _MPEG_GetBits(5);
369 s_MPEG12Ctx.m_SI.m_MSPerFrame = (int)((1000.0F / (s_FrameRate[s_MPEG12Ctx.m_FRCode] * ((lFRXn + 1.0F) / (lFRXd + 1.0F)))) + 0.5F);
371 if ((lProfLevel >> 7) & 1) {
372 if ((lProfLevel & 15) == 5) {
373 s_MPEG12Ctx.m_SI.m_Profile = MPEG_PROFILE_422;
374 s_MPEG12Ctx.m_SI.m_Level = MPEG_LEVEL_MAIN;
376 s_MPEG12Ctx.m_SI.m_Profile = s_MPEG12Ctx.m_SI.m_Level = -1;
379 s_MPEG12Ctx.m_SI.m_Profile = lProfLevel >> 4;
380 s_MPEG12Ctx.m_SI.m_Level = lProfLevel & 0xF;
383 s_MPEG12Ctx.m_SI.m_Width = (lHSzX << 12) | (s_MPEG12Ctx.m_SI.m_Width & 0x0FFF);
384 s_MPEG12Ctx.m_SI.m_Height = (lVSzX << 12) | (s_MPEG12Ctx.m_SI.m_Height & 0x0FFF);
388static void _ext_seq_dsp(
void)
390 s_MPEG12Ctx.m_SI.m_VideoFmt = _MPEG_GetBits(3);
392 if (_MPEG_GetBits(1)) {
410static void _ext_qnt_mtx(
void)
414 if (_MPEG_GetBits(1))
417 if (_MPEG_GetBits(1))
420 if (_MPEG_GetBits(1)) {
421 for (i = 0; i < 16; ++i)
425 if (_MPEG_GetBits(1)) {
426 for (i = 0; i < 16; ++i)
431static void _ext_cpy_rgt(
void)
451static void _ext_seq_scl(
void) {}
453static void _ext_pic_dsp(
void)
458 if (s_MPEG12Ctx.m_fProgSeq) {
459 if (s_MPEG12Ctx.m_fRepFF)
460 lnFCO = s_MPEG12Ctx.m_fTopFF ? 3 : 2;
464 if (s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME)
467 lnFCO = s_MPEG12Ctx.m_fRepFF ? 3 : 2;
471 for (i = 0; i < lnFCO; ++i) {
479static void _ext_pic_cod(
void)
482 s_MPEG12Ctx.m_FCode[0][0] = _MPEG_GetBits(4);
483 s_MPEG12Ctx.m_FCode[0][1] = _MPEG_GetBits(4);
484 s_MPEG12Ctx.m_FCode[1][0] = _MPEG_GetBits(4);
485 s_MPEG12Ctx.m_FCode[1][1] = _MPEG_GetBits(4);
487 s_MPEG12Ctx.m_PictStruct = _MPEG_GetBits(2);
488 s_MPEG12Ctx.m_fTopFF = _MPEG_GetBits(1);
489 s_MPEG12Ctx.m_fFPFrmDCT = _MPEG_GetBits(1);
490 s_MPEG12Ctx.m_fConsMV = _MPEG_GetBits(1);
492 s_MPEG12Ctx.m_fRepFF = _MPEG_GetBits(1);
499 if (_MPEG_GetBits(1)) {
512static void _ext_pic_ssc(
void) {}
515static void _ext_pic_tsc(
void) {}
517static void _xtra_bitinf(
void)
519 while (_MPEG_GetBits(1))
523static int _get_first_picture(
void *apData, s64 *apPTS)
525 int retVal = _get_hdr();
528 s_MPEG12Ctx.m_SI.m_FrameCnt = 0;
530 apData = _init_seq();
531 _mpeg12_picture_data();
533 if (s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME)
534 s_MPEG12Ctx.m_fSecField ^= 1;
536 MPEG_Picture = _get_next_picture;
538 if (!s_MPEG12Ctx.m_fSecField)
539 ++s_MPEG12Ctx.m_SI.m_FrameCnt;
541 retVal = _get_next_picture(apData, apPTS);
547static int _get_next_picture(
void *apData, s64 *apPTS)
552 if ((retVal = _get_hdr())) {
555 _mpeg12_picture_data();
557 if ((s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME || s_MPEG12Ctx.m_fSecField) && s_MPEG12Ctx.m_SI.m_FrameCnt) {
560 if (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_B) {
561 lpData = s_MPEG12Ctx.m_pAuxFrame;
562 *apPTS = s_MPEG12Ctx.m_AuxPTS;
564 lpData = s_MPEG12Ctx.m_pFwdFrame;
565 *apPTS = s_MPEG12Ctx.m_FwdPTS;
568 lfPic = _MPEG_CSCImage(lpData, apData, s_MPEG12Ctx.m_MBCount);
571 if (s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME)
572 s_MPEG12Ctx.m_fSecField ^= 1;
574 if (!s_MPEG12Ctx.m_fSecField)
575 ++s_MPEG12Ctx.m_SI.m_FrameCnt;
587static void _mpeg12_do_next_mc(
void)
589 _MPEGMotions *lpMotions = &s_MPEG12Ctx.m_MC[!s_MPEG12Ctx.m_CurMC];
592 while (lpMotion->MC_Luma) {
593 _MPEG_do_mc(lpMotion);
597 lpMotions->BlockOp(lpMotions);
600static void _mpeg12_do_first_mc(
void)
602 DoMC = _mpeg12_do_next_mc;
606static void _mpeg12_picture_data(
void)
608 int lMBAMax = s_MPEG12Ctx.m_MBWidth * s_MPEG12Ctx.m_MBHeight;
611 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME && s_MPEG12Ctx.m_fSecField)
612 s_MPEG12Ctx.m_fSecField = 0;
614 if (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_B) {
615 s_MPEG12Ctx.m_pCurFrame = s_MPEG12Ctx.m_pAuxFrame;
616 s_MPEG12Ctx.m_AuxPTS = *s_pCurPTS;
620 if (!s_MPEG12Ctx.m_fSecField) {
621 lpMB = s_MPEG12Ctx.m_pFwdFrame;
622 lPTS = s_MPEG12Ctx.m_FwdPTS;
623 s_MPEG12Ctx.m_pFwdFrame = s_MPEG12Ctx.m_pBckFrame;
624 s_MPEG12Ctx.m_FwdPTS = s_MPEG12Ctx.m_BckPTS;
625 s_MPEG12Ctx.m_pBckFrame = lpMB;
626 s_MPEG12Ctx.m_BckPTS = lPTS;
629 s_MPEG12Ctx.m_pCurFrame = s_MPEG12Ctx.m_pBckFrame;
630 s_MPEG12Ctx.m_BckPTS = *s_pCurPTS;
633 s_MPEG12Ctx.m_pCurFrameY = (
unsigned char *)s_MPEG12Ctx.m_pCurFrame;
634 s_MPEG12Ctx.m_pCurFrameCbCr = (
unsigned char *)s_MPEG12Ctx.m_pCurFrame + 256;
635 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD) {
636 s_MPEG12Ctx.m_pCurFrameY += 16;
637 s_MPEG12Ctx.m_pCurFrameCbCr += 8;
640 if (s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME)
643 s_MPEG12Ctx.m_CurMC = 0;
645 DoMC = _mpeg12_do_first_mc;
647 while (_mpeg12_slice(lMBAMax) >= 0)
656static void _mpeg12_decode_motion_vector(
int *apPred,
int aRSize,
int aMotionCode,
657 int aMotionResidual,
int aFullPelVector)
659 int lLim = 16 << aRSize;
660 int lVec = aFullPelVector ? *apPred >> 1 : *apPred;
662 if (aMotionCode > 0) {
663 lVec += ((aMotionCode - 1) << aRSize) + aMotionResidual + 1;
668 }
else if (aMotionCode < 0) {
669 lVec -= ((-aMotionCode - 1) << aRSize) + aMotionResidual + 1;
675 *apPred = aFullPelVector ? lVec << 1 : lVec;
679static void _mpeg12_dual_prime_vector(
int aDMV[][2],
const int *apDMVector,
int aMVX,
int aMVY)
681 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) {
682 if (s_MPEG12Ctx.m_fTopFF) {
683 aDMV[0][0] = ((aMVX + (aMVX > 0)) >> 1) + apDMVector[0];
684 aDMV[0][1] = ((aMVY + (aMVY > 0)) >> 1) + apDMVector[1] - 1;
686 aDMV[1][0] = ((3 * aMVX + (aMVX > 0)) >> 1) + apDMVector[0];
687 aDMV[1][1] = ((3 * aMVY + (aMVY > 0)) >> 1) + apDMVector[1] + 1;
689 aDMV[0][0] = ((3 * aMVX + (aMVX > 0)) >> 1) + apDMVector[0];
690 aDMV[0][1] = ((3 * aMVY + (aMVY > 0)) >> 1) + apDMVector[1] - 1;
692 aDMV[1][0] = ((aMVX + (aMVX > 0)) >> 1) + apDMVector[0];
693 aDMV[1][1] = ((aMVY + (aMVY > 0)) >> 1) + apDMVector[1] + 1;
696 aDMV[0][0] = ((aMVX + (aMVX > 0)) >> 1) + apDMVector[0];
697 aDMV[0][1] = ((aMVY + (aMVY > 0)) >> 1) + apDMVector[1];
699 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_TOP_FIELD)
708static void _mpeg12_motion_vector(
int *apPMV,
int *apDMVector,
int aHRSize,
709 int aVRSize,
int aDMV,
int aMVScale,
int aFullPelVector)
715 lMotionCode = _MPEG_GetMotionCode();
716 lMotionResidual = aHRSize && lMotionCode ? _MPEG_GetBits(aHRSize) : 0;
718 _mpeg12_decode_motion_vector(&apPMV[0], aHRSize, lMotionCode, lMotionResidual, aFullPelVector);
721 apDMVector[0] = _MPEG_GetDMVector();
723 s_MPEG12Ctx.m_fError = lMotionCode == -32768;
726 lMotionCode = _MPEG_GetMotionCode();
727 lMotionResidual = aVRSize && lMotionCode ? _MPEG_GetBits(aVRSize) : 0;
732 _mpeg12_decode_motion_vector(&apPMV[1], aVRSize, lMotionCode, lMotionResidual, aFullPelVector);
738 apDMVector[1] = _MPEG_GetDMVector();
740 s_MPEG12Ctx.m_fError = lMotionCode == -32768;
743static void _mpeg12_motion_vectors(
744 int aPMV[2][2][2],
int aDMVector[2],
int aMVFS[2][2],
int aS,
int anMV,
745 int aMVFmt,
int aHRSize,
int aVRSize,
int aDMV,
int aMVScale)
748 if (aMVFmt == _MPEG_MV_FIELD && !aDMV)
749 aMVFS[1][aS] = aMVFS[0][aS] = _MPEG_GetBits(1);
751 _mpeg12_motion_vector(aPMV[0][aS], aDMVector, aHRSize, aVRSize, aDMV, aMVScale, 0);
753 aPMV[1][aS][0] = aPMV[0][aS][0];
754 aPMV[1][aS][1] = aPMV[0][aS][1];
756 aMVFS[0][aS] = _MPEG_GetBits(1);
757 _mpeg12_motion_vector(aPMV[0][aS], aDMVector, aHRSize, aVRSize, aDMV, aMVScale, 0);
759 aMVFS[1][aS] = _MPEG_GetBits(1);
760 _mpeg12_motion_vector(aPMV[1][aS], aDMVector, aHRSize, aVRSize, aDMV, aMVScale, 0);
764static int _mpeg12_dec_mb(
765 int *apMBType,
int *apMotionType,
766 int aPMV[2][2][2],
int aMVFS[2][2],
int aDMVector[2])
779 lMBType = _MPEG_GetMBType();
784 lfIntra = lMBType & _MPEG_MBT_INTRA;
786 if (lMBType & (_MPEG_MBT_MOTION_FORWARD | _MPEG_MBT_MOTION_BACKWARD)) {
788 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME)
789 lMotionType = s_MPEG12Ctx.m_fFPFrmDCT ? _MPEG_MC_FRAME : _MPEG_GetBits(2);
791 lMotionType = _MPEG_GetBits(2);
793 }
else if (lfIntra && s_MPEG12Ctx.m_fConsMV)
794 lMotionType = (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) ? _MPEG_MC_FRAME : _MPEG_MC_FIELD;
796 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) {
797 lnMV = lMotionType == _MPEG_MC_FIELD ? 2 : 1;
798 lMVFmt = lMotionType == _MPEG_MC_FRAME ? _MPEG_MV_FRAME : _MPEG_MV_FIELD;
800 lnMV = (lMotionType == _MPEG_MC_16X8) ? 2 : 1;
801 lMVFmt = _MPEG_MV_FIELD;
804 lDMV = lMotionType == _MPEG_MC_DMV;
805 lMVScale = lMVFmt == _MPEG_MV_FIELD && s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME;
806 lDCType = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME && !s_MPEG12Ctx.m_fFPFrmDCT && lMBType & (_MPEG_MBT_PATTERN | _MPEG_MBT_INTRA) ? _MPEG_GetBits(1) : 0;
808 if (lMBType & _MPEG_MBT_QUANT)
809 s_MPEG12Ctx.m_QScale = _MPEG_GetBits(5);
811 if ((lMBType & _MPEG_MBT_MOTION_FORWARD) || (lfIntra && s_MPEG12Ctx.m_fConsMV)) {
812 if (s_MPEG12Ctx.m_fMPEG2)
813 _mpeg12_motion_vectors(aPMV, aDMVector, aMVFS, 0, lnMV, lMVFmt, s_MPEG12Ctx.m_FCode[0][0] - 1, s_MPEG12Ctx.m_FCode[0][1] - 1, lDMV, lMVScale);
815 _mpeg12_motion_vector(aPMV[0][0], aDMVector, s_MPEG12Ctx.m_FwdFCode - 1, s_MPEG12Ctx.m_FwdFCode - 1, 0, 0, s_MPEG12Ctx.m_FPFVector);
818 if (s_MPEG12Ctx.m_fError)
821 if (lMBType & _MPEG_MBT_MOTION_BACKWARD) {
822 if (s_MPEG12Ctx.m_fMPEG2)
823 _mpeg12_motion_vectors(aPMV, aDMVector, aMVFS, 1, lnMV, lMVFmt, s_MPEG12Ctx.m_FCode[1][0] - 1, s_MPEG12Ctx.m_FCode[1][1] - 1, 0, lMVScale);
825 _mpeg12_motion_vector(aPMV[0][1], aDMVector, s_MPEG12Ctx.m_BckFCode - 1, s_MPEG12Ctx.m_BckFCode - 1, 0, 0, s_MPEG12Ctx.m_FPBVector);
828 if (s_MPEG12Ctx.m_fError)
831 if (lfIntra && s_MPEG12Ctx.m_fConsMV)
834 if (lMBType & (_MPEG_MBT_INTRA | _MPEG_MBT_PATTERN))
835 _MPEG_BDEC(lfIntra, s_MPEG12Ctx.m_fDCRst, lDCType, s_MPEG12Ctx.m_QScale, s_MPEG12Ctx.m_pCurMotions->m_pSPRBlk);
837 s_MPEG12Ctx.m_fDCRst = !lfIntra;
839 if (lfIntra && !s_MPEG12Ctx.m_fConsMV) {
850 if ((s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P) && !(lMBType & (_MPEG_MBT_MOTION_FORWARD | _MPEG_MBT_INTRA))) {
856 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) {
857 lMotionType = _MPEG_MC_FRAME;
859 lMotionType = _MPEG_MC_FIELD;
860 aMVFS[0][0] = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD;
865 *apMotionType = lMotionType;
871 int aDX,
int aDY,
int aH,
int aFSrc,
int aFDst,
int afAvg)
874 int lfInt = (aH & 8) >> 3;
875 int lDXY = ((aDY & 1) << 1) | (aDX & 1);
876 int lUVXY = ((aDX & 2) >> 1) | (aDY & 2);
877 int lSrcX = aX + (aDX >> 1);
878 int lSrcY = ((anY + (aDY >> 1)) << lfInt) + aFSrc;
879 int lMBX = lSrcX >> 4;
880 int lMBY = lSrcY >> 4;
881 _MPEGMotion *lpMotion = &s_MPEG12Ctx.m_pCurMotions->m_Motion[s_MPEG12Ctx.m_pCurMotions->m_nMotions++];
885 __asm__ __volatile__(
886 "pnor $v1, $zero, $zero \n"
888 "pextlw %0, %3, %2 \n"
889 "paddw $v0, $v0, $v1 \n"
890 "pmaxw %0, %0, $zero \n"
891 "pminw %0, %0, $v0 \n"
892 "dsrl32 %1, %0, 0 \n"
894 :
"=r"(lMBX),
"=r"(lMBY) :
"r"(lMBX),
"r"(lMBY),
"m"(s_MPEG12Ctx.m_MBWidth)
897 lpMotion->m_pSrc = (
unsigned char *)(apMBSrc + lMBX + lMBY * s_MPEG12Ctx.m_MBWidth);
898 lpMotion->m_pDstY = (
short *)(s_MPEG12Ctx.m_pCurMotions->m_pSPRRes + (aFDst << 5));
899 lpMotion->m_pDstCbCr = (
short *)(s_MPEG12Ctx.m_pCurMotions->m_pSPRRes + 512 + (aFDst << 3));
900 lpMotion->m_X = lSrcX & 0xF;
901 lpMotion->m_Y = lSrcY & 0xF;
903 lpMotion->m_fInt = lfInt;
904 lpMotion->m_Field = aFSrc;
905 lpMotion->MC_Luma = LumaOp[lDXY + afAvg];
906 lpMotion->MC_Chroma = ChromaOp[lUVXY + afAvg];
909static void _mpeg12_get_refs(
int aBX,
int aBY,
int aMBType,
int aMotionType,
int aPMV[2][2][2],
910 int aMVFS[2][2],
int aDMVector[2])
914 s_MPEG12Ctx.m_pCurMotions->m_nMotions = 0;
916 if ((aMBType & _MPEG_MBT_MOTION_FORWARD) ||
917 (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P)) {
921 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) {
923 if ((aMotionType == _MPEG_MC_FRAME) || !(aMBType & _MPEG_MBT_MOTION_FORWARD)) {
924 _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY, aPMV[0][0][0], aPMV[0][0][1],
926 }
else if (aMotionType == _MPEG_MC_FIELD) {
927 _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[0][0][0], aPMV[0][0][1] >> 1,
928 8, aMVFS[0][0], 0, 0);
929 _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[1][0][0], aPMV[1][0][1] >> 1,
930 8, aMVFS[1][0], 8, 0);
931 }
else if (aMotionType == _MPEG_MC_DMV) {
933 _mpeg12_dual_prime_vector(lDMV, aDMVector, aPMV[0][0][0], aPMV[0][0][1] >> 1);
934 _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[0][0][0], aPMV[0][0][1] >> 1,
936 _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, lDMV[0][0], lDMV[0][1],
938 _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[0][0][0], aPMV[0][0][1] >> 1,
940 _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, lDMV[1][0], lDMV[1][1],
947 lCurField = (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD);
948 lpMBSrc = (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P) && s_MPEG12Ctx.m_fSecField && (lCurField != aMVFS[0][0]) ? s_MPEG12Ctx.m_pBckFrame : s_MPEG12Ctx.m_pFwdFrame;
950 if ((aMotionType == _MPEG_MC_FIELD) || !(aMBType & _MPEG_MBT_MOTION_FORWARD)) {
951 _mpeg12_get_ref(lpMBSrc, aBX, aBY, aPMV[0][0][0], aPMV[0][0][1], 8,
953 _mpeg12_get_ref(lpMBSrc, aBX, aBY + 8, aPMV[0][0][0], aPMV[0][0][1], 8,
955 }
else if (aMotionType == _MPEG_MC_16X8) {
956 _mpeg12_get_ref(lpMBSrc, aBX, aBY, aPMV[0][0][0], aPMV[0][0][1], 8,
959 lpMBSrc = (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P) &&
960 s_MPEG12Ctx.m_fSecField &&
961 (lCurField != aMVFS[1][0]) ?
962 s_MPEG12Ctx.m_pBckFrame :
963 s_MPEG12Ctx.m_pFwdFrame;
964 _mpeg12_get_ref(lpMBSrc, aBX, aBY + 8, aPMV[1][0][0], aPMV[1][0][1], 8,
966 }
else if (aMotionType == _MPEG_MC_DMV) {
967 lpMBSrc = s_MPEG12Ctx.m_fSecField ? s_MPEG12Ctx.m_pBckFrame : s_MPEG12Ctx.m_pFwdFrame;
968 _mpeg12_dual_prime_vector(lDMV, aDMVector, aPMV[0][0][0], aPMV[0][0][1]);
969 _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY, aPMV[0][0][0], aPMV[0][0][1], 16,
971 _mpeg12_get_ref(lpMBSrc, aBX, aBY, lDMV[0][0], lDMV[0][1], 16, !lCurField, 1, 1);
978 if (aMBType & _MPEG_MBT_MOTION_BACKWARD) {
979 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) {
980 if (aMotionType == _MPEG_MC_FRAME) {
981 _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY, aPMV[0][1][0], aPMV[0][1][1],
984 _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY >> 1, aPMV[0][1][0], aPMV[0][1][1] >> 1,
985 8, aMVFS[0][1], 0, lfAdd);
986 _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY >> 1, aPMV[1][1][0], aPMV[1][1][1] >> 1,
987 8, aMVFS[1][1], 8, lfAdd);
990 if (aMotionType == _MPEG_MC_FIELD) {
991 _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY, aPMV[0][1][0], aPMV[0][1][1], 8,
992 aMVFS[0][1], 0, lfAdd);
993 _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY + 8, aPMV[0][1][0], aPMV[0][1][1], 8,
994 aMVFS[0][1], 8, lfAdd);
995 }
else if (aMotionType == _MPEG_MC_16X8) {
996 _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY, aPMV[0][1][0], aPMV[0][1][1],
997 8, aMVFS[0][1], 0, lfAdd);
998 _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY + 8, aPMV[1][1][0], aPMV[1][1][1],
999 8, aMVFS[1][1], 8, lfAdd);
1004 _MPEG_dma_ref_image((
_MPEGMacroBlock8 *)s_MPEG12Ctx.m_pCurMotions->m_pSPRMC,
1005 &s_MPEG12Ctx.m_pCurMotions->m_Motion[0],
1006 s_MPEG12Ctx.m_pCurMotions->m_nMotions, s_MPEG12Ctx.m_MBWidth);
1010static void _mpeg2_mc(
int aMBA,
int aMBType,
int aMotionType,
1011 int aPMV[2][2][2],
int aMVFS[2][2],
1012 int aDMVector[2],
int aMBAI)
1022 lBX = s_MPEG12Ctx.m_pMBXY[aMBA].m_X;
1023 lBY = s_MPEG12Ctx.m_pMBXY[aMBA].m_Y;
1024 lfField = s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME;
1025 lOffset = (lBY * (s_MPEG12Ctx.m_MBWidth << lfField) + lBX) *
sizeof(
_MPEGMacroBlock8);
1026 lfIntra = aMBType & _MPEG_MBT_INTRA;
1027 lfNoSkip = aMBAI == 1;
1028 lfFiledMV = aMotionType & _MPEG_MC_FIELD;
1030 s_MPEG12Ctx.m_pCurMotions->m_Stride = s_MPEG12Ctx.m_MBStride;
1031 s_MPEG12Ctx.m_pCurMotions->m_pMBDstY = UNCACHED_SEG(s_MPEG12Ctx.m_pCurFrameY + lOffset);
1032 s_MPEG12Ctx.m_pCurMotions->m_pMBDstCbCr = UNCACHED_SEG(s_MPEG12Ctx.m_pCurFrameCbCr + lOffset);
1038 _mpeg12_get_refs(lBX, lBY, aMBType, aMotionType, aPMV, aMVFS, aDMVector);
1039 if (lfNoSkip && (aMBType & _MPEG_MBT_PATTERN))
1040 s_MPEG12Ctx.m_pCurMotions->BlockOp = AddBlockOp[lfField][lfFiledMV];
1042 s_MPEG12Ctx.m_pCurMotions->m_pSrc = s_MPEG12Ctx.m_pCurMotions->m_pSPRRes;
1043 s_MPEG12Ctx.m_pCurMotions->BlockOp = PutBlockOp[!lfField + (lfNoSkip && lfFiledMV && !lfField)];
1046 s_MPEG12Ctx.m_pCurMotions->m_Motion[0].MC_Luma = NULL;
1047 s_MPEG12Ctx.m_pCurMotions->m_pSrc = s_MPEG12Ctx.m_pCurMotions->m_pSPRBlk;
1048 s_MPEG12Ctx.m_pCurMotions->BlockOp = PutBlockOp[!lfField];
1053static int _mpeg12_slice(
int aMBAMax)
1058 int lMBA, lMBAI, lMBType, lMotionType;
1061 s_MPEG12Ctx.m_fError = 0;
1062 lMBType = _MPEG_NextStartCode();
1065 if (lMBType < _MPEG_CODE_SLICE_MIN || lMBType > _MPEG_CODE_SLICE_MAX)
1070 s_MPEG12Ctx.m_QScale = _MPEG_GetBits(5);
1072 if (_MPEG_GetBits(1)) {
1077 lMBAI = _MPEG_GetMBAI();
1080 lMBA = ((lMBType & 255) - 1) * s_MPEG12Ctx.m_MBWidth + lMBAI - 1;
1082 lMBAI = s_MPEG12Ctx.m_fDCRst = 1;
1084 lPMV[0][0][0] = lPMV[0][0][1] = lPMV[1][0][0] = lPMV[1][0][1] = 0;
1085 lPMV[0][1][0] = lPMV[0][1][1] = lPMV[1][1][0] = lPMV[1][1][1] = 0;
1091 s_MPEG12Ctx.m_pCurMotions = &s_MPEG12Ctx.m_MC[s_MPEG12Ctx.m_CurMC];
1093 if (lMBA >= aMBAMax || !_MPEG_WaitBDEC())
1097 if (!_MPEG_ShowBits(23) || s_MPEG12Ctx.m_fError) {
1099 s_MPEG12Ctx.m_fError = 0;
1102 lMBAI = _MPEG_GetMBAI();
1109 if (lMBA >= aMBAMax)
1113 retVal = _mpeg12_dec_mb(&lMBType, &lMotionType, lPMV, lMVFS, lDMVector);
1122 s_MPEG12Ctx.m_fDCRst = 1;
1124 if (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P) {
1131 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) {
1132 lMotionType = _MPEG_MC_FRAME;
1134 lMotionType = _MPEG_MC_FIELD;
1135 lMVFS[0][0] = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD;
1136 lMVFS[0][1] = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD;
1139 lMBType &= ~_MPEG_MBT_INTRA;
1142 _mpeg2_mc(lMBA, lMBType, lMotionType, lPMV, lMVFS, lDMVector, lMBAI);
1149 s_MPEG12Ctx.m_CurMC ^= 1;
1151 if (lMBA >= aMBAMax)