📄 bpeblockcoding.c
字号:
{
p = 0;
break;
}
if (p == 0) // not all TypeCi hitted so far. scan TypeCi
{
counter = 0;
if (BlockInfo[BlockSeq].SymbolsBlock[si].sym_len != 0)
si++;
BlockInfo[BlockSeq].SymbolsBlock[si].type = ENUM_TYPE_CI;
for ( i = temp_x ; i < temp_x + 2; i ++)
for ( j = temp_y; j < temp_y + 2; j ++)
{
// check the BitPlane to see if the bit plane is one.
if((BlockInfo[BlockSeq].StrPlaneHitHistory.TypeCi[k].TypeC & ( 1 << (3 - counter))) == 0)
{
if( (Bit_Set_Plane & AMPLITUDE(block[i][j])) > 0)
{
BlockInfo[BlockSeq].StrPlaneHitHistory.TypeCi[k].TypeC += (1 << ( 3 - counter));
BlockInfo[BlockSeq].SymbolsBlock[si].sym_len ++;
BlockInfo[BlockSeq].SymbolsBlock[si].sym_val <<= 1;
BlockInfo[BlockSeq].SymbolsBlock[si].sym_val ++;
BlockInfo[BlockSeq].SymbolsBlock[si].sign <<= 1;
BlockInfo[BlockSeq].SymbolsBlock[si].sign += SIGN(block[i][j]);
}
else
{
BlockInfo[BlockSeq].SymbolsBlock[si].sym_len ++;
BlockInfo[BlockSeq].SymbolsBlock[si].sym_val <<= 1;
}
}
else
{
temp = ((AMPLITUDE(block[i][j]) & Bit_Set_Plane) > 0 ? 1 : 0);
if((PtrCoding->PtrHeader->Header.Part4).DWTType == INTEGER_WAVELET)
{
if(((k == 0) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHL2_2bits < BitPlane)) // HL3 band.
|| ((k == 1) && (PtrCoding->PtrHeader->Header.Part4.CustomWtLH2_2bits < BitPlane )) // HL3 band.
|| ((k == 2) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHH2_2bits < BitPlane))) // HL3 band.
{
BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol <<= 1;
BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol += temp;
BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenSymbolLength ++;
}
}
else
{
BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol <<= 1;
BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol += temp;
BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenSymbolLength ++;
}
}
counter ++;
}
}
else
{ // refinement bits
for ( i = temp_x ; i < temp_x + 2; i ++)
for ( j = temp_y; j < temp_y + 2; j ++)
{
temp = ((AMPLITUDE(block[i][j]) & Bit_Set_Plane) > 0 ? 1 : 0);
if((PtrCoding->PtrHeader->Header.Part4).DWTType == INTEGER_WAVELET)
{
if(((k == 0) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHL2_2bits < BitPlane )) // HL3 band.
|| ((k == 1) && (PtrCoding->PtrHeader->Header.Part4.CustomWtLH2_2bits < BitPlane )) // HL3 band.
|| ((k == 2) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHH2_2bits < BitPlane )))// HL3 band.
{
BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol <<= 1;
BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol += temp;
BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenSymbolLength ++;
}
}
else
{
BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol <<= 1;
BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol += temp;
BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenSymbolLength ++;
}
}
}
}
}
// determine if we need TranGi, which determine if
// we need to scan the grand children.
// TranGi is needed whenver TranD is 1 unless it has been set to in the
// previous bit planes.
if(BlockInfo[BlockSeq].SymbolsBlock[si].sym_len != 0)
si ++;
for(k = 0; k < 3; k++)
{
if((PtrCoding->PtrHeader->Header.Part4).DWTType == INTEGER_WAVELET)
{
if((((k == 0) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHL1_2bits >= BitPlane)) // HL3 band.
|| ((k == 1) && (PtrCoding->PtrHeader->Header.Part4.CustomWtLH1_2bits >= BitPlane)) // HL3 band.
|| ((k == 2) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHH1_2bits >= BitPlane)))) // HL3 band.
continue;
}
if (((BlockInfo[BlockSeq].StrPlaneHitHistory.TranD & (1 << (2 - k)))
!= 0) && ((BlockInfo[BlockSeq].StrPlaneHitHistory.TranGi & (1 << (2 - k))) == 0))
{
// TranGi is needed.
BlockInfo[BlockSeq].SymbolsBlock[si].type = ENUM_TRAN_GI;
temp_x = (k >= 1 ? 1 : 0);
temp_x *= 4;
temp_y = (k != 1 ? 1 : 0);
temp_y *= 4;
for ( i= temp_x; i < temp_x + 4; i ++)
for ( j = temp_y; j < temp_y + 4; j++)
{
if( (Bit_Set_Plane & AMPLITUDE(block[i][j])) > 0)
{
BlockInfo[BlockSeq].SymbolsBlock[si].sym_len ++;
BlockInfo[BlockSeq].SymbolsBlock[si].sym_val <<= 1;
BlockInfo[BlockSeq].SymbolsBlock[si].sym_val ++;
BlockInfo[BlockSeq].StrPlaneHitHistory.TranGi += ( 1 << (2 - k));
goto NEW_Gi;
}
}
BlockInfo[BlockSeq].SymbolsBlock[si].sym_len ++;
BlockInfo[BlockSeq].SymbolsBlock[si].sym_val <<= 1;
}
NEW_Gi:;
}
if(BlockInfo[BlockSeq].SymbolsBlock[si].sym_len != 0)
si ++;
// now based TranHi.
for (i = 0; i < 3; i ++)
{
if((PtrCoding->PtrHeader->Header.Part4).DWTType == INTEGER_WAVELET)
{
if(((i == 0) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHL1_2bits >= BitPlane)) // HL3 band.
|| ((i == 1) && (PtrCoding->PtrHeader->Header.Part4.CustomWtLH1_2bits >= BitPlane)) // HL3 band.
|| ((i == 2) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHH1_2bits >= BitPlane))) // HL3 band.
continue;
}
if(BlockInfo[BlockSeq].SymbolsBlock[si].sym_len != 0)
si ++;
for ( j = 0; j < 4; j ++)
{
temp_x = (i >= 1 ? 1 : 0) * 4 + (j >= 2 ? 1 : 0) * 2;
temp_y = (i != 1 ? 1 : 0) * 4 + (j % 2) * 2;
if (((BlockInfo[BlockSeq].StrPlaneHitHistory.TranGi & (1 << ( 2 - i))) != 0)
&& ((BlockInfo[BlockSeq].StrPlaneHitHistory.TranHi[i].TranH & (1 << ( 3 - j))) == 0))
{
BlockInfo[BlockSeq].SymbolsBlock[si].type = ENUM_TRAN_HI;
for ( k = temp_x; k < temp_x + 2; k ++)
for ( p = temp_y; p < temp_y + 2; p ++)
{
if( (Bit_Set_Plane & AMPLITUDE(block[k][p])) > 0)
{
BlockInfo[BlockSeq].SymbolsBlock[si].sym_len ++;
BlockInfo[BlockSeq].SymbolsBlock[si].sym_val <<= 1;
BlockInfo[BlockSeq].SymbolsBlock[si].sym_val ++;
BlockInfo[BlockSeq].StrPlaneHitHistory.TranHi[i].TranH += (1 << ( 3 - j));
goto NEW_Gij;
}
}
BlockInfo[BlockSeq].SymbolsBlock[si].sym_len++;
BlockInfo[BlockSeq].SymbolsBlock[si].sym_val <<= 1;
}
NEW_Gij:;
}
}
for (i = 0; i < 3; i ++)
{
if((PtrCoding->PtrHeader->Header.Part4).DWTType == INTEGER_WAVELET)
{
if(((i == 0) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHL1_2bits >= BitPlane)) // HL3 band.
|| ((i == 1) && (PtrCoding->PtrHeader->Header.Part4.CustomWtLH1_2bits >= BitPlane)) // HL3 band.
|| ((i == 2) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHH1_2bits >= BitPlane))) // HL3 band.
continue;
}
for ( j = 0; j < 4; j ++)
{
temp_x = (i >= 1 ? 1 : 0) * 4 + (j >= 2 ? 1 : 0) * 2;
temp_y = (i != 1 ? 1 : 0) * 4 + (j % 2) * 2;
if((BlockInfo[BlockSeq].StrPlaneHitHistory.TranHi[i].TranH & (1 << (3 - j))) != 0)
{
short t = 0;
counter = 0;
for ( k = 0; k < 4; k ++)
if ((BlockInfo[BlockSeq].StrPlaneHitHistory.TypeHij[i].TypeHij[j].TranH & ( 1 << (3 - k))) == 0)
counter ++;
if (counter == 0) // refinement bits. all bits have been hit before.
{
for ( k = temp_x; k < temp_x + 2; k ++)
for ( p = temp_y; p < temp_y + 2; p ++)
{
temp = ((AMPLITUDE(block[k][p]) & Bit_Set_Plane) > 0 ? 1 : 0);
if((PtrCoding->PtrHeader->Header.Part4).DWTType == INTEGER_WAVELET)
{
if(((i == 0) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHL1_2bits < BitPlane )) // HL3 band.
|| ((i == 1) && (PtrCoding->PtrHeader->Header.Part4.CustomWtLH1_2bits < BitPlane )) // HL3 band.
|| ((i == 2) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHH1_2bits < BitPlane ))) // HL3 band.
{
BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol <<= 1;
BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol += temp;
BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenSymbolLength ++;
}
}
else
{
BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol <<= 1;
BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol += temp;
BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenSymbolLength ++;
}
}
continue;
}
// if TranHi == 1, then four grand children TypeHij will be scanned/
if(BlockInfo[BlockSeq].SymbolsBlock[si].sym_len != 0)
si ++;
BlockInfo[BlockSeq].SymbolsBlock[si].type = ENUM_TYPE_HIJ;
t = 0;
for ( k = temp_x; k < temp_x + 2; k ++)
for ( p = temp_y; p < temp_y + 2; p ++)
{
if((BlockInfo[BlockSeq].StrPlaneHitHistory.TypeHij[i].TypeHij[j].TranH & (1 << (3 - t))) == 0)
{
if((Bit_Set_Plane & AMPLITUDE(block[k][p])) > 0)
{
BlockInfo[BlockSeq].StrPlaneHitHistory.TypeHij[i].TypeHij[j].TranH += (1 << (3 - t));
BlockInfo[BlockSeq].SymbolsBlock[si].sym_len ++;
BlockInfo[BlockSeq].SymbolsBlock[si].sym_val <<= 1;
BlockInfo[BlockSeq].SymbolsBlock[si].sym_val ++;
BlockInfo[BlockSeq].SymbolsBlock[si].sign <<= 1;
BlockInfo[BlockSeq].SymbolsBlock[si].sign += SIGN(block[k][p]);
}
else
{
BlockInfo[BlockSeq].SymbolsBlock[si].sym_len ++;
BlockInfo[BlockSeq].SymbolsBlock[si].sym_val <<= 1;
}
}
else
{ //refinement.
temp = ((AMPLITUDE(block[k][p]) & Bit_Set_Plane) > 0 ? 1 : 0);
if((PtrCoding->PtrHeader->Header.Part4).DWTType == INTEGER_WAVELET)
{
if(((i == 0) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHL1_2bits < BitPlane )) // HL3 band.
|| ((i == 1) && (PtrCoding->PtrHeader->Header.Part4.CustomWtLH1_2bits < BitPlane ))
|| ((i == 2) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHH1_2bits < BitPlane )))
{
BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol <<= 1;
BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol += temp;
BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenSymbolLength ++;
}
}
else
{
BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol <<= 1;
BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol += temp;
BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenSymbolLength ++;
}
}
t++;
}
}
}
}
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -