ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/fltdepth.c
Revision: 3.1
Committed: Thu Nov 7 23:20:28 2019 UTC (4 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Log Message:
Added ability for pinterp, pmblur2, and vwrays to read 16-bit encoded depth

File Contents

# Content
1 /*
2 * Function to open floating-point depth file, making sure it's
3 * the correct length, and converting from encoded 16-bit
4 * depth into a temporary file if needed
5 */
6
7 #include "rtio.h"
8 #include "paths.h"
9
10 #if defined(_WIN32) || defined(_WIN64)
11
12 #include "platform.h"
13
14 /* Return file descriptor for open raw float file, or -1 on error */
15 /* Set expected_length to width*height, or 0 if unknown */
16 /* We don't translate encoded depth under Windows because of temp file issue */
17 int
18 open_float_depth(const char *fname, long expected_length)
19 {
20 int fd = open(fname, O_RDONLY|O_BINARY);
21
22 if (fd < 0)
23 return(-1);
24 if (expected_length > 0) {
25 off_t flen = lseek(fd, 0, SEEK_END);
26 if (flen != expected_length*sizeof(float)) {
27 fprintf(stderr, "%s: expected length is %ld, actual length is %ld\n",
28 fname, expected_length, (long)(flen/sizeof(float)));
29 close(fd);
30 return(-1);
31 }
32 lseek(fd, 0, SEEK_SET);
33 }
34 return(fd);
35 }
36
37 #else /* ! defined(_WIN32) || defined(_WIN64) */
38
39 #include <ctype.h>
40 #include "fvect.h"
41 #include "depthcodec.h"
42
43 #define FBUFLEN 1024 /* depth conversion batch size */
44
45 /* Return file descriptor for open raw float file, or -1 on error */
46 /* Set expected_length to width*height, or 0 if unknown */
47 int
48 open_float_depth(const char *fname, long expected_length)
49 {
50 char buf[FBUFLEN*sizeof(float)];
51 DEPTHCODEC dc;
52 ssize_t n, nleft;
53 int fd = open(fname, O_RDONLY);
54
55 if (fd < 0)
56 return(-1);
57 dc.finp = NULL;
58 if (expected_length <= 0) { /* need to sniff file? */
59 extern const char HDRSTR[];
60 const int len = strlen(HDRSTR);
61 n = read(fd, buf, len+1);
62 if (n < len+1)
63 goto gotEOF;
64 if (lseek(fd, 0, SEEK_SET) != 0)
65 goto seek_error;
66 for (n = 0; n < len; n++)
67 if (buf[n] != HDRSTR[n])
68 break;
69 if (n < len || !isprint(buf[len]))
70 return(fd); /* unknown length raw float... */
71 } else {
72 off_t flen = lseek(fd, 0, SEEK_END);
73 if (flen < 0 || lseek(fd, 0, SEEK_SET) != 0)
74 goto seek_error;
75 if (flen == expected_length*sizeof(float))
76 return(fd); /* it's the right length for raw */
77 }
78 /* We're thinking it's an encoded depth file at this point... */
79 set_dc_defaults(&dc); /* load & convert if we can */
80 dc.finp = fdopen(fd, "r");
81 if (!dc.finp) { /* out of memory?? */
82 perror("fdopen");
83 close(fd);
84 return(-1);
85 }
86 dc.inpname = fname; /* check encoded depth header */
87 dc.hdrflags = HF_HEADIN|HF_RESIN|HF_STDERR;
88 if (!process_dc_header(&dc, 0, NULL) || !check_decode_depths(&dc)) {
89 fclose(dc.finp); /* already reported error */
90 return(-1);
91 }
92 if (expected_length > 0 && (long)dc.res.xr*dc.res.yr != expected_length) {
93 fprintf(stderr, "%s: expected length is %ld, actual length is %ld\n",
94 fname, (long)expected_length, (long)dc.res.xr*dc.res.yr);
95 fclose(dc.finp);
96 return(-1);
97 }
98 strcpy(buf, TEMPLATE); /* create temporary file to hold raw */
99 fd = mkstemp(buf);
100 if (fd < 0) {
101 fputs(buf, stderr);
102 fputs(": cannot create temporary file\n", stderr);
103 fclose(dc.finp);
104 return(-1);
105 }
106 unlink(buf); /* unlink it now (Windows forbids) */
107 for (nleft = (ssize_t)dc.res.xr*dc.res.yr; nleft > 0; nleft -= FBUFLEN) {
108 for (n = 0; n < FBUFLEN; n++) {
109 double d = decode_depth_next(&dc);
110 if (d < 0) {
111 if (n < nleft)
112 goto gotEOF;
113 break;
114 }
115 ((float *)buf)[n] = (float)d;
116 }
117 n *= sizeof(float);
118 if (write(fd, buf, n) != n) {
119 perror("write");
120 fclose(dc.finp);
121 close(fd);
122 return(-1);
123 }
124 }
125 fclose(dc.finp); /* all done -- clean up */
126 if (lseek(fd, 0, SEEK_SET) != 0)
127 goto seek_error;
128 return(fd);
129 gotEOF:
130 fputs(fname, stderr);
131 fputs(": unexpected end-of-file\n", stderr);
132 if (dc.finp) fclose(dc.finp);
133 close(fd);
134 return(-1);
135 seek_error:
136 perror("lseek");
137 close(fd);
138 return(-1);
139 }
140
141 #endif