package uk.co.mmscomputing.io;
import java.io.*;
public class RLEOutputStream extends FilterOutputStream{
private int ccw; // the current code word we are counting the run length for
private int rlen; // the run length
private int bpcw; // bytes per code word
private int cw,cwi; // code word buffer, code word index
public RLEOutputStream(OutputStream out){
this(out,1);
}
public RLEOutputStream(OutputStream out, int bytesPerCodeWord){
super(out);
bpcw=bytesPerCodeWord;
cw=0;cwi=0;ccw=-1;rlen=0;
}
public void setStartCodeWord(int cw){ccw=cw;}
public void write(byte[] b)throws IOException{
write(b,0,b.length);
}
public void write(byte[] b,int off,int len)throws IOException{
for(int i=0;i<len;i++){
cw<<=8;cw|=(b[off+i]&0x000000FF);cwi++;
if(cwi==bpcw){write(cw);cw=0;cwi=0;}
}
}
public void write(int cw)throws IOException{ // cw can be 32 bit
if(cw==ccw){ // if still same code word increase run length
rlen++;
}else{ // else write run length to underlying stream
out.write(rlen); // run length could be 32 bit numbers !!!
ccw=cw;rlen=1; // start counting for new codeword
}
}
public void flush()throws IOException{
if(rlen>0){out.write(rlen);}
ccw=-1;rlen=0;
out.flush();
}
}