% AVI2INR convert a AVI file movie to INRimage format
% avi2inr(filename, fps_mult, last_input_frame) opens filename.avi and
% creates a filename.inr file. fps_mult indicates how many (linearly
% interpolated) output frames will be created from each input frame.
% last_input_frame indicates now many input frames will be read (and
% saved). The outut video will contain aproximately
% fps_mult * last_input_frame frames.
% avi2inr(filename, fps_mult, last_input_frame, convert_gray) specifies
% whether the frames must be converted to grayscale before saved.
% Parameters fps_mult, last_input_frame and convert_gray are optional.
% In Linux Matlab may requiere the installation of packages:
% - gstreamer0.10-plugins-good and gstreamer0.10-tools
% to open .avi files.
% Some old versions of Matlab may also require that
% /usr/local/MATLAB/MATLAB_Production_Server/R2013a/sys/os/glnxa64/libstdc++.so.6 link
% is changed to point to system libstdc++.so.6 as well
% Example to create movie.inr from movie.avi with same frame rate and approx. length:
% avi2inr('movie',1,Inf)
%
% See also INRWRITE, INRVIDEOWRITE.
% Copyright (C) 2016 by Richard R. Carrillo
% $Revision: 1.0 $ $Date: 26/9/2016 $
% This program is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 3 of the License, or
% (at your option) any later version.
function avi2inr(filename, fps_mult, last_input_frame, convert_gray)
% Set default values
if nargin<4
convert_gray=false;
end
if nargin<3
last_input_frame=Inf;
end
if nargin<2
fps_mult=1;
end
vid_in = VideoReader([filename '.avi']); % Open input video file
vid_out=inrvideowrite([filename '.inr']); % Create output video file
ant_frame=read(vid_in,1);
pixel_data_type=class(ant_frame); % Save the original pixel data type
if convert_gray
ant_frame=mean(ant_frame,3); % Average reg, green and blue channels
end
num_frames = vid_in.NumberOfFrames;
if num_frames>0
% Always save the first frame
int_frame=cast(ant_frame, pixel_data_type); % Recover original pixel data type
vid_out.add_frame(int_frame); % Add frame to output file
% Get and save sucessive frames
input_frame_index = 2;
while input_frame_index <= num_frames && input_frame_index <= last_input_frame
cur_frame = read(vid_in,input_frame_index); % Load next frame form input
if convert_gray
cur_frame=mean(cur_frame,3);
end
for frame_subindex=1:fps_mult
% Interpolate using previous and current frame
v(1,:,:,:)=ant_frame;
v(2,:,:,:)=cur_frame;
int_frame=interp1([0 fps_mult], double(v), frame_subindex);
% place dimenion create for interp1 (first one) at the end to
% that it can be ignored
int_frame=permute(int_frame, [2 3 4 1]);
int_frame=cast(int_frame, pixel_data_type); % Recover original pixel data type
% In Matlab image matrices encode Y pixel coordinates in the
% first dimension and color channel in the third dimension.
% add_frame makes the corresponding permutations to obtain INR
% frames from this Matlab encoding
vid_out.add_frame(int_frame); % Add frame to output file
end
ant_frame=cur_frame;
input_frame_index = input_frame_index + 1;
end
end
delete(vid_out); % Update output file content and close