📄 patterncoding.c
字号:
{
UCHAR8 temp_x = 0;
UCHAR8 temp_y = 0;
if ((BlockInfo[BlockSeq].RefineBits.RefineParent.ParentRefSymbol & (1 << (2 - i))) > 0)
{
UCHAR8 code = 0;
BitsRead(PtrCoding, &TempWord, 1);
code = (UCHAR8) TempWord;
BlockInfo[BlockSeq].RefineBits.RefineParent.ParentSymbolLength --;
temp_x = (i >= 1 ? 1 : 0);
temp_y = (i != 1 ? 1 : 0);
if( code > 0)
{
if (block[temp_x][temp_y] > 0)
block[temp_x][temp_y] += (1 << (BitPlane - 1));
else
block[temp_x][temp_y] -= (1 << (BitPlane - 1));
}
}
if ((PtrCoding->DecodingStopLocations.BitPlaneStopDecoding != -1)
&& (PtrCoding->RateReached == TRUE)
&& (!PtrCoding->DecodingStopLocations.LocationFind))
{
PtrCoding->DecodingStopLocations.BlockNoStopDecoding = BlockSeq;
PtrCoding->DecodingStopLocations.X_LocationStopDecoding = temp_x;
PtrCoding->DecodingStopLocations.Y_LocationStopDecoding = temp_y;
PtrCoding->DecodingStopLocations.LocationFind = TRUE;
return;
}
}
BlockInfo[BlockSeq].RefineBits.RefineParent.ParentRefSymbol = 0;
BlockInfo[BlockSeq].RefineBits.RefineParent.ParentSymbolLength = 0;
}
if (BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenSymbolLength > 0)
{
if((PtrCoding->SegmentFull == TRUE) || (PtrCoding->RateReached == TRUE))
break;
for ( k = 0; k < 3; k ++)
{
UCHAR8 counter = 3;
UCHAR8 temp_x;
UCHAR8 temp_y;
temp_x = (k >= 1 ? 1 : 0);
temp_x *= 2;
temp_y = (k != 1 ? 1 : 0);
temp_y *= 2;
for ( i = temp_x ; i < temp_x + 2; i ++)
for ( j =temp_y; j < temp_y + 2; j ++)
{
if ((BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol & (1 << (8 - k * 4 + counter ))) > 0)
{
UCHAR8 code = 0;
BitsRead(PtrCoding,&TempWord, 1);
code = (UCHAR8) TempWord;
BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenSymbolLength --;
if(code > 0)
{
if (block[i][j] > 0)
block[i][j] += (1 << (BitPlane - 1));
else
block[i][j] -= (1 << (BitPlane - 1));
}
}
counter --;
if ((PtrCoding->DecodingStopLocations.BitPlaneStopDecoding != -1)
&& PtrCoding->RateReached == TRUE
&& (!PtrCoding->DecodingStopLocations.LocationFind))
{
PtrCoding->DecodingStopLocations.BlockNoStopDecoding = BlockSeq;
PtrCoding->DecodingStopLocations.X_LocationStopDecoding = i;
PtrCoding->DecodingStopLocations.Y_LocationStopDecoding = j;
PtrCoding->DecodingStopLocations.LocationFind = TRUE;
return;
}
}
}
// reset to 0
BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol = 0;
BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenSymbolLength = 0;
}
// refinement Gi
for( i = 0; i < 3; i ++)
{
if (BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenSymbolLength > 0)
{
short refine_stop_point_counter = 0;
if((PtrCoding->SegmentFull == TRUE) || (PtrCoding->RateReached == TRUE))
break;
for ( j = 0; j < 4; j ++)
{
UCHAR8 temp_x;
UCHAR8 temp_y;
UCHAR8 counter = 3;
temp_x = (i >= 1 ? 1 : 0) * 4 + (j >= 2 ? 1 : 0) * 2;
temp_y = (i != 1 ? 1 : 0) * 4 + (j % 2) * 2;
for ( k = temp_x; k < temp_x + 2; k ++)
for ( p = temp_y; p < temp_y + 2; p ++)
{
if ((BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol & (1 << (12 - j * 4 + counter ))) > 0)
{
UCHAR8 code = 0;
BitsRead(PtrCoding, &TempWord, 1);
code = (UCHAR8) TempWord;
BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenSymbolLength --;
refine_stop_point_counter ++;
if(code > 0)
{
if (block[k][p] > 0)
block[k][p] += (1 << (BitPlane - 1));
else
block[k][p] -= (1 << (BitPlane - 1));
}
}
counter --;
if ((PtrCoding->DecodingStopLocations.BitPlaneStopDecoding != -1)
&& PtrCoding->RateReached == TRUE &&
(!PtrCoding->DecodingStopLocations.LocationFind))
{
// if (refine_stop_point_counter == PtrCoding->DecodingStopLocations.TotalBitsReadThisTime)
{
PtrCoding->DecodingStopLocations.BlockNoStopDecoding = BlockSeq;
PtrCoding->DecodingStopLocations.X_LocationStopDecoding = k;
PtrCoding->DecodingStopLocations.Y_LocationStopDecoding = p;
PtrCoding->DecodingStopLocations.LocationFind = TRUE;
return;
}
}
}
}
}
BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol = 0;
BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenSymbolLength = 0;
}
if ((PtrCoding->DecodingStopLocations.BitPlaneStopDecoding != -1)
&& PtrCoding->RateReached == TRUE)
{
PtrCoding->DecodingStopLocations.BlockNoStopDecoding = BlockSeq;
}
}
}
void RefBitsEn(BitPlaneBits * BlockInfo,
StructCodingPara *PtrCoding)
{
UINT32 i;
UCHAR8 j;
for( i = 0; i < PtrCoding->PtrHeader->Header.Part3.S_20Bits; i ++)
{
// encoding TypeP first.
if (BlockInfo[i].RefineBits.RefineParent.ParentSymbolLength > 0)
{
BitsOutput(PtrCoding,
BlockInfo[i].RefineBits.RefineParent.ParentRefSymbol,
BlockInfo[i].RefineBits.RefineParent.ParentSymbolLength);
// reset to 0:
BlockInfo[i].RefineBits.RefineParent.ParentRefSymbol = 0;
BlockInfo[i].RefineBits.RefineParent.ParentSymbolLength = 0;
}
if (BlockInfo[i].RefineBits.RefineChildren.ChildrenSymbolLength > 0)
{
BitsOutput(PtrCoding,
BlockInfo[i].RefineBits.RefineChildren.ChildrenRefSymbol,
BlockInfo[i].RefineBits.RefineChildren.ChildrenSymbolLength);
// reset to 0
BlockInfo[i].RefineBits.RefineChildren.ChildrenRefSymbol = 0;
BlockInfo[i].RefineBits.RefineChildren.ChildrenSymbolLength = 0;
}
for( j = 0; j < 3; j ++)
{
if (BlockInfo[i].RefineBits.RefineGrandChildren[j].GrandChildrenSymbolLength > 0)
BitsOutput(PtrCoding,
BlockInfo[i].RefineBits.RefineGrandChildren[j].GrandChildrenRefSymbol,
BlockInfo[i].RefineBits.RefineGrandChildren[j].GrandChildrenSymbolLength);
BlockInfo[i].RefineBits.RefineGrandChildren[j].GrandChildrenRefSymbol = 0;
BlockInfo[i].RefineBits.RefineGrandChildren[j].GrandChildrenSymbolLength = 0;
}
}
return;
}
void StagesEnCoding(StructCodingPara *PtrCoding,
BitPlaneBits *BlockInfo)
{
// try various options for the 2-bit, 3-bit, and 4 bit coding.
UCHAR8 BlocksInLastGaggle = 0;
DWORD32 TotalGaggles;
DWORD32 GaggleIndex = 0;
UCHAR8 **CodeOptionsAllGaggles;
UCHAR8 BlocksInGaggle = 0;
UINT32 BlockStartIndex = 0;
BOOL **OptionHitFlag;
BlocksInLastGaggle = (UCHAR8) (PtrCoding->PtrHeader->Header.Part3.S_20Bits % GAGGLE_SIZE) ;
TotalGaggles = PtrCoding->PtrHeader->Header.Part3.S_20Bits / GAGGLE_SIZE;
// bit length is equal to 1, nk = 0;
if( BlocksInLastGaggle!= 0)
TotalGaggles++;
CodeOptionsAllGaggles = (UCHAR8 **)calloc(TotalGaggles, sizeof(UCHAR8 *)) ;
OptionHitFlag = (BOOL **) calloc(TotalGaggles, sizeof(BOOL *)) ;
// 4.1 Pattern values.
for (GaggleIndex = 0; GaggleIndex < TotalGaggles; GaggleIndex ++)
{
BlockStartIndex = GaggleIndex * GAGGLE_SIZE;
CodeOptionsAllGaggles[GaggleIndex] = (UCHAR8 *)calloc(3, sizeof(UCHAR8)) ;
OptionHitFlag[GaggleIndex] = (BOOL *)calloc(3, sizeof(BOOL)) ;
OptionHitFlag[GaggleIndex][0] = FALSE;
OptionHitFlag[GaggleIndex][1] = FALSE;
OptionHitFlag[GaggleIndex][2] = FALSE;
BlocksInGaggle = (UCHAR8)((BlockStartIndex + GAGGLE_SIZE < PtrCoding->PtrHeader->Header.Part3.S_20Bits) ?
GAGGLE_SIZE : (PtrCoding->PtrHeader->Header.Part3.S_20Bits - BlockStartIndex)) ;
CodingOptions(PtrCoding, &(BlockInfo[BlockStartIndex]) , BlocksInGaggle, (CodeOptionsAllGaggles[GaggleIndex]));
StagesEnCodingGaggles1(PtrCoding, &(BlockInfo[BlockStartIndex]) ,
BlocksInGaggle, (CodeOptionsAllGaggles[GaggleIndex]), OptionHitFlag[GaggleIndex] );
}
for (GaggleIndex = 0; GaggleIndex < TotalGaggles; GaggleIndex ++)
{
BlockStartIndex = GaggleIndex * GAGGLE_SIZE;
BlocksInGaggle = (UCHAR8) ((BlockStartIndex + GAGGLE_SIZE < PtrCoding->PtrHeader->Header.Part3.S_20Bits) ?
GAGGLE_SIZE : (PtrCoding->PtrHeader->Header.Part3.S_20Bits - BlockStartIndex)) ;
StagesEnCodingGaggles2(PtrCoding, &(BlockInfo[BlockStartIndex]) ,
BlocksInGaggle, (CodeOptionsAllGaggles[GaggleIndex]), OptionHitFlag[GaggleIndex] );
}
for (GaggleIndex = 0; GaggleIndex < TotalGaggles; GaggleIndex ++)
{
BlockStartIndex = GaggleIndex * GAGGLE_SIZE;
BlocksInGaggle = (UCHAR8) ((BlockStartIndex + GAGGLE_SIZE < PtrCoding->PtrHeader->Header.Part3.S_20Bits) ?
GAGGLE_SIZE : (PtrCoding->PtrHeader->Header.Part3.S_20Bits - BlockStartIndex)) ;
StagesEnCodingGaggles3(PtrCoding, &(BlockInfo[BlockStartIndex]) ,
BlocksInGaggle, (CodeOptionsAllGaggles[GaggleIndex]), OptionHitFlag[GaggleIndex] );
}
RefBitsEn(BlockInfo, PtrCoding);
return;
}
extern void StagesDeCodingGaggles1(StructCodingPara *PtrCoding,
BitPlaneBits *BlockCodingInfo,
UCHAR8 BlocksInGaggles,
UCHAR8 *CodeOptionsAllGaggles,
BOOL *FlagCodeOptionOutput);
extern void StagesDeCodingGaggles2(StructCodingPara *PtrCoding,
BitPlaneBits *BlockCodingInfo,
UCHAR8 BlocksInGaggles,
UCHAR8 *CodeOptionsAllGaggles,
BOOL *FlagCodeOptionOutput);
extern void StagesDeCodingGaggles3(StructCodingPara *PtrCoding,
BitPlaneBits *BlockCodingInfo,
UCHAR8 BlocksInGaggles,
UCHAR8 *CodeOptionsAllGaggles,
BOOL *FlagCodeOptionOutput);
void StagesDeCoding(StructCodingPara *PtrCoding,
BitPlaneBits *BlockInfo)
{
// try various options for the 2-bit, 3-bit, and 4 bit coding.
UCHAR8 BlocksInLastGaggle = 0;
DWORD32 TotalGaggles;
DWORD32 GaggleIndex = 0;
UCHAR8 **CodeOptionsAllGaggles;
UCHAR8 BlocksInGaggle = 0;
UINT32 BlockStartIndex = 0;
BOOL **OptionHitFlag;
BlocksInLastGaggle = (UCHAR8) (PtrCoding->PtrHeader->Header.Part3.S_20Bits % GAGGLE_SIZE) ;
TotalGaggles = PtrCoding->PtrHeader->Header.Part3.S_20Bits / GAGGLE_SIZE;
// bit length is equal to 1, nk = 0;
if( BlocksInLastGaggle!= 0)
TotalGaggles++;
CodeOptionsAllGaggles = (UCHAR8 **)calloc(TotalGaggles, sizeof(UCHAR8 *)) ;
OptionHitFlag = (BOOL **) calloc(TotalGaggles, sizeof(BOOL *)) ;
PtrCoding->DecodingStopLocations.BlockNoStopDecoding = 0;
// 4.1 Pattern values.
for (GaggleIndex = 0; GaggleIndex < TotalGaggles; GaggleIndex ++)
{
BlockStartIndex = GaggleIndex * GAGGLE_SIZE;
CodeOptionsAllGaggles[GaggleIndex] = (UCHAR8 *)calloc(3, sizeof(UCHAR8)) ;
OptionHitFlag[GaggleIndex] = (BOOL *)calloc(3, sizeof(BOOL)) ;
OptionHitFlag[GaggleIndex][0] = FALSE;
OptionHitFlag[GaggleIndex][1] = FALSE;
OptionHitFlag[GaggleIndex][2] = FALSE;
BlocksInGaggle = (UCHAR8)((BlockStartIndex + GAGGLE_SIZE < PtrCoding->PtrHeader->Header.Part3.S_20Bits) ?
GAGGLE_SIZE : (PtrCoding->PtrHeader->Header.Part3.S_20Bits - BlockStartIndex)) ;
StagesDeCodingGaggles1(PtrCoding, &(BlockInfo[BlockStartIndex]) ,
BlocksInGaggle, (CodeOptionsAllGaggles[GaggleIndex]), OptionHitFlag[GaggleIndex] );
if ((PtrCoding->DecodingStopLocations.BitPlaneStopDecoding != -1)
&& PtrCoding->RateReached == TRUE)
{
PtrCoding->DecodingStopLocations.BlockNoStopDecoding+=GaggleIndex * 16;
PtrCoding->DecodingStopLocations.stoppedstage = 1;
return;
}
}
for (GaggleIndex = 0; GaggleIndex < TotalGaggles; GaggleIndex ++)
{
BlockStartIndex = GaggleIndex * GAGGLE_SIZE;
BlocksInGaggle = (UCHAR8) ((BlockStartIndex + GAGGLE_SIZE < PtrCoding->PtrHeader->Header.Part3.S_20Bits) ?
GAGGLE_SIZE : (PtrCoding->PtrHeader->Header.Part3.S_20Bits - BlockStartIndex)) ;
StagesDeCodingGaggles2(PtrCoding, &(BlockInfo[BlockStartIndex]) ,
BlocksInGaggle, (CodeOptionsAllGaggles[GaggleIndex]), OptionHitFlag[GaggleIndex] );
if ((PtrCoding->DecodingStopLocations.BitPlaneStopDecoding != -1)
&& PtrCoding->RateReached == TRUE)
{
PtrCoding->DecodingStopLocations.BlockNoStopDecoding += GaggleIndex * 16;
PtrCoding->DecodingStopLocations.stoppedstage = 2;
return;
}
}
if( PtrCoding->RateReached == TRUE)
{
PtrCoding->DecodingStopLocations.stoppedstage = 2;
return;
}
for (GaggleIndex = 0; GaggleIndex < TotalGaggles; GaggleIndex ++)
{
BlockStartIndex = GaggleIndex * GAGGLE_SIZE;
BlocksInGaggle = (UCHAR8) ((BlockStartIndex + GAGGLE_SIZE < PtrCoding->PtrHeader->Header.Part3.S_20Bits) ?
GAGGLE_SIZE : (PtrCoding->PtrHeader->Header.Part3.S_20Bits - BlockStartIndex)) ;
StagesDeCodingGaggles3(PtrCoding, &(BlockInfo[BlockStartIndex]) ,
BlocksInGaggle, (CodeOptionsAllGaggles[GaggleIndex]), OptionHitFlag[GaggleIndex] );
if ((PtrCoding->DecodingStopLocations.BitPlaneStopDecoding != -1)
&& PtrCoding->RateReached == TRUE)
{
PtrCoding->DecodingStopLocations.BlockNoStopDecoding += GaggleIndex * 16;
PtrCoding->DecodingStopLocations.stoppedstage = 3;
return;
}
}
if( PtrCoding->RateReached == TRUE)
{
PtrCoding->DecodingStopLocations.stoppedstage = 3;
return;
}
RefBitsDe(PtrCoding, BlockInfo);
if( PtrCoding->RateReached == TRUE)
{
PtrCoding->DecodingStopLocations.stoppedstage = 4;
return;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -