Lines Matching refs:mem
110 static int RemapMemBuffer(MemBuffer* const mem, in RemapMemBuffer() argument
112 if (size < mem->buf_size_) return 0; // can't remap to a shorter buffer! in RemapMemBuffer()
114 mem->buf_ = data; in RemapMemBuffer()
115 mem->end_ = mem->buf_size_ = size; in RemapMemBuffer()
119 static int InitMemBuffer(MemBuffer* const mem, in InitMemBuffer() argument
121 memset(mem, 0, sizeof(*mem)); in InitMemBuffer()
122 return RemapMemBuffer(mem, data, size); in InitMemBuffer()
126 static WEBP_INLINE size_t MemDataSize(const MemBuffer* const mem) { in MemDataSize() argument
127 return (mem->end_ - mem->start_); in MemDataSize()
131 static WEBP_INLINE int SizeIsInvalid(const MemBuffer* const mem, size_t size) { in SizeIsInvalid() argument
132 return (size > mem->riff_end_ - mem->start_); in SizeIsInvalid()
135 static WEBP_INLINE void Skip(MemBuffer* const mem, size_t size) { in Skip() argument
136 mem->start_ += size; in Skip()
139 static WEBP_INLINE void Rewind(MemBuffer* const mem, size_t size) { in Rewind() argument
140 mem->start_ -= size; in Rewind()
143 static WEBP_INLINE const uint8_t* GetBuffer(MemBuffer* const mem) { in GetBuffer() argument
144 return mem->buf_ + mem->start_; in GetBuffer()
148 static WEBP_INLINE uint8_t ReadByte(MemBuffer* const mem) { in ReadByte() argument
149 const uint8_t byte = mem->buf_[mem->start_]; in ReadByte()
150 Skip(mem, 1); in ReadByte()
154 static WEBP_INLINE int ReadLE16s(MemBuffer* const mem) { in ReadLE16s() argument
155 const uint8_t* const data = mem->buf_ + mem->start_; in ReadLE16s()
157 Skip(mem, 2); in ReadLE16s()
161 static WEBP_INLINE int ReadLE24s(MemBuffer* const mem) { in ReadLE24s() argument
162 const uint8_t* const data = mem->buf_ + mem->start_; in ReadLE24s()
164 Skip(mem, 3); in ReadLE24s()
168 static WEBP_INLINE uint32_t ReadLE32(MemBuffer* const mem) { in ReadLE32() argument
169 const uint8_t* const data = mem->buf_ + mem->start_; in ReadLE32()
171 Skip(mem, 4); in ReadLE32()
198 MemBuffer* const mem, Frame* const frame) { in StoreFrame() argument
201 int done = (MemDataSize(mem) < min_size); in StoreFrame()
207 const size_t chunk_start_offset = mem->start_; in StoreFrame()
208 const uint32_t fourcc = ReadLE32(mem); in StoreFrame()
209 const uint32_t payload_size = ReadLE32(mem); in StoreFrame()
211 const size_t payload_available = (payload_size_padded > MemDataSize(mem)) in StoreFrame()
212 ? MemDataSize(mem) : payload_size_padded; in StoreFrame()
216 if (SizeIsInvalid(mem, payload_size_padded)) return PARSE_ERROR; in StoreFrame()
217 if (payload_size_padded > MemDataSize(mem)) status = PARSE_NEED_MORE_DATA; in StoreFrame()
227 Skip(mem, payload_available); in StoreFrame()
241 WebPGetFeatures(mem->buf_ + chunk_start_offset, chunk_size, in StoreFrame()
258 Skip(mem, payload_available); in StoreFrame()
266 Rewind(mem, CHUNK_HEADER_SIZE); in StoreFrame()
271 if (mem->start_ == mem->riff_end_) { in StoreFrame()
273 } else if (MemDataSize(mem) < CHUNK_HEADER_SIZE) { in StoreFrame()
285 static ParseStatus NewFrame(const MemBuffer* const mem, in NewFrame() argument
288 if (SizeIsInvalid(mem, min_size)) return PARSE_ERROR; in NewFrame()
290 if (MemDataSize(mem) < min_size) return PARSE_NEED_MORE_DATA; in NewFrame()
304 MemBuffer* const mem = &dmux->mem_; in ParseAnimationFrame() local
307 NewFrame(mem, ANMF_CHUNK_SIZE, frame_chunk_size, &frame); in ParseAnimationFrame()
310 frame->x_offset_ = 2 * ReadLE24s(mem); in ParseAnimationFrame()
311 frame->y_offset_ = 2 * ReadLE24s(mem); in ParseAnimationFrame()
312 frame->width_ = 1 + ReadLE24s(mem); in ParseAnimationFrame()
313 frame->height_ = 1 + ReadLE24s(mem); in ParseAnimationFrame()
314 frame->duration_ = ReadLE24s(mem); in ParseAnimationFrame()
315 bits = ReadByte(mem); in ParseAnimationFrame()
326 status = StoreFrame(dmux->num_frames_ + 1, anmf_payload_size, mem, frame); in ParseAnimationFrame()
349 MemBuffer* const mem = &dmux->mem_; in ParseFragment() local
352 NewFrame(mem, FRGM_CHUNK_SIZE, fragment_chunk_size, &frame); in ParseFragment()
356 frame->x_offset_ = 2 * ReadLE24s(mem); in ParseFragment()
357 frame->y_offset_ = 2 * ReadLE24s(mem); in ParseFragment()
361 status = StoreFrame(frame_num, frgm_payload_size, mem, frame); in ParseFragment()
394 static ParseStatus ReadHeader(MemBuffer* const mem) { in ReadHeader() argument
399 if (MemDataSize(mem) < min_size) return PARSE_NEED_MORE_DATA; in ReadHeader()
400 if (memcmp(GetBuffer(mem), "RIFF", CHUNK_SIZE_BYTES) || in ReadHeader()
401 memcmp(GetBuffer(mem) + CHUNK_HEADER_SIZE, "WEBP", CHUNK_SIZE_BYTES)) { in ReadHeader()
405 riff_size = GetLE32(GetBuffer(mem) + TAG_SIZE); in ReadHeader()
410 mem->riff_end_ = riff_size + CHUNK_HEADER_SIZE; in ReadHeader()
411 if (mem->buf_size_ > mem->riff_end_) { in ReadHeader()
412 mem->buf_size_ = mem->end_ = mem->riff_end_; in ReadHeader()
415 Skip(mem, RIFF_HEADER_SIZE); in ReadHeader()
421 MemBuffer* const mem = &dmux->mem_; in ParseSingleImage() local
427 if (SizeIsInvalid(mem, min_size)) return PARSE_ERROR; in ParseSingleImage()
428 if (MemDataSize(mem) < min_size) return PARSE_NEED_MORE_DATA; in ParseSingleImage()
467 MemBuffer* const mem = &dmux->mem_; in ParseVP8XChunks() local
473 const size_t chunk_start_offset = mem->start_; in ParseVP8XChunks()
474 const uint32_t fourcc = ReadLE32(mem); in ParseVP8XChunks()
475 const uint32_t chunk_size = ReadLE32(mem); in ParseVP8XChunks()
479 if (SizeIsInvalid(mem, chunk_size_padded)) return PARSE_ERROR; in ParseVP8XChunks()
491 Rewind(mem, CHUNK_HEADER_SIZE); in ParseVP8XChunks()
498 if (MemDataSize(mem) < chunk_size_padded) { in ParseVP8XChunks()
502 dmux->bgcolor_ = ReadLE32(mem); in ParseVP8XChunks()
503 dmux->loop_count_ = ReadLE16s(mem); in ParseVP8XChunks()
504 Skip(mem, chunk_size_padded - ANIM_CHUNK_SIZE); in ParseVP8XChunks()
536 if (chunk_size_padded <= MemDataSize(mem)) { in ParseVP8XChunks()
545 Skip(mem, chunk_size_padded); in ParseVP8XChunks()
552 if (mem->start_ == mem->riff_end_) { in ParseVP8XChunks()
554 } else if (MemDataSize(mem) < CHUNK_HEADER_SIZE) { in ParseVP8XChunks()
563 MemBuffer* const mem = &dmux->mem_; in ParseVP8X() local
566 if (MemDataSize(mem) < CHUNK_HEADER_SIZE) return PARSE_NEED_MORE_DATA; in ParseVP8X()
569 Skip(mem, TAG_SIZE); // VP8X in ParseVP8X()
570 vp8x_size = ReadLE32(mem); in ParseVP8X()
574 if (SizeIsInvalid(mem, vp8x_size)) return PARSE_ERROR; in ParseVP8X()
575 if (MemDataSize(mem) < vp8x_size) return PARSE_NEED_MORE_DATA; in ParseVP8X()
577 dmux->feature_flags_ = ReadByte(mem); in ParseVP8X()
578 Skip(mem, 3); // Reserved. in ParseVP8X()
579 dmux->canvas_width_ = 1 + ReadLE24s(mem); in ParseVP8X()
580 dmux->canvas_height_ = 1 + ReadLE24s(mem); in ParseVP8X()
584 Skip(mem, vp8x_size - VP8X_CHUNK_SIZE); // skip any trailing data. in ParseVP8X()
587 if (SizeIsInvalid(mem, CHUNK_HEADER_SIZE)) return PARSE_ERROR; in ParseVP8X()
588 if (MemDataSize(mem) < CHUNK_HEADER_SIZE) return PARSE_NEED_MORE_DATA; in ParseVP8X()
695 static void InitDemux(WebPDemuxer* const dmux, const MemBuffer* const mem) { in InitDemux() argument
703 dmux->mem_ = *mem; in InitDemux()
711 MemBuffer mem; in WebPDemuxInternal() local
719 if (!InitMemBuffer(&mem, data->bytes, data->size)) return NULL; in WebPDemuxInternal()
720 status = ReadHeader(&mem); in WebPDemuxInternal()
729 partial = (mem.buf_size_ < mem.riff_end_); in WebPDemuxInternal()
734 InitDemux(dmux, &mem); in WebPDemuxInternal()