diff -r 0dfaca43d90e -r 606eafc6d6a8 baseport/syborg/webcamera/webcamera_uvc.cpp --- /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; + }