This tool extracts J2K codestreams from a MJ2 file (designed to
authorFrancois-Olivier Devaux <fodevaux@users.noreply.github.com>
Wed, 8 Dec 2004 12:12:00 +0000 (12:12 +0000)
committerFrancois-Olivier Devaux <fodevaux@users.noreply.github.com>
Wed, 8 Dec 2004 12:12:00 +0000 (12:12 +0000)
work with other codecs than OpenJPEG)

mj2/extract_j2k_from_mj2.c [new file with mode: 0644]

diff --git a/mj2/extract_j2k_from_mj2.c b/mj2/extract_j2k_from_mj2.c
new file mode 100644 (file)
index 0000000..86ce02a
--- /dev/null
@@ -0,0 +1,80 @@
+#include <stdio.h>
+#include <malloc.h>
+#include <setjmp.h>
+
+#include "mj2.h"
+
+//MEMORY LEAK
+#ifdef _DEBUG
+#define _CRTDBG_MAP_ALLOC
+#include <stdlib.h>  // Must be included first
+#include <crtdbg.h>
+#endif
+//MEM
+
+jmp_buf j2k_error;
+
+int main(int argc, char *argv[]) {
+
+  unsigned int tnum, snum;
+  mj2_movie_t movie;
+  mj2_tk_t *track;
+  mj2_sample_t *sample;
+  unsigned char* frame_codestream;
+  FILE *file, *outfile;
+  char outfilename[50];
+
+  if (argc != 3) {
+    printf("Bad syntax: Usage: MJ2_extractor mj2filename output_location\n"); 
+    printf("Example: MJ2_extractor foreman.mj2 output/foreman\n");
+    return 1;
+  }
+  
+  file = fopen(argv[1], "rb");
+  
+  if (!file) {
+    fprintf(stderr, "failed to open %s for reading\n", argv[1]);
+    return 1;
+  }
+
+  if (mj2_read_struct(file, &movie)) // Creating the movie structure
+    return 1;
+
+  // Decode first video track 
+  tnum = 0;
+  while (movie.tk[tnum].track_type != 0)
+    tnum ++;
+
+  track = &movie.tk[tnum];
+
+  fprintf(stdout,"Extracting %d frames from file...\n",track->num_samples);
+
+  for (snum=0; snum < track->num_samples; snum++)
+  {
+    sample = &track->sample[snum];
+    frame_codestream = (unsigned char*) malloc (sample->sample_size-8); // Skipping JP2C marker
+    fseek(file,sample->offset+8,SEEK_SET);
+    fread(frame_codestream,sample->sample_size-8,1, file);  // Assuming that jp and ftyp markers size do
+
+    sprintf(outfilename,"%s_%d.j2k",argv[2],snum);
+    outfile = fopen(outfilename, "wb");
+    if (!outfile) {
+      fprintf(stderr, "failed to open %s for writing\n",outfilename);
+      return 1;
+    }
+    fwrite(frame_codestream,sample->sample_size-8,1,outfile);
+    fclose(outfile);
+    free(frame_codestream);
+    }
+  fclose(file);
+  fprintf(stdout, "%d frames correctly extracted\n", snum);
+  mj2_memory_free(&movie);
+
+  //MEMORY LEAK
+  #ifdef _DEBUG
+    _CrtDumpMemoryLeaks();
+  #endif
+  //MEM
+
+  return 0;
+}
\ No newline at end of file