Skip to content

Commit 1515a03

Browse files
committed
gpujpeg_reader: common variables to gpujpeg_reader
and pass the gpujpeg_reader struct (at least somewhere)
1 parent 695c8f3 commit 1515a03

File tree

1 file changed

+60
-67
lines changed

1 file changed

+60
-67
lines changed

src/gpujpeg_reader.c

Lines changed: 60 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
10121019
static int
10131020
gpujpeg_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
*/
11411148
static int
11421149
gpujpeg_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
*/
12301237
static int
12311238
gpujpeg_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
*/
13641371
static 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
15221530
gpujpeg_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

Comments
 (0)