[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

    dataplot_cb                        C:\BrainStorm_2001\Toolbox\dataplot_cb.m

### 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 Nov 2 16:17:59 2004
Cross-Directory links are: ON