Max 5 API Reference
00001 #if TARGET_RT_MAC_MACHO 00002 00003 #include <QuickTime/Movies.h> 00004 #include <QuickTime/MediaHandlers.h> 00005 #include <QuickTime/QuicktimeVR.h> 00006 00007 #else 00008 00009 #include <Movies.h> 00010 #include <MediaHandlers.h> 00011 #include <Script.h> 00012 #include <QuicktimeVR.h> 00013 00014 #endif 00015 00016 #include "jit.common.h" 00017 #include "ext_obex.h" 00018 #include "jit.qt.h" 00019 #include "jit.fixmath.h" 00020 #include "jit.charset.h" 00021 00022 /** 00023 * @defgroup qtutilsmod QuickTime Utilties Module 00024 @ingroup jitter 00025 */ 00026 00027 #define type2str(type,typestr) \ 00028 (typestr)[0]=((type)>>24L)&0x000000ff; \ 00029 (typestr)[1]=((type)>>16L)&0x000000ff; \ 00030 (typestr)[2]=((type)>>8L)&0x000000ff; \ 00031 (typestr)[3]=(type)&0x000000ff; \ 00032 (typestr)[4]=0; 00033 00034 long _jit_qt_optimize = true; // this can be set from the kernel ; jit qtoptimize 1/0 00035 00036 /** 00037 * Media type symbols: "video", "sound", "test", "base", "mpeg", "music", "timecode", 00038 * "sprite", "flash", "movie", "tween", "3d", "qtvr", "qtvrpano", 00039 * "qtvrobject", "unknown" 00040 * 00041 * @ingroup qtutilsmod 00042 * 00043 * @warning These symbols aren't exported, but are provided for reference, as they 00044 * may be returned by jit_qt_utils_tracktype_get(). 00045 */ 00046 static t_symbol *ps_media_video; 00047 static t_symbol *ps_media_sound; 00048 static t_symbol *ps_media_text; 00049 static t_symbol *ps_media_base; 00050 static t_symbol *ps_media_mpeg; 00051 static t_symbol *ps_media_music; 00052 static t_symbol *ps_media_timecode; 00053 static t_symbol *ps_media_sprite; 00054 static t_symbol *ps_media_flash; 00055 static t_symbol *ps_media_movie; 00056 static t_symbol *ps_media_tween; 00057 static t_symbol *ps_media_3d; 00058 static t_symbol *ps_media_qtvr; 00059 static t_symbol *ps_media_qtvrpano; 00060 static t_symbol *ps_media_qtvrobject; 00061 static t_symbol *ps_media_unknown; 00062 00063 static t_symbol *ps_file_aiff; 00064 static t_symbol *ps_file_aifc; 00065 static t_symbol *ps_file_dvc; 00066 static t_symbol *ps_file_midi; 00067 static t_symbol *ps_file_pict; 00068 static t_symbol *ps_file_movie; 00069 static t_symbol *ps_file_text; 00070 static t_symbol *ps_file_wave; 00071 static t_symbol *ps_file_sfil; 00072 static t_symbol *ps_file_ulaw; 00073 static t_symbol *ps_file_avi; 00074 static t_symbol *ps_file_sd2; 00075 static t_symbol *ps_file_cdtrack; 00076 static t_symbol *ps_file_pics; 00077 static t_symbol *ps_file_gif; 00078 static t_symbol *ps_file_png; 00079 static t_symbol *ps_file_tiff; 00080 static t_symbol *ps_file_photoshop; 00081 static t_symbol *ps_file_sgi; 00082 static t_symbol *ps_file_bmp; 00083 static t_symbol *ps_file_jpeg; 00084 static t_symbol *ps_file_macpaint; 00085 static t_symbol *ps_file_targa; 00086 static t_symbol *ps_file_qdgx; 00087 static t_symbol *ps_file_qtimage; 00088 static t_symbol *ps_file_3dmf; 00089 static t_symbol *ps_file_flc; 00090 static t_symbol *ps_file_flash; 00091 static t_symbol *ps_file_flashpix; 00092 static t_symbol *ps_file_mpeg4; 00093 00094 00095 /** 00096 * Creates a new Data Reference from a file path, returning it and the filename/path pair 00097 * 00098 * @ingroup qtutilsmod 00099 * 00100 * @param sname (in/out) in: file name or fully qualified path in; out: file name of opened movie file 00101 * @param path (in/out) in: only necessary if sname is unqualified; out: path of opened movie file 00102 * @param dataRef (on output) QuickTime-compatible Data Reference for the specified file name, must be disposed by the caller 00103 * @param dataRefType (on output) Data Reference type 00104 * 00105 * @return t_jit_err error 00106 * 00107 */ 00108 t_jit_err jit_qt_utils_moviedataref_create(t_symbol **sname, short *path, Handle *dataRef, OSType *dataRefType) 00109 { 00110 char name[MAX_PATH_CHARS]; 00111 short vol; 00112 long type = FOUR_CHAR_CODE('MooV'); 00113 Handle dr = NULL; 00114 OSType drt = 0; 00115 OSErr err; 00116 00117 if (!(sname && path && dataRef && dataRefType)) 00118 return JIT_ERR_GENERIC; 00119 00120 if (*sname==_jit_sym_nothing) { 00121 strcpy(name,"untitled.mov"); 00122 if ((err = saveasdialog_extended(name, &vol, &type, &type, 1))) 00123 return JIT_ERR_GENERIC; 00124 } 00125 else { 00126 // convert any full paths into path/name combo before getting the data ref 00127 if (path_frompotentialpathname((*sname)->s_name, &vol, name)) { 00128 strcpy(name, (*sname)->s_name); 00129 vol = path_getdefault(); 00130 } 00131 } 00132 00133 XQT_NewDataReferenceFromMaxPath(vol, name, &dr, &drt, &err); 00134 00135 if (err) 00136 return JIT_ERR_GENERIC; 00137 00138 *sname = gensym(name); 00139 *path = vol; 00140 *dataRef = dr; 00141 *dataRefType = drt; 00142 00143 return JIT_ERR_NONE; 00144 } 00145 00146 00147 /** 00148 * Creates a new QuickTime Movie from a file path, optionally returning the Data Handler and/or filename/path pair 00149 * 00150 * @ingroup qtutilsmod 00151 * 00152 * @param sname (in/out) in: file name or fully qualified path in; out: file name of opened movie file 00153 * @param path (in/out, optional) in: only necessary if sname is unqualified; out: path of opened movie file 00154 * @param flags movie file creation flags (see QuickTime Documentation for more information) 00155 * if no flags are specified, the following flags are used: 00156 * createMovieFileDeleteCurFile | createMovieFileDontCreateResFile 00157 * @param dhandler (on output, optional) data handler for the opened movie file 00158 * 00159 * @return Movie QuickTime Movie 00160 * 00161 */ 00162 Movie jit_qt_utils_moviefile_create(t_symbol **sname, short *path, long flags, DataHandler *dhandler) 00163 { 00164 OSErr err = 0; 00165 Movie movie = NULL; 00166 Handle dataRef = NULL; 00167 OSType dataRefType = 0; 00168 OSErr derr; 00169 00170 if (jit_qt_utils_moviedataref_create(sname, path, &dataRef, &dataRefType) != JIT_ERR_NONE) 00171 return NULL; 00172 00173 if (!flags) { //default case 00174 flags = createMovieFileDeleteCurFile | createMovieFileDontCreateResFile; 00175 } 00176 00177 err = CreateMovieStorage(dataRef, dataRefType, FOUR_CHAR_CODE('TVOD'), smCurrentScript, flags, dhandler, &movie); 00178 if (err) { 00179 movie = NULL; 00180 } 00181 DisposeHandle(dataRef); 00182 00183 return movie; 00184 } 00185 00186 /** 00187 * Returns a QuickTime-compatible Data Reference for a named file in the system's temporary files directory 00188 * 00189 * @ingroup qtutilsmod 00190 * 00191 * @param name file name 00192 * @param dataRef (on output) QuickTime-compatible Data Reference for the specified file name, must be disposed by the caller 00193 * @param dataRefType (on output) Data Reference type 00194 * 00195 * @return Boolean success (true) or failure (false) 00196 * 00197 */ 00198 Boolean jit_qt_utils_tempfile(char *name, Handle *dataRef, OSType *dataRefType) 00199 { 00200 OSErr err; 00201 short vref; 00202 long dirid; 00203 char fname[MAX_PATH_CHARS]; 00204 short path; 00205 char cname[MAX_PATH_CHARS]; 00206 char tmpfilename[MAX_PATH_CHARS]; 00207 #ifdef WIN_VERSION 00208 TCHAR tcname[MAX_PATH + 1]; 00209 TCHAR cvtname[MAX_PATH + 1] = ""; 00210 t_jit_charset_converter *conv; 00211 t_symbol *srcenc = ps_macroman; 00212 t_symbol *dstenc = ps_ms_ansi; 00213 char *cvtbuffer = NULL; 00214 long cvtbuffersize = 0; 00215 t_jit_err jiterr; 00216 #endif 00217 00218 if (!name) { 00219 name = tmpfilename; 00220 sprintf(name, "tmp_%s.mov", jit_symbol_unique()->s_name); 00221 } 00222 00223 // TODO: TEST WINDOWS 00224 #ifdef WIN_VERSION 00225 // convert name to Windows code page 00226 if (conv = (t_jit_charset_converter *)jit_object_new(ps_jit_charset_converter, ps_utf_8, ps_ms_ansi)) { 00227 jiterr = (t_jit_err)jit_object_method(conv, ps_convert, name, strlen(name) + 1, &cvtbuffer, &cvtbuffersize); 00228 if (!jiterr && cvtbuffer) { 00229 strcpy(cvtname, cvtbuffer); 00230 sysmem_freeptr(cvtbuffer); 00231 } 00232 jit_object_free(conv); 00233 } 00234 if (cvtname[0] == '\0') { 00235 return false; 00236 } 00237 00238 if (!GetTempPath(MAX_PATH, tcname)) { 00239 error("jit.broadcast: can't create temp file"); 00240 return false; 00241 } 00242 strcat((char *)tcname, cvtname); 00243 // TODO: this looks wrong 00244 if (path_nameconform(tcname, fname, PATH_STYLE_NATIVE, PATH_TYPE_PATH)) { 00245 return false; 00246 } 00247 #else 00248 FSRef fref; 00249 CFURLRef url; 00250 00251 err = FSFindFolder(kUserDomain, kTemporaryFolderType, kCreateFolder, &fref); 00252 if (err) { 00253 return false; 00254 } 00255 url = CFURLCreateFromFSRef(kCFAllocatorDefault, &fref); 00256 if (url) { 00257 if (CFURLGetFileSystemRepresentation(url, TRUE, (UInt8 *)fname, MAX_PATH_CHARS)) { 00258 long len = strlen(fname); 00259 if (fname[len-1] != '/') { 00260 fname[len] = '/'; 00261 fname[len+1] = '\0'; 00262 } 00263 strcat(fname, name); 00264 strcpy(cname, fname); 00265 } 00266 CFRelease(url); 00267 } 00268 if (path_nameconform(cname, fname, PATH_STYLE_MAX, PATH_TYPE_ABSOLUTE)) { 00269 return false; 00270 } 00271 #endif 00272 00273 // convert full path into path/name combo before getting the data ref 00274 path_frompotentialpathname(fname, &path, cname); 00275 XQT_NewDataReferenceFromMaxPath(path, cname, dataRef, dataRefType, &err); 00276 00277 if (err) return false; // fnfErr? 00278 return true; 00279 } 00280 00281 /** 00282 * Creates a new QuickTime Movie in the system's temporary file directory, 00283 * optionally returning the movie's data handler 00284 * 00285 * @ingroup qtutilsmod 00286 * 00287 * @param sname (in/out) in: file name or fully qualified path in; out: file name of opened movie file 00288 * @param path (in/out, optional) in: only necessary if sname is unqualified; out: path of opened movie file 00289 * @param flags movie file creation flags (see QuickTime Documentation for more information) 00290 * if no flags are specified, the following flags are used: 00291 * createMovieFileDeleteCurFile | createMovieFileDontCreateResFile 00292 * @param dhandler (on output, optional) data handler for the opened movie file 00293 * 00294 * 00295 * @return Movie QuickTime Movie 00296 * 00297 */ 00298 Movie jit_qt_utils_tempmoviefile_create(t_symbol **sname, short *path, long flags, DataHandler *dhandler) 00299 { 00300 char name[256]; 00301 short vol; 00302 long type = FOUR_CHAR_CODE('MooV'); 00303 short resId=movieInDataForkResID; 00304 long err = 0; 00305 Movie movie = NULL; 00306 unsigned long ticks; 00307 Handle dataRef = NULL; 00308 OSType dataRefType = 0; 00309 00310 if (*sname==_jit_sym_nothing) { 00311 GetDateTime(&ticks); 00312 sprintf(name, "temp%X.mov", ticks); 00313 } 00314 else { 00315 strcpy(name, (*sname)->s_name); 00316 vol = path_getdefault(); 00317 } 00318 00319 if (jit_qt_utils_tempfile(name, &dataRef, &dataRefType)) { 00320 if (!flags) //default case 00321 flags = createMovieFileDeleteCurFile | createMovieFileDontCreateResFile; 00322 err = CreateMovieStorage(dataRef, dataRefType, FOUR_CHAR_CODE('TVOD'), smCurrentScript, flags, dhandler, &movie); 00323 if (err) 00324 movie = NULL; 00325 DisposeHandle(dataRef); 00326 } 00327 00328 *sname = gensym(name); 00329 if (path) 00330 *path = vol; 00331 return movie; 00332 } 00333 00334 /** 00335 * Closes a QuickTime Movie previously created with jit_qt_utils_moviefile_create 00336 * or jit_qt_utils_tempmoviefile_create, adding the necessary movie resources 00337 * 00338 * @ingroup qtutilsmod 00339 * 00340 * @param movie QuickTime Movie, as returned from one of the above-named functions 00341 * @param dhandler data handler for the Movie, as returned from one of the above-named functions 00342 * 00343 * @return long QuickTime error code 00344 * 00345 */ 00346 long jit_qt_utils_moviefile_close(Movie movie, DataHandler dhandler) 00347 { 00348 short resId=movieInDataForkResID; 00349 long err = noErr; 00350 00351 if (!(movie && dhandler)) 00352 return noErr; 00353 00354 err = AddMovieToStorage(movie, dhandler); 00355 if (err) 00356 goto out; 00357 00358 err = CloseMovieStorage(dhandler); 00359 if (err) 00360 goto out; 00361 00362 out: 00363 DisposeMovie(movie); 00364 err = GetMoviesError(); 00365 00366 return err; 00367 } 00368 00369 t_jit_err jit_qt_utils_exchange_files(t_object *owner, Handle aDataRef, OSType aDataRefType, Handle bDataRef, OSType bDataRefType) 00370 { 00371 CFStringRef aStr = NULL; 00372 CFStringRef bStr = NULL; 00373 OSErr err; 00374 00375 err = QTGetDataReferenceFullPathCFString(aDataRef, aDataRefType, kQTNativeDefaultPathStyle, &aStr); 00376 if (err != noErr) { 00377 jit_object_error(owner, "%s: error %ld getting path string for file A data reference", object_classname(owner)->s_name, err); 00378 goto out; 00379 } 00380 err = QTGetDataReferenceFullPathCFString(bDataRef, bDataRefType, kQTNativeDefaultPathStyle, &bStr); 00381 if (err != noErr) { 00382 jit_object_error(owner, "%s: error %d getting path string for flat data reference (flatten)", object_classname(owner)->s_name, err); 00383 } 00384 #ifdef WIN_VERSION 00385 { 00386 char caStr[MAX_PATH_CHARS] = ""; 00387 char cbStr[MAX_PATH_CHARS] = ""; 00388 00389 CFStringGetCString(aStr, caStr, MAX_PATH_CHARS, kCFStringEncodingWindowsLatin1); 00390 CFStringGetCString(bStr, cbStr, MAX_PATH_CHARS, kCFStringEncodingWindowsLatin1); 00391 00392 if (*caStr && *cbStr) { 00393 // do names have to be windows-encoded? 00394 if (!CopyFile(cbStr, caStr, FALSE)) 00395 jit_object_error(owner, "%s: error %ld exchanging file contents", object_classname(owner)->s_name, GetLastError()); 00396 if (!DeleteFile(cbStr)) { 00397 jit_object_error(owner, "%s: error %ld deleting file ", object_classname(owner)->s_name, GetLastError()); 00398 } 00399 } 00400 } 00401 #else 00402 { 00403 CFURLRef aUrl = NULL; 00404 CFURLRef bUrl = NULL; 00405 FSRef aFref, bFref; 00406 00407 aUrl = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, aStr, kQTNativeDefaultPathStyle, FALSE); 00408 bUrl = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, bStr, kQTNativeDefaultPathStyle, FALSE); 00409 if (aUrl && bUrl) { 00410 if (!CFURLGetFSRef(aUrl, &aFref)) { 00411 jit_object_error(owner, "%s: error getting FSRef from movie file A", object_classname(owner)->s_name); 00412 } 00413 if (!CFURLGetFSRef(bUrl, &bFref)) { 00414 jit_object_error(owner, "%s: error getting FSRef from movie file B", object_classname(owner)->s_name); 00415 } 00416 err = FSExchangeObjects(&bFref, &aFref); 00417 if (err != noErr) 00418 jit_object_error(owner, "%s: error %ld exchanging file contents", object_classname(owner)->s_name, err); 00419 err = FSDeleteObject(&bFref); 00420 if (err != noErr) 00421 jit_object_error(owner, "%s: error %ld deleting temp file", object_classname(owner)->s_name, err); 00422 } 00423 if (aUrl) 00424 CFRelease(aUrl); 00425 if (bUrl) 00426 CFRelease(bUrl); 00427 } 00428 #endif 00429 out: 00430 if (aStr) CFRelease(aStr); 00431 if (bStr) CFRelease(bStr); 00432 00433 if (err) return JIT_ERR_GENERIC; 00434 return JIT_ERR_NONE; 00435 } 00436 00437 /** 00438 * Adds a new Track, with associated Media, to a QuickTime Movie 00439 * 00440 * @ingroup qtutilsmod 00441 * 00442 * @param movie QuickTime Movie 00443 * @param type four-char code specifying the track/media type to be added (see QuickTime Documentation) 00444 * @param trackframe the new Track's Rect, relative to the Movie's Rect 00445 * @param vol initial value for the sound volume in the new Track 00446 * @param timescale the new Track's timescale 00447 * 00448 * @return Track QuickTime Track 00449 * 00450 */ 00451 Track jit_qt_utils_trackmedia_add(Movie movie, long type, Rect *trackframe, long vol, long timescale) 00452 { 00453 Track track = NULL; 00454 Media media = NULL; 00455 long width = trackframe->right - trackframe->left; 00456 long height = trackframe->bottom - trackframe->top; 00457 ComponentDescription cd; 00458 Component c; 00459 Boolean visual = false; 00460 00461 cd.componentType = MediaHandlerType; 00462 cd.componentSubType = type; 00463 cd.componentManufacturer = 0; 00464 cd.componentFlags = 0; 00465 cd.componentFlagsMask = 0; 00466 00467 if (c = FindNextComponent(NULL, &cd)) { 00468 MediaHasCharacteristic((ComponentInstance)c, VisualMediaCharacteristic, &visual); 00469 if (visual) { 00470 vol = 0; 00471 } 00472 else { 00473 width = height = 0; 00474 } 00475 track = NewMovieTrack(movie, IntToFixed(width), IntToFixed(height), vol); 00476 if (track) { 00477 media = NewTrackMedia(track, type, timescale, NULL, 0); 00478 if (media) 00479 return track; 00480 else { 00481 DisposeMovieTrack(track); 00482 return NULL; 00483 } 00484 } 00485 } 00486 return NULL; 00487 } 00488 00489 /** 00490 * Returns the Media for a specified Track 00491 * 00492 * @ingroup qtutilsmod 00493 * 00494 * @param track QuickTime Track 00495 * 00496 * @return Media QuickTime Media 00497 * 00498 */ 00499 Media jit_qt_utils_trackmedia_get(Track track) 00500 { 00501 Media media = NULL; 00502 00503 media = GetTrackMedia(track); 00504 return media; 00505 } 00506 00507 long jit_qt_utils_trackmedia_close(Track track, long trackstart, long mediastart) 00508 { 00509 long err = noErr; 00510 Media media = NULL; 00511 00512 if (track) { 00513 media = GetTrackMedia(track); 00514 if (media) { 00515 err = InsertMediaIntoTrack(track, trackstart, mediastart, GetMediaDuration(media), fixed1); 00516 } 00517 } 00518 return err; 00519 } 00520 00521 /** 00522 * Removes a Track, with associated Media, from a QuickTime Movie 00523 * 00524 * @ingroup qtutilsmod 00525 * 00526 * @param track QuickTime Track 00527 * 00528 * @return long QuickTime error code 00529 * 00530 */ 00531 long jit_qt_utils_trackmedia_dispose(Track track) 00532 { 00533 long err = noErr; 00534 Media media = NULL; 00535 00536 if (track) { 00537 media = GetTrackMedia(track); 00538 if (media) { 00539 DisposeTrackMedia(media); 00540 err = GetMoviesError(); 00541 if (err) goto out; 00542 } 00543 DisposeMovieTrack(track); 00544 err = GetMoviesError(); 00545 } 00546 out: 00547 return err; 00548 } 00549 00550 /** 00551 * Given a four-char type code, return a 0-terminated C string 00552 * 00553 * @ingroup qtutilsmod 00554 * 00555 * @param type four-char code 00556 * @param typestr (on output) 0-terminated C string 00557 * 00558 */ 00559 void jit_qt_utils_type2str(OSType type, char *typestr) 00560 { 00561 type2str(type, typestr); 00562 } 00563 00564 /** 00565 * Given a C string, return a four-char code 00566 * 00567 * @ingroup qtutilsmod 00568 * 00569 * @param typestr C string 00570 * 00571 * @return OSType four-char code 00572 * 00573 */ 00574 OSType jit_qt_utils_str2type(char *typestr) 00575 { 00576 long len = strlen(typestr); 00577 OSType rv = 0; 00578 00579 len = MIN(len, 4); 00580 00581 switch(len) { 00582 case 4: 00583 rv += (typestr[3]); 00584 case 3: 00585 rv += (typestr[2] << 8L); 00586 case 2: 00587 rv += (typestr[1] << 16L); 00588 case 1: 00589 rv += (typestr[0] << 24L); 00590 break; 00591 } 00592 return rv; 00593 } 00594 00595 /** 00596 * Set the name of a QuickTime Track 00597 * 00598 * @ingroup qtutilsmod 00599 * 00600 * @param track QuickTime Track 00601 * @param s track name 00602 * 00603 */ 00604 void jit_qt_utils_trackname_set(Track track, t_symbol *s) 00605 { 00606 UserData ud; 00607 Str255 pname; 00608 00609 ud = GetTrackUserData(track); 00610 00611 ctopcpy(pname, s->s_name); 00612 while (RemoveUserData(ud, kUserDataName, 1) == noErr) 00613 ; 00614 SetUserDataItem(ud, &pname[1], pname[0], kUserDataName, 0); 00615 } 00616 00617 /** 00618 * Get the name of a QuickTime Track 00619 * 00620 * @ingroup qtutilsmod 00621 * 00622 * @param track QuickTime Track 00623 * 00624 * @return t_symbol pointer containing Track's name 00625 * 00626 */ 00627 t_symbol *jit_qt_utils_trackname_get(Track track) 00628 { 00629 UserData ud; 00630 Handle h; 00631 char cname[256]; 00632 long nameLength = 0; 00633 00634 h = NewHandle(0); 00635 00636 ud = GetTrackUserData(track); 00637 if (GetUserData(ud, h, kUserDataName, 1) == noErr) { 00638 nameLength = GetHandleSize(h); 00639 if (nameLength > 255) 00640 nameLength = 255; 00641 BlockMoveData(*h, cname, nameLength); 00642 } 00643 DisposeHandle(h); 00644 cname[nameLength] = '\0'; 00645 00646 return (gensym(cname)); 00647 } 00648 00649 /** 00650 * Get the Media Type name from a QuickTime Track 00651 * 00652 * @ingroup qtutilsmod 00653 * 00654 * @param track QuickTime Track 00655 * 00656 * @return t_symbol pointer containing the name of the Track's Media Type 00657 * 00658 */ 00659 t_symbol *jit_qt_utils_tracktype_get(Track track) 00660 { 00661 Media media; 00662 unsigned long type; 00663 t_symbol *sname; 00664 Str255 desc; 00665 char cdesc[256]; 00666 00667 media = GetTrackMedia(track); 00668 GetMediaHandlerDescription(media, &type, NULL, NULL); 00669 if ((sname = jit_qt_utils_mediatype2sym(type)) == ps_media_unknown) { 00670 MediaGetName(GetMediaHandler(media), desc, 0, NULL); 00671 ptoccpy(cdesc,desc); 00672 return gensym(cdesc); 00673 } 00674 else return sname; 00675 } 00676 00677 /** 00678 * Get the four-char code for a Track's Media Type, formatted as a symbol 00679 * 00680 * @ingroup qtutilsmod 00681 * 00682 * @param track QuickTime Track 00683 * 00684 * @return t_symbol pointer containing C string representation of the Media Type 00685 * 00686 */ 00687 t_symbol *jit_qt_utils_tracktypecode_get(Track track) 00688 { 00689 unsigned long type; 00690 char typestr[5]; 00691 00692 GetMediaHandlerDescription(GetTrackMedia(track), &type, NULL, NULL); 00693 jit_qt_utils_type2str(type, typestr); 00694 return gensym(typestr); 00695 } 00696 00697 /* 00698 srcCopy = 0, 00699 srcOr = 1, 00700 srcXor = 2, 00701 srcBic = 3, 00702 notSrcCopy = 4, 00703 notSrcOr = 5, 00704 notSrcXor = 6, 00705 notSrcBic = 7, 00706 patCopy = 8, 00707 patOr = 9, 00708 patXor = 10, 00709 patBic = 11, 00710 notPatCopy = 12, 00711 notPatOr = 13, 00712 notPatXor = 14, 00713 notPatBic = 15, // Special Text Transfer Mode 00714 grayishTextOr = 49, 00715 hilitetransfermode = 50, 00716 hilite = 50, // Arithmetic transfer modes 00717 blend = 32, 00718 addPin = 33, 00719 addOver = 34, 00720 subPin = 35, 00721 addMax = 37, 00722 adMax = 37, 00723 subOver = 38, 00724 adMin = 39, 00725 ditherCopy = 64, // Transparent mode constant 00726 transparent = 36 00727 */ 00728 00729 /* kQTFileTypeAIFF = FOUR_CHAR_CODE('AIFF'), 00730 kQTFileTypeAIFC = FOUR_CHAR_CODE('AIFC'), 00731 kQTFileTypeDVC = FOUR_CHAR_CODE('dvc!'), 00732 kQTFileTypeMIDI = FOUR_CHAR_CODE('Midi'), 00733 kQTFileTypePicture = FOUR_CHAR_CODE('PICT'), 00734 kQTFileTypeMovie = FOUR_CHAR_CODE('MooV'), 00735 kQTFileTypeText = FOUR_CHAR_CODE('TEXT'), 00736 kQTFileTypeWave = FOUR_CHAR_CODE('WAVE'), 00737 kQTFileTypeSystemSevenSound = FOUR_CHAR_CODE('sfil'), 00738 kQTFileTypeMuLaw = FOUR_CHAR_CODE('ULAW'), 00739 kQTFileTypeAVI = FOUR_CHAR_CODE('VfW '), 00740 kQTFileTypeSoundDesignerII = FOUR_CHAR_CODE('Sd2f'), 00741 kQTFileTypeAudioCDTrack = FOUR_CHAR_CODE('trak'), 00742 kQTFileTypePICS = FOUR_CHAR_CODE('PICS'), 00743 kQTFileTypeGIF = FOUR_CHAR_CODE('GIFf'), 00744 kQTFileTypePNG = FOUR_CHAR_CODE('PNGf'), 00745 kQTFileTypeTIFF = FOUR_CHAR_CODE('TIFF'), 00746 kQTFileTypePhotoShop = FOUR_CHAR_CODE('8BPS'), 00747 kQTFileTypeSGIImage = FOUR_CHAR_CODE('.SGI'), 00748 kQTFileTypeBMP = FOUR_CHAR_CODE('BMPf'), 00749 kQTFileTypeJPEG = FOUR_CHAR_CODE('JPEG'), 00750 kQTFileTypeJFIF = FOUR_CHAR_CODE('JPEG'), 00751 kQTFileTypeMacPaint = FOUR_CHAR_CODE('PNTG'), 00752 kQTFileTypeTargaImage = FOUR_CHAR_CODE('TPIC'), 00753 kQTFileTypeQuickDrawGXPicture = FOUR_CHAR_CODE('qdgx'), 00754 kQTFileTypeQuickTimeImage = FOUR_CHAR_CODE('qtif'), 00755 kQTFileType3DMF = FOUR_CHAR_CODE('3DMF'), 00756 kQTFileTypeFLC = FOUR_CHAR_CODE('FLC '), 00757 kQTFileTypeFlash = FOUR_CHAR_CODE('SWFL'), 00758 kQTFileTypeFlashPix = FOUR_CHAR_CODE('FPix') 00759 */ 00760 00761 void jit_qt_utils_gensymbols(void) 00762 { 00763 ps_media_video = gensym("video"); 00764 ps_media_sound = gensym("sound"); 00765 ps_media_text = gensym("text"); 00766 ps_media_base = gensym("base"); 00767 ps_media_mpeg = gensym("mpeg"); 00768 ps_media_music = gensym("music"); 00769 ps_media_timecode = gensym("timecode"); 00770 ps_media_sprite = gensym("sprite"); 00771 ps_media_flash = gensym("flash"); 00772 ps_media_movie = gensym("movie"); 00773 ps_media_tween = gensym("tween"); 00774 ps_media_3d = gensym("3d"); 00775 ps_media_qtvr = gensym("qtvr"); 00776 ps_media_qtvrpano = gensym("qtvr_panorama"); 00777 ps_media_qtvrobject = gensym("qtvr_object"); 00778 ps_media_unknown = gensym("unknown"); 00779 00780 ps_file_aiff = gensym("aiff"); 00781 ps_file_aifc = gensym("aifc"); 00782 ps_file_dvc = gensym("dvc"); 00783 ps_file_midi = gensym("midi"); 00784 ps_file_pict = gensym("pict"); 00785 ps_file_movie = gensym("movie"); 00786 ps_file_text = gensym("text"); 00787 ps_file_wave = gensym("wave"); 00788 ps_file_sfil = gensym("sfil"); 00789 ps_file_ulaw = gensym("ulaw"); 00790 ps_file_avi = gensym("avi"); 00791 ps_file_sd2 = gensym("sd2"); 00792 ps_file_cdtrack = gensym("cdtrack"); 00793 ps_file_pics = gensym("pics"); 00794 ps_file_gif = gensym("gif"); 00795 ps_file_png = gensym("png"); 00796 ps_file_tiff = gensym("tiff"); 00797 ps_file_photoshop = gensym("photoshop"); 00798 ps_file_sgi = gensym("sgi"); 00799 ps_file_bmp = gensym("bmp"); 00800 ps_file_jpeg = gensym("jpeg"); 00801 ps_file_macpaint = gensym("macpaint"); 00802 ps_file_targa = gensym("tga"); 00803 ps_file_qdgx = gensym("qdgx"); 00804 ps_file_qtimage = gensym("qtimage"); 00805 ps_file_3dmf = gensym("3dmf"); 00806 ps_file_flc = gensym("flc"); 00807 ps_file_flash = gensym("flash"); 00808 ps_file_flashpix = gensym("flashpix"); 00809 ps_file_mpeg4 = gensym("mpeg4"); 00810 } 00811 00812 t_symbol *jit_qt_utils_filetype2sym(long type) 00813 { 00814 t_symbol *sname = NULL; 00815 00816 switch(type) { 00817 case kQTFileTypeAIFF: sname = ps_file_aiff; break; 00818 case kQTFileTypeAIFC: sname = ps_file_aifc; break; 00819 case kQTFileTypeDVC: sname = ps_file_dvc; break; 00820 case kQTFileTypeMIDI: sname = ps_file_midi; break; 00821 case kQTFileTypePicture: sname = ps_file_pict; break; 00822 case kQTFileTypeMovie: sname = ps_file_movie; break; 00823 case kQTFileTypeText: sname = ps_file_text; break; 00824 case kQTFileTypeWave: sname = ps_file_wave; break; 00825 case kQTFileTypeSystemSevenSound: sname = ps_file_sfil; break; 00826 case kQTFileTypeMuLaw: sname = ps_file_ulaw; break; 00827 case kQTFileTypeAVI: sname = ps_file_avi; break; 00828 case kQTFileTypeSoundDesignerII: sname = ps_file_sd2; break; 00829 case kQTFileTypeAudioCDTrack: sname = ps_file_cdtrack; break; 00830 case kQTFileTypePICS: sname = ps_file_pics; break; 00831 case kQTFileTypeGIF: sname = ps_file_gif; break; 00832 case kQTFileTypePNG: sname = ps_file_png; break; 00833 case kQTFileTypeTIFF: sname = ps_file_tiff; break; 00834 case kQTFileTypePhotoShop: sname = ps_file_photoshop; break; 00835 case kQTFileTypeSGIImage: sname = ps_file_sgi; break; 00836 case kQTFileTypeBMP: sname = ps_file_bmp; break; 00837 case kQTFileTypeJPEG: sname = ps_file_jpeg; break; 00838 case kQTFileTypeMacPaint: sname = ps_file_macpaint; break; 00839 case kQTFileTypeTargaImage: sname = ps_file_targa; break; 00840 case kQTFileTypeQuickDrawGXPicture: sname = ps_file_qdgx; break; 00841 case kQTFileTypeQuickTimeImage: sname = ps_file_qtimage; break; 00842 case kQTFileType3DMF: sname = ps_file_3dmf; break; 00843 case kQTFileTypeFLC: sname = ps_file_flc; break; 00844 case kQTFileTypeFlash: sname = ps_file_flash; break; 00845 case kQTFileTypeFlashPix: sname = ps_file_flashpix; break; 00846 case FOUR_CHAR_CODE('mpg4'): sname = ps_file_mpeg4; break; 00847 } 00848 00849 if (!sname) 00850 sname = gensym("unknown"); 00851 00852 return sname; 00853 } 00854 00855 long jit_qt_utils_sym2filetype(t_symbol *s) 00856 { 00857 long type = 0; 00858 00859 if (s == ps_file_aiff) type = kQTFileTypeAIFF; 00860 else if (s == ps_file_aifc) type = kQTFileTypeAIFC; 00861 else if (s == ps_file_dvc) type = kQTFileTypeDVC; 00862 else if (s == ps_file_midi) type = kQTFileTypeMIDI; 00863 else if (s == ps_file_pict) type = kQTFileTypePicture; 00864 else if (s == ps_file_movie) type = kQTFileTypeMovie; 00865 else if (s == ps_file_text) type = kQTFileTypeText; 00866 else if (s == ps_file_wave) type = kQTFileTypeWave; 00867 else if (s == ps_file_sfil) type = kQTFileTypeSystemSevenSound; 00868 else if (s == ps_file_ulaw) type = kQTFileTypeMuLaw; 00869 else if (s == ps_file_avi) type = kQTFileTypeAVI; 00870 else if (s == ps_file_sd2) type = kQTFileTypeSoundDesignerII; 00871 else if (s == ps_file_cdtrack) type = kQTFileTypeAudioCDTrack; 00872 else if (s == ps_file_pics) type = kQTFileTypePICS; 00873 else if (s == ps_file_gif) type = kQTFileTypeGIF; 00874 else if (s == ps_file_png) type = kQTFileTypePNG; 00875 else if (s == ps_file_tiff) type = kQTFileTypeTIFF; 00876 else if (s == ps_file_photoshop) type = kQTFileTypePhotoShop; 00877 else if (s == ps_file_sgi) type = kQTFileTypeSGIImage; 00878 else if (s == ps_file_bmp) type = kQTFileTypeBMP; 00879 else if (s == ps_file_jpeg) type = kQTFileTypeJPEG; 00880 else if (s == ps_file_macpaint) type = kQTFileTypeMacPaint; 00881 else if (s == ps_file_targa) type = kQTFileTypeTargaImage; 00882 else if (s == ps_file_qdgx) type = kQTFileTypeQuickDrawGXPicture; 00883 else if (s == ps_file_qtimage) type = kQTFileTypeQuickTimeImage; 00884 else if (s == ps_file_3dmf) type = kQTFileType3DMF; 00885 else if (s == ps_file_flc) type = kQTFileTypeFLC; 00886 else if (s == ps_file_flash) type = kQTFileTypeFlash; 00887 else if (s == ps_file_flashpix) type = kQTFileTypeFlashPix; 00888 else if (s == ps_file_mpeg4) type = FOUR_CHAR_CODE('mpg4'); 00889 00890 return type; 00891 } 00892 00893 t_symbol *jit_qt_utils_mediatype2sym(long type) 00894 { 00895 t_symbol *sname = NULL; 00896 00897 switch(type) { 00898 case VideoMediaType: sname = ps_media_video; break; 00899 case SoundMediaType: sname = ps_media_sound; break; 00900 case TextMediaType: sname = ps_media_text; break; 00901 case BaseMediaType: sname = ps_media_base; break; 00902 case MPEGMediaType: sname = ps_media_mpeg; break; 00903 case MusicMediaType: sname = ps_media_music; break; 00904 case TimeCodeMediaType: sname = ps_media_timecode; break; 00905 case SpriteMediaType: sname = ps_media_sprite; break; 00906 case FlashMediaType: sname = ps_media_flash; break; 00907 case MovieMediaType: sname = ps_media_movie; break; 00908 case TweenMediaType: sname = ps_media_tween; break; 00909 case ThreeDeeMediaType: sname = ps_media_3d; break; 00910 case kQTVRQTVRType: sname = ps_media_qtvr; break; 00911 case kQTVRPanoramaType: sname = ps_media_qtvrpano; break; 00912 case kQTVRObjectType: sname = ps_media_qtvrobject; break; 00913 } 00914 00915 if (!sname) 00916 sname = ps_media_unknown; 00917 00918 return sname; 00919 } 00920 00921 long jit_qt_utils_sym2mediatype(t_symbol *s) 00922 { 00923 long type; 00924 00925 if (s == ps_media_video) type = VideoMediaType; 00926 else if (s == ps_media_sound) type = SoundMediaType; 00927 else if (s == ps_media_text) type = TextMediaType; 00928 else if (s == ps_media_base) type = BaseMediaType; 00929 else if (s == ps_media_mpeg) type = MPEGMediaType; 00930 else if (s == ps_media_music) type = MusicMediaType; 00931 else if (s == ps_media_timecode) type = TimeCodeMediaType; 00932 else if (s == ps_media_sprite) type = SpriteMediaType; 00933 else if (s == ps_media_flash) type = FlashMediaType; 00934 else if (s == ps_media_movie) type = MovieMediaType; 00935 else if (s == ps_media_tween) type = TweenMediaType; 00936 else if (s == ps_media_3d) type = ThreeDeeMediaType; 00937 else if (s == ps_media_qtvr) type = kQTVRQTVRType; 00938 else if (s == ps_media_qtvrpano) type = kQTVRPanoramaType; 00939 else if (s == ps_media_qtvrobject) type = kQTVRObjectType; 00940 else { 00941 char typestr[5]; 00942 long i, max; 00943 00944 max = (strlen(s->s_name) < 4) ? strlen(s->s_name) : 4; 00945 00946 for (i = 0; i < max; i++) { 00947 typestr[i] = s->s_name[i]; 00948 } 00949 for ( ; i < 4; i++) 00950 typestr[i] = 32; 00951 typestr[4] = 0; 00952 00953 strcpy(typestr, s->s_name); 00954 if (typestr[3] == '\0') typestr[3] = ' '; 00955 type = (typestr[0] << 24L) + (typestr[1] << 16L) + (typestr[2] << 8L) + (typestr[3]); 00956 } 00957 00958 return type; 00959 } 00960 00961 double jit_qt_utils_double_BtoN(double d) 00962 { 00963 #if WIN_VERSION 00964 double temp; 00965 char *a, *b; 00966 00967 a = (char *)&d; 00968 b = (char *)&temp; 00969 00970 b[0] = a[7]; 00971 b[1] = a[6]; 00972 b[2] = a[5]; 00973 b[3] = a[4]; 00974 b[4] = a[3]; 00975 b[5] = a[2]; 00976 b[6] = a[1]; 00977 b[7] = a[0]; 00978 00979 return temp; 00980 #else 00981 return d; 00982 #endif 00983 } 00984 00985 double jit_qt_utils_double_NtoB(double d) 00986 { 00987 #if WIN_VERSION 00988 double temp; 00989 char *a, *b; 00990 00991 a = (char *)&d; 00992 b = (char *)&temp; 00993 00994 b[0] = a[7]; 00995 b[1] = a[6]; 00996 b[2] = a[5]; 00997 b[3] = a[4]; 00998 b[4] = a[3]; 00999 b[5] = a[2]; 01000 b[6] = a[1]; 01001 b[7] = a[0]; 01002 01003 return temp; 01004 #else 01005 return d; 01006 #endif 01007 } 01008 01009 void jit_qt_utils_doiter_atom(QTAtomContainer parent, QTAtom child, long *level); 01010 void jit_qt_utils_doiter_atom(QTAtomContainer parent, QTAtom child, long *level) 01011 { 01012 QTAtom at = 0L; 01013 long ct = 0; 01014 long l = *level; 01015 char pfx[256] = ""; 01016 01017 while(l--) 01018 strcat(pfx, "-"); 01019 01020 ct = QTCountChildrenOfType(parent, child, 0); 01021 post("ct %d", ct); 01022 while (ct--) { 01023 QTNextChildAnyType(parent, child, at, &at); 01024 if (at) { 01025 long type; 01026 long id; 01027 char str[5]; 01028 // long size; 01029 // Ptr p; 01030 01031 if (!QTGetAtomTypeAndID(parent, at, &type, &id)) { 01032 jit_qt_utils_type2str(type, str); 01033 // QTGetAtomDataPtr(parent, at, &size, &p); 01034 // post("%s%d: %s, id %d [size: %d]", pfx, ct + 1, str, id, size); 01035 post("%s%d: %s, id %d", pfx, ct + 1, str, id); 01036 /* if (p) { 01037 char c[1024] = "0x"; 01038 char tmp[2]; 01039 long i; 01040 01041 for (i = 0; i < size; i++) { 01042 sprintf(tmp, "%x", p[i]); 01043 strcat(c, tmp); 01044 } 01045 jit_object_post((t_object *)x,"%s", c); 01046 } 01047 */ 01048 if (QTCountChildrenOfType(parent, at, 0)) { 01049 post("%spush", pfx); 01050 (*level)++; 01051 jit_qt_utils_doiter_atom(parent, at, level); 01052 (*level)--; 01053 post("%spop", pfx); 01054 } 01055 } 01056 } 01057 } 01058 } 01059 01060 void jit_qt_utils_iter_atom(QTAtomContainer parent, QTAtom child) 01061 { 01062 long level = 1; 01063 long type; 01064 long id; 01065 char str[5]; 01066 01067 if (!QTGetAtomTypeAndID(parent, child, &type, &id)) { 01068 jit_qt_utils_type2str(type, str); 01069 post("Iterating QTAtom %s, id %d", str, id); 01070 jit_qt_utils_doiter_atom(parent, child, &level); 01071 post("Iteration Done."); 01072 } 01073 } 01074 01075 void jit_qt_utils_atomcontainer_new(void **atc) 01076 { 01077 if (atc) 01078 QTNewAtomContainer((QTAtomContainer *)atc); 01079 } 01080 01081 void jit_qt_utils_atomcontainer_dispose(void *atc) 01082 { 01083 if (atc) 01084 QTDisposeAtomContainer((QTAtomContainer)atc); 01085 }
Copyright © 2008, Cycling '74