From b2027d354ef5d52efd525730fa5e6beccb88d33f Mon Sep 17 00:00:00 2001 From: Glenn Guy Date: Thu, 22 Jul 2021 10:00:44 +0200 Subject: [PATCH] Add additional methods/funtions and passing poolid Added back: * SSD - > ParentIsOwner functionality * LinearReader: GetSample, SeekSample, Reset * Ap4Movie -> GetPsshAtoms * Uuid/VppC -> GetData * Ap4Protection -> WVTT atom type Signed-off-by: Bernd Kuhls --- Source/C++/Core/Ap4ByteStream.h | 1 - Source/C++/Core/Ap4CommonEncryption.cpp | 15 ++-- Source/C++/Core/Ap4CommonEncryption.h | 24 +++++-- Source/C++/Core/Ap4IsmaCryp.cpp | 5 +- Source/C++/Core/Ap4IsmaCryp.h | 3 +- Source/C++/Core/Ap4LinearReader.cpp | 94 ++++++++++++++++++++++++- Source/C++/Core/Ap4LinearReader.h | 4 ++ Source/C++/Core/Ap4Marlin.cpp | 5 +- Source/C++/Core/Ap4Marlin.h | 3 +- Source/C++/Core/Ap4MoovAtom.cpp | 28 +++++++- Source/C++/Core/Ap4MoovAtom.h | 5 ++ Source/C++/Core/Ap4Movie.cpp | 10 +++ Source/C++/Core/Ap4Movie.h | 4 ++ Source/C++/Core/Ap4OmaDcf.cpp | 8 ++- Source/C++/Core/Ap4OmaDcf.h | 6 +- Source/C++/Core/Ap4Protection.h | 3 +- Source/C++/Core/Ap4SampleDescription.h | 1 + Source/C++/Core/Ap4UuidAtom.h | 1 + Source/C++/Core/Ap4VpccAtom.h | 3 + 19 files changed, 197 insertions(+), 26 deletions(-) diff --git a/Source/C++/Core/Ap4ByteStream.h b/Source/C++/Core/Ap4ByteStream.h index 0a59e63..93ac80f 100644 --- a/Source/C++/Core/Ap4ByteStream.h +++ b/Source/C++/Core/Ap4ByteStream.h @@ -195,7 +195,6 @@ public: AP4_UI08* UseData() { return m_Buffer->UseData(); } AP4_Size GetDataSize() { return m_Buffer->GetDataSize(); } -protected: virtual ~AP4_MemoryByteStream(); private: diff --git a/Source/C++/Core/Ap4CommonEncryption.cpp b/Source/C++/Core/Ap4CommonEncryption.cpp index acd6361..5308200 100644 --- a/Source/C++/Core/Ap4CommonEncryption.cpp +++ b/Source/C++/Core/Ap4CommonEncryption.cpp @@ -1859,7 +1859,8 @@ AP4_CencSingleSampleDecrypter::~AP4_CencSingleSampleDecrypter() { | AP4_CencSingleSampleDecrypter::DecryptSampleData +---------------------------------------------------------------------*/ AP4_Result -AP4_CencSingleSampleDecrypter::DecryptSampleData(AP4_DataBuffer& data_in, +AP4_CencSingleSampleDecrypter::DecryptSampleData(AP4_UI32 poolid, + AP4_DataBuffer& data_in, AP4_DataBuffer& data_out, const AP4_UI08* iv, unsigned int subsample_count, @@ -2094,8 +2095,9 @@ AP4_CencSampleDecrypter::Create(AP4_CencSampleInfoTable* sample_info_table, +---------------------------------------------------------------------*/ AP4_CencSampleDecrypter::~AP4_CencSampleDecrypter() { - delete m_SampleInfoTable; - delete m_SingleSampleDecrypter; + delete m_SampleInfoTable; + if (m_SingleSampleDecrypter->GetParentIsOwner()) + delete m_SingleSampleDecrypter; } /*---------------------------------------------------------------------- @@ -2112,7 +2114,8 @@ AP4_CencSampleDecrypter::SetSampleIndex(AP4_Ordinal sample_index) | AP4_CencSampleDecrypter::DecryptSampleData +---------------------------------------------------------------------*/ AP4_Result -AP4_CencSampleDecrypter::DecryptSampleData(AP4_DataBuffer& data_in, +AP4_CencSampleDecrypter::DecryptSampleData(AP4_UI32 poolid, + AP4_DataBuffer& data_in, AP4_DataBuffer& data_out, const AP4_UI08* iv) { @@ -2139,7 +2142,7 @@ AP4_CencSampleDecrypter::DecryptSampleData(AP4_DataBuffer& data_in, } // decrypt the sample - return m_SingleSampleDecrypter->DecryptSampleData(data_in, data_out, iv_block, subsample_count, bytes_of_cleartext_data, bytes_of_encrypted_data); + return m_SingleSampleDecrypter->DecryptSampleData(poolid, data_in, data_out, iv_block, subsample_count, bytes_of_cleartext_data, bytes_of_encrypted_data); } /*---------------------------------------------------------------------- @@ -2323,7 +2326,7 @@ AP4_CencFragmentDecrypter::ProcessSample(AP4_DataBuffer& data_in, AP4_DataBuffer& data_out) { // decrypt the sample - return m_SampleDecrypter->DecryptSampleData(data_in, data_out, NULL); + return m_SampleDecrypter->DecryptSampleData(0, data_in, data_out, NULL); } /*---------------------------------------------------------------------- diff --git a/Source/C++/Core/Ap4CommonEncryption.h b/Source/C++/Core/Ap4CommonEncryption.h index 80db456..580de66 100644 --- a/Source/C++/Core/Ap4CommonEncryption.h +++ b/Source/C++/Core/Ap4CommonEncryption.h @@ -691,9 +691,18 @@ public: // methods AP4_CencSingleSampleDecrypter(AP4_StreamCipher* cipher) : m_Cipher(cipher), - m_FullBlocksOnly(false) {} + m_FullBlocksOnly(false), + m_ParentIsOwner(true) {} virtual ~AP4_CencSingleSampleDecrypter(); - virtual AP4_Result DecryptSampleData(AP4_DataBuffer& data_in, + virtual AP4_Result SetFragmentInfo(AP4_UI32 poolid, const AP4_UI08* keyid, const AP4_UI08 nalu_length_size, + AP4_DataBuffer &annexb_sps_pps, AP4_UI32 flags) { + return AP4_ERROR_NOT_SUPPORTED; + }; + virtual AP4_UI32 AddPool() { return 0; }; + virtual void RemovePool(AP4_UI32 poolid) {}; + virtual const char* GetSessionId() { return nullptr; }; + virtual AP4_Result DecryptSampleData(AP4_UI32 poolid, + AP4_DataBuffer& data_in, AP4_DataBuffer& data_out, // always 16 bytes @@ -706,7 +715,9 @@ public: const AP4_UI16* bytes_of_cleartext_data, // array of integers. NULL if subsample_count is 0 - const AP4_UI32* bytes_of_encrypted_data); + const AP4_UI32* bytes_of_encrypted_data); + bool GetParentIsOwner()const { return m_ParentIsOwner; }; + void SetParentIsOwner(bool parent_is_owner) { m_ParentIsOwner = parent_is_owner; }; private: // constructor @@ -715,12 +726,14 @@ private: bool reset_iv_at_each_subsample) : m_Cipher(cipher), m_FullBlocksOnly(full_blocks_only), - m_ResetIvAtEachSubsample(reset_iv_at_each_subsample) {} + m_ResetIvAtEachSubsample(reset_iv_at_each_subsample), + m_ParentIsOwner(true) {} // members AP4_StreamCipher* m_Cipher; bool m_FullBlocksOnly; bool m_ResetIvAtEachSubsample; + bool m_ParentIsOwner; }; /*---------------------------------------------------------------------- @@ -766,7 +779,8 @@ public: m_SampleCursor(0) {} virtual ~AP4_CencSampleDecrypter(); virtual AP4_Result SetSampleIndex(AP4_Ordinal sample_index); - virtual AP4_Result DecryptSampleData(AP4_DataBuffer& data_in, + virtual AP4_Result DecryptSampleData(AP4_UI32 poolid, + AP4_DataBuffer& data_in, AP4_DataBuffer& data_out, const AP4_UI08* iv); diff --git a/Source/C++/Core/Ap4IsmaCryp.cpp b/Source/C++/Core/Ap4IsmaCryp.cpp index dfb59a4..442ad49 100644 --- a/Source/C++/Core/Ap4IsmaCryp.cpp +++ b/Source/C++/Core/Ap4IsmaCryp.cpp @@ -142,7 +142,8 @@ AP4_IsmaCipher::GetDecryptedSampleSize(AP4_Sample& sample) | AP4_IsmaCipher::DecryptSampleData +---------------------------------------------------------------------*/ AP4_Result -AP4_IsmaCipher::DecryptSampleData(AP4_DataBuffer& data_in, +AP4_IsmaCipher::DecryptSampleData(AP4_UI32 poolid, + AP4_DataBuffer& data_in, AP4_DataBuffer& data_out, const AP4_UI08* /*iv*/) { @@ -333,7 +334,7 @@ AP4_Result AP4_IsmaTrackDecrypter::ProcessSample(AP4_DataBuffer& data_in, AP4_DataBuffer& data_out) { - return m_Cipher->DecryptSampleData(data_in, data_out); + return m_Cipher->DecryptSampleData(0, data_in, data_out); } /*---------------------------------------------------------------------- diff --git a/Source/C++/Core/Ap4IsmaCryp.h b/Source/C++/Core/Ap4IsmaCryp.h index 4b9c60e..970dac8 100644 --- a/Source/C++/Core/Ap4IsmaCryp.h +++ b/Source/C++/Core/Ap4IsmaCryp.h @@ -74,7 +74,8 @@ public: AP4_Result EncryptSampleData(AP4_DataBuffer& data_in, AP4_DataBuffer& data_out, AP4_UI32 block_counter); - AP4_Result DecryptSampleData(AP4_DataBuffer& data_in, + AP4_Result DecryptSampleData(AP4_UI32 poolid, + AP4_DataBuffer& data_in, AP4_DataBuffer& data_out, const AP4_UI08* iv = NULL); AP4_Size GetDecryptedSampleSize(AP4_Sample& sample); diff --git a/Source/C++/Core/Ap4LinearReader.cpp b/Source/C++/Core/Ap4LinearReader.cpp index 08b55ee..7cc3ebd 100644 --- a/Source/C++/Core/Ap4LinearReader.cpp +++ b/Source/C++/Core/Ap4LinearReader.cpp @@ -117,6 +117,29 @@ AP4_LinearReader::FlushQueues() } } +/*---------------------------------------------------------------------- +| AP4_LinearReader::Reset ++---------------------------------------------------------------------*/ +void +AP4_LinearReader::Reset() +{ + // flush any queued samples + FlushQueues(); + + // reset tracker states + for (unsigned int i = 0; i < m_Trackers.ItemCount(); i++) { + if (m_Trackers[i]->m_SampleTableIsOwned) { + delete m_Trackers[i]->m_SampleTable; + } + delete m_Trackers[i]->m_NextSample; + m_Trackers[i]->m_SampleTable = NULL; + m_Trackers[i]->m_NextSample = NULL; + m_Trackers[i]->m_NextSampleIndex = 0; + m_Trackers[i]->m_Eos = false; + } + m_NextFragmentPosition = 0; +} + /*---------------------------------------------------------------------- | AP4_LinearReader::SetSampleIndex +---------------------------------------------------------------------*/ @@ -591,6 +614,75 @@ AP4_LinearReader::ReadNextSample(AP4_Sample& sample, return ReadNextSample(sample, &sample_data, track_id); } +/*---------------------------------------------------------------------- +| AP4_LinearReader::GetSample ++---------------------------------------------------------------------*/ +AP4_Result AP4_LinearReader::GetSample(AP4_UI32 track_id, AP4_Sample &sample, AP4_Ordinal sample_index) +{ + // look for a sample from a specific track + Tracker* tracker = FindTracker(track_id); + if (tracker == NULL) + return AP4_ERROR_INVALID_PARAMETERS; + + // don't continue if we've reached the end of that tracker + if (tracker->m_Eos) + return AP4_ERROR_EOS; + + return tracker->m_SampleTable->GetSample(sample_index, sample); +} + +/*---------------------------------------------------------------------- +| AP4_LinearReader::SeekSample ++---------------------------------------------------------------------*/ +AP4_Result +AP4_LinearReader::SeekSample(AP4_UI32 track_id, AP4_UI64 ts, AP4_Ordinal &sample_index, bool preceedingSync) +{ + // we only support fragmented sources for now + if (!m_HasFragments) + return AP4_ERROR_NOT_SUPPORTED; + + if (m_Trackers.ItemCount() == 0) { + return AP4_ERROR_NO_SUCH_ITEM; + } + + // look for a sample from a specific track + Tracker* tracker = FindTracker(track_id); + if (tracker == NULL) + return AP4_ERROR_INVALID_PARAMETERS; + + // don't continue if we've reached the end of that tracker + if (tracker->m_Eos) + return AP4_ERROR_EOS; + + AP4_Result result; + + if (!tracker->m_SampleTable && AP4_FAILED(result = Advance())) + return result; + + while (AP4_FAILED(result = tracker->m_SampleTable->GetSampleIndexForTimeStamp(ts, sample_index))) + { + if (result == AP4_ERROR_NOT_ENOUGH_DATA) + { + tracker->m_NextSampleIndex = tracker->m_SampleTable->GetSampleCount(); + if (AP4_FAILED(result = Advance())) + return result; + continue; + } + return result; + } + + sample_index = tracker->m_SampleTable->GetNearestSyncSampleIndex(sample_index, preceedingSync); + //we have reached the end -> go for the first sample of the next segment + if (sample_index == tracker->m_SampleTable->GetSampleCount()) + { + tracker->m_NextSampleIndex = tracker->m_SampleTable->GetSampleCount(); + if (AP4_FAILED(result = Advance())) + return result; + sample_index = 0; + } + return SetSampleIndex(tracker->m_Track->GetId(), sample_index); +} + /*---------------------------------------------------------------------- | AP4_LinearReader::GetNextSample +---------------------------------------------------------------------*/ @@ -633,5 +725,5 @@ AP4_DecryptingSampleReader::ReadSampleData(AP4_Sample& sample, AP4_Result result = sample.ReadData(m_DataBuffer); if (AP4_FAILED(result)) return result; - return m_Decrypter->DecryptSampleData(m_DataBuffer, sample_data); + return m_Decrypter->DecryptSampleData(0, m_DataBuffer, sample_data); } diff --git a/Source/C++/Core/Ap4LinearReader.h b/Source/C++/Core/Ap4LinearReader.h index 549cb5f..21f4871 100644 --- a/Source/C++/Core/Ap4LinearReader.h +++ b/Source/C++/Core/Ap4LinearReader.h @@ -85,6 +85,8 @@ public: AP4_Result SetSampleIndex(AP4_UI32 track_id, AP4_UI32 sample_index); AP4_Result SeekTo(AP4_UI32 time_ms, AP4_UI32* actual_time_ms = 0); + + AP4_Result SeekSample(AP4_UI32 track_id, AP4_UI64 ts, AP4_Ordinal &sample_index, bool preceedingSync); // accessors AP4_Size GetBufferFullness() { return m_BufferFullness; } @@ -169,8 +171,10 @@ protected: AP4_Result ReadNextSample(AP4_Sample& sample, AP4_DataBuffer* sample_data, AP4_UI32& track_id); + AP4_Result GetSample(AP4_UI32 track_id, AP4_Sample &sample, AP4_Ordinal sample_index); void FlushQueue(Tracker* tracker); void FlushQueues(); + void Reset(); // members AP4_Movie& m_Movie; diff --git a/Source/C++/Core/Ap4Marlin.cpp b/Source/C++/Core/Ap4Marlin.cpp index d0ddd3f..c1aa8b6 100644 --- a/Source/C++/Core/Ap4Marlin.cpp +++ b/Source/C++/Core/Ap4Marlin.cpp @@ -431,7 +431,8 @@ AP4_MarlinIpmpSampleDecrypter::GetDecryptedSampleSize(AP4_Sample& sample) | AP4_MarlinIpmpSampleDecrypter::DecryptSampleData +---------------------------------------------------------------------*/ AP4_Result -AP4_MarlinIpmpSampleDecrypter::DecryptSampleData(AP4_DataBuffer& data_in, +AP4_MarlinIpmpSampleDecrypter::DecryptSampleData(AP4_UI32 poolid, + AP4_DataBuffer& data_in, AP4_DataBuffer& data_out, const AP4_UI08* /*iv*/) { @@ -630,7 +631,7 @@ AP4_Result AP4_MarlinIpmpTrackDecrypter::ProcessSample(AP4_DataBuffer& data_in, AP4_DataBuffer& data_out) { - return m_SampleDecrypter->DecryptSampleData(data_in, data_out); + return m_SampleDecrypter->DecryptSampleData(0, data_in, data_out); } /*---------------------------------------------------------------------- diff --git a/Source/C++/Core/Ap4Marlin.h b/Source/C++/Core/Ap4Marlin.h index 774e04f..9280ad6 100644 --- a/Source/C++/Core/Ap4Marlin.h +++ b/Source/C++/Core/Ap4Marlin.h @@ -118,7 +118,8 @@ public: // AP4_SampleDecrypter methods AP4_Size GetDecryptedSampleSize(AP4_Sample& sample); - AP4_Result DecryptSampleData(AP4_DataBuffer& data_in, + AP4_Result DecryptSampleData(AP4_UI32 poolid, + AP4_DataBuffer& data_in, AP4_DataBuffer& data_out, const AP4_UI08* iv = NULL); diff --git a/Source/C++/Core/Ap4MoovAtom.cpp b/Source/C++/Core/Ap4MoovAtom.cpp index 1ceab49..fbeee4f 100644 --- a/Source/C++/Core/Ap4MoovAtom.cpp +++ b/Source/C++/Core/Ap4MoovAtom.cpp @@ -31,6 +31,7 @@ +---------------------------------------------------------------------*/ #include "Ap4MoovAtom.h" #include "Ap4TrakAtom.h" +#include "Ap4PsshAtom.h" #include "Ap4AtomFactory.h" /*---------------------------------------------------------------------- @@ -61,6 +62,29 @@ private: AP4_List* m_TrakAtoms; }; +/*---------------------------------------------------------------------- +| AP4_PsshAtomCollector ++---------------------------------------------------------------------*/ +class AP4_PsshAtomCollector : public AP4_List::Item::Operator +{ +public: + AP4_PsshAtomCollector(AP4_List* pssh_atoms) : + m_PsshAtoms(pssh_atoms) {} + + AP4_Result Action(AP4_Atom* atom) const { + if (atom->GetType() == AP4_ATOM_TYPE_PSSH) { + AP4_PsshAtom* pssh = AP4_DYNAMIC_CAST(AP4_PsshAtom, atom); + if (pssh) { + m_PsshAtoms->Add(pssh); + } + } + return AP4_SUCCESS; + } + +private: + AP4_List* m_PsshAtoms; +}; + /*---------------------------------------------------------------------- | AP4_MoovAtom::AP4_MoovAtom +---------------------------------------------------------------------*/ @@ -80,7 +104,9 @@ AP4_MoovAtom::AP4_MoovAtom(AP4_UI32 size, m_TimeScale(0) { // collect all trak atoms - m_Children.Apply(AP4_TrakAtomCollector(&m_TrakAtoms)); + m_Children.Apply(AP4_TrakAtomCollector(&m_TrakAtoms)); + // collect all pssh atoms + m_Children.Apply(AP4_PsshAtomCollector(&m_PsshAtoms)); } /*---------------------------------------------------------------------- diff --git a/Source/C++/Core/Ap4MoovAtom.h b/Source/C++/Core/Ap4MoovAtom.h index f06b2a1..d1a0147 100644 --- a/Source/C++/Core/Ap4MoovAtom.h +++ b/Source/C++/Core/Ap4MoovAtom.h @@ -40,6 +40,7 @@ +---------------------------------------------------------------------*/ class AP4_AtomFactory; class AP4_TrakAtom; +class AP4_PsshAtom; /*---------------------------------------------------------------------- | AP4_MoovAtom @@ -61,6 +62,9 @@ public: AP4_List& GetTrakAtoms() { return m_TrakAtoms; } + AP4_List& GetPsshAtoms() { + return m_PsshAtoms; + } AP4_UI32 GetTimeScale() { return m_TimeScale; } @@ -77,6 +81,7 @@ private: AP4_AtomFactory& atom_factory); // members + AP4_List m_PsshAtoms; AP4_List m_TrakAtoms; AP4_UI32 m_TimeScale; }; diff --git a/Source/C++/Core/Ap4Movie.cpp b/Source/C++/Core/Ap4Movie.cpp index b080b53..9617494 100644 --- a/Source/C++/Core/Ap4Movie.cpp +++ b/Source/C++/Core/Ap4Movie.cpp @@ -32,6 +32,7 @@ #include "Ap4File.h" #include "Ap4Atom.h" #include "Ap4TrakAtom.h" +#include "Ap4PsshAtom.h" #include "Ap4MoovAtom.h" #include "Ap4MvhdAtom.h" #include "Ap4AtomFactory.h" @@ -110,6 +111,15 @@ AP4_Movie::AP4_Movie(AP4_MoovAtom* moov, AP4_ByteStream& sample_stream, bool tra time_scale = 0; } + // get the pssh atoms + AP4_List* pssh_atoms; + pssh_atoms = &moov->GetPsshAtoms(); + AP4_List::Item* pssh_item = pssh_atoms->FirstItem(); + while (pssh_item) { + m_PsshAtoms.Append(*pssh_item->GetData()); + pssh_item = pssh_item->GetNext(); + } + // get all tracks AP4_List* trak_atoms; trak_atoms = &moov->GetTrakAtoms(); diff --git a/Source/C++/Core/Ap4Movie.h b/Source/C++/Core/Ap4Movie.h index 21ef173..04992a4 100644 --- a/Source/C++/Core/Ap4Movie.h +++ b/Source/C++/Core/Ap4Movie.h @@ -37,6 +37,7 @@ #include "Ap4MvhdAtom.h" #include "Ap4Track.h" #include "Ap4List.h" +#include "Ap4PsshAtom.h" /*---------------------------------------------------------------------- | class references @@ -60,6 +61,8 @@ public: AP4_Result Inspect(AP4_AtomInspector& inspector); AP4_MoovAtom* GetMoovAtom() { return m_MoovAtom;} + void SetMoovAtom(AP4_MoovAtom* atom) { m_MoovAtom = atom; } + AP4_Array& GetPsshAtoms() { return m_PsshAtoms; } AP4_MvhdAtom* GetMvhdAtom() { return m_MvhdAtom;} AP4_List& GetTracks() { return m_Tracks; } AP4_Track* GetTrack(AP4_UI32 track_id); @@ -75,6 +78,7 @@ private: AP4_MoovAtom* m_MoovAtom; bool m_MoovAtomIsOwned; AP4_MvhdAtom* m_MvhdAtom; + AP4_Array m_PsshAtoms; AP4_List m_Tracks; }; diff --git a/Source/C++/Core/Ap4OmaDcf.cpp b/Source/C++/Core/Ap4OmaDcf.cpp index 17099a1..4eefbaf 100644 --- a/Source/C++/Core/Ap4OmaDcf.cpp +++ b/Source/C++/Core/Ap4OmaDcf.cpp @@ -436,7 +436,8 @@ AP4_OmaDcfCtrSampleDecrypter::~AP4_OmaDcfCtrSampleDecrypter() | AP4_OmaDcfCtrSampleDecrypter::DecryptSampleData +---------------------------------------------------------------------*/ AP4_Result -AP4_OmaDcfCtrSampleDecrypter::DecryptSampleData(AP4_DataBuffer& data_in, +AP4_OmaDcfCtrSampleDecrypter::DecryptSampleData(AP4_UI32 poolid, + AP4_DataBuffer& data_in, AP4_DataBuffer& data_out, const AP4_UI08* /*iv*/) { @@ -531,7 +532,8 @@ AP4_OmaDcfCbcSampleDecrypter::~AP4_OmaDcfCbcSampleDecrypter() | AP4_OmaDbcCbcSampleDecrypter::DecryptSampleData +---------------------------------------------------------------------*/ AP4_Result -AP4_OmaDcfCbcSampleDecrypter::DecryptSampleData(AP4_DataBuffer& data_in, +AP4_OmaDcfCbcSampleDecrypter::DecryptSampleData(AP4_UI32 poolid, + AP4_DataBuffer& data_in, AP4_DataBuffer& data_out, const AP4_UI08* /*iv*/) { @@ -853,7 +855,7 @@ AP4_Result AP4_OmaDcfTrackDecrypter::ProcessSample(AP4_DataBuffer& data_in, AP4_DataBuffer& data_out) { - return m_Cipher->DecryptSampleData(data_in, data_out); + return m_Cipher->DecryptSampleData(0, data_in, data_out); } /*---------------------------------------------------------------------- diff --git a/Source/C++/Core/Ap4OmaDcf.h b/Source/C++/Core/Ap4OmaDcf.h index 23f10ed..bb7b3d6 100644 --- a/Source/C++/Core/Ap4OmaDcf.h +++ b/Source/C++/Core/Ap4OmaDcf.h @@ -133,7 +133,8 @@ public: ~AP4_OmaDcfCtrSampleDecrypter(); // methods - virtual AP4_Result DecryptSampleData(AP4_DataBuffer& data_in, + virtual AP4_Result DecryptSampleData(AP4_UI32 poolid, + AP4_DataBuffer& data_in, AP4_DataBuffer& data_out, const AP4_UI08* iv = NULL); virtual AP4_Size GetDecryptedSampleSize(AP4_Sample& sample); @@ -155,7 +156,8 @@ public: ~AP4_OmaDcfCbcSampleDecrypter(); // methods - virtual AP4_Result DecryptSampleData(AP4_DataBuffer& data_in, + virtual AP4_Result DecryptSampleData(AP4_UI32 poolid, + AP4_DataBuffer& data_in, AP4_DataBuffer& data_out, const AP4_UI08* iv = NULL); virtual AP4_Size GetDecryptedSampleSize(AP4_Sample& sample); diff --git a/Source/C++/Core/Ap4Protection.h b/Source/C++/Core/Ap4Protection.h index 856f1f3..4080584 100644 --- a/Source/C++/Core/Ap4Protection.h +++ b/Source/C++/Core/Ap4Protection.h @@ -393,7 +393,8 @@ public: // methods virtual AP4_Size GetDecryptedSampleSize(AP4_Sample& sample) { return sample.GetSize(); } virtual AP4_Result SetSampleIndex(AP4_Ordinal /*index*/) { return AP4_SUCCESS; } - virtual AP4_Result DecryptSampleData(AP4_DataBuffer& data_in, + virtual AP4_Result DecryptSampleData(AP4_UI32 poolid, + AP4_DataBuffer& data_in, AP4_DataBuffer& data_out, const AP4_UI08* iv = NULL) = 0; }; diff --git a/Source/C++/Core/Ap4SampleDescription.h b/Source/C++/Core/Ap4SampleDescription.h index 27f3136..d493f96 100644 --- a/Source/C++/Core/Ap4SampleDescription.h +++ b/Source/C++/Core/Ap4SampleDescription.h @@ -101,6 +101,7 @@ const AP4_UI32 AP4_SAMPLE_FORMAT_TX3G = AP4_ATOM_TYPE('t','x','3','g'); const AP4_UI32 AP4_SAMPLE_FORMAT_VC_1 = AP4_ATOM_TYPE('v','c','-','1'); const AP4_UI32 AP4_SAMPLE_FORMAT_XML_ = AP4_ATOM_TYPE('x','m','l',' '); const AP4_UI32 AP4_SAMPLE_FORMAT_STPP = AP4_ATOM_TYPE('s','t','p','p'); +const AP4_UI32 AP4_SAMPLE_FORMAT_WVTT = AP4_ATOM_TYPE('w','v','t','t'); const AP4_UI32 AP4_SAMPLE_FORMAT_FLAC = AP4_ATOM_TYPE('f','L','a','C'); const AP4_UI32 AP4_SAMPLE_FORMAT_OPUS = AP4_ATOM_TYPE('O','p','u','s'); const AP4_UI32 AP4_SAMPLE_FORMAT_VP8 = AP4_ATOM_TYPE('v','p','0','8'); diff --git a/Source/C++/Core/Ap4UuidAtom.h b/Source/C++/Core/Ap4UuidAtom.h index b9771bd..0ec3b08 100644 --- a/Source/C++/Core/Ap4UuidAtom.h +++ b/Source/C++/Core/Ap4UuidAtom.h @@ -90,6 +90,7 @@ public: // methods virtual AP4_Result WriteFields(AP4_ByteStream& stream); + const AP4_DataBuffer &GetData() { return m_Data; }; protected: // members diff --git a/Source/C++/Core/Ap4VpccAtom.h b/Source/C++/Core/Ap4VpccAtom.h index 9fb60bc..929048a 100644 --- a/Source/C++/Core/Ap4VpccAtom.h +++ b/Source/C++/Core/Ap4VpccAtom.h @@ -79,10 +79,13 @@ public: AP4_UI08 GetTransferCharacteristics() { return m_TransferCharacteristics; } AP4_UI08 GetMatrixCoefficients() { return m_MatrixCoefficients; } const AP4_DataBuffer& GetCodecInitializationData() { return m_CodecIntializationData; } + const AP4_DataBuffer& GetData() { return m_Data; } // helpers AP4_Result GetCodecString(AP4_UI32 container_type, AP4_String& codec); +protected: + AP4_DataBuffer m_Data; private: // methods AP4_VpccAtom(AP4_UI32 size, const AP4_UI08* payload); -- 2.30.2