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