Esempio n. 1
0
int main( int argc, char *argv[] ) {
  Param *inputParamFile;
  int temp;
  int type = 0;  // 0 = roq, 1 = decode images to dir, 2 = save images from mpeg for codebooking
  int encodeQuietly = 0;
  char *paramname = NULL;
  char *decodeDir = NULL;
  ParamImSeq *imSeq;
  TagTable *image;
  char filename[1024 + 1];
  
  printf("%s\nroq video file maker\n(c) 1995 Trilobyte, Inc.\nBuid Date: "__DATE__"\n", argv[0]);
  
  
  if ( argc < 2 ) {
	printf("use: roq file.param -q(quiet) -d dir (decode param's images to dir)\n");
	exit(1);
  }
  
  for (temp=1;temp<argc; temp++)
	{
	  if (strncasecmp(argv[temp], "-q", 2) == 0)
		{
		  encodeQuietly = 1;
		}
	  else if (strncasecmp(argv[temp], "-d", 2) == 0)
		{
		  type = 1;
		  temp++;
		  if (temp>=argc)
			{
			  fprintf(stderr, "Error: must specify a directory to decode frames into\n");
			  exit(1);
			}
		  
		  decodeDir = argv[temp];
		}
  	  else if (strncasecmp(argv[temp], "-m", 2) == 0)
		{
		  type = 2;
		}
	  else
		{
		  if (paramname)
			{
			  fprintf(stderr, "Error: can only roq one param at a time\n");
			  exit(2);
			}
		  paramname = argv[temp];
		}
	}	  
  if (!paramname)
	{
	  fprintf(stderr, "Error: no param\n");
	  exit(3);
	}
  
  inputParamFile = ParamNewFromFile(paramname);

  if (type == 0)
	{
	  
	  RoqInit();
	  RoqEncodeQuietly(encodeQuietly); 
	  RoqInitRoQFile(ParamRoqTempFilename(inputParamFile), inputParamFile->fps);
	  RoqEncodeStream(inputParamFile);
	  RoqCloseRoQFile();
	  RoqFree();
	  ParamMoveFile(inputParamFile);
	  ParamFree(inputParamFile);
	}
  else if (type == 1)
	{
	  int frameCount = 0;
	  
	  imSeq = ParamImSeqNew(inputParamFile);
	  while (ParamImSeqMoreFrames(imSeq))
		{
		  image = ParamImSeqNextImage(imSeq);
		  sprintf(filename, "%s/%06d.jpg", decodeDir, frameCount);
		  printf("Saving file to %s\n", filename);
		  ZimWriteJFIF(image, filename, 95);
		  frameCount++;
		}
	}
  else if (type == 2)
	{
	  fprintf(stderr, "Not yet implemented\n");
	}
  return 0;
}
Esempio n. 2
0
TagTable *ParamImSeqNextImageFromParam(ParamImSeq *self)
{
  const char *str;
  char *ext;
  TagTable  *nextImage = NULL, *unusedImage;
  int mpegSkipNum;
  
  if (self->mpeg)
	{
	  if (MpegDecoderMoreFrames(self->mpeg))
		{
		  nextImage = MpegDecoderNextImage(self->mpeg);
		  if (self->skipFields)
			{
			  sprintf(self->currentImageFilename, "%s%.06db",MpegDecoderCurrentFilename(self->mpeg),MpegDecoderBitstreamFrameNum(self->mpeg));
			}
		  else
			{
			  sprintf(self->currentImageFilename, "%s%.06d",MpegDecoderCurrentFilename(self->mpeg),MpegDecoderBitstreamFrameNum(self->mpeg));
			}
		  if (self->mpegSkipNum > 1)
			{  // skip the required number of images so we're primed for the next pass
			  mpegSkipNum = self->mpegSkipNum -1;
			  while (mpegSkipNum--)
				{
				  unusedImage = MpegDecoderNextImage(self->mpeg);
				  ZimFree(unusedImage);
				}
			}
		  
		  return nextImage;
		}
	  else
		{
		  MpegDecoderFree(self->mpeg);
		  self->mpeg = NULL;
		}
	}
  if (ParamMoreFrames(self->param) == YES)
	{
	  str =  ParamGetNextImageFilename(self->param);
	}
  else
	{
	  return NULL;
	}
  if ((str == NULL) || (str[0] == '\0'))
	{
	  return NULL;
	}
  else
	{
	  strcpy(self->currentImageFilename, str);
	}
  if( (ext = strstr(self->currentImageFilename , ".mpg")) || (ext = strstr(self->currentImageFilename, ".m2v")))
	{
	  char *margv[] = 
		{
		  "mpegstream", "-b", NULL, "-r", "-o6", "-v0", NULL, NULL
		};
	  int margc = 6;
	  char *fn;	  
	  char *frameNum;

	  self->mpegFirstFrame = 0;
	  self->mpegLastFrame = 999999;
	  self->mpegSkipNum = 1;
	  if (ext[4] != '\0')
		{
		  ParamGetCurrentRange(self->param, &self->mpegFirstFrame, &self->mpegLastFrame, &self->mpegSkipNum ,YES);
		  if (self->mpegLastFrame ==999999)  //we didn't have a range
		  {
		  	self->mpegLastFrame = atoi(&ext[4]);  //use the number by itself, only one frame
		  }
		}

	  fn = strdup(self->currentImageFilename);
	  frameNum = strrchr(fn, '.')+4;
	  *frameNum = '\0';//remove frame number so mpeg object can open the file
	  margv[2] = fn;
	  
	  if (! self->skipFields)  //specify frame flag
	  {
	  	margv[margc++] = "-f";
	  }
	  
	  self->mpeg = MpegDecoderNew(margc, margv, self->mpegFirstFrame, self->mpegLastFrame);
	  return ParamImSeqNextImage(self);/*in case it's an empty mpg...*/
	}
  else
	{
	  char *secondFilename,firstFilename[MAXPATHLEN+1];
	  TagTable *image1tt ;
	  ImVfb *img, *image1;
	  int fields;
	  
	  if (!(secondFilename= strchr(self->currentImageFilename,'\n')))
		{  //one filename, no compositing
			nextImage = ZimImageTagTableFromFile(self->currentImageFilename, "");
		}
	  else
		{
		  strncpy(firstFilename,self->currentImageFilename,secondFilename-self->currentImageFilename);
		  firstFilename[secondFilename-self->currentImageFilename]='\0';
		  secondFilename++;//point past the \n
		  image1tt = ZimImageTagTableFromFile(firstFilename, "");
		  nextImage = ZimImageTagTableFromFile(secondFilename, "");//result will be in here
		  TagEntryQValue(TagTableQDirect(image1tt, "image vfb", 0), &image1);
		  TagEntryQValue(TagTableQDirect(nextImage, "image vfb", 0), &img);		  
		  
		//image is the composite of those two
		  fields = IMRED | IMGREEN | IMBLUE;
		  if (ImVfbQFields(img) && IMVFBALPHA)
			{
			  fields |= IMALPHA;
			}
		  
		  ImVfbComp(image1, 0, 0, ImVfbQWidth(img), ImVfbQHeight(img), fields, IMCOMPOVER, img, 0, 0);
		  //free image1tt, it's not needed any more
		  ZimFree(image1tt);
		}
	}
  
  return nextImage;
}