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