Mercurial > pidgin
diff plugins/crazychat/QTUtilities.c @ 11218:ed017b9c532d
[gaim-migrate @ 13350]
crazychat commit, first one.
committer: Tailor Script <tailor@pidgin.im>
author | Charlie Stockman <chuckleberry> |
---|---|
date | Tue, 09 Aug 2005 07:10:23 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/crazychat/QTUtilities.c Tue Aug 09 07:10:23 2005 +0000 @@ -0,0 +1,306 @@ +/* + File: QTUtilities.c + + Description: Miscellaneous QuickTime utility routines. + + Copyright: © Copyright 2003 Apple Computer, Inc. All rights reserved. + + Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. + ("Apple") in consideration of your agreement to the following terms, and your + use, installation, modification or redistribution of this Apple software + constitutes acceptance of these terms. If you do not agree with these terms, + please do not use, install, modify or redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and subject + to these terms, Apple grants you a personal, non-exclusive license, under Apple’s + copyrights in this original Apple software (the "Apple Software"), to use, + reproduce, modify and redistribute the Apple Software, with or without + modifications, in source and/or binary forms; provided that if you redistribute + the Apple Software in its entirety and without modifications, you must retain + this notice and the following text and disclaimers in all such redistributions of + the Apple Software. Neither the name, trademarks, service marks or logos of + Apple Computer, Inc. may be used to endorse or promote products derived from the + Apple Software without specific prior written permission from Apple. Except as + expressly stated in this notice, no other rights or licenses, express or implied, + are granted by Apple herein, including but not limited to any patent rights that + may be infringed by your derivative works or by other works in which the Apple + Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED + WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN + COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION + OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT + (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Change History (most recent first): + +*/ + +#include "QTUtilities.h" +#include "Utilities.h" + +#define BailErr(x) {if (x != noErr) goto bail;} + +////////// +// +// GetMovieFromFile +// Opens a movie file, then creates a new movie for the file +// +////////// + +OSErr GetMovieFromFile(FSSpec *fsspecPtr, Movie *theMovie) +{ + short resRefNum = -1; + OSErr result; + + *theMovie = NULL; + + result = OpenMovieFile(fsspecPtr, &resRefNum, 0); + if (result == noErr) + { + short actualResId = DoTheRightThing; + + result = NewMovieFromFile(theMovie, + resRefNum, + &actualResId, + (unsigned char *) 0, + 0, + (Boolean *) 0); + CloseMovieFile(resRefNum); + } + + return result; +} + +////////// +// +// GetAMovieFile +// Prompt the user for a movie file, then open +// the file and create a movie for it. +// +////////// + +OSErr GetAMovieFile(Movie *theMovie) +{ + OSType myTypeList[2] = {kQTFileTypeMovie, kQTFileTypeQuickTimeImage}; + FSSpec theFSSpec; + OSErr result = noErr; + + *theMovie = nil; + + result = GetOneFileWithPreview(2, myTypeList, &theFSSpec, NULL); + if (result != userCanceledErr) + { + result = GetMovieFromFile(&theFSSpec, theMovie); + } + + return result; +} + +////////// +// +// NormalizeMovieRect +// +////////// + +void NormalizeMovieRect(Movie theMovie) +{ + Rect movieBounds; + + GetMovieBox(theMovie, &movieBounds); + OffsetRect(&movieBounds, -movieBounds.left, -movieBounds.top); + movieBounds.right = movieBounds.left + 640; + movieBounds.bottom = movieBounds.top + 480; + SetMovieBox(theMovie, &movieBounds); +} + +////////// +// +// EraseRectAndAlpha +// Zeros out a section of the GWorld, including alpha. +// +////////// + +void EraseRectAndAlpha(GWorldPtr gWorld, Rect *pRect) +{ + PixMapHandle pixMap = GetGWorldPixMap(gWorld); + long rows; + Ptr rowBaseAddr; + + + LockPixels(pixMap); + rows = pRect->bottom - pRect->top; + + rowBaseAddr = GetPixBaseAddr(pixMap) + (GetPixRowBytes(pixMap) & 0x3fff) * pRect->top + pRect->left * GetPixDepth(pixMap) / 8; + do + { + long cols; + UInt32 *baseAddr; + + cols = pRect->right - pRect->left; + baseAddr = (UInt32*)rowBaseAddr; + rowBaseAddr += (**pixMap).rowBytes & 0x3fff; + do + { + *baseAddr++ = 0; + } while (--cols); + } while (--rows); + + UnlockPixels(pixMap); + +} // EraseRectAndAlpha + +////////// +// +// CreateDecompSeqForSGChannelData +// Create a decompression sequence for the passed +// Sequence Grabber channel data +// +////////// + +OSErr CreateDecompSeqForSGChannelData(SGChannel sgChannel, Rect *srcBounds, GWorldPtr imageDestination, ImageSequence *imageSeqID) +{ + OSErr err = noErr; + + ImageDescriptionHandle imageDesc = (ImageDescriptionHandle)NewHandle(sizeof(ImageDescription)); + if (imageDesc) + { + + err = SGGetChannelSampleDescription(sgChannel,(Handle)imageDesc); + // The original version of this code had a bug - it passed in a Crop Rect to DecompressSequenceBegin instead of a scaling matrix + // This only worked because of another bug inside QT that reated the crop Rect as a destination rect for DV + // the following code does the right thing in all cases. + + if (err == noErr) + { + MatrixRecord mr; + Rect fromR; + + fromR.left = 0; + fromR.top = 0; + fromR.right = (**imageDesc).width; + fromR.bottom = (**imageDesc).height; + RectMatrix(&mr, &fromR, srcBounds); + + err = DecompressSequenceBegin(imageSeqID, imageDesc, imageDestination, 0, nil, &mr,srcCopy,nil,0, codecNormalQuality, bestSpeedCodec); + } + + DisposeHandle((Handle)imageDesc); + } + else + { + err = MemError(); + } + + return err; +} + + +////////// +// +// CreateDecompSeqForGWorldData +// Create a decompression sequence for the specified gworld data +// +////////// + +OSErr CreateDecompSeqForGWorldData(GWorldPtr srcGWorld, Rect *srcBounds, MatrixRecordPtr mr, GWorldPtr imageDestination, ImageSequence *imageSeqID) +{ + OSErr err; + + ImageDescriptionHandle imageDesc = (ImageDescriptionHandle)NewHandle(sizeof(ImageDescription)); + if (imageDesc) + { + err = MakeImageDescriptionForPixMap (GetGWorldPixMap(srcGWorld), &imageDesc); + err = DecompressSequenceBegin( imageSeqID, + imageDesc, + imageDestination, + 0, + srcBounds, + mr, + srcCopy, + nil, + 0, + codecNormalQuality, + bestSpeedCodec); + DisposeHandle((Handle)imageDesc); + } + else + { + err = MemError(); + } + + return err; +} + +////////// +// +// CreateNewSGChannelForRecording +// - create a new Sequence Grabber video channel +// - let the use configure the channel +// - set the channel bounds, usage +// - set a data proc for the channel +// - start recording data +// +////////// + +OSErr CreateNewSGChannelForRecording(ComponentInstance seqGrab, SGDataUPP dataProc, CGrafPtr drawPort, Rect *theRect, SGChannel *sgChannel, long refCon) +{ + OSErr err = noErr; + + BailErr((err = SGInitialize(seqGrab))); + + // tell it we're not making a movie + BailErr((err = SGSetDataRef(seqGrab,0,0,seqGrabDontMakeMovie))); + // It wants a port, even if its not drawing to it + BailErr((err = SGSetGWorld(seqGrab, drawPort, GetMainDevice()))); + BailErr((err = SGNewChannel(seqGrab, VideoMediaType, sgChannel))); + + // let the user configure the video channel + //BailErr((err = SGSettingsDialog(seqGrab, *sgChannel, 0, nil, 0, nil, 0))); // ************************ +// ************************************************************ + + + + BailErr((err = SGSetChannelBounds(*sgChannel, theRect))); + // set usage for new video channel to avoid playthrough + BailErr((err = SGSetChannelUsage(*sgChannel, seqGrabRecord ))); //note we don't set seqGrabPlayDuringRecord + BailErr((err = SGSetDataProc(seqGrab, dataProc, refCon))); + BailErr((err = SGStartRecord(seqGrab))); + +bail: + return err; +} + +////////// +// +// DoCloseSG +// Terminate recording for our SG channel - dispose of the channel and +// the associated SG component instance +// +////////// + +void DoCloseSG(ComponentInstance seqGrab, SGChannel sgChannel, SGDataUPP dataProc) +{ + if(seqGrab) + { + SGStop(seqGrab); + SGSetDataProc(seqGrab, NULL ,NULL); + if (dataProc) + { + DisposeSGDataUPP(dataProc); + } + + SGDisposeChannel(seqGrab, sgChannel); + CloseComponent(seqGrab); + } +} + +