home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-09-29 | 5.0 KB | 178 lines | [TEXT/KAHL] |
- #include <assert.h>
- #include <ctype.h>
- #include <math.h>
- #include <stdlib.h>
- #include <string.h>
-
- #include <Windows.h>
- #include <QDOffscreen.h>
- #include <Memory.h>
- #include <Fonts.h>
- #include <Packages.h>
- #include <SegLoad.h>
- #include <ToolUtils.h>
- #include <TextEdit.h>
-
- #include <Movies.h>
-
- #include "general.h"
- #include "port.h"
- #include "gworld.h"
- #include "recorder.h"
-
- recorder::recorder( char *filename,
- gworld *theWorld, // defines size of movie
- long framerate,
- long compressiontype,
- int keyframedistance, // 0 implies no frame differencing
- long compressionquality, // 0x100 thru 0x300 allowed
- long temporalquality)
- {
- myworld = theWorld;
- myframerate = framerate;
- mycompressiontype = compressiontype;
- mykeyframedistance = keyframedistance;
- mycompressionquality = compressionquality;
- mytemporalquality = temporalquality;
-
- theWorld->get_rect( &movieFrame);
- theWorld->get_pixH( &thepix);
-
- const int movieWidth = movieFrame.right - movieFrame.left;
- const int movieHeight = movieFrame.bottom - movieFrame.top;
-
- movieDepth = theWorld->diepte();
-
- sequence_running = false;
-
- const short default_volume = 0;
-
- #ifdef applec
- c2pstr( filename);
- #else
- CtoPstr( filename);
- #endif
-
- OSErr error = FSMakeFSSpec( default_volume, 0, (ConstStr255Param)filename, &myFSSpec);
- CheckForError( !((error == fnfErr) || (error == noErr)), "FSMakeFSSpec");
-
- error = CreateMovieFile( &myFSSpec, 'TVOD', 0,
- createMovieFileDeleteCurFile, &myResFileNo, &myMovie);
- CheckForError( error, "CreateMovieFile");
-
- myTrack = NewMovieTrack( myMovie, movieWidth << 16, movieHeight << 16, 0);
- CheckForError( GetMoviesError(), "NewMovieTrack");
-
- myMedia = NewTrackMedia( myTrack, VideoMediaType, myframerate, nil, (OSType) nil);
- CheckForError( GetMoviesError(), "NewTrackMedia");
-
- error = BeginMediaEdits( myMedia);
- CheckForError( GetMoviesError(), "BeginMediaEdits");
-
- myImageDescriptionHandle = (ImageDescriptionHandle)NewHandle( 4);
-
- CheckForError( (myImageDescriptionHandle == 0), "NewHandle( 4)");
-
- error = GetMaxCompressionSize( &thepix, &movieFrame, movieDepth,
- mycompressionquality, mycompressiontype, anyCodec, &maxCompressedFrameSize);
-
- CheckForError( error, "GetMaxCompressionSize");
-
- myFrameBitsHandle = NewHandle( maxCompressedFrameSize);
-
- CheckForError( (myFrameBitsHandle == 0), "NewHandle");
-
- HLock( myFrameBitsHandle);
- }
-
- void recorder::StartSequence()
- {
- if( sequence_running)
- {
- DebugStr( "\pStartSequence called while one is running. Exiting!");
- exit( EXIT_FAILURE);
- } else {
- sequence_running = true;
- }
- OSErr error;
-
- error = CompressSequenceBegin( &mySequence, &thepix, nil, &movieFrame, nil, movieDepth,
- mycompressiontype, anyCodec, mycompressionquality, mytemporalquality,
- mykeyframedistance, nil, (unsigned short)codecFlagUpdatePrevious,
- myImageDescriptionHandle);
-
- CheckForError( error, "CompressSequenceBegin");
- }
-
- void recorder::EndSequence()
- {
- if( !sequence_running)
- {
- DebugStr( "\pEndSequence called while none is running. Exiting!");
- exit( EXIT_FAILURE);
- } else {
- sequence_running = false;
- }
- OSErr error;
- error = CDSequenceEnd( mySequence);
- CheckForError( error, "CDSequenceEnd");
- }
-
- recorder::~recorder()
- {
- if( sequence_running)
- {
- DebugStr( "\precorder::~recorder called while a sequence is running. Exiting!");
- exit( EXIT_FAILURE);
- }
- short resourceID = 1;
-
- OSErr error;
- error = EndMediaEdits( myMedia );
- CheckForError( error, "EndMediaEdits");
-
- error = InsertMediaIntoTrack( myTrack, 0L, 0L, GetMediaDuration( myMedia), (Fixed)(1<<16));
- CheckForError( error, "InsertMediaIntoTrack");
-
- error = AddMovieResource( myMovie, myResFileNo, &resourceID, myFSSpec.name);
- CheckForError( error, "AddMovieResource");
-
- error = MakeFilePreview( myResFileNo, (ICMProgressProcRecordPtr)-1);
-
- CheckForError( error, "MakeFilePreview");
-
- error = CloseMovieFile( myResFileNo);
- CheckForError( error, "CloseMovieFile");
-
- DisposeMovie( myMovie);
- DisposeHandle( myFrameBitsHandle);
- DisposeHandle( (Handle)myImageDescriptionHandle);
- }
-
- void recorder::AddFrame( TimeValue duration)
- {
- if( !sequence_running)
- {
- DebugStr( "\pAddFrame called while no sequence is running. Exiting!");
- exit( EXIT_FAILURE);
- }
- long CompressedFrameSize = maxCompressedFrameSize;
-
- unsigned char similarity;
-
- OSErr error = CompressSequenceFrame( mySequence, &thepix, &movieFrame,
- (unsigned short)codecFlagUpdatePrevious, StripAddress( *myFrameBitsHandle),
- &CompressedFrameSize, &similarity, nil);
- CheckForError( error, "CompressSequenceFrame");
- //
- // pascal OSErr AddMediaSample(Media m,Handle dataIn,long inOffset,unsigned long size,
- // TimeValue durationPerSample,SampleDescriptionHandle sampleDescriptionH,
- // long numberOfSamples,short sampleFlags,TimeValue *sampleTime)
- // = {0x303C,0x7C,0xAAAA};
- //
- error = AddMediaSample( myMedia, myFrameBitsHandle, 0L, CompressedFrameSize,
- duration, (SampleDescriptionHandle)myImageDescriptionHandle, 1L,
- similarity ? mediaSampleNotSync : 0, &sampTime);
- CheckForError( error, "AddMediaSample");
- }
-