unsigned int CNetLogRuntimeStruct::EncodeToBuffer(char* buffer, const unsigned int size)
{
	// Enter critical section
	CCritSection section(&m_section);

	// Get output data size
	unsigned int sz = GetEncodedSize();

	if(sz <= size)
	{
		// Encode properties
		LogProperties::iterator index;
		char* current = buffer;
		for(index = m_props.begin(); index != m_props.end(); ++index)
		{
			memcpy(current, index->first.c_str(), index->first.length());
			current += index->first.length();
			*current = '\0';
			current++;
			CLogVariant logVariant(index->second.get());
			VARTYPE vt = logVariant.GetType();
			memcpy(current, &vt, sizeof(VARTYPE));
			current += sizeof(VARTYPE);
			unsigned int v_size = logVariant.GetSize();
			memcpy(current, &v_size, sizeof(unsigned int));
			current += sizeof(unsigned int);
			char* buf = logVariant.GetBuffer();
			memcpy(current, buf, v_size);
			current += v_size;
		}
		return sz;
	}
	else
		throw MCStreamException(_T("Buffer too small for encoding."));
}
bool COMXImage::CreateThumbnailFromSurface(unsigned char* buffer, unsigned int width, unsigned int height, 
    unsigned int format, unsigned int pitch, const CStdString& destFile)
{
  if(format != XB_FMT_A8R8G8B8 || !buffer) {
    CLog::Log(LOGDEBUG, "%s::%s : %s failed format=0x%x\n", CLASSNAME, __func__, destFile.c_str(), format);
    return false;
  }

  if(!Encode(buffer, height * pitch, width, height, pitch)) {
    CLog::Log(LOGDEBUG, "%s::%s : %s encode failed\n", CLASSNAME, __func__, destFile.c_str());
    return false;
  }

  XFILE::CFile file;
  if (file.OpenForWrite(destFile, true))
  {
    CLog::Log(LOGDEBUG, "%s::%s : %s width %d height %d\n", CLASSNAME, __func__, destFile.c_str(), width, height);

    file.Write(GetEncodedData(), GetEncodedSize());
    file.Close();
    return true;
  }

  return false;
}
Example #3
0
bool COMXImage::CreateThumbnailFromSurface(unsigned char* buffer, unsigned int width, unsigned int height, 
    unsigned int format, unsigned int pitch, const CStdString& destFile)
{
  if(format != XB_FMT_A8R8G8B8 || !buffer)
    return false;

  // the omx encoder needs alligned sizes
  if(width%16 || height%16)
  {
    unsigned int new_width = (width + 15)&~15;
    unsigned int new_height = (height + 15)&~15;
    unsigned int new_pitch = new_width * 4;

    unsigned int size = new_height * new_pitch;
    unsigned char *dstBuffer = (unsigned char *)malloc(size);
    unsigned char *dst = dstBuffer;
    unsigned char *src = buffer;

    if(!dstBuffer)
      return false;

    memset(dst, 0x0, size);

    for(unsigned int y = 0; y < height; y++)
    {
      memcpy(dst, src, pitch);
      src += pitch;
      dst += new_pitch;
    }
    if(!Encode(dstBuffer, size, new_width, new_height))
    {
      free(dstBuffer);
      return false;
    }
    free(dstBuffer);
  }
  else
  {
    if(!Encode(buffer, height * pitch, width, height))
      return false;
  }

  XFILE::CFile file;
  if (file.OpenForWrite(destFile, true))
  {
    CLog::Log(LOGDEBUG, "%s::%s : %s width %d height %d\n", CLASSNAME, __func__, destFile.c_str(), width, height);

    file.Write(GetEncodedData(), GetEncodedSize());
    file.Close();
    return true;
  }

  return false;
}