function b=jacenc(x) % Usage: b=jacenc(x) % JPEG AC coefficient encoding routine % x: AC coefficient sequence % b: corresponding bit stream % copyright (c) 1997 by Yu Hen Hu % % created: 11/25/97 % b=[]; % run - category - length - bsae code length - base code table=[... 0 1 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 6 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 4 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 5 10 5 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 6 12 6 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 14 7 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 8 18 10 1 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 9 25 16 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 0 10 26 16 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 5 4 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 8 6 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 3 10 7 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 4 13 9 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1 5 16 11 1 1 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 6 22 16 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 1 7 23 16 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 1 1 8 24 16 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 0 1 9 25 16 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 10 26 16 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 2 1 6 5 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 2 2 10 8 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 2 3 13 10 1 1 1 1 1 1 0 1 1 1 0 0 0 0 0 0 2 4 20 16 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 1 2 5 21 16 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1 0 2 6 22 16 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 2 7 23 16 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 2 8 24 16 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 1 2 9 25 16 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 0 2 10 26 16 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 3 1 7 6 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 3 2 11 9 1 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 3 3 14 11 1 1 1 1 1 1 1 0 1 1 1 0 0 0 0 0 3 4 20 16 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 3 5 21 16 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 1 3 6 22 16 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 3 7 23 16 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 3 8 24 16 1 1 1 1 1 1 1 1 1 0 0 1 0 1 0 0 3 9 25 16 1 1 1 1 1 1 1 1 1 0 0 1 0 1 0 1 3 10 26 16 1 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 4 1 7 6 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 4 2 12 10 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 4 3 19 16 1 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 4 4 20 16 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 4 5 21 16 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 4 6 22 16 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 0 4 7 23 16 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 4 8 24 16 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0 0 4 9 25 16 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0 1 4 10 26 16 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 5 1 8 7 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 5 2 12 10 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 5 3 19 16 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 5 4 20 16 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 5 5 21 16 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 1 5 6 22 16 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 0 5 7 23 16 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 1 5 8 24 16 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 0 5 9 25 16 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 5 10 26 16 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 0 6 1 8 7 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 6 2 13 11 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 6 3 19 16 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 6 4 20 16 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 0 6 5 21 16 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 1 6 6 22 16 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 6 7 23 16 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 6 8 24 16 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 0 6 9 25 16 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 6 10 26 16 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 7 1 9 8 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 7 2 13 11 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 7 3 19 16 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 7 4 20 16 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 0 7 5 21 16 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 1 7 6 22 16 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1 0 7 7 23 16 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1 1 7 8 24 16 1 1 1 1 1 1 1 1 1 0 1 1 0 1 0 0 7 9 25 16 1 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 7 10 26 16 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 8 1 9 8 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 8 2 17 15 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 8 3 19 16 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 8 4 20 16 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 8 5 21 16 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 8 6 22 16 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 8 7 23 16 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 8 8 24 16 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 8 9 25 16 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 8 10 26 16 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 9 1 10 9 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 9 2 18 16 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 9 3 19 16 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 9 4 20 16 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 9 5 21 16 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 9 6 22 16 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 9 7 23 16 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 9 8 24 16 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1 9 9 25 16 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 0 9 10 26 16 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 10 1 10 9 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 10 2 18 16 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 10 3 19 16 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 10 4 20 16 1 1 1 1 1 1 1 1 1 1 0 0 1 0 1 0 10 5 21 16 1 1 1 1 1 1 1 1 1 1 0 0 1 0 1 1 10 6 22 16 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 10 7 23 16 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 10 8 24 16 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0 10 9 25 16 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 10 10 26 16 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 11 1 10 9 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 11 2 18 16 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 11 3 19 16 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 11 4 20 16 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 11 5 21 16 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 11 6 22 16 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 11 7 23 16 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 11 8 24 16 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 11 9 25 16 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 11 10 26 16 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1 12 1 11 10 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 12 2 18 16 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 0 12 3 19 16 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 12 4 20 16 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 12 5 21 16 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 12 6 22 16 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 12 7 23 16 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 12 8 24 16 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 12 9 25 16 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 12 10 26 16 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 13 1 12 11 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 13 2 18 16 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 13 3 19 16 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 13 4 20 16 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 1 13 5 21 16 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 13 6 22 16 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 13 7 23 16 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 13 8 24 16 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 13 9 25 16 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 13 10 26 16 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 14 1 13 12 1 1 1 1 1 1 1 1 0 1 1 0 0 0 0 0 14 2 18 16 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 14 3 19 16 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 14 4 20 16 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 14 5 21 16 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 14 6 22 16 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 14 7 23 16 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 14 8 24 16 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 14 9 25 16 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 14 10 26 16 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 15 1 17 16 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 15 2 18 16 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 15 3 19 16 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 15 4 20 16 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 15 5 21 16 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 15 6 22 16 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 15 7 23 16 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 15 8 24 16 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 15 9 25 16 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 15 10 26 16 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 4 4 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 15 0 12 12 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 0]; ix = find(x~=0); % index of next non-zero entry Nx = length(ix); % # of non-zero entries % if first ac coefficient has no leading zeros % then encode x(1)! % note much details have been left out here % we did not concern what if Nx=1 and x(1)=EoB if ix(1)==1, run=0; % no leading zero tmp=int2bin(x(1)); % tmp is 1 by (c+1) cat=length(tmp)-1; % first bit is sign bit row=run*10+cat; prefix=table(row,5:table(row,4)+4); if tmp(1)==1, %if current x is negative tmp=ones(1,cat+1)-tmp; % 1's complement end b=[prefix tmp(2:cat+1)]; end for n=2:Nx, % loop through each non-zero entry prefix=[]; % 1. ck # of leading zeros run=ix(n)-ix(n-1)-1; % 2. ck if run > 16; % run of 0s longer than 15, will be broken down into repeated % run-of-15-0 symbol while run > 15, b=[b 1 1 1 1 1 1 1 1 0 1 1 1]; run=run-15; end % check if end of block if x(ix(n))==999, b = [b 1 0 1 0]; % append EoB symbol else tmp=int2bin(x(ix(n))); % tmp is 1 by (c+1) cat=length(tmp)-1; % first bit is sign bit row=run*10+cat; % row number of the prefix Hoffman code prefix=table(row,5:table(row,4)+4); if tmp(1)==1, % if current x is negative tmp=ones(1,cat+1)-tmp; % 1's complement end b=[b prefix tmp(2:cat+1)]; end end