| 510 | } |
| 511 | |
| 512 | CDemoPlayer::EReadChunkHeaderResult CDemoPlayer::ReadChunkHeader(int *pType, int *pSize, int *pTick) |
| 513 | { |
| 514 | *pSize = 0; |
| 515 | *pType = 0; |
| 516 | |
| 517 | unsigned char Chunk = 0; |
| 518 | if(io_read(m_File, &Chunk, sizeof(Chunk)) != sizeof(Chunk)) |
| 519 | return CHUNKHEADER_EOF; |
| 520 | |
| 521 | if(Chunk & CHUNKTYPEFLAG_TICKMARKER) |
| 522 | { |
| 523 | // decode tick marker |
| 524 | int TickdeltaLegacy = Chunk & CHUNKMASK_TICK_LEGACY; // compatibility |
| 525 | *pType = Chunk & (CHUNKTYPEFLAG_TICKMARKER | CHUNKTICKFLAG_KEYFRAME); |
| 526 | |
| 527 | int NewTick; |
| 528 | if(m_Info.m_Header.m_Version < gs_VersionTickCompression && TickdeltaLegacy != 0) |
| 529 | { |
| 530 | if(*pTick < 0) // initial tick not initialized before a tick delta |
| 531 | return CHUNKHEADER_ERROR; |
| 532 | NewTick = *pTick + TickdeltaLegacy; |
| 533 | } |
| 534 | else if(Chunk & CHUNKTICKFLAG_TICK_COMPRESSED) |
| 535 | { |
| 536 | if(*pTick < 0) // initial tick not initialized before a tick delta |
| 537 | return CHUNKHEADER_ERROR; |
| 538 | int Tickdelta = Chunk & CHUNKMASK_TICK; |
| 539 | NewTick = *pTick + Tickdelta; |
| 540 | } |
| 541 | else |
| 542 | { |
| 543 | unsigned char aTickdata[sizeof(int32_t)]; |
| 544 | if(io_read(m_File, aTickdata, sizeof(aTickdata)) != sizeof(aTickdata)) |
| 545 | return CHUNKHEADER_ERROR; |
| 546 | NewTick = bytes_be_to_uint(aTickdata); |
| 547 | } |
| 548 | if(NewTick < MIN_TICK || NewTick >= MAX_TICK) // invalid tick |
| 549 | return CHUNKHEADER_ERROR; |
| 550 | *pTick = NewTick; |
| 551 | } |
| 552 | else |
| 553 | { |
| 554 | // decode normal chunk |
| 555 | *pType = (Chunk & CHUNKMASK_TYPE) >> 5; |
| 556 | *pSize = Chunk & CHUNKMASK_SIZE; |
| 557 | |
| 558 | if(*pSize == 30) |
| 559 | { |
| 560 | unsigned char aSizedata[1]; |
| 561 | if(io_read(m_File, aSizedata, sizeof(aSizedata)) != sizeof(aSizedata)) |
| 562 | return CHUNKHEADER_ERROR; |
| 563 | *pSize = aSizedata[0]; |
| 564 | } |
| 565 | else if(*pSize == 31) |
| 566 | { |
| 567 | unsigned char aSizedata[2]; |
| 568 | if(io_read(m_File, aSizedata, sizeof(aSizedata)) != sizeof(aSizedata)) |
| 569 | return CHUNKHEADER_ERROR; |
nothing calls this directly
no test coverage detected