📄 mplay.m
字号:
% not in reverse ... decrement
if ud.currframe <= stepsize,
ud.fbrev=1; % hit reverse playback
ud.currframe = stepsize+1; % so next subtraction brings us to frame 1
end
ud.currframe = ud.currframe-stepsize;
end
else
% Not fwd/back mode
ud.currframe = ud.currframe - stepsize;
% Check for backwards wraparound
if ud.currframe < 1,
if ~ud.loopmode,
if ud.currframe == 1-stepsize,
return
end
ud.currframe = 1;
else
ud.currframe = ud.currframe+ud.numFrames;
end
end
end
% Store for next time:
ud.nextframe = ud.currframe;
upd = ~ud.paused;
ud.paused = 1; % assume we're starting from pause
set(hfig,'userdata',ud);
ShowMovieFrame(hfig);
if upd, UpdateGUIControls(hfig); end
% --------------------------------------------------------
function cb_play(hbutton, eventStruct, hfig)
% Play button callback
if nargin<3, hfig = gcbf; end
ud = get(hfig,'userdata');
icons = get_icons_from_fig(hfig);
hPlay = findobj(ud.htoolbar, 'tag','Play/Pause');
% Check if timer is already running
if strcmp(get(ud.htimer,'Running'),'on'),
% Movie already playing
% - Move to Pause mode
% - Show Play icon (currently must be pause indicator)
% Stop timer, set pause mode
ud.paused = 1;
set(hfig,'userdata',ud);
stop(ud.htimer);
% Flush changes
ShowMovieFrame(hfig);
%UpdateFrameReadout(ud);
% Set play icon, darker
set(hPlay, ...
'tooltip', 'Resume', ...
'cdata', icons.play_off);
else
% Not running
if ud.paused,
% Paused - move to play
ud.nextframe = ud.currframe;
else
% Stopped - move to play
ud.nextframe = 1; % Start from 1st frame when stopped
ud.fbrev = 0; % Reset fwd/bkwd state to fwd
end
set(hfig,'userdata',ud);
% Show pause icon
set(hPlay, ...
'tooltip', 'Pause', ...
'cdata', icons.pause_default);
start(ud.htimer);
end
UpdateGUIControls(hfig);
% --------------------------------------------------------
function cb_stop(hbutton, eventStruct, hfig)
% Stop button callback
if nargin<3, hfig = gcbf; end
ud = get(hfig,'userdata');
ud.paused = 0; % we're stopped, not paused
set(hfig,'userdata',ud);
isRunning = strcmp(get(ud.htimer,'Running'),'on');
if isRunning,
stop(ud.htimer);
else
% Allow stop even when movie not running
% We could have been paused
do_timer_stop(hfig);
end
% --------------------------------------------------------
function cb_step_back(hbutton, eventStruct, hfig)
% Step one frame backward callback
if nargin<3, hfig = gcbf; end
ud = get(hfig,'userdata');
if ud.fbmode,
% fwd/back playback mode
if ud.fbrev,
% in reverse ... increment
if ud.currframe == ud.numFrames-1,
% will hit last frame ... go to normal playback
ud.fbrev=0; % normal playback
end
ud.currframe = ud.currframe+1;
else
% not in reverse ... decrement
if ud.currframe == 1,
% fwd/back hit when frame 2 displayed
% move to frame 1 in non-reverse mode, then go to reverse
% mode
ud.fbrev=1; % enter reverse playback
ud.currframe = 2;
else
ud.currframe = ud.currframe-1;
end
end
else
% Not fwd/back mode
if ud.currframe <= 1,
if ~ud.loopmode,
return
end
ud.currframe = ud.numFrames;
else
ud.currframe = ud.currframe-1;
end
end
ud.nextframe = ud.currframe;
upd = ~ud.paused;
ud.paused = 1; % assume we're starting from pause
set(hfig,'userdata',ud);
ShowMovieFrame(hfig);
if upd, UpdateGUIControls(hfig); end
% --------------------------------------------------------
function cb_step_fwd(hbutton, eventStruct, hfig)
% Step one frame forward callback
% If in fwdbk mode,
% Ignore looping mode
% We always go from fwd to bkwd when step_fwd pressed at last frame
% When we're at frame 1, we must continue to frame 2 regardless of the
% looping setting since we don't know "how" we got there
if nargin<3, hfig = gcbf; end
ud = get(hfig,'userdata');
if ud.fbmode,
% fwd/back playback mode
if ~ud.fbrev,
% not in reverse ... increment fwd
if ud.currframe >= ud.numFrames,
% hit last frame ... go to reverse
ud.currframe = ud.currframe-1;
ud.fbrev=1; % reverse playback
else
ud.currframe = ud.currframe+1;
end
else
% in reverse ... decrement
if ud.currframe == 2,
% fwd/back hit when frame 2 displayed
% move to frame 1 in reverse mode
ud.fbrev=0; % no more reverse playback
end
ud.currframe = ud.currframe-1;
end
else
% Not fwd/back mode
if ud.currframe >= ud.numFrames,
if ~ud.loopmode,
return
end
ud.currframe = 1;
else
ud.currframe = ud.currframe+1;
end
end
ud.nextframe = ud.currframe;
upd = ~ud.paused;
ud.paused = 1; % assume we're starting from pause
set(hfig,'userdata',ud);
ShowMovieFrame(hfig);
if upd, UpdateGUIControls(hfig); end
% --------------------------------------------------------
function cb_ffwd(hbutton, eventStruct, hfig)
% Fast forward button callback
if nargin<3, hfig = gcbf; end
ud = get(hfig,'userdata');
stepsize = 10;
if ud.fbmode,
% In fwd/rev playback mode
if ~ud.fbrev,
% not in reverse ... increment fwd
if ud.currframe >= ud.numFrames-stepsize,
% hit last frame ... go to reverse
ud.currframe = ud.numFrames;
ud.fbrev=1; % reverse playback
else
ud.currframe = ud.currframe+stepsize;
end
else
% in reverse mode
if ud.currframe <= stepsize,
ud.fbrev=0; % no more reverse playback
ud.currframe = stepsize+1; % so next subtraction brings us to frame 1
end
ud.currframe = ud.currframe-stepsize;
end
else
% Not in fwd/rev playback mode
ud.currframe = ud.currframe + stepsize;
if ud.currframe > ud.numFrames,
if ~ud.loopmode,
if ud.currframe == ud.numFrames+stepsize,
return
end
ud.currframe = ud.numFrames;
else
ud.currframe = ud.currframe-ud.numFrames;
end
end
end
ud.nextframe = ud.currframe;
upd = ~ud.paused;
ud.paused = 1; % assume we're starting from pause
set(hfig,'userdata',ud);
ShowMovieFrame(hfig);
if upd, UpdateGUIControls(hfig); end
% --------------------------------------------------------
function cb_goto_end(hbutton, eventStruct, hfig)
% Goto end button callback
%
% NOTE: For fwd/bkwd mode, goes to last frame as usual,
% and enters bkwd playback. No special code needed.
if nargin<3, hfig = gcbf; end
ud = get(hfig,'userdata');
if ud.currframe ~= ud.numFrames,
ud.currframe = ud.numFrames;
ud.nextframe = ud.currframe;
set(hfig,'userdata',ud);
ShowMovieFrame(hfig);
end
% --------------------------------------------------------
function cb_loop(hbutton, eventStruct, hfig)
% Loop button callback
% Store loopmode state
if nargin<3, hfig = gcbf; end
ud = get(hfig,'userdata');
ud.loopmode = ~ud.loopmode;
set(hfig,'userdata',ud);
ReactToStoredLoopMode(hfig);
% --------------------------------------------------------
function cb_fbmode(hbutton, eventStruct, hfig)
% Fwd/Bkwd playback button callback
% Store state
if nargin<3, hfig = gcbf; end
ud = get(hfig,'userdata');
ud.fbmode = ~ud.fbmode;
ud.fbrev = 0; % Reset direction when fb status changes
set(hfig,'userdata',ud);
ReactToStoredFBMode(hfig);
% --------------------------------------------------------
function cb_truesize(hco, eventStruct, hfig)
if nargin<3, hfig=gcbf; end
SetupMovieFrame(hfig);
% --------------------------------------------------------
function ReactToStoredLoopMode(hfig)
icons = get_icons_from_fig(hfig);
ud = get(hfig,'userdata');
if ud.loopmode,
icon = icons.loop_on;
tip = 'Repeat: On';
else
icon = icons.loop_off;
tip = 'Repeat: Off';
endhLoopButton = findobj(hfig,'tag','loopbutton');
set(hLoopButton,'cdata',icon,'tooltip',tip);
% --------------------------------------------------------
function ReactToStoredFBMode(hfig)
% Update button icon/tip
icons = get_icons_from_fig(hfig);
ud = get(hfig,'userdata');
if ud.fbmode,
icon = icons.fwdbk_play_on;
tip = 'Forward/backward playback';
else
icon = icons.fwdbk_play_off;
tip = 'Normal playback';
end
hFBButton = findobj(hfig,'tag','fbbutton');
set(hFBButton,'cdata',icon,'tooltip',tip);
% Update frame readout and tooltip
UpdateFrameReadout(ud);
UpdateFrameReadoutTooltip(ud);
% --------------------------------------------------------
function [r,c,f] = MovieSizeInfo(A, fmt)
% Determine rows, columns, and frames for each movie format
% 'S' Standard Movie structure
% 'I' MxNxF
% 'RGB' MxNx3xF
switch fmt
case 'I'
r=size(A,1);
c=size(A,2);
f=size(A,3);
case 'RGB'
r=size(A,1);
c=size(A,2);
f=size(A,4);
case 'S'
r=size(A(1).cdata,1);
c=size(A(1).cdata,2);
f=length(A);
end
% --------------------------------------------------------
function LoadMovie(hfig, A, fmt, varname, fps)
% Store basic movie info:
%
ud = get(hfig,'userdata');
ud.MovieFormat = fmt;
ud.Movie = A;
ud.fps = fps;
ud.varName = varname;
[r,c,f] = MovieSizeInfo(A,fmt);
ud.frameRows = r;
ud.frameCols = c;
ud.numFrames = f;
ud.currframe = 1;
ud.nextframe = 1;
% Store data, set name in figure title
set(hfig, ...
'userdata', ud, ...
'name', sprintf('Movie Player: %s', ud.varName));
% Update viewer
%
set(hfig,'name', sprintf('Movie Player: %s', ud.varName));
SetupUpdateFunction(hfig); % Select playback function
SetupMovieFrame(hfig); % Shrink figure to movie size
SetupTimer(hfig); % Updates FPS status readout via SetFPS
ShowMovieFrame(hfig); % Updates frame counter status readout
UpdateFrameSizeReadout(hfig); % Updates frame size readout
ReactToStoredLoopMode(hfig); % Initial update of button icon
ReactToStoredFBMode(hfig); % Initial update of button icon
% --------------------------------------------------------
function SetupMovieFrame(hfig)
% Sets up frame sizes, window sizes, etc
% Leaves existing image in display
ud = get(hfig,'userdata');
rows=ud.frameRows;
cols=ud.frameCols;
% Adjust image limits and axis limits appropriately
set(ud.himage,'xdata', 1:cols, 'ydata', 1:rows);
% Do a "truesize" like operation
set(ud.haxis, ...
'xlim',[1 cols], ...
'ylim',[1 rows], ...
'units','pix', ...
'pos',[1 1 cols rows]);
% Set figure to be an exact fit around the axis
set(ud.hfig,'units','pix');
figpos = get(ud.hfig,'pos');
newpos = [figpos(1:2) cols rows];
set(ud.hfig,'pos',newpos);
set(ud.haxis,'units','norm'); % allow stretching again
% --------------------------------------------------------
function ShowMovieFrame(hfig, fast)
% Update video image
ud = get(hfig,'userdata');
feval(ud.UpdateImageFcn, ud);
% Update frame counter
if (nargin > 1) && fast,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -