baseport/syborg/webcamera/webcamera_uvc.cpp
changeset 124 606eafc6d6a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/syborg/webcamera/webcamera_uvc.cpp	Mon Oct 18 19:39:25 2010 +0900
@@ -0,0 +1,352 @@
+/*
+* Copyright (c) 2010 ISB.
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* ISB - initial contribution.
+*
+* Contributors:
+*
+* Description: USB driver for test
+*
+*/
+
+#ifndef WEBCAMERA_UVC_H_
+#include "webcamera_uvc.h"
+#endif
+
+#define DP(format...) Kern::Printf(format)
+
+//Describe UVC base.
+
+/**
+Constructor.
+*/
+DWebCameraUVCDescriptor::DWebCameraUVCDescriptor()
+	{
+	DP("DWebcameraUVCDescriptor::DWebcameraUVCDescriptor construct");
+	}
+
+/**
+Destructor.
+*/
+DWebCameraUVCDescriptor::~DWebCameraUVCDescriptor()
+	{
+	DP("DWebcameraUVCDescriptor::DWebcameraUVCDescriptor destruct");
+	}
+
+/**
+Describe UVC Descriptor.
+@param		aDataInfo		[in]				DataInfo from lower layer.
+@return		bDescriptor.
+*/
+TWebcameraUVCDescriptor DWebCameraUVCDescriptor::DescribeDescriptor(const TWebcameraDataInfo aDataInfo)
+	{
+	TWebcameraUVCDescriptor bDescriptor;
+	return bDescriptor;
+	}
+
+//Describe UVC descriptor YUY2 class.
+
+/**
+Constructor.
+*/
+DWebCameraUVCDescribeDescriptorYUY2::DWebCameraUVCDescribeDescriptorYUY2()
+	{
+	DP("DWebCameraUVCDescribeDescriptorYUY2::DWebCameraUVCDescribeDescriptorYUY2 construct");
+	}
+
+/**
+Destructor.
+*/
+DWebCameraUVCDescribeDescriptorYUY2::~DWebCameraUVCDescribeDescriptorYUY2()
+	{
+	DP("DWebCameraUVCDescribeDescriptorYUY2::DWebCameraUVCDescribeDescriptorYUY2 destruct");
+	}
+
+/**
+Describe UVC Descriptor of YUY2 Format.
+@param		aDataInfo		[in]					DataInfo from lower layer.
+@return 	bDescriptor.
+*/
+TWebcameraUVCDescriptor DWebCameraUVCDescribeDescriptorYUY2::DescribeDescriptor(const TWebcameraDataInfo aDataInfo)
+	{
+	DP("DWebcameraUVCDescribeDescriptorYUY2::DescribeDescriptor Start");
+	//Describe FormatDescriptor Part.
+	TWebcameraUVCDescriptor bDescriptor;
+
+	bDescriptor.iFormatDescriptor.iLength = 27;
+	bDescriptor.iFormatDescriptor.iDescriptorType = KWebcameraSCVideoStreaming;
+	bDescriptor.iFormatDescriptor.iDescriptorSubType = KWebcameraVSFormatUnconmpressed;
+
+	//bFormatIndex : First and only format descriptor.
+	//This field is set by the host.
+	bDescriptor.iFormatDescriptor.iFormatIndex = 0x01;
+
+	bDescriptor.iFormatDescriptor.iNumFrameDescriptor = KWebcameraVSFrameUncompressed;
+	bDescriptor.iFormatDescriptor.iGuid = aDataInfo.iDataFortmat.iSubFormat;
+	bDescriptor.iFormatDescriptor.iBitsPerPixel = aDataInfo.iVideoInfoHeader.iBmiHeader.iBitCount;
+
+	//bDefaultFrameIndex : Default frame index is 1.
+	bDescriptor.iFormatDescriptor.iDefaultFrameIndex = 0x01;
+
+	bDescriptor.iFormatDescriptor.iAspectRatioX = 4;
+
+	bDescriptor.iFormatDescriptor.iAspectRatioY = 3;
+
+	//InterlaceFlags.		//VideoInfoHeader2 dwInterlaceFlags.
+	//No interlaced stream.
+	bDescriptor.iFormatDescriptor.iInterlaceFlags = 0x00;
+
+	//0: No restrictions.
+	bDescriptor.iFormatDescriptor.iCopyProtect = 0x00;
+
+	//Describe FrameDescriptor Part.
+	bDescriptor.iFrameDescriptor.iDescriptorType = KWebcameraSCVideoStreaming;
+	bDescriptor.iFrameDescriptor.iDescriptorSubType = KWebcameraVSFrameUncompressed;
+
+	//First and only frame descriptor.
+	bDescriptor.iFrameDescriptor.iFrameIndex = 0x01;
+
+	//Still images using capture method 0 are supported at this frame setting.D1: Fixed frame-rate.
+	//D2~D7 reserved.
+	bDescriptor.iFrameDescriptor.iCapabilities = 0x02;
+
+	bDescriptor.iFrameDescriptor.iWidth = (TUint16)aDataInfo.iVideoInfoHeader.iBmiHeader.iWidth;
+	bDescriptor.iFrameDescriptor.iHeight = (TUint16)aDataInfo.iVideoInfoHeader.iBmiHeader.iHeight;
+
+	//iDwBitRate = 147456000 = 640 * 480 * 16 * 30(FPS).
+	//bDescriptor.iFrameDescriptor.iMaxBitRate.
+	bDescriptor.iFrameDescriptor.iMaxBitRate = aDataInfo.iVideoInfoHeader.iDwBitRate;
+	//bDescriptor.iFrameDescriptor.iMinBitRate.
+	bDescriptor.iFrameDescriptor.iMinBitRate = aDataInfo.iVideoInfoHeader.iDwBitRate;
+
+	//bDescriptor.iFrameDescriptor.iMaxVideoFrameBufferSize.
+	//max frame size is 640 * 480 * 2 = 614400.
+	bDescriptor.iFrameDescriptor.iMaxVideoFrameBufferSize = aDataInfo.iVideoInfoHeader.iBmiHeader.iSizeImage;
+
+	//bDescriptor.iFrameDescriptor.iDefaultFrameInterval.
+	//147456000 / 640 / 480 / 16 = 30(FPS) -> 33.3ms -> 33,333.3ƒÊs -> 333333.3 * 100ns = 333333 = iAvgTimePerFrame.
+	bDescriptor.iFrameDescriptor.iDefaultFrameInterval = (TUint32)aDataInfo.iVideoInfoHeader.iAvgTimePerFrame;
+
+	//0: Continuous frame interval.
+	bDescriptor.iFrameDescriptor.iFrameIntervalType = 0x00;
+
+	//bDescriptor.iFrameDescriptor.iLength.
+	if (bDescriptor.iFrameDescriptor.iFrameIntervalType == 0)
+		{
+		bDescriptor.iFrameDescriptor.iFrameInterval.iFrameInterval1 = (TUint32)aDataInfo.iVideoInfoHeader.iAvgTimePerFrame;
+		//highest frame rate.
+
+		bDescriptor.iFrameDescriptor.iFrameInterval.iFrameInterval2 = (TUint32)aDataInfo.iVideoInfoHeader.iAvgTimePerFrame;
+		//lowest frame rate.
+		
+		bDescriptor.iFrameDescriptor.iFrameInterval.iFrameInterval3 = (TUint32)aDataInfo.iVideoInfoHeader.iAvgTimePerFrame;
+		//Indicates granularity of frame interval range.
+		
+		bDescriptor.iFrameDescriptor.iLength = 38;
+		//iFrameIntervalType = 0 : 38, > 0 : 26+(4*n).
+		}
+	return bDescriptor;
+	}
+
+//UVC heder class.
+
+/**
+Constructor.
+*/
+DWebCameraUVCHeader::DWebCameraUVCHeader()
+	{
+	DP("DWebCameraUVCHeader::DWebCameraUVCHeader construct");
+	}
+
+/**
+Destructor.
+*/
+DWebCameraUVCHeader::~DWebCameraUVCHeader()
+	{
+	DP("DWebCameraUVCHeader::DWebCameraUVCHeader destruct");
+	}
+
+/**
+Describe UVC Header.
+@param	aDataInfo	[in]				Information of data from lower layer.
+@return	bHeader							UVC Header descibed.
+*/
+TWebcameraUVCHeaderFormat DWebCameraUVCHeader::DescribeHeader(const TWebcameraDataInfo aDataInfo)
+	{
+	TWebcameraDataInfo bDataInfo = aDataInfo;
+	TWebcameraUVCHeaderFormat bHeader;
+
+	//Describe HeaderInfo to be included UVC Header.
+	bHeader.iHeaderInfo = DescribeHeaderInfo(bDataInfo);
+
+	//Describe HeaderLength to be included UVC Header if PTS was set.
+	bHeader.iHeaderLength = DescribeHeaderLength(bDataInfo, bHeader.iHeaderInfo);
+
+	//Describe PresentationTime to be included UVC Header.
+	if ((bHeader.iHeaderInfo & KWebcameraPts) > 0)
+		{
+		bHeader.iPresentationTime = DescribePresentationTime(bDataInfo);
+		}
+
+	//Describe SourceClockReference to be included UVC Header if SCR was set.
+	if ((bHeader.iHeaderInfo & KWebcameraScr) > 0)
+		{
+		bHeader.iSourceClockReference = DescribeSourceClockReference(bDataInfo);
+		}
+	return bHeader;
+	}
+
+/**
+Describe HeaderInfo of UVC Header.
+@param	aDataInfo					[in]	DataInfo get from lower layer.
+@return	bHeaderInfo.
+*/
+TUint8 DWebCameraUVCHeader::DescribeHeaderInfo(const TWebcameraDataInfo aDataInfo)
+	{
+	TUint8 bHeaderInfo = 0x00;
+
+//	bHeaderInfo |= KWebcameraEoh;
+
+//	bHeaderInfo |= KWebcameraErr;
+
+//	bHeaderInfo |= KWebcameraSti;
+
+//	bHeaderInfo |= KWebcameraScr;
+
+	//Case: Set PTS infomation.
+	if (aDataInfo.iVideoInfoHeader.iAvgTimePerFrame != 0)
+		{
+		bHeaderInfo |= KWebcameraPts;
+		}
+
+//	bHeaderInfo |= KWebcameraEof;
+
+	//Reversing FID.
+	iFID = ~iFID;
+	iFID &= KWebcameraFid;
+	bHeaderInfo |= iFID;
+
+	return bHeaderInfo;
+	}
+
+/**
+Describe HeaderLength to be included UVC Header.
+@param	aDataInfo		[in]								Information of data from lower layer.
+		aHeaderInfo		[in]								HeaderInfo to be included UVC Header.
+@return	bHeaderLength.
+*/
+TUint8 DWebCameraUVCHeader::DescribeHeaderLength(const TWebcameraDataInfo aDataInfo, TUint8 aHeaderInfo)
+	{
+	TUint8 bHeaderLength;
+	bHeaderLength = 2;
+
+	//Get information of PTS .
+	if ((aHeaderInfo & KWebcameraPts) > 0)
+		{
+		bHeaderLength += 4;
+		}
+
+	//Get information of SCR.
+	if ((aHeaderInfo & KWebcameraScr) > 0)
+		{
+		bHeaderLength += 6;
+		}
+
+	return bHeaderLength;
+	}
+
+/**
+Describe PresentationTime to be included UVC Header.
+@param	@param	aDataInfo						[in]	Information of Data from lower layer.
+@return	bPresentationTime.
+*/
+TUint32 DWebCameraUVCHeader::DescribePresentationTime(const TWebcameraDataInfo aDataInfo)
+	{
+	TUint32 bPresentationTime;
+	//Substitution information of AvgTimePerFrame for PresentationTime.
+	bPresentationTime = (TUint32)aDataInfo.iVideoInfoHeader.iAvgTimePerFrame;
+
+	return bPresentationTime;
+	}
+
+/**
+Describe SourceClockReference to be included UVC Header.
+@param	aDataInfo					[in]	Information of data from lower layer.
+@return	bSourceClockReference.
+*/
+TWebcameraUVCSourceClockReference DWebCameraUVCHeader::DescribeSourceClockReference(const TWebcameraDataInfo aDataInfo)
+	{
+	TWebcameraUVCSourceClockReference bSourceClockReference;
+	//Substitute information of TokenCounter for iTokenCounter.
+	bSourceClockReference.iTokenCounter = 0x0000;
+	bSourceClockReference.iTokenCounter &= KWebcameraTokenCounter;
+
+	//Substitute information of SourceTimeClock for iSourceTimeClock.
+//	bSourceClockReference.iSourceTimeClock = (TUint32) aSourceTimeClock;
+
+	return bSourceClockReference;
+	}
+
+//Describe class.
+
+/**
+Constructor.
+*/
+DWebCameraDescribe::DWebCameraDescribe()
+	{
+	DP("DWebCameraDescribe::DWebCameraDescribe construct");
+	}
+
+/**
+Destructor.
+*/
+DWebCameraDescribe::~DWebCameraDescribe()
+	{
+	delete iDescribe;
+	DP("DWebCameraDescribe::DWebCameraDescribe destruct");
+	}
+	
+/**
+Parse iDataInfo from lower layer and describe UVC Header and Descriptor.
+@param	aDataInfo					[in]	Information of data from lower layer.
+@return	bUVC.
+*/
+TWebcameraUVC DWebCameraDescribe::ParseDataInfo(const TWebcameraDataInfo aDataInfo)
+	{
+	TWebcameraDataInfo bDataInfo = aDataInfo;
+	TWebcameraUVC bUvc;
+
+	//Describe UVC Header.
+	DWebCameraUVCHeader* bHeader;
+	bHeader = new DWebCameraUVCHeader;
+	bUvc.iUVCHeader = bHeader->DescribeHeader(bDataInfo);
+	delete bHeader;
+
+	//If MajorFormat equal KWebcameraVideoStream, this format is VideoStream.
+	if (bDataInfo.iDataFortmat.iMajorFormat.iData1 == KWebcameraVideoStream)
+		{
+		//Discriminate by SubFormat.
+		switch (bDataInfo.iDataFortmat.iSubFormat.iData1)
+			{
+			//Case of YUY2 Format.
+			case KWebcameraYuy2:
+				iDescribe = new DWebCameraUVCDescribeDescriptorYUY2;
+				break;
+			
+			//Case of default.
+			default:
+				//No format that discriminated.
+				break;
+			}
+		//Describe UVC Descriptor.
+		bUvc.iUVCDescriptor = iDescribe->DescribeDescriptor(bDataInfo);
+		}
+
+	return bUvc;
+	}