@@ -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
91214static OPJ_SIZE_T opj_read_from_file (void * p_buffer , OPJ_SIZE_T p_nb_bytes , FILE * p_file )
0 commit comments