Skip to content

Commit d73bd96

Browse files
Add bmp support via libnsbmp
1 parent dcdf00e commit d73bd96

File tree

10 files changed

+1425
-8
lines changed

10 files changed

+1425
-8
lines changed

Diff for: .gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
*.jpeg
3737
*.jpg
3838
*.png
39+
*.bmp
3940

4041
# ilclient
4142
/libs

Diff for: Makefile

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
OBJS=omxiv.o OmxImage.o OmxRender.o SoftImage.o
1+
OBJS=omxiv.o OmxImage.o OmxRender.o SoftImage.o ./libnsbmp/libnsbmp.o
22
BIN=omxiv.bin
33
LDFLAGS+=-lilclient -ljpeg -lpng
4+
INCLUDES+=-I./libnsbmp -I./libs/ilclient
45

56
BUILDVERSION=$(shell git rev-parse --short=10 HEAD 2>/dev/null;test $$? -gt 0 && echo UNKNOWN)
67
CFLAGS+=-DVERSION=${BUILDVERSION}
@@ -13,7 +14,7 @@ $(BIN): $(OBJS)
1314
ilclient:
1415
mkdir libs
1516
cp -r /opt/vc/src/hello_pi/libs/ilclient libs
16-
cd libs/ilclient; make
17+
make -C libs/ilclient
1718

1819
install:
1920
cp $(BIN) /usr/bin/omxiv

Diff for: Makefile.include

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11

2-
CFLAGS+=-DSTANDALONE -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -D_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -Wall -pipe -DHAVE_LIBOPENMAX=2 -DOMX -DOMX_SKIP64BIT -ftree-vectorize -DUSE_EXTERNAL_OMX -DHAVE_LIBBCM_HOST -DUSE_EXTERNAL_LIBBCM_HOST -DUSE_VCHIQ_ARM -DTARGET_RASPBERRY_PI -Wno-psabi
2+
CFLAGS+=-D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DTARGET_POSIX -D_LINUX -fPIC -DPIC -D_REENTRANT -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -Wall -pipe -DHAVE_LIBOPENMAX=2 -DOMX -DOMX_SKIP64BIT -ftree-vectorize -DUSE_EXTERNAL_OMX -DHAVE_LIBBCM_HOST -DUSE_EXTERNAL_LIBBCM_HOST -DUSE_VCHIQ_ARM -DTARGET_RASPBERRY_PI -Wno-psabi
33

4-
LDFLAGS+=-L$(SDKSTAGE)/opt/vc/lib/ -lopenmaxil -lbcm_host -lvcos -lvchiq_arm -lpthread -L./libs/ilclient
4+
LDFLAGS+=-L$(SDKSTAGE)/opt/vc/lib/ -lopenmaxil -lbcm_host -lvcos -lpthread -L./libs/ilclient
55

6-
INCLUDES+=-I$(SDKSTAGE)/opt/vc/include/ -I$(SDKSTAGE)/opt/vc/include/interface/vcos/pthreads -I$(SDKSTAGE)/opt/vc/include/interface/vmcs_host/linux -I./libs/ilclient
6+
INCLUDES+=-I$(SDKSTAGE)/opt/vc/include/ -I$(SDKSTAGE)/opt/vc/include/interface/vcos/pthreads -I$(SDKSTAGE)/opt/vc/include/interface/vmcs_host/linux
77

88
all: $(BIN) $(LIB)
99

Diff for: SoftImage.c

+115
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <png.h>
66

77
#include "SoftImage.h"
8+
#include "libnsbmp/libnsbmp.h"
89

910
struct my_error_mgr {
1011
struct jpeg_error_mgr pub;
@@ -262,4 +263,118 @@ int softDecodePng(char* filePath, IMAGE* png){
262263
return SOFT_PNG_OK;
263264
}
264265

266+
#define BYTES_PER_PIXEL 4
267+
268+
// BMP
269+
270+
static void *bitmap_create(int width, int height, unsigned int state){
271+
return malloc(width * height * BYTES_PER_PIXEL);
272+
}
273+
274+
275+
static unsigned char *bitmap_get_buffer(void *bitmap){
276+
return bitmap;
277+
}
278+
279+
280+
static size_t bitmap_get_bpp(void *bitmap){
281+
return BYTES_PER_PIXEL;
282+
}
283+
284+
int softDecodeBMP(char* filePath, IMAGE* bmpImage){
285+
bmp_bitmap_callback_vt bitmap_callbacks = {
286+
bitmap_create,
287+
NULL,
288+
bitmap_get_buffer,
289+
bitmap_get_bpp
290+
};
291+
bmp_result code;
292+
bmp_image bmp;
293+
short ret = 0;
294+
295+
bmp_create(&bmp, &bitmap_callbacks);
296+
297+
FILE *fp;
298+
size_t size;
299+
unsigned char *data;
300+
301+
fp = fopen(filePath, "rb");
302+
if (!fp) {
303+
return SOFT_IMAGE_ERROR_FILE_OPEN;
304+
}
305+
fseek(fp, 0L, SEEK_END);
306+
size = ftell(fp);
307+
fseek(fp, 0L, SEEK_SET);
308+
309+
data = malloc(size);
310+
if (!data) {
311+
fclose(fp);
312+
return SOFT_BMP_ERROR_MEMORY;
313+
}
314+
315+
if (fread(data, 1, size, fp) != size) {
316+
fclose(fp);
317+
return SOFT_BMP_ERROR_MEMORY;
318+
}
319+
320+
fclose(fp);
321+
322+
code = bmp_analyse(&bmp, size, data);
323+
if (code != BMP_OK) {
324+
ret = SOFT_BMP_ERROR_ANALYSING;
325+
goto cleanup;
326+
}
327+
328+
code = bmp_decode(&bmp);
329+
if (code != BMP_OK) {
330+
ret = SOFT_BMP_ERROR_DECODING;
331+
goto cleanup;
332+
}
333+
334+
char* bmpData = bmp.bitmap;
335+
int bmpWidth = bmp.width;
336+
337+
bmpImage->height = bmp.height;
338+
bmpImage->colorSpace = COLOR_SPACE_RGBA;
339+
340+
bmp_finalise(&bmp);
341+
free(data);
342+
343+
/* Width needs to be a multiple of 16, otherwise
344+
* resize and render component will bug. We
345+
* add some transparent pixels left and right. */
346+
int wPixelAd = bmpWidth%16;
347+
if(wPixelAd != 0)
348+
wPixelAd=16-wPixelAd;
349+
bmpImage->width=bmpWidth+wPixelAd;
350+
int wPixelAdL= wPixelAd/2;
351+
int wPixelAdR = wPixelAd/2+wPixelAd%2;
352+
wPixelAdL*=BYTES_PER_PIXEL;
353+
wPixelAdR*=BYTES_PER_PIXEL;
354+
wPixelAd*=BYTES_PER_PIXEL;
355+
356+
bmpImage->nData = bmpImage->width* bmpImage->height* BYTES_PER_PIXEL;
357+
bmpImage->pData = malloc(bmpImage->nData);
358+
if(!bmpImage->pData){
359+
free(bmpData);
360+
return SOFT_BMP_ERROR_MEMORY;
361+
}
362+
int i;
363+
for(i=0; i<bmpImage->height; i++){
364+
memset(bmpImage->pData + i* bmpImage->width* BYTES_PER_PIXEL, 0, wPixelAdL);
365+
memcpy(bmpImage->pData + i* bmpImage->width* BYTES_PER_PIXEL + wPixelAdL,
366+
bmpData +i* bmpWidth*BYTES_PER_PIXEL, bmpWidth*BYTES_PER_PIXEL);
367+
memset(bmpImage->pData + (i+1)* bmpImage->width* BYTES_PER_PIXEL-wPixelAdR,
368+
0, wPixelAdR);
369+
}
370+
371+
free(bmpData);
372+
373+
return ret;
374+
375+
cleanup:
376+
bmp_finalise(&bmp);
377+
free(data);
378+
return ret;
379+
}
265380

Diff for: SoftImage.h

+7
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,10 @@ int softDecodeJpeg(char *filePath, IMAGE *jpeg);
2525
#define SOFT_PNG_ERROR_CREATE_STRUCT 0x10
2626

2727
int softDecodePng(char* filePath, IMAGE* png);
28+
29+
#define SOFT_BMP_OK 0x0
30+
#define SOFT_BMP_ERROR_MEMORY 0x1
31+
#define SOFT_BMP_ERROR_DECODING 0x04
32+
#define SOFT_BMP_ERROR_ANALYSING 0x08
33+
34+
int softDecodeBMP(char* filePath, IMAGE* bmpImage);

Diff for: libnsbmp/COPYING

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
Copyright (C) 2006 Richard Wilson
2+
Copyright (C) 2008 Sean Fox
3+
4+
Permission is hereby granted, free of charge, to any person obtaining a copy
5+
of this software and associated documentation files (the "Software"), to deal
6+
in the Software without restriction, including without limitation the rights
7+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8+
copies of the Software, and to permit persons to whom the Software is
9+
furnished to do so, subject to the following conditions:
10+
11+
* The above copyright notice and this permission notice shall be included in
12+
all copies or substantial portions of the Software.
13+
14+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20+
THE SOFTWARE.

0 commit comments

Comments
 (0)