Lines Matching defs:mem
111 static int RemapMemBuffer(MemBuffer* const mem,
113 if (size < mem->buf_size_) return 0; // can't remap to a shorter buffer!
115 mem->buf_ = data;
116 mem->end_ = mem->buf_size_ = size;
120 static int InitMemBuffer(MemBuffer* const mem,
122 memset(mem, 0, sizeof(*mem));
123 return RemapMemBuffer(mem, data, size);
126 // Return the remaining data size available in 'mem'.
127 static WEBP_INLINE size_t MemDataSize(const MemBuffer* const mem) {
128 return (mem->end_ - mem->start_);
132 static WEBP_INLINE int SizeIsInvalid(const MemBuffer* const mem, size_t size) {
133 return (size > mem->riff_end_ - mem->start_);
136 static WEBP_INLINE void Skip(MemBuffer* const mem, size_t size) {
137 mem->start_ += size;
140 static WEBP_INLINE void Rewind(MemBuffer* const mem, size_t size) {
141 mem->start_ -= size;
144 static WEBP_INLINE const uint8_t* GetBuffer(MemBuffer* const mem) {
145 return mem->buf_ + mem->start_;
148 // Read from 'mem' and skip the read bytes.
149 static WEBP_INLINE uint8_t ReadByte(MemBuffer* const mem) {
150 const uint8_t byte = mem->buf_[mem->start_];
151 Skip(mem, 1);
155 static WEBP_INLINE int ReadLE16s(MemBuffer* const mem) {
156 const uint8_t* const data = mem->buf_ + mem->start_;
158 Skip(mem, 2);
162 static WEBP_INLINE int ReadLE24s(MemBuffer* const mem) {
163 const uint8_t* const data = mem->buf_ + mem->start_;
165 Skip(mem, 3);
169 static WEBP_INLINE uint32_t ReadLE32(MemBuffer* const mem) {
170 const uint8_t* const data = mem->buf_ + mem->start_;
172 Skip(mem, 4);
202 MemBuffer* const mem, Frame* const frame,
206 int done = (MemDataSize(mem) < min_size);
214 const size_t chunk_start_offset = mem->start_;
215 const uint32_t fourcc = ReadLE32(mem);
216 const uint32_t payload_size = ReadLE32(mem);
218 const size_t payload_available = (payload_size_padded > MemDataSize(mem))
219 ? MemDataSize(mem) : payload_size_padded;
223 if (SizeIsInvalid(mem, payload_size_padded)) return PARSE_ERROR;
224 if (payload_size_padded > MemDataSize(mem)) status = PARSE_NEED_MORE_DATA;
233 Skip(mem, payload_available);
247 WebPGetFeatures(mem->buf_ + chunk_start_offset, chunk_size,
264 Skip(mem, payload_available);
272 Rewind(mem, CHUNK_HEADER_SIZE);
277 if (mem->start_ == mem->riff_end_) {
279 } else if (MemDataSize(mem) < CHUNK_HEADER_SIZE) {
287 // Creates a new Frame if 'actual_size' is within bounds and 'mem' contains
291 static ParseStatus NewFrame(const MemBuffer* const mem,
294 if (SizeIsInvalid(mem, min_size)) return PARSE_ERROR;
296 if (MemDataSize(mem) < min_size) return PARSE_NEED_MORE_DATA;
309 MemBuffer* const mem = &dmux->mem_;
312 NewFrame(mem, ANMF_CHUNK_SIZE, frame_chunk_size, &frame);
315 frame->x_offset_ = 2 * ReadLE24s(mem);
316 frame->y_offset_ = 2 * ReadLE24s(mem);
317 frame->width_ = 1 + ReadLE24s(mem);
318 frame->height_ = 1 + ReadLE24s(mem);
319 frame->duration_ = ReadLE24s(mem);
320 frame->dispose_method_ = (WebPMuxAnimDispose)(ReadByte(mem) & 1);
328 status = StoreFrame(dmux->num_frames_ + 1, anmf_payload_size, mem, frame,
352 MemBuffer* const mem = &dmux->mem_;
355 NewFrame(mem, FRGM_CHUNK_SIZE, fragment_chunk_size, &frame);
359 frame->x_offset_ = 2 * ReadLE24s(mem);
360 frame->y_offset_ = 2 * ReadLE24s(mem);
364 status = StoreFrame(frame_num, frgm_payload_size, mem, frame, NULL);
397 static int ReadHeader(MemBuffer* const mem) {
402 if (MemDataSize(mem) < min_size) return 0;
403 if (memcmp(GetBuffer(mem), "RIFF", CHUNK_SIZE_BYTES) ||
404 memcmp(GetBuffer(mem) + CHUNK_HEADER_SIZE, "WEBP", CHUNK_SIZE_BYTES)) {
408 riff_size = GetLE32(GetBuffer(mem) + TAG_SIZE);
413 mem->riff_end_ = riff_size + CHUNK_HEADER_SIZE;
414 if (mem->buf_size_ > mem->riff_end_) {
415 mem->buf_size_ = mem->end_ = mem->riff_end_;
418 Skip(mem, RIFF_HEADER_SIZE);
424 MemBuffer* const mem = &dmux->mem_;
430 if (SizeIsInvalid(mem, min_size)) return PARSE_ERROR;
431 if (MemDataSize(mem) < min_size) return PARSE_NEED_MORE_DATA;
466 MemBuffer* const mem = &dmux->mem_;
471 if (MemDataSize(mem) < CHUNK_HEADER_SIZE) return PARSE_NEED_MORE_DATA;
474 Skip(mem, TAG_SIZE); // VP8X
475 vp8x_size = ReadLE32(mem);
479 if (SizeIsInvalid(mem, vp8x_size)) return PARSE_ERROR;
480 if (MemDataSize(mem) < vp8x_size) return PARSE_NEED_MORE_DATA;
482 dmux->feature_flags_ = ReadByte(mem);
483 Skip(mem, 3); // Reserved.
484 dmux->canvas_width_ = 1 + ReadLE24s(mem);
485 dmux->canvas_height_ = 1 + ReadLE24s(mem);
489 Skip(mem, vp8x_size - VP8X_CHUNK_SIZE); // skip any trailing data.
492 if (SizeIsInvalid(mem, CHUNK_HEADER_SIZE)) return PARSE_ERROR;
493 if (MemDataSize(mem) < CHUNK_HEADER_SIZE) return PARSE_NEED_MORE_DATA;
497 const size_t chunk_start_offset = mem->start_;
498 const uint32_t fourcc = ReadLE32(mem);
499 const uint32_t chunk_size = ReadLE32(mem);
503 if (SizeIsInvalid(mem, chunk_size_padded)) return PARSE_ERROR;
515 Rewind(mem, CHUNK_HEADER_SIZE);
522 if (MemDataSize(mem) < chunk_size_padded) {
526 dmux->bgcolor_ = ReadLE32(mem);
527 dmux->loop_count_ = ReadLE16s(mem);
528 Skip(mem, chunk_size_padded - ANIM_CHUNK_SIZE);
560 if (chunk_size_padded <= MemDataSize(mem)) {
569 Skip(mem, chunk_size_padded);
576 if (mem->start_ == mem->riff_end_) {
578 } else if (MemDataSize(mem) < CHUNK_HEADER_SIZE) {
658 static void InitDemux(WebPDemuxer* const dmux, const MemBuffer* const mem) {
665 dmux->mem_ = *mem;
673 MemBuffer mem;
679 if (!InitMemBuffer(&mem, data->bytes, data->size)) return NULL;
680 if (!ReadHeader(&mem)) return NULL;
682 partial = (mem.buf_size_ < mem.riff_end_);
687 InitDemux(dmux, &mem);