function psnrY = psnr_frame(filename_in, filename_ref, w, h, nframes)
%psnr - Le arquivos de video no formato yuv 4:2:0 (raw) e calcula a media da PSNR para os quadros.
%   function psnrY = psnr(filename_in, filename_ref, w, h, nframes)
%
%   psnr(filename_in,w,h) le um frame do arquivo filename_in, de tamanho w
%   x h, e um numero de quadros de nframes
% 
%    Edson Mintsu Hung
%    mintsu@gmail.com

%Numero de Parametros = 5.
if (nargin ~= 5)
    disp('Numero de argumentos incorreto.')
    disp('A funcao psnr precisa de 5 argumentos.')
    return
end


%Corpo da funcao.
%Abre o arquivo.
arquivo_in = fopen(filename_in,'r');
arquivo_ref = fopen(filename_ref,'r');

nBits = 8;
psnrY = zeros(1,nframes);
%Monta os frames de Luminancia.
    for n = 1:nframes
        % 4:0:0
%             fseek(arquivo_in,w*h*(n-1),'bof');
%             fseek(arquivo_ref,w*h*(n-1),'bof');
        % 4:2:0
            fseek(arquivo_in,1.5*w*h*(n-1),'bof');
            fseek(arquivo_ref,1.5*w*h*(n-1),'bof');
            img_in = fread(arquivo_in,h*w,'uint8=>double');
            img_ref = fread(arquivo_ref,h*w,'uint8=>double');
            psnrY(n) = 10 * log10 ( (2^nBits - 1)^2 / ((1/(w*h)) * sum((img_in - img_ref).^2)));
    end
% psnrY = sum_psnr/nframes;
fclose all;

