X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmMpeg.cxx;h=854d241c0e4fb358cc40fce38d2728e99d7b5b79;hb=e9a711266d34e33b482edbe241b2e40db7d9915a;hp=a707e01d10a6dac62b7f2c55f09dbaf8673985bc;hpb=ecad45b05fa564b6147c6475c5fa7f3b2838c707;p=gdcm.git diff --git a/src/gdcmMpeg.cxx b/src/gdcmMpeg.cxx index a707e01d..854d241c 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/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; }