@@ -41,6 +41,11 @@ const uint8_t OB_EXT_CMD2[16] = { 0x47, 0x4d, 0x04, 0x00, 0x02, 0x00, 0x56, 0x00
4141const uint8_t OB_EXT_CMD3[16 ] = { 0x47 , 0x4d , 0x04 , 0x00 , 0x02 , 0x00 , 0x58 , 0x00 , 0x2a , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 };
4242const uint8_t OB_EXT_CMD4[16 ] = { 0x47 , 0x4d , 0x02 , 0x00 , 0x03 , 0x00 , 0x60 , 0x00 , 0xed , 0x03 , 0x00 , 0x00 };
4343const uint8_t OB_EXT_CMD5[16 ] = { 0x47 , 0x4d , 0x02 , 0x00 , 0x03 , 0x00 , 0x62 , 0x00 , 0xe9 , 0x03 , 0x00 , 0x00 };
44+ const uint8_t OB_EXT_CMD6[16 ] = { 0x47 , 0x4d , 0x04 , 0x00 , 0x02 , 0x00 , 0x7c , 0x00 , 0x2a , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 };
45+ const uint8_t OB_EXT_CMD7[16 ] = { 0x47 , 0x4d , 0x04 , 0x00 , 0x02 , 0x00 , 0xfe , 0x12 , 0x55 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 };
46+ const uint8_t OB_EXT_CMD8[16 ] = { 0x47 , 0x4d , 0x04 , 0x00 , 0x02 , 0x00 , 0xfe , 0x13 , 0x3f , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 };
47+ const uint8_t OB_EXT_CMD9[16 ] = { 0x47 , 0x4d , 0x04 , 0x00 , 0x02 , 0x00 , 0xfa , 0x13 , 0x4b , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 };
48+ const uint8_t OB_EXT_CMD10[16 ] = { 0x47 , 0x4d , 0x04 , 0x00 , 0x02 , 0x00 , 0xfa , 0x13 , 0x3f , 0x00 , 0x00 , 0x00 , 0x04 , 0x00 , 0x00 , 0x00 };
4449
4550#if defined(HAVE_OBSENSOR_V4L2)
4651#define fourCc2Int (a, b, c, d ) \
@@ -54,6 +59,7 @@ const std::map<uint32_t, FrameFormat> fourccToOBFormat = {
5459 {fourCc2Int (' Y' , ' U' , ' Y' , ' 2' ), FRAME_FORMAT_YUYV},
5560 {fourCc2Int (' M' , ' J' , ' P' , ' G' ), FRAME_FORMAT_MJPG},
5661 {fourCc2Int (' Y' , ' 1' , ' 6' , ' ' ), FRAME_FORMAT_Y16},
62+ {fourCc2Int (' Y' , ' 1' , ' 4' , ' ' ), FRAME_FORMAT_Y14},
5763};
5864
5965StreamType parseUvcDeviceNameToStreamType (const std::string& devName)
@@ -187,6 +193,54 @@ void DepthFrameProcessor::process(Frame* frame)
187193 }
188194}
189195
196+
197+ DepthFrameUnpacker::DepthFrameUnpacker (){
198+ outputDataBuf_ = new uint8_t [OUT_DATA_SIZE];
199+ }
200+
201+ DepthFrameUnpacker::~DepthFrameUnpacker (){
202+ delete[] outputDataBuf_;
203+ }
204+
205+
206+ #define ON_BITS (count ) ((1 << count) - 1 )
207+ #define CREATE_MASK (count, offset ) (ON_BITS(count) << offset)
208+ #define TAKE_BITS (source, count, offset ) ((source & CREATE_MASK (count, offset)) >> offset)
209+ void DepthFrameUnpacker::process(Frame *frame){
210+ const uint8_t tarStep = 16 ;
211+ const uint8_t srcStep = 28 ;
212+ uint16_t *tar = (uint16_t *)outputDataBuf_;
213+ uint8_t *src = frame->data ;
214+
215+ uint32_t pixelSize = frame->width * frame->height ;
216+ for (uint32_t i = 0 ; i < pixelSize; i += tarStep) {
217+ tar[0 ] = (TAKE_BITS (src[0 ], 8 , 0 ) << 6 ) | TAKE_BITS (src[1 ], 6 , 2 );
218+ tar[1 ] = (TAKE_BITS (src[1 ], 2 , 0 ) << 12 ) | (TAKE_BITS (src[2 ], 8 , 0 ) << 4 ) | TAKE_BITS (src[3 ], 4 , 4 );
219+ tar[2 ] = (TAKE_BITS (src[3 ], 4 , 0 ) << 10 ) | (TAKE_BITS (src[4 ], 8 , 0 ) << 2 ) | TAKE_BITS (src[5 ], 2 , 6 );
220+ tar[3 ] = (TAKE_BITS (src[5 ], 6 , 0 ) << 8 ) | TAKE_BITS (src[6 ], 8 , 0 );
221+
222+ tar[4 ] = (TAKE_BITS (src[7 ], 8 , 0 ) << 6 ) | TAKE_BITS (src[8 ], 6 , 2 );
223+ tar[5 ] = (TAKE_BITS (src[8 ], 2 , 0 ) << 12 ) | (TAKE_BITS (src[9 ], 8 , 0 ) << 4 ) | TAKE_BITS (src[10 ], 4 , 4 );
224+ tar[6 ] = (TAKE_BITS (src[10 ], 4 , 0 ) << 10 ) | (TAKE_BITS (src[11 ], 8 , 0 ) << 2 ) | TAKE_BITS (src[12 ], 2 , 6 );
225+ tar[7 ] = (TAKE_BITS (src[12 ], 6 , 0 ) << 8 ) | TAKE_BITS (src[13 ], 8 , 0 );
226+
227+ tar[8 ] = (TAKE_BITS (src[14 ], 8 , 0 ) << 6 ) | TAKE_BITS (src[15 ], 6 , 2 );
228+ tar[9 ] = (TAKE_BITS (src[15 ], 2 , 0 ) << 12 ) | (TAKE_BITS (src[16 ], 8 , 0 ) << 4 ) | TAKE_BITS (src[17 ], 4 , 4 );
229+ tar[10 ] = (TAKE_BITS (src[17 ], 4 , 0 ) << 10 ) | (TAKE_BITS (src[18 ], 8 , 0 ) << 2 ) | TAKE_BITS (src[19 ], 2 , 6 );
230+ tar[11 ] = (TAKE_BITS (src[19 ], 6 , 0 ) << 8 ) | TAKE_BITS (src[20 ], 8 , 0 );
231+
232+ tar[12 ] = (TAKE_BITS (src[21 ], 8 , 0 ) << 6 ) | TAKE_BITS (src[22 ], 6 , 2 );
233+ tar[13 ] = (TAKE_BITS (src[22 ], 2 , 0 ) << 12 ) | (TAKE_BITS (src[23 ], 8 , 0 ) << 4 ) | TAKE_BITS (src[24 ], 4 , 4 );
234+ tar[14 ] = (TAKE_BITS (src[24 ], 4 , 0 ) << 10 ) | (TAKE_BITS (src[25 ], 8 , 0 ) << 2 ) | TAKE_BITS (src[26 ], 2 , 6 );
235+ tar[15 ] = (TAKE_BITS (src[26 ], 6 , 0 ) << 8 ) | TAKE_BITS (src[27 ], 8 , 0 );
236+
237+ src += srcStep;
238+ tar += tarStep;
239+ }
240+ frame->data = outputDataBuf_;
241+ frame->format = FRAME_FORMAT_Y16;
242+ }
243+
190244IUvcStreamChannel::IUvcStreamChannel (const UvcDeviceInfo& devInfo) :
191245 devInfo_ (devInfo),
192246 streamType_ (parseUvcDeviceNameToStreamType(devInfo_.name))
@@ -198,6 +252,10 @@ StreamType IUvcStreamChannel::streamType() const {
198252 return streamType_;
199253}
200254
255+ uint16_t IUvcStreamChannel::getPid () const {
256+ return devInfo_.pid ;
257+ };
258+
201259bool IUvcStreamChannel::setProperty (int propId, const uint8_t * /* data*/ , uint32_t /* dataSize*/ )
202260{
203261 uint8_t * rcvData;
@@ -206,15 +264,28 @@ bool IUvcStreamChannel::setProperty(int propId, const uint8_t* /*data*/, uint32_
206264 switch (propId)
207265 {
208266 case DEPTH_TO_COLOR_ALIGN:
209- // todo: value filling
210- rst &= setXu (2 , OB_EXT_CMD0, sizeof (OB_EXT_CMD0));
211- rst &= getXu (2 , &rcvData, &rcvLen);
212- rst &= setXu (2 , OB_EXT_CMD1, sizeof (OB_EXT_CMD1));
213- rst &= getXu (2 , &rcvData, &rcvLen);
214- rst &= setXu (2 , OB_EXT_CMD2, sizeof (OB_EXT_CMD2));
215- rst &= getXu (2 , &rcvData, &rcvLen);
216- rst &= setXu (2 , OB_EXT_CMD3, sizeof (OB_EXT_CMD3));
217- rst &= getXu (2 , &rcvData, &rcvLen);
267+ if (OBSENSOR_GEMINI2_PID == devInfo_.pid ){
268+ rst &= setXu (2 , OB_EXT_CMD8, sizeof (OB_EXT_CMD8));
269+ rst &= getXu (2 , &rcvData, &rcvLen);
270+ rst &= setXu (2 , OB_EXT_CMD6, sizeof (OB_EXT_CMD6));
271+ rst &= getXu (2 , &rcvData, &rcvLen);
272+ }
273+ else if (OBSENSOR_ASTRA2_PID == devInfo_.pid ){
274+ rst &= setXu (2 , OB_EXT_CMD10, sizeof (OB_EXT_CMD8));
275+ rst &= getXu (2 , &rcvData, &rcvLen);
276+ rst &= setXu (2 , OB_EXT_CMD6, sizeof (OB_EXT_CMD6));
277+ rst &= getXu (2 , &rcvData, &rcvLen);
278+ }
279+ else {
280+ rst &= setXu (2 , OB_EXT_CMD0, sizeof (OB_EXT_CMD0));
281+ rst &= getXu (2 , &rcvData, &rcvLen);
282+ rst &= setXu (2 , OB_EXT_CMD1, sizeof (OB_EXT_CMD1));
283+ rst &= getXu (2 , &rcvData, &rcvLen);
284+ rst &= setXu (2 , OB_EXT_CMD2, sizeof (OB_EXT_CMD2));
285+ rst &= getXu (2 , &rcvData, &rcvLen);
286+ rst &= setXu (2 , OB_EXT_CMD3, sizeof (OB_EXT_CMD3));
287+ rst &= getXu (2 , &rcvData, &rcvLen);
288+ }
218289 break ;
219290 default :
220291 rst = false ;
@@ -231,12 +302,50 @@ bool IUvcStreamChannel::getProperty(int propId, uint8_t* recvData, uint32_t* rec
231302 switch (propId)
232303 {
233304 case CAMERA_PARAM:
234- rst &= setXu (2 , OB_EXT_CMD5, sizeof (OB_EXT_CMD5));
235- rst &= getXu (2 , &rcvData, &rcvLen);
236- if (rst && OB_EXT_CMD5[6 ] == rcvData[6 ] && rcvData[8 ] == 0 && rcvData[9 ] == 0 )
237- {
238- memcpy (recvData, rcvData + 10 , rcvLen - 10 );
239- *recvDataSize = rcvLen - 10 ;
305+ if (OBSENSOR_GEMINI2_PID == devInfo_.pid ){
306+ // return default param
307+ CameraParam param;
308+ param.p0 [0 ] = 516 .652f ;
309+ param.p0 [1 ] = 516 .692f ;
310+ param.p0 [2 ] = 322 .988f ;
311+ param.p0 [3 ] = 235 .787f ;
312+ param.p1 [0 ] = 516 .652f ;
313+ param.p1 [1 ] = 516 .692f ;
314+ param.p1 [2 ] = 322 .988f ;
315+ param.p1 [3 ] = 235 .787f ;
316+ param.p6 [0 ] = 640 ;
317+ param.p6 [1 ] = 480 ;
318+ param.p7 [0 ] = 640 ;
319+ param.p7 [1 ] = 480 ;
320+ *recvDataSize = sizeof (CameraParam);
321+ memcpy (recvData, ¶m, *recvDataSize);
322+ }
323+ else if (OBSENSOR_ASTRA2_PID == devInfo_.pid ){
324+ // return default param
325+ CameraParam param;
326+ param.p0 [0 ] = 558 .151f ;
327+ param.p0 [1 ] = 558 .003f ;
328+ param.p0 [2 ] = 312 .546f ;
329+ param.p0 [3 ] = 241 .169f ;
330+ param.p1 [0 ] = 558 .151f ;
331+ param.p1 [1 ] = 558 .003f ;
332+ param.p1 [2 ] = 312 .546f ;
333+ param.p1 [3 ] = 241 .169f ;
334+ param.p6 [0 ] = 640 ;
335+ param.p6 [1 ] = 480 ;
336+ param.p7 [0 ] = 640 ;
337+ param.p7 [1 ] = 480 ;
338+ *recvDataSize = sizeof (CameraParam);
339+ memcpy (recvData, ¶m, *recvDataSize);
340+ }
341+ else {
342+ rst &= setXu (2 , OB_EXT_CMD5, sizeof (OB_EXT_CMD5));
343+ rst &= getXu (2 , &rcvData, &rcvLen);
344+ if (rst && OB_EXT_CMD5[6 ] == rcvData[6 ] && rcvData[8 ] == 0 && rcvData[9 ] == 0 )
345+ {
346+ memcpy (recvData, rcvData + 10 , rcvLen - 10 );
347+ *recvDataSize = rcvLen - 10 ;
348+ }
240349 }
241350 break ;
242351 default :
@@ -249,7 +358,20 @@ bool IUvcStreamChannel::getProperty(int propId, uint8_t* recvData, uint32_t* rec
249358
250359bool IUvcStreamChannel::initDepthFrameProcessor ()
251360{
252- if (streamType_ == OBSENSOR_STREAM_DEPTH && setXu (2 , OB_EXT_CMD4, sizeof (OB_EXT_CMD4)))
361+ if (OBSENSOR_GEMINI2_PID == devInfo_.pid || OBSENSOR_ASTRA2_PID == devInfo_.pid ){
362+ uint8_t * rcvData;
363+ uint32_t rcvLen;
364+
365+ setXu (2 , OB_EXT_CMD7, sizeof (OB_EXT_CMD7));
366+ getXu (2 , &rcvData, &rcvLen);
367+
368+ setXu (2 , OB_EXT_CMD9, sizeof (OB_EXT_CMD9));
369+ getXu (2 , &rcvData, &rcvLen);
370+
371+ depthFrameProcessor_ = makePtr<DepthFrameUnpacker>();
372+ return true ;
373+ }
374+ else if (streamType_ == OBSENSOR_STREAM_DEPTH && setXu (2 , OB_EXT_CMD4, sizeof (OB_EXT_CMD4)))
253375 {
254376 uint8_t * rcvData;
255377 uint32_t rcvLen;
0 commit comments