aboutsummaryrefslogtreecommitdiff
path: root/Src/mpeg4dec/mp4def.h
blob: 603ebf2d76439bb25ef65407bba000f21ae57fae (plain) (blame)
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
/* ///////////////////////////////////////////////////////////////////////
//
//               INTEL CORPORATION PROPRIETARY INFORMATION
//  This software is supplied under the terms of a license agreement or
//  nondisclosure agreement with Intel Corporation and may not be copied
//  or disclosed except in accordance with the terms of that agreement.
//        Copyright (c) 2001-2008 Intel Corporation. All Rights Reserved.
//
//  Description:    MPEG-4 header.
//
*/

#pragma once

#include <bfc/platform/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "../tools/staticlib/ipp_px.h"
#include "ippdefs.h"
#include "ippcore.h"
#include "ipps.h"
#include "ippi.h"
#include "ippvc.h"
//#include "vm_debug.h"
//#include "vm_thread.h"

#pragma warning(disable : 4710) // function not inlined
#pragma warning(disable : 4514) // unreferenced inline function has been removed CL
#pragma warning(disable : 4100) // unreferenced formal parameter CL

#ifdef __cplusplus
extern "C" {
#endif

//#define USE_INLINE_BITS_FUNC
#define USE_NOTCODED_STATE

#if defined(__INTEL_COMPILER) || defined(_MSC_VER)
    #define __INLINE static __inline
#elif defined( __GNUC__ )
    #define __INLINE static __inline__
#else
    #define __INLINE static
#endif

#if defined(__INTEL_COMPILER) && !defined(_WIN32_WCE)
    #define __ALIGN16(type, name, size) \
        __declspec (align(16)) type name[size]
#else
    #if defined(_WIN64) || defined(WIN64) || defined(LINUX64)
        #define __ALIGN16(type, name, size) \
            uint8_t _a16_##name[(size)*sizeof(type)+15]; type *name = (type*)(((int64_t)(_a16_##name) + 15) & ~15)
    #else
        #define __ALIGN16(type, name, size) \
            uint8_t _a16_##name[(size)*sizeof(type)+15]; type *name = (type*)(((int32_t)(_a16_##name) + 15) & ~15)
    #endif
#endif

#define mp4_CLIP(x, min, max) if ((x) < (min)) (x) = (min); else if ((x) > (max)) (x) = (max)
#define mp4_CLIPR(x, max) if ((x) > (max)) (x) = (max)
#define mp4_SWAP(type, x, y) {mp4_Frame *t = (x); (x) = (y); (y) = t;}
#define mp4_ABS(a) ((a) >= 0 ? (a) : -(a))

/* Timer Info */
#if defined(_WIN32) || defined(_WIN64) || defined(WIN32) || defined(WIN64)

#include <windows.h>

    typedef struct _mp4_Timer {
        LARGE_INTEGER  count;
        LARGE_INTEGER  start;
        LARGE_INTEGER  stop;
        int32_t         calls;
    } mp4_Timer;

    __INLINE void mp4_TimerStart(mp4_Timer *t)
    {
        QueryPerformanceCounter(&t->start);
    }

    __INLINE void mp4_TimerStop(mp4_Timer *t)
    {
        QueryPerformanceCounter(&t->stop);
        t->count.QuadPart += t->stop.QuadPart - t->start.QuadPart;
        t->calls ++;
    }

#define TIMER_FREQ_TYPE LARGE_INTEGER

    __INLINE void mp4_GetTimerFreq(TIMER_FREQ_TYPE *f)
    {
        QueryPerformanceFrequency(f);
    }

    __INLINE double mp4_GetTimerSec(mp4_Timer *t, TIMER_FREQ_TYPE f)
    {
        return (double)t->count.QuadPart / (double)f.QuadPart;
    }

#else  // LINUX

#include <time.h>

    typedef struct _mp4_Timer {
        clock_t  count;
        clock_t  start;
        clock_t  stop;
        int32_t   calls;
    } mp4_Timer;

    __INLINE void mp4_TimerStart(mp4_Timer *t)
    {
        t->start = clock();
    }

    __INLINE void mp4_TimerStop(mp4_Timer *t)
    {
        t->stop = clock();
        t->count += t->stop - t->start;
        t->calls ++;
    }

#define TIMER_FREQ_TYPE int32_t

    __INLINE void mp4_GetTimerFreq(TIMER_FREQ_TYPE *f)
    {
        *f = CLOCKS_PER_SEC;
    }

    __INLINE double mp4_GetTimerSec(mp4_Timer *t, TIMER_FREQ_TYPE f)
    {
        return (double)t->count / (double)f;
    }

#endif

/* number of exterior MB */
#define MP4_NUM_EXT_MB 1

/* Statistic Info */
typedef struct _mp4_Statistic {
    // VideoObjectLayer Info
    int32_t      nVOP;
    int32_t      nVOP_I;
    int32_t      nVOP_P;
    int32_t      nVOP_B;
    int32_t      nVOP_S;
    int32_t      nMB;
    int32_t      nMB_INTER;
    int32_t      nMB_INTER_Q;
    int32_t      nMB_INTRA;
    int32_t      nMB_INTRA_Q;
    int32_t      nMB_INTER4V;
    int32_t      nMB_DIRECT;
    int32_t      nMB_INTERPOLATE;
    int32_t      nMB_BACKWARD;
    int32_t      nMB_FORWARD;
    int32_t      nMB_NOTCODED;
    int32_t      nB_INTRA_DC;
    int32_t      nB_INTRA_AC;
    int32_t      nB_INTER_C;
    int32_t      nB_INTER_NC;
    // app Timing Info
    mp4_Timer   time_DecodeShow;    // decode + draw + file reading
    mp4_Timer   time_Decode;        // decode + file reading
    mp4_Timer   time_DecodeOnly;    // decode only
} mp4_Statistic;

__INLINE void mp4_StatisticInc(int32_t *s)
{
    *s = (*s) + 1;
}

// when using Full Statistic, FPS is less
#ifdef MP4_FULL_STAT
#define mp4_StatisticInc_(s) mp4_StatisticInc(s)
#define mp4_TimerStart_(t) mp4_TimerStart(t)
#define mp4_TimerStop_(t) mp4_TimerStop(t)
#else
#define mp4_StatisticInc_(s)
#define mp4_TimerStart_(t)
#define mp4_TimerStop_(t)
#endif

/* status codes */
typedef enum {
    MP4_STATUS_OK           =  0,   // no error
    MP4_STATUS_NO_MEM       = -1,   // out of memory
    MP4_STATUS_FILE_ERROR   = -2,   // file error
    MP4_STATUS_NOTSUPPORT   = -3,   // not supported mode
    MP4_STATUS_PARSE_ERROR  = -4,   // fail in parse MPEG-4 stream
    MP4_STATUS_ERROR        = -5    // unknown/unspecified error
} mp4_Status;

/* MPEG-4 start code values */
// ISO/IEC 14496-2: table 6-3
enum {
    MP4_VIDEO_OBJECT_MIN_SC       = 0x00,
    MP4_VIDEO_OBJECT_MAX_SC       = 0x1F,
    MP4_VIDEO_OBJECT_LAYER_MIN_SC = 0x20,
    MP4_VIDEO_OBJECT_LAYER_MAX_SC = 0x2F,
    MP4_FGS_BP_MIN_SC             = 0x40,
    MP4_FGS_BP_MAX_SC             = 0x5F,
    MP4_VISUAL_OBJECT_SEQUENCE_SC = 0xB0,
    MP4_VISUAL_OBJECT_SEQUENCE_EC = 0xB1,
    MP4_USER_DATA_SC              = 0xB2,
    MP4_GROUP_OF_VOP_SC           = 0xB3,
    MP4_VIDEO_SESSION_ERROR_SC    = 0xB4,
    MP4_VISUAL_OBJECT_SC          = 0xB5,
    MP4_VIDEO_OBJECT_PLANE_SC     = 0xB6,
    MP4_SLICE_SC                  = 0xB7,
    MP4_EXTENSION_SC              = 0xB8,
    MP4_FGS_VOP_SC                = 0xB9,
    MP4_FBA_OBJECT_SC             = 0xBA,
    MP4_FBA_OBJECT_PLANE_SC       = 0xBB,
    MP4_MESH_OBJECT_SC            = 0xBC,
    MP4_MESH_OBJECT_PLANE_SC      = 0xBD,
    MP4_STILL_TEXTURE_OBJECT_SC   = 0xBE,
    MP4_TEXTURE_SPATIAL_LAYER_SC  = 0xBF,
    MP4_TEXTURE_SNR_LAYER_SC      = 0xC0,
    MP4_TEXTURE_TILE_SC           = 0xC1,
    MP4_TEXTURE_SHAPE_LAYER_SC    = 0xC2,
    MP4_STUFFING_SC               = 0xC3
};

/* MPEG-4 code values */
// ISO/IEC 14496-2:2004 table 6-6
enum {
    MP4_VISUAL_OBJECT_TYPE_VIDEO     = 1,
    MP4_VISUAL_OBJECT_TYPE_TEXTURE   = 2,
    MP4_VISUAL_OBJECT_TYPE_MESH      = 3,
    MP4_VISUAL_OBJECT_TYPE_FBA       = 4,
    MP4_VISUAL_OBJECT_TYPE_3DMESH    = 5
};

// ISO/IEC 14496-2:2004 table 6-7
enum {
    MP4_VIDEO_FORMAT_COMPONENT      = 0,
    MP4_VIDEO_FORMAT_PAL            = 1,
    MP4_VIDEO_FORMAT_NTSC           = 2,
    MP4_VIDEO_FORMAT_SECAM          = 3,
    MP4_VIDEO_FORMAT_MAC            = 4,
    MP4_VIDEO_FORMAT_UNSPECIFIED    = 5
};

// ISO/IEC 14496-2:2004 table 6-8..10
enum {
    MP4_VIDEO_COLORS_FORBIDDEN         = 0,
    MP4_VIDEO_COLORS_ITU_R_BT_709      = 1,
    MP4_VIDEO_COLORS_UNSPECIFIED       = 2,
    MP4_VIDEO_COLORS_RESERVED          = 3,
    MP4_VIDEO_COLORS_ITU_R_BT_470_2_M  = 4,
    MP4_VIDEO_COLORS_ITU_R_BT_470_2_BG = 5,
    MP4_VIDEO_COLORS_SMPTE_170M        = 6,
    MP4_VIDEO_COLORS_SMPTE_240M        = 7,
    MP4_VIDEO_COLORS_GENERIC_FILM      = 8
};

// ISO/IEC 14496-2:2004 table 6-11
enum {
    MP4_VIDEO_OBJECT_TYPE_SIMPLE                     = 1,
    MP4_VIDEO_OBJECT_TYPE_SIMPLE_SCALABLE            = 2,
    MP4_VIDEO_OBJECT_TYPE_CORE                       = 3,
    MP4_VIDEO_OBJECT_TYPE_MAIN                       = 4,
    MP4_VIDEO_OBJECT_TYPE_NBIT                       = 5,
    MP4_VIDEO_OBJECT_TYPE_2DTEXTURE                  = 6,
    MP4_VIDEO_OBJECT_TYPE_2DMESH                     = 7,
    MP4_VIDEO_OBJECT_TYPE_SIMPLE_FACE                = 8,
    MP4_VIDEO_OBJECT_TYPE_STILL_SCALABLE_TEXTURE     = 9,
    MP4_VIDEO_OBJECT_TYPE_ADVANCED_REAL_TIME_SIMPLE  = 10,
    MP4_VIDEO_OBJECT_TYPE_CORE_SCALABLE              = 11,
    MP4_VIDEO_OBJECT_TYPE_ADVANCED_CODING_EFFICIENCY = 12,
    MP4_VIDEO_OBJECT_TYPE_ADVANCED_SCALABLE_TEXTURE  = 13,
    MP4_VIDEO_OBJECT_TYPE_SIMPLE_FBA                 = 14,
    MP4_VIDEO_OBJECT_TYPE_SIMPLE_STUDIO              = 15,
    MP4_VIDEO_OBJECT_TYPE_CORE_STUDIO                = 16,
    MP4_VIDEO_OBJECT_TYPE_ADVANCED_SIMPLE            = 17,
    MP4_VIDEO_OBJECT_TYPE_FINE_GRANULARITY_SCALABLE  = 18
};

// ISO/IEC 14496-2:2004 table 6.17 (maximum defined video_object_layer_shape_extension)
#define MP4_SHAPE_EXT_NUM 13
// ISO/IEC 14496-2:2004 table 6-14
enum {
    MP4_ASPECT_RATIO_FORBIDDEN  = 0,
    MP4_ASPECT_RATIO_1_1        = 1,
    MP4_ASPECT_RATIO_12_11      = 2,
    MP4_ASPECT_RATIO_10_11      = 3,
    MP4_ASPECT_RATIO_16_11      = 4,
    MP4_ASPECT_RATIO_40_33      = 5,
    MP4_ASPECT_RATIO_EXTPAR     = 15
};

// ISO/IEC 14496-2:2004 table 6-15
#define MP4_CHROMA_FORMAT_420    1
// ISO/IEC 14496-2:2004 table 6-16
enum {
    MP4_SHAPE_TYPE_RECTANGULAR  = 0,
    MP4_SHAPE_TYPE_BINARY       = 1,
    MP4_SHAPE_TYPE_BINARYONLY   = 2,
    MP4_SHAPE_TYPE_GRAYSCALE    = 3
};

// ISO/IEC 14496-2:2004 table 6-19
#define MP4_SPRITE_STATIC   1
#define MP4_SPRITE_GMC      2
// ISO/IEC 14496-2:2004 table 6-24
enum {
    MP4_VOP_TYPE_I  = 0,
    MP4_VOP_TYPE_P  = 1,
    MP4_VOP_TYPE_B  = 2,
    MP4_VOP_TYPE_S  = 3
};

// ISO/IEC 14496-2:2004 table 6-26
enum {
    MP4_SPRITE_TRANSMIT_MODE_STOP   = 0,
    MP4_SPRITE_TRANSMIT_MODE_PIECE  = 1,
    MP4_SPRITE_TRANSMIT_MODE_UPDATE = 2,
    MP4_SPRITE_TRANSMIT_MODE_PAUSE  = 3
};

// ISO/IEC 14496-2:2004 table 7-3
enum {
    MP4_BAB_TYPE_MVDSZ_NOUPDATE  = 0,
    MP4_BAB_TYPE_MVDSNZ_NOUPDATE = 1,
    MP4_BAB_TYPE_TRANSPARENT     = 2,
    MP4_BAB_TYPE_OPAQUE          = 3,
    MP4_BAB_TYPE_INTRACAE        = 4,
    MP4_BAB_TYPE_MVDSZ_INTERCAE  = 5,
    MP4_BAB_TYPE_MVDSNZ_INTERCAE = 6
};

#define MP4_DC_MARKER  0x6B001 // 110 1011 0000 0000 0001
#define MP4_MV_MARKER  0x1F001 //   1 1111 0000 0000 0001

// ISO/IEC 14496-2:2004 table G.1
enum {
    MP4_SIMPLE_PROFILE_LEVEL_1                     = 0x01,
    MP4_SIMPLE_PROFILE_LEVEL_2                     = 0x02,
    MP4_SIMPLE_PROFILE_LEVEL_3                     = 0x03,
    MP4_SIMPLE_PROFILE_LEVEL_0                     = 0x08,
    MP4_SIMPLE_SCALABLE_PROFILE_LEVEL_0            = 0x10,
    MP4_SIMPLE_SCALABLE_PROFILE_LEVEL_1            = 0x11,
    MP4_SIMPLE_SCALABLE_PROFILE_LEVEL_2            = 0x12,
    MP4_CORE_PROFILE_LEVEL_1                       = 0x21,
    MP4_CORE_PROFILE_LEVEL_2                       = 0x22,
    MP4_MAIN_PROFILE_LEVEL_2                       = 0x32,
    MP4_MAIN_PROFILE_LEVEL_3                       = 0x33,
    MP4_MAIN_PROFILE_LEVEL_4                       = 0x34,
    MP4_NBIT_PROFILE_LEVEL_2                       = 0x42,
    MP4_SCALABLE_TEXTURE_PROFILE_LEVEL_1           = 0x51,
    MP4_SIMPLE_FACE_ANIMATION_PROFILE_LEVEL_1      = 0x61,
    MP4_SIMPLE_FACE_ANIMATION_PROFILE_LEVEL_2      = 0x62,
    MP4_SIMPLE_FBA_PROFILE_LEVEL_1                 = 0x63,
    MP4_SIMPLE_FBA_PROFILE_LEVEL_2                 = 0x64,
    MP4_BASIC_ANIMATED_TEXTURE_PROFILE_LEVEL_1     = 0x71,
    MP4_BASIC_ANIMATED_TEXTURE_PROFILE_LEVEL_2     = 0x72,
    MP4_HYBRID_PROFILE_LEVEL_1                     = 0x81,
    MP4_HYBRID_PROFILE_LEVEL_2                     = 0x82,
    MP4_ADVANCED_REAL_TIME_SIMPLE_PROFILE_LEVEL_1  = 0x91,
    MP4_ADVANCED_REAL_TIME_SIMPLE_PROFILE_LEVEL_2  = 0x92,
    MP4_ADVANCED_REAL_TIME_SIMPLE_PROFILE_LEVEL_3  = 0x93,
    MP4_ADVANCED_REAL_TIME_SIMPLE_PROFILE_LEVEL_4  = 0x94,
    MP4_CORE_SCALABLE_PROFILE_LEVEL_1              = 0xA1,
    MP4_CORE_SCALABLE_PROFILE_LEVEL_2              = 0xA2,
    MP4_CORE_SCALABLE_PROFILE_LEVEL_3              = 0xA3,
    MP4_ADVANCED_CODING_EFFICIENCY_PROFILE_LEVEL_1 = 0xB1,
    MP4_ADVANCED_CODING_EFFICIENCY_PROFILE_LEVEL_2 = 0xB2,
    MP4_ADVANCED_CODING_EFFICIENCY_PROFILE_LEVEL_3 = 0xB3,
    MP4_ADVANCED_CODING_EFFICIENCY_PROFILE_LEVEL_4 = 0xB4,
    MP4_ADVANCED_CORE_PROFILE_LEVEL_1              = 0xC1,
    MP4_ADVANCED_CORE_PROFILE_LEVEL_2              = 0xC2,
    MP4_ADVANCED_SCALABLE_TEXTURE_PROFILE_LEVEL_1  = 0xD1,
    MP4_ADVANCED_SCALABLE_TEXTURE_PROFILE_LEVEL_2  = 0xD2,
    MP4_ADVANCED_SCALABLE_TEXTURE_PROFILE_LEVEL_3  = 0xD3,
    MP4_SIMPLE_STUDIO_PROFILE_LEVEL_1              = 0xE1,
    MP4_SIMPLE_STUDIO_PROFILE_LEVEL_2              = 0xE2,
    MP4_SIMPLE_STUDIO_PROFILE_LEVEL_3              = 0xE3,
    MP4_SIMPLE_STUDIO_PROFILE_LEVEL_4              = 0xE4,
    MP4_CORE_STUDIO_PROFILE_LEVEL_1                = 0xE5,
    MP4_CORE_STUDIO_PROFILE_LEVEL_2                = 0xE6,
    MP4_CORE_STUDIO_PROFILE_LEVEL_3                = 0xE7,
    MP4_CORE_STUDIO_PROFILE_LEVEL_4                = 0xE8,
    MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_0            = 0xF0,
    MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_1            = 0xF1,
    MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_2            = 0xF2,
    MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_3            = 0xF3,
    MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_4            = 0xF4,
    MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_5            = 0xF5,
    MP4_ADVANCED_SIMPLE_PROFILE_LEVEL_3B           = 0xF7,
    MP4_FGS_PROFILE_LEVEL_0                        = 0xF8,
    MP4_FGS_PROFILE_LEVEL_1                        = 0xF9,
    MP4_FGS_PROFILE_LEVEL_2                        = 0xFA,
    MP4_FGS_PROFILE_LEVEL_3                        = 0xFB,
    MP4_FGS_PROFILE_LEVEL_4                        = 0xFC,
    MP4_FGS_PROFILE_LEVEL_5                        = 0xFD
};

/* Frame Info */
typedef struct _mp4_Frame {
    uint8_t*      apY;        // allocated with border
    uint8_t*      apCb;       // allocated with border
    uint8_t*      apCr;       // allocated with border
    int32_t      stepY;
    int32_t      stepCr;
    int32_t      stepCb;
    uint8_t*      pY;         // real pointer
    uint8_t*      pCb;        // real pointer
    uint8_t*      pCr;        // real pointer
    int32_t      type;
    int64_t      time;
    int32_t      mbPerRow;   // info for realloc VOP with Shape
    int32_t      mbPerCol;
    uint8_t*      apB;        // for binary mask
    uint8_t*      pB;
    uint8_t*      apA[3];     // for aux components
    uint8_t*      pA[3];
    uint8_t*      mid;
		uint64_t	timestamp; // user-provided timestamp
		int QP;
		unsigned int reference_count;
		int outputted; // for debugging purposes
		int sprite; // 0 - frame, 1 - sprite
		struct _mp4_Frame *next; // benski> for linked list of display & free frames
} mp4_Frame;

/* Block Info for Intra Prediction */
typedef struct _mp4_IntraPredBlock {
    struct _mp4_IntraPredBlock  *predA;
    struct _mp4_IntraPredBlock  *predB;
    struct _mp4_IntraPredBlock  *predC;
    int16_t      dct_acA[8];
    int16_t      dct_acC[8];
    int16_t      dct_dc;
} mp4_IntraPredBlock;

/* Buffer for Intra Prediction */
typedef struct _mp4_IntraPredBuff {
    uint8_t               *quant;     // quant buffer;
    mp4_IntraPredBlock  dcB[6];     // blocks for Left-Top DC only
    mp4_IntraPredBlock  *block;
} mp4_IntraPredBuff;

/* MacroBlock Info Data Partitioned mode */
typedef struct _mp4_DataPartMacroBlock {
    int16_t          dct_dc[6];
    uint8_t           type;
    uint8_t           not_coded;
    uint8_t           mcsel;
    uint8_t           ac_pred_flag;
    uint8_t           pat;
    uint8_t           quant;
} mp4_DataPartMacroBlock;

/* MacroBlock Info for Motion */
typedef struct _mp4_MacroBlock {
    IppMotionVector mv[4];
    uint8_t        validPred;     // for MV pred, OBMC
    uint8_t        type;          // for OBMC, BVOP
    uint8_t        not_coded;     // for OBMC, BVOP
    uint8_t        field_info;    // for Interlaced BVOP Direct mode
} mp4_MacroBlock;

/* Group Of Video Object Plane Info */
typedef struct _mp4_GroupOfVideoObjectPlane {
    int64_t      time_code;
    int32_t      closed_gov;
    int32_t      broken_link;
} mp4_GroupOfVideoObjectPlane;

/* Video Object Plane Info */
typedef struct _mp4_VideoObjectPlane {
    int32_t      coding_type;
    int32_t      modulo_time_base;
    int32_t      time_increment;
    int32_t      coded;
    int32_t      id;                             // verid != 1 (newpred)
    int32_t      id_for_prediction_indication;   // verid != 1 (newpred)
    int32_t      id_for_prediction;              // verid != 1 (newpred)
    int32_t      rounding_type;
    int32_t      reduced_resolution;             // verid != 1
    int32_t      vop_width;
    int32_t      vop_height;
    int32_t      vop_horizontal_mc_spatial_ref;
    int32_t      vop_vertical_mc_spatial_ref;
    int32_t      background_composition;
    int32_t      change_conv_ratio_disable;
    int32_t      vop_constant_alpha;
    int32_t      vop_constant_alpha_value;
    int32_t      intra_dc_vlc_thr;
    int32_t      top_field_first;
    int32_t      alternate_vertical_scan_flag;
    int32_t      sprite_transmit_mode;
    int32_t      warping_mv_code_du[4];
    int32_t      warping_mv_code_dv[4];
    int32_t      brightness_change_factor;
    int32_t      quant;
    int32_t      alpha_quant[3];
    int32_t      fcode_forward;
    int32_t      fcode_backward;
    int32_t      shape_coding_type;
    int32_t      load_backward_shape;
    int32_t      ref_select_code;
    int32_t      dx;
    int32_t      dy;
    int32_t      quant_scale;
    int32_t      macroblock_num;
    int32_t      vop_id;
    int32_t      vop_id_for_prediction_indication;
    int32_t      vop_id_for_prediction;
} mp4_VideoObjectPlane;

/* mp4_ComplexityEstimation Info */
typedef struct _mp4_ComplexityEstimation {
    int32_t      estimation_method;
    int32_t      shape_complexity_estimation_disable;
    int32_t      opaque;
    int32_t      transparent;
    int32_t      intra_cae;
    int32_t      inter_cae;
    int32_t      no_update;
    int32_t      upsampling;
    int32_t      texture_complexity_estimation_set_1_disable;
    int32_t      intra_blocks;
    int32_t      inter_blocks;
    int32_t      inter4v_blocks;
    int32_t      not_coded_blocks;
    int32_t      texture_complexity_estimation_set_2_disable;
    int32_t      dct_coefs;
    int32_t      dct_lines;
    int32_t      vlc_symbols;
    int32_t      vlc_bits;
    int32_t      motion_compensation_complexity_disable;
    int32_t      apm;
    int32_t      npm;
    int32_t      interpolate_mc_q;
    int32_t      forw_back_mc_q;
    int32_t      halfpel2;
    int32_t      halfpel4;
    int32_t      version2_complexity_estimation_disable;     // verid != 1
    int32_t      sadct;                                      // verid != 1
    int32_t      quarterpel;                                 // verid != 1
    int32_t      dcecs_opaque;
    int32_t      dcecs_transparent;
    int32_t      dcecs_intra_cae;
    int32_t      dcecs_inter_cae;
    int32_t      dcecs_no_update;
    int32_t      dcecs_upsampling;
    int32_t      dcecs_intra_blocks;
    int32_t      dcecs_inter_blocks;
    int32_t      dcecs_inter4v_blocks;
    int32_t      dcecs_not_coded_blocks;
    int32_t      dcecs_dct_coefs;
    int32_t      dcecs_dct_lines;
    int32_t      dcecs_vlc_symbols;
    int32_t      dcecs_vlc_bits;
    int32_t      dcecs_apm;
    int32_t      dcecs_npm;
    int32_t      dcecs_interpolate_mc_q;
    int32_t      dcecs_forw_back_mc_q;
    int32_t      dcecs_halfpel2;
    int32_t      dcecs_halfpel4;
    int32_t      dcecs_sadct;                                // verid != 1
    int32_t      dcecs_quarterpel;                           // verid != 1
} mp4_ComplexityEstimation;

/* mp4_Scalability Info */
typedef struct _mp4_ScalabilityParameters {
    int32_t      dummy;
} mp4_ScalabilityParameters;

/* VOLControlParameters Info */
typedef struct _mp4_VOLControlParameters {
    int32_t      chroma_format;
    int32_t      low_delay;
    int32_t      vbv_parameters;
    int32_t      bit_rate;
    int32_t      vbv_buffer_size;
    int32_t      vbv_occupancy;
} mp4_VOLControlParameters;

/* Video Object Plane with int16_t header Info */
typedef struct _mp4_VideoObjectPlaneH263 {
    int32_t      temporal_reference;
    int32_t      split_screen_indicator;
    int32_t      document_camera_indicator;
    int32_t      full_picture_freeze_release;
    int32_t      source_format;
    int32_t      picture_coding_type;
    int32_t      vop_quant;
    int32_t      gob_number;
    int32_t      num_gobs_in_vop;
    int32_t      num_macroblocks_in_gob;
    int32_t      gob_header_empty;
    int32_t      gob_frame_id;
    int32_t      quant_scale;
    int32_t      num_rows_in_gob;
} mp4_VideoObjectPlaneH263;

/* Video Object Info */
typedef struct _mp4_VideoObject {
// iso part
    int32_t                      id;
    int32_t                      short_video_header;
    int32_t                      random_accessible_vol;
    int32_t                      type_indication;
    int32_t                      is_identifier;
    int32_t                      verid;
    int32_t                      priority;
    int32_t                      aspect_ratio_info;
    int32_t                      aspect_ratio_info_par_width;
    int32_t                      aspect_ratio_info_par_height;
    int32_t                      is_vol_control_parameters;
    mp4_VOLControlParameters    VOLControlParameters;
    int32_t                      shape;
    int32_t                      shape_extension;                // verid != 1
    int32_t                      vop_time_increment_resolution;
    int32_t                      vop_time_increment_resolution_bits;
    int32_t                      fixed_vop_rate;
    int32_t                      fixed_vop_time_increment;
    int32_t                      width;
    int32_t                      height;
    int32_t                      interlaced;
    int32_t                      obmc_disable;
    int32_t                      sprite_enable;                  // if verid != 1 (2 bit GMC is added)
    int32_t                      sprite_width;
    int32_t                      sprite_height;
    int32_t                      sprite_left_coordinate;
    int32_t                      sprite_top_coordinate;
    int32_t                      sprite_warping_points;
    int32_t                      sprite_warping_accuracy;
    int32_t                      sprite_brightness_change;
    int32_t                      low_latency_sprite_enable;
    int32_t                      sadct_disable;                  // verid != 1
    int32_t                      not_8_bit;
    int32_t                      quant_precision;
    int32_t                      bits_per_pixel;
    int32_t                      no_gray_quant_update;
    int32_t                      composition_method;
    int32_t                      linear_composition;
    int32_t                      quant_type;
    int32_t                      load_intra_quant_mat;
    uint8_t                       intra_quant_mat[64];
    int32_t                      load_nonintra_quant_mat;
    uint8_t                       nonintra_quant_mat[64];
    int32_t                      load_intra_quant_mat_grayscale[3];
    uint8_t                       intra_quant_mat_grayscale[3][64];
    int32_t                      load_nonintra_quant_mat_grayscale[3];
    uint8_t                       nonintra_quant_mat_grayscale[3][64];
    int32_t                      quarter_sample;                 // verid != 1
    int32_t                      complexity_estimation_disable;
    mp4_ComplexityEstimation    ComplexityEstimation;
    int32_t                      resync_marker_disable;
    int32_t                      data_partitioned;
    int32_t                      reversible_vlc;
    int32_t                      newpred_enable;                 // verid != 1
    int32_t                      requested_upstream_message_type;// verid != 1
    int32_t                      newpred_segment_type;           // verid != 1
    int32_t                      reduced_resolution_vop_enable;  // verid != 1
    int32_t                      scalability;
    mp4_ScalabilityParameters   ScalabilityParameters;
    mp4_GroupOfVideoObjectPlane GroupOfVideoObjectPlane;
    mp4_VideoObjectPlane        VideoObjectPlane;
    mp4_VideoObjectPlaneH263    VideoObjectPlaneH263;
// app part
    int32_t                      VOPindex;
    int32_t                      MacroBlockPerRow;
    int32_t                      MacroBlockPerCol;
    int32_t                      MacroBlockPerVOP;
    int32_t                      mbns; // num bits for MacroBlockPerVOP
    mp4_MacroBlock*             MBinfo;
    mp4_IntraPredBuff           IntraPredBuff;
    mp4_DataPartMacroBlock*     DataPartBuff;
    IppiQuantInvIntraSpec_MPEG4*  QuantInvIntraSpec;
    IppiQuantInvInterSpec_MPEG4*  QuantInvInterSpec;
    IppiWarpSpec_MPEG4*         WarpSpec;
    // for B-VOP
    int32_t                      prevPlaneIsB;
    // for interlaced B-VOP direct mode
    int32_t                      Tframe;
    IppMotionVector*            FieldMV;
    // for B-VOP direct mode
    int32_t                      TRB, TRD;
    // time increment of past and future VOP for B-VOP
    int64_t                      rTime, nTime;
    // VOP global time
    int64_t                      vop_sync_time, vop_sync_time_b;
#ifdef USE_NOTCODED_STATE
    // not_coded MB state
    uint8_t*                      ncState;
    int32_t                      ncStateCleared;
#endif
} mp4_VideoObject;

/* StillTexture Object Info */
typedef struct _mp4_StillTextureObject {
    int32_t  dummy;
} mp4_StillTextureObject;

/* Mesh Object Info */
typedef struct _mp4_MeshObject {
    int32_t  dummy;
} mp4_MeshObject;

/* Face Object Info */
typedef struct _mp4_FaceObject {
    int32_t  dummy;
} mp4_FaceObject;

/* video_signal_type Info */
typedef struct _mp4_VideoSignalType {
    int32_t  is_video_signal_type;
    int32_t  video_format;
    int32_t  video_range;
    int32_t  is_colour_description;
    int32_t  colour_primaries;
    int32_t  transfer_characteristics;
    int32_t  matrix_coefficients;
} mp4_VideoSignalType;

/* Visual Object Info */
typedef struct _mp4_VisualObject {
    int32_t                  is_identifier;
    int32_t                  verid;
    int32_t                  priority;
    int32_t                  type;
    mp4_VideoSignalType     VideoSignalType;
    mp4_VideoObject         VideoObject;
    mp4_StillTextureObject  StillTextureObject;
    mp4_MeshObject          MeshObject;
    mp4_FaceObject          FaceObject;
    mp4_Frame              *sFrame;  // static sprite
    mp4_Frame              *cFrame;  // current TODO make pointer
    mp4_Frame              *rFrame;  // reference in past TODO make pointer
    mp4_Frame              *nFrame;  // reference in future TODO make pointer
    int32_t                  frameCount;
    int32_t                  frameInterval;
    int32_t                  frameScale;
    mp4_Statistic           Statistic;
		mp4_Frame *frame_cache; // linked list of available frames (malloc cache)
		mp4_Frame *sprite_cache; // linked list of available sprite (malloc cache)
		mp4_Frame *display_frames; // linked list of display frames
} mp4_VisualObject;

/* Full Info */
typedef struct _mp4_Info {
    int32_t      ftype;          // 0 - raw, 1 - mp4, 2 - avi
    int32_t      ftype_f;        // ftype == 1 (0 - QuickTime(tm)), ftype == 2 (0 - DivX(tm) v. < 5, XVID, 1 - DivX(tm) v. >= 5)
    uint8_t*      buffer;         /* buffer header for saving MPEG-4 stream */
    size_t    buflen;         /* total buffer length */
    size_t    len;            /* valid data in buffer */
    uint8_t*      bufptr;         /* current frame, point to header or data */
    int32_t      bitoff;         /* mostly point to next frame header or PSC */
    int32_t      profile_and_level_indication;
    mp4_VisualObject    VisualObject;
    int32_t      stopOnErr;
    int         strictSyntaxCheck;
    int         noPVOPs;
    int         noBVOPs;
} mp4_Info;

/* bitstream functions */
extern uint8_t*     mp4_FindStartCodePtr(mp4_Info* pInfo);
extern uint8_t*     mp4_FindStartCodeOrShortPtr(mp4_Info* pInfo);
extern int32_t     mp4_SeekStartCodePtr(mp4_Info* pInfo);
extern int32_t     mp4_SeekStartCodeOrShortPtr(mp4_Info* pInfo);
extern int32_t     mp4_SeekStartCodeValue(mp4_Info* pInfo, uint8_t code);
extern uint8_t*     mp4_FindShortVideoStartMarkerPtr(mp4_Info* pInfo);
extern int32_t     mp4_SeekShortVideoStartMarker(mp4_Info* pInfo);
extern int32_t     mp4_SeekGOBMarker(mp4_Info* pInfo);
extern int32_t     mp4_SeekResyncMarker(mp4_Info* pInfo);
extern int32_t     mp4_FindResyncMarker(mp4_Info* pInfo);
extern int        mp4_IsStartCodeOrShort(mp4_Info* pInfo);
extern int        mp4_IsStartCodeValue(mp4_Info* pInfo, int min, int max);
extern int        mp4_IsShortCode(mp4_Info* pInfo);

/* tables */
typedef struct _mp4_VLC1 {
    uint8_t  code;
    uint8_t  len;
} mp4_VLC1;

extern const uint8_t mp4_DefaultIntraQuantMatrix[];
extern const uint8_t mp4_DefaultNonIntraQuantMatrix[];
extern const uint8_t mp4_ClassicalZigzag[];
extern const uint8_t mp4_DCScalerLuma[];
extern const uint8_t mp4_DCScalerChroma[];
extern const uint8_t mp4_cCbCrMvRound16[];
extern const uint8_t mp4_cCbCrMvRound12[];
extern const uint8_t mp4_cCbCrMvRound8[];
extern const uint8_t mp4_cCbCrMvRound4[];
extern const Ipp8s mp4_dquant[];
extern const mp4_VLC1 mp4_cbpy1[];
extern const mp4_VLC1 mp4_cbpy2[];
extern const mp4_VLC1 mp4_cbpy3[];
extern const mp4_VLC1 mp4_cbpy4[];
extern const mp4_VLC1* mp4_cbpy_t[];
extern const uint8_t mp4_cbpy_b[];
extern const int32_t mp4_DC_vlc_Threshold[];
extern const uint8_t mp4_PVOPmb_type[];
extern const uint8_t mp4_PVOPmb_cbpc[];
extern const uint8_t mp4_PVOPmb_bits[];
extern const mp4_VLC1 mp4_BVOPmb_type[];
extern const mp4_VLC1 mp4_MVD_B12_1[];
extern const mp4_VLC1 mp4_MVD_B12_2[];
extern const int32_t mp4_H263_width[];
extern const int32_t mp4_H263_height[];
extern const int32_t mp4_H263_mbgob[];
extern const int32_t mp4_H263_gobvop[];
extern const int32_t mp4_H263_rowgob[];
extern const uint8_t mp4_aux_comp_count[];
extern const uint8_t mp4_aux_comp_is_alpha[];
extern const uint8_t mp4_BABtypeIntra[][3];
extern const int32_t mp4_DivIntraDivisor[];

// project functions
extern void       mp4_Error(const char *str);
//#define mp4_Error(str) puts(str)
extern mp4_Status mp4_InitVOL(mp4_Info *pInfo);
extern mp4_Status mp4_FreeVOL(mp4_Info *pInfo);
extern void       mp4_ResetVOL(mp4_Info *pInfo);
//extern void       mp4_ShowFrame(mp4_Frame *frame);
#define mp4_ShowFrame(frame)
extern mp4_Status mp4_Parse_VisualObjectSequence(mp4_Info* pInfo);
extern mp4_Status mp4_Parse_VisualObject(mp4_Info* pInfo);
extern mp4_Status mp4_Parse_VideoObject(mp4_Info* pInfo);
extern mp4_Status mp4_Parse_GroupOfVideoObjectPlane(mp4_Info* pInfo);
extern mp4_Status mp4_Parse_VideoObjectPlane(mp4_Info* pInfo);
extern mp4_Status mp4_DecodeVideoObjectPlane(mp4_Info* pInfo);

#ifndef USE_INLINE_BITS_FUNC
extern uint32_t mp4_ShowBits(mp4_Info* pInfo, int32_t n);
extern uint32_t mp4_ShowBit(mp4_Info* pInfo);
extern uint32_t mp4_ShowBits9(mp4_Info* pInfo, int32_t n);
extern void   mp4_FlushBits(mp4_Info* pInfo, int32_t n);
extern uint32_t mp4_GetBits(mp4_Info* pInfo, int32_t n);
//extern uint32_t mp4_GetBit(mp4_Info* pInfo);
extern uint32_t mp4_GetBits9(mp4_Info* pInfo, int32_t n);
extern void   mp4_AlignBits(mp4_Info* pInfo);
extern void   mp4_AlignBits7F(mp4_Info* pInfo);
extern uint32_t mp4_ShowBitsAlign(mp4_Info* pInfo, int32_t n);
extern uint32_t mp4_ShowBitsAlign7F(mp4_Info* pInfo, int32_t n);
#else
__INLINE uint32_t mp4_ShowBits(mp4_Info* pInfo, int32_t n)
{
    uint8_t* ptr = pInfo->bufptr;
    uint32_t tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] <<  8) | (ptr[3]);
    tmp <<= pInfo->bitoff;
    tmp >>= 32 - n;
    return tmp;
}

__INLINE uint32_t mp4_ShowBit(mp4_Info* pInfo)
{
    uint32_t tmp = pInfo->bufptr[0];
    tmp >>= 7 - pInfo->bitoff;
    return (tmp & 1);
}

__INLINE uint32_t mp4_ShowBits9(mp4_Info* pInfo, int32_t n)
{
    uint8_t* ptr = pInfo->bufptr;
    uint32_t tmp = (ptr[0] <<  8) | ptr[1];
    tmp <<= (pInfo->bitoff + 16);
    tmp >>= 32 - n;
    return tmp;
}

__INLINE void mp4_FlushBits(mp4_Info* pInfo, int32_t n)
{
    n = n + pInfo->bitoff;
    pInfo->bufptr += n >> 3;
    pInfo->bitoff = n & 7;
}

__INLINE uint32_t mp4_GetBits(mp4_Info* pInfo, int32_t n)
{
    uint8_t* ptr = pInfo->bufptr;
    uint32_t tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] <<  8) | (ptr[3]);
    tmp <<= pInfo->bitoff;
    tmp >>= 32 - n;
    n = n + pInfo->bitoff;
    pInfo->bufptr += n >> 3;
    pInfo->bitoff = n & 7;
    return tmp;
}

__INLINE uint32_t mp4_GetBits9(mp4_Info* pInfo, int32_t n)
{
    uint8_t* ptr = pInfo->bufptr;
    uint32_t tmp = (ptr[0] <<  8) | ptr[1];
    tmp <<= (pInfo->bitoff + 16);
    tmp >>= 32 - n;
    n = n + pInfo->bitoff;
    pInfo->bufptr += n >> 3;
    pInfo->bitoff = n & 7;
    return tmp;
}

__INLINE void mp4_AlignBits(mp4_Info* pInfo)
{
    if (pInfo->bitoff > 0) {
        pInfo->bitoff = 0;
        (pInfo->bufptr)++;
    }
}

__INLINE void mp4_AlignBits7F(mp4_Info* pInfo)
{
    if (pInfo->bitoff > 0) {
        pInfo->bitoff = 0;
        (pInfo->bufptr)++;
    } else {
        if (*pInfo->bufptr == 0x7F)
            (pInfo->bufptr)++;
    }
}

__INLINE uint32_t mp4_ShowBitsAlign(mp4_Info* pInfo, int32_t n)
{
    uint8_t* ptr = pInfo->bitoff ? (pInfo->bufptr + 1) : pInfo->bufptr;
    uint32_t tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] <<  8) | (ptr[3]);
    tmp >>= 32 - n;
    return tmp;
}

__INLINE uint32_t mp4_ShowBitsAlign7F(mp4_Info* pInfo, int32_t n)
{
    uint8_t* ptr = pInfo->bitoff ? (pInfo->bufptr + 1) : pInfo->bufptr;
    uint32_t tmp;
    if (!pInfo->bitoff) {
        if (*ptr == 0x7F)
            ptr ++;
    }
    tmp = (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] <<  8) | (ptr[3]);
    tmp >>= 32 - n;
    return tmp;
}

#endif // USE_INLINE_BITS_FUNC

__INLINE uint32_t mp4_GetBit(mp4_Info* pInfo)
{
    uint32_t tmp = pInfo->bufptr[0];
    if (pInfo->bitoff != 7) {
        tmp >>= 7 - pInfo->bitoff;
        pInfo->bitoff ++;
    } else {
        pInfo->bitoff = 0;
        pInfo->bufptr ++;
    }
    return (tmp & 1);
}

__INLINE int32_t mp4_GetMarkerBit(mp4_Info* pInfo) {
    if (!mp4_GetBit(pInfo)) {
        mp4_Error("Error: wrong marker bit");
        return 0;
    }
    return 1;
}

// added by benski
extern mp4_Frame *CreateFrame(mp4_VisualObject *object);
extern void ReleaseFrame(mp4_VisualObject *object, mp4_Frame *frame);
extern mp4_Frame *GetDisplayFrame(mp4_VisualObject *object);
extern void DisplayFrame(mp4_VisualObject *object, mp4_Frame *frame);
extern void FreeCache(mp4_VisualObject *object);

#ifdef __cplusplus
}
#endif