function [ frame_out ] = decode_B_frame( frame_encoded, ref_past, ref_future, B_size, MB_size, Q, u_p, v_p, u_f, v_f )

[Y_ref_p, chroma_ref_p] = RGB_to_YCbCr(ref_past);
[Y_ref_f, chroma_ref_f] = RGB_to_YCbCr(ref_future);

enc_luma = frame_encoded.encoded_luma;
enc_chroma = frame_encoded.encoded_chroma;

Nmb = size(enc_luma)/MB_size;

Y_mb = mat2cell(enc_luma, repmat(MB_size,1,Nmb(1)), repmat(MB_size,1,Nmb(2)));
Y_decoded = cell(size(Y_mb));

chroma_mb = mat2cell(enc_chroma, repmat(MB_size/2,1,Nmb(1)), repmat(MB_size/2,1,Nmb(2)),2);
chroma_decoded = cell(size(chroma_mb));

for m = 1 : Nmb(1)
    for n = 1 : Nmb(2)
        Y_inv_q = inverse_quantize( Y_mb{m,n}, MB_size, B_size, Q );
        chroma_inv_q = inverse_quantize( chroma_mb{m,n}, MB_size, B_size, Q );
        
        
        Y_decoded{m,n} = 0.5*motion_compensation( Y_inv_q, Y_ref_p, u_p(m,n), v_p(m,n), m, n  )+...
                         0.5*motion_compensation( Y_inv_q, Y_ref_f, u_f(m,n), v_f(m,n), m, n  );
        chroma_decoded{m,n} = 0.5*motion_compensation( chroma_inv_q, chroma_ref_p, u_p(m,n), v_p(m,n), m, n  )+...
                              0.5*motion_compensation( chroma_inv_q, chroma_ref_f, u_f(m,n), v_f(m,n), m, n  );
        
    end
end

Y_decoded = cell2mat(Y_decoded);
chroma_decoded = cell2mat(chroma_decoded);

frame_out = YCbCr_to_RGB( Y_decoded, chroma_decoded );


end

