/usr/share/psychtoolbox-3/PsychDemos/MovieDemos/PlayInterlacedMovieDemo.m is in psychtoolbox-3-common 3.0.11.20131230.dfsg1-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | function PlayInterlacedMovieDemo(moviename)
%
% PlayInterlacedMovieDemo(moviename)
%
% A simple demo to show playback of interlaced movies. Input
% images from the movie are deinterlaced on-the-fly by use of a simple GLSL
% deinterlace shader.
%
% The demo reads a movie file from the file 'moviename' and plays it once,
% then exits.
%
% Should work with NVidia GeforceFX 5200 or ATI Radeon 9600 and later, or
% Intel GMA 950.
% History:
% 10/30/05 mk Wrote it.
% 06/17/13 mk Cleaned up.
if nargin < 1
error('Moviename missing! You need to provide the filename of a movie file.');
end;
% Switch KbName into unified mode: It will use the names of the OS-X
% platform on all platforms in order to make this script portable:
KbName('UnifyKeyNames');
esc=KbName('ESCAPE');
space=KbName('space');
try
% Child protection
AssertOpenGL;
% Open onscreen window with black background:
screen=max(Screen('Screens'));
win = Screen('OpenWindow', screen, 0);
% Load deinterlacing-shader: This will abort our script if the graphics
% hardware doesn't support GLSL or fragment shaders.
deinterlacer = LoadGLSLProgramFromFiles('EXPDeinterlaceShaderLineDouble',1);
% Bind and initialize deinterlacer:
glUseProgram(deinterlacer);
% Input image will be bound to texture unit zero:
glUniform1i(glGetUniformLocation(deinterlacer, 'Image1'), 0);
% Get handle for the field selection parameter:
useoddfield=glGetUniformLocation(deinterlacer, 'UseOddField');
% Initial display and sync to retrace:
Screen('Flip',win);
iteration=0;
abortit=0;
switchfielddisplayorder=0;
% Endless loop, runs until ESC key pressed.
while ~abortit
iteration=iteration + 1;
% Open movie file and retrieve basic info about movie:
[movie movieduration fps imgw imgh] = Screen('OpenMovie', win, moviename);
fprintf('Movie: %s : %f seconds duration, %f fps, w x h = %i x %i...\n', moviename, movieduration, fps, imgw, imgh);
i=0;
% Start playback of movie. This will start
% the realtime playback clock and playback of audio tracks, if any.
% Play 'movie', at a playbackrate = 1, without looping = 0 and
% 1.0 == 100% audio volume.
Screen('PlayMovie', movie, 1, 0, 1.0);
% Infinite playback loop: Fetch video frames and display them...
while 1
i=i+1;
% Return next frame in movie, in sync with current playback
% time and sound.
% tex is either the texture handle or zero if no new frame is
% ready yet, or -1 if the movie finished playback.
% pts = Presentation timestamp in seconds.
tex = Screen('GetMovieImage', win, movie, 1);
% Valid texture returned?
if tex<=0
% Movie has reached its end. Exit our playback loop.
break;
end
% Select even half-field (the even rows) in the interlaced
% texture: One can switch the order of drawing by toggling
% switchfielddisplayorder between 0 and 1 via press of the
% space key.
glUseProgram(deinterlacer);
glUniform1f(useoddfield, switchfielddisplayorder);
% Draw the new texture immediately to screen, appying the
% deinterlacer. You need to disable bilinear filtering via the
% 0 - flag, because the deinterlacer doesn't work yet with
% anything else than nearest neighbour filtering:
Screen('DrawTexture', win, tex, [], [], [], 0, [], [], deinterlacer);
% Update display at next monitor retrace:
Screen('Flip', win);
% Select odd half-field (the odd rows) in the interlaced
% texture:
glUseProgram(deinterlacer);
glUniform1f(useoddfield, 1-switchfielddisplayorder);
% Draw the new texture immediately to screen:
Screen('DrawTexture', win, tex, [], [], [], 0, [], [], deinterlacer);
% Update display:
Screen('Flip', win);
% Release texture:
Screen('Close', tex);
% Check for abortion:
abortit=0;
[keyIsDown,secs,keyCode]=KbCheck; %#ok<ASGLU>
if (keyIsDown==1 && keyCode(esc))
% Set the abort-demo flag.
abortit=1;
break;
end
if (keyIsDown==1 && keyCode(space))
% Toggle display order of even and odd fields:
switchfielddisplayorder = 1 - switchfielddisplayorder %#ok<NOPRT>
KbReleaseWait;
end
end
Screen('Flip', win);
% Done. Stop playback:
Screen('PlayMovie', movie, 0);
% Close movie object:
Screen('CloseMovie', movie);
% ...and repeat...
end
% Close screens.
Screen('CloseAll');
% Done.
return;
catch %#ok<CTCH>
% Error handling: Close all windows and movies, release all ressources.
Screen('CloseAll');
end
|