00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef _AP4_MARLIN_H_
00030 #define _AP4_MARLIN_H_
00031
00032
00033
00034
00035 #include "Ap4Types.h"
00036 #include "Ap4SampleEntry.h"
00037 #include "Ap4Atom.h"
00038 #include "Ap4AtomFactory.h"
00039 #include "Ap4SampleDescription.h"
00040 #include "Ap4Processor.h"
00041 #include "Ap4Protection.h"
00042 #include "Ap4TrefTypeAtom.h"
00043 #include "Ap4ObjectDescriptor.h"
00044 #include "Ap4Command.h"
00045
00046
00047
00048
00049
00050
00051
00052
00053 const AP4_UI32 AP4_MARLIN_BRAND_MGSV = AP4_ATOM_TYPE('M','G','S','V');
00054 const AP4_UI16 AP4_MARLIN_IPMPS_TYPE_MGSV = 0xA551;
00055 const AP4_UI32 AP4_MARLIN_SCHEME_TYPE_ACBC = AP4_ATOM_TYPE('A','C','B','C');
00056
00057
00058
00059
00060 class AP4_MarlinDecryptingProcessor : public AP4_Processor
00061 {
00062 public:
00063
00064 AP4_MarlinDecryptingProcessor(const AP4_ProtectionKeyMap* key_map = NULL,
00065 AP4_BlockCipherFactory* block_cipher_factory = NULL);
00066 ~AP4_MarlinDecryptingProcessor();
00067
00068
00069 AP4_ProtectionKeyMap& GetKeyMap() { return m_KeyMap; }
00070
00071
00072 virtual AP4_Result Initialize(AP4_AtomParent& top_level,
00073 AP4_ByteStream& stream,
00074 ProgressListener* listener);
00075 virtual AP4_Processor::TrackHandler* CreateTrackHandler(AP4_TrakAtom* trak);
00076
00077 private:
00078
00079 struct SinfEntry {
00080 SinfEntry(AP4_UI32 track_id, AP4_ContainerAtom* sinf) :
00081 m_TrackId(track_id), m_Sinf(sinf) {}
00082 ~SinfEntry() { delete m_Sinf; }
00083 AP4_UI32 m_TrackId;
00084 AP4_ContainerAtom* m_Sinf;
00085 };
00086
00087
00088 AP4_BlockCipherFactory* m_BlockCipherFactory;
00089 AP4_ProtectionKeyMap m_KeyMap;
00090 AP4_List<SinfEntry> m_SinfEntries;
00091 };
00092
00093
00094
00095
00096 class AP4_MarlinTrackDecrypter : public AP4_Processor::TrackHandler
00097 {
00098 public:
00099
00100 static AP4_Result Create(AP4_BlockCipherFactory& cipher_factory,
00101 const AP4_UI08* key,
00102 AP4_MarlinTrackDecrypter*& decrypter);
00103
00104
00105 ~AP4_MarlinTrackDecrypter();
00106
00107
00108 virtual AP4_Size GetProcessedSampleSize(AP4_Sample& sample);
00109 virtual AP4_Result ProcessSample(AP4_DataBuffer& data_in,
00110 AP4_DataBuffer& data_out);
00111
00112
00113 private:
00114
00115 AP4_MarlinTrackDecrypter(AP4_StreamCipher* cipher) : m_Cipher(cipher) {}
00116
00117
00118 AP4_StreamCipher* m_Cipher;
00119 };
00120
00121 #endif // _AP4_MARLIN_H_