Program: gdcm
Module: $RCSfile: gdcmMpeg.cxx,v $
Language: C++
- Date: $Date: 2005/05/21 18:43:52 $
- Version: $Revision: 1.1 $
+ 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
#include "gdcmDebug.h"
#include <fstream>
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <fcntl.h>
+
+
+typedef struct
+{
+ std::ifstream *InFd;
+} istream;
extern "C" {
#define GLOBAL
#include "config.h"
#include "global.h"
+}
-/* private prototypes */
-static int video_sequence _ANSI_ARGS_((int *framenum));
-static int Decode_Bitstream _ANSI_ARGS_((void));
-static int Headers _ANSI_ARGS_((void));
-static void Initialize_Sequence _ANSI_ARGS_((void));
-static void Initialize_Decoder _ANSI_ARGS_((void));
-static void Deinitialize_Sequence _ANSI_ARGS_((void));
-//static void Process_Options _ANSI_ARGS_((int argc, char *argv[]));
-/* IMPLEMENTAION specific rouintes */
-static void Initialize_Decoder()
+off_t my_seek(istream *infile, off_t offset, int whence)
+{
+ //return fseek(infile->InFd,offset, whence);
+ switch(whence)
+ {
+ case SEEK_SET:
+ infile->InFd->seekg(offset, std::ios::beg);
+ break;
+ case SEEK_END:
+ infile->InFd->seekg(offset, std::ios::end);
+ break;
+ case SEEK_CUR:
+ infile->InFd->seekg(offset, std::ios::cur);
+ break;
+ }
+ 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();
+}
+
+int my_close(istream *infile)
+{
+ //return fclose(infile->InFd);
+ infile->InFd->close();
+ return 0;
+}
+
+namespace gdcm
+{
+/**
+ * \brief routine for MPEG decompression
+ * @param fp pointer to an already open file descriptor
+ * 8 significant bits per pixel
+ * @param image_buffer to receive uncompressed pixels
+ * @param length length
+ * @return 1 on success, 0 on error
+ */
+static int Headers();
+static void DeInitialize_Decoder()
+{
+ free(Clip-384); /* I love magic number */
+}
+static void Deinitialize_Sequence()
{
int i;
- /* Clip table */
- if (!(Clip=(unsigned char *)malloc(1024)))
- Error("Clip[] malloc failed\n");
+ /* First cleanup the static buffer in store.c */
+ FreeStaticBuffer();
- Clip += 384;
+ /* clear flags */
+ base.MPEG2_Flag=0;
- for (i=-384; i<640; i++)
- Clip[i] = (i<0) ? 0 : ((i>255) ? 255 : i);
+ for(i=0;i<3;i++)
+ {
+ free(backward_reference_frame[i]);
+ free(forward_reference_frame[i]);
+ free(auxframe[i]);
- /* IDCT */
- if (Reference_IDCT_Flag)
- Initialize_Reference_IDCT();
- else
- Initialize_Fast_IDCT();
+ if (base.scalable_mode==SC_SPAT)
+ {
+ free(llframe0[i]);
+ free(llframe1[i]);
+ }
+ }
+ if (base.scalable_mode==SC_SPAT)
+ free(lltmp);
+
+#ifdef DISPLAY
+ if (Output_Type==T_X11)
+ Terminate_Display_Process();
+#endif
}
-/* mostly IMPLEMENTAION specific rouintes */
+/* mostly IMPLEMENTAION specific routines */
static void Initialize_Sequence()
{
int cc, size;
#endif /* DISPLAY */
}
-
-extern void Error(char *text)
+static int video_sequence(int *Bitstream_Framenumber)
+//int *Bitstream_Framenumber;
{
- fprintf(stderr,text);
- exit(1);
-}
+ int Bitstream_Framenum;
+ int Sequence_Framenum;
+ int Return_Value;
-/* Trace_Flag output */
-void Print_Bits(int code, int bits, int len)
-{
- int i;
- for (i=0; i<len; i++)
- printf("%d",(code>>(bits-1-i))&1);
+ Bitstream_Framenum = *Bitstream_Framenumber;
+ Sequence_Framenum=0;
+
+ Initialize_Sequence();
+
+ /* decode picture whose header has already been parsed in
+ Decode_Bitstream() */
+
+
+ Decode_Picture(Bitstream_Framenum, Sequence_Framenum);
+
+ /* update picture numbers */
+ if (!Second_Field)
+ {
+ Bitstream_Framenum++;
+ Sequence_Framenum++;
+ }
+
+ /* loop through the rest of the pictures in the sequence */
+ while ((Return_Value=Headers()))
+ {
+ Decode_Picture(Bitstream_Framenum, Sequence_Framenum);
+
+ if (!Second_Field)
+ {
+ Bitstream_Framenum++;
+ Sequence_Framenum++;
+ }
+ }
+
+ /* put last frame */
+ if (Sequence_Framenum!=0)
+ {
+ Output_Last_Frame_of_Sequence(Bitstream_Framenum);
+ }
+
+ Deinitialize_Sequence();
+
+#ifdef VERIFY
+ Clear_Verify_Headers();
+#endif /* VERIFY */
+
+ *Bitstream_Framenumber = Bitstream_Framenum;
+ return(Return_Value);
}
static int Headers()
return ret;
}
-
-
-
static int Decode_Bitstream()
{
int ret;
}
-static void Deinitialize_Sequence()
+/* IMPLEMENTATION specific routines */
+static void Initialize_Decoder()
{
int i;
- /* clear flags */
- base.MPEG2_Flag=0;
+ /* Clip table */
+ if (!(Clip=(unsigned char *)malloc(1024)))
+ Error("Clip[] malloc failed\n");
- for(i=0;i<3;i++)
- {
- free(backward_reference_frame[i]);
- free(forward_reference_frame[i]);
- free(auxframe[i]);
+ Clip += 384;
- if (base.scalable_mode==SC_SPAT)
- {
- free(llframe0[i]);
- free(llframe1[i]);
- }
- }
+ for (i=-384; i<640; i++)
+ Clip[i] = (i<0) ? 0 : ((i>255) ? 255 : i);
- if (base.scalable_mode==SC_SPAT)
- free(lltmp);
+ /* IDCT */
+ if (Reference_IDCT_Flag)
+ Initialize_Reference_IDCT();
+ else
+ Initialize_Fast_IDCT();
-#ifdef DISPLAY
- if (Output_Type==T_X11)
- Terminate_Display_Process();
-#endif
}
-
-static int video_sequence(int *Bitstream_Framenumber)
+bool ReadMPEGFile (std::ifstream *fp, char *image_buffer, size_t length)
{
- int Bitstream_Framenum;
- int Sequence_Framenum;
- int Return_Value;
-
- Bitstream_Framenum = *Bitstream_Framenumber;
- Sequence_Framenum=0;
-
- Initialize_Sequence();
-
- /* decode picture whose header has already been parsed in
- Decode_Bitstream() */
-
-
- Decode_Picture(Bitstream_Framenum, Sequence_Framenum);
-
- /* update picture numbers */
- if (!Second_Field)
- {
- Bitstream_Framenum++;
- Sequence_Framenum++;
- }
-
- /* loop through the rest of the pictures in the sequence */
- while ((Return_Value=Headers()))
- {
- Decode_Picture(Bitstream_Framenum, Sequence_Framenum);
-
- if (!Second_Field)
- {
- Bitstream_Framenum++;
- Sequence_Framenum++;
- }
- }
-
- /* put last frame */
- if (Sequence_Framenum!=0)
- {
- Output_Last_Frame_of_Sequence(Bitstream_Framenum);
- }
-
- Deinitialize_Sequence();
-
-#ifdef VERIFY
- Clear_Verify_Headers();
-#endif /* VERIFY */
-
- *Bitstream_Framenumber = Bitstream_Framenum;
- return(Return_Value);
-}
-} // End "C" extern
+ std::streampos mpeg_start = fp->tellg(); // the MPEG stream in our case does not start at 0
+#if 0
+ fp->read((char*)image_buffer, length);
+ std::ofstream out("/tmp/etiam.mpeg");
+ out.write((char*)image_buffer, length);
+ out.close();
+#else
+ (void)length;
+#endif
-namespace gdcm
-{
-/**
- * \brief routine for MPEG decompression
- * @param fp pointer to an already open file descriptor
- * 8 significant bits per pixel
- * @param image_buffer to receive uncompressed pixels
- * @param statesuspension Suspension State basically it should be 3 otherwise more complex to handle
- * @return 1 on success, 0 on error
- */
-bool ReadMPEGFile (std::ifstream *fp, void *image_buffer)
-{
int ret, code;
+ istream bos,eos;
+ /*base.open_stream = my_open;*/
+ base.seek_stream = my_seek;
+ base.read_stream = my_read;
+ base.close_stream = my_close;
+
+ Verbose_Flag = 0;
+ Output_Type = T_MEM; //store in mem
+ Output_Picture_Filename = "/tmp/rec%d";
+ hiQdither = 0;
+ Frame_Store_Flag = 1;
+ Spatial_Flag = 0;
+ Lower_Layer_Picture_Filename = "";
+ Reference_IDCT_Flag = 1;
+ 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 = 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;
-// Clear_Options();
-
- /* decode command line arguments */
-// Process_Options(argc,argv);
-
-#ifdef DEBUG
- Print_Options();
-#endif
ld = &base; /* select base layer context */
/* open MPEG base layer bitstream file(s) */
/* NOTE: this is either a base layer stream or a spatial enhancement stream */
-#if 0
- if ((base.Infile=open(Main_Bitstream_Filename,O_RDONLY|O_BINARY))<0)
+/* if ((base.Infile=open(Main_Bitstream_Filename,O_RDONLY|O_BINARY))<0) */
+ /*base.Infile = ld->open_stream(Main_Bitstream_Filename);*/
+ 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 = fp;
+#else
+ base.Infile->InFd = open(Main_Bitstream_Filename,O_RDONLY|O_BINARY );
+#endif
+ if( !base.Infile->InFd)
{
fprintf(stderr,"Base layer input file %s not found\n", Main_Bitstream_Filename);
exit(1);
}
-#else
- base.Infile = -1; //DEBUG
-#endif
if(base.Infile != 0)
{
- Initialize_Buffer();
-
+ Initialize_Buffer();
+
if(Show_Bits(8)==0x47)
{
sprintf(Error_Text,"Decoder currently does not parse transport streams\n");
break;
}
- //lseek(base.Infile, 0l, SEEK_SET);
- //fp->seekg(mpeg_start, ios_base::beg);
+ /*lseek(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);
- //fp->seekg(mpeg_start, ios_base::beg);
+ /*lseek(base.Infile, 0l, SEEK_SET);*/
+ ld->seek_stream(base.Infile,mpeg_start,SEEK_SET);
}
Initialize_Buffer();
if(Two_Streams)
{
- abort();
ld = &enhan; /* select enhancement layer context */
- if ((enhan.Infile = open(Enhancement_Layer_Bitstream_Filename,O_RDONLY|O_BINARY))<0)
+ /*if ((enhan.Infile = open(Enhancement_Layer_Bitstream_Filename,O_RDONLY|O_BINARY))<0)*/
+ /*enhan.Infile = ld->open_stream(Enhancement_Layer_Bitstream_Filename);*/
+ 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);
+ abort();
+#else
+ enhan.Infile->InFd = open(Enhancement_Layer_Bitstream_Filename,O_RDONLY|O_BINARY);
+#endif
+ if (enhan.Infile->InFd)
{
sprintf(Error_Text,"enhancment layer bitstream file %s not found\n",
Enhancement_Layer_Bitstream_Filename);
ret = Decode_Bitstream();
- //close(base.Infile);
+ /*close(base.Infile);*/
+ ld->close_stream(base.Infile);
if (Two_Streams)
- {
- abort();
- close(enhan.Infile);
- }
+ /*close(enhan.Infile);*/
+ ld->close_stream(enhan.Infile);
+
+ DeInitialize_Decoder();
+
+#if 0
+ std::ofstream out2("/tmp/etiam.raw");
+ out2.write((char*)image_buffer, 352*240*3*10);
+ out2.close();
+#endif
return ret;
}