summaryrefslogtreecommitdiffstats
path: root/libmpdemux/parse_mp4.h
blob: 72b06b986cffa42786315ac0f773b0b23e88380f (plain)
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
/*
 * MP4 file format parser code
 *
 * Copyright (C) 2002 by Felix Buenemann <atmosfear at users.sourceforge.net>
 * Code inspired by libmp4 from http://mpeg4ip.sourceforge.net/.
 *
 * This file is part of MPlayer.
 *
 * MPlayer is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * MPlayer is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#ifndef MPLAYER_PARSE_MP4_H
#define MPLAYER_PARSE_MP4_H

#include <inttypes.h>

/* one byte tag identifiers */
#define MP4ODescrTag			0x01 
#define MP4IODescrTag			0x02 
#define MP4ESDescrTag			0x03 
#define MP4DecConfigDescrTag		0x04 
#define MP4DecSpecificDescrTag		0x05 
#define MP4SLConfigDescrTag		0x06 
#define MP4ContentIdDescrTag		0x07 
#define MP4SupplContentIdDescrTag	0x08 
#define MP4IPIPtrDescrTag		0x09 
#define MP4IPMPPtrDescrTag		0x0A 
#define MP4IPMPDescrTag			0x0B 
#define MP4RegistrationDescrTag		0x0D 
#define MP4ESIDIncDescrTag		0x0E 
#define MP4ESIDRefDescrTag		0x0F 
#define MP4FileIODescrTag		0x10 
#define MP4FileODescrTag		0x11 
#define MP4ExtProfileLevelDescrTag	0x13 
#define MP4ExtDescrTagsStart		0x80 
#define MP4ExtDescrTagsEnd		0xFE 

/* object type identifiers in the ESDS */
/* See http://gpac.sourceforge.net/tutorial/mediatypes.htm */
/* BIFS stream version 1 */
#define MP4OTI_MPEG4Systems1                                0x01
/* BIFS stream version 2 */
#define MP4OTI_MPEG4Systems2                                0x02
/* MPEG-4 visual stream */
#define MP4OTI_MPEG4Visual                                  0x20
/* MPEG-4 audio stream */
#define MP4OTI_MPEG4Audio                                   0x40
/* MPEG-2 visual streams with various profiles */
#define MP4OTI_MPEG2VisualSimple                            0x60
#define MP4OTI_MPEG2VisualMain                              0x61
#define MP4OTI_MPEG2VisualSNR                               0x62
#define MP4OTI_MPEG2VisualSpatial                           0x63
#define MP4OTI_MPEG2VisualHigh                              0x64
#define MP4OTI_MPEG2Visual422                               0x65
/* MPEG-2 audio stream part 7 ("AAC") with various profiles */
#define MP4OTI_MPEG2AudioMain                               0x66
#define MP4OTI_MPEG2AudioLowComplexity                      0x67
#define MP4OTI_MPEG2AudioScaleableSamplingRate              0x68
/* MPEG-2 audio part 3 ("MP3") */
#define MP4OTI_MPEG2AudioPart3                              0x69
/* MPEG-1 visual visual stream */
#define MP4OTI_MPEG1Visual                                  0x6A
/* MPEG-1 audio stream part 3 ("MP3") */
#define MP4OTI_MPEG1Audio                                   0x6B
/* JPEG visual stream */
#define MP4OTI_JPEG                                         0x6C
/* 3GPP2 */
#define MP4OTI_13kVoice                                     0xE1

/* I define uint24 here for better understanding */
#ifndef uint24_t
#define uint24_t uint32_t
#endif

/* esds_t */
typedef struct {
  uint8_t  version;
  uint24_t flags;
  
  /* 0x03 ESDescrTag */
  uint16_t ESId;
  uint8_t  streamPriority;
  
  /* 0x04 DecConfigDescrTag */
  uint8_t  objectTypeId;
  uint8_t  streamType;
  /* XXX: really streamType is
   * only 6bit, followed by:
   * 1bit  upStream
   * 1bit  reserved
   */  
  uint24_t bufferSizeDB;
  uint32_t maxBitrate;
  uint32_t avgBitrate;

  /* 0x05 DecSpecificDescrTag */
  uint16_t  decoderConfigLen;
  uint8_t *decoderConfig;

  /* 0x06 SLConfigDescrTag */
  uint8_t  SLConfigLen;
  uint8_t *SLConfig;

  /* TODO: add the missing tags,
   * I currently have no specs
   * for them and doubt they
   * are currently needed ::atmos
   */
  
} esds_t;

int mp4_parse_esds(unsigned char *data, int datalen, esds_t *esds);
void mp4_free_esds(esds_t *esds); 

#endif /* MPLAYER_PARSE_MP4_H */