Home | History | Annotate | Download | only in demux

Lines Matching full:dmux

88   ParseStatus (*parse)(WebPDemuxer* const dmux);
89 int (*valid)(const WebPDemuxer* const dmux);
92 static ParseStatus ParseSingleImage(WebPDemuxer* const dmux);
93 static ParseStatus ParseVP8X(WebPDemuxer* const dmux);
94 static int IsValidSimpleFormat(const WebPDemuxer* const dmux);
95 static int IsValidExtendedFormat(const WebPDemuxer* const dmux);
181 static void AddChunk(WebPDemuxer* const dmux, Chunk* const chunk) {
182 Chunk** c = &dmux->chunks_;
190 static int AddFrame(WebPDemuxer* const dmux, Frame* const frame) {
191 const Frame* const last_frame = *dmux->frames_tail_;
194 *dmux->frames_tail_ = frame;
196 dmux->frames_tail_ = &frame->next_;
303 WebPDemuxer* const dmux, uint32_t frame_chunk_size) {
304 const int has_frames = !!(dmux->feature_flags_ & ANIMATION_FLAG);
308 MemBuffer* const mem = &dmux->mem_;
330 status = StoreFrame(dmux->num_frames_ + 1, anmf_payload_size, mem, frame);
332 added_frame = AddFrame(dmux, frame);
334 ++dmux->num_frames_;
347 static ParseStatus ParseFragment(WebPDemuxer* const dmux,
350 const int has_fragments = !!(dmux->feature_flags_ & FRAGMENTS_FLAG);
353 MemBuffer* const mem = &dmux->mem_;
367 added_fragment = AddFrame(dmux, frame);
371 dmux->num_frames_ = 1;
384 static int StoreChunk(WebPDemuxer* const dmux,
391 AddChunk(dmux, chunk);
423 static ParseStatus ParseSingleImage(WebPDemuxer* const dmux) {
425 MemBuffer* const mem = &dmux->mem_;
429 if (dmux->frames_ != NULL) return PARSE_ERROR;
438 status = StoreFrame(1, CHUNK_HEADER_SIZE, &dmux->mem_, frame);
440 const int has_alpha = !!(dmux->feature_flags_ & ALPHA_FLAG);
450 if (!dmux->is_ext_format_ && frame->width_ > 0 && frame->height_ > 0) {
451 dmux->state_ = WEBP_DEMUX_PARSED_HEADER;
452 dmux->canvas_width_ = frame->width_;
453 dmux->canvas_height_ = frame->height_;
454 dmux->feature_flags_ |= frame->has_alpha_ ? ALPHA_FLAG : 0;
456 AddFrame(dmux, frame);
457 dmux->num_frames_ = 1;
465 static ParseStatus ParseVP8X(WebPDemuxer* const dmux) {
466 MemBuffer* const mem = &dmux->mem_;
473 dmux->is_ext_format_ = 1;
482 dmux->feature_flags_ = ReadByte(mem);
484 dmux->canvas_width_ = 1 + ReadLE24s(mem);
485 dmux->canvas_height_ = 1 + ReadLE24s(mem);
486 if (dmux->canvas_width_ * (uint64_t)dmux->canvas_height_ >= MAX_IMAGE_AREA) {
490 dmux
516 status = ParseSingleImage(dmux);
526 dmux->bgcolor_ = ReadLE32(mem);
527 dmux->loop_count_ = ReadLE16s(mem);
537 status = ParseAnimationFrame(dmux, chunk_size_padded);
542 status = ParseFragment(dmux, chunk_size_padded);
547 store_chunk = !!(dmux->feature_flags_ & ICCP_FLAG);
551 store_chunk = !!(dmux->feature_flags_ & XMP_FLAG);
555 store_chunk = !!(dmux->feature_flags_ & EXIF_FLAG);
564 if (!StoreChunk(dmux, chunk_start_offset,
589 static int IsValidSimpleFormat(const WebPDemuxer* const dmux) {
590 const Frame* const frame = dmux->frames_;
591 if (dmux->state_ == WEBP_DEMUX_PARSING_HEADER) return 1;
593 if (dmux->canvas_width_ <= 0 || dmux->canvas_height_ <= 0) return 0;
594 if (dmux->state_ == WEBP_DEMUX_DONE && frame == NULL) return 0;
619 static int IsValidExtendedFormat(const WebPDemuxer* const dmux) {
620 const int has_fragments = !!(dmux->feature_flags_ & FRAGMENTS_FLAG);
621 const int has_frames = !!(dmux->feature_flags_ & ANIMATION_FLAG);
624 if (dmux->state_ == WEBP_DEMUX_PARSING_HEADER) return 1;
626 if (dmux->canvas_width_ <= 0 || dmux->canvas_height_ <= 0) return 0;
627 if (dmux->loop_count_ < 0) return 0;
628 if (dmux->state_ == WEBP_DEMUX_DONE && dmux->frames_ == NULL) return 0;
630 for (f = dmux->frames_; f != NULL; f = f->next_) {
652 if (dmux->state_ == WEBP_DEMUX_DONE) return 0;
665 dmux->canvas_width_, dmux->canvas_height_)) {
682 static void InitDemux(WebPDemuxer* const dmux, const MemBuffer* const mem) {
683 dmux->state_ = WEBP_DEMUX_PARSING_HEADER;
684 dmux->loop_count_ = 1;
685 dmux->bgcolor_ = 0xFFFFFFFF; // White background by default.
686 dmux->canvas_width_ = -1;
687 dmux->canvas_height_ = -1;
688 dmux->frames_tail_ = &dmux->frames_;
689 dmux->mem_ = *mem;
698 WebPDemuxer* dmux;
709 dmux = (WebPDemuxer*)calloc(1, sizeof(*dmux));
710 if (dmux == NULL) return NULL;
711 InitDemux(dmux, &mem);
714 if (!memcmp(parser->id, GetBuffer(&dmux->mem_), TAG_SIZE)) {
715 status = parser->parse(dmux);
716 if (status == PARSE_OK) dmux->state_ = WEBP_DEMUX_DONE;
718 if (status != PARSE_ERROR && !parser->valid(dmux)) status = PARSE_ERROR;
722 if (state) *state = dmux->state_;
725 WebPDemuxDelete(dmux);
728 return dmux;
731 void WebPDemuxDelete(WebPDemuxer* dmux) {
734 if (dmux == NULL) return;
736 for (f = dmux->frames_; f != NULL;) {
741 for (c = dmux->chunks_; c != NULL;) {
746 free(dmux);
751 uint32_t WebPDemuxGetI(const WebPDemuxer* dmux, WebPFormatFeature feature) {
752 if (dmux == NULL) return 0;
755 case WEBP_FF_FORMAT_FLAGS: return dmux->feature_flags_;
756 case WEBP_FF_CANVAS_WIDTH: return (uint32_t)dmux->canvas_width_;
757 case WEBP_FF_CANVAS_HEIGHT: return (uint32_t)dmux->canvas_height_;
758 case WEBP_FF_LOOP_COUNT: return (uint32_t)dmux->loop_count_;
759 case WEBP_FF_BACKGROUND_COLOR: return dmux->bgcolor_;
760 case WEBP_FF_FRAME_COUNT: return (uint32_t)dmux->num_frames_;
770 static const Frame* GetFrame(const WebPDemuxer* const dmux, int frame_num) {
772 for (f = dmux->frames_; f != NULL; f = f->next_) {
818 static int SynthesizeFrame(const WebPDemuxer* const dmux,
821 const uint8_t* const mem_buf = dmux->mem_.buf_;
832 iter->num_frames = dmux->num_frames_;
852 const WebPDemuxer* const dmux = (WebPDemuxer*)iter->private_;
853 if (dmux == NULL || frame_num < 0) return 0;
854 if (frame_num > dmux->num_frames_) return 0;
855 if (frame_num == 0) frame_num = dmux->num_frames_;
857 frame = GetFrame(dmux, frame_num);
860 return SynthesizeFrame(dmux, frame, 1, iter);
863 int WebPDemuxGetFrame(const WebPDemuxer* dmux, int frame, WebPIterator* iter) {
867 iter->private_ = (void*)dmux;
884 const WebPDemuxer* const dmux = (WebPDemuxer*)iter->private_;
885 const Frame* const frame = GetFrame(dmux, iter->frame_num);
888 return SynthesizeFrame(dmux, frame, fragment_num, iter);
900 static int ChunkCount(const WebPDemuxer* const dmux, const char fourcc[4]) {
901 const uint8_t* const mem_buf = dmux->mem_.buf_;
904 for (c = dmux->chunks_; c != NULL; c = c->next_) {
911 static const Chunk* GetChunk(const WebPDemuxer* const dmux,
913 const uint8_t* const mem_buf = dmux->mem_.buf_;
916 for (c = dmux->chunks_; c != NULL; c = c->next_) {
926 const WebPDemuxer* const dmux = (WebPDemuxer*)iter->private_;
929 if (dmux == NULL || fourcc == NULL || chunk_num < 0) return 0;
930 count = ChunkCount(dmux, fourcc);
935 const uint8_t* const mem_buf = dmux->mem_.buf_;
936 const Chunk* const chunk = GetChunk(dmux, fourcc, chunk_num);
946 int WebPDemuxGetChunk(const WebPDemuxer* dmux,
952 iter->private_ = (void*)dmux;