function mav_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 mav_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 + mav_pfdpu_GetBit(bfr,bitinx)
endfor
return, r
end
function mav_pfdpu_NextA,bfr,bitinx
if(mav_pfdpu_GetBits(bfr,bitinx,1) eq 0) then return,0
if(mav_pfdpu_GetBits(bfr,bitinx,1) eq 0) then return,1
n = mav_pfdpu_GetBits(bfr,bitinx,2)
if( n lt 3 ) then return, n+2
n = mav_pfdpu_GetBits(bfr,bitinx,8)
return, n
end
function mav_pfdpu_NextB,bfr,bitinx
n = mav_pfdpu_GetBits(bfr,bitinx,3)
case n of
0: return, (0)
1: return, (1)
2: return,( 2 + mav_pfdpu_GetBits(bfr,bitinx,1))
3: return,( 4 + mav_pfdpu_GetBits(bfr,bitinx,2))
4: begin
m = mav_pfdpu_GetBits(bfr,bitinx,2)
if( m eq 0 ) then return,( 8 )
if( m eq 1 ) then begin
p = mav_pfdpu_GetBits(bfr,bitinx,2)
if( p lt 3) then return,( 9 + p)
return,( mav_pfdpu_GetBits(bfr,bitinx, 8 ))
endif
if( m eq 2 ) then begin
p = mav_pfdpu_GetBits(bfr,bitinx,2)
if( p gt 0) then return,( -12 + p)
return,( - mav_pfdpu_GetBits(bfr,bitinx, 8 ))
endif
if( m eq 3 ) then return,( -8 )
end
5: return,( -7 + mav_pfdpu_GetBits(bfr,bitinx,2))
6: return,( -3 + mav_pfdpu_GetBits(bfr,bitinx,1))
7: return,( -1 )
endcase
end
function mav_pfdpu_NextC,bfr,bitinx
n = mav_pfdpu_GetBits(bfr,bitinx,4)
switch (n) of
0:
1:
2:
3: return,(n)
4: return,( 4 + mav_pfdpu_GetBits(bfr,bitinx,1) )
5: return,( 6 + mav_pfdpu_GetBits(bfr,bitinx,1) )
6: return,( 8 + mav_pfdpu_GetBits(bfr,bitinx,1) )
7: if( mav_pfdpu_GetBits(bfr,bitinx,1) eq 0) then return,( 10 ) $
else return,( 11 + mav_pfdpu_GetBits(bfr,bitinx,1) )
8: begin
m = mav_pfdpu_GetBits(bfr, bitinx, 2)
if( m eq 0 ) then return,( 13 )
if( m eq 1 ) then begin
p = mav_pfdpu_GetBits(bfr, bitinx, 1)
if( p eq 0) then return,( 14 )
return,( mav_pfdpu_GetBits(bfr,bitinx,8) )
endif
if( m eq 2 ) then begin
p = mav_pfdpu_GetBits(bfr,bitinx,1)
if( p eq 1) then return,( -14 )
return,( -mav_pfdpu_GetBits(bfr,bitinx,8) )
endif
if( m eq 3 ) then return,( -13 )
end
9: if( mav_pfdpu_GetBits(bfr,bitinx,1) eq 1) then return,( -10 ) $
else return,( -12 + mav_pfdpu_GetBits(bfr,bitinx,1) )
10: return,( -9 + mav_pfdpu_GetBits(bfr,bitinx,1) )
11: return,( -7 + mav_pfdpu_GetBits(bfr,bitinx,1) )
12: return,( -5 + mav_pfdpu_GetBits(bfr,bitinx,1) )
13: return,( -3 )
14: return,( -2 )
15: return,( -1 )
endswitch
end
function mav_pfdpu_NextD, bfr, bitinx
n = mav_pfdpu_GetBits(bfr,bitinx,4)
switch (n) of
0:
1:
2:
3: return,(n)
4: return,( 4 + mav_pfdpu_GetBits(bfr,bitinx,1))
5: return,( 6 + mav_pfdpu_GetBits(bfr,bitinx,1))
6: return,( 8 + mav_pfdpu_GetBits(bfr,bitinx,1))
7: if( mav_pfdpu_GetBits(bfr,bitinx,1) eq 0) then return,(10) $
else return,( 11 + mav_pfdpu_GetBits(bfr,bitinx,1))
8: begin
m = mav_pfdpu_GetBits(bfr,bitinx,4)
if( m lt 7 ) then return,( 13+m )
if( m eq 7 ) then return,( mav_pfdpu_GetBits(bfr,bitinx,8))
if( m eq 8 ) then return,( -mav_pfdpu_GetBits(bfr,bitinx,8))
if( m gt 8 ) then return,( -28+m )
end
9: if( mav_pfdpu_GetBits(bfr,bitinx,1) eq 1) then return,(-10) else $
return,( -12 + mav_pfdpu_GetBits(bfr,bitinx,1))
10: return,( -9 + mav_pfdpu_GetBits(bfr,bitinx,1))
11: return,( -7 + mav_pfdpu_GetBits(bfr,bitinx,1))
12: return,( -5 + mav_pfdpu_GetBits(bfr,bitinx,1))
13: return,( -3 )
14: return,( -2 )
15: return,( -1 )
endswitch
end
function mav_pfdpu_DecodeA, bfr, bitinx
dst = bytarr(32)
for i=0,32-1 do begin
dst[i] = mav_pfdpu_NextA(bfr, bitinx)
endfor
return, dst
end
function mav_pfdpu_DecodeB, bfr, bitinx
dst = bytarr(32)
R = mav_pfdpu_GetBits(bfr,bitinx,8)
dst[0] = R
for i=1,32-1 do begin
Del = mav_pfdpu_NextB(bfr, bitinx)
R += Del
dst[i] = R
endfor
return, dst
end
function mav_pfdpu_DecodeC, bfr, bitinx
dst = bytarr(32)
R = mav_pfdpu_GetBits(bfr, bitinx, 8)
dst[0] = R
for i=1,32-1 do begin
Del = mav_pfdpu_NextC(bfr, bitinx)
R += Del
dst[i] = R
endfor
return, dst
end
function mav_pfdpu_DecodeD, bfr, bitinx
dst = bytarr(32)
R = mav_pfdpu_GetBits(bfr, bitinx, 8)
dst[0] = R
for i=1,32-1 do begin
Del = mav_pfdpu_NextD(bfr, bitinx)
R += Del
dst[i] = R
endfor
return, dst
end
function mav_pfdpu_part_decompress_data2, bfr
cmpbyte = bfr[12]
if (cmpbyte and 128) eq 0 then return,bfr
pktbits = 8*(bfr(4)*256+bfr(5) + 7)
pktbits = pktbits - 32
decomp_bfr = bytarr(4096)
for j = 0,15 do decomp_bfr[j] = bfr[j]
DcmInx = 16
BitInx = DcmInx*8
while (BitInx lt Pktbits ) do begin
Type = mav_pfdpu_GetBits(bfr, bitinx, 2)
case (Type) of
0: b32 = mav_pfdpu_DecodeA(bfr, bitinx)
1: b32 = mav_pfdpu_DecodeB(bfr, bitinx)
2: b32 = mav_pfdpu_DecodeC(bfr, bitinx)
3: b32 = mav_pfdpu_DecodeD(bfr, bitinx)
endcase
if (DcmInx+31 gt 4095) then begin
print,"decompression error"
break
endif
decomp_bfr[DcmInx:DcmInx+31] = B32
DcmInx += 32
endwhile
decomp_size = DcmInx
decomp_bfr(4) = (decomp_size-7) / 256
decomp_bfr(5) = (decomp_size-7) mod 256
ddata = decomp_bfr[0:decomp_size-1]
return, ddata
end