Changeset a35b458 in mainline for uspace/lib/draw/codec/webp.c
- Timestamp:
- 2018-03-02T20:10:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/draw/codec/webp.c
r3061bc1 ra35b458 84 84 bool alpha_used; 85 85 uint8_t version; 86 86 87 87 uint8_t *src; /**< Input buffer */ 88 88 size_t srclen; /**< Input buffer size */ 89 89 size_t srccnt; /**< Position in the input buffer */ 90 90 91 91 uint32_t bitbuf; /**< Bit buffer */ 92 92 size_t bitlen; /**< Number of bits in the bit buffer */ 93 93 94 94 bool overrun; /**< Overrun condition */ 95 95 } webp_t; … … 107 107 /* Bit accumulator for at least 36 bits */ 108 108 uint64_t val = state->bitbuf; 109 109 110 110 while (state->bitlen < cnt) { 111 111 if (state->srccnt == state->srclen) { … … 113 113 return 0; 114 114 } 115 115 116 116 /* Load 8 more bits */ 117 117 val |= ((uint64_t) state->src[state->srccnt]) << state->bitlen; … … 119 119 state->bitlen += 8; 120 120 } 121 121 122 122 /* Update bits in the buffer */ 123 123 state->bitbuf = (uint32_t) (val >> cnt); 124 124 state->bitlen -= cnt; 125 125 126 126 return ((uint32_t) (val & ((1 << cnt) - 1))); 127 127 } … … 143 143 (size - sizeof(riff_header_t) < sizeof(webp_header_t))) 144 144 return false; 145 145 146 146 riff_header_t *riff_header = (riff_header_t *) data; 147 147 if (riff_header->fourcc != FOURCC_RIFF) 148 148 return false; 149 149 150 150 /* Check payload size */ 151 151 size_t payload_size = uint32_t_le2host(riff_header->payload_size); 152 152 if (payload_size + sizeof(riff_header_t) > size) 153 153 return false; 154 154 155 155 data += sizeof(riff_header_t); 156 156 webp_header_t *webp_header = (webp_header_t *) data; 157 157 if (webp_header->fourcc != FOURCC_WEBP) 158 158 return false; 159 159 160 160 /* Only lossless encoding supported so far */ 161 161 if (webp_header->encoding != FOURCC_WEBP_LOSSLESS) 162 162 return false; 163 163 164 164 webp->stream_size = uint32_t_le2host(webp_header->stream_size); 165 165 if (webp->stream_size + sizeof(riff_header_t) + 166 166 sizeof(webp_header_t) > size) 167 167 return false; 168 168 169 169 if (webp_header->signature != SIGNATURE_WEBP_LOSSLESS) 170 170 return false; 171 171 172 172 data += sizeof(webp_header_t); 173 173 174 174 /* Setup decoding state */ 175 175 webp->src = (uint8_t *) data; … … 179 179 webp->bitlen = 0; 180 180 webp->overrun = false; 181 181 182 182 /* Decode the rest of the metadata */ 183 183 webp->width = get_bits(webp, 14) + 1; 184 184 CHECK_OVERRUN(*webp, false); 185 185 186 186 webp->height = get_bits(webp, 14) + 1; 187 187 CHECK_OVERRUN(*webp, false); 188 188 189 189 webp->alpha_used = get_bits(webp, 1); 190 190 CHECK_OVERRUN(*webp, false); 191 191 192 192 webp->version = get_bits(webp, 3); 193 193 CHECK_OVERRUN(*webp, false); 194 194 195 195 if (webp->version != 0) 196 196 return false; 197 197 198 198 return true; 199 199 } … … 218 218 if (!decode_webp_header(data, size, &webp)) 219 219 return NULL; 220 220 221 221 bool transform_present = false; 222 222 223 223 do { 224 224 transform_present = get_bits(&webp, 1); 225 225 CHECK_OVERRUN(webp, NULL); 226 226 227 227 if (transform_present) { 228 228 webp_transform_t transform = get_bits(&webp, 2); 229 229 CHECK_OVERRUN(webp, NULL); 230 230 231 231 if (transform == TRANSFORM_PREDICTOR) { 232 232 // FIXME TODO 233 233 } else 234 234 return NULL; 235 235 236 236 // FIXME: decode other transforms 237 237 } 238 238 } while (transform_present); 239 239 240 240 // FIXME: decode image data 241 241 242 242 return NULL; 243 243 }
Note:
See TracChangeset
for help on using the changeset viewer.