//--------------------------------------------------------------
 //--------------------------------------------------------------
 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;
  
}
예제 #3
0
// 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;
	}