/*
-* Copyright (c) 2003-2004, Fran�ois-Olivier Devaux
-* Copyright (c) 2003-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
+* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+* Copyright (c) 2002-2007, Professor Benoit Macq
+* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* POSSIBILITY OF SUCH DAMAGE.
*/
-#include <openjpeg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#ifndef WIN32
-#include <unistd.h>
-#endif
-#include <string.h>
+#include "opj_includes.h"
#include "mj2.h"
-// -->> -->> -->> -->>
-
-// YUV IMAGE FORMAT
-
-//-- <<-- <<-- <<-- */
-
-
/* ----------------------- */
/* */
/* */
/* */
/* ----------------------- */
-int yuv_num_frames(mj2_tk_t * tk)
+int yuv_num_frames(mj2_tk_t * tk, char *infile)
{
- FILE *f;
int numimages, frame_size;
long end_of_f;
+ FILE *f;
- f = fopen(tk->imagefile, "rb");
- if (!f) {
- fprintf(stderr, "Failed to open %s for reading !!\n", tk->imagefile);
- return 0;
+ f = fopen(infile,"rb");
+ if (!f) {
+ fprintf(stderr, "failed to open %s for reading\n",infile);
+ return 1;
}
-
+
frame_size = (int) (tk->w * tk->h * (1.0 + (double) 2 / (double) (tk->CbCr_subsampling_dx * tk->CbCr_subsampling_dy))); /* Calculate frame size */
-
+
fseek(f, 0, SEEK_END);
end_of_f = ftell(f); /* Calculate file size */
-
+
if (end_of_f < frame_size) {
fprintf(stderr,
- "YUV does not contains any frame of %d x %d size\n", tk->w,
- tk->h);
+ "YUV does not contains any frame of %d x %d size\n", tk->w,
+ tk->h);
return 0;
}
-
+
numimages = end_of_f / frame_size; /* Calculate number of images */
+ fclose(f);
return numimages;
- fclose(f);
}
// -----------------------
//
// -----------------------
-int yuvtoimage(mj2_tk_t * tk, j2k_image_t * img, int frame_num)
+opj_image_t *mj2_image_create(mj2_tk_t * tk, opj_cparameters_t *parameters)
{
- FILE *f;
- int i, j;
+ opj_image_cmptparm_t cmptparm[3];
+ opj_image_t * img;
+ int i;
+ int numcomps = 3;
+ int subsampling_dx = parameters->subsampling_dx;
+ int subsampling_dy = parameters->subsampling_dy;
+
+ /* initialize image components */
+ memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));
+ for(i = 0; i < numcomps; i++) {
+ cmptparm[i].prec = 8;
+ cmptparm[i].bpp = 8;
+ cmptparm[i].sgnd = 0;
+ cmptparm[i].dx = i ? subsampling_dx * tk->CbCr_subsampling_dx : subsampling_dx;
+ cmptparm[i].dy = i ? subsampling_dy * tk->CbCr_subsampling_dy : subsampling_dy;
+ cmptparm[i].w = tk->w;
+ cmptparm[i].h = tk->h;
+ }
+ /* create the image */
+ img = opj_image_create(numcomps, cmptparm, CLRSPC_SRGB);
+ return img;
+}
+
+bool yuvtoimage(mj2_tk_t * tk, opj_image_t * img, int frame_num, opj_cparameters_t *parameters, char* infile)
+{
+ int i, compno;
int offset;
long end_of_f, position;
- FILE *Compo;
-
-
-
- f = fopen(tk->imagefile, "rb");
- if (!f) {
- fprintf(stderr, "Failed to open %s for reading !!\n", tk->imagefile);
- return 0;
+ int numcomps = 3;
+ int subsampling_dx = parameters->subsampling_dx;
+ int subsampling_dy = parameters->subsampling_dy;
+ FILE *yuvfile;
+
+ yuvfile = fopen(infile,"rb");
+ if (!yuvfile) {
+ fprintf(stderr, "failed to open %s for reading\n",parameters->infile);
+ return false;
}
- offset =
- (int) ((double) (frame_num * tk->w * tk->h) *
- (1.0 +
- 1.0 * (double) 2 / (double) (tk->CbCr_subsampling_dx *
- tk->CbCr_subsampling_dy)));
- fseek(f, 0, SEEK_END);
- end_of_f = ftell(f);
- fseek(f, sizeof(unsigned char) * offset, SEEK_SET);
- position = ftell(f);
+ offset = (int) ((double) (frame_num * tk->w * tk->h) * (1.0 +
+ 1.0 * (double) 2 / (double) (tk->CbCr_subsampling_dx * tk->CbCr_subsampling_dy)));
+ fseek(yuvfile, 0, SEEK_END);
+ end_of_f = ftell(yuvfile);
+ fseek(yuvfile, sizeof(unsigned char) * offset, SEEK_SET);
+ position = ftell(yuvfile);
if (position >= end_of_f) {
- fprintf(stderr, "Cannot reach frame number %d in %s file !!\n",
- frame_num, tk->imagefile);
- return 0;
+ fprintf(stderr, "Cannot reach frame number %d in yuv file !!\n",
+ frame_num);
+ fclose(yuvfile);
+ return false;
}
-
+
img->x0 = tk->Dim[0];
img->y0 = tk->Dim[1];
- img->x1 =
- !tk->Dim[0] ? (tk->w - 1) * tk->subsampling_dx + 1 : tk->Dim[0] +
- (tk->w - 1) * tk->subsampling_dx + 1;
- img->y1 =
- !tk->Dim[1] ? (tk->h - 1) * tk->subsampling_dy + 1 : tk->Dim[1] +
- (tk->h - 1) * tk->subsampling_dy + 1;
- img->numcomps = 3;
- img->color_space = 3;
- img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
-
- for (i = 0; i < img->numcomps; i++) {
- img->comps[i].data = (int *) malloc(sizeof(int) * tk->w * tk->h);
- img->comps[i].prec = 8;
- img->comps[i].bpp = 8;
- img->comps[i].sgnd = 0;
- if (i == 0) {
- img->comps[i].dx = tk->subsampling_dx;
- img->comps[i].dy = tk->subsampling_dy;
- } else {
- img->comps[i].dx = tk->subsampling_dx * tk->CbCr_subsampling_dx;
- img->comps[i].dy = tk->subsampling_dy * tk->CbCr_subsampling_dy;
- }
- }
-
- Compo = fopen("Compo0", "wb");
- if (!Compo) {
- fprintf(stderr, "Failed to open Compo0 for writing !\n");
- }
-
- for (i = 0; i < (tk->w * tk->h / (img->comps[0].dx * img->comps[0].dy))
- && !feof(f); i++) {
- unsigned char y;
- j = fread(&y, 1, 1, f);
- fwrite(&y, 1, 1, Compo);
- }
-
- fclose(Compo);
-
- Compo = fopen("Compo1", "wb");
- if (!Compo) {
- fprintf(stderr, "Failed to open Compo1 for writing !\n");
- }
-
-
- for (i = 0; i < (tk->w * tk->h / (img->comps[1].dx * img->comps[1].dy))
- && !feof(f); i++) {
- unsigned char cb;
- j = fread(&cb, sizeof(unsigned char), 1, f);
- fwrite(&cb, 1, 1, Compo);
- }
-
- fclose(Compo);
-
- Compo = fopen("Compo2", "wb");
- if (!Compo) {
- fprintf(stderr, "Failed to open Compo2 for writing !\n");
- }
-
-
- for (i = 0; i < (tk->w * tk->h / (img->comps[2].dx * img->comps[2].dy))
- && !feof(f); i++) {
- unsigned char cr;
- j = fread(&cr, sizeof(unsigned char), 1, f);
- fwrite(&cr, 1, 1, Compo);
- }
-
- fclose(Compo);
-
- return 1;
+ img->x1 = !tk->Dim[0] ? (tk->w - 1) * subsampling_dx + 1 : tk->Dim[0] +
+ (tk->w - 1) * subsampling_dx + 1;
+ img->y1 = !tk->Dim[1] ? (tk->h - 1) * subsampling_dy + 1 : tk->Dim[1] +
+ (tk->h - 1) * subsampling_dy + 1;
+
+ for(compno = 0; compno < numcomps; compno++) {
+ for (i = 0; i < (tk->w * tk->h / (img->comps[compno].dx * img->comps[compno].dy))
+ && !feof(yuvfile); i++) {
+ if (!fread(&img->comps[compno].data[i], 1, 1, yuvfile)) {
+ fprintf(stderr, "Error reading %s file !!\n", infile);
+ return false;
+ }
+ }
+ }
+ fclose(yuvfile);
+
+ return true;
}
+
// -----------------------
//
//
// -----------------------
-int imagetoyuv(j2k_image_t * img, j2k_cp_t * cp, char *outfile)
+bool imagetoyuv(opj_image_t * img, char *outfile)
{
FILE *f;
int i;
-
+
if (img->numcomps == 3) {
if (img->comps[0].dx != img->comps[1].dx / 2
- || img->comps[1].dx != img->comps[2].dx) {
+ || img->comps[1].dx != img->comps[2].dx) {
fprintf(stderr,
- "Error with the input image components size: cannot create yuv file)\n");
- return 1;
+ "Error with the input image components size: cannot create yuv file)\n");
+ return false;
}
} else if (!(img->numcomps == 1)) {
fprintf(stderr,
- "Error with the number of image components(must be one or three)\n");
- return 1;
+ "Error with the number of image components(must be one or three)\n");
+ return false;
}
-
+
f = fopen(outfile, "a+b");
if (!f) {
fprintf(stderr, "failed to open %s for writing\n", outfile);
- return 1;
+ return false;
}
-
-
+
+
for (i = 0; i < (img->comps[0].w * img->comps[0].h); i++) {
unsigned char y;
y = img->comps[0].data[i];
fwrite(&y, 1, 1, f);
}
-
-
+
+
if (img->numcomps == 3) {
for (i = 0; i < (img->comps[1].w * img->comps[1].h); i++) {
unsigned char cb;
cb = img->comps[1].data[i];
fwrite(&cb, 1, 1, f);
}
-
-
+
+
for (i = 0; i < (img->comps[2].w * img->comps[2].h); i++) {
unsigned char cr;
cr = img->comps[2].data[i];
unsigned char cb = 125;
fwrite(&cb, 1, 1, f);
}
-
-
+
+
for (i = 0; i < (img->comps[0].w * img->comps[0].h * 0.25); i++) {
unsigned char cr = 125;
fwrite(&cr, 1, 1, f);
}
- }
-
-
-
+ }
fclose(f);
- return 0;
+ return true;
+}
+// -----------------------
+//
+//
+// IMAGE to BMP
+//
+// -----------------------
+int imagetobmp(opj_image_t * img, char *outfile) {
+ int w,wr,h,hr,i,pad;
+ FILE *f;
+
+ if (img->numcomps == 3 && img->comps[0].dx == img->comps[1].dx
+ && img->comps[1].dx == img->comps[2].dx
+ && img->comps[0].dy == img->comps[1].dy
+ && img->comps[1].dy == img->comps[2].dy
+ && img->comps[0].prec == img->comps[1].prec
+ && img->comps[1].prec == img->comps[2].prec) {
+ /* -->> -->> -->> -->>
+
+ 24 bits color
+
+ <<-- <<-- <<-- <<-- */
+
+ f = fopen(outfile, "wb");
+ if (!f) {
+ fprintf(stderr, "failed to open %s for writing\n", outfile);
+ return 1;
+ }
+
+ w = img->comps[0].w;
+ wr = int_ceildivpow2(img->comps[0].w, img->comps[0].factor);
+
+ h = img->comps[0].h;
+ hr = int_ceildivpow2(img->comps[0].h, img->comps[0].factor);
+
+ fprintf(f, "BM");
+
+ /* FILE HEADER */
+ /* ------------- */
+ fprintf(f, "%c%c%c%c",
+ (unsigned char) (hr * wr * 3 + 3 * hr * (wr % 2) +
+ 54) & 0xff,
+ (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
+ >> 8) & 0xff,
+ (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
+ >> 16) & 0xff,
+ (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
+ >> 24) & 0xff);
+ fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
+ ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
+ fprintf(f, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff,
+ ((54) >> 16) & 0xff, ((54) >> 24) & 0xff);
+
+ /* INFO HEADER */
+ /* ------------- */
+ fprintf(f, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff,
+ ((40) >> 16) & 0xff, ((40) >> 24) & 0xff);
+ fprintf(f, "%c%c%c%c", (unsigned char) ((wr) & 0xff),
+ (unsigned char) ((wr) >> 8) & 0xff,
+ (unsigned char) ((wr) >> 16) & 0xff,
+ (unsigned char) ((wr) >> 24) & 0xff);
+ fprintf(f, "%c%c%c%c", (unsigned char) ((hr) & 0xff),
+ (unsigned char) ((hr) >> 8) & 0xff,
+ (unsigned char) ((hr) >> 16) & 0xff,
+ (unsigned char) ((hr) >> 24) & 0xff);
+ fprintf(f, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);
+ fprintf(f, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff);
+ fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
+ ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
+ fprintf(f, "%c%c%c%c",
+ (unsigned char) (3 * hr * wr +
+ 3 * hr * (wr % 2)) & 0xff,
+ (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >>
+ 8) & 0xff,
+ (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >>
+ 16) & 0xff,
+ (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >>
+ 24) & 0xff);
+ fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
+ ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
+ fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
+ ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
+ fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
+ ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
+ fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
+ ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
+
+ for (i = 0; i < wr * hr; i++) {
+ unsigned char R, G, B;
+ /* a modifier */
+ // R = img->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
+ R = img->comps[0].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
+ // G = img->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
+ G = img->comps[1].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
+ // B = img->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
+ B = img->comps[2].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
+ fprintf(f, "%c%c%c", B, G, R);
+
+ if ((i + 1) % wr == 0) {
+ for (pad = (3 * wr) % 4 ? 4 - (3 * wr) % 4 : 0; pad > 0; pad--) /* ADD */
+ fprintf(f, "%c", 0);
+ }
+ }
+ fclose(f);
+ opj_free(img->comps[1].data);
+ opj_free(img->comps[2].data);
+ }
+ return 0;
}