]> Creatis software - gdcm.git/blobdiff - src/gdcmMpeg.cxx
Avoid Doxygen Warnings
[gdcm.git] / src / gdcmMpeg.cxx
index a707e01d10a6dac62b7f2c55f09dbaf8673985bc..854d241c0e4fb358cc40fce38d2728e99d7b5b79 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmMpeg.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/10/27 19:05:36 $
-  Version:   $Revision: 1.6 $
+  Date:      $Date: 2005/11/04 15:46:52 $
+  Version:   $Revision: 1.9 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -22,7 +22,7 @@
 
 typedef struct
 {
-  std::ifstream InFd;
+  std::ifstream *InFd;
 } istream;
 extern "C" {
 #define GLOBAL
@@ -37,28 +37,28 @@ off_t my_seek(istream *infile, off_t offset, int whence)
   switch(whence)
     {
     case SEEK_SET:
-      infile->InFd.seekg(offset, std::ios::beg);
+      infile->InFd->seekg(offset, std::ios::beg);
       break;
     case SEEK_END:
-      infile->InFd.seekg(offset, std::ios::end);
+      infile->InFd->seekg(offset, std::ios::end);
       break;
     case SEEK_CUR:
-      infile->InFd.seekg(offset, std::ios::cur);
+      infile->InFd->seekg(offset, std::ios::cur);
       break;
     }
-  return infile->InFd.tellg();
+  return infile->InFd->tellg();
 }
 ssize_t my_read(istream *infile, void *buf, size_t count)
 {
   //return fread(buf,1,count, infile->InFd);
-  infile->InFd.read((char*)buf, count);
-  return infile->InFd.gcount();
+  infile->InFd->read((char*)buf, count);
+  return infile->InFd->gcount();
 }
 
 int my_close(istream *infile)
 {
   //return fclose(infile->InFd);
-  infile->InFd.close();
+  infile->InFd->close();
   return 0;
 }
 
@@ -321,333 +321,16 @@ static void Initialize_Decoder()
 
 }
 
-/* option processing */
-static void Process_Options(int argc, const char *argv[])
-//int argc;                  /* argument count  */
-//char *argv[];              /* argument vector */
+bool ReadMPEGFile (std::ifstream *fp, char *image_buffer, size_t length)
 {
-  int i, LastArg, NextArg;
-
-  /* at least one argument should be present */
-  if (argc<2)
-  {
-    printf("\n%s, %s\n",Version,Author);
-    printf("Usage:  mpeg2decode {options}\n"
-"Options: -b  file  main bitstream (base or spatial enhancement layer)\n"
-"         -cn file  conformance report (n: level)\n"
-"         -e  file  enhancement layer bitstream (SNR or Data Partitioning)\n"
-"         -f        store/display interlaced video in frame format\n"
-"         -g        concatenated file format for substitution method (-x)\n"
-"         -in file  information & statistics report  (n: level)\n"
-"         -l  file  file name pattern for lower layer sequence\n");
-printf("                   (for spatial scalability)\n"
-"         -on file  output format (0:YUV 1:SIF 2:TGA 3:PPM 4:X11 5:X11HiQ)\n"
-"         -q        disable warnings to stderr\n"
-"         -r        use double precision reference IDCT\n"
-"         -t        enable low level tracing to stdout\n"
-"         -u  file  print user_data to stdio or file\n"
-"         -vn       verbose output (n: level)\n"
-"         -x  file  filename pattern of picture substitution sequence\n\n");
-printf("File patterns:  for sequential filenames, \"printf\" style, e.g. rec%%d\n"
-"                 or rec%%d%%c for fieldwise storage\n"
-"Levels:        0:none 1:sequence 2:picture 3:slice 4:macroblock 5:block\n\n"
-"Example:       mpeg2decode -b bitstream.mpg -f -r -o0 rec%%d\n"
-"         \n");
-    exit(0);
-  }
-
-
-  Output_Type = -1;
-  i = 1;
-
-  /* command-line options are proceeded by '-' */
-
-  while(i < argc)
-  {
-    /* check if this is the last argument */
-    LastArg = ((argc-i)==1);
-
-    /* parse ahead to see if another flag immediately follows current
-       argument (this is used to tell if a filename is missing) */
-    if(!LastArg)
-      NextArg = (argv[i+1][0]=='-');
-    else
-      NextArg = 0;
-
-    /* second character, [1], after '-' is the switch */
-    if(argv[i][0]=='-')
-    {
-      switch(toupper(argv[i][1]))
-      {
-        /* third character. [2], is the value */
-      case 'B':
-        Main_Bitstream_Flag = 1;
-
-        if(NextArg || LastArg)
-        {
-          printf("ERROR: -b must be followed the main bitstream filename\n");
-        }
-        else
-          Main_Bitstream_Filename = argv[++i]; 
-
-        break;
-
-
-      case 'C':
-
-#ifdef VERIFY
-        Verify_Flag = atoi(&argv[i][2]); 
-
-        if((Verify_Flag < NO_LAYER) || (Verify_Flag > ALL_LAYERS))
-        {
-          printf("ERROR: -c level (%d) out of range [%d,%d]\n",
-            Verify_Flag, NO_LAYER, ALL_LAYERS);
-          exit(ERROR);
-        }
-#else  /* VERIFY */
-        printf("This program not compiled for Verify_Flag option\n");
-#endif /* VERIFY */
-        break;
-
-      case 'E':
-        Two_Streams = 1; /* either Data Partitioning (DP) or SNR Scalability enhancment */
-                   
-        if(NextArg || LastArg)
-        {
-          printf("ERROR: -e must be followed by filename\n");
-          exit(ERROR);
-        }
-        else
-          Enhancement_Layer_Bitstream_Filename = argv[++i]; 
-
-        break;
-
-
-      case 'F':
-        Frame_Store_Flag = 1;
-        break;
-
-      case 'G':
-        Big_Picture_Flag = 1;
-        break;
-
-
-      case 'I':
-#ifdef VERIFY
-        Stats_Flag = atoi(&argv[i][2]); 
-#else /* VERIFY */
-        printf("WARNING: This program not compiled for -i option\n");
-#endif /* VERIFY */     
-        break;
-    
-      case 'L':  /* spatial scalability flag */
-        Spatial_Flag = 1;
-
-       if(NextArg || LastArg)
-       {
-         printf("ERROR: -l must be followed by filename\n");
-         exit(ERROR);
-       }
-       else
-         Lower_Layer_Picture_Filename = argv[++i]; 
-
-        break;
-
-      case 'O':
-  
-        Output_Type = atoi(&argv[i][2]); 
-  
-        if((Output_Type==4) || (Output_Type==5))
-          Output_Picture_Filename = "";  /* no need of filename */
-        else if(NextArg || LastArg)  
-        {
-          printf("ERROR: -o must be followed by filename\n");
-          exit(ERROR);
-        }
-        else
-        /* filename is separated by space, so it becomes the next argument */
-          Output_Picture_Filename = argv[++i]; 
-
-#ifdef DISPLAY
-        if (Output_Type==T_X11HIQ)
-        {
-          hiQdither = 1;
-          Output_Type=T_X11;
-        }
-#endif /* DISPLAY */
-        break;
-
-      case 'Q':
-        Quiet_Flag = 1;
-        break;
-
-      case 'R':
-        Reference_IDCT_Flag = 1;
-        break;
-    
-      case 'T':
-#ifdef TRACE
-        Trace_Flag = 1;
-#else /* TRACE */
-        printf("WARNING: This program not compiled for -t option\n");
-#endif /* TRACE */
-        break;
-
-      case 'U':
-        User_Data_Flag = 1;
-
-      case 'V':
-#ifdef VERBOSE
-        Verbose_Flag = atoi(&argv[i][2]); 
-#else /* VERBOSE */
-        printf("This program not compiled for -v option\n");
-#endif /* VERBOSE */
-        break;
-
-
-      case 'X':
-        Ersatz_Flag = 1;
-
-       if(NextArg || LastArg)
-       {
-         printf("ERROR: -x must be followed by filename\n"); 
-         exit(ERROR);
-       }
-       else
-        Substitute_Picture_Filename = argv[++i]; 
-
-        break;
-
-
-
-      default:
-        fprintf(stderr,"undefined option -%c ignored. Exiting program\n", 
-          argv[i][1]);
-
-        exit(ERROR);
-    
-      } /* switch() */
-    } /* if argv[i][0] == '-' */
-    
-    i++;
-
-    /* check for bitstream filename argument (there must always be one, at the very end
-     of the command line arguments */
-
-  } /* while() */
-
-
-  /* options sense checking */
-
-  if(Main_Bitstream_Flag!=1)
-  {
-    printf("There must be a main bitstream specified (-b filename)\n");
-  }
-
-  /* force display process to show frame pictures */
-  if((Output_Type==4 || Output_Type==5) && Frame_Store_Flag)
-    Display_Progressive_Flag = 1;
-  else
-    Display_Progressive_Flag = 0;
-
-#ifdef VERIFY
-  /* parse the bitstream, do not actually decode it completely */
-  
-
+  std::streampos mpeg_start = fp->tellg(); // the MPEG stream in our case does not start at 0
 #if 0
-  if(Output_Type==-1)
-  {
-    Decode_Layer = Verify_Flag;
-    printf("FYI: Decoding bitstream elements up to: %s\n", 
-      Layer_Table[Decode_Layer]);
-  }
-  else
-#endif
-    Decode_Layer = ALL_LAYERS;
-
-#endif /* VERIFY */
-
-  /* no output type specified */
-  if(Output_Type==-1)
-  {
-    Output_Type = 9; 
-    Output_Picture_Filename = "";
-  }
-
-
-#ifdef DISPLAY
-  if (Output_Type==T_X11)
-  {
-    if(Frame_Store_Flag)
-      Display_Progressive_Flag = 1;
-    else
-      Display_Progressive_Flag = 0;
-
-    Frame_Store_Flag = 1; /* to avoid calling dither() twice */
-  }
-#endif
-
-
-}
-
-static void Clear_Options()
-{
-  Verbose_Flag = 0;
-  Output_Type = 0;
-  Output_Picture_Filename = " ";
-  hiQdither  = 0;
-  Output_Type = 0;
-  Frame_Store_Flag = 0;
-  Spatial_Flag = 0;
-  Lower_Layer_Picture_Filename = " ";
-  Reference_IDCT_Flag = 0;
-  Trace_Flag = 0;
-  Quiet_Flag = 0;
-  Ersatz_Flag = 0;
-  Substitute_Picture_Filename  = " ";
-  Two_Streams = 0;
-  Enhancement_Layer_Bitstream_Filename = " ";
-  Big_Picture_Flag = 0;
-  Main_Bitstream_Flag = 0;
-  Main_Bitstream_Filename = " ";
-  Verify_Flag = 0;
-  Stats_Flag  = 0;
-  User_Data_Flag = 0; 
-}
-static void Print_Options()
-{
-  
-  printf("Verbose_Flag                         = %d\n", Verbose_Flag);
-  printf("Output_Type                          = %d\n", Output_Type);
-  printf("Output_Picture_Filename              = %s\n", Output_Picture_Filename);
-  printf("hiQdither                            = %d\n", hiQdither);
-  printf("Output_Type                          = %d\n", Output_Type);
-  printf("Frame_Store_Flag                     = %d\n", Frame_Store_Flag);
-  printf("Spatial_Flag                         = %d\n", Spatial_Flag);
-  printf("Lower_Layer_Picture_Filename         = %s\n", Lower_Layer_Picture_Filename);
-  printf("Reference_IDCT_Flag                  = %d\n", Reference_IDCT_Flag);
-  printf("Trace_Flag                           = %d\n", Trace_Flag);
-  printf("Quiet_Flag                           = %d\n", Quiet_Flag);
-  printf("Ersatz_Flag                          = %d\n", Ersatz_Flag);
-  printf("Substitute_Picture_Filename          = %s\n", Substitute_Picture_Filename);
-  printf("Two_Streams                          = %d\n", Two_Streams);
-  printf("Enhancement_Layer_Bitstream_Filename = %s\n", Enhancement_Layer_Bitstream_Filename);
-  printf("Big_Picture_Flag                     = %d\n", Big_Picture_Flag);
-  printf("Main_Bitstream_Flag                  = %d\n", Main_Bitstream_Flag);
-  printf("Main_Bitstream_Filename              = %s\n", Main_Bitstream_Filename);
-  printf("Verify_Flag                          = %d\n", Verify_Flag);
-  printf("Stats_Flag                           = %d\n", Stats_Flag);
-  printf("User_Data_Flag                       = %d\n", User_Data_Flag);
-
-}
-
-bool ReadMPEGFile (std::ifstream *fp, void *image_buffer, size_t length)
-{
-#if 1
   fp->read((char*)image_buffer, length);
   std::ofstream out("/tmp/etiam.mpeg");
   out.write((char*)image_buffer, length);
   out.close();
+#else
+  (void)length;
 #endif
 
   int ret, code;
@@ -657,19 +340,10 @@ bool ReadMPEGFile (std::ifstream *fp, void *image_buffer, size_t length)
   base.read_stream = my_read;
   base.close_stream = my_close;
 
-//  Clear_Options();
-//  int argc = 7;
-//  const char *argv[] = {"mpeg2decode", "-b", "/tmp/etiam.mpeg", "-f", "-r", "-o3", "/tmp/rec%d"};
-//
-//  /* decode command line arguments */
-//  Process_Options(argc,argv);
-//  Print_Options();
   Verbose_Flag                         = 0;
-  Output_Type                          = 3;
+  Output_Type                          = T_MEM; //store in mem
   Output_Picture_Filename              = "/tmp/rec%d";
   hiQdither                            = 0;
-  Output_Type                          = 3;
   Frame_Store_Flag                     = 1;
   Spatial_Flag                         = 0;
   Lower_Layer_Picture_Filename         = "";
@@ -683,9 +357,11 @@ bool ReadMPEGFile (std::ifstream *fp, void *image_buffer, size_t length)
   Big_Picture_Flag                     = 0;
   Main_Bitstream_Flag                  = 1;
   Main_Bitstream_Filename              = "/tmp/etiam.mpeg";
+  Main_Bitstream_Filename              = "/tmp/ts.mpg";
   Verify_Flag                          = 0;
   Stats_Flag                           = 0;
   User_Data_Flag                       = 0;
+  OUTMEM                               = (char*)image_buffer;
 
 
   ld = &base; /* select base layer context */
@@ -697,7 +373,8 @@ bool ReadMPEGFile (std::ifstream *fp, void *image_buffer, size_t length)
   base.Infile = &bos;
 #ifdef FILESTAR
   //base.Infile->InFd = fopen(Main_Bitstream_Filename, "rb");
-  base.Infile->InFd.open(Main_Bitstream_Filename, std::ios::binary | std::ios::in);
+  //base.Infile->InFd.open(Main_Bitstream_Filename, std::ios::binary | std::ios::in);
+  base.Infile->InFd = fp;
 #else
   base.Infile->InFd = open(Main_Bitstream_Filename,O_RDONLY|O_BINARY );
 #endif
@@ -737,14 +414,14 @@ bool ReadMPEGFile (std::ifstream *fp, void *image_buffer, size_t length)
     }
 
     /*lseek(base.Infile, 0l, SEEK_SET);*/
-    ld->seek_stream(base.Infile,0l,SEEK_SET);
+    ld->seek_stream(base.Infile,mpeg_start,SEEK_SET);
     Initialize_Buffer(); 
   }
 
   if(base.Infile!=0)
   {
     /*lseek(base.Infile, 0l, SEEK_SET);*/
-    ld->seek_stream(base.Infile,0l,SEEK_SET);
+    ld->seek_stream(base.Infile,mpeg_start,SEEK_SET);
   }
 
   Initialize_Buffer(); 
@@ -758,7 +435,8 @@ bool ReadMPEGFile (std::ifstream *fp, void *image_buffer, size_t length)
     enhan.Infile = &eos;
 #ifdef FILESTAR
     //enhan.Infile->InFd = fopen(Main_Bitstream_Filename, "rb");
-    enhan.Infile->InFd.open(Main_Bitstream_Filename, std::ios::binary|std::ios::in);
+    enhan.Infile->InFd->open(Main_Bitstream_Filename, std::ios::binary|std::ios::in);
+    abort();
 #else
     enhan.Infile->InFd = open(Enhancement_Layer_Bitstream_Filename,O_RDONLY|O_BINARY);
 #endif
@@ -787,6 +465,12 @@ bool ReadMPEGFile (std::ifstream *fp, void *image_buffer, size_t length)
 
   DeInitialize_Decoder();
 
+#if 0
+  std::ofstream out2("/tmp/etiam.raw");
+  out2.write((char*)image_buffer, 352*240*3*10);
+  out2.close();
+#endif
+
   return ret;
 }