Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2. * Copyright (c) 2003-2004, François-Olivier Devaux
  3. * Copyright (c) 2002-2004,  Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions
  8. * are met:
  9. * 1. Redistributions of source code must retain the above copyright
  10. *    notice, this list of conditions and the following disclaimer.
  11. * 2. Redistributions in binary form must reproduce the above copyright
  12. *    notice, this list of conditions and the following disclaimer in the
  13. *    documentation and/or other materials provided with the distribution.
  14. *
  15. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
  16. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  19. * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  20. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  21. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  22. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  23. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  24. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  25. * POSSIBILITY OF SUCH DAMAGE.
  26. */
  27.  
  28. #include <stdio.h>
  29. #include <stdlib.h>
  30. #include <string.h>
  31.  
  32. #include "opj_config.h"
  33. #include "openjpeg.h"
  34. #include "../libopenjpeg/j2k_lib.h"
  35. #include "../libopenjpeg/j2k.h"
  36. #include "../libopenjpeg/jp2.h"
  37. #include "mj2.h"
  38. #include "mj2_convert.h"
  39.  
  40. #ifdef HAVE_LIBLCMS2
  41. #include <lcms2.h>
  42. #endif
  43. #ifdef HAVE_LIBLCMS1
  44. #include <lcms.h>
  45. #endif
  46. #include "color.h"
  47. /* -------------------------------------------------------------------------- */
  48.  
  49. /**
  50. sample error callback expecting a FILE* client object
  51. */
  52. void error_callback(const char *msg, void *client_data) {
  53.         FILE *stream = (FILE*)client_data;
  54.         fprintf(stream, "[ERROR] %s", msg);
  55. }
  56. /**
  57. sample warning callback expecting a FILE* client object
  58. */
  59. void warning_callback(const char *msg, void *client_data) {
  60.         FILE *stream = (FILE*)client_data;
  61.         fprintf(stream, "[WARNING] %s", msg);
  62. }
  63. /**
  64. sample debug callback expecting a FILE* client object
  65. */
  66. void info_callback(const char *msg, void *client_data) {
  67.         FILE *stream = (FILE*)client_data;
  68.         fprintf(stream, "[INFO] %s", msg);
  69. }
  70.  
  71. /* -------------------------------------------------------------------------- */
  72.  
  73.  
  74. int main(int argc, char *argv[]) {
  75.         mj2_dparameters_t mj2_parameters;                       /* decompression parameters */
  76.         opj_dinfo_t* dinfo;
  77.         opj_event_mgr_t event_mgr;              /* event manager */    
  78.         opj_cio_t *cio = NULL;
  79.   unsigned int tnum, snum;
  80.   opj_mj2_t *movie;
  81.   mj2_tk_t *track;
  82.   mj2_sample_t *sample;
  83.   unsigned char* frame_codestream;
  84.   FILE *file, *outfile;
  85.   char outfilename[50];
  86.   opj_image_t *img = NULL;
  87.         unsigned int max_codstrm_size = 0;
  88.         double total_time = 0;
  89.         unsigned int numframes = 0;
  90.                        
  91.   if (argc != 3) {
  92.     printf("Usage: %s inputfile.mj2 outputfile.yuv\n",argv[0]);
  93.     return 1;
  94.   }
  95.  
  96.   file = fopen(argv[1], "rb");
  97.  
  98.   if (!file) {
  99.     fprintf(stderr, "failed to open %s for reading\n", argv[1]);
  100.     return 1;
  101.   }
  102.        
  103.   // Checking output file
  104.   outfile = fopen(argv[2], "w");
  105.   if (!file) {
  106.     fprintf(stderr, "failed to open %s for writing\n", argv[2]);
  107.     return 1;
  108.   }
  109.   fclose(outfile);
  110.        
  111.         /*
  112.         configure the event callbacks (not required)
  113.         setting of each callback is optionnal
  114.         */
  115.         memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
  116.         event_mgr.error_handler = error_callback;
  117.         event_mgr.warning_handler = warning_callback;
  118.         event_mgr.info_handler = NULL;
  119.        
  120.         /* get a MJ2 decompressor handle */
  121.         dinfo = mj2_create_decompress();
  122.         movie = (opj_mj2_t*)dinfo->mj2_handle;
  123.        
  124.         /* catch events using our callbacks and give a local context */
  125.         opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);          
  126.  
  127.         /* set J2K decoding parameters to default values */
  128.         opj_set_default_decoder_parameters(&mj2_parameters.j2k_parameters);
  129.        
  130.         /* setup the decoder decoding parameters using user parameters */
  131.         mj2_setup_decoder((opj_mj2_t*)dinfo->mj2_handle, &mj2_parameters);
  132.                        
  133.   if (mj2_read_struct(file, movie)) // Creating the movie structure
  134.     return 1;  
  135.        
  136.   // Decode first video track
  137.         for (tnum=0; tnum < (unsigned int)(movie->num_htk + movie->num_stk + movie->num_vtk); tnum++) {
  138.                 if (movie->tk[tnum].track_type == 0)
  139.                         break;
  140.         }
  141.        
  142.         if (movie->tk[tnum].track_type != 0) {
  143.                 printf("Error. Movie does not contain any video track\n");
  144.                 return 1;
  145.         }
  146.        
  147.   track = &movie->tk[tnum];
  148.        
  149.   // Output info on first video tracl
  150.   fprintf(stdout,"The first video track contains %d frames.\nWidth: %d, Height: %d \n\n",
  151.     track->num_samples, track->w, track->h);
  152.        
  153.         max_codstrm_size = track->sample[0].sample_size-8;
  154.         frame_codestream = (unsigned char*) malloc(max_codstrm_size * sizeof(unsigned char));
  155.  
  156.         numframes = track->num_samples;
  157.        
  158.   for (snum=0; snum < numframes; snum++)
  159.   {
  160.                 double init_time = opj_clock();
  161.                 double elapsed_time;
  162.  
  163.     sample = &track->sample[snum];
  164.                 if (sample->sample_size-8 > max_codstrm_size) {
  165.                         max_codstrm_size =  sample->sample_size-8;
  166.                         if ((frame_codestream = (unsigned char*)
  167.                                 realloc(frame_codestream, max_codstrm_size)) == NULL) {
  168.                                 printf("Error reallocation memory\n");
  169.                                 return 1;
  170.                         };             
  171.                 }
  172.     fseek(file,sample->offset+8,SEEK_SET);
  173.     fread(frame_codestream, sample->sample_size-8, 1, file);  // Assuming that jp and ftyp markers size do
  174.                
  175.                 /* open a byte stream */
  176.                 cio = opj_cio_open((opj_common_ptr)dinfo, frame_codestream, sample->sample_size-8);
  177.                
  178.                 img = opj_decode(dinfo, cio); // Decode J2K to image
  179.  
  180. #ifdef WANT_SYCC_TO_RGB
  181.         if(img->color_space == CLRSPC_SYCC)
  182.   {
  183.         color_sycc_to_rgb(img);
  184.   }
  185. #endif
  186.  
  187.         if(img->icc_profile_buf)
  188.   {
  189. #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
  190.         color_apply_icc_profile(img);
  191. #endif
  192.  
  193.         free(img->icc_profile_buf);
  194.         img->icc_profile_buf = NULL; img->icc_profile_len = 0;
  195.   }
  196.  
  197.     if (((img->numcomps == 3) && (img->comps[0].dx == img->comps[1].dx / 2)
  198.       && (img->comps[0].dx == img->comps[2].dx / 2 ) && (img->comps[0].dx == 1))
  199.       || (img->numcomps == 1)) {
  200.      
  201.       if (!imagetoyuv(img, argv[2]))    // Convert image to YUV
  202.                                 return 1;
  203.     }
  204.     else if ((img->numcomps == 3) &&
  205.       (img->comps[0].dx == 1) && (img->comps[1].dx == 1)&&
  206.       (img->comps[2].dx == 1))// If YUV 4:4:4 input --> to bmp
  207.     {
  208.       fprintf(stdout,"The frames will be output in a bmp format (output_1.bmp, ...)\n");
  209.       sprintf(outfilename,"output_%d.bmp",snum);
  210.       if (imagetobmp(img, outfilename)) // Convert image to BMP
  211.                                 return 1;
  212.      
  213.     }
  214.     else {
  215.       fprintf(stdout,"Image component dimensions are unknown. Unable to output image\n");
  216.       fprintf(stdout,"The frames will be output in a j2k file (output_1.j2k, ...)\n");
  217.                        
  218.       sprintf(outfilename,"output_%d.j2k",snum);
  219.       outfile = fopen(outfilename, "wb");
  220.       if (!outfile) {
  221.                                 fprintf(stderr, "failed to open %s for writing\n",outfilename);
  222.                                 return 1;
  223.       }
  224.       fwrite(frame_codestream,sample->sample_size-8,1,outfile);
  225.       fclose(outfile);
  226.     }
  227.                 /* close the byte stream */
  228.                 opj_cio_close(cio);    
  229.                 /* free image data structure */
  230.                 opj_image_destroy(img);
  231.                 elapsed_time = opj_clock()-init_time;
  232.                 fprintf(stderr, "Frame number %d/%d decoded in %.2f mseconds\n", snum + 1, numframes, elapsed_time*1000);
  233.                 total_time += elapsed_time;
  234.  
  235.   }
  236.        
  237.         free(frame_codestream);
  238.   fclose(file);
  239.  
  240.         /* free remaining structures */
  241.         if(dinfo) {
  242.                 mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle);
  243.         }
  244.         free(dinfo);
  245.        
  246.         fprintf(stdout, "%d frame(s) correctly decompressed\n", snum);
  247.         fprintf(stdout,"Total decoding time: %.2f seconds (%.1f fps)\n", total_time, (float)numframes/total_time);
  248.                
  249.   return 0;
  250. }
  251.