📄 shapeenhdecode.cpp
字号:
ExclusiveORdecoding (bordered_lower_bab,
bordered_half_bab,
bordered_curr_bab,
mbsize,
scan_order, // SAIT_PDAM: ADDED by D.-S.Cho (Samsung AIT)
ar_decoder);
} else if (bab_type==1){ /* Raster Scan-Line (RSL) coding */
FullDecoding (bordered_lower_bab,
bordered_half_bab,
bordered_curr_bab,
mbsize,
filter,
ar_decoder);
} else {
fprintf(stderr,"BAB type ERROR !\n");
}
return ( 0 );
}
/* Interleaved Scan-Line (ISL) Decoding */
Void CVTCDecoder::
ExclusiveORdecoding (UChar *bordered_lower_bab,
UChar *bordered_half_bab,
UChar *bordered_curr_bab,
Int mbsize,
Int scan_order, // SAIT_PDAM: ADDED by D.-S.Cho (Samsung AIT)
ArDecoder *ar_decoder)
{
Int i,j,i2,j2,k,l,prev,next;
Int mborder = MBORDER;
Int mbsize_ext = mbsize+(mborder<<1);
Int border = BORDER;
Int bsize = mbsize >> 1;
Int bsize_ext = bsize+(border<<1);
Int context, prob=0;
UChar *lower_bab_data,*half_bab_data,
*curr_bab_data;
UChar *bordered_curr_bab_tr; // SAIT_PDAM: ADDED by D.-S.Cho (Samsung AIT)
lower_bab_data = bordered_lower_bab + border * bsize_ext + border;
half_bab_data= bordered_half_bab + mborder * bsize_ext + border;
curr_bab_data= bordered_curr_bab + mborder * mbsize_ext + mborder;
/*-- P0 pixels reconstructing --*/
for(j=j2=0,k=l=0; j<bsize; j++, j2+=2, k+=(mbsize_ext<<1), l+=bsize_ext)
for(i=i2=0; i<bsize; i++, i2+=2)
curr_bab_data[k+i2]=lower_bab_data[l+i];
/* SAIT_PDAM BEGIN - ADDED by D.-S.Cho (Samsung AIT) */
// current BAB transposition
if (scan_order==1) {
bordered_curr_bab_tr = (UChar *)calloc(mbsize_ext*mbsize_ext, sizeof(UChar));
for (j=0; j<mbsize_ext; j++)
for (i=0; i<mbsize_ext; i++)
bordered_curr_bab_tr[j*mbsize_ext+i] = bordered_curr_bab[i*mbsize_ext+j];
curr_bab_data=bordered_curr_bab_tr + mborder * mbsize_ext + mborder;
}
/* SAIT_PDAM END - ADDED by D.-S.Cho (Samsung AIT) */
/*-- P1 pixels decoding --*/
/* SAIT_PDAM BEGIN - MODIFIED by D.-S.Cho (Samsung AIT) */
//for(j2=k=0; j2<mbsize; j2+=2, k+=(mbsize_ext<<1) )
// {
// for(i2=1; i2<mbsize; i2+=2)
// {
for(i2=1; i2<mbsize; i2+=2)
{
for(j2=k=0; j2<mbsize; j2+=2, k+=(mbsize_ext<<1) )
{
/* SAIT_PDAM END - MODIFIED by D.-S.Cho (Samsung AIT) */
prev= curr_bab_data[k+i2-1];
next= curr_bab_data[k+i2+1];
if(prev!=next)
{
context = GetContextEnhBAB_XOR(curr_bab_data,
i2,
j2,
mbsize_ext,
0); /* pixel type : 0-P1, 1-P2/P3 */
prob=scalable_xor_prob_1[context];
curr_bab_data[k+i2] = ArDecodeSymbol_Still(ar_decoder, prob);
}
else
{
curr_bab_data[k+i2] = prev;
}
}
}
/*-- P2/P3 pixels decoding --*/
for(j2=1,k=mbsize_ext; j2<mbsize; j2+=2, k+=(mbsize_ext<<1) )
{
for(i2=0; i2<mbsize; i2++)
{
prev= curr_bab_data[k-mbsize_ext+i2];
next= curr_bab_data[k+mbsize_ext+i2];
if(prev!=next)
{
context = GetContextEnhBAB_XOR(curr_bab_data,
i2,
j2,
mbsize_ext,
1); /* pixel type : 0-P1, 1-P2/P3 */
prob=scalable_xor_prob_23[context];
curr_bab_data[k+i2] = ArDecodeSymbol_Still(ar_decoder, prob);
}
else
{
curr_bab_data[k+i2] = prev;
}
}
}
/* SAIT_PDAM BEGIN - ADDED by D.-S.Cho (Samsung AIT) */
if (scan_order == 1) {
for (j=0; j<mbsize_ext; j++)
for (i=0; i<mbsize_ext; i++)
bordered_curr_bab[j*mbsize_ext+i]=bordered_curr_bab_tr[i*mbsize_ext+j];
curr_bab_data = bordered_curr_bab + mborder*mbsize_ext + mborder;
free (bordered_curr_bab_tr);
}
/* SAIT_PDAM END - ADDED by D.-S.Cho (Samsung AIT) */
/* get the half resolution needed */
for(j2=0,k=0; j2<mbsize; j2++, k+=mbsize_ext )
{
for(i=0; i<bsize; i++)
{
i2 = i<<1; /* horizontal subsampling */
half_bab_data[j2*bsize_ext+i] = curr_bab_data[k+i2];
}
}
}
/* Raster Scan-Line (RSL) Decoding */
Void CVTCDecoder::
FullDecoding (UChar *bordered_lower_bab,
UChar *bordered_half_bab,
UChar *bordered_curr_bab,
Int mbsize,
FILTER *filter,
ArDecoder *ar_decoder)
{
Int i,j,i2,j2,k,l;
Int mborder = MBORDER;
Int mbsize_ext = mbsize+(mborder<<1);
Int border = BORDER;
Int bsize = mbsize >> 1;
Int bsize_ext = bsize+(border<<1);
//Int low_value, not_coded;
Int context, prob=0;
UChar *lower_bab_data,*half_bab_data,
*curr_bab_data;
lower_bab_data = bordered_lower_bab + border * bsize_ext + border;
half_bab_data= bordered_half_bab + mborder * bsize_ext + border;
curr_bab_data= bordered_curr_bab + mborder * mbsize_ext + mborder;
/* vertical pass */
/* vertical pass first for half-higher layer encoding*/
/* Should insert the precise bordering process ! */
for(j2=k=0; j2<mbsize; j2+=2, k+=2*bsize_ext)
{
for(i=0; i<bsize; i++)
{
j = j2>>1;
l = j*bsize_ext;
/* T1 */
context = (half_bab_data[k-bsize_ext+i]<<7) /* T9*/
| ( half_bab_data[k-bsize_ext+i+1] <<6) /* T8 */
| (half_bab_data[k+bsize_ext+i-1] <<5) /* T7 */
| (half_bab_data[k+i-1] <<4) /* T6 */
| (lower_bab_data[l+i] <<3) /* T5 */
| (lower_bab_data[l+i+1] <<2) /* T4 */
| (lower_bab_data[l+bsize_ext+i] <<1) /* T3 */
| (lower_bab_data[l+bsize_ext+i+1]); /* T2 */
if(filter->DWT_Class==DWT_ODD_SYMMETRIC){
prob=prob_odd0[context];
} else if(filter->DWT_Class==DWT_EVEN_SYMMETRIC) {
prob=prob_even0[context];
} else {
fprintf(stderr,"Error: filter type in FullEncoding() !\n");
exit(0);
}
half_bab_data[k+i] = ArDecodeSymbol_Still(ar_decoder, prob);
/* T0 */
context = (half_bab_data[k+i]<<7) /* T1*/
| ( lower_bab_data[l+bsize_ext+i-1] <<6) /* T10 */
| (half_bab_data[k+bsize_ext+i-1] <<5) /* T7 */
| (half_bab_data[k+i-1] <<4) /* T6 */
| (lower_bab_data[l+i] <<3) /* T5 */
| (lower_bab_data[l+i+1] <<2) /* T4 */
| (lower_bab_data[l+bsize_ext+i] <<1) /* T3 */
| (lower_bab_data[l+bsize_ext+i+1]); /* T2 */
if(filter->DWT_Class==DWT_ODD_SYMMETRIC){
prob=prob_odd1[context];
} else if(filter->DWT_Class==DWT_EVEN_SYMMETRIC) {
prob=prob_even1[context];
} else {
fprintf(stderr,"Error: filter type in FullEncoding() !\n");
exit(0);
}
half_bab_data[k+bsize_ext+i]=ArDecodeSymbol_Still(ar_decoder, prob);
}
}
/* horizontal */
for(i2=0; i2<mbsize; i2+=2)
{
for(j=k=0; j<mbsize; j++, k+=mbsize_ext)
{
i = i2>>1;
l = j*bsize_ext;
/* T1 */
context = (curr_bab_data[k+i2-1]<<7) /* T9*/
| ( curr_bab_data[k+mbsize_ext+i2-1] <<6) /* T8 */
| (curr_bab_data[k-mbsize_ext+i2+1] <<5) /* T7 */
| (curr_bab_data[k-mbsize_ext+i2] <<4) /* T6 */
| (half_bab_data[l+i] <<3) /* T5 */
| (half_bab_data[l+bsize_ext+i] <<2) /* T4 */
| (half_bab_data[l+i+1] <<1) /* T3 */
| (half_bab_data[l+bsize_ext+i+1]); /* T2 */
if(filter->DWT_Class==DWT_ODD_SYMMETRIC){
prob=prob_odd0[context];
} else if(filter->DWT_Class==DWT_EVEN_SYMMETRIC) {
prob=prob_even0[context];
} else {
fprintf(stderr,"Error: filter type in FullEncoding() !\n");
exit(0);
}
curr_bab_data[k+i2]=ArDecodeSymbol_Still(ar_decoder, prob);
/* T0 */
context = (curr_bab_data[k+i2]<<7) /* T1*/
| ( half_bab_data[l-bsize_ext+i+1] <<6) /* T10 */
| (curr_bab_data[k-mbsize_ext+i2+1] <<5) /* T7 */
| (curr_bab_data[k-mbsize_ext+i2] <<4) /* T6 */
| (half_bab_data[l+i] <<3) /* T5 */
| (half_bab_data[l+bsize_ext+i] <<2) /* T4 */
| (half_bab_data[l+i+1] <<1) /* T3 */
| (half_bab_data[l+bsize_ext+i+1]); /* T2 */
if(filter->DWT_Class==DWT_ODD_SYMMETRIC){
prob=prob_odd1[context];
} else if(filter->DWT_Class==DWT_EVEN_SYMMETRIC) {
prob=prob_even1[context];
} else {
fprintf(stderr,"Error: filter type in FullEncoding() !\n");
exit(0);
}
curr_bab_data[k+i2+1]=ArDecodeSymbol_Still(ar_decoder, prob);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -