Home | History | Annotate | Download | only in demux

Lines Matching defs:mem

113 static int RemapMemBuffer(MemBuffer* const mem,
115 if (size < mem->buf_size_) return 0; // can't remap to a shorter buffer!
117 mem->buf_ = data;
118 mem->end_ = mem->buf_size_ = size;
122 static int InitMemBuffer(MemBuffer* const mem,
124 memset(mem, 0, sizeof(*mem));
125 return RemapMemBuffer(mem, data, size);
128 // Return the remaining data size available in 'mem'.
129 static WEBP_INLINE size_t MemDataSize(const MemBuffer* const mem) {
130 return (mem->end_ - mem->start_);
134 static WEBP_INLINE int SizeIsInvalid(const MemBuffer* const mem, size_t size) {
135 return (size > mem->riff_end_ - mem->start_);
138 static WEBP_INLINE void Skip(MemBuffer* const mem, size_t size) {
139 mem->start_ += size;
142 static WEBP_INLINE void Rewind(MemBuffer* const mem, size_t size) {
143 mem->start_ -= size;
146 static WEBP_INLINE const uint8_t* GetBuffer(MemBuffer* const mem) {
147 return mem->buf_ + mem->start_;
150 // Read from 'mem' and skip the read bytes.
151 static WEBP_INLINE uint8_t ReadByte(MemBuffer* const mem) {
152 const uint8_t byte = mem->buf_[mem->start_];
153 Skip(mem, 1);
157 static WEBP_INLINE int ReadLE16s(MemBuffer* const mem) {
158 const uint8_t* const data = mem->buf_ + mem->start_;
160 Skip(mem, 2);
164 static WEBP_INLINE int ReadLE24s(MemBuffer* const mem) {
165 const uint8_t* const data = mem->buf_ + mem->start_;
167 Skip(mem, 3);
171 static WEBP_INLINE uint32_t ReadLE32(MemBuffer* const mem) {
172 const uint8_t* const data = mem->buf_ + mem->start_;
174 Skip(mem, 4);
202 MemBuffer* const mem, Frame* const frame) {
205 int done = (MemDataSize(mem) < min_size);
211 const size_t chunk_start_offset = mem->start_;
212 const uint32_t fourcc = ReadLE32(mem);
213 const uint32_t payload_size = ReadLE32(mem);
215 const size_t payload_available = (payload_size_padded > MemDataSize(mem))
216 ? MemDataSize(mem) : payload_size_padded;
220 if (SizeIsInvalid(mem, payload_size_padded)) return PARSE_ERROR;
221 if (payload_size_padded > MemDataSize(mem)) status = PARSE_NEED_MORE_DATA;
231 Skip(mem, payload_available);
245 WebPGetFeatures(mem->buf_ + chunk_start_offset, chunk_size,
262 Skip(mem, payload_available);
270 Rewind(mem, CHUNK_HEADER_SIZE);
275 if (mem->start_ == mem->riff_end_) {
277 } else if (MemDataSize(mem) < CHUNK_HEADER_SIZE) {
285 // Creates a new Frame if 'actual_size' is within bounds and 'mem' contains
289 static ParseStatus NewFrame(const MemBuffer* const mem,
292 if (SizeIsInvalid(mem, min_size)) return PARSE_ERROR;
294 if (MemDataSize(mem) < min_size) return PARSE_NEED_MORE_DATA;
308 MemBuffer* const mem = &dmux->mem_;
311 NewFrame(mem, ANMF_CHUNK_SIZE, frame_chunk_size, &frame);
314 frame->x_offset_ = 2 * ReadLE24s(mem);
315 frame->y_offset_ = 2 * ReadLE24s(mem);
316 frame->width_ = 1 + ReadLE24s(mem);
317 frame->height_ = 1 + ReadLE24s(mem);
318 frame->duration_ = ReadLE24s(mem);
319 bits = ReadByte(mem);
330 status = StoreFrame(dmux->num_frames_ + 1, anmf_payload_size, mem, frame);
353 MemBuffer* const mem = &dmux->mem_;
356 NewFrame(mem, FRGM_CHUNK_SIZE, fragment_chunk_size, &frame);
360 frame->x_offset_ = 2 * ReadLE24s(mem);
361 frame->y_offset_ = 2 * ReadLE24s(mem);
365 status = StoreFrame(frame_num, frgm_payload_size, mem, frame);
398 static int ReadHeader(MemBuffer* const mem) {
403 if (MemDataSize(mem) < min_size) return 0;
404 if (memcmp(GetBuffer(mem), "RIFF", CHUNK_SIZE_BYTES) ||
405 memcmp(GetBuffer(mem) + CHUNK_HEADER_SIZE, "WEBP", CHUNK_SIZE_BYTES)) {
409 riff_size = GetLE32(GetBuffer(mem) + TAG_SIZE);
414 mem->riff_end_ = riff_size + CHUNK_HEADER_SIZE;
415 if (mem->buf_size_ > mem->riff_end_) {
416 mem->buf_size_ = mem->end_ = mem->riff_end_;
419 Skip(mem, RIFF_HEADER_SIZE);
425 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) {
682 static void InitDemux(WebPDemuxer* const dmux, const MemBuffer* const mem) {
689 dmux->mem_ = *mem;
697 MemBuffer mem;
703 if (!InitMemBuffer(&mem, data->bytes, data->size)) return NULL;
704 if (!ReadHeader(&mem)) return NULL;
706 partial = (mem.buf_size_ < mem.riff_end_);
711 InitDemux(dmux, &mem);