• Home
  • Raw
  • Download

Lines Matching full:buffer

45  * Read buffer
58 * To accommodate all this, the buffer stores all samples as 16-bit values, even
62 * The read buffer is constructed by a call to buffer_create(), which initializes
63 * the buffer based on width, height, number of colors and depth. The buffer
68 * The buffer maintains read and write pointers.
104 static void buffer_update_read_index(struct Pieusb_Read_Buffer* buffer, int increment);
109 * Initialize the buffer.
112 * @param buffer the buffer to initialize
114 * @param height number of lines in the buffer (pixels in a column)
118 * @param maximum_size maximum size of buffer (-1 = size of image)
122 sanei_pieusb_buffer_create(struct Pieusb_Read_Buffer* buffer, SANE_Int width, SANE_Int height, SANE… in sanei_pieusb_buffer_create() argument
129 buffer->width = width; in sanei_pieusb_buffer_create()
130 buffer->height = height; in sanei_pieusb_buffer_create()
131 buffer->colors = 0; in sanei_pieusb_buffer_create()
132 …if (color_spec & 0x01) { buffer->color_index_red = 0; buffer->colors++; } else { buffer->color_ind… in sanei_pieusb_buffer_create()
133 …if (color_spec & 0x02) { buffer->color_index_green = 1; buffer->colors++; } else { buffer->color_i… in sanei_pieusb_buffer_create()
134 …if (color_spec & 0x04) { buffer->color_index_blue = 2; buffer->colors++; } else { buffer->color_in… in sanei_pieusb_buffer_create()
135 …if (color_spec & 0x08) { buffer->color_index_infrared = 3; buffer->colors++; } else { buffer->colo… in sanei_pieusb_buffer_create()
136 if (buffer->colors == 0) { in sanei_pieusb_buffer_create()
140 buffer->depth = depth; in sanei_pieusb_buffer_create()
145 buffer->packing_density = (depth == 1) ? 8 : 1; /* These are all the situations we have */ in sanei_pieusb_buffer_create()
148 buffer->packet_size_bytes = (buffer->depth * buffer->packing_density + 7) / 8; in sanei_pieusb_buffer_create()
149buffer->line_size_packets = (buffer->width + buffer->packing_density -1) / buffer->packing_density; in sanei_pieusb_buffer_create()
150 buffer->line_size_bytes = buffer->line_size_packets * buffer->packet_size_bytes; in sanei_pieusb_buffer_create()
151 buffer->image_size_bytes = buffer->colors * buffer->height * buffer->line_size_bytes; in sanei_pieusb_buffer_create()
154 snprintf(buffer->buffer_name, L_tmpnam, "/tmp/sane.XXXXXX"); in sanei_pieusb_buffer_create()
155 if (buffer->data_file != 0) /* might still be open from previous invocation */ in sanei_pieusb_buffer_create()
156 close(buffer->data_file); in sanei_pieusb_buffer_create()
157 buffer->data_file = mkstemp(buffer->buffer_name); in sanei_pieusb_buffer_create()
158 if (buffer->data_file == -1) { in sanei_pieusb_buffer_create()
159 buffer->data_file = 0; in sanei_pieusb_buffer_create()
160 buffer->data = NULL; in sanei_pieusb_buffer_create()
161 perror("sanei_pieusb_buffer_create(): error opening image buffer file"); in sanei_pieusb_buffer_create()
165 buffer_size_bytes = buffer->width * buffer->height * buffer->colors * sizeof(SANE_Uint); in sanei_pieusb_buffer_create()
167 close(buffer->data_file); in sanei_pieusb_buffer_create()
168 buffer->data_file = 0; in sanei_pieusb_buffer_create()
169 …: buffer_size is zero: width %d, height %d, colors %d\n", buffer->width, buffer->height, buffer->c… in sanei_pieusb_buffer_create()
172 result = lseek(buffer->data_file, buffer_size_bytes-1, SEEK_SET); in sanei_pieusb_buffer_create()
174 close(buffer->data_file); in sanei_pieusb_buffer_create()
175 buffer->data_file = 0; in sanei_pieusb_buffer_create()
176 buffer->data = NULL; in sanei_pieusb_buffer_create()
183 result = write(buffer->data_file, &g, 1); in sanei_pieusb_buffer_create()
185 close(buffer->data_file); in sanei_pieusb_buffer_create()
186 buffer->data_file = 0; in sanei_pieusb_buffer_create()
187 buffer->data = NULL; in sanei_pieusb_buffer_create()
193buffer->data = mmap(NULL, buffer_size_bytes, PROT_WRITE | PROT_READ, MAP_SHARED, buffer->data_file… in sanei_pieusb_buffer_create()
194 if (buffer->data == MAP_FAILED) { in sanei_pieusb_buffer_create()
195 close(buffer->data_file); in sanei_pieusb_buffer_create()
196 buffer->data = NULL; in sanei_pieusb_buffer_create()
203 buffer->data_size = buffer_size_bytes; in sanei_pieusb_buffer_create()
205 buffer->p_read = calloc(buffer->colors, sizeof(SANE_Uint*)); in sanei_pieusb_buffer_create()
206 if (buffer->p_read == NULL) in sanei_pieusb_buffer_create()
208 buffer->p_write = calloc(buffer->colors, sizeof(SANE_Uint*)); in sanei_pieusb_buffer_create()
209 if (buffer->p_write == NULL) in sanei_pieusb_buffer_create()
211 for (k = 0; k < buffer->colors; k++) { in sanei_pieusb_buffer_create()
212 buffer->p_write[k] = buffer->data + k * buffer->height * buffer->width; in sanei_pieusb_buffer_create()
213 buffer->p_read[k] = buffer->p_write[k]; in sanei_pieusb_buffer_create()
215 buffer->read_index[0] = 0; in sanei_pieusb_buffer_create()
216 buffer->read_index[1] = 0; in sanei_pieusb_buffer_create()
217 buffer->read_index[2] = 0; in sanei_pieusb_buffer_create()
218 buffer->read_index[3] = 0; in sanei_pieusb_buffer_create()
221 buffer->bytes_read = 0; in sanei_pieusb_buffer_create()
222 buffer->bytes_written = 0; in sanei_pieusb_buffer_create()
223 buffer->bytes_unread = 0; in sanei_pieusb_buffer_create()
225 DBG(DBG_info,"pieusb: Read buffer created: w=%d h=%d ncol=%d depth=%d in file %s\n", in sanei_pieusb_buffer_create()
226 buffer->width, buffer->height, buffer->colors, buffer->depth, buffer->buffer_name); in sanei_pieusb_buffer_create()
231 * Delete buffer and free its resources
233 * @param buffer
236 sanei_pieusb_buffer_delete(struct Pieusb_Read_Buffer* buffer) in sanei_pieusb_buffer_delete() argument
239 munmap(buffer->data, buffer->data_size); in sanei_pieusb_buffer_delete()
243 /* ftruncate(buffer->data_file,0); Can we delete given a file-descriptor? */ in sanei_pieusb_buffer_delete()
244 close(buffer->data_file); in sanei_pieusb_buffer_delete()
246 unlink(buffer->buffer_name); in sanei_pieusb_buffer_delete()
247 buffer->data_file = 0; in sanei_pieusb_buffer_delete()
248 buffer->data_size = 0; in sanei_pieusb_buffer_delete()
249 free(buffer->p_read); in sanei_pieusb_buffer_delete()
250 free(buffer->p_write); in sanei_pieusb_buffer_delete()
251 buffer->data = 0; in sanei_pieusb_buffer_delete()
252 buffer->width = 0; in sanei_pieusb_buffer_delete()
253 buffer->height = 0; in sanei_pieusb_buffer_delete()
254 buffer->depth = 0; in sanei_pieusb_buffer_delete()
255 buffer->colors = 0; in sanei_pieusb_buffer_delete()
256 buffer->packing_density = 0; in sanei_pieusb_buffer_delete()
258 DBG(DBG_info,"pieusb: Read buffer deleted\n"); in sanei_pieusb_buffer_delete()
262 * Add a line to the reader buffer, for the given color.
263 * The buffer checks and decides how to interpret the data.
265 * @param buffer
272 sanei_pieusb_buffer_put_single_color_line(struct Pieusb_Read_Buffer* buffer, SANE_Byte color, void*… in sanei_pieusb_buffer_put_single_color_line() argument
281 c = buffer->color_index_red; in sanei_pieusb_buffer_put_single_color_line()
284 c = buffer->color_index_green; in sanei_pieusb_buffer_put_single_color_line()
287 c = buffer->color_index_blue; in sanei_pieusb_buffer_put_single_color_line()
290 c = buffer->color_index_infrared; in sanei_pieusb_buffer_put_single_color_line()
294 …nei_pieusb_buffer_put_single_color_line(): color '%c' not specified when buffer was created\n", co… in sanei_pieusb_buffer_put_single_color_line()
300 if (buffer->line_size_bytes != size) { in sanei_pieusb_buffer_put_single_color_line()
301 …r_put_single_color_line(): incorrect line size, expecting %d, got %d\n", buffer->line_size_bytes, … in sanei_pieusb_buffer_put_single_color_line()
313 if (buffer->packet_size_bytes == 1 && buffer->packing_density == 1) { in sanei_pieusb_buffer_put_single_color_line()
317 /* Get next packet data & store in buffer */ in sanei_pieusb_buffer_put_single_color_line()
318 *buffer->p_write[c]++ = *p_packet++; in sanei_pieusb_buffer_put_single_color_line()
321 } else if (buffer->packet_size_bytes == 2 && buffer->packing_density == 1) { in sanei_pieusb_buffer_put_single_color_line()
325 /* Get next packet data & store in buffer */ in sanei_pieusb_buffer_put_single_color_line()
326 *buffer->p_write[c]++ = le16toh (*p_packet++); in sanei_pieusb_buffer_put_single_color_line()
331 uint8_t *packet = (uint8_t *)alloca(buffer->packet_size_bytes * sizeof(uint8_t)); in sanei_pieusb_buffer_put_single_color_line()
333 uint8_t mask = ~(0xFF >> buffer->depth); /* byte with depth most significant bits set */ in sanei_pieusb_buffer_put_single_color_line()
337 for (k = 0; k < buffer->packet_size_bytes; k++) packet[k] = *p_packet++; in sanei_pieusb_buffer_put_single_color_line()
339 * buffer->depth * packing_density <= # bits in packet. in sanei_pieusb_buffer_put_single_color_line()
340 * That is checked at buffer creation. */ in sanei_pieusb_buffer_put_single_color_line()
341 for (k = 0; k < buffer->packing_density; k++) { in sanei_pieusb_buffer_put_single_color_line()
343 val = (packet[0] & mask) >> (8-buffer->depth); in sanei_pieusb_buffer_put_single_color_line()
345 for (m = 0; m < buffer->packet_size_bytes; m++) { in sanei_pieusb_buffer_put_single_color_line()
347 packet[m] <<= buffer->depth; in sanei_pieusb_buffer_put_single_color_line()
348 if (m < buffer->packet_size_bytes-1) { in sanei_pieusb_buffer_put_single_color_line()
350 packet[m] |= (packet[m+1] >> (8-buffer->depth)); in sanei_pieusb_buffer_put_single_color_line()
353 /* Store in buffer */ in sanei_pieusb_buffer_put_single_color_line()
354 *buffer->p_write[c]++ = val; in sanei_pieusb_buffer_put_single_color_line()
356 n += buffer->packet_size_bytes; in sanei_pieusb_buffer_put_single_color_line()
361 buffer->bytes_written += size; in sanei_pieusb_buffer_put_single_color_line()
362 buffer->bytes_unread += size; in sanei_pieusb_buffer_put_single_color_line()
364 /* Output current buffer state */ in sanei_pieusb_buffer_put_single_color_line()
365 /* buffer_output_state(buffer); */ in sanei_pieusb_buffer_put_single_color_line()
371 * Write line of full color pixels to the buffer.
373 * @param buffer Read buffer
382 sanei_pieusb_buffer_put_full_color_line(struct Pieusb_Read_Buffer* buffer, void* line, int size) in sanei_pieusb_buffer_put_full_color_line() argument
389 if (buffer->line_size_bytes * buffer->colors != size) { in sanei_pieusb_buffer_put_full_color_line()
390 …color_line(): incorrect line size, expecting %d, got %d\n", buffer->line_size_bytes * buffer->colo… in sanei_pieusb_buffer_put_full_color_line()
402 if (buffer->packet_size_bytes == 1 && buffer->packing_density == 1) { in sanei_pieusb_buffer_put_full_color_line()
406 /* Get next packet data & store in buffer */ in sanei_pieusb_buffer_put_full_color_line()
407 for (c = 0; c < buffer->colors; c++) { in sanei_pieusb_buffer_put_full_color_line()
408 *buffer->p_write[c]++ = *p_packet++; in sanei_pieusb_buffer_put_full_color_line()
412 } else if (buffer->packet_size_bytes == 2 && buffer->packing_density == 1) { in sanei_pieusb_buffer_put_full_color_line()
416 /* Get next packet data & store in buffer */ in sanei_pieusb_buffer_put_full_color_line()
417 for (c = 0; c < buffer->colors; c++) { in sanei_pieusb_buffer_put_full_color_line()
418 *buffer->p_write[c]++ = le16toh (*p_packet++); in sanei_pieusb_buffer_put_full_color_line()
424 uint8_t *packet = (uint8_t *)alloca(buffer->packet_size_bytes * sizeof(uint8_t)); in sanei_pieusb_buffer_put_full_color_line()
426 uint8_t mask = ~(0xFF >> buffer->depth); /* byte with depth most significant bits set */ in sanei_pieusb_buffer_put_full_color_line()
431 for (c = 0; c < buffer->colors; c++) { in sanei_pieusb_buffer_put_full_color_line()
432 for (k = 0; k < buffer->packet_size_bytes; k++) { in sanei_pieusb_buffer_put_full_color_line()
437 * buffer->depth * packing_density <= # bits in packet. in sanei_pieusb_buffer_put_full_color_line()
438 * That is checked at buffer creation. */ in sanei_pieusb_buffer_put_full_color_line()
439 for (k = 0; k < buffer->packing_density; k++) { in sanei_pieusb_buffer_put_full_color_line()
441 val = (packet[0] & mask) >> (8-buffer->depth); in sanei_pieusb_buffer_put_full_color_line()
444 for (m = 0; m < buffer->packet_size_bytes; m++) { in sanei_pieusb_buffer_put_full_color_line()
446 packet[m] <<= buffer->depth; in sanei_pieusb_buffer_put_full_color_line()
448 if (m < buffer->packet_size_bytes-1) { in sanei_pieusb_buffer_put_full_color_line()
450 packet[m] |= (packet[m+1] >> (8-buffer->depth)); in sanei_pieusb_buffer_put_full_color_line()
454 /* Store in buffer */ in sanei_pieusb_buffer_put_full_color_line()
455 *buffer->p_write[c]++ = val; in sanei_pieusb_buffer_put_full_color_line()
457 n += buffer->packet_size_bytes; in sanei_pieusb_buffer_put_full_color_line()
463 buffer->bytes_written += size; in sanei_pieusb_buffer_put_full_color_line()
464 buffer->bytes_unread += size; in sanei_pieusb_buffer_put_full_color_line()
466 /* Output current buffer state */ in sanei_pieusb_buffer_put_full_color_line()
467 /* buffer_output_state(buffer); */ in sanei_pieusb_buffer_put_full_color_line()
473 * Return bytes from the buffer. Do not mind pixel boundaries.
478 * @param buffer Buffer to return bytes from.
484 sanei_pieusb_buffer_get(struct Pieusb_Read_Buffer* buffer, SANE_Byte* data, SANE_Int max_len, SANE_… in sanei_pieusb_buffer_get() argument
494 N = buffer->width * buffer->height; in sanei_pieusb_buffer_get()
496 if (buffer->packet_size_bytes == 1 && buffer->packing_density == 1) { in sanei_pieusb_buffer_get()
497 /* Single byte values in buffer */ in sanei_pieusb_buffer_get()
498 while (n < max_len && buffer->bytes_read < buffer->image_size_bytes) { in sanei_pieusb_buffer_get()
500 …*pdata++ = *(buffer->data + N*buffer->read_index[0] + buffer->width*buffer->read_index[1] + buffer in sanei_pieusb_buffer_get()
502 buffer_update_read_index(buffer,1); in sanei_pieusb_buffer_get()
504 buffer->bytes_read++; in sanei_pieusb_buffer_get()
507 } else if (buffer->packet_size_bytes == 1 && buffer->packing_density == 8) { in sanei_pieusb_buffer_get()
508 /* Unpacked bits in buffer: repack */ in sanei_pieusb_buffer_get()
509 while (n < max_len && buffer->bytes_read < buffer->image_size_bytes) { in sanei_pieusb_buffer_get()
513 if (buffer->width - buffer->read_index[2] < 8) { in sanei_pieusb_buffer_get()
514 n_bits = buffer->width - buffer->read_index[2]; in sanei_pieusb_buffer_get()
518 …if (*(buffer->data + N*buffer->read_index[0] + buffer->width*buffer->read_index[1] + buffer->read_… in sanei_pieusb_buffer_get()
525 buffer_update_read_index(buffer,n_bits); in sanei_pieusb_buffer_get()
527 buffer->bytes_read++; in sanei_pieusb_buffer_get()
530 } else if (buffer->packet_size_bytes == 2) { in sanei_pieusb_buffer_get()
531 /* Two-byte values in buffer */ in sanei_pieusb_buffer_get()
532 while (n < max_len && buffer->bytes_read < buffer->image_size_bytes) { in sanei_pieusb_buffer_get()
534 …SANE_Uint val = *(buffer->data + N*buffer->read_index[0] + buffer->width*buffer->read_index[1] + b… in sanei_pieusb_buffer_get()
536 if (buffer->read_index[3] == 0) { in sanei_pieusb_buffer_get()
542 buffer_update_read_index(buffer,1); in sanei_pieusb_buffer_get()
544 buffer->bytes_read++; in sanei_pieusb_buffer_get()
549 …_put(): paccket size & density of %d/%d not implemented\n", buffer->packet_size_bytes, buffer->pac… in sanei_pieusb_buffer_get()
555 buffer->bytes_unread -= n; in sanei_pieusb_buffer_get()
557 /* Output current buffer state */ in sanei_pieusb_buffer_get()
558 /* buffer_output_state(buffer); */ in sanei_pieusb_buffer_get()
564 * @param buffer the buffer to initialize
567 static void buffer_update_read_index(struct Pieusb_Read_Buffer* buffer, int increment) in buffer_update_read_index() argument
574 if (buffer->read_index[3] == 0 && buffer->packet_size_bytes == 2) { in buffer_update_read_index()
575 buffer->read_index[3] = 1; in buffer_update_read_index()
577 buffer->read_index[3] = 0; in buffer_update_read_index()
578 buffer->read_index[0]++; in buffer_update_read_index()
579 if (buffer->read_index[0] == buffer->colors) { in buffer_update_read_index()
580 buffer->read_index[0] = 0; in buffer_update_read_index()
581 buffer->read_index[2] += increment; in buffer_update_read_index()
582 if (buffer->read_index[2] >= buffer->width) { in buffer_update_read_index()
583 buffer->read_index[2] = 0; in buffer_update_read_index()
584 buffer->read_index[1]++; in buffer_update_read_index()
592 * Display the buffer state.
594 * @param buffer the buffer to initialize
597 static void buffer_output_state(struct Pieusb_Read_Buffer* buffer)
602 line_size = buffer->line_size_bytes * buffer->colors; /* Full line size in bytes */
604 DBG(DBG_info_buffer, "Buffer data\n");
605 DBG(DBG_info_buffer," width/height/colors/depth = %d %d %d %d (buffer size %d)\n",
606 buffer->width, buffer->height, buffer->colors, buffer->depth, buffer->image_size_bytes);
609 N = buffer->width * buffer->height;
610 for (k = 0; k < buffer->colors; k++) {
611 loc[k] = buffer->p_read[k] - buffer->data - k*N;
613 for (k = buffer->colors; k < 4; k++) {
617 for (k = 0; k < buffer->colors; k++) {
618 loc[k] = buffer->p_write[k] - buffer->data - k*N;
620 for (k = buffer->colors; k < 4; k++) {
626 double fdata = (double)buffer->bytes_unread/buffer->image_size_bytes*100;
627 double fread = (double)buffer->bytes_read/buffer->image_size_bytes*100;
628 double fwritten = (double)buffer->bytes_written/buffer->image_size_bytes*100;
630buffer->image_size_bytes, buffer->bytes_unread, fdata, buffer->bytes_read, fread, buffer->bytes_wr…
632 …(double)buffer->image_size_bytes/line_size, (double)buffer->bytes_unread/line_size, (double)buffer