Skip to content

Commit 6ff7fbc

Browse files
committed
gpujpeg_decoder: metadata ptr in result struct
1 parent 3de1e5a commit 6ff7fbc

File tree

7 files changed

+25
-16
lines changed

7 files changed

+25
-16
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cmake_minimum_required(VERSION 3.10.0 FATAL_ERROR)
22
# change version also in configure.ac
3-
project(gpujpeg VERSION 0.27.9 LANGUAGES C CUDA)
3+
project(gpujpeg VERSION 0.27.10 LANGUAGES C CUDA)
44

55
# options
66
set(BUILD_OPENGL OFF CACHE STRING "Build with OpenGL support, options are: AUTO ON OFF")

NEWS.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
2025-10-22 - 0.27.10
2+
----------
3+
4+
- provide orientation metadata by decoder
5+
- SPIFF: read/write the orientation
6+
- Exif: remove custom tag storing API
7+
18
2025-10-20 - 0.27.9
29
----------
310

configure.ac

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
AC_PREREQ([2.65])
22
# change version also in CMakeLists.txt
3-
AC_INIT([libgpujpeg],[0.27.9],[https://github.com/CESNET/GPUJPEG/issues],[libgpujpeg],[https://github.com/CESNET/GPUJPEG])
3+
AC_INIT([libgpujpeg],[0.27.10],[https://github.com/CESNET/GPUJPEG/issues],[libgpujpeg],[https://github.com/CESNET/GPUJPEG])
44
AC_CONFIG_MACRO_DIR([m4])
55
AC_CONFIG_SRCDIR([src/main.c])
66
AC_CONFIG_AUX_DIR([.])

libgpujpeg/gpujpeg_decoder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ struct gpujpeg_decoder_output
7979

8080
/// OpenGL texture
8181
struct gpujpeg_opengl_texture* texture;
82+
83+
const struct gpujpeg_image_metadata *metadata;
8284
};
8385

8486
/**

src/gpujpeg_decoder.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,7 @@ gpujpeg_decoder_decode(struct gpujpeg_decoder* decoder, uint8_t* image, size_t i
463463
output->param_image.height, gpujpeg_pixel_format_get_name(output->param_image.pixel_format),
464464
gpujpeg_color_space_get_name(output->param_image.color_space));
465465
}
466+
output->metadata = &decoder->metadata;
466467

467468
return 0;
468469
}

src/gpujpeg_decoder_internal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ struct gpujpeg_decoder
6969
enum gpujpeg_color_space req_color_space;
7070
bool ff_cs_itu601_is_709; ///< if FFmpeg specific COM marker "CS=ITU601" present, interpret the data as
7171
///< limited-range BT.709 not BT.601
72+
73+
/// metadata associated with last decoded image
74+
struct gpujpeg_image_metadata metadata;
7275
};
7376

7477
#endif // GPUJPEG_DECODER_INTERNAL_H

src/gpujpeg_reader.c

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ struct gpujpeg_reader
9494
enum gpujpeg_color_space header_color_space;
9595
enum gpujpeg_header_type header_type;
9696
bool in_spiff;
97-
struct gpujpeg_image_metadata metadata;
97+
struct gpujpeg_image_metadata *metadata;
9898
const char *comment;
9999
};
100100

@@ -326,7 +326,7 @@ gpujpeg_reader_read_app1(uint8_t** image, struct gpujpeg_reader *reader)
326326
if ( strcmp((char *) type_tag, "Exif") == 0 ) {
327327
reader->header_color_space = GPUJPEG_YCBCR_BT601_256LVLS;
328328
reader->header_type = GPUJPEG_HEADER_EXIF;
329-
gpujpeg_exif_parse(image, reader->image_end, reader->param.verbose, &reader->metadata);
329+
gpujpeg_exif_parse(image, reader->image_end, reader->param.verbose, reader->metadata);
330330
return;
331331
}
332332
WARN_MSG("Skipping unsupported APP1 marker \"%s\"!\n", type_tag);
@@ -474,9 +474,9 @@ gpujpeg_reader_read_spiff_directory(uint8_t** image, struct gpujpeg_reader *read
474474
if ( tag == SPIFF_ENTRY_TAG_ORIENATAION ) {
475475
int rotation = gpujpeg_reader_read_byte(*image);
476476
bool flip = gpujpeg_reader_read_byte(*image);
477-
reader->metadata.vals[GPUJPEG_METADATA_ORIENTATION].orient.rotation = rotation;
478-
reader->metadata.vals[GPUJPEG_METADATA_ORIENTATION].orient.flip = flip;
479-
reader->metadata.vals[GPUJPEG_METADATA_ORIENTATION].set = 1;
477+
reader->metadata->vals[GPUJPEG_METADATA_ORIENTATION].orient.rotation = rotation;
478+
reader->metadata->vals[GPUJPEG_METADATA_ORIENTATION].orient.flip = flip;
479+
reader->metadata->vals[GPUJPEG_METADATA_ORIENTATION].set = 1;
480480
DEBUG_MSG(reader->param.verbose, "SPIFF CW rotation: %d deg%s\n", rotation * 90, flip ? ", mirrored" : "");
481481
*image += 2; // 2 bytes reserved
482482
return 0;
@@ -1551,10 +1551,14 @@ gpujpeg_reader_read_image(struct gpujpeg_decoder* decoder, uint8_t* image, size_
15511551
.param_image = decoder->coder.param_image,
15521552
.image_end = image + image_size,
15531553
.ff_cs_itu601_is_709 = decoder->ff_cs_itu601_is_709,
1554+
.metadata = &decoder->metadata,
15541555
};
15551556
reader.param.restart_interval = 0;
15561557
reader.param_image.pixel_format = decoder->req_pixel_format;
15571558
reader.param_image.color_space = decoder->req_color_space;
1559+
for (unsigned i = 0; i < GPUJPEG_METADATA_COUNT; ++i) {
1560+
decoder->metadata.vals[i].set = false;
1561+
}
15581562

15591563
// Check first SOI marker
15601564
int marker_soi = gpujpeg_reader_read_marker(&image, reader.image_end, decoder->coder.param.verbose);
@@ -1653,14 +1657,6 @@ gpujpeg_reader_read_image(struct gpujpeg_decoder* decoder, uint8_t* image, size_
16531657
return -1;
16541658
}
16551659

1656-
if ( reader.metadata.vals[GPUJPEG_METADATA_ORIENTATION].set ) {
1657-
if ( reader.metadata.vals[GPUJPEG_METADATA_ORIENTATION].orient.rotation != 0 ||
1658-
reader.metadata.vals[GPUJPEG_METADATA_ORIENTATION].orient.flip != 0 ) {
1659-
WARN_MSG("Orientation %s not handled!\n",
1660-
gpujpeg_orientation_get_name(reader.metadata.vals[GPUJPEG_METADATA_ORIENTATION].orient));
1661-
}
1662-
}
1663-
16641660
return 0;
16651661
}
16661662

@@ -1678,6 +1674,7 @@ gpujpeg_reader_get_image_info(uint8_t *image, size_t image_size, struct gpujpeg_
16781674
.param.verbose = verbose,
16791675
.param_image.pixel_format = GPUJPEG_PIXFMT_AUTODETECT,
16801676
.image_end = image + image_size,
1677+
.metadata = &info->metadata,
16811678
};
16821679

16831680
// Check first SOI marker
@@ -1793,7 +1790,6 @@ gpujpeg_reader_get_image_info(uint8_t *image, size_t image_size, struct gpujpeg_
17931790
info->segment_count = segments;
17941791
info->header_type = reader.header_type;
17951792
info->comment = reader.comment;
1796-
info->metadata = reader.metadata;
17971793

17981794
return 0;
17991795
}

0 commit comments

Comments
 (0)