home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / exampleCode / video / security / movie.C < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  10.2 KB  |  394 lines

  1. /*
  2.  * Copyright (C) 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. #include "movie.h"
  18. #include <cl.h>
  19. #include <qt.h>
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include <unistd.h>
  23.  
  24. #ifdef DEBUG
  25. #define dprintf printf
  26. #else
  27. #define dprintf 0&& 
  28. #endif
  29.  
  30.  
  31. Movie::Movie()
  32. {
  33.   dprintf("Movie\n");
  34.   _movieID = _imageID = _audioID = NULL;
  35.   _width = _height = 0;
  36.   _numFrames = _numAudio = 0;
  37.   _rate = 0.0;
  38.   _movieName = NULL;
  39.   _compressType = NULL;
  40.   _optimizeMovie = FALSE;
  41.   startFrame();
  42. }
  43.  
  44. Movie::~Movie()
  45. {
  46.   dprintf("end Movie\n");
  47.   if(_movieName) free(_movieName);
  48.   if(_compressType) free (_compressType);
  49. }
  50.  
  51. void Movie::addAudio(Audio *audio)
  52. {
  53.   DMparams *params;
  54.   if(!audio) return;
  55.   dprintf("addAudio\n");
  56.   if(!getAudioID()){
  57.     if(dmParamsCreate(¶ms) != DM_SUCCESS){
  58.       fprintf(stderr,"Unable to create audio params.\n");
  59.       return;
  60.     }
  61.     if(dmSetAudioDefaults(params, audio->getBytesPerSample() * 8,
  62.               (double)audio->getRate(),
  63.               audio->getNumChannels()) != DM_SUCCESS){
  64.       fprintf(stderr,"Unable to setup audio defaults.\n");
  65.     }
  66.     if(dmParamsSetEnum(params,
  67.                DM_AUDIO_FORMAT,
  68.                DM_AUDIO_TWOS_COMPLEMENT) != DM_SUCCESS){
  69.       fprintf(stderr,"Unable to set audio format\n");
  70.     }
  71.     if(mvAddTrack(_movieID, DM_AUDIO, params, NULL, &_audioID) != DM_SUCCESS){
  72.       fprintf(stderr,"Unable to add image track.\n");
  73.     }
  74.     dmParamsDestroy(params);
  75.     setNumAudio(0);
  76.   }
  77.  
  78.   int numSamples;
  79.   void *buf = audio->getAudio(numSamples);
  80.   mvInsertFrames(_audioID, getNumAudio(), numSamples, 
  81.          numSamples * audio->getBytesPerSample(), buf);
  82.   setNumAudio(getNumAudio() + numSamples);
  83. }
  84.  
  85. void *Movie::getFrame(int frameNo)
  86. {
  87.   void *buf;
  88.   dprintf("getFrame\n");
  89.   if(frameNo < 0) return NULL;
  90.   if(frameNo >= getNumFrames()) return NULL;
  91.   char *cbuf = new char[getFrameSize()];
  92.   buf = (void *)cbuf;
  93.   if(mvReadFrames(getImageID(), frameNo, 1, getFrameSize(), buf) != DM_SUCCESS){
  94.     fprintf(stderr,"Cannot read frame %d\n",frameNo);
  95.     return NULL;
  96.   }
  97.   return buf;
  98. }
  99.  
  100. int Movie::setFrame(MVframe frameNo, void *buf)
  101. {
  102.   MVframe currentFrame;
  103.   dprintf("setFrame\n");
  104.   currentFrame = (frameNo > 0) ? getNumFrames() : frameNo;
  105.   if(mvInsertFrames(getImageID(), currentFrame, 1, getFrameSize(), buf) != DM_SUCCESS){
  106.     fprintf(stderr,"Cannot insert frame %d\n",currentFrame);
  107.     mvDeleteFrames(getImageID(), currentFrame-1, 1);
  108.     return FALSE;
  109.   }
  110.   setNumFrames(mvGetTrackLength(getImageID()));
  111.   return TRUE;
  112. }
  113.  
  114. int Movie::setMovie(const char *name)
  115. {
  116.   DMparams *params;
  117.   dprintf("setMovie\n");
  118.   if(getMovieID()){
  119.     mvClose(getMovieID());
  120.     setMovieID(NULL);
  121.   }
  122.   if(_movieName){
  123.     free (_movieName);
  124.     _movieName = NULL;
  125.   }
  126.   if(!name) return -1;
  127.   _movieName = strdup(name);
  128.   if(!mvIsMovieFile(_movieName)) {
  129.     return -1;
  130.   }
  131.   if(mvOpenFile(_movieName,O_RDONLY,&_movieID) == DM_FAILURE){
  132.     fprintf(stderr,"Cannot open movie %s\n",_movieName);
  133.     return -1;
  134.   }
  135.   if(mvFindTrackByMedium(_movieID, DM_IMAGE, &_imageID) == DM_FAILURE){
  136.     setImageID(NULL);
  137.   }
  138.   if(mvFindTrackByMedium(_movieID, DM_AUDIO, &_audioID) == DM_FAILURE){
  139.     setAudioID(NULL);
  140.   }
  141.   if(getImageID() != NULL){
  142.     _numFrames = mvGetTrackLength(_imageID);
  143.     _width = mvGetImageWidth(_imageID);
  144.     _height = mvGetImageHeight(_imageID);
  145.     _rate = mvGetImageRate(_imageID);
  146.     params = mvGetParams(_imageID);
  147.     _frameSize = dmImageFrameSize(params);
  148.     if(_compressType) free(_compressType);
  149.     _compressType = strdup(mvGetImageCompression(_imageID));
  150.   }else{
  151.     _numFrames = _width = _height = _frameSize = 0;
  152.     _rate = 0.0;
  153.     if(_compressType) free(_compressType);
  154.     _compressType = NULL;
  155.   }
  156.   if(_audioID != NULL){
  157.     _numAudio = mvGetTrackLength(_audioID);
  158.   }else{
  159.     _numAudio = 0;
  160.   }
  161.   startFrame();
  162.   return 0;
  163. }
  164.  
  165. void Movie::setImageID(MVid m) 
  166. {
  167.   dprintf("setImageID\n");
  168.   _imageID = m;
  169.   if(m != NULL){
  170.     _width = mvGetImageWidth(m);
  171.     _height = mvGetImageHeight(m);
  172.     _frameSize = dmImageFrameSize(mvGetParams(m));
  173.     _compressType = strdup(mvGetImageCompression(m));
  174.     _rate = mvGetImageRate(m);
  175.   }else{
  176.     _width = _height = _frameSize = 0;
  177.     _numFrames = 0;
  178.     _rate = 0.0;
  179.     if(_compressType) free(_compressType);
  180.     _compressType = NULL;
  181.   }
  182. }
  183.  
  184. void Movie::setAudioID(MVid m) 
  185. {
  186.   dprintf("setAudioID\n");
  187.   _audioID = m;
  188.   if(m != NULL){
  189.     _numAudio = mvGetTrackLength(_audioID);
  190.   }
  191. }
  192.  
  193. void Movie::setMovieID(MVid m) 
  194. {
  195.   dprintf("setMovieID\n");
  196.   _movieID = m;
  197.   setAudioID(NULL);
  198.   setImageID(NULL);
  199.   _width = _height = 0;
  200.   _numFrames = 0;
  201.   _movieName = NULL;
  202.   _rate = 0.0;
  203.   _compressType = NULL;
  204.   startFrame();
  205. }
  206.  
  207. char *
  208. Movie::getCompressionType()
  209. {
  210.   if(_compressType) return strdup(_compressType);
  211.   return NULL;
  212. }
  213.  
  214. char *
  215. Movie::getName()
  216. {
  217.   if(_movieName) return strdup(_movieName);
  218.   return NULL;
  219. }
  220.  
  221.  
  222. NewMovie::NewMovie(const char *name, double r, int w, int h, const char *c  )
  223. {
  224.   DMparams *params;
  225.   dprintf("NewMovie\n");
  226.   if(dmParamsCreate(¶ms) != DM_SUCCESS){
  227.     fprintf(stderr,"Unable to create params.\n");
  228.   }
  229.   MVfileformat mformat = MV_FORMAT_SGI_3;
  230.   if(strncmp("Apple ",c,6) == 0) mformat = MV_FORMAT_QT;
  231.  
  232.   if(mvSetMovieDefaults(params,mformat) != DM_SUCCESS){
  233.     fprintf(stderr,"Unable to set params.\n");
  234.   }
  235.   if(mvCreateFile(name, params, NULL,&_movieID) != DM_SUCCESS){
  236.     fprintf(stderr,"Unable to create file.\n");
  237.   }
  238.   dmParamsDestroy(params);
  239.   _movieName = strdup(name);
  240.   if(dmParamsCreate(¶ms) != DM_SUCCESS){
  241.     fprintf(stderr,"Unable to create params.\n");
  242.   }
  243.   _width = w;
  244.   _height = h;
  245.   if(dmSetImageDefaults(params, w, h, DM_PACKING_RGBX) != DM_SUCCESS){
  246.     fprintf(stderr,"Unable to setup image defaults.\n");
  247.   }
  248.   _frameSize = dmImageFrameSize(params);
  249.   if(dmParamsSetString(params, DM_IMAGE_COMPRESSION, c) != DM_SUCCESS){
  250.     fprintf(stderr,"Unable to set compression.\n");
  251.   }
  252.   _rate = r;
  253.   if(dmParamsSetFloat(params, DM_IMAGE_RATE, r) != DM_SUCCESS){
  254.     fprintf(stderr,"Unable to set rate.\n");
  255.   }
  256.   if(mvAddTrack(_movieID, DM_IMAGE, params, NULL,&_imageID) != DM_SUCCESS){
  257.     fprintf(stderr,"Unable to add image track.\n");
  258.   }
  259.   dmParamsDestroy(params);
  260.   if(_imageID) _compressType = strdup(mvGetImageCompression(_imageID));
  261.   _numFrames = 0;
  262.   startFrame();
  263. }
  264.  
  265. NewMovie::NewMovie(Movie *oldMovie, const char *name)
  266. {
  267.   MVid oldID;
  268.   DMparams *params;
  269.   dprintf("NewMovie\n");
  270.   if(dmParamsCreate(¶ms) != DM_SUCCESS){
  271.     fprintf(stderr,"Unable to create video params.\n");
  272.     return;
  273.   }
  274.   oldID = oldMovie->getMovieID();
  275.   MVfileformat mformat = MV_FORMAT_SGI_3;
  276.   if(strncmp("Apple",oldMovie->getCompressionType(),6) == 0){
  277.     mformat = MV_FORMAT_QT;
  278.   }
  279.   if(mvSetMovieDefaults(params,mformat) != DM_SUCCESS){
  280.     fprintf(stderr,"Cannot set movie defaults,\n");
  281.     return;
  282.   }
  283.   if(mvCreateFile(name,params,NULL,&_movieID) != DM_SUCCESS){
  284.     fprintf(stderr,"Cannot create movie.\n");
  285.     return;
  286.   }
  287.   if(mvSetLoopMode(_movieID,mvGetLoopMode(oldID)) != DM_SUCCESS){
  288.     fprintf(stderr,"Cannot set loop mode.\n");
  289.     return;
  290.   }
  291.   if(mvSetLoopLimit(_movieID,mvGetLoopLimit(oldID)) != DM_SUCCESS){
  292.     fprintf(stderr,"Cannot set loop limit.\n");
  293.     return;
  294.   }
  295.   dmParamsDestroy(params);
  296.   _movieName = strdup(name);
  297.   _width = oldMovie->getWidth();
  298.   _height = oldMovie->getHeight();
  299.   if(dmSetImageDefaults(params, _width, _height, DM_PACKING_RGBX) != DM_SUCCESS){
  300.     fprintf(stderr,"Unable to setup image defaults.\n");
  301.   }
  302.   _frameSize = dmImageFrameSize(params);
  303.   if(dmParamsSetString(params,
  304.                DM_IMAGE_COMPRESSION,
  305.                oldMovie->getCompressionType()) != DM_SUCCESS){
  306.     fprintf(stderr,"Unable to set compression.\n");
  307.   }
  308.   if(mvAddTrack(_movieID, DM_IMAGE, params, NULL,&_imageID) != DM_SUCCESS){
  309.     fprintf(stderr,"Unable to add image track.\n");
  310.   }
  311.   dmParamsDestroy(params);
  312.   if(_imageID) _compressType = strdup(mvGetImageCompression(_imageID));
  313.   _numFrames = 0;
  314.   startFrame();
  315. }
  316.            
  317. NewMovie::~NewMovie()
  318. {
  319.   char str[128];
  320.   Audio *audio;
  321.   dprintf("end NewMovie\n");
  322. //
  323. // reset the frame rate to be the closest given the audio that
  324. // has been grabbed
  325. //
  326.   if(getNumFrames() == 0) {
  327.     mvClose(_movieID);
  328.     unlink (_movieName);
  329.     if(_movieName)free (_movieName);
  330.     _movieName = NULL;
  331.     if(_compressType) free(_compressType);
  332.     _compressType = NULL;
  333.     return;
  334.   }
  335.   audio = NULL;
  336.   if(getNumAudio() > 0){
  337.     audio = new Audio();
  338.     double rate = getNumFrames() / ( (float)getNumAudio() / audio->getRate() );
  339.     if(mvSetImageRate(_imageID, rate) != DM_SUCCESS){
  340.       fprintf(stderr,"Cannot update image rate to %f\n",rate);
  341.     }
  342.   }
  343.   if(mvGetFileFormat(_movieID) != MV_FORMAT_SGI_3){
  344.     mvClose(_movieID);
  345.   }else{
  346.     if(_optimizeMovie){
  347.       MVid optID;
  348.       sprintf(str,"%s.tmp",_movieName);
  349.       if(mvCreateFile(str,mvGetParams(_movieID),NULL,&optID) != DM_SUCCESS){
  350.     fprintf(stderr,"Unable to open opt file.\n");
  351.     mvClose(_movieID);
  352.       }else{
  353.     if(mvOptimize(_movieID, optID) != DM_SUCCESS){
  354.       fprintf(stderr,"Unable to optimize movie.\n");
  355.       fprintf(stderr,"Movie:%s\n",mvGetErrorStr(mvGetErrno()));
  356.       mvClose(optID);
  357.       mvClose(_movieID);
  358.       unlink(str);
  359.     }else{
  360.       mvClose(optID);
  361.       mvClose(_movieID);
  362.       rename(str,_movieName);
  363.     }
  364.       }
  365.     }else{
  366.       mvClose(_movieID);
  367.     }
  368.   }
  369.   if(_movieName)free (_movieName);
  370.   _movieName = NULL;
  371.   if(_compressType) free(_compressType);
  372.   _compressType = NULL;
  373.   delete audio;
  374. }
  375.  
  376. OldMovie::OldMovie(const char *name)
  377. {
  378.   dprintf("OldMovie\n");
  379.   if(setMovie(name) < 0){
  380.     _movieName = NULL;
  381.   }
  382. }
  383.  
  384. OldMovie::~OldMovie()
  385. {
  386.   dprintf("end OldMovie\n");
  387.   mvClose(_movieID);
  388.   if(_movieName)free (_movieName);
  389.   _movieName = NULL;
  390.   if(_compressType) free(_compressType);
  391.   _compressType = NULL;
  392. }
  393.  
  394.