Skip to content

Commit cb28bc7

Browse files
committed
support writting BMP files (decoder)
using stb_image_write.h
1 parent 247758e commit cb28bc7

File tree

5 files changed

+1763
-3
lines changed

5 files changed

+1763
-3
lines changed

libgpujpeg/gpujpeg_common.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
* @file
3-
* Copyright (c) 2011-2024, CESNET
3+
* Copyright (c) 2011-2025, CESNET
44
* Copyright (c) 2011, Silicon Genome, LLC.
55
*
66
* All rights reserved.
@@ -324,6 +324,7 @@ enum gpujpeg_image_file_format {
324324
GPUJPEG_IMAGE_FILE_RGB,
325325
/// RGBA file format, simple data format without header [R G B A] [R G B A] ...
326326
GPUJPEG_IMAGE_FILE_RGBA,
327+
GPUJPEG_IMAGE_FILE_BMP,
327328
/// PNM file format
328329
GPUJPEG_IMAGE_FILE_PGM,
329330
GPUJPEG_IMAGE_FILE_PPM,

src/gpujpeg_common.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,7 @@ gpujpeg_image_get_file_format(const char* filename)
392392
{ "jpg", GPUJPEG_IMAGE_FILE_JPEG},
393393
{ "jpeg", GPUJPEG_IMAGE_FILE_JPEG},
394394
{ "jfif", GPUJPEG_IMAGE_FILE_JPEG},
395+
{ "bmp", GPUJPEG_IMAGE_FILE_BMP},
395396
//{ "pbm", GPUJPEG_IMAGE_FILE_PNM},
396397
{ "pnm", GPUJPEG_IMAGE_FILE_PNM},
397398
{ "pgm", GPUJPEG_IMAGE_FILE_PGM},
@@ -437,6 +438,7 @@ static enum { FF_CS_NONE, FF_CS_RGB, FF_CS_YCBCR } get_file_type_cs(enum gpujpeg
437438
return FF_CS_YCBCR;
438439
case GPUJPEG_IMAGE_FILE_RGB:
439440
case GPUJPEG_IMAGE_FILE_RGBA:
441+
case GPUJPEG_IMAGE_FILE_BMP:
440442
case GPUJPEG_IMAGE_FILE_PGM:
441443
case GPUJPEG_IMAGE_FILE_PPM:
442444
case GPUJPEG_IMAGE_FILE_PNM:
@@ -1280,6 +1282,7 @@ gpujpeg_image_get_properties(const char *filename, struct gpujpeg_image_paramete
12801282
case GPUJPEG_IMAGE_FILE_I420:
12811283
param_image->pixel_format = GPUJPEG_420_U8_P0P1P2;
12821284
break;
1285+
case GPUJPEG_IMAGE_FILE_BMP:
12831286
case GPUJPEG_IMAGE_FILE_PAM:
12841287
case GPUJPEG_IMAGE_FILE_PGM:
12851288
case GPUJPEG_IMAGE_FILE_PNM:

src/gpujpeg_common_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2011-2023, CESNET
2+
* Copyright (c) 2011-2025, CESNET
33
* Copyright (c) 2011, Silicon Genome, LLC.
44
*
55
* All rights reserved.

src/utils/image_delegate.c

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2020-2024, CESNET z.s.p.o
2+
* Copyright (c) 2020-2025, CESNET
33
* All rights reserved.
44
*
55
* Redistribution and use in source and binary forms, with or without
@@ -46,6 +46,8 @@
4646
#include "../../libgpujpeg/gpujpeg_decoder.h" // ddecoder placeholders
4747
#include "image_delegate.h"
4848
#include "pam.h"
49+
#define STB_IMAGE_WRITE_IMPLEMENTATION
50+
#include "stb_image_write.h"
4951
#include "y4m.h"
5052

5153
enum {
@@ -363,6 +365,31 @@ tst_image_probe_delegate(const char* filename, enum gpujpeg_image_file_format fo
363365
return tst_image_parse_filename(filename, param_image, &unused_pattern, &unused_seed);
364366
}
365367

368+
static int
369+
bmp_save_delegate(const char* filename, const struct gpujpeg_image_parameters* param_image, const char* data)
370+
{
371+
if ( stbi_write_bmp(filename, param_image->width, param_image->height,
372+
gpujpeg_pixel_format_get_comp_count(param_image->pixel_format), data) ) {
373+
return 0;
374+
}
375+
ERROR_MSG("[stbi] Cannot write output file %s: %s\n", filename, stbi_failure_reason());
376+
return -1;
377+
}
378+
379+
static int
380+
bmp_image_probe_delegate(const char* filename, enum gpujpeg_image_file_format format,
381+
struct gpujpeg_image_parameters* param_image, bool file_exists)
382+
{
383+
(void)filename;
384+
(void)format;
385+
if ( !file_exists ) {
386+
param_image->pixel_format = GPUJPEG_PIXFMT_AUTODETECT;
387+
param_image->color_space = GPUJPEG_CS_DEFAULT;
388+
return true;
389+
}
390+
abort(); ///< @todo implement
391+
}
392+
366393
/// generates deterministic random pattern
367394
static void
368395
gen_pseudorandom(unsigned char* data, size_t len, int seed)
@@ -440,6 +467,7 @@ image_load_delegate_t gpujpeg_get_image_load_delegate(enum gpujpeg_image_file_fo
440467
return y4m_load_delegate;
441468
case GPUJPEG_IMAGE_FILE_TST:
442469
return tst_image_load_delegate;
470+
case GPUJPEG_IMAGE_FILE_BMP: ///< @todo implement
443471
case GPUJPEG_IMAGE_FILE_UNKNOWN:
444472
case GPUJPEG_IMAGE_FILE_JPEG:
445473
case GPUJPEG_IMAGE_FILE_RAW:
@@ -457,6 +485,8 @@ image_load_delegate_t gpujpeg_get_image_load_delegate(enum gpujpeg_image_file_fo
457485
image_probe_delegate_t gpujpeg_get_image_probe_delegate(enum gpujpeg_image_file_format format)
458486
{
459487
switch (format) {
488+
case GPUJPEG_IMAGE_FILE_BMP:
489+
return bmp_image_probe_delegate;
460490
case GPUJPEG_IMAGE_FILE_PGM:
461491
case GPUJPEG_IMAGE_FILE_PPM:
462492
case GPUJPEG_IMAGE_FILE_PNM:
@@ -483,6 +513,8 @@ image_probe_delegate_t gpujpeg_get_image_probe_delegate(enum gpujpeg_image_file_
483513
image_save_delegate_t gpujpeg_get_image_save_delegate(enum gpujpeg_image_file_format format)
484514
{
485515
switch (format) {
516+
case GPUJPEG_IMAGE_FILE_BMP:
517+
return bmp_save_delegate;
486518
case GPUJPEG_IMAGE_FILE_PAM:
487519
return pam_save_delegate;
488520
case GPUJPEG_IMAGE_FILE_PGM:

0 commit comments

Comments
 (0)