-
Notifications
You must be signed in to change notification settings - Fork 11
/
mp4parser.h
5843 lines (4761 loc) · 172 KB
/
mp4parser.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/* LGPL-3.0 Simple, Minimalistic, MP4 parser [https://github.com/gozfree/libraries]
* ©2018 Yuichiro Nakada
*
* Basic usage:
*
* */
/******************************************************************************
* Copyright (C) 2014-2016
* file: libmp4parser-patch.h
* author: gozfree <[email protected]>
* created: 2016-08-12 00:05
* updated: 2016-08-12 00:05
******************************************************************************/
#ifndef LIBMP4PARSER_PATCH_H
#define LIBMP4PARSER_PATCH_H
#ifndef _GNU_SOURCE
#define _GNU_SOURCE /* See feature_test_macros(7) */
#endif
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#ifdef __cplusplus
extern "C" {
#endif
#define typeof __typeof__
/* redefine bool to fix complie error */
#ifndef bool
#define bool uint8_t
#define true 1
#define false 0
#endif
/* define from vlc */
#ifdef WORDS_BIGENDIAN
# define VLC_FOURCC( a, b, c, d ) \
( ((uint32_t)d) | ( ((uint32_t)c) << 8 ) \
| ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) )
# define VLC_TWOCC( a, b ) \
( (uint16_t)(b) | ( (uint16_t)(a) << 8 ) )
#else
# define VLC_FOURCC( a, b, c, d ) \
( ((uint32_t)a) | ( ((uint32_t)b) << 8 ) \
| ( ((uint32_t)c) << 16 ) | ( ((uint32_t)d) << 24 ) )
# define VLC_TWOCC( a, b ) \
( (uint16_t)(a) | ( (uint16_t)(b) << 8 ) )
#endif
/* implement stream */
typedef struct stream {
void *(*open)(struct stream *stream_s, const char *filename, int mode);
int (*read)(struct stream *stream_s, void *buf, int size);
int (*write)(struct stream *stream_s, void *buf, int size);
int (*peek)(struct stream *stream_s, const uint8_t **buf, int size);
uint64_t (*seek)(struct stream *stream_s, int64_t offset, int whence);
int64_t (*tell)(struct stream *stream_s);
int64_t (*size)(struct stream *stream_s);
int (*close)(struct stream *stream_s);
void *opaque;
void **priv_buf;//store peek malloc buffer
int priv_buf_num;
} stream_t;
#define MODE_READ (1)
#define MODE_WRITE (2)
#define MODE_READWRITEFILTER (3)
#define MODE_EXISTING (4)
#define MODE_CREATE (8)
stream_t* create_file_stream();
void destory_file_stream(stream_t* stream_s);
#define stream_open(s, filename, mode) ((stream_t*)s)->open(((stream_t*)s), filename, mode)
#define stream_close(s) ((stream_t*)s)->close(((stream_t*)s))
#ifdef __cplusplus
}
#endif
#endif
// libmp4parser.h
#ifndef LIBMP4PARSER_H
#define LIBMP4PARSER_H
//#include "libmp4parser-patch.h"
#ifdef __cplusplus
extern "C" {
#endif
#define BLOCK16x16 (1<<16)
#define ATOM_root VLC_FOURCC( 'r', 'o', 'o', 't' )
#define ATOM_uuid VLC_FOURCC( 'u', 'u', 'i', 'd' )
#define ATOM_ftyp VLC_FOURCC( 'f', 't', 'y', 'p' )
#define ATOM_moov VLC_FOURCC( 'm', 'o', 'o', 'v' )
#define ATOM_foov VLC_FOURCC( 'f', 'o', 'o', 'v' )
#define ATOM_cmov VLC_FOURCC( 'c', 'm', 'o', 'v' )
#define ATOM_dcom VLC_FOURCC( 'd', 'c', 'o', 'm' )
#define ATOM_cmvd VLC_FOURCC( 'c', 'm', 'v', 'd' )
#define ATOM_moof VLC_FOURCC( 'm', 'o', 'o', 'f' )
#define ATOM_mdat VLC_FOURCC( 'm', 'd', 'a', 't' )
#define ATOM_skip VLC_FOURCC( 's', 'k', 'i', 'p' )
#define ATOM_free VLC_FOURCC( 'f', 'r', 'e', 'e' )
#define ATOM_udta VLC_FOURCC( 'u', 'd', 't', 'a' )
#define ATOM_wide VLC_FOURCC( 'w', 'i', 'd', 'e' )
#define ATOM_binm VLC_FOURCC( 0x82, 0x82, 0x7f, 0x7d ) /* binary Computer Graphics Metafile */
#define ATOM_data VLC_FOURCC( 'd', 'a', 't', 'a' )
#define ATOM_trak VLC_FOURCC( 't', 'r', 'a', 'k' )
#define ATOM_mvhd VLC_FOURCC( 'm', 'v', 'h', 'd' )
#define ATOM_tkhd VLC_FOURCC( 't', 'k', 'h', 'd' )
#define ATOM_tref VLC_FOURCC( 't', 'r', 'e', 'f' )
#define ATOM_mdia VLC_FOURCC( 'm', 'd', 'i', 'a' )
#define ATOM_mdhd VLC_FOURCC( 'm', 'd', 'h', 'd' )
#define ATOM_hdlr VLC_FOURCC( 'h', 'd', 'l', 'r' )
#define ATOM_minf VLC_FOURCC( 'm', 'i', 'n', 'f' )
#define ATOM_vmhd VLC_FOURCC( 'v', 'm', 'h', 'd' )
#define ATOM_smhd VLC_FOURCC( 's', 'm', 'h', 'd' )
#define ATOM_hmhd VLC_FOURCC( 'h', 'm', 'h', 'd' )
#define ATOM_dinf VLC_FOURCC( 'd', 'i', 'n', 'f' )
#define ATOM_url VLC_FOURCC( 'u', 'r', 'l', ' ' )
#define ATOM_urn VLC_FOURCC( 'u', 'r', 'n', ' ' )
#define ATOM_dref VLC_FOURCC( 'd', 'r', 'e', 'f' )
#define ATOM_stbl VLC_FOURCC( 's', 't', 'b', 'l' )
#define ATOM_stts VLC_FOURCC( 's', 't', 't', 's' )
#define ATOM_ctts VLC_FOURCC( 'c', 't', 't', 's' )
#define ATOM_stsd VLC_FOURCC( 's', 't', 's', 'd' )
#define ATOM_stsz VLC_FOURCC( 's', 't', 's', 'z' )
#define ATOM_stz2 VLC_FOURCC( 's', 't', 'z', '2' )
#define ATOM_stsc VLC_FOURCC( 's', 't', 's', 'c' )
#define ATOM_stco VLC_FOURCC( 's', 't', 'c', 'o' )
#define ATOM_co64 VLC_FOURCC( 'c', 'o', '6', '4' )
#define ATOM_stss VLC_FOURCC( 's', 't', 's', 's' )
#define ATOM_stsh VLC_FOURCC( 's', 't', 's', 'h' )
#define ATOM_stdp VLC_FOURCC( 's', 't', 'd', 'p' )
#define ATOM_padb VLC_FOURCC( 'p', 'a', 'd', 'b' )
#define ATOM_edts VLC_FOURCC( 'e', 'd', 't', 's' )
#define ATOM_elst VLC_FOURCC( 'e', 'l', 's', 't' )
#define ATOM_mvex VLC_FOURCC( 'm', 'v', 'e', 'x' )
#define ATOM_sdtp VLC_FOURCC( 's', 'd', 't', 'p' )
#define ATOM_trex VLC_FOURCC( 't', 'r', 'e', 'x' )
#define ATOM_mehd VLC_FOURCC( 'm', 'e', 'h', 'd' )
#define ATOM_mfhd VLC_FOURCC( 'm', 'f', 'h', 'd' )
#define ATOM_traf VLC_FOURCC( 't', 'r', 'a', 'f' )
#define ATOM_sidx VLC_FOURCC( 's', 'i', 'd', 'x' )
#define ATOM_tfhd VLC_FOURCC( 't', 'f', 'h', 'd' )
#define ATOM_trun VLC_FOURCC( 't', 'r', 'u', 'n' )
#define ATOM_cprt VLC_FOURCC( 'c', 'p', 'r', 't' )
#define ATOM_iods VLC_FOURCC( 'i', 'o', 'd', 's' )
#define ATOM_pasp VLC_FOURCC( 'p', 'a', 's', 'p' )
#define ATOM_mfra VLC_FOURCC( 'm', 'f', 'r', 'a' )
#define ATOM_mfro VLC_FOURCC( 'm', 'f', 'r', 'o' )
#define ATOM_tfra VLC_FOURCC( 't', 'f', 'r', 'a' )
#define ATOM_nmhd VLC_FOURCC( 'n', 'm', 'h', 'd' )
#define ATOM_mp2v VLC_FOURCC( 'm', 'p', '2', 'v' )
#define ATOM_mp4v VLC_FOURCC( 'm', 'p', '4', 'v' )
#define ATOM_mp4a VLC_FOURCC( 'm', 'p', '4', 'a' )
#define ATOM_mp4s VLC_FOURCC( 'm', 'p', '4', 's' )
#define ATOM_vide VLC_FOURCC( 'v', 'i', 'd', 'e' )
#define ATOM_soun VLC_FOURCC( 's', 'o', 'u', 'n' )
#define ATOM_hint VLC_FOURCC( 'h', 'i', 'n', 't' )
#define ATOM_hdv2 VLC_FOURCC( 'h', 'd', 'v', '2' )
#define ATOM_dpnd VLC_FOURCC( 'd', 'p', 'n', 'd' )
#define ATOM_ipir VLC_FOURCC( 'i', 'p', 'i', 'r' )
#define ATOM_mpod VLC_FOURCC( 'm', 'p', 'o', 'd' )
#define ATOM_hnti VLC_FOURCC( 'h', 'n', 't', 'i' )
#define ATOM_rtp VLC_FOURCC( 'r', 't', 'p', ' ' )
#define ATOM_isom VLC_FOURCC( 'i', 's', 'o', 'm' )
#define ATOM_3gp4 VLC_FOURCC( '3', 'g', 'p', '4' )
#define ATOM_esds VLC_FOURCC( 'e', 's', 'd', 's' )
#define ATOM_lpcm VLC_FOURCC( 'l', 'p', 'c', 'm' )
#define ATOM__mp3 VLC_FOURCC( '.', 'm', 'p', '3' )
#define ATOM_ms02 VLC_FOURCC( 'm', 's', 0x0, 0x02 )
#define ATOM_ms11 VLC_FOURCC( 'm', 's', 0x0, 0x11 )
#define ATOM_ms55 VLC_FOURCC( 'm', 's', 0x0, 0x55 )
#define ATOM_twos VLC_FOURCC( 't', 'w', 'o', 's' )
#define ATOM_sowt VLC_FOURCC( 's', 'o', 'w', 't' )
#define ATOM_QDMC VLC_FOURCC( 'Q', 'D', 'M', 'C' )
#define ATOM_QDM2 VLC_FOURCC( 'Q', 'D', 'M', '2' )
#define ATOM_ima4 VLC_FOURCC( 'i', 'm', 'a', '4' )
#define ATOM_IMA4 VLC_FOURCC( 'I', 'M', 'A', '4' )
#define ATOM_dvi VLC_FOURCC( 'd', 'v', 'i', ' ' )
#define ATOM_MAC3 VLC_FOURCC( 'M', 'A', 'C', '3' )
#define ATOM_MAC6 VLC_FOURCC( 'M', 'A', 'C', '6' )
#define ATOM_alaw VLC_FOURCC( 'a', 'l', 'a', 'w' )
#define ATOM_ulaw VLC_FOURCC( 'u', 'l', 'a', 'w' )
#define ATOM_Qclp VLC_FOURCC( 'Q', 'c', 'l', 'p' )
#define ATOM_samr VLC_FOURCC( 's', 'a', 'm', 'r' )
#define ATOM_sawb VLC_FOURCC( 's', 'a', 'w', 'b' )
#define ATOM_OggS VLC_FOURCC( 'O', 'g', 'g', 'S' )
#define ATOM_alac VLC_FOURCC( 'a', 'l', 'a', 'c' )
#define ATOM_dac3 VLC_FOURCC( 'd', 'a', 'c', '3' )
#define ATOM_dec3 VLC_FOURCC( 'd', 'e', 'c', '3' )
#define ATOM_dvc1 VLC_FOURCC( 'd', 'v', 'c', '1' )
#define ATOM_enda VLC_FOURCC( 'e', 'n', 'd', 'a' )
#define ATOM_gnre VLC_FOURCC( 'g', 'n', 'r', 'e' )
#define ATOM_trkn VLC_FOURCC( 't', 'r', 'k', 'n' )
#define ATOM_zlib VLC_FOURCC( 'z', 'l', 'i', 'b' )
#define ATOM_SVQ1 VLC_FOURCC( 'S', 'V', 'Q', '1' )
#define ATOM_SVQ3 VLC_FOURCC( 'S', 'V', 'Q', '3' )
#define ATOM_ZyGo VLC_FOURCC( 'Z', 'y', 'G', 'o' )
#define ATOM_3IV1 VLC_FOURCC( '3', 'I', 'V', '1' )
#define ATOM_3iv1 VLC_FOURCC( '3', 'i', 'v', '1' )
#define ATOM_3IV2 VLC_FOURCC( '3', 'I', 'V', '2' )
#define ATOM_3iv2 VLC_FOURCC( '3', 'i', 'v', '2' )
#define ATOM_3IVD VLC_FOURCC( '3', 'I', 'V', 'D' )
#define ATOM_3ivd VLC_FOURCC( '3', 'i', 'v', 'd' )
#define ATOM_3VID VLC_FOURCC( '3', 'V', 'I', 'D' )
#define ATOM_3vid VLC_FOURCC( '3', 'v', 'i', 'd' )
#define ATOM_h263 VLC_FOURCC( 'h', '2', '6', '3' )
#define ATOM_s263 VLC_FOURCC( 's', '2', '6', '3' )
#define ATOM_DIVX VLC_FOURCC( 'D', 'I', 'V', 'X' )
#define ATOM_XVID VLC_FOURCC( 'X', 'V', 'I', 'D' )
#define ATOM_cvid VLC_FOURCC( 'c', 'v', 'i', 'd' )
#define ATOM_mjpa VLC_FOURCC( 'm', 'j', 'p', 'a' )
#define ATOM_mjpb VLC_FOURCC( 'm', 'j', 'q', 't' )
#define ATOM_mjqt VLC_FOURCC( 'm', 'j', 'h', 't' )
#define ATOM_mjht VLC_FOURCC( 'm', 'j', 'p', 'b' )
#define ATOM_VP31 VLC_FOURCC( 'V', 'P', '3', '1' )
#define ATOM_vp31 VLC_FOURCC( 'v', 'p', '3', '1' )
#define ATOM_h264 VLC_FOURCC( 'h', '2', '6', '4' )
#define ATOM_qdrw VLC_FOURCC( 'q', 'd', 'r', 'w' )
#define ATOM_avc1 VLC_FOURCC( 'a', 'v', 'c', '1' )
#define ATOM_avcC VLC_FOURCC( 'a', 'v', 'c', 'C' )
#define ATOM_m4ds VLC_FOURCC( 'm', '4', 'd', 's' )
#define ATOM_hvcC VLC_FOURCC( 'h', 'v', 'c', 'C' )
#define ATOM_dvc VLC_FOURCC( 'd', 'v', 'c', ' ' )
#define ATOM_dvp VLC_FOURCC( 'd', 'v', 'p', ' ' )
#define ATOM_dv5n VLC_FOURCC( 'd', 'v', '5', 'n' )
#define ATOM_dv5p VLC_FOURCC( 'd', 'v', '5', 'p' )
#define ATOM_raw VLC_FOURCC( 'r', 'a', 'w', ' ' )
#define ATOM_jpeg VLC_FOURCC( 'j', 'p', 'e', 'g' )
#define ATOM_yv12 VLC_FOURCC( 'y', 'v', '1', '2' )
#define ATOM_yuv2 VLC_FOURCC( 'y', 'u', 'v', '2' )
#define ATOM_rmra VLC_FOURCC( 'r', 'm', 'r', 'a' )
#define ATOM_rmda VLC_FOURCC( 'r', 'm', 'd', 'a' )
#define ATOM_rdrf VLC_FOURCC( 'r', 'd', 'r', 'f' )
#define ATOM_rmdr VLC_FOURCC( 'r', 'm', 'd', 'r' )
#define ATOM_rmvc VLC_FOURCC( 'r', 'm', 'v', 'c' )
#define ATOM_rmcd VLC_FOURCC( 'r', 'm', 'c', 'd' )
#define ATOM_rmqu VLC_FOURCC( 'r', 'm', 'q', 'u' )
#define ATOM_alis VLC_FOURCC( 'a', 'l', 'i', 's' )
#define ATOM_gmhd VLC_FOURCC( 'g', 'm', 'h', 'd' )
#define ATOM_wave VLC_FOURCC( 'w', 'a', 'v', 'e' )
#define ATOM_drms VLC_FOURCC( 'd', 'r', 'm', 's' )
#define ATOM_sinf VLC_FOURCC( 's', 'i', 'n', 'f' )
#define ATOM_schi VLC_FOURCC( 's', 'c', 'h', 'i' )
#define ATOM_user VLC_FOURCC( 'u', 's', 'e', 'r' )
#define ATOM_key VLC_FOURCC( 'k', 'e', 'y', ' ' )
#define ATOM_iviv VLC_FOURCC( 'i', 'v', 'i', 'v' )
#define ATOM_name VLC_FOURCC( 'n', 'a', 'm', 'e' )
#define ATOM_priv VLC_FOURCC( 'p', 'r', 'i', 'v' )
#define ATOM_drmi VLC_FOURCC( 'd', 'r', 'm', 'i' )
#define ATOM_frma VLC_FOURCC( 'f', 'r', 'm', 'a' )
#define ATOM_skcr VLC_FOURCC( 's', 'k', 'c', 'r' )
#define ATOM_text VLC_FOURCC( 't', 'e', 'x', 't' )
#define ATOM_tx3g VLC_FOURCC( 't', 'x', '3', 'g' )
#define ATOM_subp VLC_FOURCC( 's', 'u', 'b', 'p' )
#define ATOM_sbtl VLC_FOURCC( 's', 'b', 't', 'l' )
#define ATOM_0xa9nam VLC_FOURCC( 0xa9, 'n', 'a', 'm' )
#define ATOM_0xa9aut VLC_FOURCC( 0xa9, 'a', 'u', 't' )
#define ATOM_0xa9cpy VLC_FOURCC( 0xa9, 'c', 'p', 'y' )
#define ATOM_0xa9inf VLC_FOURCC( 0xa9, 'i', 'n', 'f' )
#define ATOM_0xa9isr VLC_FOURCC( 0xa9, 'i', 's', 'r' )
#define ATOM_0xa9lab VLC_FOURCC( 0xa9, 'l', 'a', 'b' )
#define ATOM_0xa9lal VLC_FOURCC( 0xa9, 'l', 'a', 'l' )
#define ATOM_0xa9ART VLC_FOURCC( 0xa9, 'A', 'R', 'T' )
#define ATOM_0xa9des VLC_FOURCC( 0xa9, 'd', 'e', 's' )
#define ATOM_0xa9dir VLC_FOURCC( 0xa9, 'd', 'i', 'r' )
#define ATOM_0xa9cmt VLC_FOURCC( 0xa9, 'c', 'm', 't' )
#define ATOM_0xa9req VLC_FOURCC( 0xa9, 'r', 'e', 'q' )
#define ATOM_0xa9day VLC_FOURCC( 0xa9, 'd', 'a', 'y' )
#define ATOM_0xa9fmt VLC_FOURCC( 0xa9, 'f', 'm', 't' )
#define ATOM_0xa9prd VLC_FOURCC( 0xa9, 'p', 'r', 'd' )
#define ATOM_0xa9prf VLC_FOURCC( 0xa9, 'p', 'r', 'f' )
#define ATOM_0xa9src VLC_FOURCC( 0xa9, 's', 'r', 'c' )
#define ATOM_0xa9alb VLC_FOURCC( 0xa9, 'a', 'l', 'b' )
#define ATOM_0xa9dis VLC_FOURCC( 0xa9, 'd', 'i', 's' )
#define ATOM_0xa9enc VLC_FOURCC( 0xa9, 'e', 'n', 'c' )
#define ATOM_0xa9trk VLC_FOURCC( 0xa9, 't', 'r', 'k' )
#define ATOM_0xa9url VLC_FOURCC( 0xa9, 'u', 'r', 'l' )
#define ATOM_0xa9dsa VLC_FOURCC( 0xa9, 'd', 's', 'a' )
#define ATOM_0xa9hst VLC_FOURCC( 0xa9, 'h', 's', 't' )
#define ATOM_0xa9ope VLC_FOURCC( 0xa9, 'o', 'p', 'e' )
#define ATOM_0xa9wrt VLC_FOURCC( 0xa9, 'w', 'r', 't' )
#define ATOM_0xa9com VLC_FOURCC( 0xa9, 'c', 'o', 'm' )
#define ATOM_0xa9gen VLC_FOURCC( 0xa9, 'g', 'e', 'n' )
#define ATOM_0xa9too VLC_FOURCC( 0xa9, 't', 'o', 'o' )
#define ATOM_0xa9wrn VLC_FOURCC( 0xa9, 'w', 'r', 'n' )
#define ATOM_0xa9swr VLC_FOURCC( 0xa9, 's', 'w', 'r' )
#define ATOM_0xa9mak VLC_FOURCC( 0xa9, 'm', 'a', 'k' )
#define ATOM_0xa9mal VLC_FOURCC( 0xa9, 'm', 'a', 'l' )
#define ATOM_0xa9mod VLC_FOURCC( 0xa9, 'm', 'o', 'd' )
#define ATOM_0xa9PRD VLC_FOURCC( 0xa9, 'P', 'R', 'D' )
#define ATOM_0xa9grp VLC_FOURCC( 0xa9, 'g', 'r', 'p' )
#define ATOM_0xa9lyr VLC_FOURCC( 0xa9, 'l', 'y', 'r' )
#define ATOM_0xa9gen VLC_FOURCC( 0xa9, 'g', 'e', 'n' )
#define ATOM_0xa9st3 VLC_FOURCC( 0xa9, 's', 't', '3' )
#define ATOM_0xa9ard VLC_FOURCC( 0xa9, 'a', 'r', 'd' )
#define ATOM_0xa9arg VLC_FOURCC( 0xa9, 'a', 'r', 'g' )
#define ATOM_0xa9cak VLC_FOURCC( 0xa9, 'c', 'a', 'k' )
#define ATOM_0xa9con VLC_FOURCC( 0xa9, 'c', 'o', 'n' )
#define ATOM_0xa9des VLC_FOURCC( 0xa9, 'd', 'e', 's' )
#define ATOM_0xa9lnt VLC_FOURCC( 0xa9, 'l', 'n', 't' )
#define ATOM_0xa9phg VLC_FOURCC( 0xa9, 'p', 'h', 'g' )
#define ATOM_0xa9pub VLC_FOURCC( 0xa9, 'p', 'u', 'b' )
#define ATOM_0xa9sne VLC_FOURCC( 0xa9, 's', 'n', 'e' )
#define ATOM_0xa9snm VLC_FOURCC( 0xa9, 's', 'n', 'm' )
#define ATOM_0xa9sol VLC_FOURCC( 0xa9, 's', 'o', 'l' )
#define ATOM_0xa9thx VLC_FOURCC( 0xa9, 't', 'h', 'x' )
#define ATOM_0xa9xpd VLC_FOURCC( 0xa9, 'x', 'p', 'd' )
#define ATOM_0xa9xyz VLC_FOURCC( 0xa9, 'x', 'y', 'z' )
#define ATOM_chpl VLC_FOURCC( 'c', 'h', 'p', 'l' )
#define ATOM_WLOC VLC_FOURCC( 'W', 'L', 'O', 'C' )
#define ATOM_meta VLC_FOURCC( 'm', 'e', 't', 'a' )
#define ATOM_ilst VLC_FOURCC( 'i', 'l', 's', 't' )
#define ATOM_covr VLC_FOURCC( 'c', 'o', 'v', 'r' )
#define ATOM_chap VLC_FOURCC( 'c', 'h', 'a', 'p' )
/* Do you want some debug information on all read boxes ? */
#ifndef NDEBUG
# define MP4_VERBOSE 1
#endif
struct MP4_Box_s;
/* uuid Universal Unique IDentifiers */
typedef struct UUID_s {
uint8_t b[16];
} UUID_t;
/* specific structure for all boxes */
typedef struct MP4_Box_data_tfxd_s {
uint8_t i_version;
uint32_t i_flags;
uint64_t i_fragment_duration;
uint64_t i_fragment_abs_time;
} MP4_Box_data_tfxd_t;
typedef struct TfrfBoxDataFields_s {
uint64_t i_fragment_duration;
uint64_t i_fragment_abs_time;
} TfrfBoxDataFields_t;
typedef struct MP4_Box_data_tfrf_s {
uint8_t i_version;
uint8_t i_fragment_count;
uint32_t i_flags;
TfrfBoxDataFields_t *p_tfrf_data_fields;
} MP4_Box_data_tfrf_t;
typedef struct MP4_Box_data_ftyp_s {
uint32_t i_major_brand;
uint32_t i_minor_version;
uint32_t i_compatible_brands_count;
uint32_t *i_compatible_brands;
} MP4_Box_data_ftyp_t;
typedef struct MP4_Box_data_mvhd_s {
uint8_t i_version;
uint32_t i_flags;
uint64_t i_creation_time;
uint64_t i_modification_time;
uint32_t i_timescale;
uint64_t i_duration;
int32_t i_rate;
int16_t i_volume;
int16_t i_reserved1;
uint32_t i_reserved2[2];
int32_t i_matrix[9];
uint32_t i_predefined[6];
uint32_t i_next_track_id;
} MP4_Box_data_mvhd_t;
#define MP4_TRACK_ENABLED 0x000001
#define MP4_TRACK_IN_MOVIE 0x000002
#define MP4_TRACK_IN_PREVIEW 0x000004
typedef struct MP4_Box_data_tkhd_s {
uint8_t i_version;
uint32_t i_flags;
uint64_t i_creation_time;
uint64_t i_modification_time;
uint32_t i_track_ID;
uint32_t i_reserved;
uint64_t i_duration;
uint32_t i_reserved2[2];
int16_t i_layer;
int16_t i_predefined;
int16_t i_volume;
uint16_t i_reserved3;
int32_t i_matrix[9];
int32_t i_width;
int32_t i_height;
float f_rotation;
} MP4_Box_data_tkhd_t;
typedef struct MP4_Box_data_mdhd_s {
uint8_t i_version;
uint32_t i_flags;
uint64_t i_creation_time;
uint64_t i_modification_time;
uint32_t i_timescale;
uint64_t i_duration;
char rgs_language[3]; /* ISO-639-2/T or Mac lang table */
bool b_mac_encoding; /* media using mac encoding */
uint16_t i_predefined;
} MP4_Box_data_mdhd_t;
typedef struct MP4_Box_data_hdlr_s {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_predefined;
uint32_t i_handler_type; /* "vide" "soun" "hint" "odsm"
"crsm" "sdsm" "m7sm" "ocsm"
"ipsm" "mjsm" */
unsigned char *psz_name; /* in UTF-8 */
} MP4_Box_data_hdlr_t;
typedef struct MP4_Box_data_vmhd_s {
uint8_t i_version;
uint32_t i_flags;
int16_t i_graphics_mode;
int16_t i_opcolor[3];
} MP4_Box_data_vmhd_t;
typedef struct MP4_Box_data_smhd_s {
uint8_t i_version;
uint32_t i_flags;
int16_t i_balance;
int16_t i_reserved;
} MP4_Box_data_smhd_t;
typedef struct MP4_Box_data_hmhd_s {
uint8_t i_version;
uint32_t i_flags;
uint16_t i_max_PDU_size;
uint16_t i_avg_PDU_size;
uint32_t i_max_bitrate;
uint32_t i_avg_bitrate;
uint32_t i_reserved;
} MP4_Box_data_hmhd_t;
typedef struct MP4_Box_data_url_s {
uint8_t i_version;
uint32_t i_flags;
char *psz_location;
} MP4_Box_data_url_t;
typedef struct MP4_Box_data_urn_s {
uint8_t i_version;
uint32_t i_flags;
char *psz_name;
char *psz_location;
} MP4_Box_data_urn_t;
typedef struct MP4_Box_data_dref_s {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_entry_count;
/* XXX it's also a container with i_entry_count entry */
} MP4_Box_data_dref_t;
typedef struct MP4_Box_data_stts_s {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_entry_count;
uint32_t *pi_sample_count; /* these are array */
int32_t *pi_sample_delta;
} MP4_Box_data_stts_t;
typedef struct MP4_Box_data_ctts_s {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_entry_count;
uint32_t *pi_sample_count; /* these are array */
int32_t *pi_sample_offset;
} MP4_Box_data_ctts_t;
typedef struct MP4_Box_data_sample_soun_s {
uint8_t i_reserved1[6];
uint16_t i_data_reference_index;
//uint32_t i_reserved2[2];
uint16_t i_qt_version;
uint16_t i_qt_revision_level;
uint32_t i_qt_vendor;
uint16_t i_channelcount;
uint16_t i_samplesize;
uint16_t i_compressionid;
uint16_t i_reserved3;
uint16_t i_sampleratehi; /* timescale of track */
uint16_t i_sampleratelo;
/* for version 1 (i_reserved1[0] == 1) */
uint32_t i_sample_per_packet;
uint32_t i_bytes_per_packet;
uint32_t i_bytes_per_frame;
uint32_t i_bytes_per_sample;
/* v2 */
uint32_t i_constbitsperchannel; /* consts are nonzero only if constant */
uint32_t i_formatflags;
uint32_t i_constbytesperaudiopacket;
uint32_t i_constLPCMframesperaudiopacket;
/* XXX hack */
int i_qt_description;
uint8_t *p_qt_description;
} MP4_Box_data_sample_soun_t;
typedef struct MP4_Box_data_sample_vide_s {
uint8_t i_reserved1[6];
uint16_t i_data_reference_index;
uint16_t i_qt_version;
uint16_t i_qt_revision_level;
uint32_t i_qt_vendor;
uint32_t i_qt_temporal_quality;
uint32_t i_qt_spatial_quality;
int16_t i_width;
int16_t i_height;
uint32_t i_horizresolution;
uint32_t i_vertresolution;
uint32_t i_qt_data_size;
uint16_t i_qt_frame_count;
uint8_t i_compressorname[32];
int16_t i_depth;
int16_t i_qt_color_table;
/* XXX hack ImageDescription */
int i_qt_image_description;
uint8_t *p_qt_image_description;
} MP4_Box_data_sample_vide_t;
#define MP4_TEXT_DISPLAY_FLAG_DONT_DISPLAY (1<<0)
#define MP4_TEXT_DISPLAY_FLAG_AUTO_SCALE (1<<1)
#define MP4_TEXT_DISPLAY_FLAG_CLIP_TO_TEXT_BOX (1<<2)
#define MP4_TEXT_DISPLAY_FLAG_USE_MOVIE_BG_COLOR (1<<3)
#define MP4_TEXT_DISPLAY_FLAG_SHRINK_TEXT_BOX_TO_FIT (1<<4)
#define MP4_TEXT_DISPLAY_FLAG_SCROLL_IN (1<<5)
#define MP4_TEXT_DISPLAY_FLAG_SCROLL_OUT (1<<6)
#define MP4_TEXT_DISPLAY_FLAG_HORIZONTAL_SCROLL (1<<7)
#define MP4_TEXT_DISPLAY_FLAG_REVERSE_SCROLL (1<<8)
#define MP4_TEXT_DISPLAY_FLAG_CONTINUOUS_SCROLL (1<<9)
#define MP4_TEXT_DISPLAY_FLAG_FLOW_HORIZONTAL (1<<10)
#define MP4_TEXT_DISPLAY_FLAG_CONTINUOUS_KARAOKE (1<<11)
#define MP4_TEXT_DISPLAY_FLAG_DROP_SHADOW (1<<12)
#define MP4_TEXT_DISPLAY_FLAG_ANTI_ALIAS (1<<13)
#define MP4_TEXT_DISPLAY_FLAG_KEYED_TEXT (1<<14)
#define MP4_TEXT_DISPLAY_FLAG_INVERSE_HILITE (1<<15)
#define MP4_TEXT_DISPLAY_FLAG_COLOR_HILITE (1<<16)
#define MP4_TEXT_DISPLAY_FLAG_WRITE_VERTICALLY (1<<17)
typedef struct {
uint32_t i_reserved1;
uint16_t i_reserved2;
uint16_t i_data_reference_index;
uint32_t i_display_flags; // TextDescription and Tx3gDescription
int8_t i_justification_horizontal; // left(0), centered(1), right(-1)
int8_t i_justification_vertical; // top(0), centered(1), bottom(-1)
uint16_t i_background_color[4];
uint16_t i_text_box_top;
uint16_t i_text_box_left;
uint16_t i_text_box_bottom;
uint16_t i_text_box_right;
uint32_t i_reserved3;
uint16_t i_font_id;
uint8_t i_font_face;
uint8_t i_font_size;
uint32_t i_font_color; //RGBA
// TODO to complete
} MP4_Box_data_sample_text_t;
typedef struct MP4_Box_data_sample_hint_s {
uint8_t i_reserved1[6];
uint16_t i_data_reference_index;
uint8_t *p_data;
} MP4_Box_data_sample_hint_t;
typedef struct MP4_Box_data_moviehintinformation_rtp_s {
uint32_t i_description_format;
unsigned char *psz_text;
} MP4_Box_data_moviehintinformation_rtp_t;
typedef struct MP4_Box_data_stsd_s {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_entry_count;
/* it contains SampleEntry handled as if it was Box */
} MP4_Box_data_stsd_t;
typedef struct MP4_Box_data_stsz_s {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_sample_size;
uint32_t i_sample_count;
uint32_t *i_entry_size; /* array , empty if i_sample_size != 0 */
} MP4_Box_data_stsz_t;
typedef struct MP4_Box_data_stz2_s {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_sample_size; /* 24 bits */
uint8_t i_field_size;
uint32_t i_sample_count;
uint32_t *i_entry_size; /* array: unsigned int(i_field_size) entry_size */
} MP4_Box_data_stz2_t;
typedef struct MP4_Box_data_stsc_s {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_entry_count;
uint32_t *i_first_chunk; /* theses are arrays */
uint32_t *i_samples_per_chunk;
uint32_t *i_sample_description_index;
} MP4_Box_data_stsc_t;
typedef struct MP4_Box_data_co64_s {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_entry_count;
uint64_t *i_chunk_offset;
} MP4_Box_data_co64_t;
typedef struct MP4_Box_data_stss_s {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_entry_count;
uint32_t *i_sample_number;
} MP4_Box_data_stss_t;
typedef struct MP4_Box_data_stsh_s {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_entry_count;
uint32_t *i_shadowed_sample_number;
uint32_t *i_sync_sample_number;
} MP4_Box_data_stsh_t;
typedef struct MP4_Box_data_stdp_s {
uint8_t i_version;
uint32_t i_flags;
uint16_t *i_priority;
} MP4_Box_data_stdp_t;
typedef struct MP4_Box_data_padb_s {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_sample_count;
uint16_t *i_reserved1; /* 1bit */
uint16_t *i_pad2; /* 3bits */
uint16_t *i_reserved2; /* 1bit */
uint16_t *i_pad1; /* 3bits */
} MP4_Box_data_padb_t;
typedef struct MP4_Box_data_elst_s {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_entry_count;
uint64_t *i_segment_duration;
int64_t *i_media_time;
uint16_t *i_media_rate_integer;
uint16_t *i_media_rate_fraction;
} MP4_Box_data_elst_t;
typedef struct MP4_Box_data_cprt_s {
uint8_t i_version;
uint32_t i_flags;
char rgs_language[3]; /* ISO-639-2/T */
char *psz_notice;
} MP4_Box_data_cprt_t;
/* DecoderConfigDescriptor */
typedef struct MP4_descriptor_decoder_config_s {
uint8_t i_objectTypeIndication;
uint8_t i_streamType;
int b_upStream;
int i_buffer_sizeDB;
int i_max_bitrate;
int i_avg_bitrate;
int i_decoder_specific_info_len;
uint8_t *p_decoder_specific_info;
/* some other stuff */
} MP4_descriptor_decoder_config_t;
typedef struct MP4_descriptor_SL_config_s {
int i_dummy; /* ANSI C forbids empty structures */
} MP4_descriptor_SL_config_t;
typedef struct MP4_descriptor_ES_s {
uint16_t i_ES_ID;
int b_stream_dependence;
int b_url;
int b_OCRstream;
int i_stream_priority;
int i_depend_on_ES_ID; /* if b_stream_dependence set */
unsigned char *psz_URL;
uint16_t i_OCR_ES_ID; /* if b_OCRstream */
MP4_descriptor_decoder_config_t *p_decConfigDescr;
MP4_descriptor_SL_config_t *p_slConfigDescr;
/* some other stuff ... */
} MP4_descriptor_ES_t;
/* ES descriptor */
typedef struct MP4_Box_data_esds_s {
uint8_t i_version;
uint32_t i_flags;
MP4_descriptor_ES_t es_descriptor;
} MP4_Box_data_esds_t;
typedef struct MP4_Box_data_dcom_s {
uint32_t i_algorithm; /* fourcc */
} MP4_Box_data_dcom_t;
typedef struct MP4_Box_data_cmvd_s {
uint32_t i_uncompressed_size;
uint32_t i_compressed_size;
int b_compressed; /* Set to 1 if compressed data, 0 if uncompressed */
uint8_t *p_data;
} MP4_Box_data_cmvd_t;
typedef struct MP4_Box_data_cmov_s {
struct MP4_Box_s *p_moov; /* uncompressed moov */
} MP4_Box_data_cmov_t;
typedef struct {
uint32_t i_type;
} MP4_Box_data_frma_t;
typedef struct {
uint32_t i_init;
uint32_t i_encr;
uint32_t i_decr;
} MP4_Box_data_skcr_t;
typedef struct {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_ref_type;
char *psz_ref;
} MP4_Box_data_rdrf_t;
typedef struct {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_rate;
} MP4_Box_data_rmdr_t;
typedef struct {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_gestaltType;
uint32_t i_val1;
uint32_t i_val2;
uint16_t i_checkType; /* 0: val1 is version min
1: gestalt value & val2 == val1 */
} MP4_Box_data_rmvc_t;
typedef struct {
uint8_t i_version;
uint32_t i_flags;
} MP4_Box_data_rmcd_t;
typedef struct {
uint32_t i_quality;
} MP4_Box_data_rmqu_t;
typedef struct MP4_Box_data_mfhd_s {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_sequence_number;
} MP4_Box_data_mfhd_t;
typedef struct MP4_Box_sidx_item_s {
bool b_reference_type;
uint32_t i_referenced_size;
uint32_t i_subsegment_duration;
bool b_starts_with_SAP;
uint8_t i_SAP_type;
uint32_t i_SAP_delta_time;
} MP4_Box_sidx_item_t;
typedef struct MP4_Box_data_sidx_s {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_reference_ID;
uint32_t i_timescale;
uint64_t i_earliest_presentation_time;
uint64_t i_first_offset;
uint16_t i_reference_count;
MP4_Box_sidx_item_t *p_items;
} MP4_Box_data_sidx_t;
#define MP4_TFHD_BASE_DATA_OFFSET (1LL<<0)
#define MP4_TFHD_SAMPLE_DESC_INDEX (1LL<<1)
#define MP4_TFHD_DFLT_SAMPLE_DURATION (1LL<<3)
#define MP4_TFHD_DFLT_SAMPLE_SIZE (1LL<<4)
#define MP4_TFHD_DFLT_SAMPLE_FLAGS (1LL<<5)
#define MP4_TFHD_DURATION_IS_EMPTY (1LL<<16)
#define MP4_TFHD_DEFAULT_BASE_IS_MOOF (1LL<<17)
typedef struct MP4_Box_data_tfhd_s {
uint8_t i_version;
bool b_empty;
uint32_t i_flags;
uint32_t i_track_ID;
/* optional fields */
uint64_t i_base_data_offset;
uint32_t i_sample_description_index;
uint32_t i_default_sample_duration;
uint32_t i_default_sample_size;
uint32_t i_default_sample_flags;
} MP4_Box_data_tfhd_t;
#define MP4_TRUN_DATA_OFFSET (1<<0)
#define MP4_TRUN_FIRST_FLAGS (1<<2)
#define MP4_TRUN_SAMPLE_DURATION (1<<8)
#define MP4_TRUN_SAMPLE_SIZE (1<<9)
#define MP4_TRUN_SAMPLE_FLAGS (1<<10)
#define MP4_TRUN_SAMPLE_TIME_OFFSET (1<<11)
typedef struct MP4_descriptor_trun_sample_t {
uint32_t i_duration;
uint32_t i_size;
uint32_t i_flags;
uint32_t i_composition_time_offset; /* version == 0 ? signed : unsigned */
} MP4_descriptor_trun_sample_t;
typedef struct MP4_Box_data_trun_s {
uint8_t i_version;
uint32_t i_flags;
uint32_t i_sample_count;
/* optional fields */
int32_t i_data_offset;
uint32_t i_first_sample_flags;