【VC开源代码栏目提醒】:网学会员,鉴于大家对VC开源代码十分关注,论文会员在此为大家搜集整理了“mbenc.cpp”一文,供大家参考学习!
/*************************************************************************
This software module was originally developed by
Ming-Chieh Lee (
mbenc.cpp为[网学网-网友上传,谢谢支持]。), Microsoft Corporation
Wei-ge Chen (
mbenc.cpp为[网学网-网友上传,谢谢支持]。), Microsoft Corporation
Simon Winder (
mbenc.cpp为[网学网-网友上传,谢谢支持]。), Microsoft Corporation
(date: June, 1997)
and edited by
Wei Wu (
mbenc.cpp为[网学网-网友上传,谢谢支持]。) Rockwell Science Center
and also edited by
Yoshihiro Kikuchi (TOSHIBA CORPORATION)
Takeshi Nagai (TOSHIBA CORPORATION)
Toshiaki Watanabe (TOSHIBA CORPORATION)
Noboru Yamaguchi (TOSHIBA CORPORATION)
in the course of development of the MPEG-4 Video (ISO/IEC 14496-2).
This software module is an implementation of a part of one or more MPEG-4 Video tools
as specified by the MPEG-4 Video.
ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications
thereof for use in hardware or software products claiming conformance to the MPEG-4 Video.
Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents.
The original developer of this software module and his/her company,
the subsequent editors and their companies,
and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation.
Copyright is not released for non MPEG-4 Video conforming products.
Microsoft retains full right to use the code for his/her own purpose,
assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products.
This copyright notice must be included in all copies or derivative works.
Copyright (c) 1996, 1997.
Module Name:
MBenc.cpp
Abstract:
MacroBlock encoder
Revision History:
This software module was edited by
Hiroyuki Katata (
mbenc.cpp为[网学网-网友上传,谢谢支持]。), Sharp Corporation
Norio Ito (
mbenc.cpp为[网学网-网友上传,谢谢支持]。), Sharp Corporation
Shuichi Watanabe (
mbenc.cpp为[网学网-网友上传,谢谢支持]。), Sharp Corporation
(date: October, 1997)
for object based temporal scalability.
Dec 20, 1997: Interlaced tools added by NextLevel Systems X.Chen, B. Eifrig
May. 9 1998: add boundary by Hyundai Electronics
Cheol-Soo Park (
mbenc.cpp为[网学网-网友上传,谢谢支持]。)
May 9, 1999: tm5 rate control by DemoGraFX,
mbenc.cpp为[网学网-网友上传,谢谢支持]。
NOTE:
m_pvopfCurrQ holds the original data until it is texture quantized
*************************************************************************/
#include <stdlib.h>
#include <math.h>
#include <iostream.h>
#include "typeapi.h"
#include "codehead.h"
#include "mode.hpp"
#include "global.hpp"
#include "entropy/bitstrm.hpp"
#include "entropy/entropy.hpp"
#include "entropy/huffman.hpp"
#include "vopses.hpp"
#include "vopseenc.hpp"
#ifdef __MFC_
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
#endif // __MFC_
/*Void CVideoObjectEncoder::encodePVOPMBWithShape (
PixelC* ppxlcRefMBY, PixelC* ppxlcRefMBU, PixelC* ppxlcRefMBV,
PixelC* ppxlcRefMBA, PixelC* ppxlcRefBY,
CMBMode* pmbmd, const CMotionVector* pmv, CMotionVector* pmvBY,
ShapeMode shpmdColocatedMB,
Int imbX, Int imbY,
CoordI x, CoordI y, Int& iQPPrev)
{
encodePVOPMBJustShape(ppxlcRefBY,pmbmd,shpmdColocatedMB,pmv,pmvBY,x,y,imbX,imbY);
dumpCachedShapeBits();
encodePVOPMBTextureWithShape(ppxlcRefMBY,ppxlcRefMBU,ppxlcRefMBV,ppxlcRefMBA,pmbmd,
pmv,imbX,imbY,x,y,iQPPrev);
}*/
Void CVideoObjectEncoder::encodePVOPMBJustShape(
PixelC* ppxlcRefBY, CMBMode* pmbmd, ShapeMode shpmdColocatedMB,
const CMotionVector* pmv, CMotionVector* pmvBY,
CoordI x, CoordI y, Int imbX, Int imbY)
{
m_statsMB.nBitsShape += codeInterShape (
ppxlcRefBY, m_pvopcRefQ0, pmbmd, shpmdColocatedMB,
pmv, pmvBY, x, y, imbX, imbY
);
// change pmbmd to inter if all transparent
decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY);
}
Void CVideoObjectEncoder::dumpCachedShapeBits()
{
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace("INSERTING PRE-ENCODED MB SHAPE STREAM HERE\n");
m_pbitstrmOut->trace(m_pbitstrmOut->getCounter(),"Location Before");
#endif // __TRACE_AND_STATS_
m_pbitstrmOut->putBitStream(*m_pbitstrmShapeMBOut);
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace(m_pbitstrmOut->getCounter(),"Location After");
#endif // __TRACE_AND_STATS_
m_pbitstrmShapeMBOut->flush();
m_pbitstrmShapeMBOut->resetAll();
}
Void CVideoObjectEncoder::encodePVOPMBTextureWithShape(
PixelC* ppxlcRefMBY, PixelC* ppxlcRefMBU, PixelC* ppxlcRefMBV,
PixelC* ppxlcRefMBA, CMBMode* pmbmd, const CMotionVector* pmv,
Int imbX, Int imbY, CoordI x, CoordI y, Int& iQPPrev,
Int &iQPPrevAlpha, Bool &bUseNewQPForVlcThr)
{
// update quantiser
pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;
if(bUseNewQPForVlcThr)
pmbmd->m_stepSizeDelayed = pmbmd->m_stepSize;
else
pmbmd->m_stepSizeDelayed = iQPPrev;
iQPPrev = pmbmd->m_stepSize;
if (pmbmd -> m_dctMd == INTRA || pmbmd -> m_dctMd == INTRAQ) {
if(pmbmd -> m_rgTranspStatus [0] == PARTIAL)
LPEPadding (pmbmd);
if (m_volmd.fAUsage == EIGHT_BIT) {
// update alpha quant
if(!m_volmd.bNoGrayQuantUpdate)
{
iQPPrevAlpha = (iQPPrev * m_vopmd.intStepPAlpha) / m_vopmd.intStep;
if(iQPPrevAlpha<1)
iQPPrevAlpha=1;
}
pmbmd->m_stepSizeAlpha = iQPPrevAlpha;
}
assert (pmbmd -> m_rgTranspStatus [0] != ALL);
/*BBM// Added for Boundary by Hyundai(1998-5-9)
if (m_vopmd.bInterlace && pmbmd -> m_rgTranspStatus [0] == PARTIAL)
boundaryMacroBlockMerge (pmbmd);
// End of Hyundai(1998-5-9)*/
quantizeTextureIntraMB (imbX, imbY, pmbmd, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA);
codeMBTextureHeadOfPVOP (pmbmd);
sendDCTCoefOfIntraMBTexture (pmbmd);
if (m_volmd.fAUsage == EIGHT_BIT) {
codeMBAlphaHeadOfPVOP (pmbmd);
sendDCTCoefOfIntraMBAlpha (pmbmd);
}
/*BBM// Added for Boundary by Hyundai(1998-5-9)
if (m_vopmd.bInterlace && pmbmd -> m_bMerged[0])
mergedMacroBlockSplit (pmbmd, ppxlcRefMBY, ppxlcRefMBA);
// End of Hyundai(1998-5-9)*/
bUseNewQPForVlcThr = FALSE;
}
else { // INTER or skipped
if (m_volmd.fAUsage == EIGHT_BIT) {
// update alpha quant
if(!m_volmd.bNoGrayQuantUpdate)
iQPPrevAlpha = (iQPPrev * m_vopmd.intStepPAlpha) / m_vopmd.intStep;
pmbmd->m_stepSizeAlpha = iQPPrevAlpha;
}
if (pmbmd -> m_rgTranspStatus [0] == PARTIAL) {
CoordI xRefUV, yRefUV;
// INTERLACE
// new changes
if(pmbmd->m_bFieldMV) {
CoordI xRefUV1, yRef
上一篇:
mbdec.cpp
下一篇:
临床前药物安全性评价中毒性病理学新技术的应用