| 382 | } |
| 383 | |
| 384 | void VC5Decompressor::parseVC5() { |
| 385 | mBs.setByteOrder(Endianness::big); |
| 386 | |
| 387 | assert(mRaw->dim.x > 0); |
| 388 | assert(mRaw->dim.y > 0); |
| 389 | |
| 390 | // All VC-5 data must start with "VC-%" (0x56432d35) |
| 391 | if (mBs.getU32() != 0x56432d35) |
| 392 | ThrowRDE("not a valid VC-5 datablock"); |
| 393 | |
| 394 | bool done = false; |
| 395 | while (!done) { |
| 396 | auto tag = static_cast<VC5Tag>(mBs.getU16()); |
| 397 | uint16_t val = mBs.getU16(); |
| 398 | |
| 399 | bool optional = matches(tag, VC5Tag::Optional); |
| 400 | if (optional) |
| 401 | tag = -tag; |
| 402 | |
| 403 | switch (tag) { |
| 404 | case VC5Tag::ChannelCount: |
| 405 | if (val != numChannels) |
| 406 | ThrowRDE("Bad channel count %u, expected %u", val, numChannels); |
| 407 | break; |
| 408 | case VC5Tag::ImageWidth: |
| 409 | if (val != mRaw->dim.x) |
| 410 | ThrowRDE("Image width mismatch: %u vs %u", val, mRaw->dim.x); |
| 411 | break; |
| 412 | case VC5Tag::ImageHeight: |
| 413 | if (val != mRaw->dim.y) |
| 414 | ThrowRDE("Image height mismatch: %u vs %u", val, mRaw->dim.y); |
| 415 | break; |
| 416 | case VC5Tag::LowpassPrecision: |
| 417 | if (val < PRECISION_MIN || val > PRECISION_MAX) |
| 418 | ThrowRDE("Invalid precision %i", val); |
| 419 | mVC5.lowpassPrecision = val; |
| 420 | break; |
| 421 | case VC5Tag::ChannelNumber: |
| 422 | if (val >= numChannels) |
| 423 | ThrowRDE("Bad channel number (%u)", val); |
| 424 | mVC5.iChannel = val; |
| 425 | break; |
| 426 | case VC5Tag::ImageFormat: |
| 427 | if (val != mVC5.imgFormat) |
| 428 | ThrowRDE("Image format %i is not 4(RAW)", val); |
| 429 | break; |
| 430 | case VC5Tag::SubbandCount: |
| 431 | if (val != numSubbands) |
| 432 | ThrowRDE("Unexpected subband count %u, expected %u", val, numSubbands); |
| 433 | break; |
| 434 | case VC5Tag::MaxBitsPerComponent: |
| 435 | if (val != VC5_LOG_TABLE_BITWIDTH) { |
| 436 | ThrowRDE("Bad bits per componend %u, not %u", val, |
| 437 | VC5_LOG_TABLE_BITWIDTH); |
| 438 | } |
| 439 | break; |
| 440 | case VC5Tag::PatternWidth: |
| 441 | if (val != mVC5.patternWidth) |
nothing calls this directly
no test coverage detected