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; }
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++; } } }
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; }
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; } }