home *** CD-ROM | disk | FTP | other *** search
/ QuickTime 2.0 Developer Kit / QuickTime 2.0 Developer Kit.iso / mac / MAC / Programming Stuff / Sample Code / Mixed Bag / Sample Components / ExportPICS.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-22  |  4.0 KB  |  152 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        ExportPICS.c
  3.  
  4.     Written by:    Peter Hoddie
  5.  
  6.     Copyright:    © 1992 by Apple Computer, Inc., all rights reserved.
  7.  
  8. */
  9.  
  10. #include <Resources.h>
  11. #include <SysEqu.h>
  12. #include <Movies.h>
  13. #include <QuickTimeComponents.h>
  14.  
  15. typedef struct {
  16.     ComponentInstance        self;
  17. } ExportPICSGlobalsRecord, *ExportPICSGlobals;
  18.  
  19. pascal ComponentResult ExportPICSDispatcher( ComponentParameters *params, Handle store );
  20. pascal ComponentResult ExportPICSOpen(ExportPICSGlobals store, ComponentInstance self);
  21. pascal ComponentResult ExportPICSClose(ExportPICSGlobals store, ComponentInstance self);
  22. pascal ComponentResult ExportPICSCanDo( ExportPICSGlobals store, short ftnNumber );
  23. pascal ComponentResult ExportPICSVersion( ExportPICSGlobals store );
  24.  
  25. pascal ComponentResult ExportPICSToFile(ExportPICSGlobals store, const FSSpec *theFile, 
  26.                 Movie m, Track onlyThisTrack, TimeValue startTime, TimeValue duration);
  27.  
  28. // entry point for all Component Manager requests
  29. pascal ComponentResult ExportPICSDispatcher(ComponentParameters *params, Handle storage)
  30. {
  31.     OSErr err = badComponentSelector;
  32.     ComponentFunction componentProc = 0;
  33.  
  34.     switch (params->what) {
  35.         case kComponentOpenSelect: componentProc = ExportPICSOpen; break;
  36.         case kComponentCloseSelect: componentProc = ExportPICSClose; break;
  37.         case kComponentCanDoSelect: componentProc = ExportPICSCanDo; break;
  38.         case kComponentVersionSelect: componentProc = ExportPICSVersion; break;
  39.         case kMovieExportToFileSelect: componentProc = ExportPICSToFile; break;
  40.     }
  41.  
  42.     if (componentProc)
  43.         err = CallComponentFunctionWithStorage(storage, params, componentProc);
  44.  
  45.     return err;
  46. }
  47.  
  48. pascal ComponentResult ExportPICSCanDo( ExportPICSGlobals store, short ftnNumber )
  49. {
  50.     switch (ftnNumber) {
  51.         case kComponentOpenSelect:
  52.         case kComponentCloseSelect:
  53.         case kComponentCanDoSelect:
  54.         case kComponentVersionSelect:
  55.         case kMovieExportToFileSelect:
  56.             return true;
  57.             break;
  58.         default:
  59.             return false;
  60.             break;
  61.     }
  62. }
  63.  
  64. pascal ComponentResult ExportPICSVersion( ExportPICSGlobals store )
  65. {
  66.     return 0x00010001;
  67. }
  68.  
  69. pascal ComponentResult ExportPICSOpen(ExportPICSGlobals store, ComponentInstance self)
  70. {
  71.     OSErr err;
  72.  
  73.     store = (ExportPICSGlobals)NewPtrClear(sizeof(ExportPICSGlobalsRecord));
  74.     if (err = MemError()) goto bail;
  75.     store->self = self;
  76.  
  77.     SetComponentInstanceStorage(self, (Handle)store);
  78. bail:
  79.     return err;
  80. }
  81.  
  82. pascal ComponentResult ExportPICSClose(ExportPICSGlobals store, ComponentInstance self)
  83. {
  84.     if (store) DisposPtr((Ptr)store);
  85.  
  86.     return noErr;
  87. }
  88.  
  89. pascal ComponentResult ExportPICSToFile(ExportPICSGlobals store, const FSSpec *theFile, 
  90.                 Movie m, Track onlyThisTrack, TimeValue startTime, TimeValue duration)
  91. {
  92.     OSErr err = noErr;
  93.     short resRef = 0;
  94.     short saveResRef = CurResFile();
  95.     short resID = 128;
  96.     PicHandle thePict = nil;
  97.  
  98.     // open up the resource fork of the PICS file (the caller is responsible
  99.     //    for creating the file)
  100.     resRef = FSpOpenResFile(theFile, fsRdWrPerm);
  101.     if (err = ResError()) goto bail;
  102.     UseResFile(resRef);
  103.  
  104.     // iterate through the movie time segment we were given
  105.     while (startTime < duration) {
  106.         Byte c = 0;
  107.  
  108.         if (onlyThisTrack)
  109.             thePict = GetTrackPict(onlyThisTrack, startTime);
  110.         else
  111.             thePict = GetMoviePict(m, startTime);
  112.  
  113.         if (!thePict) continue;
  114.  
  115.         // add a frame to the PICS file
  116.         AddResource((Handle)thePict, 'PICT', resID++, &c);
  117.         err = ResError();
  118.         WriteResource((Handle)thePict);
  119.         DetachResource((Handle)thePict);
  120.         KillPicture(thePict);
  121.         thePict = nil;
  122.         if (err) break;
  123.  
  124.         // find the time of the next frame
  125.         do {
  126.             TimeValue nextTime;
  127.  
  128.             if (onlyThisTrack)
  129.                 GetTrackNextInterestingTime(onlyThisTrack, nextTimeMediaSample, startTime, 
  130.                         kFix1, &nextTime, nil);
  131.             else {
  132.                 OSType mediaType = VisualMediaCharacteristic;
  133.     
  134.                 GetMovieNextInterestingTime(m, nextTimeMediaSample, 1, &mediaType, 
  135.                         startTime, kFix1, &nextTime, nil);
  136.             }
  137.             if (GetMoviesError()) goto bail;
  138.  
  139.             if (nextTime != startTime) {
  140.                 startTime = nextTime;
  141.                 break;
  142.             }
  143.         } while (++startTime < duration);
  144.     }
  145.  
  146. bail:
  147.     if (thePict) KillPicture(thePict);
  148.     if (resRef) CloseResFile(resRef);
  149.     UseResFile(saveResRef);
  150.     return err;
  151. }
  152.