X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmMpeg.cxx;h=4eee68ae03ebe35467be2456f9056eadcd4b36ba;hb=5b4a76f5a670626f5ae20714d265b3a50ffa2218;hp=52183719b5ea5dc31fa3d86186d5c74bc5b7a75e;hpb=9b08ef2e93023e33dad3326a0c7d6b5db7b72cd4;p=gdcm.git diff --git a/src/gdcmMpeg.cxx b/src/gdcmMpeg.cxx index 52183719..4eee68ae 100644 --- a/src/gdcmMpeg.cxx +++ b/src/gdcmMpeg.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmMpeg.cxx,v $ Language: C++ - Date: $Date: 2005/05/21 18:43:52 $ - Version: $Revision: 1.1 $ + Date: $Date: 2005/10/27 20:08:29 $ + Version: $Revision: 1.8 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -18,47 +18,98 @@ #include "gdcmDebug.h" #include -#include -#include -#include -#include + + +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; @@ -145,19 +196,57 @@ static void Initialize_Sequence() #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>(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() @@ -183,9 +272,6 @@ static int Headers() return ret; } - - - static int Decode_Bitstream() { int ret; @@ -213,131 +299,94 @@ static int Decode_Bitstream() } -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(); +#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"); @@ -362,25 +411,34 @@ bool ReadMPEGFile (std::ifstream *fp, void *image_buffer) 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); @@ -396,13 +454,20 @@ bool ReadMPEGFile (std::ifstream *fp, void *image_buffer) 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; }