function mvn_pfdpu_getbit,bfr,bitinx
inx = bitinx / 8
bit = bitinx mod 8
bmask = [128b,64b,32b,16b,8b,4b,2b,1b]
bitinx++
return , (bfr[Inx] and bmask[bit]) ne 0
end
function mvn_pfdpu_GetBits,bfr,bitinx, leng
if leng gt (n_elements(bfr)*8 - bitinx) then begin
return,0
endif
r=0
for i=0,leng-1 do begin
r = r*2 + mvn_pfdpu_GetBit(bfr,bitinx)
endfor
return, r
end
function mvn_pfdpu_NextA,bfr,bitinx
if(mvn_pfdpu_GetBits(bfr,bitinx,1) eq 0) then return,0
if(mvn_pfdpu_GetBits(bfr,bitinx,1) eq 0) then return,1
n = mvn_pfdpu_GetBits(bfr,bitinx,2)
if( n lt 3 ) then return, n+2
n = mvn_pfdpu_GetBits(bfr,bitinx,8)
return,n
end
function mvn_pfdpu_NextB,bfr,bitinx
n = mvn_pfdpu_GetBits(bfr,bitinx,3)
case n of
0: return, (0)
1: return, (1)
2: return,( 2 + mvn_pfdpu_GetBits(bfr,bitinx,1))
3: return,( 4 + mvn_pfdpu_GetBits(bfr,bitinx,2))
4: begin
m = mvn_pfdpu_GetBits(bfr,bitinx,2)
if( m eq 0 ) then return,( 8 )
if( m eq 1 ) then begin
p = mvn_pfdpu_GetBits(bfr,bitinx,2)
if( p lt 3) then return,( 9 + p)
return,( mvn_pfdpu_GetBits(bfr,bitinx, 8 ))
endif
if( m eq 2 ) then begin
p = mvn_pfdpu_GetBits(bfr,bitinx,2)
if( p gt 0) then return,( -12 + p)
return,( - mvn_pfdpu_GetBits(bfr,bitinx, 8 ))
endif
if( m eq 3 ) then return,( -8 )
end
5: return,( -7 + mvn_pfdpu_GetBits(bfr,bitinx,2))
6: return,( -3 + mvn_pfdpu_GetBits(bfr,bitinx,1))
7: return,( -1 )
endcase
end
function mvn_pfdpu_NextC,bfr,bitinx
n = mvn_pfdpu_GetBits(bfr,bitinx,4)
switch (n) of
0:
1:
2:
3: return,(n)
4: return,( 4 + mvn_pfdpu_GetBits(bfr,bitinx,1))
5: return,( 6 + mvn_pfdpu_GetBits(bfr,bitinx,1))
6: return,( 8 + mvn_pfdpu_GetBits(bfr,bitinx,1))
7: if( mvn_pfdpu_GetBits(bfr,bitinx,1) eq 0) then return,(10) $
else return,( 11 + mvn_pfdpu_GetBits(bfr,bitinx,1))
8: begin
m = mvn_pfdpu_GetBits(bfr,bitinx,2)
if( m eq 0 ) then return,( 13 )
if( m eq 1 ) then begin
p = mvn_pfdpu_GetBits(bfr,bitinx,1)
if( p eq 0) then return,( 14 )
return,( mvn_pfdpu_GetBits(bfr,bitinx,8 ))
endif
if( m eq 2 ) then begin
p = mvn_pfdpu_GetBits(bfr,bitinx,1)
if( p eq 1) then return,( -14 )
return,( -mvn_pfdpu_GetBits(bfr,bitinx,8 ))
endif
if( m eq 3 ) then return,( -13 )
end
9: if( mvn_pfdpu_GetBits(bfr,bitinx,1) eq 1) then return,(-10) $
else return,( -12 + mvn_pfdpu_GetBits(bfr,bitinx,1))
10: return,( -9 + mvn_pfdpu_GetBits(bfr,bitinx,1))
11: return,( -7 + mvn_pfdpu_GetBits(bfr,bitinx,1))
12: return,( -5 + mvn_pfdpu_GetBits(bfr,bitinx,1))
13: return,( -3 )
14: return,( -2 )
15: return,( -1 )
endswitch
end
function mvn_pfdpu_NextD,bfr,bitinx
n = mvn_pfdpu_GetBits(bfr,bitinx,4)
switch (n) of
0:
1:
2:
3: return,(n)
4: return,( 4 + mvn_pfdpu_GetBits(bfr,bitinx,1))
5: return,( 6 + mvn_pfdpu_GetBits(bfr,bitinx,1))
6: return,( 8 + mvn_pfdpu_GetBits(bfr,bitinx,1))
7: if( mvn_pfdpu_GetBits(bfr,bitinx,1) eq 0) then return,(10) $
else return,( 11 + mvn_pfdpu_GetBits(bfr,bitinx,1))
8: begin
m = mvn_pfdpu_GetBits(bfr,bitinx,4)
if( m lt 7 ) then return,( 13+m )
if( m eq 7 ) then return,( mvn_pfdpu_GetBits(bfr,bitinx,8))
if( m eq 8 ) then return,( -mvn_pfdpu_GetBits(bfr,bitinx,8))
if( m gt 8 ) then return,( -28+m )
end
9: if( mvn_pfdpu_GetBits(bfr,bitinx,1) eq 1) then return,(-10) else $
return,( -12 + mvn_pfdpu_GetBits(bfr,bitinx,1))
10: return,( -9 + mvn_pfdpu_GetBits(bfr,bitinx,1))
11: return,( -7 + mvn_pfdpu_GetBits(bfr,bitinx,1))
12: return,( -5 + mvn_pfdpu_GetBits(bfr,bitinx,1))
13: return,( -3 )
14: return,( -2 )
15: return,( -1 )
endswitch
end
function mvn_pfdpu_DecodeA, bfr,bitinx
dst = bytarr(32)
for i=0,32-1 do begin
dst[i] = mvn_pfdpu_NextA(bfr,bitinx)
endfor
return,dst
end
function mvn_pfdpu_DecodeB, bfr,bitinx
dst = bytarr(32)
R = mvn_pfdpu_GetBits(bfr,bitinx,8)
dst[0] = R
for i=1,32-1 do begin
Del = mvn_pfdpu_NextB( bfr,bitinx)
R += Del
dst[i] = R
endfor
return,dst
end
function mvn_pfdpu_DecodeC, bfr,bitinx
dst = bytarr(32)
R = mvn_pfdpu_GetBits(bfr,bitinx,8)
dst[0] = R
for i=1,32-1 do begin
Del = mvn_pfdpu_NextC( bfr,bitinx)
R += Del
dst[i] = R
endfor
return, dst
end
function mvn_pfdpu_DecodeD, bfr,bitinx
dst = bytarr(32)
R = mvn_pfdpu_GetBits(bfr,bitinx,8)
dst[0] = R
for i=1,32-1 do begin
Del = mvn_pfdpu_NextD( bfr,bitinx)
R += Del
dst[i] = R
endfor
return,dst
end
function mvn_pfdpu_part_decompress_data,cpkt,cfactor=cfactor
bfr = cpkt.data
cmpbyte = bfr[2]
cfactor=1.
if ((cmpbyte) and 128) eq 0 then return,bfr
comp_size = n_elements(bfr)
decomp_bfr= bytarr(2048 + 32)
pktbits = 8 * (comp_size)
nn = 6
for DcmInx = 0,nn-1 do decomp_bfr[DcmInx] = bfr[DcmInx]
BitInx = DcmInx*8
while (BitInx lt (Pktbits-32) ) do begin
Type = mvn_pfdpu_GetBits(bfr,bitinx, 2 )
case (Type) of
0: b32 = mvn_pfdpu_DecodeA(bfr, bitinx)
1: b32 = mvn_pfdpu_DecodeB(bfr, bitinx)
2: b32= mvn_pfdpu_DecodeC(bfr, bitinx)
3: b32 = mvn_pfdpu_DecodeD(bfr, bitinx)
endcase
if DcmInx ge 2048 then begin
dprint,'Decompression error'
error=1
break
endif
decomp_bfr[DcmInx:DcmInx+31] = B32
DcmInx += 32
endwhile
decomp_size = DcmInx
ddata = decomp_bfr[0:decomp_size-1]
cfactor = float(decomp_size)/float(comp_size)
return, ddata
end