📄 shapeenhencode.cpp
字号:
}
if(b_except) break;
}
if(!b_except)
{
/*-- check for P2/P3 pixel 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];
curr= curr_bab_data[k+i2];
next= curr_bab_data[k+mbsize_ext+i2];
if((prev==next) && (curr!=prev))
{
b_except = 1; /*101 case */
break;
}
}
if(b_except) break;
}
}
} else {
b_except = 1;
}
if(b_except) bab_type = 1; /* full_coded */
else bab_type = 0; /* xor_coded (Modified SISC) */
if (scan_order == 1) free(curr_bab_data_tr); // SAIT_PDAM: ADDED by D.-S.Cho (Samsung AIT)
/* 0: XOR_coded, 1: Full_coded, 2:XOR+P0 */
return bab_type;
}
/***********************************************************CommentBegin******
*
* -- ShapeEnhContentEncode -- Encodes a binary alpha block using SI.
*
* Author :
* Dae-Sung Cho (Samsung AIT)
*
* Created :
* 09-Feb-98
*
* Arguments:
*
*
* Return values :
*
* Side effects :
* -
*
* Description : A binary alpha block will be coded using bac.
* These bits are added to the <shape_stream>.
*
* See also :
*
***********************************************************CommentEnd********/
Int CVTCEncoder::
ShapeEnhContentEncode(UChar *bordered_lower_bab,
UChar *bordered_half_bab,
UChar *bordered_curr_bab,
Int bab_type,
Int scan_order, // SAIT_PDAM: ADDED by D.-S.Cho (Samsung AIT)
Int mbsize,
FILTER *filter,
BSS *bitstream,
ArCoder *ar_coder)
{
if (bab_type==0) /* Interleaved Scan-Line (ISL) coding */
{
ExclusiveORencoding (bordered_lower_bab,
bordered_half_bab,
bordered_curr_bab,
mbsize,
scan_order, // SAIT_PDAM: ADDED by D.-S.Cho (Samsung AIT)
bitstream,
ar_coder);
} else if(bab_type ==1) /* Raster Scan-Line (RSL) coding */
{
FullEncoding (bordered_lower_bab,
bordered_half_bab,
bordered_curr_bab,
mbsize,
filter,
bitstream,
ar_coder);
} else
{
fprintf(stderr,"BAB type[%d] ERROR in Enhancement layer coding!\n", bab_type);
}
return 0;
}
Void CVTCEncoder::
ExclusiveORencoding (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)
BSS *bitstream,
ArCoder *ar_coder)
{
Int i2,j2,k,curr,prev,next;
Int i,j; // SAIT_PDAM: ADDED by D.-S.Cho (Samsung AIT)
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;
Int start_bit, end_bit, bitnum=0;
UChar *lower_bab_data,
*curr_bab_data;
UChar *curr_bab_data_tr; // SAIT_PDAM: ADDED by D.-S.Cho (Samsung AIT)
lower_bab_data = bordered_lower_bab + border * bsize_ext + border;
// SAIT_PDAM: BEGIN - ADDED by D.-S.Cho (Samsung AIT)
if (scan_order == 1) {
curr_bab_data_tr = (UChar *)calloc(mbsize_ext*mbsize_ext, sizeof(UChar));
for(j=0; j<mbsize_ext; j++)
for(i=0; i<mbsize_ext; i++)
curr_bab_data_tr[j*mbsize_ext+i]=bordered_curr_bab[i*mbsize_ext+j];
curr_bab_data = curr_bab_data_tr + mborder * mbsize_ext + mborder;
} else
// SAIT_PDAM: END - ADDED by D.-S.Cho (Samsung AIT)
curr_bab_data= bordered_curr_bab + mborder * mbsize_ext + mborder;
start_bit = bitstream->cnt;
/*-- P1 pixels encoding --*/
// 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)
curr= curr_bab_data[k+i2];
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];
ArCodeSymbol_Still(ar_coder, bitstream, curr, prob);
}
else
{
if(prev!=curr)
{
fprintf(stderr, "Error: BAB coding mode mismatch in XOR coding : P1!\n");
fprintf(stderr, "Error: P1[%d,%d,%d]!\n",prev,curr,next);
fprintf(stderr,"1, j2=%d i2=%d prev=%d curr=%d next=%d context=%d bits=%d\n",
j2, i2, prev, curr, next, context, bitstream->cnt);
exit(0);
}
}
}
}
/*-- P2/P3 pixel coding --*/
for(j2=1,k=mbsize_ext; j2<mbsize; j2+=2, k+=(mbsize_ext<<1) )
{
for(i2=0; i2<mbsize; i2++)
{
curr= curr_bab_data[k+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];
ArCodeSymbol_Still(ar_coder, bitstream, curr, prob);
}
else
{
if(prev!=curr)
{
fprintf(stderr, "Error: BAB coding mode mismatch in XOR coding : P2, P3!\n");
exit(0);
}
}
}
}
if(scan_order==1) free(curr_bab_data_tr); // SAIT_PDAM: ADDED by D.-S.Cho (Samsung AIT)
end_bit = bitstream->cnt;
bitnum = end_bit - start_bit;
}
/* Modified by shson */
Void CVTCEncoder::
FullEncoding (UChar *bordered_lower_bab,
UChar *bordered_half_bab,
UChar *bordered_curr_bab,
Int mbsize,
FILTER *filter,
BSS *bitstream,
ArCoder *ar_coder)
{
Int i,j,i2,j2,k,l,curr;
Int mborder = MBORDER;
Int mbsize_ext = mbsize+(mborder<<1);
Int border = BORDER;
Int bsize = mbsize >> 1;
Int bsize_ext = bsize+(border<<1);
// Int not_coded, low_value;
Int context, prob=0;
Int start_bit, end_bit, bitnum=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;
start_bit = bitstream->cnt;
/* vertical pass first for half-higher layer encoding*/
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 */
curr = half_bab_data[k+i];
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);
}
ArCodeSymbol_Still(ar_coder, bitstream, curr, prob);
/* T0 */
curr = half_bab_data[k+bsize_ext+i];
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);
}
ArCodeSymbol_Still(ar_coder, bitstream, curr, 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 */
curr = curr_bab_data[k+i2];
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);
}
ArCodeSymbol_Still(ar_coder, bitstream, curr, prob);
/* T0 */
curr = curr_bab_data[k+i2+1];
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);
}
ArCodeSymbol_Still(ar_coder, bitstream, curr, prob);
}
}
end_bit = bitstream->cnt;
bitnum = end_bit - start_bit;
}
/*********************************************************************************
*
* Bitstream Manipulation
*
*********************************************************************************/
/* Merge Shape Bitstream into main bit stream */
Void CVTCEncoder::
MergeEnhShapeBitstream()
{
if(ShapeBitstream==NULL) {
fprintf(stderr,"EnhShapeBitStream Not Available\n");
exit(1);
}
InitBitstream(0,ShapeBitstream);
BitStreamMerge(ShapeBitstreamLength, ShapeBitstream);
free(ShapeBitstream->bs);
free(ShapeBitstream);
ShapeBitstream = NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -