8 /* ----------------------- */
11 /* Count the number of frames */
14 /* ----------------------- */
16 int yuv_num_frames(mj2_tk_t * tk, FILE *f)
18 int numimages, frame_size;
21 frame_size = (int) (tk->w * tk->h * (1.0 + (double) 2 / (double) (tk->CbCr_subsampling_dx * tk->CbCr_subsampling_dy))); /* Calculate frame size */
23 fseek(f, 0, SEEK_END);
24 end_of_f = ftell(f); /* Calculate file size */
26 if (end_of_f < frame_size) {
28 "YUV does not contains any frame of %d x %d size\n", tk->w,
33 numimages = end_of_f / frame_size; /* Calculate number of images */
39 // -----------------------
44 // -----------------------
46 int yuvtoimage(FILE *yuvfile, mj2_tk_t * tk, j2k_image_t * img,
47 int frame_num, int subsampling_dx, int subsampling_dy)
51 long end_of_f, position;
55 (int) ((double) (frame_num * tk->w * tk->h) *
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",
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;
77 img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
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;
85 img->comps[i].dx = subsampling_dx;
86 img->comps[i].dy = subsampling_dy;
88 img->comps[i].dx = subsampling_dx * tk->CbCr_subsampling_dx;
89 img->comps[i].dy = subsampling_dy * tk->CbCr_subsampling_dy;
93 Compo = fopen("Compo0", "wb");
95 fprintf(stderr, "Failed to open Compo0 for writing !\n");
98 for (i = 0; i < (tk->w * tk->h / (img->comps[0].dx * img->comps[0].dy))
99 && !feof(yuvfile); i++) {
101 j = fread(&y, 1, 1, yuvfile);
102 fwrite(&y, 1, 1, Compo);
107 Compo = fopen("Compo1", "wb");
109 fprintf(stderr, "Failed to open Compo1 for writing !\n");
113 for (i = 0; i < (tk->w * tk->h / (img->comps[1].dx * img->comps[1].dy))
114 && !feof(yuvfile); i++) {
116 j = fread(&cb, sizeof(unsigned char), 1, yuvfile);
117 fwrite(&cb, 1, 1, Compo);
122 Compo = fopen("Compo2", "wb");
124 fprintf(stderr, "Failed to open Compo2 for writing !\n");
128 for (i = 0; i < (tk->w * tk->h / (img->comps[2].dx * img->comps[2].dy))
129 && !feof(yuvfile); i++) {
131 j = fread(&cr, sizeof(unsigned char), 1, yuvfile);
132 fwrite(&cr, 1, 1, Compo);
141 // -----------------------
146 // -----------------------
149 int imagetoyuv(j2k_image_t * img, j2k_cp_t * cp, char *outfile)
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) {
158 "Error with the input image components size: cannot create yuv file)\n");
161 } else if (!(img->numcomps == 1)) {
163 "Error with the number of image components(must be one or three)\n");
167 f = fopen(outfile, "a+b");
169 fprintf(stderr, "failed to open %s for writing\n", outfile);
174 for (i = 0; i < (img->comps[0].w * img->comps[0].h); i++) {
176 y = img->comps[0].data[i];
181 if (img->numcomps == 3) {
182 for (i = 0; i < (img->comps[1].w * img->comps[1].h); i++) {
184 cb = img->comps[1].data[i];
185 fwrite(&cb, 1, 1, f);
189 for (i = 0; i < (img->comps[2].w * img->comps[2].h); i++) {
191 cr = img->comps[2].data[i];
192 fwrite(&cr, 1, 1, f);
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);
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);
210 // -----------------------
215 // -----------------------
217 int imagetobmp(j2k_image_t * img, j2k_cp_t * cp, char *outfile) {
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 /* -->> -->> -->> -->>
231 <<-- <<-- <<-- <<-- */
233 f = fopen(outfile, "wb");
235 fprintf(stderr, "failed to open %s for writing\n", outfile);
240 wr = int_ceildivpow2(img->comps[0].w, img->comps[0].factor);
243 hr = int_ceildivpow2(img->comps[0].h, img->comps[0].factor);
249 fprintf(f, "%c%c%c%c",
250 (unsigned char) (hr * wr * 3 + 3 * hr * (wr % 2) +
252 (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
254 (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
256 (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
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);
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)) >>
284 (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >>
286 (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >>
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);
297 for (i = 0; i < wr * hr; i++) {
298 unsigned char R, G, B;
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);
308 if ((i + 1) % wr == 0) {
309 for (pad = (3 * wr) % 4 ? 4 - (3 * wr) % 4 : 0; pad > 0; pad--) /* ADD */
314 free(img->comps[1].data);
315 free(img->comps[2].data);