- free(frame_codestream);
- }
-
- /* Writing the MDAT box length in header */
- offset += cio_tell(cio);
- buf = (unsigned char*) malloc (4 * sizeof(unsigned char));
- cio = opj_cio_open(movie->cinfo, buf, 4);
- cio_write(cio,offset-mdat_initpos,4);
- fseek(mj2file,(long)mdat_initpos,SEEK_SET);
- fwrite(buf,4,1,mj2file);
- fseek(mj2file,0,SEEK_END);
- free(buf);
-
- /* Setting movie parameters */
- movie->tk[0].num_samples=snum;
- movie->tk[0].num_chunks=snum;
- setparams(movie, &img);
-
- /* Writing MOOV box */
- buf = (unsigned char*) malloc ((TEMP_BUF+snum*20) * sizeof(unsigned char));
- cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF+snum*20));
- mj2_write_moov(movie, cio);
- fwrite(buf,cio_tell(cio),1,mj2file);
-
- /* Ending program */
- free(img.comps);
- opj_cio_close(cio);
+
+ parameters.frame_rate = 25; /* DEFAULT */
+
+ mj2_setup_encoder(movie, ¶meters);
+
+
+ /* Writing JP, FTYP and MDAT boxes
+ Assuming that the JP and FTYP boxes won't be longer than 300 bytes */
+
+ buf = (unsigned char*) malloc(300 * sizeof(unsigned char));
+ cio = opj_cio_open(movie->cinfo, buf, 300);
+ mj2_write_jp(cio);
+ mj2_write_ftyp(movie, cio);
+ mdat_initpos = cio_tell(cio);
+ cio_skip(cio, 4);
+ cio_write(cio, MJ2_MDAT, 4);
+ fwrite(buf, cio_tell(cio), 1, mj2file);
+ free(buf);
+
+ /* Insert each j2k codestream in a JP2C box */
+ snum = 0;
+ offset = 0;
+ while (1) {
+ mj2_sample_t * new_sample;
+ mj2_chunk_t * new_chunk;
+ sample = &movie->tk[0].sample[snum];
+ sprintf(j2kfilename, "%s_%05d.j2k", argv[1], snum);
+ j2kfile = fopen(j2kfilename, "rb");
+ if (!j2kfile) {
+ if (snum == 0) { /* Could not open a single codestream */
+ fprintf(stderr, "failed to open %s for reading\n", j2kfilename);
+ return 1;
+ } else { /* Tried to open a inexistant codestream */
+ fprintf(stdout, "%d frames are being added to the MJ2 file\n", snum);
+ break;
+ }
+ }
+
+ /* Calculating offset for samples and chunks */
+ offset += cio_tell(cio);
+ sample->offset = offset;
+ movie->tk[0].chunk[snum].offset =
+ offset; /* There will be one sample per chunk */
+
+ /* Calculating sample size */
+ fseek(j2kfile, 0, SEEK_END);
+ sample->sample_size = ftell(j2kfile) +
+ 8; /* Sample size is codestream + JP2C box header */
+ fseek(j2kfile, 0, SEEK_SET);
+
+ /* Reading siz marker of j2k image for the first codestream */
+ if (snum == 0) {
+ read_siz_marker(j2kfile, &img);
+ }
+
+ /* Writing JP2C box header */
+ frame_codestream = (unsigned char*) malloc(sample->sample_size + 8);
+ cio = opj_cio_open(movie->cinfo, frame_codestream, sample->sample_size);
+ cio_write(cio, sample->sample_size, 4); /* Sample size */
+ cio_write(cio, JP2_JP2C, 4); /* JP2C */
+
+ /* Writing codestream from J2K file to MJ2 file */
+ fread(frame_codestream + 8, sample->sample_size - 8, 1, j2kfile);
+ fwrite(frame_codestream, sample->sample_size, 1, mj2file);
+ cio_skip(cio, sample->sample_size - 8);
+
+ /* Ending loop */
+ fclose(j2kfile);
+ snum++;
+ new_sample = (mj2_sample_t*)
+ realloc(movie->tk[0].sample, (snum + 1) * sizeof(mj2_sample_t));
+ new_chunk = (mj2_chunk_t*)
+ realloc(movie->tk[0].chunk, (snum + 1) * sizeof(mj2_chunk_t));
+ if (new_sample && new_chunk) {
+ movie->tk[0].sample = new_sample;
+ movie->tk[0].chunk = new_chunk;
+ } else {
+ fprintf(stderr, "Failed to allocate enough memory to read %s\n", j2kfilename);
+ return 1;
+ }
+ free(frame_codestream);
+ }
+
+ /* Writing the MDAT box length in header */
+ offset += cio_tell(cio);
+ buf = (unsigned char*) malloc(4 * sizeof(unsigned char));
+ cio = opj_cio_open(movie->cinfo, buf, 4);
+ cio_write(cio, offset - mdat_initpos, 4);
+ fseek(mj2file, (long)mdat_initpos, SEEK_SET);
+ fwrite(buf, 4, 1, mj2file);
+ fseek(mj2file, 0, SEEK_END);
+ free(buf);
+
+ /* Setting movie parameters */
+ movie->tk[0].num_samples = snum;
+ movie->tk[0].num_chunks = snum;
+ setparams(movie, &img);
+
+ /* Writing MOOV box */
+ buf = (unsigned char*) malloc((TEMP_BUF + snum * 20) * sizeof(unsigned char));
+ cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF + snum * 20));
+ mj2_write_moov(movie, cio);
+ fwrite(buf, cio_tell(cio), 1, mj2file);
+
+ /* Ending program */
+ free(img.comps);
+ opj_cio_close(cio);