//-------------------------------------------------------------- //-------------------------------------------------------------- void CSBinaryInputStream::ReadChunkTable(u32 in_numEntries) { const u32 k_chunkEntrySize = 12; //read the chunk table const u32 chunkTableDataSize = k_chunkEntrySize * in_numEntries; std::unique_ptr<u8[]> chunkTableData(new u8[chunkTableDataSize]); m_fileStream->Read(reinterpret_cast<s8*>(chunkTableData.get()), chunkTableDataSize); //iterate over the chunks for (u32 i = 0; i < in_numEntries; ++i) { const u32 chunkOffset = i * k_chunkEntrySize; //get the chunk identifier const u32 k_chunkIdSize = 4; std::string chunkId(reinterpret_cast<const s8*>(chunkTableData.get() + chunkOffset), k_chunkIdSize); ChunkInfo info; //get the chunk offset. const u32 k_offsetOffset = 4; info.m_offset = *reinterpret_cast<const u32*>(chunkTableData.get() + chunkOffset + k_offsetOffset); //get the chunk size. const u32 k_sizeOffset = 8; info.m_size = *reinterpret_cast<const u32*>(chunkTableData.get() + chunkOffset + k_sizeOffset); m_chunkInfoMap.emplace(chunkId, info); } }
uint8_t asfChunk::dump(void) { const chunky *id; id=chunkId(); printf("Chunk type : <<<<%s>>>>\n",id->name); printf("Chunk Start : %x\n",_chunkStart); printf("Chunk Len : %lu\n",(uint32_t)chunkLen); for(int i=0;i<16;i++) printf("%02x ",guId[i]); printf("\n"); return 1; }
// Called by framework to process a header for a frame TFrameState CPngReadCodec::ProcessFrameHeaderL(TBufPtr8& aData) { const TUint8* startDataPtr = aData.Ptr(); const TUint8* dataPtr = startDataPtr; const TUint8* dataPtrLimit = startDataPtr + aData.Length(); // Process the mandatory PNG header chunk: sets up iImageInfo if (iFrameInfo->CurrentFrameState() == TFrameInfo::EFrameInfoProcessingFrameHeader) { if (dataPtr + KPngChunkLengthSize + KPngChunkIdSize + KPngIHDRChunkSize + KPngChunkCRCSize > dataPtrLimit) User::Leave(KErrUnderflow); TInt chunkLength = PtrReadUtil::ReadBigEndianUint32Inc(dataPtr); TPtrC8 chunkId(dataPtr,KPngChunkIdSize); if (chunkLength != KPngIHDRChunkSize || chunkId != KPngIHDRChunkId) User::Leave(KErrNotFound); dataPtr += KPngChunkIdSize; DoProcessIHDRL(dataPtr,chunkLength); dataPtr += KPngIHDRChunkSize + KPngChunkCRCSize; } // Process any optional PNG header chunks TRAPD(err, DoProcessInfoL(dataPtr, dataPtrLimit)); if (err != KErrNone) { if (err == KErrNotFound) return EFrameComplete; User::Leave(err); // A real error occured } // Having read the header, can initialise the frame information aData.Shift(dataPtr - startDataPtr); iFrameInfo->iFrameCoordsInPixels.SetRect(TPoint(0,0),iImageInfo.iSize); iFrameInfo->iOverallSizeInPixels = iImageInfo.iSize; if (iImageInfo.iPhysicalPresent && iImageInfo.iPhysicalUnits == TPngImageInformation::EMeters) iFrameInfo->iFrameSizeInTwips = iImageInfo.iPhysicalSize; else iFrameInfo->iFrameSizeInTwips.SetSize(0,0); iFrameInfo->iBitsPerPixel = iImageInfo.iBitDepth; if (iImageInfo.iColorType & TPngImageInformation::EColorUsed) iFrameInfo->iBitsPerPixel *= 3; iFrameInfo->iDelay = 0; iFrameInfo->iFlags = TFrameInfo::ECanDither; if (iImageInfo.iColorType & (TPngImageInformation::EPaletteUsed | TPngImageInformation::EColorUsed)) iFrameInfo->iFlags |= TFrameInfo::EColor; if (iImageInfo.iColorType & TPngImageInformation::EAlphaChannelUsed) { iFrameInfo->iFlags |= TFrameInfo::ETransparencyPossible; iFrameInfo->iFlags |= TFrameInfo::EAlphaChannel; } else if (iImageInfo.iTransparencyPresent) iFrameInfo->iFlags |= TFrameInfo::ETransparencyPossible; switch (iFrameInfo->iBitsPerPixel) { case 1: iFrameInfo->iFrameDisplayMode = EGray2; break; case 2: iFrameInfo->iFrameDisplayMode = EGray4; break; case 4: iFrameInfo->iFrameDisplayMode = (iFrameInfo->iFlags & TFrameInfo::EColor) ? EColor16 : EGray16; break; case 8: iFrameInfo->iFrameDisplayMode = (iFrameInfo->iFlags & TFrameInfo::EColor) ? EColor256 : EGray256; break; case 12: iFrameInfo->iFrameDisplayMode = EColor4K; break; case 16: iFrameInfo->iFrameDisplayMode = EColor64K; break; case 24: iFrameInfo->iFrameDisplayMode = EColor16M; break; default: User::Leave(KErrCorrupt); } if (iImageInfo.iBackgroundPresent) iFrameInfo->iBackgroundColor = iImageInfo.iBackgroundColor; iFrameInfo->SetCurrentFrameState(TFrameInfo::EFrameInfoProcessingComplete); return EFrameComplete; }