[Master Index]
[Index for PublicToolbox/OtherTools]
aviplayer
(PublicToolbox/OtherTools/aviplayer.m in BrainStorm 2.0 (Alpha))
Function Synopsis
aviplayer(varargin)
Help Text
AVIPLAYER(VARARGIN)
This function may be called with 1 or no input arguments; either way, it launches a full-featured AVI player,
complete with "play," "pause," "forward," "reverse," "loop," "inter-frame pause," "skip-frame,"
"forward 100 frames," "back 100 frames," "beginning-of-file," and "end-of-file capabilities."
All functions were written in MATLAB, and were tested using R12.1 and R13.
If called with 1 argument, the input argument must be a valid path/filename of a valid AVI file to read and display.
E.g.,
aviplayer('C:\Sample Data\ModelLERatFluorescein\LERat1.AVI')
With no input arguments (e.g., aviplayer), the program will prompt the user for the location of the file.
While aviplayer does not require the Image Processing Toolbox, it works
faster with it. (With the IP Toolbox, it calls imshow; otherwise, it
calls image(ind2rgb(cdata,map)).
Note that there is a minor bug in TMW's aviinfo mfile (which is called by aviplayer). It
should not affect the performance of this program. Nonetheless, for convenience,
the first non-commented line of this program turns off the warning
message that you would otherwise get running this program in R13.
Written by Brett Shoelson, Ph.D.
Comments, suggestions: shoelson@helix.nih.gov
Version 1 release: 8/12/03
Cross-Reference Information
This function is called by
Listing of function C:\BrainStorm_2001\PublicToolbox\OtherTools\aviplayer.m
function aviplayer(varargin)
% AVIPLAYER(VARARGIN)
%
% This function may be called with 1 or no input arguments; either way, it launches a full-featured AVI player,
% complete with "play," "pause," "forward," "reverse," "loop," "inter-frame pause," "skip-frame,"
% "forward 100 frames," "back 100 frames," "beginning-of-file," and "end-of-file capabilities."
% All functions were written in MATLAB, and were tested using R12.1 and R13.
%
% If called with 1 argument, the input argument must be a valid path/filename of a valid AVI file to read and display.
% E.g.,
% aviplayer('C:\Sample Data\ModelLERatFluorescein\LERat1.AVI')
%
% With no input arguments (e.g., aviplayer), the program will prompt the user for the location of the file.
%
% While aviplayer does not require the Image Processing Toolbox, it works
% faster with it. (With the IP Toolbox, it calls imshow; otherwise, it
% calls image(ind2rgb(cdata,map)).
%
% Note that there is a minor bug in TMW's aviinfo mfile (which is called by aviplayer). It
% should not affect the performance of this program. Nonetheless, for convenience,
% the first non-commented line of this program turns off the warning
% message that you would otherwise get running this program in R13.
%
% Written by Brett Shoelson, Ph.D.
% Comments, suggestions: shoelson@helix.nih.gov
% Version 1 release: 8/12/03
%warning off MATLAB:mir_warning_variable_used_as_function
%Is the IP Toolbox present?
try
regionprops(ones(2));
iptb = 1;
catch
iptb = 0;
end
if nargin == 0 | nargin == 1
%Initialize
delete(findobj('tag','aviplayer'));
if nargin == 1
[pathname, filename, tmp1] = fileparts(varargin{1});
else
[filename, pathname] = uigetfile('*.avi', 'Select an AVI file.');
if ~filename
disp('No appropriate file selected.');
return
end
[tmp,tmp,tmp1] = fileparts(filename);
end
if ~strcmp(lower(tmp1),'.avi')
disp('Inappropriate file selected/requested.');
return
end
framedir = aviinfo(fullfile(pathname, filename));
playvals.imnum = 1;
playvals.playcontinue = 0;
playvals.numims = framedir.NumFrames;
playvals.increment = 1;
playvals.paused = 0;
playvals.quit = 0;
figure('units', 'normalized', 'position', [0.25 0.2 0.5 0.55], 'name', ...
['Sequence: ' fullfile(pathname, filename)], 'NumberTitle', 'off', 'color', [0 0 0], 'doublebuffer', 'on', ...
'backingstore', 'off', 'menubar', 'none', 'tag', 'aviplayer',...
'defaultaxesxtick',[],'defaultaxesytick',[],...
'closerequestfcn',...
['playvals = getappdata(gcf, ''playvals'');',...
'tmp=get(gca,''title'');',...
'tmps = get(tmp,''string'');',...
'tmpc = get(tmp,''color'');',...
'title(''Use the ''''STOP'''' button to close the figure and quit.'',''color'',''r'');',...
'for ii = 1:5;',...
'set(playvals.returnbutton,''foregroundcolor'',''r'');',...
'pause(0.25);',...
'set(playvals.returnbutton,''foregroundcolor'',''k'');',...
'pause(0.25);',...
'end;',...
'title(tmps,''color'',tmpc);']);
axes('position', [0.1 0.225 0.8 0.7], 'drawmode', 'fast');
setappdata(gcf,'playbuttonfcnhandle',@playbutton);
setappdata(gcf,'pausebuttonfcnhandle',@pausebutton);
setappdata(gcf,'forwardbuttonfcnhandle',@forwardbutton);
setappdata(gcf,'rewindbuttonfcnhandle',@rewindbutton);
setappdata(gcf,'forward100buttonfcnhandle',@forward100button);
setappdata(gcf,'rewind100buttonfcnhandle',@rewind100button);
setappdata(gcf,'restartbuttonfcnhandle',@restartbutton);
setappdata(gcf,'eofbuttonfcnhandle',@eofbutton);
setappdata(gcf,'returnbuttonfcnhandle',@returnbutton);
setappdata(gcf,'framesliderfcnhandle',@frameslider);
setappdata(gcf,'framedir',framedir);
setappdata(gcf,'iptb',iptb);
uicontrol('style','frame','units','normalized','position',[0.05 0.01 0.9 0.1925],'foregroundcolor','b','backgroundcolor',[0 0.6 0.6]);
playvals.playbutton = uicontrol('style', 'pushbutton', 'string', '4', 'units', 'normalized', 'position', [0.075 0.15 0.275 0.04], ...
'callback','feval(getappdata(gcf,''playbuttonfcnhandle''));' , ...
'fontname', 'webdings', 'fontunits', 'normalized', 'fontsize', 0.8, 'tag', 'playbutton', ...
'tooltipstring', 'Starts playback and (re)sets increment to 1.');
playvals.pausebutton = uicontrol('style', 'pushbutton', 'string', ';', 'units', 'normalized', 'position', [0.35 0.15 0.275 0.04], ...
'callback', 'feval(getappdata(gcf,''pausebuttonfcnhandle''));', ...
'fontname', 'Webdings', 'fontunits', 'normalized', 'fontsize', 0.8, ...
'tooltipstring', 'Pauses/un-pauses playback.','tag','pausebutton');
playvals.rewindbutton = uicontrol('style', 'pushbutton', 'string', '7', 'units', 'normalized', 'position', [0.15 0.11 0.2 0.04], ...
'callback', 'feval(getappdata(gcf,''rewindbuttonfcnhandle''));', ...
'fontname', 'webdings', 'fontunits', 'normalized', 'fontsize', 0.8, ...
'tooltipstring', 'Decrease playback speed. (Slows down or reverses playback by decreasing frame increment.)');
playvals.forwardbutton = uicontrol('style', 'pushbutton', 'string', '8', 'units', 'normalized', 'position', [0.35 0.11 0.2 0.04], ...
'callback', 'feval(getappdata(gcf,''forwardbuttonfcnhandle''));', ...
'fontname', 'webdings', 'fontunits', 'normalized', 'fontsize', 0.8, ...
'tooltipstring', 'Increase playback speed. (Speeds playback by skipping frames.)','interruptible','off');
playvals.forward100button = uicontrol('style', 'pushbutton', 'string', '+100', 'units', 'normalized', ...
'position', [0.55 0.11 0.075 0.04], ...
'callback', 'feval(getappdata(gcf,''forward100buttonfcnhandle''));', ...
'fontunits', 'normalized', 'fontsize', 0.6, ...
'tooltipstring', 'Jump forward 100 frames (or to end of file).');
playvals.rewind100button = uicontrol('style', 'pushbutton', 'string', '-100', 'units', 'normalized', ...
'position', [0.075 0.11 0.075 0.04], ...
'callback', 'feval(getappdata(gcf,''rewind100buttonfcnhandle''));', ...
'fontunits', 'normalized', 'fontsize', 0.6, ...
'tooltipstring', 'Jump backward 100 frames (or to beginning of file).');
playvals.restartbutton = uicontrol('style', 'pushbutton', 'string', '9', 'units', 'normalized', 'position', [0.075 0.07 0.075 0.04], ...
'callback', 'feval(getappdata(gcf,''restartbuttonfcnhandle''));', ...
'fontname', 'webdings', 'fontunits', 'normalized', 'fontsize', 0.8, ...
'tooltipstring', 'Return to first frame.','tag','restartbutton');
playvals.eofbutton = uicontrol('style', 'pushbutton', 'string', ':', 'units', 'normalized', 'position', [0.55 0.07 0.075 0.04], ...
'callback', 'feval(getappdata(gcf,''eofbuttonfcnhandle''));', ...
'fontname', 'webdings', 'fontunits', 'normalized', 'fontsize', 0.8, ...
'tooltipstring', 'Go to last frame.','tag','eofbutton');
playvals.returnbutton = uicontrol('style', 'pushbutton', 'string', '<', 'units', 'normalized', 'position', [0.15 0.07 0.4 0.04], ...
'callback', 'feval(getappdata(gcf,''returnbuttonfcnhandle''));', ...
'fontname', 'webdings', 'fontunits', 'normalized', 'fontsize', 0.8, ...
'tooltipstring', 'End playback and close AVI Player.','tag','returnbutton');
playvals.frameslider = uicontrol('style','slider','units','normalized','position',[0.075 0.02 0.55 0.04],...
'min',1,'max',playvals.numims,'value',1,'fontsize',10,'userdata',framedir,...
'callback','iptb = getappdata(gcf,''iptb'');feval(getappdata(gcf,''framesliderfcnhandle''),iptb);','sliderstep',[1/playvals.numims 10/playvals.numims]);
playvals.loop = uicontrol('style','checkbox','units','normalized','position',[0.64 0.02 0.15 0.04],...
'value',0,'fontsize',8,'string','Loop','backgroundcolor',[0 0.6 0.6],'tag','Loop');
uicontrol('style','frame','units','normalized','position',[0.64 0.07 0.29 0.12]);
playvals.pauseslider = uicontrol('style','slider','units','normalized','position',[0.66 0.11 0.25 0.0375],...
'value',0,'min',0,'max',5,...
'sliderstep',[0.1, 1/5],...
'tooltipstring','Pauses display between frames by the number of seconds represented by the slider.',...
'callback','tmp = get(gcbo,''value''); set(findobj(''tag'',''pausesecsbox''),''string'',sprintf(''%0.1f'',tmp));');
tmp=uicontrol('style','text','string',sprintf('Inter-Frame Pause (seconds)'),'units','normalized',...
'position',[0.66 0.145 0.25 0.04],...
'fontname','helvetica','fontsize',7);
uicontrol('style','text','string',0,'units','normalized','position',[0.66 0.077 0.02 0.03]);
uicontrol('style','text','string',5,'units','normalized','position',[0.88 0.077 0.02 0.03]);
playvals.pausesecsbox = uicontrol('style','text','units','normalized','position',[0.765 0.078 0.04 0.0275],...
'string',0,'tag','pausesecsbox','fontsize',8,'fontweight','b');%,'backgroundcolor',[0 0.6 0.6]
frame = aviread(framedir.Filename, 1);
if iptb
imshow(frame.cdata, frame.colormap);
else
try
image(ind2rgb(frame.cdata,frame.colormap));
catch
imagesc(frame.cdata);
end
end
if playvals.increment >= 1, signstr = '+'; else signstr = ''; end;
title(sprintf('Frame %i of %i (Increment: %s %i)',playvals.imnum, playvals.numims,signstr,playvals.increment), 'color', 'g', ...
'fontname', 'Helvetica', 'fontsize', 10);
else
playvals = varargin{1};
framedir = varargin{2};
option = varargin{3};
playvals.imnum = 1;
playvals.playcontinue = 0;
playvals.paused = 0;
playvals.quit = 0;
frame = aviread(framedir.Filename, playvals.imnum);
switch option
case 'Continue'
if iptb
imshow(frame.cdata, frame.colormap);
else
try
image(ind2rgb(frame.cdata,frame.colormap));
catch
imagesc(frame.cdata);
end
end
signstr = '+';
title(sprintf('Frame %i of %i (Increment: %s %i)',playvals.imnum, playvals.numims,signstr,playvals.increment), 'color', 'g', ...
'fontname', 'Helvetica', 'fontsize', 10);
set(playvals.frameslider,'value',playvals.imnum);
case 'Paused'
title('Press PLAY to begin','color','r');
end
end
setappdata(gcf, 'playvals', playvals);
waitforbuttonpress;
tmp = get(gco);
if strcmp(tmp.Tag, 'playbutton')
playvals = getappdata(gcf, 'playvals');
playvals.playcontinue = 1;
set(playvals.playbutton,'foregroundcolor',[0 0.7 0]);
setappdata(gcf, 'playvals', playvals);
elseif strcmp(tmp.Tag, 'returnbutton')
returnbutton;
delete(gcf);
return
elseif strcmp(tmp.Tag,'Loop')
set(gco,'value',~get(gco,'value'));
drawnow;
aviplayer(playvals,framedir,'Continue');
else
aviplayer(playvals,framedir,'Paused');
end
while playvals.playcontinue
playvals = getappdata(gcf, 'playvals');
while playvals.paused
playvals = getappdata(gcf, 'playvals');
if playvals.quit
playvals.playcontinue = 0;
playvals.paused = 0;
delete(gcf);
return
end
drawnow;
end
frame = aviread(framedir.Filename, playvals.imnum);
if iptb
imshow(frame.cdata, frame.colormap);
else
try
image(ind2rgb(frame.cdata,frame.colormap));
catch
imagesc(frame.cdata);
end
end
if playvals.increment >= 1, signstr = '+'; else signstr = ''; end;
title(sprintf('Frame %i of %i (Increment: %s %i)',playvals.imnum, playvals.numims,signstr,playvals.increment), 'color', 'g', ...
'fontname', 'Helvetica', 'fontsize', 10);
set(playvals.frameslider, 'value', playvals.imnum);
if playvals.increment > 0
if playvals.imnum == playvals.numims
if get(playvals.loop,'value')==1;
playvals.imnum=1;
pauselength = get(playvals.pauseslider,'value');
pause(pauselength);
frame = aviread(framedir.Filename, playvals.imnum);
if iptb
imshow(frame.cdata, frame.colormap);
else
try
image(ind2rgb(frame.cdata,frame.colormap));
catch
imagesc(frame.cdata);
end
end
if playvals.increment >= 1, signstr = '+'; else signstr = ''; end;
title(sprintf('Frame %i of %i (Increment: %s %i)',playvals.imnum, playvals.numims,signstr,playvals.increment), 'color', 'g', ...
'fontname', 'Helvetica', 'fontsize', 10);
set(playvals.frameslider, 'value', playvals.imnum);
else
playvals.playcontinue = 0;
aviplayer(playvals,framedir,'Paused');
end
end
playvals.imnum = min(playvals.imnum + playvals.increment, playvals.numims);
elseif playvals.increment < 0
if playvals.imnum == 1
if get(playvals.loop,'value')==1;
playvals.imnum = playvals.numims;
pauselength = get(playvals.pauseslider,'value');
pause(pauselength);
frame = aviread(framedir.Filename, playvals.imnum);
if iptb
imshow(frame.cdata, frame.colormap);
else
try
image(ind2rgb(frame.cdata,frame.colormap));
catch
imagesc(frame.cdata);
end
end
if playvals.increment >= 1, signstr = '+'; else signstr = ''; end;
title(sprintf('Frame %i of %i (Increment: %s %i)',playvals.imnum, playvals.numims,signstr,playvals.increment), 'color', 'g', ...
'fontname', 'Helvetica', 'fontsize', 10);
set(playvals.frameslider, 'value', playvals.imnum);
else
playvals.increment = 1;
playvals.playcontinue = 0;
aviplayer(playvals,framedir,'Paused');
end
end
playvals.imnum = max(playvals.imnum + playvals.increment, 1);
end
if ~isempty(findobj('tag','aviplayer'))
setappdata(gcf, 'playvals', playvals);
pauselength = get(playvals.pauseslider,'value');
%pause(pauselength);
for ii = 0.1:0.1:pauselength %This loop allows faster keypress-caused escape than, say, pause(5)
pause(0.1);
end
drawnow; %This is necessary for the case of pauselength == 0
else
return
end
if playvals.quit
playvals.playcontinue = 0;
playvals.paused = 0;
delete(gcf);
return
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SUBFUNCTIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function playbutton
playvals = getappdata(gcf, 'playvals');
if ~playvals.paused,
playvals.playcontinue = 1;
set(playvals.playbutton,'foregroundcolor',[0 0.7 0]);
setappdata(gcf, 'playvals', playvals);
end
return
function pausebutton
playvals = getappdata(gcf, 'playvals');
playvals.paused = ~playvals.paused;
if playvals.paused
set(playvals.pausebutton, 'foregroundcolor', 'r');
title('Press PAUSE to resume...', 'color', 'r');
set(playvals.playbutton, 'foregroundcolor','k');
else
if playvals.increment >= 1, signstr = '+'; else signstr = ''; end;
title(sprintf('Frame %i of %i (Increment: %s %i)',playvals.imnum, playvals.numims,signstr,playvals.increment), 'color', 'g', ...
'fontname', 'Helvetica', 'fontsize', 10);
set(playvals.pausebutton, 'foregroundcolor', 'k');
set(playvals.playbutton,'foregroundcolor',[0 0.7 0]);
end
setappdata(gcf, 'playvals', playvals);
return
function forwardbutton
playvals = getappdata(gcf, 'playvals');
if ~playvals.paused
playvals.increment = playvals.increment + 1;
if playvals.increment == 0; playvals.increment = 1; end
setappdata(gcf,'playvals',playvals);
end
return
function rewindbutton
playvals = getappdata(gcf, 'playvals');
if ~playvals.paused
playvals.increment = playvals.increment - 1;
if playvals.increment == 0; playvals.increment = -1; end
setappdata(gcf, 'playvals', playvals);
end
return
function forward100button
playvals = getappdata(gcf, 'playvals');
if ~playvals.paused
playvals.imnum = min(playvals.imnum+100, playvals.numims);
setappdata(gcf, 'playvals', playvals);
end
return
function rewind100button
playvals = getappdata(gcf, 'playvals');
if ~playvals.paused
playvals.imnum = max(playvals.imnum-100, 1);
setappdata(gcf, 'playvals', playvals);
end
return
function restartbutton
playvals = getappdata(gcf, 'playvals');
if ~playvals.paused
playvals.imnum = 1;
setappdata(gcf, 'playvals', playvals);
end
return
function eofbutton
playvals = getappdata(gcf, 'playvals');
if ~playvals.paused
playvals.imnum = playvals.numims;
setappdata(gcf, 'playvals', playvals);
end
return
function returnbutton
playvals = getappdata(gcf, 'playvals');
playvals.playcontinue = 0;
playvals.quit = 1;
setappdata(gcf, 'playvals', playvals);
return
function frameslider(iptb)
playvals = getappdata(gcf, 'playvals');
framedir = get(gco,'userdata');
playvals.imnum = floor(get(playvals.frameslider,'value'));
frame = aviread(framedir.Filename, playvals.imnum);
if iptb
imshow(frame.cdata, frame.colormap);
else
try
image(ind2rgb(frame.cdata,frame.colormap));
catch
imagesc(frame.cdata);
end
end
if playvals.increment >= 1, signstr = '+'; else signstr = ''; end;
title(sprintf('Frame %i of %i (Increment: %s %i)',playvals.imnum, playvals.numims,signstr,playvals.increment), 'color', 'g', ...
'fontname', 'Helvetica', 'fontsize', 10);
setappdata(gcf, 'playvals', playvals);
return
Produced by color_mat2html, a customized BrainStorm 2.0 (Alpha) version of mat2html on Tue Oct 12 12:05:14 2004
Cross-Directory links are: ON