'From Squeak3.8 of ''5 May 2005'' [latest update: #6665] on 26 February 2006 at 1:16:22 pm'!
!MPEGDisplayMorph methodsFor: 'accessing' stamp: 'JMM 1/20/2006 23:15'!
isThereAFile
mpegFile isBufferBased ifTrue: [^true].
^(FileStream isAFileNamed: mpegFile fileName)! !
!MPEGDisplayMorph methodsFor: 'accessing' stamp: 'JMM 1/20/2006 23:15'!
moviePosition
"Answer a number between 0.0 and 1.0 indicating the current position within the movie."
mpegFile ifNil: [^ 0.0].
mpegFile fileHandle ifNil: [^ 0.0].
self isThereAFile ifFalse: [^0.0].
mpegFile hasVideo
ifTrue: [^ ((mpegFile videoGetFrame: 0) asFloat / (mpegFile videoFrames: 0)) min: 1.0].
soundTrack ifNotNil: [^ soundTrack soundPosition].
^ 0.0
! !
!MPEGDisplayMorph methodsFor: 'accessing' stamp: 'JMM 1/20/2006 23:16'!
totalFrames
"Answer the total number of frames in this movie."
mpegFile ifNil: [^ 0].
mpegFile fileHandle ifNil: [^ 0].
self isThereAFile ifFalse: [^ 0].
mpegFile hasVideo ifFalse: [^ 0].
^ mpegFile videoFrames: 0! !
!MPEGDisplayMorph methodsFor: 'accessing' stamp: 'JMM 1/20/2006 23:16'!
totalSeconds
"Answer the total number of seconds in this movie."
mpegFile ifNil: [^ 0].
mpegFile fileHandle ifNil: [^ 0].
self isThereAFile ifFalse: [^ 0].
mpegFile hasVideo ifFalse: [^ 0].
^ self totalFrames asFloat / (mpegFile videoFrameRate: 0)! !
!MPEGDisplayMorph methodsFor: 'commands' stamp: 'JMM 1/20/2006 23:09'!
startPlaying
"Start playing the movie at the current position."
| frameIndex |
self stopPlaying.
stopFrame := nil.
self mpegFileIsOpen ifFalse: [^ self].
(mpegFile fileName notNil) ifTrue:
[(FileStream isAFileNamed: mpegFile fileName) ifFalse: [ | newFileResult newFileName |
self inform: 'Path changed. Enter new one for: ', (FileDirectory localNameFor: mpegFile fileName).
newFileResult := StandardFileMenu oldFile.
newFileName := newFileResult directory fullNameFor: newFileResult name.
mpegFile openFile: newFileName]].
mpegFile hasAudio
ifTrue:
[mpegFile hasVideo ifTrue:
["set movie frame position from soundTrack position"
soundTrack reset. "ensure file is open before positioning"
soundTrack soundPosition: (mpegFile videoGetFrame: 0) asFloat / (mpegFile videoFrames: 0).
"now set frame index from the soundtrack position for best sync"
frameIndex := ((soundTrack millisecondsSinceStart * desiredFrameRate) // 1000).
frameIndex := (frameIndex max: 0) min: ((mpegFile videoFrames: 0) - 3).
mpegFile videoSetFrame: frameIndex stream: 0].
SoundPlayer stopReverb.
soundTrack volume: volume.
soundTrack repeat: repeat.
soundTrack resumePlaying.
startFrame := startMSecs := 0]
ifFalse:
[soundTrack := nil.
startFrame := mpegFile videoGetFrame: 0.
startMSecs := Time millisecondClockValue].
running := true! !
!MPEGDisplayMorph methodsFor: 'file open/close' stamp: 'JMM 1/20/2006 23:02'!
openFileNamed: mpegFileName
"Try to open the MPEG file with the given name. Answer true if successful."
| e |
self closeFile.
(FileDirectory default fileExists: mpegFileName)
ifFalse: [self inform: ('File not found: {1}' translated format: {mpegFileName}). ^ false].
(MPEGFile isFileValidMPEG: mpegFileName)
ifTrue: [mpegFile := MPEGFile openFileUseBuffer: mpegFileName]
ifFalse: [
(JPEGMovieFile isJPEGMovieFile: mpegFileName)
ifTrue: [mpegFile := JPEGMovieFile new openFileNamed: mpegFileName]
ifFalse: [self inform: ('Not an MPEG or JPEG movie file: {1}' translated format: {mpegFileName}). ^ false]].
mpegFile fileHandle ifNil: [^ false].
"initialize soundTrack"
mpegFile hasAudio
ifTrue: [soundTrack := mpegFile audioPlayerForChannel: 1]
ifFalse: [soundTrack := nil].
mpegFile hasVideo
ifTrue: [ "set screen size and display first frame"
desiredFrameRate := mpegFile videoFrameRate: 0.
soundTrack ifNotNil: [ "compute frame rate from length of audio track"
desiredFrameRate := (mpegFile videoFrames: 0) / soundTrack duration].
e := (mpegFile videoFrameWidth: 0)@(mpegFile videoFrameHeight: 0).
frameBuffer := Form extent: e depth: (Display depth max: 16).
super extent: e.
self nextFrame]
ifFalse: [ "hide screen for audio-only files"
super extent: 250@0].
! !
|