1/*
2 * ISO Media common code
3 * copyright (c) 2001 Fabrice Bellard
4 * copyright (c) 2002 Francois Revol <revol@free.fr>
5 * copyright (c) 2006 Baptiste Coudurier <baptiste.coudurier@free.fr>
6 *
7 * This file is part of Libav.
8 *
9 * Libav is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * Libav is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with Libav; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24#ifndef AVFORMAT_ISOM_H
25#define AVFORMAT_ISOM_H
26
27#include "avio.h"
28#include "internal.h"
29#include "dv.h"
30
31/* isom.c */
32extern const AVCodecTag ff_mp4_obj_type[];
33extern const AVCodecTag codec_movvideo_tags[];
34extern const AVCodecTag codec_movaudio_tags[];
35extern const AVCodecTag ff_codec_movsubtitle_tags[];
36
37int ff_mov_iso639_to_lang(const char lang[4], int mp4);
38int ff_mov_lang_to_iso639(unsigned code, char to[4]);
39
40/* the QuickTime file format is quite convoluted...
41 * it has lots of index tables, each indexing something in another one...
42 * Here we just use what is needed to read the chunks
43 */
44
45typedef struct {
46    int count;
47    int duration;
48} MOVStts;
49
50typedef struct {
51    int first;
52    int count;
53    int id;
54} MOVStsc;
55
56typedef struct {
57    uint32_t type;
58    char *path;
59    char *dir;
60    char volume[28];
61    char filename[64];
62    int16_t nlvl_to, nlvl_from;
63} MOVDref;
64
65typedef struct {
66    uint32_t type;
67    int64_t size; /* total size (excluding the size and type fields) */
68} MOVAtom;
69
70struct MOVParseTableEntry;
71
72typedef struct {
73    unsigned track_id;
74    uint64_t base_data_offset;
75    uint64_t moof_offset;
76    unsigned stsd_id;
77    unsigned duration;
78    unsigned size;
79    unsigned flags;
80} MOVFragment;
81
82typedef struct {
83    unsigned track_id;
84    unsigned stsd_id;
85    unsigned duration;
86    unsigned size;
87    unsigned flags;
88} MOVTrackExt;
89
90typedef struct MOVStreamContext {
91    AVIOContext *pb;
92    int ffindex;          ///< AVStream index
93    int next_chunk;
94    unsigned int chunk_count;
95    int64_t *chunk_offsets;
96    unsigned int stts_count;
97    MOVStts *stts_data;
98    unsigned int ctts_count;
99    MOVStts *ctts_data;
100    unsigned int stsc_count;
101    MOVStsc *stsc_data;
102    unsigned int stps_count;
103    unsigned *stps_data;  ///< partial sync sample for mpeg-2 open gop
104    int ctts_index;
105    int ctts_sample;
106    unsigned int sample_size;
107    unsigned int sample_count;
108    int *sample_sizes;
109    unsigned int keyframe_count;
110    int *keyframes;
111    int time_scale;
112    int64_t time_offset;  ///< time offset of the first edit list entry
113    int current_sample;
114    unsigned int bytes_per_frame;
115    unsigned int samples_per_frame;
116    int dv_audio_container;
117    int pseudo_stream_id; ///< -1 means demux all ids
118    int16_t audio_cid;    ///< stsd audio compression id
119    unsigned drefs_count;
120    MOVDref *drefs;
121    int dref_id;
122    int wrong_dts;        ///< dts are wrong due to huge ctts offset (iMovie files)
123    int width;            ///< tkhd width
124    int height;           ///< tkhd height
125    int dts_shift;        ///< dts shift when ctts is negative
126    uint32_t palette[256];
127    int has_palette;
128} MOVStreamContext;
129
130typedef struct MOVContext {
131    AVFormatContext *fc;
132    int time_scale;
133    int64_t duration;     ///< duration of the longest track
134    int found_moov;       ///< 'moov' atom has been found
135    int found_mdat;       ///< 'mdat' atom has been found
136    DVDemuxContext *dv_demux;
137    AVFormatContext *dv_fctx;
138    int isom;             ///< 1 if file is ISO Media (mp4/3gp)
139    MOVFragment fragment; ///< current fragment in moof atom
140    MOVTrackExt *trex_data;
141    unsigned trex_count;
142    int itunes_metadata;  ///< metadata are itunes style
143    int chapter_track;
144} MOVContext;
145
146int ff_mp4_read_descr_len(AVIOContext *pb);
147int ff_mp4_read_descr(AVFormatContext *fc, AVIOContext *pb, int *tag);
148int ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext *pb);
149void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id);
150
151#define MP4ODescrTag                    0x01
152#define MP4IODescrTag                   0x02
153#define MP4ESDescrTag                   0x03
154#define MP4DecConfigDescrTag            0x04
155#define MP4DecSpecificDescrTag          0x05
156#define MP4SLDescrTag                   0x06
157
158int ff_mov_read_esds(AVFormatContext *fc, AVIOContext *pb, MOVAtom atom);
159enum CodecID ff_mov_get_lpcm_codec_id(int bps, int flags);
160
161int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries);
162
163#endif /* AVFORMAT_ISOM_H */
164