⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 h263decframep.c

📁 audio-video-codecs.rar语音编解码器
💻 C
📖 第 1 页 / 共 4 页
字号:
              } else {
                if (!fourMVmode)
                  pMBinfo->mv[0].dx = pMBinfo->mv[0].dy = 0;
                else {
                  pMBinfo->type |= 0x80; /* to indicate to OBMC that no MV is present */
                  h263_Zero4MV(pMBinfo->mv);
                }
              }

              if (pbFlag && bmb_type != IPPVC_MBTYPE_BACKWARD) {
                if (h263_PredictDecode4MV_PB(pInfo, &pMBinfo->mv[0], &mvForw[0], &mvBack[0], &mvForwPred,
                    bmb_type, mvdb, trd, trb, 0) != H263_STATUS_OK) {
                  h263_Error("Error when decoding MVDB");
                  goto Err_1;
                }
                h263_LimitMV(mvForw, mvForw, &limitRectL, dx, dy, 16);
                h263_ComputeChromaMV(&mvForw[0], &mvFCbCr);
                if (bmb_type != IPPVC_MBTYPE_FORWARD) {
                  h263_LimitMV(mvBack, mvBack, &limitRectL, dx, dy, 16);
                  h263_ComputeChromaMV(&mvBack[0], &mvBCbCr);
                }
              }

              if (!VPic->oppmodes.advIntra)
                status = h263_DecodeMacroBlockIntra(pInfo, (cbpy << 2) + cbpc, quant, quant_c, pF, stepF);
              else
                status = h263_DecodeMacroBlockIntra_AdvI(pInfo, colNum, (cbpy << 2) + cbpc, quant, quant_c, predMode, pF, stepF);
              if (status != H263_STATUS_OK) {
                h263_Error("Error when decoding coefficients of Intra block");
                goto Err_1;
              }
              if (pbFlag) {
                Ipp8u *pRefY, *pRefCb, *pRefCr;
                Ipp32s  stepLum, stepChr;

                if (bmb_type != IPPVC_MBTYPE_FORWARD) {
                  if (bmb_type != IPPVC_MBTYPE_BACKWARD) {

                    h263_BidirPredMacroblock(pYr, stepYr, pCbr, pCrr, stepCbr, pYc, stepYc, pCbc, pCrc, stepCbc,
                                             predMB, &mvForw[0], &mvFCbCr, &mvBack[0], &mvBCbCr, 0);

                    pRefY  =  predMB;         stepLum = 16;
                    pRefCb =  predMB + 4*64;  stepChr = 8;
                    pRefCr =  predMB + 5*64;
                  } else {
                    pRefY  =  pYc;   stepLum = stepYc;
                    pRefCb =  pCbc;  stepChr = stepCbc;
                    pRefCr =  pCrc;
                  }

                  h263_DecodeMCBlockInter_B(pInfo, bquant, cbpb & 32, pRefY, stepLum, pYn, stepYn, coeffMB_bI);
                  h263_DecodeMCBlockInter_B(pInfo, bquant, cbpb & 16, pRefY+8, stepLum, pYn+8, stepYn, coeffMB_bI);
                  h263_DecodeMCBlockInter_B(pInfo, bquant, cbpb & 8, pRefY+8*stepLum, stepLum, pYn+8*stepYn, stepYn, coeffMB_bI);
                  h263_DecodeMCBlockInter_B(pInfo, bquant, cbpb & 4, pRefY+8+8*stepLum, stepLum, pYn+8+8*stepYn, stepYn, coeffMB_bI);
                  h263_DecodeMCBlockInter_B(pInfo, bquant_c, cbpb & 2, pRefCb, stepChr, pCbn, stepCbn, coeffMB_bI);
                  h263_DecodeMCBlockInter_B(pInfo, bquant_c, cbpb & 1, pRefCr, stepChr, pCrn, stepCrn, coeffMB_bI);

                } else {
                  if (cbpb & 60) {
                    h263_DecodeMCBlockInter(pInfo, bquant, cbpb & 32, pYr, pYn, stepYr, coeffMB_bI, &mvForw[0], 0);
                    h263_DecodeMCBlockInter(pInfo, bquant, cbpb & 16, pYr+8, pYn+8, stepYr, coeffMB_bI, &mvForw[0], 0);
                    h263_DecodeMCBlockInter(pInfo, bquant, cbpb & 8, pYr+stepYr*8, pYn+stepYn*8, stepYr, coeffMB_bI, &mvForw[0], 0);
                    h263_DecodeMCBlockInter(pInfo, bquant, cbpb & 4, pYr+8+stepYr*8, pYn+8+stepYn*8, stepYr, coeffMB_bI, &mvForw[0], 0);
                  } else {
                    h263_Copy16x16HP_8u(pYr, stepYr, pYn, stepYn, &mvForw[0], 0);
                    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
                    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
                    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
                    h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
                  }
                  h263_DecodeMCBlockInter(pInfo, bquant_c, cbpb & 2, pCbr, pCbn, stepCbr, coeffMB_bI, &mvFCbCr, 0);
                  h263_DecodeMCBlockInter(pInfo, bquant_c, cbpb & 1, pCrr, pCrn, stepCrr, coeffMB_bI, &mvFCbCr, 0);
                }
              }
            } else { /* INTER MB */

              fourMVmb = (mb_type == IPPVC_MBTYPE_INTER4V || mb_type == IPPVC_MBTYPE_INTER4V_Q);

              if (VPic->oppmodes.advIntra) {
                for (k = 0; k < 6; k++)
                  b[(colNum + 1)*6 + k].dct_dc = -1;
              }

              if (!fourMVmb) {
                if (h263_PredictDecodeMV(pInfo, pMBinfo, frGOB, rowNum, colNum, fourMVmode) != H263_STATUS_OK) {
                  h263_Error("Error when decoding motion vector");
                  goto Err_1;
                }
                h263_LimitMV(&pMBinfo->mv[0], &mvCur[0], &limitRectL, dx, dy, 16);
                h263_ComputeChromaMV(&mvCur[0], &mvCbCr);
                if (fourMVmode) {
                  mvCur[1] = mvCur[2] = mvCur[3] = mvCur[0];
                  pMBinfo->mv[1] = pMBinfo->mv[2] = pMBinfo->mv[3] = pMBinfo->mv[0];
                }
                if (pbFlag && bmb_type != IPPVC_MBTYPE_BACKWARD) {
                  if (h263_PredictDecode4MV_PB(pInfo, &pMBinfo->mv[0], &mvForw[0], &mvBack[0], &mvForwPred,
                      bmb_type, mvdb, trd, trb, 0) != H263_STATUS_OK) {
                    h263_Error("Error when decoding MVDB");
                    goto Err_1;
                  }
                  h263_LimitMV(mvForw, mvForw, &limitRectL, dx, dy, 16);
                  h263_ComputeChromaMV(&mvForw[0], &mvFCbCr);
                  if (bmb_type != IPPVC_MBTYPE_FORWARD) {
                    h263_LimitMV(mvBack, mvBack, &limitRectL, dx, dy, 16);
                    h263_ComputeChromaMV(&mvBack[0], &mvBCbCr);
                  }
                }
              } else {
                if (h263_PredictDecode4MV(pInfo, pMBinfo, frGOB, rowNum, colNum) != H263_STATUS_OK) {
                  h263_Error("Error when decoding motion vectors");
                  goto Err_1;
                }
                h263_Limit4MV(pMBinfo->mv, mvCur, &limitRectL, dx, dy, 8);
                h263_ComputeChroma4MV(pMBinfo->mv, &mvCbCr);
                h263_LimitMV(&mvCbCr, &mvCbCr, &limitRectC, dx >> 1, dy >> 1, 8);

                if (pbFlag && bmb_type != IPPVC_MBTYPE_BACKWARD) {
                  if (h263_PredictDecode4MV_PB(pInfo, &pMBinfo->mv[0], &mvForw[0], &mvBack[0], &mvForwPred,
                      bmb_type, mvdb, trd, trb, 1) != H263_STATUS_OK) {
                    h263_Error("Error when decoding MVDB");
                    goto Err_1;
                  }
                  h263_Limit4MV(mvForw, mvForw, &limitRectL, dx, dy, 8);
                  if (bmb_type != IPPVC_MBTYPE_FORWARD) {
                    h263_Limit4MV(mvBack, mvBack, &limitRectL, dx, dy, 8);
                    h263_ComputeChroma4MV(&mvBack[0], &mvBCbCr);
                    h263_LimitMV(&mvBCbCr, &mvBCbCr, &limitRectC, dx >> 1, dy >> 1, 8);
                    h263_ComputeChroma4MV(&mvForw[0], &mvFCbCr);
                  } else
                    h263_ComputeChromaMV(&mvForw[0], &mvFCbCr);
                  h263_LimitMV(&mvFCbCr, &mvFCbCr, &limitRectC, dx >> 1, dy >> 1, 8);
                }
              }

              /* decode and MC blocks */
              if (!obmcFlag) {
                if (fourMVmb) {
                  h263_DecodeMCBlockInter(pInfo, quant, cbpy & 8, pYr, pYc, stepYr, coeffMB, &mvCur[0], rt);
                  h263_DecodeMCBlockInter(pInfo, quant, cbpy & 4, pYr+8, pYc+8, stepYr, coeffMB, &mvCur[1], rt);
                  h263_DecodeMCBlockInter(pInfo, quant, cbpy & 2, pYr+stepYr*8, pYc+stepYc*8, stepYr, coeffMB, &mvCur[2], rt);
                  h263_DecodeMCBlockInter(pInfo, quant, cbpy & 1, pYr+8+stepYr*8, pYc+8+stepYc*8, stepYr, coeffMB, &mvCur[3], rt);
                } else if (cbpy) {
                  h263_DecodeMCBlockInter(pInfo, quant, cbpy & 8, pYr, pYc, stepYr, coeffMB, &mvCur[0], rt);
                  h263_DecodeMCBlockInter(pInfo, quant, cbpy & 4, pYr+8, pYc+8, stepYr, coeffMB, &mvCur[0], rt);
                  h263_DecodeMCBlockInter(pInfo, quant, cbpy & 2, pYr+stepYr*8, pYc+stepYc*8, stepYr, coeffMB, &mvCur[0], rt);
                  h263_DecodeMCBlockInter(pInfo, quant, cbpy & 1, pYr+8+stepYr*8, pYc+8+stepYc*8, stepYr, coeffMB, &mvCur[0], rt);
                } else {
                  h263_Copy16x16HP_8u(pYr, stepYr, pYc, stepYc, &mvCur[0], rt);
                  h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
                  h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
                  h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
                  h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
                }
                h263_DecodeMCBlockInter(pInfo, quant_c, cbpc & 2, pCbr, pCbc, stepCbr, coeffMB, &mvCbCr, rt);
                h263_DecodeMCBlockInter(pInfo, quant_c, cbpc & 1, pCrr, pCrc, stepCrr, coeffMB, &mvCbCr, rt);

                if (pbFlag) {
                  Ipp8u *pRefY, *pRefCb, *pRefCr;
                  Ipp32s stepLum, stepChr;

                  if (bmb_type != IPPVC_MBTYPE_FORWARD) {
                    if (bmb_type != IPPVC_MBTYPE_BACKWARD) {

                      h263_BidirPredMacroblock(pYr, stepYr, pCbr, pCrr, stepCbr, pYc, stepYc, pCbc, pCrc, stepCbc,
                                              predMB, &mvForw[0], &mvFCbCr, &mvBack[0], &mvBCbCr, fourMVmb);

                      pRefY  =  predMB;         stepLum = 16;
                      pRefCb =  predMB + 4*64;  stepChr = 8;
                      pRefCr =  predMB + 5*64;
                    } else {
                      pRefY  =  pYc;   stepLum = stepYc;
                      pRefCb =  pCbc;  stepChr = stepCbc;
                      pRefCr =  pCrc;
                    }
                    h263_DecodeMCBlockInter_B(pInfo, bquant, cbpb & 32, pRefY, stepLum, pYn, stepYn, coeffMB_b);
                    h263_DecodeMCBlockInter_B(pInfo, bquant, cbpb & 16, pRefY+8, stepLum, pYn+8, stepYn, coeffMB_b);
                    h263_DecodeMCBlockInter_B(pInfo, bquant, cbpb & 8, pRefY+8*stepLum, stepLum, pYn+8*stepYn, stepYn, coeffMB_b);
                    h263_DecodeMCBlockInter_B(pInfo, bquant, cbpb & 4, pRefY+8+8*stepLum, stepLum, pYn+8+8*stepYn, stepYn, coeffMB_b);
                    h263_DecodeMCBlockInter_B(pInfo, bquant_c, cbpb & 2, pRefCb, stepChr, pCbn, stepCbn, coeffMB_b);
                    h263_DecodeMCBlockInter_B(pInfo, bquant_c, cbpb & 1, pRefCr, stepChr, pCrn, stepCrn, coeffMB_b);

                  } else {
                    if (cbpb >> 2) {
                      h263_DecodeMCBlockInter(pInfo, bquant, cbpb & 32, pYr, pYn, stepYr, coeffMB_b, &mvForw[0], 0);
                      h263_DecodeMCBlockInter(pInfo, bquant, cbpb & 16, pYr+8, pYn+8, stepYr, coeffMB_b, &mvForw[0], 0);
                      h263_DecodeMCBlockInter(pInfo, bquant, cbpb & 8, pYr+stepYr*8, pYn+stepYn*8, stepYr, coeffMB_b, &mvForw[0], 0);
                      h263_DecodeMCBlockInter(pInfo, bquant, cbpb & 4, pYr+8+stepYr*8, pYn+8+stepYn*8, stepYr, coeffMB_b, &mvForw[0], 0);
                    } else {
                      h263_Copy16x16HP_8u(pYr, stepYr, pYn, stepYn, &mvForw[0], 0);
                      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
                      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
                      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
                      h263_StatisticInc_(&pInfo->VideoSequence.Statistic.nB_INTER_NC);
                    }
                    h263_DecodeMCBlockInter(pInfo, bquant_c, cbpb & 2, pCbr, pCbn, stepCbr, coeffMB_b, &mvFCbCr, 0);
                    h263_DecodeMCBlockInter(pInfo, bquant_c, cbpb & 1, pCrr, pCrn, stepCrr, coeffMB_b, &mvFCbCr, 0);
                  }
                }
              }
            }
          }

         if (obmcFlag) {
            /* OBMC for previous MB */
            if (colNum > 0) {
              if ((pMBinfo[-1].type & 0x7F) != IPPVC_MBTYPE_INTRA && (pMBinfo[-1].type & 0x7F) != IPPVC_MBTYPE_INTRA_Q) {
                /* type may have been ORed with 0x80 */
                h263_OBMC(pInfo, pMBinfo - 1, mvPrev, colNum - 1, rowNum, limitRectL, pYc - 16, stepYc, pYr - 16,
                          stepYr, cbpyPrev, coeffMB);

                if (pbFlag) {
                  if (pMBinfo[-1].type == IPPVC_MB_STUFFING) {
                    IppiSize roi;
                    roi.height = roi.width = 16;
                    ippiCopy16x16_8u_C1R(pYc - 16, stepYc, pYn - 16, stepYn);
                    ippiAddBackPredPB_H263_8u_C1R(pYr - 16, stepYr, roi, pYn - 16, stepYn, 0);
                    roi.height = roi.width = 8;
                    ippiCopy8x8_8u_C1R(pCbc - 8, stepCbc, pCbn - 8, stepCbn);
                    ippiAddBackPredPB_H263_8u_C1R(pCbr - 8, stepCbr, roi, pCbn - 8, stepCbn, 0);
                    ippiCopy8x8_8u_C1R(pCrc - 8, stepCrc, pCrn - 8, stepCrn);
                    ippiAddBackPredPB_H263_8u_C1R(pCrr - 8, stepCrr, roi, pCrn - 8, stepCrn, 0);
                  } else {
                    Ipp8u *pRefY, *pRefCb, *pRefCr;
                    Ipp32s  stepLum, stepChr;
                    Ipp32s prev4MVmb = (pMBinfo[-1].type == IPPVC_MBTYPE_INTER4V || pMBinfo[-1].type == IPPVC_MBTYPE_INTER4V_Q);

                    if (bmb_typePrev != IPPVC_MBTYPE_FORWARD) {
                      if (bmb_typePrev != IPPVC_MBTYPE_BACKWARD) {

                        h263_BidirPredMacroblock(pYr - 16, stepYr, pCbr - 8, pCrr - 8, stepCbr, pYc - 16, stepYc,
                                                 pCbc - 8, pCrc - 8, stepCbc,
                                                 predMB, &mvForwPrev[0], &mvFCbCrPrev, &mvBackPrev[0], &mvBCbCrPrev, prev4MVmb);

                        pRefY  =  predMB;         stepLum = 16;
                        pRefCb =  predMB + 4*64;  stepChr = 8;
                        pRefCr =  predMB + 5*64;
                      } else {
                        pRefY  =  pYc - 16;  stepLum = stepYc;
                        pRefCb =  pCbc - 8;  stepChr = stepCbc;
                        pRefCr =  pCrc - 8;
                      }
                      h263_MC(cbpbPrev & 32, pRefY, stepLum, pYn-16, stepYn, coeffMB_b);
                      h263_MC(cbpbPrev & 16, pRefY+8, stepLum, pYn-16+8, stepYn, coeffMB_b + 64);
                      h263_MC(cbpbPrev & 8, pRefY+8*stepLum, stepLum, pYn-16+8*stepYn, stepYn, coeffMB_b + 2*64);
                      h263_MC(cbpbPrev & 4, pRefY+8+8*stepLum, stepLum, pYn-16+8+8*stepYn, stepYn, coeffMB_b + 3*64);
                      h263_MC(cbpbPrev & 2, pRefCb, stepChr, pCbn-8, stepCbn, coeffMB_b + 4*64);
                      h263_MC(cbpbPrev & 1, pRefCr, stepChr, pCrn-8, stepCrn, coeffMB_b + 5*64);
                    } else {
                      h263_MC_HP(cbpbPrev & 32, pYr-16, stepYr, pYn-16, stepYn, coeffMB_b, &mvForwPrev[0], 0);
                      h263_MC_HP(cbpbPrev & 16, pYr-16+8, stepYr, pYn-16+8, stepYn, coeffMB_b + 64, &mvForwPrev[0], 0);
                      h263_MC_HP(cbpbPrev & 8, pYr-16+8*stepYr, stepYr, pYn-16+8*stepYn, stepYn, coeffMB_b + 2*64, &mvForwPrev[0], 0);
                      h263_MC_HP(cbpbPrev & 4, pYr-16+8+8*stepYr, stepYr, pYn-16+8+8*stepYn, stepYn, coeffMB_b + 3*64, &mvForwPrev[0], 0);
                      h263_MC_HP(cbpbPrev & 2, pCbr-8, stepCbr, pCbn-8, stepCbn, coeffMB_b + 4*64, &mvFCbCrPrev, 0);
                      h263_MC_HP(cbpbPrev & 1, pCrr-8, stepCrr, pCrn-8, stepCrn, coeffMB_b + 5*64, &mvFCbCrPrev, 0);
                    }
                  }
                }
              }
            }
            if (mb_type != IPPVC_MBTYPE_INTRA && mb_type != IPPVC_MBTYPE_INTRA_Q) {
              if (mb_not_coded) {
                cbpyPrev = 0;
                h263_Zero4MV(mvPrev);
                ippiCopy8x8_8u_C1R(pCbr, stepCbr, pCbc, stepCbc);
                ippiCopy8x8_8u_C1R(pCrr, stepCrr, pCrc, stepCrc);
              } else {
                cbpyPrev = cbpy;
                mvPrev[0] = mvCur[0]; mvPrev[1] = mvCur[1]; mvPrev[2] = mvCur[2]; mvPrev[3] = mvCur[3];
                if (h263_DecodeMacroBlockInter(pInfo, coeffMB, quant, quant_c, (cbpy << 2) + cbpc) != H263_STATUS_OK) {
                  h263_Error("Error when decoding coefficients of Inter block");
                  goto Err_1;
                }
                h263_MC_HP(cbpc & 2, pCbr, stepCbr, pCbc, stepCbc, coeffMB+256, &mvCbCr, rt);
                h263_MC_HP(cbpc & 1, pCrr, stepCrr, pCrc, stepCrc, coeffMB+320, &mvCbCr, rt);

                if (pbFlag) {
                  cbpbPrev = cbpb;
                  bmb_typePrev = bmb_type;
                  if (bmb_type == -1 || bmb_type == IPPVC_MBTYPE_INTERPOLATE) {
                    mvBackPrev[0] = mvBack[0];
                    if (fourMVmb) {
                      mvBackPrev[1] = mvBack[1]; mvBackPrev[2] = mvBack[2]; mvBackPrev[3] = mvBack[3];
                      mvForwPrev[1] = mvForw[1]; mvForwPrev[2] = mvForw[2]; mvForwPrev[3] = mvForw[3];
                    }
                    mvBCbCrPrev = mvBCbCr;
                  }
                  mvForwPrev[0] = mvForw[0];
                  mvFCbCrPrev = mvFCbCr;

                  if (h263_DecodeMacroBlockInter(pInfo, coeffMB_b, bquant, bquant_c, cbpb) != H263_STATUS_OK) {
                    h263_Error("Error when decoding coefficients of Inter block");
                    goto Err_1;
                  }
                }
              }

              if (colNum == mbPerRow - 1) {
                h263_OBMC(pInfo, pMBinfo, mvPrev, colNum, rowNum, limitRectL, pYc, stepYc, pYr, stepYr, cbpyPrev, coeffMB);

                if (pbFlag) {
                  Ipp8u *pRefY, *pRefCb, *pRefCr;
                  if (mb_not_coded) {
                    IppiSize roi;
                    roi.height = roi.width = 16;
                    ippiCopy16x16_8u_C1R(pYc, stepYc, pYn, stepYn);
                    ippiAddBackPredPB_H263_8u_C1R(pYr, stepYr, roi, pYn, stepYn, 0);
                    roi.height = roi.width = 8;
                    ippiCopy8x8_8u_C1R(pCbc, stepCbc, pCbn, stepCbn);
                    ippiAddBackPredPB_H263_8u_C1R(pCbr, stepCbr, roi, pCbn, stepCbn, 0);
                    ippiCopy8x8_8u_C1R(pCrc, stepCrc, pCrn, stepCrn);
                    ippiAddBackPredPB_H263_8u_C1R(pCrr, stepCrr, roi, pCrn, stepCrn, 0);
                  } else {
                    Ipp32s  stepLum, stepChr;
                    if (bmb_typePrev != IPPVC_MBTYPE_FORWARD) {
                      if (bmb_typePrev != IPPVC_MBTYPE_BACKWARD) {

                        h263_BidirPredMacroblock(pYr, stepYr, pCbr, pCrr, stepCbr, pYc, stepYc, pCbc, pCrc, stepCbc,
                                                 predMB, &mvForwPrev[0], &mvFCbCrPrev, &mvBackPrev[0], &mvBCbCrPrev, fourMVmb);

                        pRefY  =  predMB;         stepLum = 16;
                        pRefCb =  predMB + 4*64;  stepChr = 8;
                        pRefCr =  predMB + 5*64;
                      } else {
                        pRefY  =  pYc;  stepLum = stepYc;
                        pRefCb =  pCbc;  stepChr = stepCbc;
                        pRefCr =  pCrc;
                      }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -