static int WriteMetadataChunk(FILE* const out, const char fourcc[4], const MetadataPayload* const payload) { const uint8_t zero = 0; const size_t need_padding = payload->size & 1; int ok = (fwrite(fourcc, kTagSize, 1, out) == 1); ok = ok && WriteLE32(out, (uint32_t)payload->size); ok = ok && (fwrite(payload->bytes, payload->size, 1, out) == 1); return ok && (fwrite(&zero, need_padding, need_padding, out) == need_padding); }
void inline Write8(unsigned char* out, int offset, __m256i v) { v = _mm256_shuffle_epi8(v, _mm256_set_epi32(0x0C0D0E0FUL, 0x08090A0BUL, 0x04050607UL, 0x00010203UL, 0x0C0D0E0FUL, 0x08090A0BUL, 0x04050607UL, 0x00010203UL)); WriteLE32(out + 0 + offset, _mm256_extract_epi32(v, 7)); WriteLE32(out + 32 + offset, _mm256_extract_epi32(v, 6)); WriteLE32(out + 64 + offset, _mm256_extract_epi32(v, 5)); WriteLE32(out + 96 + offset, _mm256_extract_epi32(v, 4)); WriteLE32(out + 128 + offset, _mm256_extract_epi32(v, 3)); WriteLE32(out + 160 + offset, _mm256_extract_epi32(v, 2)); WriteLE32(out + 192 + offset, _mm256_extract_epi32(v, 1)); WriteLE32(out + 224 + offset, _mm256_extract_epi32(v, 0)); }
uint32_t hsStream::WriteSafeWStringLong(const plString &string) { plStringBuffer<uint16_t> wbuff = string.ToUtf16(); uint32_t len = wbuff.GetSize(); WriteLE32(len); if (len > 0) { const uint16_t *buffp = wbuff.GetData(); for (uint32_t i=0; i<len; i++) { WriteLE16(~buffp[i]); } WriteLE16(static_cast<uint16_t>(0)); } return 0; }
bool CZMQAbstractPublishNotifier::SendMessage(const char *command, const void* data, size_t size) { assert(psocket); /* send three parts, command & data & a LE 4byte sequence number */ unsigned char msgseq[sizeof(uint32_t)]; WriteLE32(&msgseq[0], nSequence); int rc = zmq_send_multipart(psocket, command, strlen(command), data, size, msgseq, (size_t)sizeof(uint32_t), nullptr); if (rc == -1) return false; /* increment memory only sequence number after sending */ nSequence++; return true; }
uint32_t hsStream::WriteSafeStringLong(const plString &string) { uint32_t len = string.GetSize(); WriteLE32(len); if (len > 0) { const char *buffp = string.c_str(); uint32_t i; for (i = 0; i < len; i++) { WriteByte(~buffp[i]); } return i; } else return 0; }
// Writes a WebP file using the image contained in 'memory_writer' and the // metadata from 'metadata'. Metadata is controlled by 'keep_metadata' and the // availability in 'metadata'. Returns true on success. // For details see doc/webp-container-spec.txt#extended-file-format. static int WriteWebPWithMetadata(FILE* const out, const WebPPicture* const picture, const WebPMemoryWriter* const memory_writer, const Metadata* const metadata, int keep_metadata, int* const metadata_written) { const char kVP8XHeader[] = "VP8X\x0a\x00\x00\x00"; const int kAlphaFlag = 0x10; const int kEXIFFlag = 0x08; const int kICCPFlag = 0x20; const int kXMPFlag = 0x04; const size_t kRiffHeaderSize = 12; const size_t kMaxChunkPayload = ~0 - kChunkHeaderSize - 1; const size_t kMinSize = kRiffHeaderSize + kChunkHeaderSize; uint32_t flags = 0; uint64_t metadata_size = 0; const int write_exif = UpdateFlagsAndSize(&metadata->exif, !!(keep_metadata & METADATA_EXIF), kEXIFFlag, &flags, &metadata_size); const int write_iccp = UpdateFlagsAndSize(&metadata->iccp, !!(keep_metadata & METADATA_ICC), kICCPFlag, &flags, &metadata_size); const int write_xmp = UpdateFlagsAndSize(&metadata->xmp, !!(keep_metadata & METADATA_XMP), kXMPFlag, &flags, &metadata_size); uint8_t* webp = memory_writer->mem; size_t webp_size = memory_writer->size; *metadata_written = 0; if (webp_size < kMinSize) return 0; if (webp_size - kChunkHeaderSize + metadata_size > kMaxChunkPayload) { fprintf(stderr, "Error! Addition of metadata would exceed " "container size limit.\n"); return 0; } if (metadata_size > 0) { const int kVP8XChunkSize = 18; const int has_vp8x = !memcmp(webp + kRiffHeaderSize, "VP8X", kTagSize); const uint32_t riff_size = (uint32_t)(webp_size - kChunkHeaderSize + (has_vp8x ? 0 : kVP8XChunkSize) + metadata_size); // RIFF int ok = (fwrite(webp, kTagSize, 1, out) == 1); // RIFF size (file header size is not recorded) ok = ok && WriteLE32(out, riff_size); webp += kChunkHeaderSize; webp_size -= kChunkHeaderSize; // WEBP ok = ok && (fwrite(webp, kTagSize, 1, out) == 1); webp += kTagSize; webp_size -= kTagSize; if (has_vp8x) { // update the existing VP8X flags webp[kChunkHeaderSize] |= (uint8_t)(flags & 0xff); ok = ok && (fwrite(webp, kVP8XChunkSize, 1, out) == 1); webp += kVP8XChunkSize; webp_size -= kVP8XChunkSize; } else { const int is_lossless = !memcmp(webp, "VP8L", kTagSize); if (is_lossless) { // Presence of alpha is stored in the 29th bit of VP8L data. if (webp[kChunkHeaderSize + 3] & (1 << 5)) flags |= kAlphaFlag; } ok = ok && (fwrite(kVP8XHeader, kChunkHeaderSize, 1, out) == 1); ok = ok && WriteLE32(out, flags); ok = ok && WriteLE24(out, picture->width - 1); ok = ok && WriteLE24(out, picture->height - 1); } if (write_iccp) { ok = ok && WriteMetadataChunk(out, "ICCP", &metadata->iccp); *metadata_written |= METADATA_ICC; } // Image ok = ok && (fwrite(webp, webp_size, 1, out) == 1); if (write_exif) { ok = ok && WriteMetadataChunk(out, "EXIF", &metadata->exif); *metadata_written |= METADATA_EXIF; } if (write_xmp) { ok = ok && WriteMetadataChunk(out, "XMP ", &metadata->xmp); *metadata_written |= METADATA_XMP; } return ok; } else { // No metadata, just write the original image file. return (fwrite(webp, webp_size, 1, out) == 1); } }
/* load 82M object to AGG::Cache in Audio::CVT */ void AGG::Cache::LoadWAV(const M82::m82_t m82) { std::vector<u8> & v = wav_cache[m82]; if(v.size() || !Mixer::isValid()) return; #ifdef WITH_MIXER const Settings & conf = Settings::Get(); if(conf.UseAltResource()) { std::string name(M82::GetString(m82)); String::Lower(name); // ogg String::Replace(name, ".82m", ".ogg"); std::string sound = conf.LocalPrefix() + SEPARATOR + "files" + SEPARATOR + "sounds" + SEPARATOR + name; if(StoreFileToMem(v, sound)) { DEBUG(DBG_ENGINE , DBG_INFO, "AGG::Cache::LoadWAV: " << sound); return; } // mp3 String::Replace(name, ".82m", ".mp3"); sound = conf.LocalPrefix() + SEPARATOR + "files" + SEPARATOR + "sounds" + SEPARATOR + name; if(StoreFileToMem(v, sound)) { DEBUG(DBG_ENGINE , DBG_INFO, "AGG::Cache::LoadWAV: " << sound); return; } } #endif DEBUG(DBG_ENGINE , DBG_INFO, "AGG::Cache::LoadWAV: " << M82::GetString(m82)); std::vector<u8> body; #ifdef WITH_MIXER if(ReadChunk(M82::GetString(m82), body)) { // create WAV format v.resize(body.size() + 44); WriteLE32(&v[0], 0x46464952); // RIFF WriteLE32(&v[4], body.size() + 0x24); // size WriteLE32(&v[8], 0x45564157); // WAVE WriteLE32(&v[12], 0x20746D66); // FMT WriteLE32(&v[16], 0x10); // size_t WriteLE16(&v[20], 0x01); // format WriteLE16(&v[22], 0x01); // channels WriteLE32(&v[24], 22050); // samples WriteLE32(&v[28], 22050); // byteper WriteLE16(&v[32], 0x01); // align WriteLE16(&v[34], 0x08); // bitsper WriteLE32(&v[36], 0x61746164); // DATA WriteLE32(&v[40], body.size()); // size std::copy(body.begin(), body.end(), &v[44]); } #else Audio::Spec wav_spec; wav_spec.format = AUDIO_U8; wav_spec.channels = 1; wav_spec.freq = 22050; const Audio::Spec & hardware = Audio::GetHardwareSpec(); Audio::CVT cvt; if(cvt.Build(wav_spec, hardware) && ReadChunk(M82::GetString(m82), body)) { const u32 size = cvt.len_mult * body.size(); cvt.buf = new u8[size]; cvt.len = body.size(); memcpy(cvt.buf, &body[0], body.size()); cvt.Convert(); v.assign(cvt.buf, cvt.buf + size - 1); delete [] cvt.buf; cvt.buf = NULL; } #endif }