1 /***************************************************************** 2 | 3 | AP4 - ByteStream Interface 4 | 5 | Copyright 2002-2008 Axiomatic Systems, LLC 6 | 7 | 8 | This file is part of Bento4/AP4 (MP4 Atom Processing Library). 9 | 10 | Unless you have obtained Bento4 under a difference license, 11 | this version of Bento4 is Bento4|GPL. 12 | Bento4|GPL is free software; you can redistribute it and/or modify 13 | it under the terms of the GNU General Public License as published by 14 | the Free Software Foundation; either version 2, or (at your option) 15 | any later version. 16 | 17 | Bento4|GPL is distributed in the hope that it will be useful, 18 | but WITHOUT ANY WARRANTY; without even the implied warranty of 19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 | GNU General Public License for more details. 21 | 22 | You should have received a copy of the GNU General Public License 23 | along with Bento4|GPL; see the file COPYING. If not, write to the 24 | Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 25 | 02111-1307, USA. 26 | 27 ****************************************************************/ 28 29 #ifndef _AP4_BYTE_STREAM_H_ 30 #define _AP4_BYTE_STREAM_H_ 31 32 /*---------------------------------------------------------------------- 33 | includes 34 +---------------------------------------------------------------------*/ 35 #include "Ap4Types.h" 36 #include "Ap4Interfaces.h" 37 #include "Ap4Results.h" 38 #include "Ap4DataBuffer.h" 39 40 /*---------------------------------------------------------------------- 41 | class references 42 +---------------------------------------------------------------------*/ 43 class AP4_String; 44 class AP4_ByteStream; 45 46 class AP4_ByteStreamObserver 47 { 48 public: 49 virtual AP4_Result OnFlush(AP4_ByteStream *stream) = 0; 50 }; 51 52 /*---------------------------------------------------------------------- 53 | AP4_ByteStream 54 +---------------------------------------------------------------------*/ 55 class AP4_ByteStream : public AP4_Referenceable 56 { 57 public: AP4_ByteStream()58 AP4_ByteStream() :observer_(0){}; SetObserver(AP4_ByteStreamObserver * observer)59 void SetObserver(AP4_ByteStreamObserver *observer){ observer_ = observer; }; GetObserver()60 AP4_ByteStreamObserver *GetObserver(){ return observer_; }; 61 // methods 62 virtual AP4_Result ReadPartial(void* buffer, 63 AP4_Size bytes_to_read, 64 AP4_Size& bytes_read) = 0; 65 AP4_Result Read(void* buffer, AP4_Size bytes_to_read); 66 AP4_Result ReadDouble(double& value); 67 AP4_Result ReadUI64(AP4_UI64& value); 68 AP4_Result ReadUI32(AP4_UI32& value); 69 AP4_Result ReadUI24(AP4_UI32& value); 70 AP4_Result ReadUI16(AP4_UI16& value); 71 AP4_Result ReadUI08(AP4_UI08& value); 72 AP4_Result ReadString(char* buffer, AP4_Size size); 73 AP4_Result ReadNullTerminatedString(AP4_String& string); 74 virtual AP4_Result WritePartial(const void* buffer, 75 AP4_Size bytes_to_write, 76 AP4_Size& bytes_written) = 0; 77 AP4_Result Write(const void* buffer, AP4_Size bytes_to_write); 78 AP4_Result WriteString(const char* string_buffer); 79 AP4_Result WriteDouble(double value); 80 AP4_Result WriteUI64(AP4_UI64 value); 81 AP4_Result WriteUI32(AP4_UI32 value); 82 AP4_Result WriteUI24(AP4_UI32 value); 83 AP4_Result WriteUI16(AP4_UI16 value); 84 AP4_Result WriteUI08(AP4_UI08 value); 85 virtual AP4_Result Seek(AP4_Position position) = 0; 86 virtual AP4_Result Tell(AP4_Position& position) = 0; 87 virtual AP4_Result GetSize(AP4_LargeSize& size) = 0; 88 virtual AP4_Result CopyTo(AP4_ByteStream& stream, AP4_LargeSize size); Buffer()89 virtual AP4_Result Buffer() { return AP4_SUCCESS; } Flush()90 virtual AP4_Result Flush() { return AP4_SUCCESS; } 91 private: 92 AP4_ByteStreamObserver *observer_; 93 }; 94 95 /*---------------------------------------------------------------------- 96 | AP4_SubStream 97 +---------------------------------------------------------------------*/ 98 class AP4_SubStream : public AP4_ByteStream 99 { 100 public: 101 AP4_SubStream(AP4_ByteStream& container, 102 AP4_Position position, 103 AP4_LargeSize size); 104 105 // AP4_ByteStream methods 106 AP4_Result ReadPartial(void* buffer, 107 AP4_Size bytes_to_read, 108 AP4_Size& bytes_read); 109 AP4_Result WritePartial(const void* buffer, 110 AP4_Size bytes_to_write, 111 AP4_Size& bytes_written); 112 AP4_Result Seek(AP4_Position position); Tell(AP4_Position & position)113 AP4_Result Tell(AP4_Position& position) { 114 position = m_Position; 115 return AP4_SUCCESS; 116 } GetSize(AP4_LargeSize & size)117 AP4_Result GetSize(AP4_LargeSize& size) { 118 size = m_Size; 119 return AP4_SUCCESS; 120 } 121 122 // AP4_Referenceable methods 123 void AddReference(); 124 void Release(); 125 126 protected: 127 virtual ~AP4_SubStream(); 128 129 private: 130 AP4_ByteStream& m_Container; 131 AP4_Position m_Offset; 132 AP4_LargeSize m_Size; 133 AP4_Position m_Position; 134 AP4_Cardinal m_ReferenceCount; 135 }; 136 137 /*---------------------------------------------------------------------- 138 | AP4_DupStream 139 +---------------------------------------------------------------------*/ 140 class AP4_DupStream : public AP4_ByteStream 141 { 142 public: 143 AP4_DupStream(AP4_ByteStream& original_stream); 144 145 // AP4_ByteStream methods 146 AP4_Result ReadPartial(void* buffer, 147 AP4_Size bytes_to_read, 148 AP4_Size& bytes_read); 149 AP4_Result WritePartial(const void* buffer, 150 AP4_Size bytes_to_write, 151 AP4_Size& bytes_written); 152 AP4_Result Seek(AP4_Position position); Tell(AP4_Position & position)153 AP4_Result Tell(AP4_Position& position) { 154 position = m_Position; 155 return AP4_SUCCESS; 156 } GetSize(AP4_LargeSize & size)157 AP4_Result GetSize(AP4_LargeSize& size) { 158 return m_OriginalStream.GetSize(size); 159 } 160 161 // AP4_Referenceable methods 162 void AddReference(); 163 void Release(); 164 165 protected: 166 virtual ~AP4_DupStream(); 167 168 private: 169 AP4_ByteStream& m_OriginalStream; 170 AP4_Position m_Position; 171 AP4_Cardinal m_ReferenceCount; 172 }; 173 174 /*---------------------------------------------------------------------- 175 | AP4_MemoryByteStream 176 +---------------------------------------------------------------------*/ 177 class AP4_MemoryByteStream : public AP4_ByteStream 178 { 179 public: 180 AP4_MemoryByteStream(AP4_Size size = 0); // filled with zeros 181 AP4_MemoryByteStream(const AP4_UI08* buffer, AP4_Size size); 182 AP4_MemoryByteStream(AP4_DataBuffer& data_buffer); // data is read/written from/to supplied buffer, no ownership transfer 183 AP4_MemoryByteStream(AP4_DataBuffer* data_buffer); // data is read/written from/to supplied buffer, ownership is transfered 184 185 // AP4_ByteStream methods 186 AP4_Result ReadPartial(void* buffer, 187 AP4_Size bytes_to_read, 188 AP4_Size& bytes_read); 189 AP4_Result WritePartial(const void* buffer, 190 AP4_Size bytes_to_write, 191 AP4_Size& bytes_written); 192 AP4_Result Seek(AP4_Position position); Tell(AP4_Position & position)193 AP4_Result Tell(AP4_Position& position) { 194 position = m_Position; 195 return AP4_SUCCESS; 196 } GetSize(AP4_LargeSize & size)197 AP4_Result GetSize(AP4_LargeSize& size) { 198 size = m_Buffer->GetDataSize(); 199 return AP4_SUCCESS; 200 } 201 202 // AP4_Referenceable methods 203 void AddReference(); 204 void Release(); 205 206 // methods GetData()207 const AP4_UI08* GetData() { return m_Buffer->GetData(); } UseData()208 AP4_UI08* UseData() { return m_Buffer->UseData(); } GetDataSize()209 AP4_Size GetDataSize() { return m_Buffer->GetDataSize(); } 210 211 //protected: 212 virtual ~AP4_MemoryByteStream(); 213 214 private: 215 AP4_DataBuffer* m_Buffer; 216 bool m_BufferIsLocal; 217 AP4_Position m_Position; 218 AP4_Cardinal m_ReferenceCount; 219 }; 220 221 /*---------------------------------------------------------------------- 222 | AP4_BufferedInputStream 223 +---------------------------------------------------------------------*/ 224 class AP4_BufferedInputStream : public AP4_ByteStream 225 { 226 public: 227 AP4_BufferedInputStream(AP4_ByteStream& source, 228 AP4_Size buffer_size=4096, 229 AP4_Size seek_as_read_threshold=1024*128); 230 231 // AP4_ByteStream methods 232 AP4_Result ReadPartial(void* buffer, 233 AP4_Size bytes_to_read, 234 AP4_Size& bytes_read); 235 AP4_Result WritePartial(const void* buffer, 236 AP4_Size bytes_to_write, 237 AP4_Size& bytes_written); 238 AP4_Result Seek(AP4_Position position); 239 AP4_Result Tell(AP4_Position& position); GetSize(AP4_LargeSize & size)240 AP4_Result GetSize(AP4_LargeSize& size) { return m_Source.GetSize(size); } 241 242 // AP4_Referenceable methods 243 void AddReference(); 244 void Release(); 245 246 protected: ~AP4_BufferedInputStream()247 ~AP4_BufferedInputStream() { m_Source.Release(); } 248 AP4_Result Refill(); 249 250 private: 251 AP4_DataBuffer m_Buffer; 252 AP4_Size m_BufferPosition; 253 AP4_ByteStream& m_Source; 254 AP4_Position m_SourcePosition; 255 AP4_Size m_SeekAsReadThreshold; 256 AP4_Cardinal m_ReferenceCount; 257 }; 258 259 #endif // _AP4_BYTE_STREAM_H_ 260