Skip to content

Commit b57633b

Browse files
author
Liviu Nicoara
committed
Buffer-based streams.
1 parent d54bb77 commit b57633b

2 files changed

Lines changed: 134 additions & 2 deletions

File tree

src/lib/openjp2/openjpeg.c

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,129 @@ OPJ_BOOL OPJ_CALLCONV opj_set_error_handler(opj_codec_t * p_codec,
8686
return OPJ_TRUE;
8787
}
8888

89+
/* ---------------------------------------------------------------------- */
90+
/* Buffer-based */
91+
92+
static OPJ_SIZE_T
93+
opj_read_from_buffer (void* pdst, OPJ_SIZE_T len, opj_buffer_info_t* psrc)
94+
{
95+
OPJ_SIZE_T n = psrc->buf + psrc->len - psrc->cur;
96+
97+
if (n) {
98+
if (n > len)
99+
n = len;
100+
101+
memcpy (pdst, psrc->cur, n);
102+
psrc->cur += n;
103+
}
104+
else
105+
n = (OPJ_SIZE_T)-1;
106+
107+
return n;
108+
}
109+
110+
static OPJ_SIZE_T
111+
opj_write_to_buffer (void* p_buffer, OPJ_SIZE_T p_nb_bytes,
112+
opj_buffer_info_t* p_source_buffer)
113+
{
114+
void* pbuf = p_source_buffer->buf;
115+
void* pcur = p_source_buffer->cur;
116+
117+
OPJ_SIZE_T len = p_source_buffer->len;
118+
119+
if (0 == len)
120+
len = 1;
121+
122+
OPJ_SIZE_T dist = pcur - pbuf, n = len - dist;
123+
assert (dist <= len);
124+
125+
while (n < p_nb_bytes) {
126+
len *= 2;
127+
n = len - dist;
128+
}
129+
130+
if (len != p_source_buffer->len) {
131+
pbuf = opj_malloc (len);
132+
133+
if (0 == pbuf)
134+
return (OPJ_SIZE_T)-1;
135+
136+
if (p_source_buffer->buf) {
137+
memcpy (pbuf, p_source_buffer->buf, dist);
138+
opj_free (p_source_buffer->buf);
139+
}
140+
141+
p_source_buffer->buf = pbuf;
142+
p_source_buffer->cur = pbuf + dist;
143+
p_source_buffer->len = len;
144+
}
145+
146+
memcpy (p_source_buffer->cur, p_buffer, p_nb_bytes);
147+
p_source_buffer->cur += p_nb_bytes;
148+
149+
return p_nb_bytes;
150+
}
151+
152+
static OPJ_SIZE_T
153+
opj_skip_from_buffer (OPJ_SIZE_T len, opj_buffer_info_t* psrc)
154+
{
155+
OPJ_SIZE_T n = psrc->buf + psrc->len - psrc->cur;
156+
157+
if (n) {
158+
if (n > len)
159+
n = len;
160+
161+
psrc->cur += len;
162+
}
163+
else
164+
n = (OPJ_SIZE_T)-1;
165+
166+
return n;
167+
}
168+
169+
static OPJ_BOOL
170+
opj_seek_from_buffer (OPJ_SIZE_T len, opj_buffer_info_t* psrc)
171+
{
172+
OPJ_SIZE_T n = psrc->len;
173+
174+
if (n > len)
175+
n = len;
176+
177+
psrc->cur = psrc->buf + n;
178+
179+
return OPJ_TRUE;
180+
}
181+
182+
opj_stream_t* OPJ_CALLCONV
183+
opj_stream_create_buffer_stream (opj_buffer_info_t* psrc, OPJ_BOOL input)
184+
{
185+
if (!psrc)
186+
return 0;
187+
188+
opj_stream_t* ps = opj_stream_default_create (input);
189+
190+
if (0 == ps)
191+
return 0;
192+
193+
opj_stream_set_user_data (ps, psrc, 0);
194+
opj_stream_set_user_data_length (ps, psrc->len);
195+
196+
if (input)
197+
opj_stream_set_read_function (
198+
ps, (opj_stream_read_fn)opj_read_from_buffer);
199+
else
200+
opj_stream_set_write_function(
201+
ps,(opj_stream_write_fn) opj_write_to_buffer);
202+
203+
opj_stream_set_skip_function (
204+
ps, (opj_stream_skip_fn)opj_skip_from_buffer);
205+
206+
opj_stream_set_seek_function (
207+
ps, (opj_stream_seek_fn)opj_seek_from_buffer);
208+
209+
return ps;
210+
}
211+
89212
/* ---------------------------------------------------------------------- */
90213

91214
static OPJ_SIZE_T opj_read_from_file (void * p_buffer, OPJ_SIZE_T p_nb_bytes, FILE * p_file)

src/lib/openjp2/openjpeg.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,11 @@ typedef struct opj_dparameters {
567567

568568
} opj_dparameters_t;
569569

570+
typedef struct opj_buffer_info {
571+
OPJ_BYTE* buf;
572+
OPJ_BYTE* cur;
573+
OPJ_SIZE_T len;
574+
} opj_buffer_info_t;
570575

571576
/**
572577
* JPEG2000 codec V2.
@@ -1180,8 +1185,12 @@ OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create_default_file_stream (const
11801185
OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create_file_stream (const char *fname,
11811186
OPJ_SIZE_T p_buffer_size,
11821187
OPJ_BOOL p_is_read_stream);
1183-
1184-
/*
1188+
1189+
1190+
OPJ_API opj_stream_t* OPJ_CALLCONV
1191+
opj_stream_create_buffer_stream (opj_buffer_info_t*, OPJ_BOOL);
1192+
1193+
/*
11851194
==========================================================
11861195
event manager functions definitions
11871196
==========================================================

0 commit comments

Comments
 (0)