@@ -1507,35 +1507,6 @@ gcd(int a, int b)
15071507static enum gpujpeg_pixel_format
15081508get_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