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; }
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; }