Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit aa5f772

Browse files
authored
Merge pull request #25249 from carabsc:cara_changes
Added support for V4L2_PIX_FMT_SGRBG8 pixel format to V4L2 backend
2 parents 4c86b28 + 8d5dd2e commit aa5f772

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed

modules/videoio/src/cap_v4l.cpp

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,7 @@ bool CvCaptureCAM_V4L::autosetup_capture_mode_v4l2()
613613
V4L2_PIX_FMT_NV21,
614614
V4L2_PIX_FMT_SBGGR8,
615615
V4L2_PIX_FMT_SGBRG8,
616+
V4L2_PIX_FMT_SGRBG8,
616617
V4L2_PIX_FMT_XBGR32,
617618
V4L2_PIX_FMT_ABGR32,
618619
V4L2_PIX_FMT_SN9C10X,
@@ -679,6 +680,7 @@ bool CvCaptureCAM_V4L::convertableToRgb() const
679680
case V4L2_PIX_FMT_SBGGR8:
680681
case V4L2_PIX_FMT_SN9C10X:
681682
case V4L2_PIX_FMT_SGBRG8:
683+
case V4L2_PIX_FMT_SGRBG8:
682684
case V4L2_PIX_FMT_RGB24:
683685
case V4L2_PIX_FMT_Y16:
684686
case V4L2_PIX_FMT_Y16_BE:
@@ -1487,6 +1489,94 @@ static void sgbrg2rgb24(long int WIDTH, long int HEIGHT, unsigned char *src, uns
14871489
}
14881490
}
14891491

1492+
// SGRBG to RGB24
1493+
static void sgrbg2rgb24(long int WIDTH, long int HEIGHT, unsigned char *src, unsigned char *dst)
1494+
{
1495+
long int i;
1496+
unsigned char *rawpt, *scanpt;
1497+
long int size;
1498+
1499+
rawpt = src;
1500+
scanpt = dst;
1501+
size = WIDTH*HEIGHT;
1502+
1503+
for ( i = 0; i < size; i++ )
1504+
{
1505+
if ( (i/WIDTH) % 2 == 0 ) //even row
1506+
{
1507+
if ( (i % 2) == 0 ) //even pixel
1508+
{
1509+
if ( (i > WIDTH) && ((i % WIDTH) > 0) )
1510+
{
1511+
*scanpt++ = (*(rawpt-WIDTH) + *(rawpt+WIDTH))/2; /* R */
1512+
*scanpt++ = *(rawpt); /* G */
1513+
*scanpt++ = (*(rawpt-1)+*(rawpt+1))/2; /* B */
1514+
} else
1515+
{
1516+
/* first line or left column */
1517+
1518+
*scanpt++ = *(rawpt+WIDTH); /* R */
1519+
*scanpt++ = *(rawpt); /* G */
1520+
*scanpt++ = *(rawpt+1); /* B */
1521+
}
1522+
} else //odd pixel
1523+
{
1524+
if ( (i > WIDTH) && ((i % WIDTH) < (WIDTH-1)) )
1525+
{
1526+
*scanpt++ = (*(rawpt-WIDTH-1) + *(rawpt-WIDTH+1) +
1527+
*(rawpt+WIDTH-1) + *(rawpt+WIDTH+1)) / 4; /* R */
1528+
*scanpt++ = (*(rawpt-1) + *(rawpt+1) +
1529+
*(rawpt-WIDTH) + *(rawpt+WIDTH)) / 4; /* G */
1530+
*scanpt++ = *(rawpt); /* B */
1531+
} else
1532+
{
1533+
/* first line or right column */
1534+
1535+
*scanpt++ = *(rawpt+WIDTH-1); /* R */
1536+
*scanpt++ = (*(rawpt-1)+*(rawpt+WIDTH))/2; /* G */
1537+
*scanpt++ = *(rawpt); /* B */
1538+
}
1539+
}
1540+
} else
1541+
{ //odd row
1542+
if ( (i % 2) == 0 ) //even pixel
1543+
{
1544+
if ( (i < (WIDTH*(HEIGHT-1))) && ((i % WIDTH) > 0) )
1545+
{
1546+
*scanpt++ = *(rawpt); /* R */
1547+
*scanpt++ = (*(rawpt-1) + *(rawpt+1)+
1548+
*(rawpt-WIDTH) + *(rawpt+WIDTH)) / 4; /* G */
1549+
*scanpt++ = (*(rawpt-WIDTH-1) + *(rawpt-WIDTH+1) +
1550+
*(rawpt+WIDTH-1) + *(rawpt+WIDTH+1)) / 4; /* B */
1551+
} else
1552+
{
1553+
/* bottom line or left column */
1554+
1555+
*scanpt++ = *(rawpt); /* R */
1556+
*scanpt++ = (*(rawpt+1)+*(rawpt-WIDTH))/2; /* G */
1557+
*scanpt++ = *(rawpt-WIDTH+1); /* B */
1558+
}
1559+
} else
1560+
{ //odd pixel
1561+
if ( i < (WIDTH*(HEIGHT-1)) && ((i % WIDTH) < (WIDTH-1)) )
1562+
{
1563+
*scanpt++ = (*(rawpt-1)+*(rawpt+1))/2; /* R */
1564+
*scanpt++ = *(rawpt); /* G */
1565+
*scanpt++ = (*(rawpt-WIDTH)+*(rawpt+WIDTH))/2; /* B */
1566+
} else
1567+
{
1568+
/* bottom line or right column */
1569+
1570+
*scanpt++ = (*(rawpt-1)); /* R */
1571+
*scanpt++ = *(rawpt); /* G */
1572+
*scanpt++ = (*(rawpt-WIDTH)); /* B */
1573+
}
1574+
}
1575+
}
1576+
rawpt++;
1577+
}
1578+
}
1579+
14901580
#define CLAMP(x) ((x)<0?0:((x)>255)?255:(x))
14911581

14921582
typedef struct {
@@ -1706,6 +1796,10 @@ void CvCaptureCAM_V4L::convertToRgb(const Buffer &currentBuffer)
17061796
sgbrg2rgb24(imageSize.width, imageSize.height,
17071797
start, (unsigned char*)frame.imageData);
17081798
return;
1799+
case V4L2_PIX_FMT_SGRBG8:
1800+
sgrbg2rgb24(imageSize.width, imageSize.height,
1801+
start, (unsigned char*)frame.imageData);
1802+
return;
17091803
default:
17101804
break;
17111805
}

0 commit comments

Comments
 (0)