forked from cellularmitosis/ADC-reference-library-2009-july
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlisting4.html
More file actions
executable file
·642 lines (535 loc) · 20.6 KB
/
Copy pathlisting4.html
File metadata and controls
executable file
·642 lines (535 loc) · 20.6 KB
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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<!-- BEGIN META TAG INFO -->
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="home" href="http://developer.apple.com/">
<link rel="find" href="http://developer.apple.com/search/">
<link rel="stylesheet" type="text/css" href="../../documentation/css/adcstyle.css" title="fonts">
<script language="JavaScript" src="../../documentation/js/adc.js" type="text/javascript"></script>
<!-- END META TAG INFO -->
<!-- BEGIN TITLE -->
<title>QTKitTimeCode - /QTTimeCode.c</title>
<!-- END TITLE -->
<script language="JavaScript">
function JumpToNewPage() {
window.location=document.scpopupmenu.gotop.value;
return true;
}
</script>
</head>
<!-- BEGIN BODY OPEN -->
<body>
<!--END BODY OPEN -->
<!-- START CENTER OPEN -->
<center>
<!-- END CENTER OPEN -->
<!-- BEGIN LOGO AND SEARCH -->
<!--#include virtual="/includes/adcnavbar"-->
<!-- END LOGO AND SEARCH -->
<!-- START BREADCRUMB -->
<div id="breadcrumb">
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr>
<td scope="row"><img width="340" height="10" src="images/1dot.gif" alt=""></td>
<td><img width="340" height="10" src="images/1dot.gif" alt=""></td>
</tr>
<tr valign="middle">
<td align="left" colspan="2">
<a href="http://developer.apple.com/">ADC Home</a> > <a href="../../referencelibrary/index.html">Reference Library</a> > <a href="../../samplecode/index.html">Sample Code</a> > <a href="../../samplecode/QuickTime/index.html">QuickTime</a> > <a href="../../samplecode/QuickTime/idxCocoa-date.html">Cocoa</a> > <A HREF="javascript:location.replace('index.html');">QTKitTimeCode</A> >
</td>
</tr>
<tr>
<td colspan="2" scope="row"><img width="680" height="35" src="images/1dot.gif" alt=""></td>
</tr>
</table>
</div>
<!-- END BREADCRUMB -->
<!-- START MAIN CONTENT -->
<!-- START TITLE GRAPHIC AND INTRO-->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr align="left" valign="top">
<td><h1><div id="pagehead">QTKitTimeCode</div></h1></td>
</tr>
</table>
<!-- END TITLE GRAPHIC AND INTRO -->
<!-- START WIDE COLUMN -->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr align="left" valign="top">
<td id="scdetails">
<h2>/QTTimeCode.c</h2>
<form name="scpopupmenu" onSubmit="return false;" method=post>
<p><strong>View Source Code:</strong>
<select name="gotop" onChange="JumpToNewPage();" style="width:340px"><option selected value="ingnore">Select File</option>
<option value="listing1.html">/main.m</option>
<option value="listing2.html">/MyController.h</option>
<option value="listing3.html">/MyController.m</option>
<option value="listing4.html">/QTTimeCode.c</option>
<option value="listing5.html">/TimecodeUtilities.h</option>
<option value="listing6.html">/TimecodeUtilities.m</option></select>
</p>
</form>
<p><strong><a href="QTKitTimeCode.zip">Download Sample</a></strong> (“QTKitTimeCode.zip”, 196.6K)<BR>
<strong><a href="QTKitTimeCode.dmg">Download Sample</a></strong> (“QTKitTimeCode.dmg”, 250.2K)</p>
<!--
<p><strong><a href="#">Download Sample</a></strong> (“filename.sit”, 500K)</p>
-->
</td>
</tr>
<tr>
<td scope="row"><img width="680" height="10" src="images/1dot.gif" alt=""><br>
<img height="1" width="680" src="images/1dot_919699.gif" alt=""><br>
<img width="680" height="20" src="images/1dot.gif" alt=""></td>
</tr>
<tr>
<td scope="row">
<!--googleon: index -->
<pre class="sourcecodebox">// ************ This file is for reference only and NOT used in this Sample ************ // This file only contains the older C Utility functions that call the QuickTime// Timecode Media Handler - all other support functions have// been removed as they are all deprecated./*© Copyright 2000 - 2007 Apple Computer, Inc. All rights reserved.IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") inconsideration of your agreement to the following terms, and your use, installation,modification or redistribution of this Apple software constitutes acceptance of theseterms. If you do not agree with these terms, please do not use, install, modify orredistribute this Apple software.In consideration of your agreement to abide by the following terms, and subject to theseterms, Apple grants you a personal, non-exclusive license, under Apple's copyrights inthis original Apple software (the "Apple Software"), to use, reproduce, modify andredistribute the Apple Software, with or without modifications, in source and/or binaryforms; provided that if you redistribute the Apple Software in its entirety and withoutmodifications, you must retain this notice and the following text and disclaimers in allsuch redistributions of the Apple Software. Neither the name, trademarks, service marksor logos of Apple Computer, Inc. may be used to endorse or promote products derived fromthe Apple Software without specific prior written permission from Apple. Except asexpressly stated in this notice, no other rights or licenses, express or implied, aregranted by Apple herein, including but not limited to any patent rights that may beinfringed by your derivative works or by other works in which the Apple Software may beincorporated.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 OFNON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THEAPPLE 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 CONSEQUENTIALDAMAGES (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 THEUSE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVERCAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICTLIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/// ************ This file is for reference only and NOT used in this Sample ************ // This file only contains the older C Utility functions that call the QuickTime// Timecode Media Handler - all other support functions have// been removed as they are all deprecated./////////////// QTTC_DeleteTimeCodeTracks// Remove all existing timecode tracks from the specified movie.////////////void QTTC_DeleteTimeCodeTracks (Movie theMovie){ Track myTrack = NULL; myTrack = GetMovieIndTrackType(theMovie, 1, TimeCodeMediaType, movieTrackMediaType); while (myTrack != NULL) { DisposeMovieTrack(myTrack); myTrack = GetMovieIndTrackType(theMovie, 1, TimeCodeMediaType, movieTrackMediaType); }}////////////// QTTC_AddTimeCodeToMovie// Add a timecode track to the specified movie.////////////OSErr QTTC_AddTimeCodeToMovie (Movie theMovie, OSType theType){ Track myTypeTrack = NULL; Track myTrack = NULL; Media myMedia = NULL; MediaHandler myHandler = NULL; TimeCodeDef myTCDef; TimeCodeRecord myTCRec; Str63 myString; TimeValue myDuration; MatrixRecord myMatrix; Fixed myWidth; Fixed myHeight; Fixed myTCHeight; long myFlags = 0L; TCTextOptions myTextOptions; FontInfo myFontInfo; TimeCodeDescriptionHandle myDesc = NULL; long **myFrameHandle; OSErr myErr = noErr; ////////// // // find the target track // ////////// // get the (first) track of the specified type; this track determines the width of the new timecode track myTypeTrack = GetMovieIndTrackType(theMovie, 1, theType, movieTrackMediaType); if (myTypeTrack == NULL) { myErr = trackNotInMovie; goto bail; } // get the dimensions of the target track GetTrackDimensions(myTypeTrack, &myWidth, &myHeight); ////////// // // create the timecode track and media // ////////// myTrack = NewMovieTrack(theMovie, myWidth, kTimeCodeTrackSize, kNoVolume); if (myTrack == NULL) goto bail; myMedia = NewTrackMedia(myTrack, TimeCodeMediaType, GetMovieTimeScale(theMovie), NULL, 0); if (myMedia == NULL) goto bail; myHandler = GetMediaHandler(myMedia); if (myHandler == NULL) goto bail; ////////// // // fill in a timecode definition structure; this becomes part of the timecode description // ////////// // set the timecode format information flags if (gUseTimeCode) { myFlags = 0L; if (gDropFrameVal) myFlags |= tcDropFrame; if (gIsNeg) myFlags |= tcNegTimesOK; if (g24Hour) myFlags |= tc24HourMax; } else { myFlags = tcCounter; } myTCDef.flags = myFlags; myTCDef.fTimeScale = gTimeScale; myTCDef.frameDuration = gFrameDur; myTCDef.numFrames = gNumFrames; ////////// // // fill in a timecode record // ////////// if (gUseTimeCode) { myTCRec.t.hours = (UInt8)gHours; myTCRec.t.minutes = (UInt8)gMinutes; // negative flag is here myTCRec.t.seconds = (UInt8)gSeconds; myTCRec.t.frames = (UInt8)gFrames; if (gIsNeg) myTCRec.t.minutes |= tctNegFlag; } else { myTCRec.c.counter = gCounterVal; } ////////// // // figure out the timecode track geometry // ////////// // get display options to calculate box height TCGetDisplayOptions(myHandler, &myTextOptions); GetFNum(gFontName, &myTextOptions.txFont); TCSetDisplayOptions(myHandler, &myTextOptions); // use the starting time to figure out the dimensions of track TCTimeCodeToString(myHandler, &myTCDef, &myTCRec, myString); TextFont(myTextOptions.txFont); TextFace(myTextOptions.txFace); TextSize(myTextOptions.txSize); GetFontInfo(&myFontInfo); // calculate track width and height based on text myTCHeight = FixRatio(myFontInfo.ascent + myFontInfo.descent + 2, 1); SetTrackDimensions(myTrack, myWidth, myTCHeight); GetTrackMatrix(myTrack, &myMatrix); if (gDisplayBelowVideo) TranslateMatrix(&myMatrix, 0, myHeight); SetTrackMatrix(myTrack, &myMatrix); SetTrackEnabled(myTrack, gDisplayTimeCode ? true : false); TCSetTimeCodeFlags(myHandler, gDisplayTimeCode ? tcdfShowTimeCode : 0, tcdfShowTimeCode); ////////// // // edit the track media // ////////// myErr = BeginMediaEdits(myMedia); if (myErr == noErr) { long mySize; UserData myUserData; ////////// // // create and configure a new timecode description handle // ////////// mySize = sizeof(TimeCodeDescription); myDesc = (TimeCodeDescriptionHandle)NewHandleClear(mySize); if (myDesc == NULL) goto bail; (**myDesc).descSize = mySize; (**myDesc).dataFormat = TimeCodeMediaType; (**myDesc).timeCodeDef = myTCDef; ////////// // // set the source identification information // ////////// // the source identification information for a timecode track is stored // in a user data item of type TCSourceRefNameType myErr = NewUserData(&myUserData); if (myErr == noErr) { Handle myNameHandle = NULL; myErr = PtrToHand(&gSrcName[1], &myNameHandle, gSrcName[0]); if (myErr == noErr) { myErr = AddUserDataText(myUserData, myNameHandle, TCSourceRefNameType, 1, langEnglish); if (myErr == noErr) TCSetSourceRef(myHandler, myDesc, myUserData); } if (myNameHandle != NULL) DisposeHandle(myNameHandle); DisposeUserData(myUserData); } ////////// // // add a sample to the timecode track // // each sample in a timecode track provides timecode information for a span of movie time; // here, we add a single sample that spans the entire movie duration // ////////// // the sample data contains a frame number that identifies one or more content frames // that use the timecode; this value (a long integer) identifies the first frame that // uses the timecode myFrameHandle = (long **)NewHandle(sizeof(long)); if (myFrameHandle == NULL) goto bail; myErr = TCTimeCodeToFrameNumber(myHandler, &(**myDesc).timeCodeDef, &myTCRec, *myFrameHandle); // the data in the timecode track must be big-endian **myFrameHandle = EndianS32_NtoB(**myFrameHandle); myDuration = GetMovieDuration(theMovie); // since we created the track with the same timescale as the movie, // we don't need to convert the duration myErr = AddMediaSample(myMedia, (Handle)myFrameHandle, 0, GetHandleSize((Handle)myFrameHandle), myDuration, (SampleDescriptionHandle)myDesc, 1, 0, 0); if (myErr != noErr) goto bail; } myErr = EndMediaEdits(myMedia); if (myErr != noErr) goto bail; myErr = InsertMediaIntoTrack(myTrack, 0, 0, myDuration, fixed1); if (myErr != noErr) goto bail; ////////// // // create a track reference from the target track to the timecode track // ////////// myErr = AddTrackReference(myTypeTrack, myTrack, TimeCodeMediaType, NULL); bail: if (myDesc != NULL) DisposeHandle((Handle)myDesc); if (myFrameHandle != NULL) DisposeHandle((Handle)myFrameHandle); return(myErr);}////////////// QTTC_ShowCurrentTimeCode // Show (in an alert box) the timecode value for the current movie time.////////////void QTTC_ShowCurrentTimeCode (Movie theMovie){ MediaHandler myHandler = NULL; HandlerError myErr = noErr; TimeCodeDef myTCDef; TimeCodeRecord myTCRec; myHandler = QTTC_GetTimeCodeMediaHandler(theMovie); if (myHandler != NULL) { // get the timecode for the current movie time myErr = TCGetCurrentTimeCode(myHandler, NULL, &myTCDef, &myTCRec, NULL); if (myErr == noErr) { Str255 myString; myErr = TCTimeCodeToString(myHandler, &myTCDef, &myTCRec, myString); if (myErr == noErr) // do something with the string } }}////////////// QTTC_ShowTimeCodeSource// Show (in an alert box) the timecode source for the specified movie.////////////void QTTC_ShowTimeCodeSource (Movie theMovie){ MediaHandler myHandler = NULL; HandlerError myErr = noErr; UserData myUserData; myHandler = QTTC_GetTimeCodeMediaHandler(theMovie); if (myHandler != NULL) { // get the timecode source for the current movie time myErr = TCGetCurrentTimeCode(myHandler, NULL, NULL, NULL, &myUserData); if (myErr == noErr) { Str255 myString = " [No source name!]"; Handle myNameHandle = NewHandleClear(0); GetUserDataText(myUserData, myNameHandle, TCSourceRefNameType, 1, langEnglish); if (GetHandleSize(myNameHandle) > 0) { BlockMove(*myNameHandle, &myString[1], GetHandleSize(myNameHandle)); myString[0] = GetHandleSize(myNameHandle); } if (myNameHandle != NULL) DisposeHandle(myNameHandle); // do something with the string DisposeUserData(myUserData); } }}////////////// QTTC_ToggleTimeCodeDisplay // Toggle the current state of timecode display.////////////void QTTC_ToggleTimeCodeDisplay (MovieController theMC){ Movie myMovie = MCGetMovie(theMC); Track myTrack = NULL; MediaHandler myHandler = NULL; long myFlags = 0L; // get the (first) timecode track in the specified movie myTrack = GetMovieIndTrackType(myMovie, 1, TimeCodeMediaType, movieTrackMediaType); if (myTrack != NULL) { // get the timecode track's media handler myHandler = QTTC_GetTimeCodeMediaHandler(myMovie); if (myHandler != NULL) { // toggle the show-timecode flag TCGetTimeCodeFlags(myHandler, &myFlags); myFlags ^= tcdfShowTimeCode; TCSetTimeCodeFlags(myHandler, myFlags, tcdfShowTimeCode); // toggle the track enabled state SetTrackEnabled(myTrack, !GetTrackEnabled(myTrack)); // now tell the movie controller the movie has changed, // so that the movie rectangle gets updated correctly MCMovieChanged(theMC, myMovie); } }}////////////// QTTC_GetTimeCodeMediaHandler // Get the media handler for the first timecode track in the specified movie.////////////MediaHandler QTTC_GetTimeCodeMediaHandler (Movie theMovie){ Track myTrack = NULL; Media myMedia = NULL; MediaHandler myHandler = NULL; // get the (first) timecode track in the specified movie myTrack = GetMovieIndTrackType(theMovie, 1, TimeCodeMediaType, movieTrackMediaType); if (myTrack != NULL) { // get the timecode track's media and media handler myMedia = GetTrackMedia(myTrack); if (myMedia != NULL) myHandler = GetMediaHandler(myMedia); } return(myHandler);}////////////// QTTC_MovieHasTimeCodeTrack// Determine whether the specified movie contains a timecode track.// //////////Boolean QTTC_MovieHasTimeCodeTrack(Movie theMovie){ return(GetMovieIndTrackType(theMovie, 1, TimeCodeMediaType, movieTrackMediaType) != NULL);}////////////// QTUtils_DeleteAllReferencesToTrack// Delete all existing track references to the specified track.////////////OSErr QTUtils_DeleteAllReferencesToTrack (Track theTrack){ Movie myMovie = NULL; Track myTrack = NULL; long myTrackCount = 0L; long myTrRefCount = 0L; long myTrackIndex; long myTrRefIndex; OSErr myErr = noErr; myMovie = GetTrackMovie(theTrack); if (myMovie == NULL) return(paramErr); // iterate thru all the tracks in the movie (that are different from the specified track) myTrackCount = GetMovieTrackCount(myMovie); for (myTrackIndex = 1; myTrackIndex <= myTrackCount; myTrackIndex++) { myTrack = GetMovieIndTrack(myMovie, myTrackIndex); if ((myTrack != NULL) && (myTrack != theTrack)) { OSType myType = 0L; // iterate thru all track reference types contained in the current track myType = GetNextTrackReferenceType(myTrack, myType); while (myType != 0L) { // iterate thru all track references of the current type; // note that we count down to 1, since DeleteTrackReference will cause // any higher-indexed track references to be renumbered myTrRefCount = GetTrackReferenceCount(myTrack, myType); for (myTrRefIndex = myTrRefCount; myTrRefIndex >= 1; myTrRefIndex--) { Track myRefTrack = NULL; myRefTrack = GetTrackReference(myTrack, myType, myTrRefIndex); if (myRefTrack == theTrack) myErr = DeleteTrackReference(myTrack, myType, myTrRefIndex); } myType = GetNextTrackReferenceType(myTrack, myType); } } } return(myErr);}// ************ This file is for reference only and NOT used in this Sample ************ // This file only contains the older C Utility functions that call the QuickTime// Timecode Media Handler - all other support functions have// been removed as they are all deprecated.</pre>
<!--googleoff: index -->
</td>
</tr>
</table>
<!-- END WIDE COLUMN -->
<!-- END MAIN CONTENT -->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><div style="width: 100%; height: 1px; background-color: #919699; margin-top: 5px; margin-bottom: 15px"></div></td>
</tr>
<tr>
<td align="center"><br/>
<table border="0" cellpadding="0" cellspacing="0" class="graybox">
<tr>
<th>Did this document help you?</th>
</tr>
<tr>
<td>
<div style="margin-bottom: 8px"><a href="http://developer.apple.com/feedback/?v=1&url=/samplecode/QTKitTimeCode/listing4.html%3Fid%3DDTS10004426-1.1&media=dvd" target=_new>Yes</a>: Tell us what works for you.</div>
<div style="margin-bottom: 8px"><a href="http://developer.apple.com/feedback/?v=2&url=/samplecode/QTKitTimeCode/listing4.html%3Fid%3DDTS10004426-1.1&media=dvd" target=_new>It’s good, but:</a> Report typos, inaccuracies, and so forth.</div>
<div><a href="http://developer.apple.com/feedback/?v=3&url=/samplecode/QTKitTimeCode/listing4.html%3Fid%3DDTS10004426-1.1&media=dvd" target=_new>It wasn’t helpful</a>: Tell us what would have helped.</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!-- START BOTTOM APPLE NAVIGATION -->
<!--#include virtual="/includes/footer"-->
<!-- END BOTTOM APPLE NAVIGATION -->
<!-- START CENTER CLOSE -->
</center>
<!-- END CENTER CLOSE -->
</body>
</html>