📄 seg.cpp
字号:
getchar();
#endif
for ( i=0; i<colors; i++ ){
SrcWidth[i] = SrcImage[i].width;
SrcHeight[i] = SrcImage[i].height;
DstWidth[i] = (i==0)?tile_width:tile_width/2;
DstHeight[i] = (i==0)?tile_height:tile_height/2;
/* printf("Source Size: %d %d\n", SrcWidth[i], SrcHeight[i]);*/
/* printf("Destination Size: %d %d\n", DstWidth[i], DstHeight[i]);*/
SrcPtr = (UChar *)(SrcImage[i].data) + iTileX * DstWidth[i] + iTileY * DstHeight[i] * SrcWidth[i];
/* FPDAM begin: added by Sharp */
if (i==0) {
SrcMask = (UChar *)(SrcImage[i].mask) + iTileX*DstWidth[i] + iTileY*DstHeight[i]*SrcWidth[i];
} else {
SrcMask = (UChar *)(DstImage[0].mask);
}
/* FPDAM end: added by Sharp */
DstPtr = (UChar *)(DstImage[i].data);
DstMask = (UChar *)(DstImage[i].mask);
/* Reset Mask */
memset(DstMask, (UChar)0, DstImage[i].width*DstImage[i].height);
/* memset(DstPtr, (UChar)0, DstImage[i].width*DstImage[i].height);*/
/* For the case tile locates in boundary */
if ( iTileX == iTileW-1 )
RealWidth[i] = Width = SrcWidth[i] - DstWidth[i]*iTileX;
else
RealWidth[i] = Width = DstWidth[i];
if ( iTileY == iTileH-1 )
RealHeight[i] = Height = SrcHeight[i] - DstHeight[i]*iTileY;
else
RealHeight[i] = Height = DstHeight[i];
/* printf("Cut region: %d %d\n", Width, Height);*/
if ( i== 0 ) {
Int blocksize = 1 << mzte_codec.m_iWvtDecmpLev;
Int virtual_width, virtual_height;
blocksize = LCM(blocksize,2);
virtual_width = mzte_codec.m_iRealWidth = Width;
virtual_height = mzte_codec.m_iRealHeight = Height;
mzte_codec.m_iOriginX = 0;
mzte_codec.m_iOriginY = 0;
/* first ajust the dimension to be multiple of blocksize */
mzte_codec.m_iWidth = (virtual_width+(blocksize)-1)/blocksize*blocksize;
mzte_codec.m_iHeight = (virtual_height+(blocksize)-1)/blocksize*blocksize;
mzte_codec.m_iDCWidth = GetDCWidth();
mzte_codec.m_iDCHeight = GetDCHeight();
}
/* printf("Extended region: %d %d\n", mzte_codec.m_iWidth, mzte_codec.m_iHeight);*/
/* printf("DC size : %d %d\n", mzte_codec.m_iDCWidth, mzte_codec.m_iDCHeight);*/
DstImage[i].width = (i==0)?mzte_codec.m_iWidth:mzte_codec.m_iWidth/2;
DstImage[i].height = (i==0)?mzte_codec.m_iHeight:mzte_codec.m_iHeight/2;
/* Copying, and setting mask */
// FPDAM begin : modified by Sharp
#if 0
for ( iH=0; iH<Height; iH++ ){
for ( iW=0; iW<Width; iW++ ){
*(DstPtr++) = *(SrcPtr++);
*(DstMask++) = 1;
}
for ( iW=0; iW<DstImage[i].width-Width; iW++ ){
*(DstMask++) = 0;
*(DstPtr++) = 0;
}
SrcPtr += SrcWidth[i] - Width;
/* DstPtr += DstImage[i].width - Width;*/
/* DstMask += DstImage[i].width - Width;*/
}
#endif
for ( iH=0; iH<Height; iH++ ){
for ( iW=0; iW<Width; iW++ ){
*(DstPtr++) = *(SrcPtr++);
}
for (iW=0; iW<mzte_codec.m_Image[i].width - Width; iW++ ){
*(DstPtr++) = 0;
}
SrcPtr += SrcWidth[i] - Width;
}
/* get mask value */
if (i==0) {
for ( iH=0; iH<Height; iH++ ){
for ( iW=0; iW<Width; iW++ ){
*(DstMask++) = *(SrcMask++);
}
for (iW=0; iW<mzte_codec.m_Image[i].width - Width; iW++ ){
*(DstMask++) = 0;
}
SrcMask += SrcWidth[i] - Width;
}
} else {
SubsampleMask(SrcMask, &OutMask,
mzte_codec.m_Image[0].width, mzte_codec.m_Image[0].height, Filter);
for ( iH=0; iH<mzte_codec.m_Image[i].height; iH++ )
for ( iW=0; iW<mzte_codec.m_Image[i].width; iW++ )
*(DstMask++) = *(OutMask+iH*mzte_codec.m_Image[i].width + iW);
free(OutMask);
}
// FPDAM begin : modified by Sharp
/* for (iH=0; iH<DstImage[i].height; iH++){*/
/* for ( iW=0; iW<DstImage[i].width; iW++ )*/
/* printf("%d", *(DstImage[i].mask + iW + iH*DstImage[i].width));*/
/* puts("");*/
/* }*/
}
/* {*/
/* FILE *fp;*/
/* char test[100];*/
/* sprintf(test, "ttt.yuv%d", iTile);*/
/* fp = fopen(test, "w");*/
/* fwrite(DstImage[0].data, 1, RealWidth[0]*RealHeight[0], fp);*/
/* fwrite(DstImage[1].data, 1, RealWidth[1]*RealHeight[1], fp);*/
/* fwrite(DstImage[2].data, 1, RealWidth[2]*RealHeight[2], fp);*/
/* fclose(fp);*/
/* }*/
}
// FPDAM begin: modified by Sharp
Void CVTCDecoder::get_virtual_tile_mask(
PICTURE *MyImage, Int wvtDecompLev,
Int object_width, Int object_height,
Int tile_width, Int tile_height,
Int iTile, Int TileX, Int TileY,
Int usemask, Int tile_type, Int colors,
Int *target_levels,
Int StartCodeEnable,
FILTER **filters)
{
Int TileXPos, TileYPos;
// Int Width, Height;
// Int RealWidth, RealHeight, i;
// UChar *DstMask;
Int Width[3], Height[3];
Int RealWidth[3], RealHeight[3], i;
UChar *outmask[3], *DstMask;
Int iH, iW;
// Int blocksize = 1 << mzte_codec.m_iWvtDecmpLev;
// Int virtual_width, virtual_height;
Int blocksize = 1 << wvtDecompLev;
Int x = blocksize;
Int y = 2;
Int k;
Int d=x<y?x:y; /* the lesser of x and y */
TileXPos = iTile%TileX;
TileYPos = iTile/TileX;
#ifdef _FPDAM_DBG_
fprintf(stderr,"\n..............iTile=%d iTileX=%d iTileY=%d TileXPos=%d TileYPos=%d\n",
iTile, TileX, TileY, TileXPos, TileYPos);
getchar();
#endif
/* printf("TILE position %d %d\n", TileXPos, TileYPos);*/
/* printf("%d\n", mzte_codec.m_iWidth);*/
/* printf("%d %d\n", mzte_codec.m_iPictWidth, mzte_codec.m_iPictHeight);*/
/* printf("%d\n", mzte_codec.m_tile_width);*/
/* UPDATE width, height, tile_width and tile_height here*/
/*
if ( TileXPos == TileX-1 )
Width = mzte_codec.m_iPictWidth - mzte_codec.m_tile_width*TileXPos;
else
Width = mzte_codec.m_tile_width;
if ( TileYPos == TileY-1 )
Height = mzte_codec.m_iPictHeight - mzte_codec.m_tile_height*TileYPos;
else
Height = mzte_codec.m_tile_height;
*/
if ( TileXPos == TileX-1 )
mzte_codec.m_iRealWidth = mzte_codec.m_iObjectWidth - tile_width*TileXPos;
else
mzte_codec.m_iRealWidth = tile_width;
if ( TileYPos == TileY-1 )
mzte_codec.m_iRealHeight = mzte_codec.m_iObjectHeight - tile_height*TileYPos;
else
mzte_codec.m_iRealHeight = tile_height;
/*
printf("%d %d\n",mzte_codec.m_iObjectWidth, mzte_codec.m_iObjectHeight);
printf("%d %d\n",mzte_codec.m_iRealWidth,mzte_codec.m_iRealHeight);
getchar();
*/
/* printf("%d %d\n", Width, Height);*/
d = (Int) sqrt((double)d)+1;
k = 1;
for(i=d;i>1;i--) {
if(x%i==0 && y%i==0) {
k=i;
break;
}
}
blocksize = blocksize*2/k;
// virtual_width = mzte_codec.m_iRealWidth = Width;
// virtual_height = mzte_codec.m_iRealHeight = Height;
mzte_codec.m_iOriginX = 0;
mzte_codec.m_iOriginY = 0;
/* first ajust the dimension to be multiple of blocksize */
mzte_codec.m_iWidth = (mzte_codec.m_iRealWidth+(blocksize)-1)/blocksize*blocksize;
mzte_codec.m_iHeight = (mzte_codec.m_iRealHeight+(blocksize)-1)/blocksize*blocksize;
/* printf("%d %d\n", mzte_codec.m_iWidth, mzte_codec.m_iHeight);*/
for ( i=0; i<mzte_codec.m_iColors; i++ ){
// RealWidth = (i==0)?mzte_codec.m_iRealWidth:((mzte_codec.m_iRealWidth+1)>>1);
// RealHeight = (i==0)?mzte_codec.m_iRealHeight:((mzte_codec.m_iRealHeight+1)>>1);
// Width = (i==0)?mzte_codec.m_iWidth:((mzte_codec.m_iWidth+1)>>1);
// Height = (i==0)?mzte_codec.m_iHeight:((mzte_codec.m_iHeight+1)>>1);
RealWidth[i] = (i==0)?mzte_codec.m_iRealWidth:((mzte_codec.m_iRealWidth+1)>>1);
RealHeight[i] = (i==0)?mzte_codec.m_iRealHeight:((mzte_codec.m_iRealHeight+1)>>1);
Width[i] = (i==0)?mzte_codec.m_iWidth:((mzte_codec.m_iWidth+1)>>1);
Height[i] = (i==0)?mzte_codec.m_iHeight:((mzte_codec.m_iHeight+1)>>1);
/* printf("RealSize = (%dx%d)\n", RealWidth, RealHeight);*/
/* printf("Size = (%dx%d)\n", Width, Height);*/
// DstMask = Image[i].mask;
/* Reset Mask */
// memset(DstMask, (UChar)0, Width*Height);
outmask[i] = MyImage[i].mask;
memset(outmask[i], (UChar)0, Width[i]*Height[i]);
/* Copying, and setting mask */
/*
for ( iH=0; iH<RealHeight; iH++ ){
for ( iW=0; iW<RealWidth; iW++ ){
*(DstMask++) = 1;
}
for (iW=0; iW<Width-RealWidth; iW++ ){
*(DstMask++) = 0;
}
}
*/
if (usemask) {
switch (tile_type) {
case BOUNDA_TILE:
if ( i==0 ) {
ShapeDeCoding(outmask[0], Width[0], Height[0],
wvtDecompLev, target_levels,
&STO_const_alpha,
&STO_const_alpha_value,
StartCodeEnable,
1, /* always get fullsize*/
filters);
} else {
SubsampleMask(outmask[0], &DstMask, Width[0],
Height[0], filters[0]);
for ( iH=0; iH<Height[i]; iH++ )
for ( iW=0; iW<Width[i]; iW++ )
*(outmask[i]++) = *(DstMask+iH*Width[i]+iW);
free(DstMask);
}
break;
case OPAQUE_TILE:
for ( iH=0; iH<RealHeight[i]; iH++ ){
for ( iW=0; iW<RealWidth[i]; iW++ ){
*(outmask[i]++) = DWT_IN;
}
for (iW=0; iW<Width[i]-RealWidth[i]; iW++ ){
*(outmask[i]++) = 0;
}
}
*target_levels=0;/* ???*/
break;
case TRANSP_TILE:
for ( iH=0; iH<Height[i]; iH++ ){
for ( iW=0; iW<Width[i]; iW++ ){
*(outmask[i]++) = 0;
}
}
*target_levels=0; /* ??? */
break;
default:
errorHandler("Wrong texture_object_layer_start_code.");
}
}
else {
for ( iH=0; iH<RealHeight[i]; iH++ ){
for ( iW=0; iW<RealWidth[i]; iW++ ){
*(outmask[i]++) = DWT_IN;
}
for (iW=0; iW<Width[i]-RealWidth[i]; iW++ ){
*(outmask[i]++) = 0;
}
}
*target_levels=0; /* ??? */
}
/* DstMask = Image[i].mask;*/
/* for ( iH=0; iH<Height; iH++ ){*/
/* for ( iW=0; iW<Width; iW++ )*/
/* printf("%d", *(DstMask + iW + iH*Width));*/
/* puts("");*/
/* }*/
}
}
// end: added by Sharp (99/5/10)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -