Exemple #1
0
int SIC::DecompressRowGrey(uint8_t *inbuf,uint8_t *linebuf)
{
  BitBuffer bitin(inbuf+4);
  int i=0;
  bool runmode=false;
  while (i<width) {
    int w=0,ww=0;
    if (i>0) w=linebuf[i-1];
    if (i>1) ww=linebuf[i-2];

    if (!runmode && w==ww) runmode=true;

    if (!runmode) {
      linebuf[i]=DecodeVal(bitin,w);
      i++;
    } else {
      int runlen=bitin.GetEliasGamma()-1;
      for (int k=0;k<runlen;k++) linebuf[i+k]=w;
      i+=runlen;
      linebuf[i]=DecodeVal(bitin,w);
      i++;
      runmode=false;
    }
  }
  return bitin.GetBytesProcessed()+4;
}
Exemple #2
0
unsigned char get_byte(int mode){				//プリアンブル受信時に1 僕はこの辺はよく把握していない 江
  	unsigned char bitbuff;
  	unsigned char bytebuff=0;
  	unsigned char bitbuff_5th1;
	//int shiftbuff=0;
  	for(i=0;i<8;i++){							//常に8回行う。江
    	bitbuff=bitin();						//1bit受信、0なら0、1なら1.冗長じゃない? 江
    	if(mode==0){							/*プリアンブルモードでないならビットシフトの処理 //をしてから。江			 */
    											/*ビットシフトの処理というのは、5回連続で1が来たら次のビットを捨てる処理 江*/
      		if(bitbuff) shiftbuff++;
      		else shiftbuff=0;
			if(shiftbuff==5){					//5回連続1を検出する //5回連続bitinで1を検出する 江
				shiftbuff=0;
				bitbuff_5th1=bitin();			//次の1bitが0だった場合は捨てる。1であるならポストアンブルの可能性
				if(bitbuff_5th1==1){
					bytebuff=bytebuff>>1;		//上位ビットから入れていく。1bit左にシフト    //ここから3行はbit→byteの処理。江
    				bytebuff=bytebuff&0x7f;		//一番下の桁を0にマスク
   					bytebuff+=(bitbuff_5th1)*(0x80);
					bit++;
					i++;
				}
      		}
    	}
Exemple #3
0
int SIC::DecompressRowBinary(uint8_t *inbuf,uint8_t *linebuf)
{
  BitBuffer bitin(inbuf+4);
  bool sbit=bitin.GetBits(1);

  //int N=1,A=256;
  int i=0;
  while (i<width) {
    //int nrun=bitin.GetRice(BitBuffer::EstimateK(N,A));
    int nrun=bitin.GetEliasGamma();
    for (int r=0;r<nrun;r++) linebuf[i++]=sbit;
    //if (N>=256) {N>>=1;A>>=1;};
    //N++;A+=nrun;
    sbit=!sbit;
  }
  return bitin.GetBytesProcessed()+4;
}
Exemple #4
0
 void UnpackRow(vector <uint8_t> &srcdata,uint32_t width,int64_t *dstdata)
 {
   memset(dstdata,0,width*sizeof(int64_t));
   BitBufferSafe bitin(srcdata);
   int nrun;
   uint32_t i=0;
   int64_t llabel=0;
   while (i<width) {
     int64_t diff=bitin.GetEliasGamma();
     if (diff>1) {
        diff-=2;
        bool sgn=bitin.GetBit();
        nrun=bitin.GetEliasGamma();
        if (sgn) diff=-diff;
        int64_t label=diff+llabel;
        if (i+nrun>width) cerr << "rlepack: attempt to read over eol\n";
        else for (int k=0;k<nrun;k++) dstdata[i+k]=label;
        llabel=label;
     } else nrun=bitin.GetEliasGamma();
     i+=nrun;
   }
 }