Skip to content

Commit e51a8a4

Browse files
committed
get_native_pixel_format: refactor for further changes
1 parent 2628b85 commit e51a8a4

1 file changed

Lines changed: 35 additions & 29 deletions

File tree

src/gpujpeg_reader.c

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1507,35 +1507,6 @@ gcd(int a, int b)
15071507
static enum gpujpeg_pixel_format
15081508
get_native_pixel_format(struct gpujpeg_parameters* param)
15091509
{
1510-
if ( param->comp_count == 3 ) {
1511-
// reduce [2, 2; 1, 2; 1, 2] (FFmpeg) to [2, 1; 1, 1; 1, 1]
1512-
int horizontal_gcd = param->sampling_factor[0].horizontal;
1513-
int vertical_gcd = param->sampling_factor[0].vertical;
1514-
for (int i = 1; i < 3; ++i) {
1515-
horizontal_gcd = gcd(horizontal_gcd, param->sampling_factor[i].horizontal);
1516-
vertical_gcd = gcd(vertical_gcd, param->sampling_factor[i].vertical);
1517-
}
1518-
for (int i = 0; i < 3; ++i) {
1519-
param->sampling_factor[i].horizontal /= horizontal_gcd;
1520-
param->sampling_factor[i].vertical /= vertical_gcd;
1521-
}
1522-
1523-
if ( param->sampling_factor[1].horizontal == 1 && param->sampling_factor[1].vertical == 1 &&
1524-
param->sampling_factor[2].horizontal == 1 && param->sampling_factor[2].vertical == 1 ) {
1525-
int sum = param->interleaved << 16 | param->sampling_factor[0].horizontal << 8 |
1526-
param->sampling_factor[0].vertical; // NOLINT
1527-
switch (sum) {
1528-
case 1<<16 | 1<<8 | 1: return GPUJPEG_444_U8_P012; break; // NOLINT
1529-
case 0<<16 | 1<<8 | 1: return GPUJPEG_444_U8_P0P1P2; break; // NOLINT
1530-
case 1<<16 | 2<<8 | 1: return GPUJPEG_422_U8_P1020; break; // NOLINT
1531-
case 0<<16 | 2<<8 | 1: return GPUJPEG_422_U8_P0P1P2; break; // NOLINT
1532-
case 1<<16 | 2<<8 | 2: // we have only one pixfmt for 420, so use for both NOLINT
1533-
case 0<<16 | 2<<8 | 2: return GPUJPEG_420_U8_P0P1P2; break; // NOLINT
1534-
default: break;
1535-
}
1536-
}
1537-
}
1538-
15391510
if ( param->comp_count == 4 ) {
15401511
_Bool subsampling_is4444 = 1;
15411512
for (int i = 1; i < 4; ++i) {
@@ -1548,7 +1519,42 @@ get_native_pixel_format(struct gpujpeg_parameters* param)
15481519
if (subsampling_is4444) {
15491520
return GPUJPEG_4444_U8_P0123;
15501521
}
1522+
return GPUJPEG_PIXFMT_NONE;
1523+
}
1524+
1525+
if ( param->comp_count != 3 ) {
1526+
return GPUJPEG_PIXFMT_NONE;
1527+
}
1528+
1529+
// reduce [2, 2; 1, 2; 1, 2] (FFmpeg) to [2, 1; 1, 1; 1, 1]
1530+
int horizontal_gcd = param->sampling_factor[0].horizontal;
1531+
int vertical_gcd = param->sampling_factor[0].vertical;
1532+
for ( int i = 1; i < 3; ++i ) {
1533+
horizontal_gcd = gcd(horizontal_gcd, param->sampling_factor[i].horizontal);
1534+
vertical_gcd = gcd(vertical_gcd, param->sampling_factor[i].vertical);
1535+
}
1536+
for ( int i = 0; i < 3; ++i ) {
1537+
param->sampling_factor[i].horizontal /= horizontal_gcd;
1538+
param->sampling_factor[i].vertical /= vertical_gcd;
1539+
}
1540+
1541+
if ( param->sampling_factor[1].horizontal == 1 && param->sampling_factor[1].vertical == 1 &&
1542+
param->sampling_factor[2].horizontal == 1 && param->sampling_factor[2].vertical == 1 ) {
1543+
int sum = param->interleaved << 16 | param->sampling_factor[0].horizontal << 8 |
1544+
param->sampling_factor[0].vertical; // NOLINT
1545+
switch ( sum ) {
1546+
// clang-format off
1547+
case 1<<16 | 1<<8 | 1: return GPUJPEG_444_U8_P012; break; // NOLINT
1548+
case 0<<16 | 1<<8 | 1: return GPUJPEG_444_U8_P0P1P2; break; // NOLINT
1549+
case 1<<16 | 2<<8 | 1: return GPUJPEG_422_U8_P1020; break; // NOLINT
1550+
case 0<<16 | 2<<8 | 1: return GPUJPEG_422_U8_P0P1P2; break; // NOLINT
1551+
case 1<<16 | 2<<8 | 2: // we have only one pixfmt for 420, so use for both NOLINT
1552+
case 0<<16 | 2<<8 | 2: return GPUJPEG_420_U8_P0P1P2; break; // NOLINT
1553+
default: break;
1554+
// clang-format on
1555+
}
15511556
}
1557+
15521558
return GPUJPEG_PIXFMT_NONE;
15531559
}
15541560

0 commit comments

Comments
 (0)