%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%        VIDEO KOMPRESIJA          %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear all
close all
warning off

mov=aviread('viptraffic.avi');      % ucitavanje videa
N=2;                                % razina dekompozicije, max. 3
duljina=size(mov,2);                % ukupan broj slika

% racunanje dimenzije slika
img=mov(1,1).cdata;
img=rgb2gray(img);
[R,S]=size(img);

% postavljanje colormapa
map=colormap('gray');
close

% velicina:     visina  x  sirina  x  broj slika
% prazne matrice za prvu aproksimaciju
A1=zeros(ceil(R/2),ceil(S/2),duljina);
H1=zeros(ceil(R/2),ceil(S/2),duljina);
V1=zeros(ceil(R/2),ceil(S/2),duljina);
D1=zeros(ceil(R/2),ceil(S/2),duljina);

% prazne matrice za drugu aproksimaciju
A2=zeros(ceil(R/4),ceil(S/4),duljina);
H2=zeros(ceil(R/4),ceil(S/4),duljina);
V2=zeros(ceil(R/4),ceil(S/4),duljina);
D2=zeros(ceil(R/4),ceil(S/4),duljina);

% prazne matrice za trecu aproksimaciju
A3=zeros(ceil(R/8),ceil(S/8),duljina);
H3=zeros(ceil(R/8),ceil(S/8),duljina);
V3=zeros(ceil(R/8),ceil(S/8),duljina);
D3=zeros(ceil(R/8),ceil(S/8),duljina);

% prazne matrice za rekonstrukciju
Ar0=zeros(R,S,duljina);
Ar1=zeros(ceil(R/2),ceil(S/2),duljina);
Ar2=zeros(ceil(R/4),ceil(S/4),duljina);

%---------------------------------------------------
%--               ANALIZA                         --
%---------------------------------------------------

% prva razina dekompozicije
for i=1:duljina
    [img,junk] = frame2im(mov(1,i));            % pretvaranje frame u sliku
    img=rgb2gray(img);                          % pretvaranje u CB sliku
    [A1(:,:,i),H1(:,:,i),V1(:,:,i),D1(:,:,i)]=moj2dfwt(img);    % fwt
    A1(:,:,i)=A1(:,:,i)/max(max(A1(:,:,i)))*(size(map,1)-1)+1;  % skaliranje na 1-63
    M1(i)=im2frame(A1(:,:,i),map);              % vracanje u video
end;

% druga razina dekompozicije
if N>1
    for i=1:duljina
        [img,junk] = frame2im(M1(1,i));            % pretvaranje frame u sliku
        %img=rgb2gray(img);                          % pretvaranje u CB sliku
        [A2(:,:,i),H2(:,:,i),V2(:,:,i),D2(:,:,i)]=moj2dfwt(A1(:,:,i));        % fwt
        A2(:,:,i)=A2(:,:,i)/max(max(A2(:,:,i)))*(size(map,1)-1)+1;      % skaliranje na 1-63
        M2(i)=im2frame(A2(:,:,i),map);              % vracanje u video
    end;
end;

% treca razina dekompozicije
if N>2
    for i=1:duljina
        [img,junk] = frame2im(M2(1,i));            % pretvaranje frame u sliku
        %img=rgb2gray(img);                          % pretvaranje u CB sliku
        [A3(:,:,i),H3(:,:,i),V3(:,:,i),D3(:,:,i)]=moj2dfwt(A2(:,:,i));        % fwt
        A3(:,:,i)=A3(:,:,i)/max(max(A3(:,:,i)))*(size(map,1)-1)+1;      % skaliranje na 1-63
        M3(i)=im2frame(A3(:,:,i),map);              % vracanje u video
    end;
end;

% prikaz
figure,title('Original');
movie(mov)
title('Prva aproksimacija');
movie(M1)
if N>1
    title('Druga aproksimacija');
    movie(M2)
end;
if N>2
    title('Treca aproksimacija');
    movie(M3)
end;


%---------------------------------------------------
%--                REKONSTRUKCIJA                 --
%---------------------------------------------------

% iz trece razine u drugu aproksimaciju
if N>2
    for i=1:duljina
        [Ar2(:,:,i)]=moj2difwt(A3(:,:,i),H3(:,:,i),V3(:,:,i),D3(:,:,i));    % ifwt
        Ar2(:,:,i)=abs(Ar2(:,:,i)/max(max(Ar2(:,:,i)))*(size(map,1)-1))+1;  % skaliranje na 1-63
        R2(i)=im2frame(Ar2(:,:,i),map);              % vracanje u video
    end;
end;

% iz druge razine u prvu aproksimaciju
if N>1
    for i=1:duljina
        [Ar1(:,:,i)]=moj2difwt(A2(:,:,i),H2(:,:,i),V2(:,:,i),D2(:,:,i));    % ifwt
        Ar1(:,:,i)=abs(Ar1(:,:,i)/max(max(Ar1(:,:,i)))*(size(map,1)-1))+1;  % skaliranje na 1-63
        R1(i)=im2frame(Ar1(:,:,i),map);              % vracanje u video
    end;
end;

% iz prve razine u original
for i=1:duljina
    [Ar0(:,:,i)]=moj2difwt(A1(:,:,i),H1(:,:,i),V1(:,:,i),D1(:,:,i));    % ifwt
    Ar0(:,:,i)=abs(Ar0(:,:,i)/max(max(Ar0(:,:,i)))*(size(map,1)-1))+1;  % skaliranje na 1-63
    R0(i)=im2frame(Ar0(:,:,i),map);              % vracanje u video
end;


% prikaz
figure
if N>2
    title('Rekonstruirana druga aproksimacija');
    movie(R2)
end;

if N>1
    title('Rekonstruirana prva aproksimacija');
    movie(R1)
end;

title('Original');
movie(R0)
