@@ -88,6 +88,13 @@ struct gpujpeg_reader
8888 int segment_info_count ;
8989 /// Segment info total buffers size
9090 int segment_info_size ;
91+
92+ const uint8_t * const image_end ;
93+ const bool ff_cs_itu601_is_709 ;
94+ enum gpujpeg_color_space header_color_space ;
95+ enum gpujpeg_header_type header_type ;
96+ bool in_spiff ;
97+ struct gpujpeg_exif_parameters exif_metadata ;
9198};
9299
93100/**
@@ -1011,7 +1018,7 @@ gpujpeg_reader_read_dri(int *out_restart_interval, uint8_t** image, const uint8_
10111018 */
10121019static int
10131020gpujpeg_reader_read_scan_content_by_parsing (struct gpujpeg_decoder * decoder , struct gpujpeg_reader * reader ,
1014- uint8_t * * image , uint8_t * image_end , struct gpujpeg_reader_scan * scan ,
1021+ uint8_t * * image , const uint8_t * image_end , struct gpujpeg_reader_scan * scan ,
10151022 int scan_index )
10161023{
10171024 size_t data_compressed_offset = reader -> data_compressed_size ;
@@ -1031,7 +1038,7 @@ gpujpeg_reader_read_scan_content_by_parsing(struct gpujpeg_decoder* decoder, str
10311038 uint8_t * ret = memchr (* image , 0xFF , image_end - * image );
10321039 if (ret == NULL || ret == image_end - 1 ) {
10331040 data_compressed_offset += image_end - * image ;
1034- * image = image_end ;
1041+ * image = ( uint8_t * ) image_end ;
10351042 break ;
10361043 }
10371044 data_compressed_offset += ret - * image + 2 ;
@@ -1140,8 +1147,8 @@ gpujpeg_reader_read_scan_content_by_parsing(struct gpujpeg_decoder* decoder, str
11401147 */
11411148static int
11421149gpujpeg_reader_read_scan_content_by_segment_info (struct gpujpeg_decoder * decoder , struct gpujpeg_reader * reader ,
1143- uint8_t * * image , uint8_t * image_end , struct gpujpeg_reader_scan * scan ,
1144- int scan_index )
1150+ uint8_t * * image , const uint8_t * image_end ,
1151+ struct gpujpeg_reader_scan * scan , int scan_index )
11451152{
11461153 // Calculate segment count
11471154 int segment_count = reader -> segment_info_size / 4 - 1 ;
@@ -1229,7 +1236,7 @@ sos_check_dump(int verbose, int comp_count, int Ss, int Se, int Ah, int Al)
12291236 */
12301237static int
12311238gpujpeg_reader_read_sos (struct gpujpeg_decoder * decoder , struct gpujpeg_reader * reader , uint8_t * * image ,
1232- uint8_t * image_end )
1239+ const uint8_t * image_end )
12331240{
12341241 if (* image + 3 > image_end ) {
12351242 fprintf (stderr , "[GPUJPEG] [Error] SOS goes beyond end of data\n" );
@@ -1362,29 +1369,29 @@ gpujpeg_reader_read_sos(struct gpujpeg_decoder* decoder, struct gpujpeg_reader*
13621369 * @retval @ref Errors
13631370 */
13641371static int
1365- gpujpeg_reader_read_common_markers (uint8_t * * image , const uint8_t * image_end , int marker , int log_level ,
1366- bool ff_cs_itu601_is_709 , enum gpujpeg_color_space * color_space ,
1367- enum gpujpeg_header_type * header_type , int * restart_interval , bool * in_spiff ,
1368- struct gpujpeg_exif_parameters * exif_metadata )
1372+ gpujpeg_reader_read_common_markers (uint8_t * * image , int marker , struct gpujpeg_reader * reader )
13691373{
13701374 int rc = 0 ;
13711375 switch (marker )
13721376 {
13731377 case GPUJPEG_MARKER_APP0 :
1374- if ( gpujpeg_reader_read_app0 (image , image_end , header_type , log_level ) == 0 ) {
1375- * color_space = GPUJPEG_YCBCR_BT601_256LVLS ;
1378+ if ( gpujpeg_reader_read_app0 (image , reader -> image_end , & reader -> header_type , reader -> param . verbose ) == 0 ) {
1379+ reader -> header_color_space = GPUJPEG_YCBCR_BT601_256LVLS ;
13761380 }
13771381 break ;
13781382 case GPUJPEG_MARKER_APP1 :
1379- gpujpeg_reader_read_app1 (image , image_end , header_type , color_space , log_level , exif_metadata );
1383+ gpujpeg_reader_read_app1 (image , reader -> image_end , & reader -> header_type , & reader -> header_color_space ,
1384+ reader -> param .verbose , & reader -> exif_metadata );
13801385 break ;
13811386 case GPUJPEG_MARKER_APP8 :
1382- if ( gpujpeg_reader_read_app8 (image , image_end , color_space , header_type , log_level , in_spiff ) != 0 ) {
1387+ if ( gpujpeg_reader_read_app8 (image , reader -> image_end , & reader -> header_color_space , & reader -> header_type ,
1388+ reader -> param .verbose , & reader -> in_spiff ) != 0 ) {
13831389 return -1 ;
13841390 }
13851391 break ;
13861392 case GPUJPEG_MARKER_APP14 :
1387- if ( gpujpeg_reader_read_app14 (image , image_end , color_space , header_type , log_level ) < 0 ) {
1393+ if ( gpujpeg_reader_read_app14 (image , reader -> image_end , & reader -> header_color_space , & reader -> header_type ,
1394+ reader -> param .verbose ) < 0 ) {
13881395 return -1 ;
13891396 }
13901397 break ;
@@ -1399,13 +1406,13 @@ gpujpeg_reader_read_common_markers(uint8_t** image, const uint8_t* image_end, in
13991406 case GPUJPEG_MARKER_APP11 :
14001407 case GPUJPEG_MARKER_APP12 :
14011408 case GPUJPEG_MARKER_APP15 :
1402- if ( log_level > 0 ) {
1409+ if ( reader -> param . verbose > 0 ) {
14031410 fprintf (stderr , "[GPUJPEG] [Warning] JPEG data contains not supported %s marker\n" , gpujpeg_marker_name ((enum gpujpeg_marker_code )marker ));
14041411 }
1405- gpujpeg_reader_skip_marker_content (image , image_end );
1412+ gpujpeg_reader_skip_marker_content (image , reader -> image_end );
14061413 break ;
14071414 case GPUJPEG_MARKER_DRI :
1408- if ( (rc = gpujpeg_reader_read_dri (restart_interval , image , image_end )) != 0 ) {
1415+ if ( (rc = gpujpeg_reader_read_dri (& reader -> param . restart_interval , image , reader -> image_end )) != 0 ) {
14091416 return rc ;
14101417 }
14111418 break ;
@@ -1445,7 +1452,8 @@ gpujpeg_reader_read_common_markers(uint8_t** image, const uint8_t* image_end, in
14451452 return -1 ;
14461453
14471454 case GPUJPEG_MARKER_COM :
1448- if ( gpujpeg_reader_read_com (image , image_end , ff_cs_itu601_is_709 , color_space ) != 0 ) {
1455+ if ( gpujpeg_reader_read_com (image , reader -> image_end , reader -> ff_cs_itu601_is_709 ,
1456+ & reader -> header_color_space ) != 0 ) {
14491457 return -1 ;
14501458 }
14511459 break ;
@@ -1522,45 +1530,33 @@ int
15221530gpujpeg_reader_read_image (struct gpujpeg_decoder * decoder , uint8_t * image , size_t image_size )
15231531{
15241532 // Setup reader
1525- struct gpujpeg_reader reader ;
1526- reader .param = decoder -> coder .param ;
1533+ struct gpujpeg_reader reader = {
1534+ .param = decoder -> coder .param ,
1535+ .param_image = decoder -> coder .param_image ,
1536+ .image_end = image + image_size ,
1537+ .ff_cs_itu601_is_709 = decoder -> ff_cs_itu601_is_709 ,
1538+ };
15271539 reader .param .restart_interval = 0 ;
1528- reader .param_image = decoder -> coder .param_image ;
15291540 reader .param_image .pixel_format = decoder -> req_pixel_format ;
15301541 reader .param_image .color_space = decoder -> req_color_space ;
1531- reader .comp_count = 0 ;
1532- reader .scan_count = 0 ;
1533- reader .segment_count = 0 ;
1534- reader .data_compressed_size = 0 ;
1535- reader .segment_info_count = 0 ;
1536- reader .segment_info_size = 0 ;
1537- enum gpujpeg_color_space header_color_space = GPUJPEG_NONE ;
1538- enum gpujpeg_header_type header_type = GPUJPEG_HEADER_DEFAULT ;
1539- struct gpujpeg_exif_parameters exif_metadata ;
1540-
1541- // Get image end
1542- uint8_t * image_end = image + image_size ;
15431542
15441543 // Check first SOI marker
1545- int marker_soi = gpujpeg_reader_read_marker (& image , image_end , decoder -> coder .param .verbose );
1544+ int marker_soi = gpujpeg_reader_read_marker (& image , reader . image_end , decoder -> coder .param .verbose );
15461545 if ( marker_soi != GPUJPEG_MARKER_SOI ) {
15471546 fprintf (stderr , "[GPUJPEG] [Error] JPEG data should begin with SOI marker, but marker %s was found!\n" , gpujpeg_marker_name ((enum gpujpeg_marker_code )marker_soi ));
15481547 return -1 ;
15491548 }
15501549
15511550 int eoi_presented = 0 ;
1552- _Bool in_spiff = 0 ;
15531551 while ( eoi_presented == 0 ) {
15541552 // Read marker
1555- int marker = gpujpeg_reader_read_marker (& image , image_end , decoder -> coder .param .verbose );
1553+ int marker = gpujpeg_reader_read_marker (& image , reader . image_end , decoder -> coder .param .verbose );
15561554 if ( marker == -1 ) {
15571555 return -1 ;
15581556 }
15591557
15601558 // Read more info according to the marker
1561- int rc = gpujpeg_reader_read_common_markers (& image , image_end , marker , decoder -> coder .param .verbose ,
1562- decoder -> ff_cs_itu601_is_709 , & header_color_space , & header_type ,
1563- & reader .param .restart_interval , & in_spiff , & exif_metadata );
1559+ int rc = gpujpeg_reader_read_common_markers (& image , marker , & reader );
15641560 if ( rc < 0 ) {
15651561 return rc ;
15661562 }
@@ -1570,36 +1566,36 @@ gpujpeg_reader_read_image(struct gpujpeg_decoder* decoder, uint8_t* image, size_
15701566 switch (marker )
15711567 {
15721568 case GPUJPEG_MARKER_APP13 :
1573- if ( gpujpeg_reader_read_app13 (& reader , & image , image_end ) != 0 )
1569+ if ( gpujpeg_reader_read_app13 (& reader , & image , reader . image_end ) != 0 )
15741570 return -1 ;
15751571 break ;
15761572 case GPUJPEG_MARKER_DQT :
1577- if ( gpujpeg_reader_read_dqt (decoder , & image , image_end ) != 0 )
1573+ if ( gpujpeg_reader_read_dqt (decoder , & image , reader . image_end ) != 0 )
15781574 return -1 ;
15791575 break ;
15801576
15811577 case GPUJPEG_MARKER_SOF1 : // Extended sequential with Huffman coder
15821578 fprintf (stderr , "[GPUJPEG] [Warning] Reading SOF1 as it was SOF0 marker (should work but verify it)!\n" );
15831579 /* fall through */
15841580 case GPUJPEG_MARKER_SOF0 : // Baseline
1585- if (header_color_space != GPUJPEG_NONE ) {
1586- reader .param .color_space_internal = header_color_space ;
1581+ if (reader . header_color_space != GPUJPEG_NONE ) {
1582+ reader .param .color_space_internal = reader . header_color_space ;
15871583 }
1588- if ( gpujpeg_reader_read_sof0 (& reader .param , & reader .param_image , header_color_space , header_type ,
1584+ if ( gpujpeg_reader_read_sof0 (& reader .param , & reader .param_image , reader . header_color_space , reader . header_type ,
15891585 decoder -> comp_table_quantization_map , decoder -> comp_id , & image ,
1590- image_end ) != 0 ) {
1586+ reader . image_end ) != 0 ) {
15911587 return -1 ;
15921588 }
15931589 adjust_format (& reader .param , & reader .param_image , reader .param .color_space_internal );
15941590 break ;
15951591
15961592 case GPUJPEG_MARKER_DHT :
1597- if ( gpujpeg_reader_read_dht (decoder , & image , image_end ) != 0 )
1593+ if ( gpujpeg_reader_read_dht (decoder , & image , reader . image_end ) != 0 )
15981594 return -1 ;
15991595 break ;
16001596
16011597 case GPUJPEG_MARKER_SOS :
1602- if ( gpujpeg_reader_read_sos (decoder , & reader , & image , image_end ) != 0 )
1598+ if ( gpujpeg_reader_read_sos (decoder , & reader , & image , reader . image_end ) != 0 )
16031599 return -1 ;
16041600 break ;
16051601
@@ -1610,12 +1606,12 @@ gpujpeg_reader_read_image(struct gpujpeg_decoder* decoder, uint8_t* image, size_
16101606 case GPUJPEG_MARKER_DAC :
16111607 case GPUJPEG_MARKER_DNL :
16121608 fprintf (stderr , "[GPUJPEG] [Warning] JPEG data contains not supported %s marker\n" , gpujpeg_marker_name ((enum gpujpeg_marker_code )marker ));
1613- gpujpeg_reader_skip_marker_content (& image , image_end );
1609+ gpujpeg_reader_skip_marker_content (& image , reader . image_end );
16141610 break ;
16151611
16161612 default :
16171613 fprintf (stderr , "[GPUJPEG] [Error] JPEG data contains not supported %s marker!\n" , gpujpeg_marker_name ((enum gpujpeg_marker_code )marker ));
1618- gpujpeg_reader_skip_marker_content (& image , image_end );
1614+ gpujpeg_reader_skip_marker_content (& image , reader . image_end );
16191615 return -1 ;
16201616 }
16211617 }
@@ -1641,8 +1637,9 @@ gpujpeg_reader_read_image(struct gpujpeg_decoder* decoder, uint8_t* image, size_
16411637 return -1 ;
16421638 }
16431639
1644- if ( header_type == GPUJPEG_HEADER_EXIF && exif_metadata .orientation != EXIF_ORIENTATION_HORIZONTAL ) {
1645- WARN_MSG ("Exif %d not handled!\n" , exif_metadata .orientation );
1640+ if ( reader .header_type == GPUJPEG_HEADER_EXIF &&
1641+ reader .exif_metadata .orientation != EXIF_ORIENTATION_HORIZONTAL ) {
1642+ WARN_MSG ("Exif %d not handled!\n" , reader .exif_metadata .orientation );
16461643 }
16471644
16481645 return 0 ;
@@ -1671,34 +1668,29 @@ gpujpeg_reader_get_image_info(uint8_t *image, size_t image_size, struct gpujpeg_
16711668 int segments = 0 ;
16721669 int unused [4 ];
16731670 uint8_t unused2 [4 ];
1674- enum gpujpeg_color_space header_color_space = GPUJPEG_NONE ;
1675- info -> header_type = GPUJPEG_HEADER_DEFAULT ;
1676- uint8_t * image_end = image + image_size ;
1677- struct gpujpeg_exif_parameters exif_metadata ;
16781671
1679- info -> param .interleaved = 0 ;
1680- info -> param .restart_interval = 0 ;
1672+ struct gpujpeg_reader reader = {
1673+ .param .verbose = verbose ,
1674+ .image_end = image + image_size ,
1675+ };
16811676
16821677 // Check first SOI marker
1683- int marker_soi = gpujpeg_reader_read_marker (& image , image_end , verbose );
1678+ int marker_soi = gpujpeg_reader_read_marker (& image , reader . image_end , verbose );
16841679 if (marker_soi != GPUJPEG_MARKER_SOI ) {
16851680 fprintf (stderr , "[GPUJPEG] [Error] JPEG data should begin with SOI marker, but marker %s was found!\n" , gpujpeg_marker_name ((enum gpujpeg_marker_code )marker_soi ));
16861681 return -1 ;
16871682 }
16881683
16891684 int eoi_presented = 0 ;
1690- _Bool in_spiff = 0 ;
16911685 while (eoi_presented == 0 ) {
16921686 // Read marker
1693- int marker = gpujpeg_reader_read_marker (& image , image_end , verbose );
1687+ int marker = gpujpeg_reader_read_marker (& image , reader . image_end , verbose );
16941688 if (marker == -1 ) {
16951689 return -1 ;
16961690 }
16971691
16981692 // Read more info according to the marker
1699- int rc = gpujpeg_reader_read_common_markers (& image , image_end , marker , verbose , false, & header_color_space ,
1700- & info -> header_type , & info -> param .restart_interval , & in_spiff ,
1701- & exif_metadata );
1693+ int rc = gpujpeg_reader_read_common_markers (& image , marker , & reader );
17021694 if ( rc < 0 ) {
17031695 return rc ;
17041696 }
@@ -1710,9 +1702,9 @@ gpujpeg_reader_get_image_info(uint8_t *image, size_t image_size, struct gpujpeg_
17101702 case GPUJPEG_MARKER_SOF0 : // Baseline
17111703 case GPUJPEG_MARKER_SOF1 : // Extended sequential with Huffman coder
17121704 {
1713- info -> param .color_space_internal = header_color_space ;
1714- if ( gpujpeg_reader_read_sof0 (& info -> param , & info -> param_image , header_color_space , info -> header_type ,
1715- unused , unused2 , & image , image_end ) != 0 ) {
1705+ info -> param .color_space_internal = reader . header_color_space ;
1706+ if ( gpujpeg_reader_read_sof0 (& info -> param , & info -> param_image , reader . header_color_space ,
1707+ reader . header_type , unused , unused2 , & image , reader . image_end ) != 0 ) {
17161708 return -1 ;
17171709 }
17181710 info -> param_image .color_space = info -> param .color_space_internal ;
@@ -1784,12 +1776,13 @@ gpujpeg_reader_get_image_info(uint8_t *image, size_t image_size, struct gpujpeg_
17841776 break ;
17851777 }
17861778 default :
1787- gpujpeg_reader_skip_marker_content (& image , image_end );
1779+ gpujpeg_reader_skip_marker_content (& image , reader . image_end );
17881780 break ;
17891781 }
17901782 }
17911783
17921784 info -> segment_count = segments ;
1785+ info -> header_type = reader .header_type ;
17931786
17941787 info -> param_image .pixel_format = GPUJPEG_PIXFMT_NONE ;
17951788
0 commit comments