2 * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
3 * Copyright (c) 2002-2014, Professor Benoit Macq
4 * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
29 #include "opj_includes.h"
30 #include "mj2_convert.h"
32 /* ----------------------- */
35 /* Count the number of frames */
38 /* ----------------------- */
40 unsigned int OPJ_CALLCONV yuv_num_frames(mj2_tk_t * tk, char *infile)
42 unsigned int prec_size;
43 long end_of_f, frame_size;
46 f = fopen(infile, "rb");
48 fprintf(stderr, "failed to open %s for reading\n", infile);
51 prec_size = (tk->depth + 7) / 8; /* bytes of precision */
53 frame_size = (long)(tk->w * tk->h * (1.0 + (double) 2 / (double)(
54 tk->CbCr_subsampling_dx *
55 tk->CbCr_subsampling_dy))); /* Calculate frame size */
56 frame_size *= prec_size;
58 fseek(f, 0, SEEK_END);
59 end_of_f = ftell(f); /* Calculate file size */
61 if (end_of_f < frame_size) {
63 "YUV does not contains any frame of %d x %d size\n", tk->w,
70 return (unsigned int)(end_of_f / frame_size);
73 /* ----------------------- */
78 /* ----------------------- */
80 opj_image_t * OPJ_CALLCONV mj2_image_create(mj2_tk_t * tk,
81 opj_cparameters_t *parameters)
83 opj_image_cmptparm_t cmptparm[3];
87 int subsampling_dx = parameters->subsampling_dx;
88 int subsampling_dy = parameters->subsampling_dy;
90 /* initialize image components */
91 memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));
92 for (i = 0; i < numcomps; i++) {
93 cmptparm[i].prec = tk->depth;
94 cmptparm[i].bpp = tk->depth;
96 cmptparm[i].dx = i ? subsampling_dx * tk->CbCr_subsampling_dx : subsampling_dx;
97 cmptparm[i].dy = i ? subsampling_dy * tk->CbCr_subsampling_dy : subsampling_dy;
98 cmptparm[i].w = tk->w;
99 cmptparm[i].h = tk->h;
101 /* create the image */
102 img = opj_image_create(numcomps, cmptparm, CLRSPC_SRGB);
106 char OPJ_CALLCONV yuvtoimage(mj2_tk_t * tk, opj_image_t * img, int frame_num,
107 opj_cparameters_t *parameters, char* infile)
110 int offset, size, max, prec_bytes, is_16, v;
111 long end_of_f, position;
113 int subsampling_dx = parameters->subsampling_dx;
114 int subsampling_dy = parameters->subsampling_dy;
119 yuvfile = fopen(infile, "rb");
121 fprintf(stderr, "failed to open %s for readings\n", parameters->infile);
124 is_16 = (tk->depth > 8);
125 prec_bytes = (is_16 ? 2 : 1);
127 offset = (int)((double)(frame_num * tk->w * tk->h) * (1.0 +
128 1.0 * (double) 2 / (double)(tk->CbCr_subsampling_dx *
129 tk->CbCr_subsampling_dy)));
130 offset *= prec_bytes;
132 fseek(yuvfile, 0, SEEK_END);
133 end_of_f = ftell(yuvfile);
134 fseek(yuvfile, sizeof(unsigned char) * offset, SEEK_SET);
135 position = ftell(yuvfile);
136 if (position >= end_of_f) {
137 fprintf(stderr, "Cannot reach frame number %d in yuv file !!\n",
143 img->x0 = tk->Dim[0];
144 img->y0 = tk->Dim[1];
145 img->x1 = !tk->Dim[0] ? (tk->w - 1) * subsampling_dx + 1 : tk->Dim[0] +
146 (tk->w - 1) * subsampling_dx + 1;
147 img->y1 = !tk->Dim[1] ? (tk->h - 1) * subsampling_dy + 1 : tk->Dim[1] +
148 (tk->h - 1) * subsampling_dy + 1;
150 size = tk->w * tk->h * prec_bytes;
152 for (compno = 0; compno < numcomps; compno++) {
153 max = size / (img->comps[compno].dx * img->comps[compno].dy);
154 data = img->comps[compno].data;
156 for (i = 0; i < max && !feof(yuvfile); i++) {
158 fread(&uc, 1, 1, yuvfile);
162 fread(&uc, 1, 1, yuvfile);
175 /* ----------------------- */
180 /* ----------------------- */
183 opj_bool OPJ_CALLCONV imagetoyuv(opj_image_t * img, char *outfile)
187 int i, v, is_16, prec_bytes;
188 unsigned char buf[2];
190 if (img->numcomps == 3) {
191 if (img->comps[0].dx != img->comps[1].dx / 2
192 || img->comps[1].dx != img->comps[2].dx) {
194 "Error with the input image components size: cannot create yuv file)\n");
197 } else if (!(img->numcomps == 1)) {
199 "Error with the number of image components(must be one or three)\n");
203 f = fopen(outfile, "a+b");
205 fprintf(stderr, "failed to open %s for writing\n", outfile);
208 is_16 = (img->comps[0].prec > 8);
209 prec_bytes = (is_16 ? 2 : 1);
210 data = img->comps[0].data;
212 for (i = 0; i < (img->comps[0].w * img->comps[0].h); i++) {
214 buf[0] = (unsigned char)v;
217 buf[1] = (unsigned char)(v >> 8);
220 fwrite(buf, 1, prec_bytes, f);
224 if (img->numcomps == 3) {
225 data = img->comps[1].data;
227 for (i = 0; i < (img->comps[1].w * img->comps[1].h); i++) {
229 buf[0] = (unsigned char)v;
232 buf[1] = (unsigned char)(v >> 8);
235 fwrite(buf, 1, prec_bytes, f);
237 data = img->comps[2].data;
239 for (i = 0; i < (img->comps[2].w * img->comps[2].h); i++) {
241 buf[0] = (unsigned char)v;
244 buf[1] = (unsigned char)(v >> 8);
247 fwrite(buf, 1, prec_bytes, f);
249 } else if (img->numcomps == 1) {
250 /* fake CbCr values */
253 if (img->comps[0].prec == 10) {
255 } else if (img->comps[0].prec == 12) {
264 for (i = 0; i < (img->comps[0].w * img->comps[0].h * 0.25); i++) {
265 fwrite(buf, 1, prec_bytes, f);
269 for (i = 0; i < (img->comps[0].w * img->comps[0].h * 0.25); i++) {
270 fwrite(buf, 1, prec_bytes, f);
277 /* ----------------------- */
282 /* ----------------------- */
284 int OPJ_CALLCONV imagetobmp(opj_image_t * img, char *outfile)
286 int w, wr, h, hr, i, pad;
289 if (img->numcomps == 3 && img->comps[0].dx == img->comps[1].dx
290 && img->comps[1].dx == img->comps[2].dx
291 && img->comps[0].dy == img->comps[1].dy
292 && img->comps[1].dy == img->comps[2].dy
293 && img->comps[0].prec == img->comps[1].prec
294 && img->comps[1].prec == img->comps[2].prec) {
295 /* -->> -->> -->> -->>
299 <<-- <<-- <<-- <<-- */
301 f = fopen(outfile, "wb");
303 fprintf(stderr, "failed to open %s for writing\n", outfile);
308 wr = int_ceildivpow2(img->comps[0].w, img->comps[0].factor);
311 hr = int_ceildivpow2(img->comps[0].h, img->comps[0].factor);
317 fprintf(f, "%c%c%c%c",
318 (unsigned char)(hr * wr * 3 + 3 * hr * (wr % 2) +
320 (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
322 (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
324 (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
326 fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
327 ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
328 fprintf(f, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff,
329 ((54) >> 16) & 0xff, ((54) >> 24) & 0xff);
333 fprintf(f, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff,
334 ((40) >> 16) & 0xff, ((40) >> 24) & 0xff);
335 fprintf(f, "%c%c%c%c", (unsigned char)((wr) & 0xff),
336 (unsigned char)((wr) >> 8) & 0xff,
337 (unsigned char)((wr) >> 16) & 0xff,
338 (unsigned char)((wr) >> 24) & 0xff);
339 fprintf(f, "%c%c%c%c", (unsigned char)((hr) & 0xff),
340 (unsigned char)((hr) >> 8) & 0xff,
341 (unsigned char)((hr) >> 16) & 0xff,
342 (unsigned char)((hr) >> 24) & 0xff);
343 fprintf(f, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);
344 fprintf(f, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff);
345 fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
346 ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
347 fprintf(f, "%c%c%c%c",
348 (unsigned char)(3 * hr * wr +
349 3 * hr * (wr % 2)) & 0xff,
350 (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2)) >>
352 (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2)) >>
354 (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2)) >>
356 fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
357 ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
358 fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
359 ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
360 fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
361 ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
362 fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
363 ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
365 for (i = 0; i < wr * hr; i++) {
366 unsigned char R, G, B;
368 /* R = img->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];*/
369 R = img->comps[0].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
370 /* G = img->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];*/
371 G = img->comps[1].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
372 /* B = img->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];*/
373 B = img->comps[2].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
374 fprintf(f, "%c%c%c", B, G, R);
376 if ((i + 1) % wr == 0) {
377 for (pad = (3 * wr) % 4 ? 4 - (3 * wr) % 4 : 0; pad > 0; pad--) { /* ADD */