Newline at end of file added
[openjpeg.git] / mj2 / mj2_convert.c
1 #include <stdio.h>
2 #include <malloc.h>
3
4 #include "mj2.h"
5 #include <j2k.h>
6 #include <int.h>
7
8 /*  -----------------------           */
9 /*                                    */
10 /*                                    */
11 /*  Count the number of frames        */
12 /*  in a YUV file                     */
13 /*                                    */
14 /*  -----------------------           */
15
16 int yuv_num_frames(mj2_tk_t * tk, FILE *f)
17 {
18   int numimages, frame_size;
19   long end_of_f;
20
21   frame_size = (int) (tk->w * tk->h * (1.0 + (double) 2 / (double) (tk->CbCr_subsampling_dx * tk->CbCr_subsampling_dy)));       /* Calculate frame size */
22
23   fseek(f, 0, SEEK_END);
24   end_of_f = ftell(f);          /* Calculate file size */
25
26   if (end_of_f < frame_size) {
27     fprintf(stderr,
28             "YUV does not contains any frame of %d x %d size\n", tk->w,
29             tk->h);
30     return 0;
31   }
32
33   numimages = end_of_f / frame_size;    /* Calculate number of images */
34
35   return numimages;
36   fclose(f);
37 }
38
39 //  -----------------------
40 //
41 //
42 //  YUV to IMAGE
43 //
44 //  -----------------------
45
46 int yuvtoimage(FILE *yuvfile, mj2_tk_t * tk, j2k_image_t * img, 
47                int frame_num, int subsampling_dx, int subsampling_dy)
48 {
49   int i, j;
50   int offset;
51   long end_of_f, position;
52   FILE *Compo;
53
54   offset =
55     (int) ((double) (frame_num * tk->w * tk->h) *
56            (1.0 +
57             1.0 * (double) 2 / (double) (tk->CbCr_subsampling_dx *
58                                          tk->CbCr_subsampling_dy)));
59   fseek(yuvfile, 0, SEEK_END);
60   end_of_f = ftell(yuvfile);
61   fseek(yuvfile, sizeof(unsigned char) * offset, SEEK_SET);
62   position = ftell(yuvfile);
63   if (position >= end_of_f) {
64     fprintf(stderr, "Cannot reach frame number %d in yuv file !!\n",
65             frame_num);
66     return 0;
67   }
68
69   img->x0 = tk->Dim[0];
70   img->y0 = tk->Dim[1];
71   img->x1 = !tk->Dim[0] ? (tk->w - 1) * subsampling_dx + 1 : tk->Dim[0] +
72     (tk->w - 1) * subsampling_dx + 1;
73   img->y1 = !tk->Dim[1] ? (tk->h - 1) * subsampling_dy + 1 : tk->Dim[1] +
74     (tk->h - 1) * subsampling_dy + 1;
75   img->numcomps = 3;
76   img->color_space = 3;
77   img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
78
79   for (i = 0; i < img->numcomps; i++) {
80     img->comps[i].data = (int *) malloc(sizeof(int) * tk->w * tk->h);
81     img->comps[i].prec = 8;
82     img->comps[i].bpp = 8;
83     img->comps[i].sgnd = 0;
84     if (i == 0) {
85       img->comps[i].dx = subsampling_dx;
86       img->comps[i].dy = subsampling_dy;
87     } else {
88       img->comps[i].dx = subsampling_dx * tk->CbCr_subsampling_dx;
89       img->comps[i].dy = subsampling_dy * tk->CbCr_subsampling_dy;
90     }
91   }
92
93   Compo = fopen("Compo0", "wb");
94   if (!Compo) {
95     fprintf(stderr, "Failed to open Compo0 for writing !\n");
96   }
97
98   for (i = 0; i < (tk->w * tk->h / (img->comps[0].dx * img->comps[0].dy))
99        && !feof(yuvfile); i++) {
100     unsigned char y;
101     j = fread(&y, 1, 1, yuvfile);
102     fwrite(&y, 1, 1, Compo);
103   }
104
105   fclose(Compo);
106
107   Compo = fopen("Compo1", "wb");
108   if (!Compo) {
109     fprintf(stderr, "Failed to open Compo1 for writing !\n");
110   }
111
112
113   for (i = 0; i < (tk->w * tk->h / (img->comps[1].dx * img->comps[1].dy))
114        && !feof(yuvfile); i++) {
115     unsigned char cb;
116     j = fread(&cb, sizeof(unsigned char), 1, yuvfile);
117     fwrite(&cb, 1, 1, Compo);
118   }
119
120   fclose(Compo);
121
122   Compo = fopen("Compo2", "wb");
123   if (!Compo) {
124     fprintf(stderr, "Failed to open Compo2 for writing !\n");
125   }
126
127
128   for (i = 0; i < (tk->w * tk->h / (img->comps[2].dx * img->comps[2].dy))
129        && !feof(yuvfile); i++) {
130     unsigned char cr;
131     j = fread(&cr, sizeof(unsigned char), 1, yuvfile);
132     fwrite(&cr, 1, 1, Compo);
133   }
134
135   fclose(Compo);
136   return 1;
137 }
138
139
140
141 //  -----------------------
142 //
143 //
144 //  IMAGE to YUV
145 //
146 //  -----------------------
147
148
149 int imagetoyuv(j2k_image_t * img, j2k_cp_t * cp, char *outfile)
150 {
151   FILE *f;
152   int i;
153   
154   if (img->numcomps == 3) {
155     if (img->comps[0].dx != img->comps[1].dx / 2
156       || img->comps[1].dx != img->comps[2].dx) {
157       fprintf(stderr,
158         "Error with the input image components size: cannot create yuv file)\n");
159       return 1;
160     }
161   } else if (!(img->numcomps == 1)) {
162     fprintf(stderr,
163       "Error with the number of image components(must be one or three)\n");
164     return 1;
165   }
166   
167   f = fopen(outfile, "a+b");
168   if (!f) {
169     fprintf(stderr, "failed to open %s for writing\n", outfile);
170     return 1;
171   }
172   
173   
174   for (i = 0; i < (img->comps[0].w * img->comps[0].h); i++) {
175     unsigned char y;
176     y = img->comps[0].data[i];
177     fwrite(&y, 1, 1, f);
178   }
179   
180   
181   if (img->numcomps == 3) {
182     for (i = 0; i < (img->comps[1].w * img->comps[1].h); i++) {
183       unsigned char cb;
184       cb = img->comps[1].data[i];
185       fwrite(&cb, 1, 1, f);
186     }
187     
188     
189     for (i = 0; i < (img->comps[2].w * img->comps[2].h); i++) {
190       unsigned char cr;
191       cr = img->comps[2].data[i];
192       fwrite(&cr, 1, 1, f);
193     }
194   } else if (img->numcomps == 1) {
195     for (i = 0; i < (img->comps[0].w * img->comps[0].h * 0.25); i++) {
196       unsigned char cb = 125;
197       fwrite(&cb, 1, 1, f);
198     }
199     
200     
201     for (i = 0; i < (img->comps[0].w * img->comps[0].h * 0.25); i++) {
202       unsigned char cr = 125;
203       fwrite(&cr, 1, 1, f);
204     }
205   }  
206   fclose(f);
207   return 0;
208 }
209
210 //  -----------------------
211 //
212 //
213 //  IMAGE to BMP
214 //
215 //  -----------------------
216
217 int imagetobmp(j2k_image_t * img, j2k_cp_t * cp, char *outfile) {
218   int w,wr,h,hr,i,pad;
219   FILE *f;
220   
221   if (img->numcomps == 3 && img->comps[0].dx == img->comps[1].dx
222     && img->comps[1].dx == img->comps[2].dx
223     && img->comps[0].dy == img->comps[1].dy
224     && img->comps[1].dy == img->comps[2].dy
225     && img->comps[0].prec == img->comps[1].prec
226     && img->comps[1].prec == img->comps[2].prec) {
227     /* -->> -->> -->> -->>
228     
229       24 bits color
230       
231     <<-- <<-- <<-- <<-- */
232     
233     f = fopen(outfile, "wb");
234     if (!f) {
235       fprintf(stderr, "failed to open %s for writing\n", outfile);
236       return 1;
237     }   
238     
239     w = img->comps[0].w;
240     wr = int_ceildivpow2(img->comps[0].w, img->comps[0].factor);
241     
242     h = img->comps[0].h;
243     hr = int_ceildivpow2(img->comps[0].h, img->comps[0].factor);
244     
245     fprintf(f, "BM");
246     
247     /* FILE HEADER */
248     /* ------------- */
249     fprintf(f, "%c%c%c%c",
250       (unsigned char) (hr * wr * 3 + 3 * hr * (wr % 2) +
251       54) & 0xff,
252       (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
253       >> 8) & 0xff,
254       (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
255       >> 16) & 0xff,
256       (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
257       >> 24) & 0xff);
258     fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
259       ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
260     fprintf(f, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff,
261       ((54) >> 16) & 0xff, ((54) >> 24) & 0xff);
262     
263     /* INFO HEADER   */
264     /* ------------- */
265     fprintf(f, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff,
266       ((40) >> 16) & 0xff, ((40) >> 24) & 0xff);
267     fprintf(f, "%c%c%c%c", (unsigned char) ((wr) & 0xff),
268       (unsigned char) ((wr) >> 8) & 0xff,
269       (unsigned char) ((wr) >> 16) & 0xff,
270       (unsigned char) ((wr) >> 24) & 0xff);
271     fprintf(f, "%c%c%c%c", (unsigned char) ((hr) & 0xff),
272       (unsigned char) ((hr) >> 8) & 0xff,
273       (unsigned char) ((hr) >> 16) & 0xff,
274       (unsigned char) ((hr) >> 24) & 0xff);
275     fprintf(f, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);
276     fprintf(f, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff);
277     fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
278       ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
279     fprintf(f, "%c%c%c%c",
280       (unsigned char) (3 * hr * wr +
281       3 * hr * (wr % 2)) & 0xff,
282       (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >>
283       8) & 0xff,
284       (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >>
285       16) & 0xff,
286       (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >>
287       24) & 0xff);
288     fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
289       ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
290     fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
291       ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
292     fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
293       ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
294     fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
295       ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
296     
297     for (i = 0; i < wr * hr; i++) {
298       unsigned char R, G, B;
299       /* a modifier */
300       // R = img->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
301       R = img->comps[0].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
302       // G = img->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
303       G = img->comps[1].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
304       // B = img->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
305       B = img->comps[2].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
306       fprintf(f, "%c%c%c", B, G, R);
307       
308       if ((i + 1) % wr == 0) {
309         for (pad = (3 * wr) % 4 ? 4 - (3 * wr) % 4 : 0; pad > 0; pad--) /* ADD */
310           fprintf(f, "%c", 0);
311       }
312     }
313     fclose(f);
314     free(img->comps[1].data);
315     free(img->comps[2].data);
316   }
317   return 0;
318 }