1 /*****************************************************************
2 |
3 |    Bento4 - C API Implementation
4 |
5 |    Copyright 2002-2008 Gilles Boccon-Gibod & Julien Boeuf
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 /*----------------------------------------------------------------------
30 |   includes
31 +---------------------------------------------------------------------*/
32 #include "Bento4C.h"
33 #include "Ap4.h"
34 
35 /*----------------------------------------------------------------------
36 |   constants
37 +---------------------------------------------------------------------*/
38 const int AP4_FILE_BYTE_STREAM_MODE_READ       = AP4_FileByteStream::STREAM_MODE_READ;
39 const int AP4_FILE_BYTE_STREAM_MODE_WRITE      = AP4_FileByteStream::STREAM_MODE_WRITE;
40 const int AP4_FILE_BYTE_STREAM_MODE_READ_WRITE = AP4_FileByteStream::STREAM_MODE_READ_WRITE;
41 
42 const int AP4_TRACK_TYPE_UNKNOWN   = AP4_Track::TYPE_UNKNOWN;
43 const int AP4_TRACK_TYPE_AUDIO     = AP4_Track::TYPE_AUDIO;
44 const int AP4_TRACK_TYPE_VIDEO     = AP4_Track::TYPE_VIDEO;
45 const int AP4_TRACK_TYPE_SYSTEM    = AP4_Track::TYPE_SYSTEM;
46 const int AP4_TRACK_TYPE_HINT      = AP4_Track::TYPE_HINT;
47 const int AP4_TRACK_TYPE_TEXT      = AP4_Track::TYPE_TEXT;
48 const int AP4_TRACK_TYPE_JPEG      = AP4_Track::TYPE_JPEG;
49 const int AP4_TRACK_TYPE_RTP       = AP4_Track::TYPE_RTP;
50 const int AP4_TRACK_TYPE_SUBTITLES = AP4_Track::TYPE_SUBTITLES;
51 
52 const int AP4_ATOM_INSPECTOR_HINT_NONE    = AP4_AtomInspector::HINT_NONE;
53 const int AP4_ATOM_INSPECTOR_HINT_HEX     = AP4_AtomInspector::HINT_HEX;
54 //const int AP4_ATOM_INSPECTOR_HINT_BOOLEAN = AP4_AtomInspector::HINT_BOOLEAN;
55 
56 const int AP4_SAMPLE_DESCRIPTION_TYPE_UNKNOWN   = AP4_SampleDescription::TYPE_UNKNOWN;
57 const int AP4_SAMPLE_DESCRIPTION_TYPE_MPEG      = AP4_SampleDescription::TYPE_MPEG;
58 const int AP4_SAMPLE_DESCRIPTION_TYPE_PROTECTED = AP4_SampleDescription::TYPE_PROTECTED;
59 const int AP4_SAMPLE_DESCRIPTION_TYPE_AVC       = AP4_SampleDescription::TYPE_AVC;
60 const int AP4_SAMPLE_DESCRIPTION_TYPE_HEVC      = AP4_SampleDescription::TYPE_HEVC;
61 
62 /*----------------------------------------------------------------------
63 |   AP4_DelegatorByteStream
64 +---------------------------------------------------------------------*/
65 class AP4_DelegatorByteStream : public AP4_ByteStream
66 {
67 public:
AP4_DelegatorByteStream(AP4_ByteStreamDelegate * delegate)68     AP4_DelegatorByteStream(AP4_ByteStreamDelegate* delegate) :
69         m_Delegate(delegate),
70         m_RefCount(1) {}
71 
72     // overloaded methods
AddReference()73     void AddReference() { m_RefCount++; }
Release()74     void Release() { if (--m_RefCount == 0) delete this; }
75     AP4_Result ReadPartial(void* buffer,
76                            AP4_Size bytes_to_read,
77                            AP4_Size& bytes_read);
78     AP4_Result WritePartial(const void* buffer,
79                             AP4_Size    bytes_to_write,
80                             AP4_Size&   bytes_written);
81     AP4_Result Seek(AP4_Position position);
82     AP4_Result Tell(AP4_Position& position);
83     AP4_Result GetSize(AP4_LargeSize& size);
84     AP4_Result Flush();
85 
86 private:
87     ~AP4_DelegatorByteStream();
88     AP4_ByteStreamDelegate* m_Delegate;
89     AP4_Cardinal            m_RefCount;
90 };
91 
~AP4_DelegatorByteStream()92 AP4_DelegatorByteStream::~AP4_DelegatorByteStream()
93 {
94     if (m_Delegate->Destroy) {
95         m_Delegate->Destroy(m_Delegate);
96     }
97 }
98 
99 AP4_Result
ReadPartial(void * buffer,AP4_Size bytes_to_read,AP4_Size & bytes_read)100 AP4_DelegatorByteStream::ReadPartial(void*     buffer,
101                                      AP4_Size  bytes_to_read,
102                                      AP4_Size& bytes_read)
103 {
104     return m_Delegate->ReadPartial(m_Delegate, buffer, bytes_to_read, &bytes_read);
105 }
106 
107 AP4_Result
WritePartial(const void * buffer,AP4_Size bytes_to_write,AP4_Size & bytes_written)108 AP4_DelegatorByteStream::WritePartial(const void* buffer,
109                                       AP4_Size    bytes_to_write,
110                                       AP4_Size&   bytes_written)
111 {
112     return m_Delegate->WritePartial(m_Delegate, buffer, bytes_to_write, &bytes_written);
113 }
114 
115 AP4_Result
Seek(AP4_Position position)116 AP4_DelegatorByteStream::Seek(AP4_Position position)
117 {
118     return m_Delegate->Seek(m_Delegate, position);
119 }
120 
121 AP4_Result
Tell(AP4_Position & position)122 AP4_DelegatorByteStream::Tell(AP4_Position& position)
123 {
124     return m_Delegate->Tell(m_Delegate, &position);
125 }
126 
127 AP4_Result
GetSize(AP4_LargeSize & size)128 AP4_DelegatorByteStream::GetSize(AP4_LargeSize& size)
129 {
130     return m_Delegate->GetSize(m_Delegate, &size);
131 }
132 
133 AP4_Result
Flush()134 AP4_DelegatorByteStream::Flush()
135 {
136     return m_Delegate->Flush(m_Delegate);
137 }
138 
139 /*----------------------------------------------------------------------
140 |   AP4_ByteStream implementation
141 +---------------------------------------------------------------------*/
142 void
AP4_ByteStream_AddReference(AP4_ByteStream * self)143 AP4_ByteStream_AddReference(AP4_ByteStream* self)
144 {
145     self->AddReference();
146 }
147 
148 void
AP4_ByteStream_Release(AP4_ByteStream * self)149 AP4_ByteStream_Release(AP4_ByteStream* self)
150 {
151     self->Release();
152 }
153 
154 AP4_Result
AP4_ByteStream_ReadPartial(AP4_ByteStream * self,void * buffer,AP4_Size bytes_to_read,AP4_Size * bytes_read)155 AP4_ByteStream_ReadPartial(AP4_ByteStream*  self,
156                            void*            buffer,
157                            AP4_Size         bytes_to_read,
158                            AP4_Size*        bytes_read)
159 {
160     return self->ReadPartial(buffer, bytes_to_read, *bytes_read);
161 }
162 
163 AP4_Result
AP4_ByteStream_Read(AP4_ByteStream * self,void * buffer,AP4_Size bytes_to_read)164 AP4_ByteStream_Read(AP4_ByteStream* self,
165                     void*           buffer,
166                     AP4_Size        bytes_to_read)
167 {
168     return self->Read(buffer, bytes_to_read);
169 }
170 
171 AP4_Result
AP4_ByteStream_ReadDouble(AP4_ByteStream * self,double * value)172 AP4_ByteStream_ReadDouble(AP4_ByteStream* self, double* value)
173 {
174     return self->ReadDouble(*value);
175 }
176 
177 AP4_Result
AP4_ByteStream_ReadUI64(AP4_ByteStream * self,AP4_UI64 * value)178 AP4_ByteStream_ReadUI64(AP4_ByteStream* self, AP4_UI64* value)
179 {
180     return self->ReadUI64(*value);
181 }
182 
183 AP4_Result
AP4_ByteStream_ReadUI32(AP4_ByteStream * self,AP4_UI32 * value)184 AP4_ByteStream_ReadUI32(AP4_ByteStream* self, AP4_UI32* value)
185 {
186     return self->ReadUI32(*value);
187 }
188 
189 AP4_Result
AP4_ByteStream_ReadUI24(AP4_ByteStream * self,AP4_UI32 * value)190 AP4_ByteStream_ReadUI24(AP4_ByteStream* self, AP4_UI32* value)
191 {
192     return self->ReadUI24(*value);
193 }
194 
195 AP4_Result
AP4_ByteStream_ReadUI16(AP4_ByteStream * self,AP4_UI16 * value)196 AP4_ByteStream_ReadUI16(AP4_ByteStream* self, AP4_UI16* value)
197 {
198     return self->ReadUI16(*value);
199 }
200 
201 AP4_Result
AP4_ByteStream_ReadUI08(AP4_ByteStream * self,AP4_UI08 * value)202 AP4_ByteStream_ReadUI08(AP4_ByteStream* self, AP4_UI08* value)
203 {
204     return self->ReadUI08(*value);
205 }
206 
207 AP4_Result
AP4_ByteStream_ReadString(AP4_ByteStream * self,char * buffer,AP4_Size size)208 AP4_ByteStream_ReadString(AP4_ByteStream* self,
209                           char*           buffer,
210                           AP4_Size        size)
211 {
212     return self->ReadString(buffer, size);
213 }
214 
215 AP4_Result
AP4_ByteStream_WritePartial(AP4_ByteStream * self,const void * buffer,AP4_Size bytes_to_write,AP4_Size * bytes_written)216 AP4_ByteStream_WritePartial(AP4_ByteStream* self,
217                             const void*     buffer,
218                             AP4_Size        bytes_to_write,
219                             AP4_Size*       bytes_written)
220 {
221     return self->WritePartial(buffer, bytes_to_write, *bytes_written);
222 }
223 
224 AP4_Result
AP4_ByteStream_Write(AP4_ByteStream * self,const void * buffer,AP4_Size bytes_to_write)225 AP4_ByteStream_Write(AP4_ByteStream* self,
226                      const void*     buffer,
227                      AP4_Size        bytes_to_write)
228 {
229     return self->Write(buffer, bytes_to_write);
230 }
231 
232 AP4_Result
AP4_ByteStream_WriteDouble(AP4_ByteStream * self,double value)233 AP4_ByteStream_WriteDouble(AP4_ByteStream* self, double value)
234 {
235     return self->WriteDouble(value);
236 }
237 
238 AP4_Result
AP4_ByteStream_WriteUI64(AP4_ByteStream * self,AP4_UI64 value)239 AP4_ByteStream_WriteUI64(AP4_ByteStream* self, AP4_UI64 value)
240 {
241     return self->WriteUI64(value);
242 }
243 
244 AP4_Result
AP4_ByteStream_WriteUI32(AP4_ByteStream * self,AP4_UI32 value)245 AP4_ByteStream_WriteUI32(AP4_ByteStream* self, AP4_UI32 value)
246 {
247     return self->WriteUI32(value);
248 }
249 
250 AP4_Result
AP4_ByteStream_WriteUI24(AP4_ByteStream * self,AP4_UI32 value)251 AP4_ByteStream_WriteUI24(AP4_ByteStream* self, AP4_UI32 value)
252 {
253     return self->WriteUI24(value);
254 }
255 
256 AP4_Result
AP4_ByteStream_WriteUI16(AP4_ByteStream * self,AP4_UI16 value)257 AP4_ByteStream_WriteUI16(AP4_ByteStream* self, AP4_UI16 value)
258 {
259     return self->WriteUI16(value);
260 }
261 
262 AP4_Result
AP4_ByteStream_WriteUI08(AP4_ByteStream * self,AP4_UI08 value)263 AP4_ByteStream_WriteUI08(AP4_ByteStream* self, AP4_UI08 value)
264 {
265     return self->WriteUI08(value);
266 }
267 
268 AP4_Result
AP4_ByteStream_WriteString(AP4_ByteStream * self,const char * buffer)269 AP4_ByteStream_WriteString(AP4_ByteStream* self, const char* buffer)
270 {
271     return self->WriteString(buffer);
272 }
273 
274 AP4_Result
AP4_ByteStream_Seek(AP4_ByteStream * self,AP4_Position position)275 AP4_ByteStream_Seek(AP4_ByteStream* self, AP4_Position position)
276 {
277     return self->Seek(position);
278 }
279 
280 AP4_Result
AP4_ByteStream_Tell(AP4_ByteStream * self,AP4_Position * position)281 AP4_ByteStream_Tell(AP4_ByteStream* self, AP4_Position* position)
282 {
283     return self->Tell(*position);
284 }
285 
286 AP4_Result
AP4_ByteStream_GetSize(AP4_ByteStream * self,AP4_LargeSize * size)287 AP4_ByteStream_GetSize(AP4_ByteStream* self, AP4_LargeSize* size)
288 {
289     return self->GetSize(*size);
290 }
291 
292 AP4_Result
AP4_ByteStream_CopyTo(AP4_ByteStream * self,AP4_ByteStream * receiver,AP4_LargeSize size)293 AP4_ByteStream_CopyTo(AP4_ByteStream* self,
294                       AP4_ByteStream* receiver,
295                       AP4_LargeSize   size)
296 {
297     return self->CopyTo(*receiver, size);
298 }
299 
300 AP4_Result
Ap4_ByteStream_Flush(AP4_ByteStream * self)301 Ap4_ByteStream_Flush(AP4_ByteStream* self)
302 {
303     return self->Flush();
304 }
305 
306 AP4_ByteStream*
AP4_SubStream_Create(AP4_ByteStream * container,AP4_Position position,AP4_LargeSize size)307 AP4_SubStream_Create(AP4_ByteStream* container,
308                      AP4_Position     position,
309                      AP4_LargeSize    size)
310 {
311     return new AP4_SubStream(*container, position, size);
312 }
313 
314 AP4_ByteStream*
AP4_MemoryByteStream_Create(AP4_Size size)315 AP4_MemoryByteStream_Create(AP4_Size size)
316 {
317     return new AP4_MemoryByteStream(size);
318 }
319 
320 AP4_ByteStream*
AP4_MemoryByteStream_FromBuffer(const AP4_UI08 * buffer,AP4_Size size)321 AP4_MemoryByteStream_FromBuffer(const AP4_UI08* buffer, AP4_Size size)
322 {
323     return new AP4_MemoryByteStream(buffer, size);
324 }
325 
326 AP4_ByteStream*
AP4_MemoryByteStream_AdaptDataBuffer(AP4_DataBuffer * buffer)327 AP4_MemoryByteStream_AdaptDataBuffer(AP4_DataBuffer* buffer)
328 {
329     return new AP4_MemoryByteStream(*buffer);
330 }
331 
332 AP4_ByteStream*
AP4_FileByteStream_Create(const char * name,int mode,AP4_Result * result)333 AP4_FileByteStream_Create(const char* name, int mode, AP4_Result* result)
334 {
335     AP4_Result      local_result;
336     AP4_ByteStream* stream;
337 
338     local_result = AP4_FileByteStream::Create(name,
339                                               (AP4_FileByteStream::Mode)mode,
340                                               stream);
341     if (result) *result = local_result;
342     if (AP4_SUCCEEDED(local_result)) {
343         return stream;
344     } else {
345         return NULL;
346     }
347 }
348 
349 AP4_ByteStream*
AP4_ByteStream_FromDelegate(AP4_ByteStreamDelegate * delegate)350 AP4_ByteStream_FromDelegate(AP4_ByteStreamDelegate* delegate)
351 {
352     return new AP4_DelegatorByteStream(delegate);
353 }
354 
355 /*----------------------------------------------------------------------
356 |   AP4_DataBuffer implementation
357 +---------------------------------------------------------------------*/
358 AP4_Result
AP4_DataBuffer_SetBuffer(AP4_DataBuffer * self,AP4_Byte * buffer,AP4_Size size)359 AP4_DataBuffer_SetBuffer(AP4_DataBuffer* self, AP4_Byte* buffer, AP4_Size size)
360 {
361     return self->SetBuffer(buffer, size);
362 }
363 
364 AP4_Result
AP4_DataBuffer_SetBufferSize(AP4_DataBuffer * self,AP4_Size size)365 AP4_DataBuffer_SetBufferSize(AP4_DataBuffer* self, AP4_Size size)
366 {
367     return self->SetBufferSize(size);
368 }
369 
370 AP4_Size
AP4_DataBuffer_GetBufferSize(const AP4_DataBuffer * self)371 AP4_DataBuffer_GetBufferSize(const AP4_DataBuffer* self)
372 {
373     return self->GetBufferSize();
374 }
375 
376 const AP4_Byte*
AP4_DataBuffer_GetData(const AP4_DataBuffer * self)377 AP4_DataBuffer_GetData(const AP4_DataBuffer* self)
378 {
379     return self->GetData();
380 }
381 
382 AP4_Byte*
AP4_DataBuffer_UseData(AP4_DataBuffer * self)383 AP4_DataBuffer_UseData(AP4_DataBuffer* self)
384 {
385     return self->UseData();
386 }
387 
388 AP4_Size
AP4_DataBuffer_GetDataSize(const AP4_DataBuffer * self)389 AP4_DataBuffer_GetDataSize(const AP4_DataBuffer* self)
390 {
391     return self->GetDataSize();
392 }
393 
394 AP4_Result
AP4_DataBuffer_SetDataSize(AP4_DataBuffer * self,AP4_Size size)395 AP4_DataBuffer_SetDataSize(AP4_DataBuffer* self, AP4_Size size)
396 {
397     return self->SetDataSize(size);
398 }
399 
400 AP4_Result
AP4_DataBuffer_SetData(AP4_DataBuffer * self,const AP4_Byte * data,AP4_Size data_size)401 AP4_DataBuffer_SetData(AP4_DataBuffer* self,
402                       const AP4_Byte*  data,
403                       AP4_Size         data_size)
404 {
405     return self->SetData(data, data_size);
406 }
407 
408 AP4_Result
AP4_DataBuffer_Reserve(AP4_DataBuffer * self,AP4_Size size)409 AP4_DataBuffer_Reserve(AP4_DataBuffer* self, AP4_Size size)
410 {
411     return self->Reserve(size);
412 }
413 
414 void
AP4_DataBuffer_Destroy(AP4_DataBuffer * self)415 AP4_DataBuffer_Destroy(AP4_DataBuffer* self)
416 {
417     delete self;
418 }
419 
420 AP4_DataBuffer*
AP4_DataBuffer_Create(AP4_Size size)421 AP4_DataBuffer_Create(AP4_Size size)
422 {
423     return new AP4_DataBuffer(size);
424 }
425 
426 AP4_DataBuffer*
AP4_DataBuffer_FromData(const void * data,AP4_Size data_size)427 AP4_DataBuffer_FromData(const void* data, AP4_Size data_size)
428 {
429     return new AP4_DataBuffer(data, data_size);
430 }
431 
432 AP4_DataBuffer*
AP4_DataBuffer_Clone(const AP4_DataBuffer * other)433 AP4_DataBuffer_Clone(const AP4_DataBuffer* other)
434 {
435     return new AP4_DataBuffer(*other);
436 }
437 
438 /*----------------------------------------------------------------------
439 |   AP4_File implementation
440 +---------------------------------------------------------------------*/
441 AP4_Movie*
AP4_File_GetMovie(AP4_File * self)442 AP4_File_GetMovie(AP4_File* self)
443 {
444     return self->GetMovie();
445 }
446 
447 AP4_Result
AP4_File_GetFileType(AP4_File * self,AP4_UI32 * major_brand,AP4_UI32 * minor_version,AP4_Cardinal * compatible_brand_count)448 AP4_File_GetFileType(AP4_File*      self,
449                      AP4_UI32*      major_brand,
450                      AP4_UI32*      minor_version,
451                      AP4_Cardinal*  compatible_brand_count)
452 {
453     AP4_FtypAtom* ftyp = self->GetFileType();
454     if (!ftyp) return AP4_FAILURE;
455 
456     if (major_brand) *major_brand = ftyp->GetMajorBrand();
457     if (minor_version) *minor_version = ftyp->GetMinorVersion();
458     if (compatible_brand_count) {
459         *compatible_brand_count = ftyp->GetCompatibleBrands().ItemCount();
460     }
461     return AP4_SUCCESS;
462 }
463 
464 AP4_Result
AP4_File_GetCompatibleBrand(AP4_File * self,AP4_Ordinal index,AP4_UI32 * brand)465 AP4_File_GetCompatibleBrand(AP4_File*   self,
466                             AP4_Ordinal index,
467                             AP4_UI32*   brand)
468 {
469     AP4_FtypAtom* ftyp = self->GetFileType();
470     if (!ftyp || !brand) return AP4_FAILURE;
471 
472     if (index >= ftyp->GetCompatibleBrands().ItemCount()) {
473         return AP4_ERROR_OUT_OF_RANGE;
474     }
475 
476     *brand = ftyp->GetCompatibleBrands()[index];
477     return AP4_SUCCESS;
478 }
479 
480 AP4_Result
AP4_File_SetFileType(AP4_File * self,AP4_UI32 major_brand,AP4_UI32 minor_version,AP4_UI32 * compatible_brands,AP4_Cardinal compatible_brand_count)481 AP4_File_SetFileType(AP4_File*    self,
482                      AP4_UI32     major_brand,
483                      AP4_UI32     minor_version,
484                      AP4_UI32*    compatible_brands,
485                      AP4_Cardinal compatible_brand_count)
486 {
487     return self->SetFileType(major_brand,
488                              minor_version,
489                              compatible_brands,
490                              compatible_brand_count);
491 }
492 
493 int
AP4_File_IsMoovBeforeMdat(const AP4_File * self)494 AP4_File_IsMoovBeforeMdat(const AP4_File* self)
495 {
496     return (int) self->IsMoovBeforeMdat();
497 }
498 
499 const AP4_MetaData*
AP4_File_GetMetaData(AP4_File * self)500 AP4_File_GetMetaData(AP4_File* self)
501 {
502     return self->GetMetaData();
503 }
504 
505 AP4_Result
AP4_File_Inspect(AP4_File * self,AP4_AtomInspector * inspector)506 AP4_File_Inspect(AP4_File* self, AP4_AtomInspector* inspector)
507 {
508     return self->Inspect(*inspector);
509 }
510 
511 void
AP4_File_Destroy(AP4_File * self)512 AP4_File_Destroy(AP4_File* self)
513 {
514     delete self;
515 }
516 
517 AP4_File*
AP4_File_Create(AP4_Movie * movie)518 AP4_File_Create(AP4_Movie* movie)
519 {
520     return new AP4_File(movie);
521 }
522 
523 AP4_File*
AP4_File_FromStream(AP4_ByteStream * stream,int moov_only)524 AP4_File_FromStream(AP4_ByteStream* stream, int moov_only)
525 {
526     return new AP4_File(*stream, moov_only?true:false);
527 }
528 
529 /*----------------------------------------------------------------------
530 |   AP4_Movie implementation
531 +---------------------------------------------------------------------*/
532 AP4_Cardinal
AP4_Movie_GetTrackCount(AP4_Movie * self)533 AP4_Movie_GetTrackCount(AP4_Movie* self)
534 {
535     return self->GetTracks().ItemCount();
536 }
537 
538 AP4_Track*
AP4_Movie_GetTrackByIndex(AP4_Movie * self,AP4_Ordinal index)539 AP4_Movie_GetTrackByIndex(AP4_Movie* self, AP4_Ordinal index)
540 {
541     AP4_Track* track = NULL;
542     if (AP4_FAILED(self->GetTracks().Get(index, track))) {
543         return NULL;
544     } else {
545         return track;
546     }
547 }
548 
549 AP4_Track*
AP4_Movie_GetTrackById(AP4_Movie * self,AP4_UI32 track_id)550 AP4_Movie_GetTrackById(AP4_Movie* self, AP4_UI32 track_id)
551 {
552     return self->GetTrack(track_id);
553 }
554 
555 AP4_Track*
AP4_Movie_GetTrackByType(AP4_Movie * self,int type,AP4_Ordinal index)556 AP4_Movie_GetTrackByType(AP4_Movie* self, int type, AP4_Ordinal index)
557 {
558     return self->GetTrack((AP4_Track::Type) type, index);
559 }
560 
561 AP4_UI32
AP4_Movie_GetTimeScale(AP4_Movie * self)562 AP4_Movie_GetTimeScale(AP4_Movie* self)
563 {
564     return self->GetTimeScale();
565 }
566 
567 AP4_UI64
AP4_Movie_GetDuration(AP4_Movie * self)568 AP4_Movie_GetDuration(AP4_Movie* self)
569 {
570     return self->GetDuration();
571 }
572 
573 AP4_UI32
AP4_Movie_GetDurationMs(AP4_Movie * self)574 AP4_Movie_GetDurationMs(AP4_Movie* self)
575 {
576     return self->GetDurationMs();
577 }
578 
579 void
AP4_Movie_Destroy(AP4_Movie * self)580 AP4_Movie_Destroy(AP4_Movie* self)
581 {
582     delete self;
583 }
584 
585 AP4_Result
AP4_Movie_AddTrack(AP4_Movie * self,AP4_Track * track)586 AP4_Movie_AddTrack(AP4_Movie* self, AP4_Track* track)
587 {
588     return self->AddTrack(track);
589 }
590 
591 AP4_Movie*
AP4_Movie_Create(AP4_UI32 time_scale)592 AP4_Movie_Create(AP4_UI32 time_scale)
593 {
594     return new AP4_Movie(time_scale);
595 }
596 
597 /*----------------------------------------------------------------------
598 |   AP4_Track implementation
599 +---------------------------------------------------------------------*/
600 int
AP4_Track_GetType(AP4_Track * self)601 AP4_Track_GetType(AP4_Track* self)
602 {
603     return self->GetType();
604 }
605 
606 AP4_UI32
AP4_Track_GetHandlerType(AP4_Track * self)607 AP4_Track_GetHandlerType(AP4_Track* self)
608 {
609     return self->GetHandlerType();
610 }
611 
612 AP4_UI64
AP4_Track_GetDuration(AP4_Track * self)613 AP4_Track_GetDuration(AP4_Track* self)
614 {
615     return self->GetDuration();
616 }
617 
618 AP4_UI32
AP4_Track_GetDurationMs(AP4_Track * self)619 AP4_Track_GetDurationMs(AP4_Track* self)
620 {
621     return self->GetDurationMs();
622 }
623 
624 AP4_Cardinal
AP4_Track_GetSampleCount(AP4_Track * self)625 AP4_Track_GetSampleCount(AP4_Track* self)
626 {
627     return self->GetSampleCount();
628 }
629 
630 AP4_Result
AP4_Track_GetSample(AP4_Track * self,AP4_Ordinal index,AP4_Sample * sample)631 AP4_Track_GetSample(AP4_Track* self, AP4_Ordinal index, AP4_Sample* sample)
632 {
633     return self->GetSample(index, *sample);
634 }
635 
636 AP4_Result
AP4_Track_ReadSample(AP4_Track * self,AP4_Ordinal index,AP4_Sample * sample,AP4_DataBuffer * data)637 AP4_Track_ReadSample(AP4_Track*      self,
638                      AP4_Ordinal     index,
639                      AP4_Sample*     sample,
640                      AP4_DataBuffer* data)
641 {
642     return self->ReadSample(index, *sample, *data);
643 }
644 
645 AP4_Result
AP4_Track_GetSampleIndexForTimeStampMs(AP4_Track * self,AP4_UI32 ts,AP4_Ordinal * index)646 AP4_Track_GetSampleIndexForTimeStampMs(AP4_Track*   self,
647                                        AP4_UI32     ts,
648                                        AP4_Ordinal* index)
649 {
650     return self->GetSampleIndexForTimeStampMs(ts, *index);
651 }
652 
653 AP4_Ordinal
AP4_Track_GetNearestSyncSampleIndex(AP4_Track * self,AP4_Ordinal index,AP4_Boolean before)654 AP4_Track_GetNearestSyncSampleIndex(AP4_Track* self, AP4_Ordinal index, AP4_Boolean before)
655 {
656     return self->GetNearestSyncSampleIndex(index, before==AP4_TRUE);
657 }
658 
659 AP4_SampleDescription*
AP4_Track_GetSampleDescription(AP4_Track * self,AP4_Ordinal index)660 AP4_Track_GetSampleDescription(AP4_Track* self, AP4_Ordinal index)
661 {
662     return self->GetSampleDescription(index);
663 }
664 
665 AP4_UI32
AP4_Track_GetId(AP4_Track * self)666 AP4_Track_GetId(AP4_Track* self)
667 {
668     return self->GetId();
669 }
670 
671 AP4_Result
AP4_Track_SetId(AP4_Track * self,AP4_UI32 track_id)672 AP4_Track_SetId(AP4_Track* self, AP4_UI32 track_id)
673 {
674     return self->SetId(track_id);
675 }
676 
677 AP4_Result
AP4_Track_SetMovieTimeScale(AP4_Track * self,AP4_UI32 time_scale)678 AP4_Track_SetMovieTimeScale(AP4_Track* self, AP4_UI32 time_scale)
679 {
680     return self->SetMovieTimeScale(time_scale);
681 }
682 
683 AP4_UI32
AP4_Track_GetMediaTimeScale(AP4_Track * self)684 AP4_Track_GetMediaTimeScale(AP4_Track* self)
685 {
686     return self->GetMediaTimeScale();
687 }
688 
689 AP4_UI64
AP4_Track_GetMediaDuration(AP4_Track * self)690 AP4_Track_GetMediaDuration(AP4_Track* self)
691 {
692     return self->GetMediaDuration();
693 }
694 
695 const char*
AP4_Track_GetName(AP4_Track * self)696 AP4_Track_GetName(AP4_Track* self)
697 {
698     return self->GetTrackName();
699 }
700 
701 const char*
AP4_Track_GetLanguage(AP4_Track * self)702 AP4_Track_GetLanguage(AP4_Track* self)
703 {
704     return self->GetTrackLanguage();
705 }
706 
707 void
AP4_Track_Destroy(AP4_Track * self)708 AP4_Track_Destroy(AP4_Track* self)
709 {
710     delete self;
711 }
712 
713 AP4_Track*
AP4_Track_Create(int type,AP4_SyntheticSampleTable * sample_table,AP4_UI32 track_id,AP4_UI32 movie_time_scale,AP4_UI32 track_duration,AP4_UI32 media_time_scale,AP4_UI32 media_duration,const char * language,AP4_UI32 width,AP4_UI32 height)714 AP4_Track_Create(int                       type,
715                  AP4_SyntheticSampleTable* sample_table,
716                  AP4_UI32                  track_id,
717                  AP4_UI32                  movie_time_scale, /* 0 = use default */
718                  AP4_UI32                  track_duration,   /* in the movie time scale */
719                  AP4_UI32                  media_time_scale,
720                  AP4_UI32                  media_duration,   /* in the media time scale */
721                  const char*               language,
722                  AP4_UI32                  width,
723                  AP4_UI32                  height)
724 {
725     return new AP4_Track((AP4_Track::Type) type,
726                          sample_table,
727                          track_id,
728                          movie_time_scale,
729                          track_duration,
730                          media_time_scale,
731                          media_duration,
732                          language,
733                          width,
734                          height);
735 }
736 
737 /*----------------------------------------------------------------------
738 |   AP4_SampleDescription implementation
739 +---------------------------------------------------------------------*/
740 int
AP4_SampleDescription_GetType(AP4_SampleDescription * self)741 AP4_SampleDescription_GetType(AP4_SampleDescription* self)
742 {
743     return self->GetType();
744 }
745 
746 AP4_UI32
AP4_SampleDescription_GetFormat(AP4_SampleDescription * self)747 AP4_SampleDescription_GetFormat(AP4_SampleDescription* self)
748 {
749     return self->GetFormat();
750 }
751 
752 AP4_AudioSampleDescription*
AP4_SampleDescription_AsAudio(AP4_SampleDescription * self)753 AP4_SampleDescription_AsAudio(AP4_SampleDescription* self)
754 {
755     return AP4_DYNAMIC_CAST(AP4_AudioSampleDescription, self);
756 }
757 
758 AP4_VideoSampleDescription*
AP4_SampleDescription_AsVideo(AP4_SampleDescription * self)759 AP4_SampleDescription_AsVideo(AP4_SampleDescription* self)
760 {
761     return AP4_DYNAMIC_CAST(AP4_VideoSampleDescription, self);
762 }
763 
764 AP4_AvcSampleDescription*
AP4_SampleDescription_AsAvc(AP4_SampleDescription * self)765 AP4_SampleDescription_AsAvc(AP4_SampleDescription* self)
766 {
767     return AP4_DYNAMIC_CAST(AP4_AvcSampleDescription, self);
768 }
769 
770 AP4_MpegSampleDescription*
AP4_SampleDescription_AsMpeg(AP4_SampleDescription * self)771 AP4_SampleDescription_AsMpeg(AP4_SampleDescription* self)
772 {
773     return AP4_DYNAMIC_CAST(AP4_MpegSampleDescription, self);
774 }
775 
776 AP4_MpegAudioSampleDescription*
AP4_SampleDescription_AsMpegAudio(AP4_SampleDescription * self)777 AP4_SampleDescription_AsMpegAudio(AP4_SampleDescription* self)
778 {
779     return AP4_DYNAMIC_CAST(AP4_MpegAudioSampleDescription, self);
780 }
781 
782 AP4_UI32
AP4_AudioSampleDescription_GetSampleRate(AP4_AudioSampleDescription * self)783 AP4_AudioSampleDescription_GetSampleRate(AP4_AudioSampleDescription* self)
784 {
785     return self->GetSampleRate();
786 }
787 
788 AP4_UI16
AP4_AudioSampleDescription_GetSampleSize(AP4_AudioSampleDescription * self)789 AP4_AudioSampleDescription_GetSampleSize(AP4_AudioSampleDescription* self)
790 {
791     return self->GetSampleSize();
792 }
793 
794 AP4_UI16
AP4_AudioSampleDescription_GetChannelCount(AP4_AudioSampleDescription * self)795 AP4_AudioSampleDescription_GetChannelCount(AP4_AudioSampleDescription* self)
796 {
797     return self->GetChannelCount();
798 }
799 
800 AP4_UI32
AP4_VideoSampleDescription_GetWidth(AP4_VideoSampleDescription * self)801 AP4_VideoSampleDescription_GetWidth(AP4_VideoSampleDescription* self)
802 {
803     return self->GetWidth();
804 }
805 
806 
807 AP4_UI16
AP4_VideoSampleDescription_GetHeight(AP4_VideoSampleDescription * self)808 AP4_VideoSampleDescription_GetHeight(AP4_VideoSampleDescription* self)
809 {
810     return self->GetHeight();
811 }
812 
813 AP4_UI16
AP4_VideoSampleDescription_GetDepth(AP4_VideoSampleDescription * self)814 AP4_VideoSampleDescription_GetDepth(AP4_VideoSampleDescription* self)
815 {
816     return self->GetDepth();
817 }
818 
819 const char*
AP4_VideoSampleDescription_GetCompressorName(AP4_VideoSampleDescription * self)820 AP4_VideoSampleDescription_GetCompressorName(AP4_VideoSampleDescription* self)
821 {
822     return self->GetCompressorName();
823 }
824 
825 AP4_UI08
AP4_AvcSampleDescription_GetConfigurationVersion(AP4_AvcSampleDescription * self)826 AP4_AvcSampleDescription_GetConfigurationVersion(AP4_AvcSampleDescription* self)
827 {
828     return self->GetConfigurationVersion();
829 }
830 
831 AP4_UI08
AP4_AvcSampleDescription_GetProfile(AP4_AvcSampleDescription * self)832 AP4_AvcSampleDescription_GetProfile(AP4_AvcSampleDescription* self)
833 {
834     return self->GetProfile();
835 }
836 
837 AP4_UI08
AP4_AvcSampleDescription_GetLevel(AP4_AvcSampleDescription * self)838 AP4_AvcSampleDescription_GetLevel(AP4_AvcSampleDescription* self)
839 {
840     return self->GetLevel();
841 }
842 
843 AP4_UI08
AP4_AvcSampleDescription_GetProfileCompatibility(AP4_AvcSampleDescription * self)844 AP4_AvcSampleDescription_GetProfileCompatibility(AP4_AvcSampleDescription* self)
845 {
846     return self->GetProfileCompatibility();
847 }
848 
849 AP4_UI08
AP4_AvcSampleDescription_GetNaluLengthSize(AP4_AvcSampleDescription * self)850 AP4_AvcSampleDescription_GetNaluLengthSize(AP4_AvcSampleDescription* self)
851 {
852     return self->GetNaluLengthSize();
853 }
854 
855 AP4_Cardinal
AP4_AvcSampleDescription_GetSequenceParameterCount(AP4_AvcSampleDescription * self)856 AP4_AvcSampleDescription_GetSequenceParameterCount(AP4_AvcSampleDescription* self)
857 {
858     return self->GetSequenceParameters().ItemCount();
859 }
860 
861 const AP4_DataBuffer*
AP4_AvcSampleDescription_GetSequenceParameter(AP4_AvcSampleDescription * self,AP4_Ordinal index)862 AP4_AvcSampleDescription_GetSequenceParameter(AP4_AvcSampleDescription* self,
863                                               AP4_Ordinal               index)
864 {
865     AP4_Array<AP4_DataBuffer>& params = self->GetSequenceParameters();
866     if (index >= params.ItemCount()) {
867         return NULL;
868     } else {
869         return &params[index];
870     }
871 }
872 
873 AP4_Cardinal
AP4_AvcSampleDescription_GetPictureParameterCount(AP4_AvcSampleDescription * self)874 AP4_AvcSampleDescription_GetPictureParameterCount(AP4_AvcSampleDescription* self)
875 {
876     return self->GetPictureParameters().ItemCount();
877 }
878 
879 const AP4_DataBuffer*
AP4_AvcSampleDescription_GetPictureParameter(AP4_AvcSampleDescription * self,AP4_Ordinal index)880 AP4_AvcSampleDescription_GetPictureParameter(AP4_AvcSampleDescription* self,
881                                              AP4_Ordinal               index)
882 {
883     AP4_Array<AP4_DataBuffer>& params = self->GetPictureParameters();
884     if (index >= params.ItemCount()) {
885         return NULL;
886     } else {
887         return &params[index];
888     }
889 }
890 
891 const AP4_DataBuffer*
AP4_AvcSampleDescription_GetRawBytes(AP4_AvcSampleDescription * self)892 AP4_AvcSampleDescription_GetRawBytes(AP4_AvcSampleDescription* self)
893 {
894     return &self->GetRawBytes();
895 }
896 
897 const char*
AP4_AvcSampleDescription_GetProfileName(AP4_UI08 profile)898 AP4_AvcSampleDescription_GetProfileName(AP4_UI08 profile)
899 {
900     return AP4_AvcSampleDescription::GetProfileName(profile);
901 }
902 
903 AP4_UI08
AP4_MpegSampleDescription_GetStreamType(AP4_MpegSampleDescription * self)904 AP4_MpegSampleDescription_GetStreamType(AP4_MpegSampleDescription* self)
905 {
906     return self->GetStreamType();
907 }
908 
909 AP4_UI08
AP4_MpegSampleDescription_GetObjectTypeId(AP4_MpegSampleDescription * self)910 AP4_MpegSampleDescription_GetObjectTypeId(AP4_MpegSampleDescription* self)
911 {
912     return self->GetObjectTypeId();
913 }
914 
915 AP4_UI32
AP4_MpegSampleDescription_GetBufferSize(AP4_MpegSampleDescription * self)916 AP4_MpegSampleDescription_GetBufferSize(AP4_MpegSampleDescription* self)
917 {
918     return self->GetBufferSize();
919 }
920 
921 AP4_UI32
AP4_MpegSampleDescription_GetMaxBitrate(AP4_MpegSampleDescription * self)922 AP4_MpegSampleDescription_GetMaxBitrate(AP4_MpegSampleDescription* self)
923 {
924     return self->GetMaxBitrate();
925 }
926 
927 AP4_UI32
AP4_MpegSampleDescription_GetAvgBitrate(AP4_MpegSampleDescription * self)928 AP4_MpegSampleDescription_GetAvgBitrate(AP4_MpegSampleDescription* self)
929 {
930     return self->GetAvgBitrate();
931 }
932 
933 const AP4_DataBuffer*
AP4_MpegSampleDescription_GetDecoderInfo(AP4_MpegSampleDescription * self)934 AP4_MpegSampleDescription_GetDecoderInfo(AP4_MpegSampleDescription* self)
935 {
936     return &self->GetDecoderInfo();
937 }
938 
939 AP4_UI08
AP4_MpegAudioSampleDescription_GetMpeg4AudioObjectType(AP4_MpegAudioSampleDescription * self)940 AP4_MpegAudioSampleDescription_GetMpeg4AudioObjectType(AP4_MpegAudioSampleDescription* self)
941 {
942     return self->GetMpeg4AudioObjectType();
943 }
944 
945 const char*
AP4_MpegAudioSampleDescription_GetMpegAudioObjectTypeString(AP4_UI08 type)946 AP4_MpegAudioSampleDescription_GetMpegAudioObjectTypeString(AP4_UI08 type)
947 {
948     return AP4_MpegAudioSampleDescription::GetMpeg4AudioObjectTypeString(type);
949 }
950 
951 AP4_SampleDescription*
AP4_ProtectedSampleDescription_GetOriginalSampleDescription(AP4_ProtectedSampleDescription * self)952 AP4_ProtectedSampleDescription_GetOriginalSampleDescription(AP4_ProtectedSampleDescription* self)
953 {
954     return self->GetOriginalSampleDescription();
955 }
956 
957 AP4_UI32
AP4_ProtectedSampleDescription_GetOriginalFormat(AP4_ProtectedSampleDescription * self)958 AP4_ProtectedSampleDescription_GetOriginalFormat(AP4_ProtectedSampleDescription* self)
959 {
960     return self->GetOriginalFormat();
961 }
962 
963 AP4_UI32
AP4_ProtectedSampleDescription_GetSchemeType(AP4_ProtectedSampleDescription * self)964 AP4_ProtectedSampleDescription_GetSchemeType(AP4_ProtectedSampleDescription* self)
965 {
966     return self->GetSchemeType();
967 }
968 
969 AP4_UI32
AP4_ProtectedSampleDescription_GetSchemeVersion(AP4_ProtectedSampleDescription * self)970 AP4_ProtectedSampleDescription_GetSchemeVersion(AP4_ProtectedSampleDescription* self)
971 {
972     return self->GetSchemeVersion();
973 }
974 
975 const char*
AP4_ProtectedSampleDescription_GetSchemeUri(AP4_ProtectedSampleDescription * self)976 AP4_ProtectedSampleDescription_GetSchemeUri(AP4_ProtectedSampleDescription* self)
977 {
978     return self->GetSchemeUri().GetChars();
979 }
980 
981 void
AP4_SampleDescription_Destroy(AP4_SampleDescription * self)982 AP4_SampleDescription_Destroy(AP4_SampleDescription* self)
983 {
984     delete self;
985 }
986 
987 AP4_SampleDescription*
AP4_MpegVideoSampleDescription_Create(AP4_UI08 oti,AP4_UI16 width,AP4_UI16 height,AP4_UI16 depth,const char * compressor_name,const AP4_Byte * decoder_info,AP4_Size decoder_info_size,AP4_UI32 buffer_size,AP4_UI32 max_bitrate,AP4_UI32 avg_bitrate)988 AP4_MpegVideoSampleDescription_Create(AP4_UI08        oti,
989                                       AP4_UI16        width,
990                                       AP4_UI16        height,
991                                       AP4_UI16        depth,
992                                       const char*     compressor_name,
993                                       const AP4_Byte* decoder_info,
994                                       AP4_Size        decoder_info_size,
995                                       AP4_UI32        buffer_size,
996                                       AP4_UI32        max_bitrate,
997                                       AP4_UI32        avg_bitrate)
998 {
999     AP4_DataBuffer info(decoder_info, decoder_info_size);
1000     return new AP4_MpegVideoSampleDescription(oti,
1001                                               width,
1002                                               height,
1003                                               depth,
1004                                               compressor_name,
1005                                               &info,
1006                                               buffer_size,
1007                                               max_bitrate,
1008                                               avg_bitrate);
1009 }
1010 
1011 AP4_SampleDescription*
AP4_MpegAudioSampleDescription_Create(AP4_UI08 oti,AP4_UI32 sample_rate,AP4_UI32 sample_size,AP4_UI32 channel_count,const AP4_Byte * decoder_info,AP4_Size decoder_info_size,AP4_UI32 buffer_size,AP4_UI32 max_bitrate,AP4_UI32 avg_bitrate)1012 AP4_MpegAudioSampleDescription_Create(AP4_UI08        oti,
1013                                       AP4_UI32        sample_rate,
1014                                       AP4_UI32        sample_size,
1015                                       AP4_UI32        channel_count,
1016                                       const AP4_Byte* decoder_info,
1017                                       AP4_Size        decoder_info_size,
1018                                       AP4_UI32        buffer_size,
1019                                       AP4_UI32        max_bitrate,
1020                                       AP4_UI32        avg_bitrate)
1021 {
1022     AP4_DataBuffer info(decoder_info, decoder_info_size);
1023     return new AP4_MpegAudioSampleDescription(oti,
1024                                               sample_rate,
1025                                               sample_size,
1026                                               channel_count,
1027                                               &info,
1028                                               buffer_size,
1029                                               max_bitrate,
1030                                               avg_bitrate);
1031 }
1032 
1033 AP4_SampleDescription*
AP4_MpegSystemSampleDescription_Create(AP4_UI08 stream_type,AP4_UI08 oti,const AP4_Byte * decoder_info,AP4_Size decoder_info_size,AP4_UI32 buffer_size,AP4_UI32 max_bitrate,AP4_UI32 avg_bitrate)1034 AP4_MpegSystemSampleDescription_Create(AP4_UI08        stream_type,
1035                                        AP4_UI08        oti,
1036                                        const AP4_Byte* decoder_info,
1037                                        AP4_Size        decoder_info_size,
1038                                        AP4_UI32        buffer_size,
1039                                        AP4_UI32        max_bitrate,
1040                                        AP4_UI32        avg_bitrate)
1041 {
1042     AP4_DataBuffer info(decoder_info, decoder_info_size);
1043     return new AP4_MpegSystemSampleDescription(stream_type,
1044                                                oti,
1045                                                &info,
1046                                                buffer_size,
1047                                                max_bitrate,
1048                                                avg_bitrate);
1049 }
1050 
1051 AP4_SampleDescription*
AP4_AvcSampleDescription_Create(AP4_UI32 format,AP4_UI16 width,AP4_UI16 height,AP4_UI16 depth,const char * compressor_name,AP4_UI08 profile,AP4_UI08 level,AP4_UI08 profile_compatibility,AP4_UI08 nalu_length_size,AP4_UI08 chroma_format,AP4_UI08 bit_depth_luma_minus8,AP4_UI08 bit_depth_chroma_minus8,AP4_DataBuffer ** sequence_parameters,AP4_Size sequence_parameter_count,AP4_DataBuffer ** picture_parameters,AP4_Size picture_parameter_count)1052 AP4_AvcSampleDescription_Create(AP4_UI32         format,
1053                                 AP4_UI16         width,
1054                                 AP4_UI16         height,
1055                                 AP4_UI16         depth,
1056                                 const char*      compressor_name,
1057                                 AP4_UI08         profile,
1058                                 AP4_UI08         level,
1059                                 AP4_UI08         profile_compatibility,
1060                                 AP4_UI08         nalu_length_size,
1061                                 AP4_UI08         chroma_format,
1062                                 AP4_UI08         bit_depth_luma_minus8,
1063                                 AP4_UI08         bit_depth_chroma_minus8,
1064                                 AP4_DataBuffer** sequence_parameters,
1065                                 AP4_Size         sequence_parameter_count,
1066                                 AP4_DataBuffer** picture_parameters,
1067                                 AP4_Size         picture_parameter_count)
1068 {
1069     AP4_Array<AP4_DataBuffer> sequence_params;
1070     AP4_Array<AP4_DataBuffer> picture_params;
1071     AP4_Ordinal i;
1072 
1073     for (i=0; i<sequence_parameter_count; i++) {
1074         sequence_params.Append(*sequence_parameters[i]);
1075     }
1076     for (i=0; i<picture_parameter_count; i++) {
1077         picture_params.Append(*picture_parameters[i]);
1078     }
1079 
1080     return new AP4_AvcSampleDescription(format,
1081                                         width,
1082                                         height,
1083                                         depth,
1084                                         compressor_name,
1085                                         profile,
1086                                         level,
1087                                         profile_compatibility,
1088                                         nalu_length_size,
1089                                         chroma_format,
1090                                         bit_depth_luma_minus8,
1091                                         bit_depth_chroma_minus8,
1092                                         sequence_params,
1093                                         picture_params);
1094 }
1095 
1096 /*----------------------------------------------------------------------
1097 |   AP4_Sample implementation
1098 +---------------------------------------------------------------------*/
1099 AP4_Result
AP4_Sample_ReadData(AP4_Sample * self,AP4_DataBuffer * data)1100 AP4_Sample_ReadData(AP4_Sample* self, AP4_DataBuffer* data)
1101 {
1102     return self->ReadData(*data);
1103 }
1104 
1105 AP4_Result
AP4_Sample_ReadPartialData(AP4_Sample * self,AP4_DataBuffer * data,AP4_Size size,AP4_Size offset)1106 AP4_Sample_ReadPartialData(AP4_Sample*     self,
1107                            AP4_DataBuffer* data,
1108                            AP4_Size        size,
1109                            AP4_Size        offset)
1110 {
1111     return self->ReadData(*data, size, offset);
1112 }
1113 
1114 AP4_ByteStream*
AP4_Sample_GetDataStream(AP4_Sample * self)1115 AP4_Sample_GetDataStream(AP4_Sample* self)
1116 {
1117     return self->GetDataStream();
1118 }
1119 
1120 void
AP4_Sample_SetDataStream(AP4_Sample * self,AP4_ByteStream * stream)1121 AP4_Sample_SetDataStream(AP4_Sample* self, AP4_ByteStream* stream)
1122 {
1123     self->SetDataStream(*stream);
1124 }
1125 
1126 AP4_Position
AP4_Sample_GetOffset(AP4_Sample * self)1127 AP4_Sample_GetOffset(AP4_Sample* self)
1128 {
1129     return self->GetOffset();
1130 }
1131 
1132 void
AP4_Sample_SetOffset(AP4_Sample * self,AP4_Position offset)1133 AP4_Sample_SetOffset(AP4_Sample* self, AP4_Position offset)
1134 {
1135     self->SetOffset(offset);
1136 }
1137 
1138 AP4_Size
AP4_Sample_GetSize(AP4_Sample * self)1139 AP4_Sample_GetSize(AP4_Sample* self)
1140 {
1141     return self->GetSize();
1142 }
1143 
1144 void
AP4_Sample_SetSize(AP4_Sample * self,AP4_Size size)1145 AP4_Sample_SetSize(AP4_Sample* self, AP4_Size size)
1146 {
1147     self->SetSize(size);
1148 }
1149 
1150 AP4_Ordinal
AP4_Sample_GetDescriptionIndex(AP4_Sample * self)1151 AP4_Sample_GetDescriptionIndex(AP4_Sample* self)
1152 {
1153     return self->GetDescriptionIndex();
1154 }
1155 
1156 void
AP4_Sample_SetDescriptionIndex(AP4_Sample * self,AP4_Ordinal index)1157 AP4_Sample_SetDescriptionIndex(AP4_Sample* self, AP4_Ordinal index)
1158 {
1159     self->SetDescriptionIndex(index);
1160 }
1161 
1162 AP4_UI64
AP4_Sample_GetDts(AP4_Sample * self)1163 AP4_Sample_GetDts(AP4_Sample* self)
1164 {
1165     return self->GetDts();
1166 }
1167 
1168 void
AP4_SampleSetDts(AP4_Sample * self,AP4_UI64 dts)1169 AP4_SampleSetDts(AP4_Sample* self, AP4_UI64 dts)
1170 {
1171     self->SetDts(dts);
1172 }
1173 
1174 AP4_UI64
AP4_Sample_GetCts(AP4_Sample * self)1175 AP4_Sample_GetCts(AP4_Sample* self)
1176 {
1177     return self->GetCts();
1178 }
1179 
1180 void
AP4_Sample_SetCts(AP4_Sample * self,AP4_UI64 cts)1181 AP4_Sample_SetCts(AP4_Sample* self, AP4_UI64 cts)
1182 {
1183     self->SetCts(cts);
1184 }
1185 
1186 AP4_UI32
AP4_Sample_GetDuration(AP4_Sample * self)1187 AP4_Sample_GetDuration(AP4_Sample* self)
1188 {
1189     return self->GetDuration();
1190 }
1191 
1192 void
AP4_Sample_SetDuration(AP4_Sample * self,AP4_UI32 duration)1193 AP4_Sample_SetDuration(AP4_Sample* self, AP4_UI32 duration)
1194 {
1195     self->SetDuration(duration);
1196 }
1197 
1198 int
AP4_Sample_IsSync(AP4_Sample * self)1199 AP4_Sample_IsSync(AP4_Sample* self)
1200 {
1201     return self->IsSync();
1202 }
1203 
1204 void
AP4_Sample_SetSync(AP4_Sample * self,int is_sync)1205 AP4_Sample_SetSync(AP4_Sample* self, int is_sync)
1206 {
1207     self->SetSync(is_sync?true:false);
1208 }
1209 
1210 void
AP4_Sample_Destroy(AP4_Sample * self)1211 AP4_Sample_Destroy(AP4_Sample* self)
1212 {
1213     delete self;
1214 }
1215 
1216 AP4_Sample*
AP4_Sample_CreateEmpty(void)1217 AP4_Sample_CreateEmpty(void)
1218 {
1219     return new AP4_Sample();
1220 }
1221 
1222 AP4_Sample*
AP4_Sample_Create(AP4_ByteStream * data_stream,AP4_Position offset,AP4_Size size,AP4_UI32 duration,AP4_Ordinal description_index,AP4_UI32 dts,AP4_UI32 cts_delta,int is_sync)1223 AP4_Sample_Create(AP4_ByteStream* data_stream,
1224                   AP4_Position    offset,
1225                   AP4_Size        size,
1226                   AP4_UI32        duration,
1227                   AP4_Ordinal     description_index,
1228                   AP4_UI32        dts,
1229                   AP4_UI32        cts_delta,
1230                   int             is_sync)
1231 {
1232     return new AP4_Sample(*data_stream,
1233                           offset,
1234                           size,
1235                           duration,
1236                           description_index,
1237                           dts,
1238                           cts_delta,
1239                           is_sync?true:false);
1240 }
1241 
1242 AP4_Sample*
AP4_Sample_Clone(const AP4_Sample * other)1243 AP4_Sample_Clone(const AP4_Sample* other)
1244 {
1245     return new AP4_Sample(*other);
1246 }
1247 
1248 /*----------------------------------------------------------------------
1249 |   AP4_SyntheticSampleTable implementation
1250 +---------------------------------------------------------------------*/
1251 AP4_Result
AP4_SyntheticSampleTable_AddSampleDescription(AP4_SyntheticSampleTable * self,AP4_SampleDescription * desc)1252 AP4_SyntheticSampleTable_AddSampleDescription(AP4_SyntheticSampleTable* self,
1253                                               AP4_SampleDescription*    desc)
1254 {
1255     return self->AddSampleDescription(desc);
1256 }
1257 
1258 AP4_Result
AP4_SyntheticSampleTable_AddSample(AP4_SyntheticSampleTable * self,AP4_ByteStream * data_stream,AP4_Position offset,AP4_Size size,AP4_UI32 duration,AP4_Ordinal desc_index,AP4_UI32 dts,AP4_UI32 cts_delta,int is_sync)1259 AP4_SyntheticSampleTable_AddSample(AP4_SyntheticSampleTable* self,
1260                                    AP4_ByteStream*           data_stream,
1261                                    AP4_Position              offset,
1262                                    AP4_Size                  size,
1263                                    AP4_UI32                  duration,
1264                                    AP4_Ordinal               desc_index,
1265                                    AP4_UI32                  dts,
1266                                    AP4_UI32                  cts_delta,
1267                                    int                       is_sync)
1268 {
1269     return self->AddSample(*data_stream,
1270                            offset,
1271                            size,
1272                            duration,
1273                            desc_index,
1274                            dts,
1275                            cts_delta,
1276                            is_sync?true:false);
1277 }
1278 
1279 void
AP4_SyntheticSampleTable_Destroy(AP4_SyntheticSampleTable * self)1280 AP4_SyntheticSampleTable_Destroy(AP4_SyntheticSampleTable* self)
1281 {
1282     delete self;
1283 }
1284 
1285 AP4_SyntheticSampleTable*
AP4_SyntheticSampleTable_Create(AP4_Cardinal chunk_size)1286 AP4_SyntheticSampleTable_Create(AP4_Cardinal chunk_size)
1287 {
1288     return new AP4_SyntheticSampleTable(chunk_size);
1289 }
1290 
1291 /*----------------------------------------------------------------------
1292 |   AP4_DelegatorAtomInspector
1293 +---------------------------------------------------------------------*/
1294 class AP4_DelegatorAtomInspector : public AP4_AtomInspector
1295 {
1296 public:
AP4_DelegatorAtomInspector(AP4_AtomInspectorDelegate * delegate)1297     AP4_DelegatorAtomInspector(AP4_AtomInspectorDelegate* delegate) :
1298         m_Delegate(delegate) {}
1299     ~AP4_DelegatorAtomInspector();
1300     void StartElement(const char* name, const char* extra);
1301     void EndElement();
1302     void AddField(const char* name, AP4_UI64 value, FormatHint hint);
1303     void AddFieldF(const char* name, float value, FormatHint hint);
1304     void AddField(const char* name, const char* value, FormatHint hint);
1305     void AddField(const char*          name,
1306                   const unsigned char* bytes,
1307                   AP4_Size             byte_count,
1308                   FormatHint           hint);
1309 private:
1310     AP4_AtomInspectorDelegate* m_Delegate;
1311 };
1312 
~AP4_DelegatorAtomInspector()1313 AP4_DelegatorAtomInspector::~AP4_DelegatorAtomInspector()
1314 {
1315     if (m_Delegate->Destroy) {
1316         m_Delegate->Destroy(m_Delegate);
1317     }
1318 }
1319 
1320 void
StartElement(const char * name,const char * extra)1321 AP4_DelegatorAtomInspector::StartElement(const char* name, const char* extra)
1322 {
1323     m_Delegate->StartElement(m_Delegate, name, extra);
1324 }
1325 
1326 void
EndElement()1327 AP4_DelegatorAtomInspector::EndElement()
1328 {
1329     m_Delegate->EndElement(m_Delegate);
1330 }
1331 
1332 void
AddField(const char * name,AP4_UI64 value,FormatHint hint)1333 AP4_DelegatorAtomInspector::AddField(const char* name,
1334                                      AP4_UI64    value,
1335                                      FormatHint  hint)
1336 {
1337     m_Delegate->AddIntField(m_Delegate, name, value, hint);
1338 }
1339 
1340 void
AddFieldF(const char * name,float value,FormatHint hint)1341 AP4_DelegatorAtomInspector::AddFieldF(const char* name,
1342                                       float    value,
1343                                       FormatHint  hint)
1344 {
1345     m_Delegate->AddFloatField(m_Delegate, name, value, hint);
1346 }
1347 
1348 void
AddField(const char * name,const char * value,FormatHint hint)1349 AP4_DelegatorAtomInspector::AddField(const char* name,
1350                                      const char* value,
1351                                      FormatHint  hint)
1352 {
1353     m_Delegate->AddStringField(m_Delegate, name, value, hint);
1354 }
1355 
1356 void
AddField(const char * name,const AP4_Byte * bytes,AP4_Size byte_count,FormatHint hint)1357 AP4_DelegatorAtomInspector::AddField(const char*     name,
1358                                      const AP4_Byte* bytes,
1359                                      AP4_Size        byte_count,
1360                                      FormatHint      hint)
1361 {
1362     m_Delegate->AddBytesField(m_Delegate, name, bytes, byte_count, hint);
1363 }
1364 
1365 /*----------------------------------------------------------------------
1366 |   AP4_AtomInspector implementation
1367 +---------------------------------------------------------------------*/
1368 void
AP4_AtomInspector_Destroy(AP4_AtomInspector * self)1369 AP4_AtomInspector_Destroy(AP4_AtomInspector* self)
1370 {
1371     delete self;
1372 }
1373 
1374 AP4_AtomInspector*
AP4_PrintInspector_Create(AP4_ByteStream * stream)1375 AP4_PrintInspector_Create(AP4_ByteStream* stream)
1376 {
1377     return new AP4_PrintInspector(*stream);
1378 }
1379 
1380 AP4_AtomInspector*
AP4_AtomInspector_FromDelegate(AP4_AtomInspectorDelegate * delegate)1381 AP4_AtomInspector_FromDelegate(AP4_AtomInspectorDelegate* delegate)
1382 {
1383     return new AP4_DelegatorAtomInspector(delegate);
1384 }
1385 
1386 
1387 
1388