📄 yuvac.cpp
字号:
/*************************************************************************
This software module was originally developed by
Ming-Chieh Lee (mingcl@microsoft.com), Microsoft Corporation
Wei-ge Chen (wchen@microsoft.com), Microsoft Corporation
Bruce Lin (blin@microsoft.com), Microsoft Corporation
Chuang Gu (chuanggu@microsoft.com), Microsoft Corporation
(date: March, 1996)
and edited by
Sehoon Son (shson@unitel.co.kr) Samsung AIT
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:
yuva.hpp
Abstract:
YUVA (4:2:0) VOP
Revision History:
*************************************************************************/
#include <iostream.h>
#include "typeapi.h"
#ifdef __MFC_
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
#endif // __MFC_
CVOPU8YUVBA::~CVOPU8YUVBA ()
{
delete m_puciY;
delete m_puciU;
delete m_puciV;
delete m_puciBY;
delete m_puciBUV;
for(Int iAuxComp=0;iAuxComp<m_iAuxCompCount;iAuxComp++) // MAC (SB) 25-Nov-99
delete m_ppuciA[iAuxComp];
delete [] m_ppuciA;
delete [] m_pppxlcA;
delete [] m_pppxlcBoundA;
}
Void CVOPU8YUVBA::constructFromVOPU8 (const CVOPU8YUVBA& vopf, const CRct& rc)
{
if (rc.valid ()) {
m_rctY = rc;
m_rctUV = m_rctY.downSampleBy2 ();
m_puciY = new CU8Image (*vopf.getPlane (Y_PLANE), m_rctY);
m_puciU = new CU8Image (*vopf.getPlane (U_PLANE), m_rctUV);
m_puciV = new CU8Image (*vopf.getPlane (V_PLANE), m_rctUV);
m_ppxlcY = (PixelC*) m_puciY->pixels ();
m_ppxlcU = (PixelC*) m_puciU->pixels ();
m_ppxlcV = (PixelC*) m_puciV->pixels ();
if (m_fAUsage != RECTANGLE) {
m_puciBY = new CU8Image (*vopf.getPlane (BY_PLANE), m_rctY);
m_ppxlcBY = (PixelC*) m_puciBY->pixels ();
m_puciBUV = new CU8Image (*vopf.getPlane (BUV_PLANE), m_rctUV);
m_ppxlcBUV = (PixelC*) m_puciBUV->pixels ();
assert (m_puciBY != NULL);
assert (m_puciBUV != NULL);
if (m_fAUsage == EIGHT_BIT) {
m_ppuciA = new CU8Image* [m_iAuxCompCount]; // MAC (SB) 25-Nov-99
assert(m_ppuciA != NULL);
m_pppxlcA = new PixelC* [m_iAuxCompCount];
assert(m_pppxlcA != NULL);
m_pppxlcBoundA = new PixelC* [m_iAuxCompCount];
assert(m_pppxlcBoundA != NULL);
for(Int iAuxComp=0;iAuxComp<m_iAuxCompCount;iAuxComp++) {
m_ppuciA[iAuxComp] = new CU8Image (*vopf.getPlaneA (iAuxComp), m_rctY);
assert (m_ppuciA[iAuxComp] != NULL);
m_pppxlcA[iAuxComp] = (PixelC*) m_ppuciA[iAuxComp]->pixels ();
}
}
}
}
else {
m_rctY = vopf.whereY ();
m_rctUV = vopf.whereUV ();
m_puciY = new CU8Image (*vopf.getPlane (Y_PLANE));
m_puciU = new CU8Image (*vopf.getPlane (U_PLANE));
m_puciV = new CU8Image (*vopf.getPlane (V_PLANE));
m_ppxlcY = (PixelC*) m_puciY->pixels ();
m_ppxlcU = (PixelC*) m_puciU->pixels ();
m_ppxlcV = (PixelC*) m_puciV->pixels ();
if (m_fAUsage != RECTANGLE) {
m_puciBY = new CU8Image (*vopf.getPlane (BY_PLANE));
m_ppxlcBY = (PixelC*) m_puciBY->pixels ();
m_puciBUV = new CU8Image (*vopf.getPlane (BUV_PLANE));
m_ppxlcBUV = (PixelC*) m_puciBUV->pixels ();
assert (m_puciBY != NULL);
assert (m_puciBUV != NULL);
if (m_fAUsage == EIGHT_BIT) {
m_ppuciA = new CU8Image* [m_iAuxCompCount];
assert(m_ppuciA != NULL);
m_pppxlcA = new PixelC* [m_iAuxCompCount];
assert(m_pppxlcA != NULL);
m_pppxlcBoundA = new PixelC* [m_iAuxCompCount];
assert(m_pppxlcBoundA != NULL);
for(Int iAuxComp=0;iAuxComp<m_iAuxCompCount;iAuxComp++) { // MAC (SB) 25-Nov-99
m_ppuciA[iAuxComp] = new CU8Image (*vopf.getPlaneA (iAuxComp));
assert (m_ppuciA[iAuxComp] != NULL);
m_pppxlcA[iAuxComp] = (PixelC*) m_ppuciA[iAuxComp]->pixels ();
}
}
}
}
assert (m_puciY != NULL);
assert (m_puciU != NULL);
assert (m_puciV != NULL);
}
CVOPU8YUVBA::CVOPU8YUVBA (const CVOPU8YUVBA& vopf, AlphaUsage fAUsage, const CRct& rc) :
m_puciY (NULL), m_puciU (NULL), m_puciV (NULL), m_puciBY (NULL), m_puciBUV (NULL), m_ppuciA (NULL),
m_fAUsage (fAUsage), m_pppxlcA(NULL), m_pppxlcBoundA(NULL)
{
m_iAuxCompCount = vopf.auxCompCount();
constructFromVOPU8 (vopf, rc);
}
CVOPU8YUVBA::CVOPU8YUVBA (const CVOPU8YUVBA& vopf, const CRct& rc) :
m_puciY (NULL), m_puciU (NULL), m_puciV (NULL), m_puciBY (NULL), m_puciBUV (NULL), m_ppuciA (NULL),
m_pppxlcA(NULL), m_pppxlcBoundA(NULL)
{
m_fAUsage = vopf.fAUsage ();
m_iAuxCompCount = vopf.auxCompCount();
constructFromVOPU8 (vopf, rc);
}
CVOPU8YUVBA::CVOPU8YUVBA (const Char* sptFilename) :
m_puciY (NULL), m_puciU (NULL), m_puciV (NULL), m_puciBY (NULL), m_puciBUV (NULL), m_ppuciA (NULL),
m_pppxlcA(NULL), m_pppxlcBoundA(NULL)
{
FILE* pf = fopen (sptFilename, "rb");
// read overhead
Int c0 = getc (pf);
Int c1 = getc (pf);
Int c2 = getc (pf);
assert (c0 == 'S' && (c1 == 'P' || c2 == 'T') );
fread (&m_rctY.left, sizeof (CoordI), 1, pf);
fread (&m_rctY.top, sizeof (CoordI), 1, pf);
fread (&m_rctY.right, sizeof (CoordI), 1, pf);
fread (&m_rctY.bottom, sizeof (CoordI), 1, pf);
fread (&m_fAUsage, sizeof (Int), 1, pf);
fread (&m_iAuxCompCount, sizeof (Int), 1, pf);
m_rctY.width = m_rctY.right - m_rctY.left;
m_rctUV = m_rctY.downSampleBy2 ();
m_puciY = new CU8Image (m_rctY);
assert (m_puciY != NULL);
m_puciU = new CU8Image (m_rctUV);
assert (m_puciU != NULL);
m_puciV = new CU8Image (m_rctUV);
assert (m_puciV != NULL);
m_ppxlcY = (PixelC*) m_puciY->pixels ();
m_ppxlcU = (PixelC*) m_puciU->pixels ();
m_ppxlcV = (PixelC*) m_puciV->pixels ();
if (m_fAUsage != RECTANGLE) {
m_puciBY = new CU8Image (m_rctY, TRANSPARENT); //initialize so that outside VOP is transp
assert (m_puciBY != NULL);
m_puciBUV = new CU8Image (m_rctUV, TRANSPARENT); //initialize so that outside VOP is transp
assert (m_puciBUV != NULL);
m_ppxlcBY = (PixelC*) m_puciBY->pixels ();
m_ppxlcBUV = (PixelC*) m_puciBUV->pixels ();
if (m_fAUsage == EIGHT_BIT) {
m_ppuciA = new CU8Image* [m_iAuxCompCount];
assert(m_ppuciA != NULL);
m_pppxlcA = new PixelC* [m_iAuxCompCount];
assert(m_pppxlcA != NULL);
m_pppxlcBoundA = new PixelC* [m_iAuxCompCount];
assert(m_pppxlcBoundA != NULL);
for(Int iAuxComp=0;iAuxComp<m_iAuxCompCount;iAuxComp++) { // MAC (SB) 25-Nov-99
m_ppuciA[iAuxComp] = new CU8Image (m_rctY, TRANSPARENT); //initialize so that outside VOP is transp
assert (m_ppuciA[iAuxComp] != NULL);
m_pppxlcA[iAuxComp] = (PixelC*) m_ppuciA[iAuxComp]->pixels ();
}
}
}
// read the actual data
fread (m_ppxlcY, sizeof (U8), m_rctY.area (), pf);
fread (m_ppxlcU, sizeof (U8), m_rctUV.area (), pf);
fread (m_ppxlcV, sizeof (U8), m_rctUV.area (), pf);
if (m_fAUsage != RECTANGLE) {
if (m_fAUsage == EIGHT_BIT) {
for(Int iAuxComp=0;iAuxComp<m_iAuxCompCount;iAuxComp++) // MAC (SB) 25-Nov-99
fread ((PixelC*) m_pppxlcA[iAuxComp], sizeof (U8), m_rctY.area (), pf);
} else
fread ((PixelC*) m_ppxlcBY, sizeof (U8), m_rctY.area (), pf);
}
fclose (pf);
}
CVOPU8YUVBA::CVOPU8YUVBA (AlphaUsage fAUsage, const CRct& rc, Int iAuxCompCount ) :
m_puciY (NULL), m_puciU (NULL), m_puciV (NULL), m_puciBY (NULL), m_puciBUV (NULL), m_ppuciA (NULL),
m_fAUsage (fAUsage), m_iAuxCompCount(iAuxCompCount), m_pppxlcA(NULL), m_pppxlcBoundA(NULL)
{
m_rctY = rc;
m_rctUV = m_rctY.downSampleBy2 ();
m_puciY = new CU8Image (m_rctY);
assert (m_puciY != NULL);
m_puciU = new CU8Image (m_rctUV);
assert (m_puciU != NULL);
m_puciV = new CU8Image (m_rctUV);
assert (m_puciV != NULL);
m_ppxlcY = (PixelC*) m_puciY->pixels ();
m_ppxlcU = (PixelC*) m_puciU->pixels ();
m_ppxlcV = (PixelC*) m_puciV->pixels ();
if (m_fAUsage != RECTANGLE) {
m_puciBY = new CU8Image (m_rctY, TRANSPARENT); //initialize so that outside VOP is transp
assert (m_puciBY != NULL);
m_puciBUV = new CU8Image (m_rctUV, TRANSPARENT); //initialize so that outside VOP is transp
assert (m_puciBUV != NULL);
m_ppxlcBY = (PixelC*) m_puciBY->pixels ();
m_ppxlcBUV = (PixelC*) m_puciBUV->pixels ();
if (m_fAUsage == EIGHT_BIT) {
m_ppuciA = new CU8Image* [m_iAuxCompCount];
assert(m_ppuciA != NULL);
m_pppxlcA = new PixelC* [m_iAuxCompCount];
assert(m_pppxlcA != NULL);
m_pppxlcBoundA = new PixelC* [m_iAuxCompCount];
assert(m_pppxlcBoundA != NULL);
for(Int iAuxComp=0;iAuxComp<m_iAuxCompCount;iAuxComp++) { // MAC (SB) 25-Nov-99
m_ppuciA[iAuxComp] = new CU8Image (m_rctY, TRANSPARENT); //initialize so that outside VOP is transp
assert (m_ppuciA[iAuxComp] != NULL);
m_pppxlcA[iAuxComp] = (PixelC*) m_ppuciA[iAuxComp]->pixels ();
}
}
}
}
CVOPU8YUVBA::CVOPU8YUVBA (AlphaUsage fAUsage) :
m_puciY (NULL), m_puciU (NULL), m_puciV (NULL), m_puciBY (NULL), m_puciBUV (NULL), m_ppuciA (NULL),
m_fAUsage (fAUsage), m_iAuxCompCount(0), m_pppxlcA(NULL), m_pppxlcBoundA(NULL)
{
}
Void CVOPU8YUVBA::shift (CoordI left, CoordI top)
{
m_rctY.shift (left, top);
m_rctUV.shift (left / 2, top / 2);
m_puciY -> shift (left, top);
m_puciU -> shift (left / 2, top / 2);
m_puciV -> shift (left / 2, top / 2);
if (m_fAUsage == EIGHT_BIT) {
for(Int iAuxComp=0;iAuxComp<m_iAuxCompCount;iAuxComp++) // MAC (SB) 25-Nov-99
m_ppuciA[iAuxComp] -> shift (left, top);
}
else if (m_fAUsage == ONE_BIT) {
m_puciBY -> shift (left, top);
m_puciBUV -> shift (left / 2, top / 2);
}
}
Void CVOPU8YUVBA::setBoundRct (const CRct& rctBoundY)
{
assert (rctBoundY <= m_rctY);
m_rctBoundY = rctBoundY;
m_rctBoundUV = m_rctBoundY.downSampleBy2 ();
Int iOffsetY = m_rctY.offset (m_rctBoundY.left, m_rctBoundY.top);
Int iOffsetUV = m_rctUV.offset (m_rctBoundUV.left, m_rctBoundUV.top);
m_ppxlcBoundY = (PixelC*) m_puciY->pixels () + iOffsetY;
m_ppxlcBoundU = (PixelC*) m_puciU->pixels () + iOffsetUV;
m_ppxlcBoundV = (PixelC*) m_puciV->pixels () + iOffsetUV;
if (m_fAUsage != RECTANGLE) {
m_ppxlcBoundBY = (PixelC*) m_puciBY->pixels () + iOffsetY;
m_ppxlcBoundBUV = (PixelC*) m_puciBUV->pixels () + iOffsetUV;
if (m_fAUsage == EIGHT_BIT)
for(Int iAuxComp=0;iAuxComp<m_iAuxCompCount;iAuxComp++) // MAC (SB) 25-Nov-99
m_pppxlcBoundA[iAuxComp] = (PixelC*) m_ppuciA[iAuxComp]->pixels () + iOffsetY;
}
}
Void CVOPU8YUVBA::setAndExpandBoundRctOnly (const CRct& rctBoundY, Int iExpand)
{
assert (rctBoundY <= m_rctY);
m_rctBoundY = rctBoundY;
m_rctBoundY.expand (iExpand);
m_rctBoundUV = m_rctBoundY.downSampleBy2 ();
}
Void CVOPU8YUVBA::cropOnAlpha ()
{
m_puciBY -> cropOnAlpha ();
m_puciBUV -> cropOnAlpha ();
m_puciY -> where (m_puciBY -> where ());
m_puciU -> where (m_puciBUV -> where ());
m_puciV -> where (m_puciBUV -> where ());
if (m_fAUsage == EIGHT_BIT)
for(Int iAuxComp=0;iAuxComp<m_iAuxCompCount;iAuxComp++) // MAC (SB) 25-Nov-99
m_ppuciA[iAuxComp] -> where (m_puciBY -> where ());
}
Void CVOPU8YUVBA::overlay (const CVOPU8YUVBA& vopc)
{
if (!vopc.valid ()) return;
if (m_puciBY) //sometime rectangular vops dont have by
m_puciBY -> overlay (*vopc.getPlane (BY_PLANE));
if (m_puciBUV)
m_puciBUV -> overlay (*vopc.getPlane (BUV_PLANE));
m_puciY -> overlay (*vopc.getPlane (Y_PLANE));
m_puciU -> overlay (*vopc.getPlane (U_PLANE));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -