Пример #1
0
	int PeerCon::handleGetPeerMessage(const PeerPacket& reqpk){
		int ret = 0;
		TimeRecorder t("PeerCon::handleGetMessage");
		//construct resp
		PeerPacket resppk;
		resppk.set_cmd(GET_PEER_MESSAGE_RESP);
		GetPeerMessageResponse* gresp = resppk.mutable_get_peer_msg_resp();
	
		const GetPeerMessageRequest& gmsgreq = reqpk.get_peer_msg_req();
		//get message from db
		const string& cid = gmsgreq.cid();
		int64 start_msgid = gmsgreq.start_msgid();
		int64 count = gmsgreq.count();	
		int64 lastmsgid = 0;
		vector<Message> msgs;

		std::stringstream os;
	
		gresp->set_last_msgid(0);

		if(!reqpk.has_get_peer_msg_req()){
			FormatErrorLog(getPackSN(), "get_peer_message");
			ret = INPUT_FORMAT_ERROR;
			goto exit;
		}	

		ret = getPeerMsg(cid, start_msgid, count, msgs, lastmsgid);
		
		if(ret < 0){
			PeerErrorLog(getPackSN(), "get_peer_message", cid, DB_ERROR);
			ret = ret;
			goto exit;
		}

		//construct resp
		gresp->set_last_msgid(lastmsgid);

		for(size_t i = 0; i < msgs.size(); ++i){
			Message* pm = gresp->add_msgs();	
			*pm = msgs[i];
			os << "<action:get_peer_message> <to:"
				<< cid << "> <from:" 
				<< msgs[i].from() << "> <msgid:"
				<< msgs[i].id() << "> <time:"
				<< msgs[i].time() << "> <msg_sn:"
				<< msgs[i].sn() << ">\n";
		}

		PLogTrace("PeerServer")
			<< "<action:handle_get_peer_message> <cid:" 
			<< cid << "> <start_msgid:" 
			<< start_msgid << "> <count:"
			<< count << "> <status:" << ret 
			<< "> <last_msgid:" << gresp->last_msgid() << "> <size:"
			<< gresp->msgs_size() << "> <errstr:" 
			<< getErrStr(ret) << ">";
		if(gresp->msgs_size())
			PLogTrace("PeerServer") << os.str();
		ret = 0;
exit:
		std::string payload;
		resppk.SerializeToString(&payload);

		ret = sendServiceResponse(ret, payload);	
		
		return ret;
	}
Пример #2
0
/*****************************
 *******   Image Reader ******
 ****************************/
ImageReader::ImageReader(const char * _base_name, const int _start, const int _end,
                         const float _fps, bool _use_DevIL, bool _info, const char * _pixel,
						 IScriptEnvironment* env)
 : base_name(), start(_start), use_DevIL(_use_DevIL), info(_info), framecopies(0)
{
  // Generate full name
  if (IsAbsolutePath(_base_name))
  {
    base_name[0] = '\0';
    strncat(base_name, _base_name, sizeof base_name);
  }
  else
  {
    char cwd[MAX_PATH + 1];
    GetWorkingDir(cwd, sizeof cwd);
    _snprintf(base_name, sizeof base_name, "%s%s", cwd, _base_name);
  }
  _snprintf(filename, sizeof filename, base_name, start);

  memset(&vi, 0, sizeof(vi));

  // Invariants
  vi.num_frames = -start + _end + 1;  // make sure each frame can be requested
  vi.audio_samples_per_second = 0;  
  double num = _fps;  // calculate fps as num/denom for vi
  int denom = 1;
  while (num < 16777216 && denom < 16777216) { num*=2; denom*=2; } // float mantissa is only 24 bits
  vi.fps_numerator = int(num+0.5);
  vi.fps_denominator = denom;
    
  // undecorated filename means they want a single, static image
  if( strcmp(filename, base_name) == 0 ) framecopies = vi.num_frames;

  if (use_DevIL == false)
  {
	fileHeader.bfType = 0;
	// Try to parse as bmp/ebmp
	ifstream file(filename, ios::binary);  
	file.read( reinterpret_cast<char *> (&fileHeader), sizeof(fileHeader) );
	file.read( reinterpret_cast<char *> (&infoHeader), sizeof(infoHeader) );
	file.close();

	if ( fileHeader.bfType == ('M' << 8) + 'B')
	{
	  if (infoHeader.biCompression != 0)
		  // use_DevIL = true; // Not a type we know, give it to DevIL
		  env->ThrowError("ImageReader: EBMP reader cannot handle compressed images.");

	  vi.width = infoHeader.biWidth;
	  vi.height = infoHeader.biHeight;

	  if (infoHeader.biPlanes == 1) {
		if (infoHeader.biBitCount == 32)
		  vi.pixel_type = VideoInfo::CS_BGR32;
		else if (infoHeader.biBitCount == 24)
		  vi.pixel_type = VideoInfo::CS_BGR24;
		else if (infoHeader.biBitCount == 16)
		  vi.pixel_type = VideoInfo::CS_YUY2;
		else
		  // use_DevIL = true; // Not a type we know, give it to DevIL
		  // DevIL 1.6.6 has a major coronary with palletted BMP files so don't fail thru to it
		  env->ThrowError("ImageReader: %d bit BMP is unsupported.", infoHeader.biBitCount);
	  }
	  else if (infoHeader.biPlanes == 3) {
		if (infoHeader.biBitCount == 12)
			vi.pixel_type = VideoInfo::CS_YV12;
		else
		  env->ThrowError("ImageReader: %d bit, 3 plane EBMP is unsupported.", infoHeader.biBitCount);
	  }
	  else
		env->ThrowError("ImageReader: %d plane BMP is unsupported.", infoHeader.biPlanes);

	  if (infoHeader.biWidth <= 0)
		// use_DevIL = true; // Not a type we know, give it to DevIL
		env->ThrowError("ImageReader: Unsupported width %d", infoHeader.biWidth);
	  if (infoHeader.biHeight <= 0)
		// use_DevIL = true; // Not a type we know, give it to DevIL
		env->ThrowError("ImageReader: Unsupported height %d", infoHeader.biHeight);
	}
	else {
	  use_DevIL = true; // Not a BMP, give it to DevIL
	}
  }

  if (use_DevIL == true) {  // attempt to open via DevIL

    ilInit();
    
    ILuint myImage=0;
    ilGenImages(1, &myImage);
    ilBindImage(myImage);

    ilLoadImage(filename);
    
    vi.width = ilGetInteger(IL_IMAGE_WIDTH);
    vi.height = ilGetInteger(IL_IMAGE_HEIGHT);

	if (!lstrcmpi(_pixel, "rgb")) {
	  vi.pixel_type = VideoInfo::CS_BGR32;
	} 
	else if (!lstrcmpi(_pixel, "rgb32")) {
	  vi.pixel_type = VideoInfo::CS_BGR32;
	} 
	else if (!lstrcmpi(_pixel, "rgb24")) {
	  vi.pixel_type = VideoInfo::CS_BGR24;
	}
	else {
	  env->ThrowError("ImageReader: supports the following pixel types: RGB24 or RGB32");
	}

    // Get errors if any
    // (note: inability to parse an (e)bmp will show up here as a DevIL error)
    ILenum err = ilGetError();

    ilDeleteImages(1, &myImage);

    if (err != IL_NO_ERROR)
    {
      ostringstream ss;
      ss << "ImageReader: error '" << getErrStr(err) << "' in DevIL library\n reading file " << filename;
      env->ThrowError(ss.str().c_str());
    }
    // work around DevIL upside-down bug with compressed images
	should_flip = false;
	const char * ext = strrchr(_base_name, '.') + 1;
	if (  !lstrcmpi(ext, "jpeg") || !lstrcmpi(ext, "jpg") || !lstrcmpi(ext, "jpe") || !lstrcmpi(ext, "dds") || 
		  !lstrcmpi(ext, "pal") || !lstrcmpi(ext, "pal") || !lstrcmpi(ext, "pcx") || !lstrcmpi(ext, "png") || 
		  !lstrcmpi(ext, "pbm") || !lstrcmpi(ext, "pgm") || !lstrcmpi(ext, "ppm") || !lstrcmpi(ext, "tga")    )
	{
	  should_flip = true;
	}
  }
}
Пример #3
0
PVideoFrame ImageReader::GetFrame(int n, IScriptEnvironment* env) 
{
  ILenum err = IL_NO_ERROR;

  PVideoFrame frame = env->NewVideoFrame(vi);
  BYTE * dstPtr = frame->GetWritePtr();
  BYTE * const WritePtr = dstPtr;
  
  const int pitch = frame->GetPitch();
  const int row_size = frame->GetRowSize();
  const int height = frame->GetHeight();
  const int width = vi.width;

  _snprintf(filename, sizeof filename, base_name, n+start);
  
  if (use_DevIL)  /* read using DevIL */
  {    
    // Setup
    ILuint myImage=0;
    ilGenImages(1, &myImage);
    ilBindImage(myImage);

    if (ilLoadImage(filename) == IL_FALSE) {
	  // Get errors if any
	  err = ilGetError();

	  // Cleanup
	  ilDeleteImages(1, &myImage);

	  memset(WritePtr, 0, pitch * height);  // Black frame
	  if ((info) || (err != IL_COULD_NOT_OPEN_FILE)) {
		ostringstream ss;
		ss << "ImageReader: error '" << getErrStr(err) << "' in DevIL library\n opening file \"" << filename << "\"";
		ApplyMessage(&frame, vi, ss.str().c_str(), vi.width/4, TEXT_COLOR,0,0 , env);
	  }
	  return frame;
	}

    // Check some parameters
    if ( ilGetInteger(IL_IMAGE_HEIGHT) != height)
    {
	  // Cleanup
	  ilDeleteImages(1, &myImage);

      memset(WritePtr, 0, pitch * height);       
      ApplyMessage(&frame, vi, "ImageReader: images must have identical heights", vi.width/4, TEXT_COLOR,0,0 , env);
      return frame;
    }    
    if ( ilGetInteger(IL_IMAGE_WIDTH) != width)
    {
	  // Cleanup
	  ilDeleteImages(1, &myImage);

      memset(WritePtr, 0, pitch * height);       
      ApplyMessage(&frame, vi, "ImageReader: images must have identical widths", vi.width/4, TEXT_COLOR,0,0 , env);
      return frame;
    }

	const ILenum il_format = vi.IsRGB32() ? IL_BGRA : IL_BGR;
	const ILenum linesize = width * (vi.IsRGB32() ? 4 : 3);

	// Copy raster to AVS frame
////if (ilGetInteger(IL_ORIGIN_MODE) == IL_ORIGIN_UPPER_LEFT, IL_ORIGIN_LOWER_LEFT ???
	if (should_flip)
	{
	  // Copy upside down
	  for (int y=height-1; y>=0; --y)
	  {
		if (ilCopyPixels(0, y, 0, width, 1, 1, il_format, IL_UNSIGNED_BYTE, dstPtr) > linesize)
		  break; // Try not to spew all over memory
		dstPtr += pitch;
	  }
	}
	else {
	  // Copy right side up
	  for (int y=0; y<height; ++y)
	  {
		if (ilCopyPixels(0, y, 0, width, 1, 1, il_format, IL_UNSIGNED_BYTE, dstPtr) > linesize)
		  break; // Try not to spew all over memory
		dstPtr += pitch;
	  }
	}

    // Get errors if any    
    err = ilGetError();

    // Cleanup
    ilDeleteImages(1, &myImage);

    if (err != IL_NO_ERROR)
    {
      memset(WritePtr, 0, pitch * height); 
      ostringstream ss;
      ss << "ImageReader: error '" << getErrStr(err) << "' in DevIL library\n reading file \"" << filename << "\"";
      ApplyMessage(&frame, vi, ss.str().c_str(), vi.width/4, TEXT_COLOR,0,0 , env);
      return frame;
    }
  }
  else {  /* treat as ebmp  */
    // Open file, ensure it has the expected properties
    ifstream file(filename, ios::binary);
    if (!checkProperties(file, frame, env)) {
	  file.close();
      return frame;
	}
    
    // Seek past padding
    file.seekg (fileHeader.bfOffBits, ios::beg); 

    // Read in raster
    if (0) // (vi.IsY8())
    {
	  // read upside down
	  BYTE * endPtr = dstPtr + pitch * (height-1);
	  fileRead(file, endPtr, -pitch, row_size, height);
	}
	else
    {
	  fileRead(file, dstPtr, pitch, row_size, height);

	  if (vi.IsPlanar())
	  {
		dstPtr = frame->GetWritePtr(PLANAR_U);
		const int pitchUV = frame->GetPitch(PLANAR_U); 
		const int row_sizeUV = frame->GetRowSize(PLANAR_U);
		const int heightUV = frame->GetHeight(PLANAR_U);
		fileRead(file, dstPtr, pitchUV, row_sizeUV, heightUV);

		dstPtr = frame->GetWritePtr(PLANAR_V);
		fileRead(file, dstPtr, pitchUV, row_sizeUV, heightUV);
	  }      
    }      

    file.close();
  }

  if (info) {    
    // overlay on video output: progress indicator
    ostringstream text;
    text << "Frame " << n << ".\nRead from \"" << filename << "\"";
    ApplyMessage(&frame, vi, text.str().c_str(), vi.width/4, TEXT_COLOR,0,0 , env);
  }

  return frame;
}
Пример #4
0
PVideoFrame ImageWriter::GetFrame(int n, IScriptEnvironment* env) 
{
  PVideoFrame frame = child->GetFrame(n, env);
  
  // check bounds
  if ((n<start)||(n>end))
  {
    if (info) {
      ostringstream ss;
      ss << "ImageWriter: frame " << n << " not in range";
      env->MakeWritable(&frame);
      ApplyMessage(&frame, vi, ss.str().c_str(), vi.width/4, TEXT_COLOR,0,0 , env);
    }
    return frame;  
  }

  // construct filename
  ostringstream fn_oss;
  fn_oss << base_name << setfill('0') << setw(6) << n << '.' << ext;
  string filename = fn_oss.str();

  if (!lstrcmpi(ext, "ebmp"))  /* Use internal 'ebmp' writer */
  {
    // initialize file object
    ofstream file(filename.c_str(), ios::out | ios::trunc | ios::binary);  
    if (!file)
    {
      ostringstream ss;
      ss << "ImageWriter: could not create file '" << filename << "'";
      env->MakeWritable(&frame);
      ApplyMessage(&frame, vi, ss.str().c_str(), vi.width/4, TEXT_COLOR,0,0 , env);
      return frame;
    }

    // write headers
    file.write(reinterpret_cast<const char *>( &fileHeader ), sizeof(BITMAPFILEHEADER));
    file.write(reinterpret_cast<const char *>( &infoHeader ), sizeof(BITMAPINFOHEADER));
    
    // write raster
    const BYTE * srcPtr = frame->GetReadPtr();
    int pitch = frame->GetPitch(); 
    int row_size = frame->GetRowSize();
    int height = frame->GetHeight();    
    
	if (0) // (vi.IsY8())
	{
	  // write upside down
	  const BYTE * endPtr = srcPtr + pitch * (height-1);
	  fileWrite(file, endPtr, -pitch, row_size, height);
	}
	else
	{
	  fileWrite(file, srcPtr, pitch, row_size, height);

	  if (vi.IsPlanar())
	  {
		srcPtr = frame->GetReadPtr(PLANAR_U);
		pitch = frame->GetPitch(PLANAR_U); 
		row_size = frame->GetRowSize(PLANAR_U);
		height = frame->GetHeight(PLANAR_U);
		fileWrite(file, srcPtr, pitch, row_size, height);

		srcPtr = frame->GetReadPtr(PLANAR_V);
		fileWrite(file, srcPtr, pitch, row_size, height);
	  }
    }

    // clean up
    file.close();
  }
  else { /* Use DevIL library */

    // Set up DevIL    
    ILuint myImage=0;
    ilGenImages(1, &myImage); // Initialize 1 image structure
    ilBindImage(myImage);     // Set this as the current image
    
	const ILenum il_format = vi.IsRGB32() ? IL_BGRA : IL_BGR;

    // Set image parameters
    if (IL_TRUE == ilTexImage(vi.width, vi.height, 1, vi.BitsPerPixel() / 8, il_format, IL_UNSIGNED_BYTE, NULL)) {

	  // Program actual image raster
	  const BYTE * srcPtr = frame->GetReadPtr();
	  int pitch = frame->GetPitch();
	  for (int y=0; y<vi.height; ++y)
	  {
		ilSetPixels(0, y, 0, vi.width, 1, 1, il_format, IL_UNSIGNED_BYTE, (void*) srcPtr);
		srcPtr += pitch;
	  }

	  // DevIL writer fails if the file exists, so delete first
	  DeleteFile(filename.c_str());
	  
	  // Save to disk (format automatically inferred from extension)
	  ilSaveImage(const_cast<char * const> (filename.c_str()) );
	}

    // Get errors if any
    ILenum err = ilGetError();
    
    // Clean up
    ilDeleteImages(1, &myImage);

    if (err != IL_NO_ERROR)
    {   
      ostringstream ss;
      ss << "ImageWriter: error '" << getErrStr(err) << "' in DevIL library\n writing file " << filename;
      env->MakeWritable(&frame);
      ApplyMessage(&frame, vi, ss.str().c_str(), vi.width/4, TEXT_COLOR,0,0 , env);
      return frame;
    }
  }  
    
  if (info) {    
    // overlay on video output: progress indicator
    ostringstream text;
    text << "Frame " << n << " written to: " << filename;
    env->MakeWritable(&frame);
    ApplyMessage(&frame, vi, text.str().c_str(), vi.width/4, TEXT_COLOR,0,0 , env);
  }
  
  return frame;
}