| 264 | } |
| 265 | |
| 266 | static int cinepak_decode_strip (CinepakContext *s, |
| 267 | cvid_strip *strip, const uint8_t *data, int size) |
| 268 | { |
| 269 | const uint8_t *eod = (data + size); |
| 270 | int chunk_id, chunk_size; |
| 271 | |
| 272 | /* coordinate sanity checks */ |
| 273 | if (strip->x2 > s->width || |
| 274 | strip->y2 > s->height || |
| 275 | strip->x1 >= strip->x2 || strip->y1 >= strip->y2) |
| 276 | return AVERROR_INVALIDDATA; |
| 277 | |
| 278 | while ((data + 4) <= eod) { |
| 279 | chunk_id = data[0]; |
| 280 | chunk_size = AV_RB24 (&data[1]) - 4; |
| 281 | if(chunk_size < 0) |
| 282 | return AVERROR_INVALIDDATA; |
| 283 | |
| 284 | data += 4; |
| 285 | chunk_size = ((data + chunk_size) > eod) ? (eod - data) : chunk_size; |
| 286 | |
| 287 | switch (chunk_id) { |
| 288 | |
| 289 | case 0x20: |
| 290 | case 0x21: |
| 291 | case 0x24: |
| 292 | case 0x25: |
| 293 | cinepak_decode_codebook (strip->v4_codebook, chunk_id, |
| 294 | chunk_size, data); |
| 295 | break; |
| 296 | |
| 297 | case 0x22: |
| 298 | case 0x23: |
| 299 | case 0x26: |
| 300 | case 0x27: |
| 301 | cinepak_decode_codebook (strip->v1_codebook, chunk_id, |
| 302 | chunk_size, data); |
| 303 | break; |
| 304 | |
| 305 | case 0x30: |
| 306 | case 0x31: |
| 307 | case 0x32: |
| 308 | return cinepak_decode_vectors (s, strip, chunk_id, |
| 309 | chunk_size, data); |
| 310 | } |
| 311 | |
| 312 | data += chunk_size; |
| 313 | } |
| 314 | |
| 315 | return AVERROR_INVALIDDATA; |
| 316 | } |
| 317 | |
| 318 | static int cinepak_predecode_check (CinepakContext *s) |
| 319 | { |
no test coverage detected