00001 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 #ifndef MXFLIB__ESP_DVDIF_H
00031 #define MXFLIB__ESP_DVDIF_H
00032 
00033 
00034 #include <math.h>   
00035 
00036 #define DV_DIF_BUFFERSIZE  (256 * 1024)
00037 
00038 namespace mxflib
00039 {
00041     class DV_DIF_EssenceSubParser : public EssenceSubParserBase
00042     {
00043     protected:
00044         Rational NativeEditRate;                            
00045         Rational SelectedEditRate;                          
00046         unsigned int EditRatio;                             
00047 
00048         Position PictureNumber;                             
00049         Position CurrentPos;                                
00050 
00051         Position DIFStart;                                  
00052         Position DIFEnd;                                    
00053 
00054         int SeqCount;                                       
00055 
00056         bool isS314M;                                       
00057 
00058         UInt32 AVIFrameCount;                               
00059         int StreamNumber;                                   
00060 
00061         UInt32 AVIStreamID;                                 
00062         UInt32 AVIListRemaining;                            
00063         UInt32 AVIChunkRemaining;                           
00064 
00065         size_t CachedDataSize;                              
00066         UInt64 CachedCount;                                 
00067 
00068         
00069         UInt8 *Buffer;                                      
00070 
00071         int BuffCount;                                      
00072         UInt8 *BuffPtr;                                     
00073 
00074         MDObjectParent CurrentDescriptor;                   
00075 
00077         
00078         
00079 
00080     public:
00082         class ESP_EssenceSource : public EssenceSubParserBase::ESP_EssenceSource
00083         {
00084         public:
00086             ESP_EssenceSource(EssenceSubParserPtr TheCaller, FileHandle InFile, UInt32 UseStream, UInt64 Count = 1)
00087                 : EssenceSubParserBase::ESP_EssenceSource(TheCaller, InFile, UseStream, Count) 
00088             {
00089                 DV_DIF_EssenceSubParser *pCaller = SmartPtr_Cast(Caller, DV_DIF_EssenceSubParser);
00090 
00091                 if(pCaller->SelectedWrapping->ThisWrapType == WrappingOption::Clip) RequestedCount = 0;
00092             };
00093 
00095 
00097             virtual size_t GetEssenceDataSize(void) 
00098             {
00099                 DV_DIF_EssenceSubParser *pCaller = SmartPtr_Cast(Caller, DV_DIF_EssenceSubParser);
00100                 return pCaller->ReadInternal(File, Stream, RequestedCount);
00101             };
00102 
00104 
00109             virtual DataChunkPtr GetEssenceData(size_t Size = 0, size_t MaxSize = 0)
00110             {
00111 
00112 
00113 
00114 
00115 
00116 
00117 
00118 
00119 
00120 
00121                 return BaseGetEssenceData(Size, MaxSize);
00122             }
00123 
00125             virtual int GetBERSize(void) 
00126             { 
00127                 DV_DIF_EssenceSubParser *pCaller = SmartPtr_Cast(Caller, DV_DIF_EssenceSubParser);
00128 
00129                 if(pCaller->SelectedWrapping->ThisWrapType == WrappingOption::Clip) return 8;
00130                 return 4;
00131             }
00132         };
00133 
00134         
00135         friend class DV_DIF_EssenceSubParser::ESP_EssenceSource;
00136 
00137     public:
00138         DV_DIF_EssenceSubParser()
00139         {
00140             DIFStart = 0;
00141             DIFEnd = 0;
00142             SeqCount = 10;
00143             AVIFrameCount = 0;
00144             StreamNumber = 0;
00145             Buffer = NULL;
00146 
00147             CachedDataSize = static_cast<size_t>(-1);
00148             CachedCount = 0;
00149         }
00150 
00151         ~DV_DIF_EssenceSubParser()
00152         {
00153             
00154             if(Buffer) delete[] Buffer;
00155         }
00156 
00158         virtual EssenceSubParserPtr NewParser(void) const;
00159 
00161         virtual StringList HandledExtensions(void)
00162         {
00163             StringList ExtensionList;
00164 
00165             ExtensionList.push_back("AVI");
00166             ExtensionList.push_back("DV");
00167             ExtensionList.push_back("DIF");
00168 
00169             return ExtensionList;
00170         }
00171 
00173         virtual EssenceStreamDescriptorList IdentifyEssence(FileHandle InFile);
00174 
00176         virtual WrappingOptionList IdentifyWrappingOptions(FileHandle InFile, EssenceStreamDescriptor &Descriptor);
00177 
00179         virtual void Use(UInt32 Stream, WrappingOptionPtr &UseWrapping);
00180 
00182         virtual bool SetEditRate(Rational EditRate);
00183 
00185         virtual Rational GetEditRate(void) { return SelectedEditRate; }
00186 
00188         virtual UInt32 GetBytesPerEditUnit(UInt32 KAGSize = 1)
00189         {
00190             
00191             UInt32 Ret = (150 * 80 * SeqCount);
00192 
00193             if(SelectedWrapping->ThisWrapType == WrappingOption::Frame) 
00194             {
00195                 
00196                 Ret += 16 + 4;
00197 
00198                 
00199                 if(KAGSize > 1)
00200                 {
00201                     
00202                     UInt32 Remainder = Ret % KAGSize;
00203                     if(Remainder) Remainder = KAGSize - Remainder;
00204 
00205                     
00206                     Ret += Remainder;
00207 
00208                     
00209                     if((Remainder > 0) && (Remainder < 17)) Ret++;
00210                 }
00211             }
00212 
00213             return Ret;
00214         }
00215 
00217         virtual Position GetCurrentPosition(void);
00218 
00220         virtual DataChunkPtr Read(FileHandle InFile, UInt32 Stream, UInt64 Count = 1);
00221 
00223         virtual EssenceSourcePtr GetEssenceSource(FileHandle InFile, UInt32 Stream, UInt64 Count = 1)
00224         {
00225             return new ESP_EssenceSource(this, InFile, Stream, Count);
00226         };
00227 
00229         virtual Length Write(FileHandle InFile, UInt32 Stream, MXFFilePtr OutFile, UInt64 Count = 1);
00230 
00232 
00233         virtual bool SetOption(std::string Option, Int64 Param = 0);
00234 
00236 
00240         virtual std::string GetParserName(void) const { return "dvdif"; }
00241 
00242     protected:
00244         MDObjectPtr BuildCDCIEssenceDescriptor(FileHandle InFile, UInt64 Start = 0);
00245 
00247         MDObjectPtr BuildSoundEssenceDescriptor(FileHandle InFile, UInt64 Start = 0);
00248 
00250         MDObjectPtr BuildCDCIEssenceDescriptorFromAVI(FileHandle InFile, UInt64 Start);
00251 
00253         MDObjectPtr BuildSoundEssenceDescriptorFromAVI(FileHandle InFile, UInt64 Start);
00254 
00256         size_t ReadInternal(FileHandle InFile, UInt32 Stream, UInt64 Count);
00257 
00259 
00260         DataChunkPtr AVIRead(FileHandle InFile, size_t Bytes);
00261     };
00262 
00263 
00265     class DV_DIF_EssenceSubParserFactory : public EssenceSubParserFactory
00266     {
00267     public:
00269         virtual EssenceSubParserPtr NewParser(void) const { return new DV_DIF_EssenceSubParser; }
00270     };
00271 
00272 }
00273 
00274 #endif // MXFLIB__ESP_DVDIF_H