12 /* ----------------------- */
15 /* Count the number of frames */
18 /* ----------------------- */
20 int yuv_num_frames(mj2_tk_t * tk, FILE *f)
22 int numimages, frame_size;
25 frame_size = (int) (tk->w * tk->h * (1.0 + (double) 2 / (double) (tk->CbCr_subsampling_dx * tk->CbCr_subsampling_dy))); /* Calculate frame size */
27 fseek(f, 0, SEEK_END);
28 end_of_f = ftell(f); /* Calculate file size */
30 if (end_of_f < frame_size) {
32 "YUV does not contains any frame of %d x %d size\n", tk->w,
37 numimages = end_of_f / frame_size; /* Calculate number of images */
43 // -----------------------
48 // -----------------------
50 int yuvtoimage(FILE *yuvfile, mj2_tk_t * tk, j2k_image_t * img,
51 int frame_num, int subsampling_dx, int subsampling_dy)
55 long end_of_f, position;
59 (int) ((double) (frame_num * tk->w * tk->h) *
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",
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;
81 img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
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;
89 img->comps[i].dx = subsampling_dx;
90 img->comps[i].dy = subsampling_dy;
92 img->comps[i].dx = subsampling_dx * tk->CbCr_subsampling_dx;
93 img->comps[i].dy = subsampling_dy * tk->CbCr_subsampling_dy;
97 Compo = fopen("Compo0", "wb");
99 fprintf(stderr, "Failed to open Compo0 for writing !\n");
102 for (i = 0; i < (tk->w * tk->h / (img->comps[0].dx * img->comps[0].dy))
103 && !feof(yuvfile); i++) {
105 j = fread(&y, 1, 1, yuvfile);
106 fwrite(&y, 1, 1, Compo);
111 Compo = fopen("Compo1", "wb");
113 fprintf(stderr, "Failed to open Compo1 for writing !\n");
117 for (i = 0; i < (tk->w * tk->h / (img->comps[1].dx * img->comps[1].dy))
118 && !feof(yuvfile); i++) {
120 j = fread(&cb, sizeof(unsigned char), 1, yuvfile);
121 fwrite(&cb, 1, 1, Compo);
126 Compo = fopen("Compo2", "wb");
128 fprintf(stderr, "Failed to open Compo2 for writing !\n");
132 for (i = 0; i < (tk->w * tk->h / (img->comps[2].dx * img->comps[2].dy))
133 && !feof(yuvfile); i++) {
135 j = fread(&cr, sizeof(unsigned char), 1, yuvfile);
136 fwrite(&cr, 1, 1, Compo);
145 // -----------------------
150 // -----------------------
153 int imagetoyuv(j2k_image_t * img, j2k_cp_t * cp, char *outfile)
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) {
162 "Error with the input image components size: cannot create yuv file)\n");
165 } else if (!(img->numcomps == 1)) {
167 "Error with the number of image components(must be one or three)\n");
171 f = fopen(outfile, "a+b");
173 fprintf(stderr, "failed to open %s for writing\n", outfile);
178 for (i = 0; i < (img->comps[0].w * img->comps[0].h); i++) {
180 y = img->comps[0].data[i];
185 if (img->numcomps == 3) {
186 for (i = 0; i < (img->comps[1].w * img->comps[1].h); i++) {
188 cb = img->comps[1].data[i];
189 fwrite(&cb, 1, 1, f);
193 for (i = 0; i < (img->comps[2].w * img->comps[2].h); i++) {
195 cr = img->comps[2].data[i];
196 fwrite(&cr, 1, 1, f);
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);
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);
214 // -----------------------
219 // -----------------------
221 int imagetobmp(j2k_image_t * img, j2k_cp_t * cp, char *outfile) {
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 /* -->> -->> -->> -->>
235 <<-- <<-- <<-- <<-- */
237 f = fopen(outfile, "wb");
239 fprintf(stderr, "failed to open %s for writing\n", outfile);
244 wr = int_ceildivpow2(img->comps[0].w, img->comps[0].factor);
247 hr = int_ceildivpow2(img->comps[0].h, img->comps[0].factor);
253 fprintf(f, "%c%c%c%c",
254 (unsigned char) (hr * wr * 3 + 3 * hr * (wr % 2) +
256 (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
258 (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
260 (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
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);
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)) >>
288 (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >>
290 (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >>
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);
301 for (i = 0; i < wr * hr; i++) {
302 unsigned char R, G, B;
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);
312 if ((i + 1) % wr == 0) {
313 for (pad = (3 * wr) % 4 ? 4 - (3 * wr) % 4 : 0; pad > 0; pad--) /* ADD */
318 free(img->comps[1].data);
319 free(img->comps[2].data);