28static void (*LumaOp[8])(
_MPEGMotion *m, u8 *a2,
short *a3,
int a4,
int var1,
int ta,
int a7,
int a8) = {
29 _MPEG_put_luma, _MPEG_put_luma_X, _MPEG_put_luma_Y, _MPEG_put_luma_XY,
30 _MPEG_avg_luma, _MPEG_avg_luma_X, _MPEG_avg_luma_Y, _MPEG_avg_luma_XY};
32static void (*ChromaOp[8])(
_MPEGMotion *m, u8 *a2,
short *a3,
int a4,
int var1,
int ta,
int a7,
int a8) = {
33 _MPEG_put_chroma, _MPEG_put_chroma_X, _MPEG_put_chroma_Y, _MPEG_put_chroma_XY,
34 _MPEG_avg_chroma, _MPEG_avg_chroma_X, _MPEG_avg_chroma_Y, _MPEG_avg_chroma_XY};
37 _MPEG_put_block_il, _MPEG_put_block_fr, _MPEG_put_block_fl};
40 {_MPEG_add_block_frfr, _MPEG_add_block_frfl},
41 {_MPEG_add_block_ilfl, _MPEG_add_block_ilfl}};
43static float s_FrameRate[16] = {
44 0.0F, ((23.0F * 1000.0F) / 1001.0F),
45 24.0F, 25.0F, ((30.0F * 1000.0F) / 1001.0F),
46 30.0F, 50.0F, ((60.0F * 1000.0F) / 1001.0F),
47 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 *apData, s64 *apPTS);
74static int _get_first_picture(
void *apData, s64 *apPTS);
76int (*MPEG_Picture)(
void *apData, s64 *apPTS);
78static void (*DoMC)(void);
80static void _mpeg12_picture_data(
void);
81static int _mpeg12_slice(
int aMBAMax);
82static int _mpeg12_dec_mb(
int *apMBType,
int *apMotionType,
int aPMV[2][2][2],
int aMVFS[2][2],
int aDMVector[2]);
85 int (*apDataCB)(
void *userdata),
void *apDataCBParam,
86 void *(*apInitCB)(
void *userdata,
MPEGSequenceInfo *si),
void *apInitCBParam,
89 memset(&s_MPEG12Ctx, 0,
sizeof(s_MPEG12Ctx));
91 _MPEG_Initialize(&s_MPEG12Ctx, apDataCB, apDataCBParam, &s_MPEG12Ctx.m_SI.m_fEOF);
94 s_pInitCBParam = apInitCBParam;
97 s_MPEG12Ctx.m_SI.m_FrameCnt = 0;
98 s_MPEG12Ctx.m_SI.m_fEOF = 0;
99 s_MPEG12Ctx.m_SI.m_Profile = -1;
100 s_MPEG12Ctx.m_SI.m_Level = -1;
101 s_MPEG12Ctx.m_SI.m_ChromaFmt = MPEG_CHROMA_FORMAT_420;
102 s_MPEG12Ctx.m_SI.m_VideoFmt = MPEG_VIDEO_FORMAT_UNSPEC;
103 s_MPEG12Ctx.m_fMPEG2 = 0;
105 s_MPEG12Ctx.m_MC[0].m_pSPRBlk = (
void *)0x70000000;
106 s_MPEG12Ctx.m_MC[0].m_pSPRRes = (
void *)0x70000300;
107 s_MPEG12Ctx.m_MC[0].m_pSPRMC = (
void *)0x70000600;
108 s_MPEG12Ctx.m_MC[1].m_pSPRBlk = (
void *)0x70001E00;
109 s_MPEG12Ctx.m_MC[1].m_pSPRRes = (
void *)0x70002100;
110 s_MPEG12Ctx.m_MC[1].m_pSPRMC = (
void *)0x70002400;
112 MPEG_Picture = _get_first_picture;
115void MPEG_Destroy(
void)
121static void *_init_seq(
void)
123 int lMBWidth, lMBHeight;
126 if (!s_MPEG12Ctx.m_fMPEG2) {
127 s_MPEG12Ctx.m_fProgSeq = 1;
128 s_MPEG12Ctx.m_PictStruct = _MPEG_PS_FRAME;
129 s_MPEG12Ctx.m_fFPFrmDCT = 1;
132 lMBWidth = (s_MPEG12Ctx.m_SI.m_Width + 15) / 16;
133 if (s_MPEG12Ctx.m_fMPEG2 && !s_MPEG12Ctx.m_fProgSeq) {
134 lMBHeight = 2 * ((s_MPEG12Ctx.m_SI.m_Height + 31) / 32);
136 lMBHeight = (s_MPEG12Ctx.m_SI.m_Height + 15) / 16;
139 if (lMBWidth != s_MPEG12Ctx.m_MBWidth || lMBHeight != s_MPEG12Ctx.m_MBHeight) {
140 unsigned int lAllocSize;
143 if (s_MPEG12Ctx.m_pFwdFrame)
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;
155 s_MPEG12Ctx.m_MBCount = s_MPEG12Ctx.m_MBWidth * s_MPEG12Ctx.m_MBHeight;
157 lAllocSize = (lSize * 3) + (s_MPEG12Ctx.m_MBCount *
sizeof(
_MPEGMBXY));
159 pA = memalign(64, lAllocSize);
161 s_MPEG12Ctx.m_pFrameArena = pA;
170 for (i = 0; i < s_MPEG12Ctx.m_MBCount; ++i) {
171 s_MPEG12Ctx.m_pMBXY[i].m_X = i % lMBWidth;
172 s_MPEG12Ctx.m_pMBXY[i].m_Y = i / lMBWidth;
176 return _init_cb(s_pInitCBParam, &s_MPEG12Ctx.m_SI);
179static void _destroy_seq(
void)
181 MPEG_Picture = _get_first_picture;
183 if (s_MPEG12Ctx.m_pFrameArena) {
184 free(s_MPEG12Ctx.m_pFrameArena);
185 s_MPEG12Ctx.m_pAuxFrame = NULL;
186 s_MPEG12Ctx.m_pBckFrame = NULL;
187 s_MPEG12Ctx.m_pFwdFrame = NULL;
188 s_MPEG12Ctx.m_pMBXY = NULL;
191 s_MPEG12Ctx.m_MBWidth = 0;
192 s_MPEG12Ctx.m_MBHeight = 0;
200static int _get_hdr(
void)
203 unsigned int lCode = _MPEG_NextStartCode();
207 case _MPEG_CODE_SEQ_HDR:
210 case _MPEG_CODE_GRP_START:
213 case _MPEG_CODE_PIC_START:
216 case _MPEG_CODE_SEQ_END:
217 MPEG_Picture = _get_first_picture;
223static void _seq_header(
void)
225 s_MPEG12Ctx.m_SI.m_Width = _MPEG_GetBits(12);
226 s_MPEG12Ctx.m_SI.m_Height = _MPEG_GetBits(12);
229 s_MPEG12Ctx.m_SI.m_MSPerFrame = (int)((1000.0F / s_FrameRate[s_MPEG12Ctx.m_FRCode = _MPEG_GetBits(4)]) + 0.5F);
235 if (_MPEG_GetBits(1))
240 if (_MPEG_GetBits(1))
248static void _gop_header(
void)
265static void _pic_header(
void)
270 lPicCT = _MPEG_GetBits(3);
273 if (lPicCT == _MPEG_PT_P || lPicCT == _MPEG_PT_B) {
274 s_MPEG12Ctx.m_FPFVector = _MPEG_GetBits(1);
275 s_MPEG12Ctx.m_FwdFCode = _MPEG_GetBits(3);
278 if (lPicCT == _MPEG_PT_B) {
279 s_MPEG12Ctx.m_FPBVector = _MPEG_GetBits(1);
280 s_MPEG12Ctx.m_BckFCode = _MPEG_GetBits(3);
286 _MPEG_SetPCT(s_MPEG12Ctx.m_PictCodingType = lPicCT);
289static void _ext_and_ud(
void)
292 lCode = _MPEG_NextStartCode();
294 while (lCode == _MPEG_CODE_EXTENSION || lCode == _MPEG_CODE_USER_DATA) {
295 if (lCode == _MPEG_CODE_EXTENSION) {
297 lXID = _MPEG_GetBits(4);
303 case _MPEG_XID_SEQUENCE:
306 case _MPEG_XID_DISPLAY:
309 case _MPEG_XID_QMATRIX:
312 case _MPEG_XID_COPYRIGHT:
315 case _MPEG_XID_SCALABLE:
321 case _MPEG_XID_PIC_DSP:
324 case _MPEG_XID_PIC_COD:
327 case _MPEG_XID_PIC_SSC:
330 case _MPEG_XID_PIC_TSC:
335 lCode = _MPEG_NextStartCode();
338 lCode = _MPEG_NextStartCode();
343static void _ext_unknown(
void) {}
345static void _ext_seq(
void)
352 s_MPEG12Ctx.m_fMPEG2 = 1;
356 lProfLevel = _MPEG_GetBits(8);
357 s_MPEG12Ctx.m_fProgSeq = _MPEG_GetBits(1);
358 s_MPEG12Ctx.m_SI.m_ChromaFmt = _MPEG_GetBits(2);
359 lHSzX = _MPEG_GetBits(2);
360 lVSzX = _MPEG_GetBits(2);
366 lFRXn = _MPEG_GetBits(2);
367 lFRXd = _MPEG_GetBits(5);
370 lFRXn = _MPEG_GetBits(2);
371 lFRXd = _MPEG_GetBits(5);
373 s_MPEG12Ctx.m_SI.m_MSPerFrame = (int)((1000.0F / (s_FrameRate[s_MPEG12Ctx.m_FRCode] * ((lFRXn + 1.0F) / (lFRXd + 1.0F)))) + 0.5F);
375 if ((lProfLevel >> 7) & 1) {
376 if ((lProfLevel & 15) == 5) {
377 s_MPEG12Ctx.m_SI.m_Profile = MPEG_PROFILE_422;
378 s_MPEG12Ctx.m_SI.m_Level = MPEG_LEVEL_MAIN;
380 s_MPEG12Ctx.m_SI.m_Profile = s_MPEG12Ctx.m_SI.m_Level = -1;
383 s_MPEG12Ctx.m_SI.m_Profile = lProfLevel >> 4;
384 s_MPEG12Ctx.m_SI.m_Level = lProfLevel & 0xF;
387 s_MPEG12Ctx.m_SI.m_Width = (lHSzX << 12) | (s_MPEG12Ctx.m_SI.m_Width & 0x0FFF);
388 s_MPEG12Ctx.m_SI.m_Height = (lVSzX << 12) | (s_MPEG12Ctx.m_SI.m_Height & 0x0FFF);
392static void _ext_seq_dsp(
void)
394 s_MPEG12Ctx.m_SI.m_VideoFmt = _MPEG_GetBits(3);
396 if (_MPEG_GetBits(1)) {
414static void _ext_qnt_mtx(
void)
418 if (_MPEG_GetBits(1))
421 if (_MPEG_GetBits(1))
424 if (_MPEG_GetBits(1)) {
425 for (i = 0; i < 16; ++i)
429 if (_MPEG_GetBits(1)) {
430 for (i = 0; i < 16; ++i)
435static void _ext_cpy_rgt(
void)
455static void _ext_seq_scl(
void) {}
457static void _ext_pic_dsp(
void)
462 if (s_MPEG12Ctx.m_fProgSeq) {
463 if (s_MPEG12Ctx.m_fRepFF)
464 lnFCO = s_MPEG12Ctx.m_fTopFF ? 3 : 2;
468 if (s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME)
471 lnFCO = s_MPEG12Ctx.m_fRepFF ? 3 : 2;
475 for (i = 0; i < lnFCO; ++i) {
483static void _ext_pic_cod(
void)
486 s_MPEG12Ctx.m_FCode[0][0] = _MPEG_GetBits(4);
487 s_MPEG12Ctx.m_FCode[0][1] = _MPEG_GetBits(4);
488 s_MPEG12Ctx.m_FCode[1][0] = _MPEG_GetBits(4);
489 s_MPEG12Ctx.m_FCode[1][1] = _MPEG_GetBits(4);
491 s_MPEG12Ctx.m_PictStruct = _MPEG_GetBits(2);
492 s_MPEG12Ctx.m_fTopFF = _MPEG_GetBits(1);
493 s_MPEG12Ctx.m_fFPFrmDCT = _MPEG_GetBits(1);
494 s_MPEG12Ctx.m_fConsMV = _MPEG_GetBits(1);
496 s_MPEG12Ctx.m_fRepFF = _MPEG_GetBits(1);
503 if (_MPEG_GetBits(1)) {
516static void _ext_pic_ssc(
void) {}
519static void _ext_pic_tsc(
void) {}
521static void _xtra_bitinf(
void)
523 while (_MPEG_GetBits(1))
527static int _get_first_picture(
void *apData, s64 *apPTS)
529 int retVal = _get_hdr();
532 s_MPEG12Ctx.m_SI.m_FrameCnt = 0;
534 apData = _init_seq();
535 _mpeg12_picture_data();
537 if (s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME)
538 s_MPEG12Ctx.m_fSecField ^= 1;
540 MPEG_Picture = _get_next_picture;
542 if (!s_MPEG12Ctx.m_fSecField)
543 ++s_MPEG12Ctx.m_SI.m_FrameCnt;
545 retVal = _get_next_picture(apData, apPTS);
551static int _get_next_picture(
void *apData, s64 *apPTS)
556 if ((retVal = _get_hdr())) {
559 _mpeg12_picture_data();
561 if ((s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME || s_MPEG12Ctx.m_fSecField) && s_MPEG12Ctx.m_SI.m_FrameCnt) {
564 if (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_B) {
565 lpData = s_MPEG12Ctx.m_pAuxFrame;
566 *apPTS = s_MPEG12Ctx.m_AuxPTS;
568 lpData = s_MPEG12Ctx.m_pFwdFrame;
569 *apPTS = s_MPEG12Ctx.m_FwdPTS;
572 lfPic = _MPEG_CSCImage(lpData, apData, s_MPEG12Ctx.m_MBCount);
575 if (s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME)
576 s_MPEG12Ctx.m_fSecField ^= 1;
578 if (!s_MPEG12Ctx.m_fSecField)
579 ++s_MPEG12Ctx.m_SI.m_FrameCnt;
591static void _mpeg12_do_next_mc(
void)
593 _MPEGMotions *lpMotions = &s_MPEG12Ctx.m_MC[!s_MPEG12Ctx.m_CurMC];
596 while (lpMotion->MC_Luma) {
597 _MPEG_do_mc(lpMotion);
601 lpMotions->BlockOp(lpMotions);
604static void _mpeg12_do_first_mc(
void)
606 DoMC = _mpeg12_do_next_mc;
610static void _mpeg12_picture_data(
void)
612 int lMBAMax = s_MPEG12Ctx.m_MBWidth * s_MPEG12Ctx.m_MBHeight;
615 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME && s_MPEG12Ctx.m_fSecField)
616 s_MPEG12Ctx.m_fSecField = 0;
618 if (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_B) {
619 s_MPEG12Ctx.m_pCurFrame = s_MPEG12Ctx.m_pAuxFrame;
620 s_MPEG12Ctx.m_AuxPTS = *s_pCurPTS;
624 if (!s_MPEG12Ctx.m_fSecField) {
625 lpMB = s_MPEG12Ctx.m_pFwdFrame;
626 lPTS = s_MPEG12Ctx.m_FwdPTS;
627 s_MPEG12Ctx.m_pFwdFrame = s_MPEG12Ctx.m_pBckFrame;
628 s_MPEG12Ctx.m_FwdPTS = s_MPEG12Ctx.m_BckPTS;
629 s_MPEG12Ctx.m_pBckFrame = lpMB;
630 s_MPEG12Ctx.m_BckPTS = lPTS;
633 s_MPEG12Ctx.m_pCurFrame = s_MPEG12Ctx.m_pBckFrame;
634 s_MPEG12Ctx.m_BckPTS = *s_pCurPTS;
637 s_MPEG12Ctx.m_pCurFrameY = (
unsigned char *)s_MPEG12Ctx.m_pCurFrame;
638 s_MPEG12Ctx.m_pCurFrameCbCr = (
unsigned char *)s_MPEG12Ctx.m_pCurFrame + 256;
639 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD) {
640 s_MPEG12Ctx.m_pCurFrameY += 16;
641 s_MPEG12Ctx.m_pCurFrameCbCr += 8;
644 if (s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME)
647 s_MPEG12Ctx.m_CurMC = 0;
649 DoMC = _mpeg12_do_first_mc;
651 while (_mpeg12_slice(lMBAMax) >= 0)
660static void _mpeg12_decode_motion_vector(
int *apPred,
int aRSize,
int aMotionCode,
661 int aMotionResidual,
int aFullPelVector)
663 int lLim = 16 << aRSize;
664 int lVec = aFullPelVector ? *apPred >> 1 : *apPred;
666 if (aMotionCode > 0) {
667 lVec += ((aMotionCode - 1) << aRSize) + aMotionResidual + 1;
672 }
else if (aMotionCode < 0) {
673 lVec -= ((-aMotionCode - 1) << aRSize) + aMotionResidual + 1;
679 *apPred = aFullPelVector ? lVec << 1 : lVec;
683static void _mpeg12_dual_prime_vector(
int aDMV[][2],
const int *apDMVector,
int aMVX,
int aMVY)
685 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) {
686 if (s_MPEG12Ctx.m_fTopFF) {
687 aDMV[0][0] = ((aMVX + (aMVX > 0)) >> 1) + apDMVector[0];
688 aDMV[0][1] = ((aMVY + (aMVY > 0)) >> 1) + apDMVector[1] - 1;
690 aDMV[1][0] = ((3 * aMVX + (aMVX > 0)) >> 1) + apDMVector[0];
691 aDMV[1][1] = ((3 * aMVY + (aMVY > 0)) >> 1) + apDMVector[1] + 1;
693 aDMV[0][0] = ((3 * aMVX + (aMVX > 0)) >> 1) + apDMVector[0];
694 aDMV[0][1] = ((3 * aMVY + (aMVY > 0)) >> 1) + apDMVector[1] - 1;
696 aDMV[1][0] = ((aMVX + (aMVX > 0)) >> 1) + apDMVector[0];
697 aDMV[1][1] = ((aMVY + (aMVY > 0)) >> 1) + apDMVector[1] + 1;
700 aDMV[0][0] = ((aMVX + (aMVX > 0)) >> 1) + apDMVector[0];
701 aDMV[0][1] = ((aMVY + (aMVY > 0)) >> 1) + apDMVector[1];
703 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_TOP_FIELD)
712static void _mpeg12_motion_vector(
int *apPMV,
int *apDMVector,
int aHRSize,
713 int aVRSize,
int aDMV,
int aMVScale,
int aFullPelVector)
719 lMotionCode = _MPEG_GetMotionCode();
720 lMotionResidual = aHRSize && lMotionCode ? _MPEG_GetBits(aHRSize) : 0;
722 _mpeg12_decode_motion_vector(&apPMV[0], aHRSize, lMotionCode, lMotionResidual, aFullPelVector);
725 apDMVector[0] = _MPEG_GetDMVector();
727 s_MPEG12Ctx.m_fError = lMotionCode == -32768;
730 lMotionCode = _MPEG_GetMotionCode();
731 lMotionResidual = aVRSize && lMotionCode ? _MPEG_GetBits(aVRSize) : 0;
736 _mpeg12_decode_motion_vector(&apPMV[1], aVRSize, lMotionCode, lMotionResidual, aFullPelVector);
742 apDMVector[1] = _MPEG_GetDMVector();
744 s_MPEG12Ctx.m_fError = lMotionCode == -32768;
747static void _mpeg12_motion_vectors(
748 int aPMV[2][2][2],
int aDMVector[2],
int aMVFS[2][2],
int aS,
int anMV,
749 int aMVFmt,
int aHRSize,
int aVRSize,
int aDMV,
int aMVScale)
752 if (aMVFmt == _MPEG_MV_FIELD && !aDMV)
753 aMVFS[1][aS] = aMVFS[0][aS] = _MPEG_GetBits(1);
755 _mpeg12_motion_vector(aPMV[0][aS], aDMVector, aHRSize, aVRSize, aDMV, aMVScale, 0);
757 aPMV[1][aS][0] = aPMV[0][aS][0];
758 aPMV[1][aS][1] = aPMV[0][aS][1];
760 aMVFS[0][aS] = _MPEG_GetBits(1);
761 _mpeg12_motion_vector(aPMV[0][aS], aDMVector, aHRSize, aVRSize, aDMV, aMVScale, 0);
763 aMVFS[1][aS] = _MPEG_GetBits(1);
764 _mpeg12_motion_vector(aPMV[1][aS], aDMVector, aHRSize, aVRSize, aDMV, aMVScale, 0);
768static int _mpeg12_dec_mb(
769 int *apMBType,
int *apMotionType,
770 int aPMV[2][2][2],
int aMVFS[2][2],
int aDMVector[2])
783 lMBType = _MPEG_GetMBType();
788 lfIntra = lMBType & _MPEG_MBT_INTRA;
790 if (lMBType & (_MPEG_MBT_MOTION_FORWARD | _MPEG_MBT_MOTION_BACKWARD)) {
792 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME)
793 lMotionType = s_MPEG12Ctx.m_fFPFrmDCT ? _MPEG_MC_FRAME : _MPEG_GetBits(2);
795 lMotionType = _MPEG_GetBits(2);
797 }
else if (lfIntra && s_MPEG12Ctx.m_fConsMV)
798 lMotionType = (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) ? _MPEG_MC_FRAME : _MPEG_MC_FIELD;
800 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) {
801 lnMV = lMotionType == _MPEG_MC_FIELD ? 2 : 1;
802 lMVFmt = lMotionType == _MPEG_MC_FRAME ? _MPEG_MV_FRAME : _MPEG_MV_FIELD;
804 lnMV = (lMotionType == _MPEG_MC_16X8) ? 2 : 1;
805 lMVFmt = _MPEG_MV_FIELD;
808 lDMV = lMotionType == _MPEG_MC_DMV;
809 lMVScale = lMVFmt == _MPEG_MV_FIELD && s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME;
810 lDCType = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME && !s_MPEG12Ctx.m_fFPFrmDCT && lMBType & (_MPEG_MBT_PATTERN | _MPEG_MBT_INTRA) ? _MPEG_GetBits(1) : 0;
812 if (lMBType & _MPEG_MBT_QUANT)
813 s_MPEG12Ctx.m_QScale = _MPEG_GetBits(5);
815 if ((lMBType & _MPEG_MBT_MOTION_FORWARD) || (lfIntra && s_MPEG12Ctx.m_fConsMV)) {
816 if (s_MPEG12Ctx.m_fMPEG2)
817 _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);
819 _mpeg12_motion_vector(aPMV[0][0], aDMVector, s_MPEG12Ctx.m_FwdFCode - 1, s_MPEG12Ctx.m_FwdFCode - 1, 0, 0, s_MPEG12Ctx.m_FPFVector);
822 if (s_MPEG12Ctx.m_fError)
825 if (lMBType & _MPEG_MBT_MOTION_BACKWARD) {
826 if (s_MPEG12Ctx.m_fMPEG2)
827 _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);
829 _mpeg12_motion_vector(aPMV[0][1], aDMVector, s_MPEG12Ctx.m_BckFCode - 1, s_MPEG12Ctx.m_BckFCode - 1, 0, 0, s_MPEG12Ctx.m_FPBVector);
832 if (s_MPEG12Ctx.m_fError)
835 if (lfIntra && s_MPEG12Ctx.m_fConsMV)
838 if (lMBType & (_MPEG_MBT_INTRA | _MPEG_MBT_PATTERN))
839 _MPEG_BDEC(lfIntra, s_MPEG12Ctx.m_fDCRst, lDCType, s_MPEG12Ctx.m_QScale, s_MPEG12Ctx.m_pCurMotions->m_pSPRBlk);
841 s_MPEG12Ctx.m_fDCRst = !lfIntra;
843 if (lfIntra && !s_MPEG12Ctx.m_fConsMV) {
854 if ((s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P) && !(lMBType & (_MPEG_MBT_MOTION_FORWARD | _MPEG_MBT_INTRA))) {
860 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) {
861 lMotionType = _MPEG_MC_FRAME;
863 lMotionType = _MPEG_MC_FIELD;
864 aMVFS[0][0] = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD;
869 *apMotionType = lMotionType;
875 int aDX,
int aDY,
int aH,
int aFSrc,
int aFDst,
int afAvg)
878 int lfInt = (aH & 8) >> 3;
879 int lDXY = ((aDY & 1) << 1) | (aDX & 1);
880 int lUVXY = ((aDX & 2) >> 1) | (aDY & 2);
881 int lSrcX = aX + (aDX >> 1);
882 int lSrcY = ((anY + (aDY >> 1)) << lfInt) + aFSrc;
883 int lMBX = lSrcX >> 4;
884 int lMBY = lSrcY >> 4;
885 _MPEGMotion *lpMotion = &s_MPEG12Ctx.m_pCurMotions->m_Motion[s_MPEG12Ctx.m_pCurMotions->m_nMotions++];
890 __asm__ __volatile__(
891 "pnor $v1, $zero, $zero \n"
893 "pextlw %0, %3, %2 \n"
894 "paddw $v0, $v0, $v1 \n"
895 "pmaxw %0, %0, $zero \n"
896 "pminw %0, %0, $v0 \n"
897 "dsrl32 %1, %0, 0 \n"
899 :
"=r"(lMBX),
"=r"(lMBY) :
"r"(lMBX),
"r"(lMBY),
"m"(s_MPEG12Ctx.m_MBWidth)
902 lMBX = MIN(MAX(lMBX, 0), s_MPEG12Ctx.m_MBWidth - 1);
903 lMBY = MIN(MAX(lMBY, 0), s_MPEG12Ctx.m_MBWidth - 1);
906 lpMotion->m_pSrc = (
unsigned char *)(apMBSrc + lMBX + lMBY * s_MPEG12Ctx.m_MBWidth);
907 lpMotion->m_pDstY = (
short *)(s_MPEG12Ctx.m_pCurMotions->m_pSPRRes + (aFDst << 5));
908 lpMotion->m_pDstCbCr = (
short *)(s_MPEG12Ctx.m_pCurMotions->m_pSPRRes + 512 + (aFDst << 3));
909 lpMotion->m_X = lSrcX & 0xF;
910 lpMotion->m_Y = lSrcY & 0xF;
912 lpMotion->m_fInt = lfInt;
913 lpMotion->m_Field = aFSrc;
914 lpMotion->MC_Luma = LumaOp[lDXY + afAvg];
915 lpMotion->MC_Chroma = ChromaOp[lUVXY + afAvg];
918static void _mpeg12_get_refs(
int aBX,
int aBY,
int aMBType,
int aMotionType,
int aPMV[2][2][2],
919 int aMVFS[2][2],
int aDMVector[2])
923 s_MPEG12Ctx.m_pCurMotions->m_nMotions = 0;
925 if ((aMBType & _MPEG_MBT_MOTION_FORWARD) ||
926 (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P)) {
930 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) {
932 if ((aMotionType == _MPEG_MC_FRAME) || !(aMBType & _MPEG_MBT_MOTION_FORWARD)) {
933 _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY, aPMV[0][0][0], aPMV[0][0][1],
935 }
else if (aMotionType == _MPEG_MC_FIELD) {
936 _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[0][0][0], aPMV[0][0][1] >> 1,
937 8, aMVFS[0][0], 0, 0);
938 _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[1][0][0], aPMV[1][0][1] >> 1,
939 8, aMVFS[1][0], 8, 0);
940 }
else if (aMotionType == _MPEG_MC_DMV) {
942 _mpeg12_dual_prime_vector(lDMV, aDMVector, aPMV[0][0][0], aPMV[0][0][1] >> 1);
943 _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[0][0][0], aPMV[0][0][1] >> 1,
945 _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, lDMV[0][0], lDMV[0][1],
947 _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[0][0][0], aPMV[0][0][1] >> 1,
949 _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, lDMV[1][0], lDMV[1][1],
956 lCurField = (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD);
957 lpMBSrc = (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P) && s_MPEG12Ctx.m_fSecField && (lCurField != aMVFS[0][0]) ? s_MPEG12Ctx.m_pBckFrame : s_MPEG12Ctx.m_pFwdFrame;
959 if ((aMotionType == _MPEG_MC_FIELD) || !(aMBType & _MPEG_MBT_MOTION_FORWARD)) {
960 _mpeg12_get_ref(lpMBSrc, aBX, aBY, aPMV[0][0][0], aPMV[0][0][1], 8,
962 _mpeg12_get_ref(lpMBSrc, aBX, aBY + 8, aPMV[0][0][0], aPMV[0][0][1], 8,
964 }
else if (aMotionType == _MPEG_MC_16X8) {
965 _mpeg12_get_ref(lpMBSrc, aBX, aBY, aPMV[0][0][0], aPMV[0][0][1], 8,
968 lpMBSrc = (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P) &&
969 s_MPEG12Ctx.m_fSecField &&
970 (lCurField != aMVFS[1][0]) ?
971 s_MPEG12Ctx.m_pBckFrame :
972 s_MPEG12Ctx.m_pFwdFrame;
973 _mpeg12_get_ref(lpMBSrc, aBX, aBY + 8, aPMV[1][0][0], aPMV[1][0][1], 8,
975 }
else if (aMotionType == _MPEG_MC_DMV) {
976 lpMBSrc = s_MPEG12Ctx.m_fSecField ? s_MPEG12Ctx.m_pBckFrame : s_MPEG12Ctx.m_pFwdFrame;
977 _mpeg12_dual_prime_vector(lDMV, aDMVector, aPMV[0][0][0], aPMV[0][0][1]);
978 _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY, aPMV[0][0][0], aPMV[0][0][1], 16,
980 _mpeg12_get_ref(lpMBSrc, aBX, aBY, lDMV[0][0], lDMV[0][1], 16, !lCurField, 1, 1);
987 if (aMBType & _MPEG_MBT_MOTION_BACKWARD) {
988 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) {
989 if (aMotionType == _MPEG_MC_FRAME) {
990 _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY, aPMV[0][1][0], aPMV[0][1][1],
993 _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY >> 1, aPMV[0][1][0], aPMV[0][1][1] >> 1,
994 8, aMVFS[0][1], 0, lfAdd);
995 _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY >> 1, aPMV[1][1][0], aPMV[1][1][1] >> 1,
996 8, aMVFS[1][1], 8, lfAdd);
999 if (aMotionType == _MPEG_MC_FIELD) {
1000 _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY, aPMV[0][1][0], aPMV[0][1][1], 8,
1001 aMVFS[0][1], 0, lfAdd);
1002 _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY + 8, aPMV[0][1][0], aPMV[0][1][1], 8,
1003 aMVFS[0][1], 8, lfAdd);
1004 }
else if (aMotionType == _MPEG_MC_16X8) {
1005 _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY, aPMV[0][1][0], aPMV[0][1][1],
1006 8, aMVFS[0][1], 0, lfAdd);
1007 _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY + 8, aPMV[1][1][0], aPMV[1][1][1],
1008 8, aMVFS[1][1], 8, lfAdd);
1013 _MPEG_dma_ref_image((
_MPEGMacroBlock8 *)s_MPEG12Ctx.m_pCurMotions->m_pSPRMC,
1014 &s_MPEG12Ctx.m_pCurMotions->m_Motion[0],
1015 s_MPEG12Ctx.m_pCurMotions->m_nMotions, s_MPEG12Ctx.m_MBWidth);
1019static void _mpeg2_mc(
int aMBA,
int aMBType,
int aMotionType,
1020 int aPMV[2][2][2],
int aMVFS[2][2],
1021 int aDMVector[2],
int aMBAI)
1031 lBX = s_MPEG12Ctx.m_pMBXY[aMBA].m_X;
1032 lBY = s_MPEG12Ctx.m_pMBXY[aMBA].m_Y;
1033 lfField = s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME;
1034 lOffset = (lBY * (s_MPEG12Ctx.m_MBWidth << lfField) + lBX) *
sizeof(
_MPEGMacroBlock8);
1035 lfIntra = aMBType & _MPEG_MBT_INTRA;
1036 lfNoSkip = aMBAI == 1;
1037 lfFiledMV = aMotionType & _MPEG_MC_FIELD;
1039 s_MPEG12Ctx.m_pCurMotions->m_Stride = s_MPEG12Ctx.m_MBStride;
1040 s_MPEG12Ctx.m_pCurMotions->m_pMBDstY = UNCACHED_SEG(s_MPEG12Ctx.m_pCurFrameY + lOffset);
1041 s_MPEG12Ctx.m_pCurMotions->m_pMBDstCbCr = UNCACHED_SEG(s_MPEG12Ctx.m_pCurFrameCbCr + lOffset);
1047 _mpeg12_get_refs(lBX, lBY, aMBType, aMotionType, aPMV, aMVFS, aDMVector);
1048 if (lfNoSkip && (aMBType & _MPEG_MBT_PATTERN))
1049 s_MPEG12Ctx.m_pCurMotions->BlockOp = AddBlockOp[lfField][lfFiledMV];
1051 s_MPEG12Ctx.m_pCurMotions->m_pSrc = s_MPEG12Ctx.m_pCurMotions->m_pSPRRes;
1052 s_MPEG12Ctx.m_pCurMotions->BlockOp = PutBlockOp[!lfField + (lfNoSkip && lfFiledMV && !lfField)];
1055 s_MPEG12Ctx.m_pCurMotions->m_Motion[0].MC_Luma = NULL;
1056 s_MPEG12Ctx.m_pCurMotions->m_pSrc = s_MPEG12Ctx.m_pCurMotions->m_pSPRBlk;
1057 s_MPEG12Ctx.m_pCurMotions->BlockOp = PutBlockOp[!lfField];
1062static int _mpeg12_slice(
int aMBAMax)
1067 int lMBA, lMBAI, lMBType, lMotionType;
1070 s_MPEG12Ctx.m_fError = 0;
1071 lMBType = _MPEG_NextStartCode();
1074 if (lMBType < _MPEG_CODE_SLICE_MIN || lMBType > _MPEG_CODE_SLICE_MAX)
1079 s_MPEG12Ctx.m_QScale = _MPEG_GetBits(5);
1081 if (_MPEG_GetBits(1)) {
1086 lMBAI = _MPEG_GetMBAI();
1089 lMBA = ((lMBType & 255) - 1) * s_MPEG12Ctx.m_MBWidth + lMBAI - 1;
1091 lMBAI = s_MPEG12Ctx.m_fDCRst = 1;
1093 lPMV[0][0][0] = lPMV[0][0][1] = lPMV[1][0][0] = lPMV[1][0][1] = 0;
1094 lPMV[0][1][0] = lPMV[0][1][1] = lPMV[1][1][0] = lPMV[1][1][1] = 0;
1100 s_MPEG12Ctx.m_pCurMotions = &s_MPEG12Ctx.m_MC[s_MPEG12Ctx.m_CurMC];
1102 if (lMBA >= aMBAMax || !_MPEG_WaitBDEC())
1106 if (!_MPEG_ShowBits(23) || s_MPEG12Ctx.m_fError) {
1108 s_MPEG12Ctx.m_fError = 0;
1111 lMBAI = _MPEG_GetMBAI();
1118 if (lMBA >= aMBAMax)
1122 retVal = _mpeg12_dec_mb(&lMBType, &lMotionType, lPMV, lMVFS, lDMVector);
1131 s_MPEG12Ctx.m_fDCRst = 1;
1133 if (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P) {
1140 if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) {
1141 lMotionType = _MPEG_MC_FRAME;
1143 lMotionType = _MPEG_MC_FIELD;
1144 lMVFS[0][0] = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD;
1145 lMVFS[0][1] = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD;
1148 lMBType &= ~_MPEG_MBT_INTRA;
1151 _mpeg2_mc(lMBA, lMBType, lMotionType, lPMV, lMVFS, lDMVector, lMBAI);
1158 s_MPEG12Ctx.m_CurMC ^= 1;
1160 if (lMBA >= aMBAMax)