annotate mov.c @ 6455:3f50c7effad1 libavformat

rtsp: 10l, try to update the correct rtp stream This fixes a bug from rev 22917. Now RTSP streams where the individual RTCP sender reports aren't sent at the same time actually are synced properly.
author mstorsjo
date Fri, 03 Sep 2010 07:10:21 +0000
parents e630da0f5861
children b6e3e7876e4c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1 /*
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2 * MOV demuxer
4251
77e0c7511d41 cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 4242
diff changeset
3 * Copyright (c) 2001 Fabrice Bellard
4722
639c428c8b23 typo in the mail, the 4am commit is always the worst
bcoudurier
parents: 4720
diff changeset
4 * Copyright (c) 2009 Baptiste Coudurier <baptiste dot coudurier at gmail dot com>
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
5 *
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
6 * This file is part of FFmpeg.
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
7 *
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
12 *
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
16 * Lesser General Public License for more details.
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
17 *
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
21 */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
22
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
23 #include <limits.h>
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
24
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
25 //#define DEBUG
4726
1ce512298dbd more generic metadata handling
bcoudurier
parents: 4725
diff changeset
26 //#define DEBUG_METADATA
1ce512298dbd more generic metadata handling
bcoudurier
parents: 4725
diff changeset
27 //#define MOV_EXPORT_ALL_METADATA
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
28
4201
7d2f3f1b68d8 Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents: 4197
diff changeset
29 #include "libavutil/intreadwrite.h"
4485
9267b8cf7918 use new metadata API in mov demuxer
aurel
parents: 4454
diff changeset
30 #include "libavutil/avstring.h"
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
31 #include "avformat.h"
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
32 #include "riff.h"
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
33 #include "isom.h"
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3267
diff changeset
34 #include "libavcodec/mpeg4audio.h"
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 3267
diff changeset
35 #include "libavcodec/mpegaudiodata.h"
4872
304a0ea063f0 Rename bitstream.h to get_bits.h.
stefano
parents: 4835
diff changeset
36 #include "libavcodec/get_bits.h"
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
37
4206
c3102b189cb6 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 4202
diff changeset
38 #if CONFIG_ZLIB
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
39 #include <zlib.h>
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
40 #endif
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
41
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
42 /*
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
43 * First version by Francois Revol revol@free.fr
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
44 * Seek function by Gael Chardon gael.dev@4now.net
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
45 *
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
46 * Features and limitations:
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
47 * - reads most of the QT files I have (at least the structure),
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
48 * Sample QuickTime files with mp3 audio can be found at: http://www.3ivx.com/showcase.html
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
49 * - the code is quite ugly... maybe I won't do it recursive next time :-)
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
50 *
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
51 * Funny I didn't know about http://sourceforge.net/projects/qt-ffmpeg/
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
52 * when coding this :) (it's a writer anyway)
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
53 *
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
54 * Reference documents:
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
55 * http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
56 * Apple:
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
57 * http://developer.apple.com/documentation/QuickTime/QTFF/
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
58 * http://developer.apple.com/documentation/QuickTime/QTFF/qtff.pdf
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
59 * QuickTime is a trademark of Apple (AFAIK :))
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
60 */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
61
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
62 #include "qtpalette.h"
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
63
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
64
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
65 #undef NDEBUG
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
66 #include <assert.h>
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
67
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
68 /* XXX: it's the first time I make a recursive parser I think... sorry if it's ugly :P */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
69
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
70 /* those functions parse an atom */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
71 /* return code:
3160
1306bdb603c3 indentation
bcoudurier
parents: 3156
diff changeset
72 0: continue to parse next atom
3175
55ce214a13ea typo: occured --> occurred
diego
parents: 3173
diff changeset
73 <0: error occurred, exit
3160
1306bdb603c3 indentation
bcoudurier
parents: 3156
diff changeset
74 */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
75 /* links atom IDs to parse functions */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
76 typedef struct MOVParseTableEntry {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
77 uint32_t type;
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
78 int (*parse)(MOVContext *ctx, ByteIOContext *pb, MOVAtom atom);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
79 } MOVParseTableEntry;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
80
2820
95ce00ad6f3e save pointer to parse table, it is unlikely to change
bcoudurier
parents: 2819
diff changeset
81 static const MOVParseTableEntry mov_default_parse_table[];
95ce00ad6f3e save pointer to parse table, it is unlikely to change
bcoudurier
parents: 2819
diff changeset
82
4728
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
83 static int mov_metadata_trkn(MOVContext *c, ByteIOContext *pb, unsigned len)
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
84 {
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
85 char buf[16];
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
86
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
87 get_be16(pb); // unknown
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
88 snprintf(buf, sizeof(buf), "%d", get_be16(pb));
5982
f74198942337 Mark av_metadata_set() as deprecated, and use av_metadata_set2()
stefano
parents: 5975
diff changeset
89 av_metadata_set2(&c->fc->metadata, "track", buf, 0);
4728
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
90
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
91 get_be16(pb); // total tracks
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
92
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
93 return 0;
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
94 }
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
95
5790
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
96 static const uint32_t mac_to_unicode[128] = {
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
97 0x00C4,0x00C5,0x00C7,0x00C9,0x00D1,0x00D6,0x00DC,0x00E1,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
98 0x00E0,0x00E2,0x00E4,0x00E3,0x00E5,0x00E7,0x00E9,0x00E8,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
99 0x00EA,0x00EB,0x00ED,0x00EC,0x00EE,0x00EF,0x00F1,0x00F3,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
100 0x00F2,0x00F4,0x00F6,0x00F5,0x00FA,0x00F9,0x00FB,0x00FC,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
101 0x2020,0x00B0,0x00A2,0x00A3,0x00A7,0x2022,0x00B6,0x00DF,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
102 0x00AE,0x00A9,0x2122,0x00B4,0x00A8,0x2260,0x00C6,0x00D8,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
103 0x221E,0x00B1,0x2264,0x2265,0x00A5,0x00B5,0x2202,0x2211,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
104 0x220F,0x03C0,0x222B,0x00AA,0x00BA,0x03A9,0x00E6,0x00F8,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
105 0x00BF,0x00A1,0x00AC,0x221A,0x0192,0x2248,0x2206,0x00AB,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
106 0x00BB,0x2026,0x00A0,0x00C0,0x00C3,0x00D5,0x0152,0x0153,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
107 0x2013,0x2014,0x201C,0x201D,0x2018,0x2019,0x00F7,0x25CA,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
108 0x00FF,0x0178,0x2044,0x20AC,0x2039,0x203A,0xFB01,0xFB02,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
109 0x2021,0x00B7,0x201A,0x201E,0x2030,0x00C2,0x00CA,0x00C1,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
110 0x00CB,0x00C8,0x00CD,0x00CE,0x00CF,0x00CC,0x00D3,0x00D4,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
111 0xF8FF,0x00D2,0x00DA,0x00DB,0x00D9,0x0131,0x02C6,0x02DC,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
112 0x00AF,0x02D8,0x02D9,0x02DA,0x00B8,0x02DD,0x02DB,0x02C7,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
113 };
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
114
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
115 static int mov_read_mac_string(MOVContext *c, ByteIOContext *pb, int len,
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
116 char *dst, int dstlen)
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
117 {
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
118 char *p = dst;
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
119 char *end = dst+dstlen-1;
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
120 int i;
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
121
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
122 for (i = 0; i < len; i++) {
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
123 uint8_t t, c = get_byte(pb);
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
124 if (c < 0x80 && p < end)
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
125 *p++ = c;
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
126 else
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
127 PUT_UTF8(mac_to_unicode[c-0x80], t, if (p < end) *p++ = t;);
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
128 }
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
129 *p = 0;
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
130 return p - dst;
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
131 }
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
132
4727
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
133 static int mov_read_udta_string(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
134 {
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
135 #ifdef MOV_EXPORT_ALL_METADATA
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
136 char tmp_key[5];
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
137 #endif
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
138 char str[1024], key2[16], language[4] = {0};
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
139 const char *key = NULL;
5790
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
140 uint16_t str_size, langcode = 0;
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
141 uint32_t data_type = 0;
4728
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
142 int (*parse)(MOVContext*, ByteIOContext*, unsigned) = NULL;
4727
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
143
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
144 switch (atom.type) {
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
145 case MKTAG(0xa9,'n','a','m'): key = "title"; break;
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
146 case MKTAG(0xa9,'a','u','t'):
6040
2bab410094e0 change author metadata to artist in mov de/muxer
bcoudurier
parents: 5991
diff changeset
147 case MKTAG(0xa9,'A','R','T'): key = "artist"; break;
5342
d2db7a53bc0d fix \0xa9wrt metadata, to composer, fix issue #1501
bcoudurier
parents: 5332
diff changeset
148 case MKTAG(0xa9,'w','r','t'): key = "composer"; break;
5383
79b48fe3d753 MOV: cprt is another tag used for copyright
conrad
parents: 5382
diff changeset
149 case MKTAG( 'c','p','r','t'):
4727
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
150 case MKTAG(0xa9,'c','p','y'): key = "copyright"; break;
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
151 case MKTAG(0xa9,'c','m','t'):
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
152 case MKTAG(0xa9,'i','n','f'): key = "comment"; break;
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
153 case MKTAG(0xa9,'a','l','b'): key = "album"; break;
5618
27fd77f20a89 Add a list of generic tags and change demuxers to follow it.
pross
parents: 5586
diff changeset
154 case MKTAG(0xa9,'d','a','y'): key = "date"; break;
4727
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
155 case MKTAG(0xa9,'g','e','n'): key = "genre"; break;
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
156 case MKTAG(0xa9,'t','o','o'):
5354
0f7d0b4f9bd8 change \0xa9enc tag metadata name to encoder to match id3v2
bcoudurier
parents: 5351
diff changeset
157 case MKTAG(0xa9,'e','n','c'): key = "encoder"; break;
5382
45d0832f48b6 MOV: Add several iTunes metadata tags
conrad
parents: 5371
diff changeset
158 case MKTAG( 'd','e','s','c'): key = "description";break;
45d0832f48b6 MOV: Add several iTunes metadata tags
conrad
parents: 5371
diff changeset
159 case MKTAG( 'l','d','e','s'): key = "synopsis"; break;
45d0832f48b6 MOV: Add several iTunes metadata tags
conrad
parents: 5371
diff changeset
160 case MKTAG( 't','v','s','h'): key = "show"; break;
45d0832f48b6 MOV: Add several iTunes metadata tags
conrad
parents: 5371
diff changeset
161 case MKTAG( 't','v','e','n'): key = "episode_id";break;
45d0832f48b6 MOV: Add several iTunes metadata tags
conrad
parents: 5371
diff changeset
162 case MKTAG( 't','v','n','n'): key = "network"; break;
4728
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
163 case MKTAG( 't','r','k','n'): key = "track";
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
164 parse = mov_metadata_trkn; break;
4727
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
165 }
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
166
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
167 if (c->itunes_metadata && atom.size > 8) {
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
168 int data_size = get_be32(pb);
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
169 int tag = get_le32(pb);
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
170 if (tag == MKTAG('d','a','t','a')) {
5790
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
171 data_type = get_be32(pb); // type
4727
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
172 get_be32(pb); // unknown
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
173 str_size = data_size - 16;
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
174 atom.size -= 16;
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
175 } else return 0;
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
176 } else if (atom.size > 4 && key && !c->itunes_metadata) {
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
177 str_size = get_be16(pb); // string length
5790
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
178 langcode = get_be16(pb);
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
179 ff_mov_lang_to_iso639(langcode, language);
4727
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
180 atom.size -= 4;
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
181 } else
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
182 str_size = atom.size;
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
183
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
184 #ifdef MOV_EXPORT_ALL_METADATA
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
185 if (!key) {
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
186 snprintf(tmp_key, 5, "%.4s", (char*)&atom.type);
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
187 key = tmp_key;
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
188 }
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
189 #endif
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
190
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
191 if (!key)
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
192 return 0;
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
193 if (atom.size < 0)
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
194 return -1;
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
195
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
196 str_size = FFMIN3(sizeof(str)-1, str_size, atom.size);
4728
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
197
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
198 if (parse)
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
199 parse(c, pb, str_size);
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
200 else {
5790
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
201 if (data_type == 3 || (data_type == 0 && langcode < 0x800)) { // MAC Encoded
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
202 mov_read_mac_string(c, pb, str_size, str, sizeof(str));
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
203 } else {
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
204 get_buffer(pb, str, str_size);
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
205 str[str_size] = 0;
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
206 }
5982
f74198942337 Mark av_metadata_set() as deprecated, and use av_metadata_set2()
stefano
parents: 5975
diff changeset
207 av_metadata_set2(&c->fc->metadata, key, str, 0);
4729
276616a5db61 reindent
bcoudurier
parents: 4728
diff changeset
208 if (*language && strcmp(language, "und")) {
276616a5db61 reindent
bcoudurier
parents: 4728
diff changeset
209 snprintf(key2, sizeof(key2), "%s-%s", key, language);
5982
f74198942337 Mark av_metadata_set() as deprecated, and use av_metadata_set2()
stefano
parents: 5975
diff changeset
210 av_metadata_set2(&c->fc->metadata, key2, str, 0);
4729
276616a5db61 reindent
bcoudurier
parents: 4728
diff changeset
211 }
4728
188b0585e5b6 fix trkn metadata parsing
bcoudurier
parents: 4727
diff changeset
212 }
4727
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
213 #ifdef DEBUG_METADATA
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
214 av_log(c->fc, AV_LOG_DEBUG, "lang \"%3s\" ", language);
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
215 av_log(c->fc, AV_LOG_DEBUG, "tag \"%s\" value \"%s\" atom \"%.4s\" %d %lld\n",
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
216 key, str, (char*)&atom.type, str_size, atom.size);
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
217 #endif
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
218
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
219 return 0;
245cabbfa676 move read_udta_string up to avoid forward declaration
bcoudurier
parents: 4726
diff changeset
220 }
4726
1ce512298dbd more generic metadata handling
bcoudurier
parents: 4725
diff changeset
221
5991
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
222 static int mov_read_chpl(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
223 {
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
224 int64_t start;
6230
fceb0e489495 mov: Read Flash's chpl variant
conrad
parents: 6213
diff changeset
225 int i, nb_chapters, str_len, version;
5991
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
226 char str[256+1];
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
227
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
228 if ((atom.size -= 5) < 0)
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
229 return 0;
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
230
6230
fceb0e489495 mov: Read Flash's chpl variant
conrad
parents: 6213
diff changeset
231 version = get_byte(pb);
fceb0e489495 mov: Read Flash's chpl variant
conrad
parents: 6213
diff changeset
232 get_be24(pb);
fceb0e489495 mov: Read Flash's chpl variant
conrad
parents: 6213
diff changeset
233 if (version)
fceb0e489495 mov: Read Flash's chpl variant
conrad
parents: 6213
diff changeset
234 get_be32(pb); // ???
5991
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
235 nb_chapters = get_byte(pb);
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
236
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
237 for (i = 0; i < nb_chapters; i++) {
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
238 if (atom.size < 9)
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
239 return 0;
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
240
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
241 start = get_be64(pb);
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
242 str_len = get_byte(pb);
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
243
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
244 if ((atom.size -= 9+str_len) < 0)
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
245 return 0;
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
246
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
247 get_buffer(pb, str, str_len);
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
248 str[str_len] = 0;
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
249 ff_new_chapter(c->fc, i, (AVRational){1,10000000}, start, AV_NOPTS_VALUE, str);
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
250 }
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
251 return 0;
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
252 }
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
253
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
254 static int mov_read_default(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
255 {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
256 int64_t total_size = 0;
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
257 MOVAtom a;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
258 int i;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
259
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
260 if (atom.size < 0)
2026
2e2c2dbb511d use INT64_MAX
bcoudurier
parents: 2023
diff changeset
261 atom.size = INT64_MAX;
5497
59df3b64dc89 cosmetics, remove useless parentheses, add space
bcoudurier
parents: 5496
diff changeset
262 while (total_size + 8 < atom.size && !url_feof(pb)) {
4726
1ce512298dbd more generic metadata handling
bcoudurier
parents: 4725
diff changeset
263 int (*parse)(MOVContext*, ByteIOContext*, MOVAtom) = NULL;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
264 a.size = atom.size;
2826
24ad70087e67 useless 0L here
bcoudurier
parents: 2825
diff changeset
265 a.type=0;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
266 if(atom.size >= 8) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
267 a.size = get_be32(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
268 a.type = get_le32(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
269 }
6173
1b9079c05f9a Improve mov atom parsing debug message, print parent atom and size in decimal
bcoudurier
parents: 6040
diff changeset
270 dprintf(c->fc, "type: %08x '%.4s' parent:'%.4s' sz: %"PRId64" %"PRId64" %"PRId64"\n",
1b9079c05f9a Improve mov atom parsing debug message, print parent atom and size in decimal
bcoudurier
parents: 6040
diff changeset
271 a.type, (char*)&a.type, (char*)&atom.type, a.size, total_size, atom.size);
6197
d81e41261983 In mov demuxer, increase total size after debugging message
bcoudurier
parents: 6173
diff changeset
272 total_size += 8;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
273 if (a.size == 1) { /* 64 bit extended size */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
274 a.size = get_be64(pb) - 8;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
275 total_size += 8;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
276 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
277 if (a.size == 0) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
278 a.size = atom.size - total_size;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
279 if (a.size <= 8)
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
280 break;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
281 }
1964
4571a481081d move atom size check before parsing function search
bcoudurier
parents: 1963
diff changeset
282 a.size -= 8;
2660
022174d849d5 fix issue 225, instead of stoping when wrong atom size is found,
bcoudurier
parents: 2589
diff changeset
283 if(a.size < 0)
1964
4571a481081d move atom size check before parsing function search
bcoudurier
parents: 1963
diff changeset
284 break;
2665
9645f395842d use FFMIN
bcoudurier
parents: 2660
diff changeset
285 a.size = FFMIN(a.size, atom.size - total_size);
1964
4571a481081d move atom size check before parsing function search
bcoudurier
parents: 1963
diff changeset
286
4726
1ce512298dbd more generic metadata handling
bcoudurier
parents: 4725
diff changeset
287 for (i = 0; mov_default_parse_table[i].type; i++)
1ce512298dbd more generic metadata handling
bcoudurier
parents: 4725
diff changeset
288 if (mov_default_parse_table[i].type == a.type) {
1ce512298dbd more generic metadata handling
bcoudurier
parents: 4725
diff changeset
289 parse = mov_default_parse_table[i].parse;
1ce512298dbd more generic metadata handling
bcoudurier
parents: 4725
diff changeset
290 break;
1ce512298dbd more generic metadata handling
bcoudurier
parents: 4725
diff changeset
291 }
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
292
4726
1ce512298dbd more generic metadata handling
bcoudurier
parents: 4725
diff changeset
293 // container is user data
1ce512298dbd more generic metadata handling
bcoudurier
parents: 4725
diff changeset
294 if (!parse && (atom.type == MKTAG('u','d','t','a') ||
1ce512298dbd more generic metadata handling
bcoudurier
parents: 4725
diff changeset
295 atom.type == MKTAG('i','l','s','t')))
1ce512298dbd more generic metadata handling
bcoudurier
parents: 4725
diff changeset
296 parse = mov_read_udta_string;
1ce512298dbd more generic metadata handling
bcoudurier
parents: 4725
diff changeset
297
1ce512298dbd more generic metadata handling
bcoudurier
parents: 4725
diff changeset
298 if (!parse) { /* skip leaf atoms data */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
299 url_fskip(pb, a.size);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
300 } else {
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3967
diff changeset
301 int64_t start_pos = url_ftell(pb);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
302 int64_t left;
5496
324c7c25e4ad simplify error handling in mov_read_default
bcoudurier
parents: 5495
diff changeset
303 int err = parse(c, pb, a);
324c7c25e4ad simplify error handling in mov_read_default
bcoudurier
parents: 5495
diff changeset
304 if (err < 0)
324c7c25e4ad simplify error handling in mov_read_default
bcoudurier
parents: 5495
diff changeset
305 return err;
5545
3a5082b94ab3 do not skip mdat data if it's the last atom, avoids one seek
bcoudurier
parents: 5497
diff changeset
306 if (c->found_moov && c->found_mdat &&
3a5082b94ab3 do not skip mdat data if it's the last atom, avoids one seek
bcoudurier
parents: 5497
diff changeset
307 (url_is_streamed(pb) || start_pos + a.size == url_fsize(pb)))
3a5082b94ab3 do not skip mdat data if it's the last atom, avoids one seek
bcoudurier
parents: 5497
diff changeset
308 return 0;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
309 left = a.size - url_ftell(pb) + start_pos;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
310 if (left > 0) /* skip garbage at atom end */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
311 url_fskip(pb, left);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
312 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
313
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
314 total_size += a.size;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
315 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
316
5496
324c7c25e4ad simplify error handling in mov_read_default
bcoudurier
parents: 5495
diff changeset
317 if (total_size < atom.size && atom.size < 0x7ffff)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
318 url_fskip(pb, atom.size - total_size);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
319
5496
324c7c25e4ad simplify error handling in mov_read_default
bcoudurier
parents: 5495
diff changeset
320 return 0;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
321 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
322
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
323 static int mov_read_dref(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
324 {
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
325 AVStream *st;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
326 MOVStreamContext *sc;
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
327 int entries, i, j;
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
328
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
329 if (c->fc->nb_streams < 1)
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
330 return 0;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
331 st = c->fc->streams[c->fc->nb_streams-1];
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
332 sc = st->priv_data;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
333
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
334 get_be32(pb); // version + flags
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
335 entries = get_be32(pb);
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
336 if (entries >= UINT_MAX / sizeof(*sc->drefs))
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
337 return -1;
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
338 sc->drefs = av_mallocz(entries * sizeof(*sc->drefs));
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
339 if (!sc->drefs)
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
340 return AVERROR(ENOMEM);
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
341 sc->drefs_count = entries;
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
342
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
343 for (i = 0; i < sc->drefs_count; i++) {
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
344 MOVDref *dref = &sc->drefs[i];
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
345 uint32_t size = get_be32(pb);
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3967
diff changeset
346 int64_t next = url_ftell(pb) + size - 4;
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
347
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
348 dref->type = get_le32(pb);
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
349 get_be32(pb); // version + flags
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
350 dprintf(c->fc, "type %.4s size %d\n", (char*)&dref->type, size);
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
351
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
352 if (dref->type == MKTAG('a','l','i','s') && size > 150) {
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
353 /* macintosh alias record */
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
354 uint16_t volume_len, len;
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
355 int16_t type;
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
356
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
357 url_fskip(pb, 10);
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
358
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
359 volume_len = get_byte(pb);
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
360 volume_len = FFMIN(volume_len, 27);
5369
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
361 get_buffer(pb, dref->volume, 27);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
362 dref->volume[volume_len] = 0;
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
363 av_log(c->fc, AV_LOG_DEBUG, "volume %s, len %d\n", dref->volume, volume_len);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
364
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
365 url_fskip(pb, 12);
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
366
5369
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
367 len = get_byte(pb);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
368 len = FFMIN(len, 63);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
369 get_buffer(pb, dref->filename, 63);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
370 dref->filename[len] = 0;
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
371 av_log(c->fc, AV_LOG_DEBUG, "filename %s, len %d\n", dref->filename, len);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
372
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
373 url_fskip(pb, 16);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
374
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
375 /* read next level up_from_alias/down_to_target */
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
376 dref->nlvl_from = get_be16(pb);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
377 dref->nlvl_to = get_be16(pb);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
378 av_log(c->fc, AV_LOG_DEBUG, "nlvl from %d, nlvl to %d\n",
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
379 dref->nlvl_from, dref->nlvl_to);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
380
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
381 url_fskip(pb, 16);
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
382
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
383 for (type = 0; type != -1 && url_ftell(pb) < next; ) {
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
384 type = get_be16(pb);
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
385 len = get_be16(pb);
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
386 av_log(c->fc, AV_LOG_DEBUG, "type %d, len %d\n", type, len);
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
387 if (len&1)
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
388 len += 1;
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
389 if (type == 2) { // absolute path
3092
f9cacbd12145 free in case of multiple type == 2
bcoudurier
parents: 3091
diff changeset
390 av_free(dref->path);
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
391 dref->path = av_mallocz(len+1);
3091
b8df4b5e16d0 return error if malloc fails
bcoudurier
parents: 3090
diff changeset
392 if (!dref->path)
b8df4b5e16d0 return error if malloc fails
bcoudurier
parents: 3090
diff changeset
393 return AVERROR(ENOMEM);
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
394 get_buffer(pb, dref->path, len);
5369
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
395 if (len > volume_len && !strncmp(dref->path, dref->volume, volume_len)) {
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
396 len -= volume_len;
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
397 memmove(dref->path, dref->path+volume_len, len);
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
398 dref->path[len] = 0;
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
399 }
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
400 for (j = 0; j < len; j++)
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
401 if (dref->path[j] == ':')
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
402 dref->path[j] = '/';
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
403 av_log(c->fc, AV_LOG_DEBUG, "path %s\n", dref->path);
5369
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
404 } else if (type == 0) { // directory name
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
405 av_free(dref->dir);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
406 dref->dir = av_malloc(len+1);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
407 if (!dref->dir)
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
408 return AVERROR(ENOMEM);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
409 get_buffer(pb, dref->dir, len);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
410 dref->dir[len] = 0;
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
411 for (j = 0; j < len; j++)
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
412 if (dref->dir[j] == ':')
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
413 dref->dir[j] = '/';
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
414 av_log(c->fc, AV_LOG_DEBUG, "dir %s\n", dref->dir);
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
415 } else
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
416 url_fskip(pb, len);
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
417 }
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
418 }
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
419 url_fseek(pb, next, SEEK_SET);
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
420 }
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
421 return 0;
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
422 }
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
423
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
424 static int mov_read_hdlr(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
425 {
4642
60d5f0997351 MOV: fix crash when 'meta' occurs before first 'trak'
alexc
parents: 4625
diff changeset
426 AVStream *st;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
427 uint32_t type;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
428 uint32_t ctype;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
429
4642
60d5f0997351 MOV: fix crash when 'meta' occurs before first 'trak'
alexc
parents: 4625
diff changeset
430 if (c->fc->nb_streams < 1) // meta before first trak
60d5f0997351 MOV: fix crash when 'meta' occurs before first 'trak'
alexc
parents: 4625
diff changeset
431 return 0;
60d5f0997351 MOV: fix crash when 'meta' occurs before first 'trak'
alexc
parents: 4625
diff changeset
432
60d5f0997351 MOV: fix crash when 'meta' occurs before first 'trak'
alexc
parents: 4625
diff changeset
433 st = c->fc->streams[c->fc->nb_streams-1];
60d5f0997351 MOV: fix crash when 'meta' occurs before first 'trak'
alexc
parents: 4625
diff changeset
434
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
435 get_byte(pb); /* version */
3145
49989c8b181c simplify, flags is 24bits according to specs
bcoudurier
parents: 3135
diff changeset
436 get_be24(pb); /* flags */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
437
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
438 /* component type */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
439 ctype = get_le32(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
440 type = get_le32(pb); /* component subtype */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
441
4730
0d01d01e6a9d simplify printing
bcoudurier
parents: 4729
diff changeset
442 dprintf(c->fc, "ctype= %.4s (0x%08x)\n", (char*)&ctype, ctype);
0d01d01e6a9d simplify printing
bcoudurier
parents: 4729
diff changeset
443 dprintf(c->fc, "stype= %.4s\n", (char*)&type);
4725
f2d519837d2d do not set isom if ctype is not set, happens in mov
bcoudurier
parents: 4724
diff changeset
444
3254
8fb1e55e0a66 align and remove useless braces
bcoudurier
parents: 3253
diff changeset
445 if (type == MKTAG('v','i','d','e'))
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
446 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
447 else if(type == MKTAG('s','o','u','n'))
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
448 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
449 else if(type == MKTAG('m','1','a',' '))
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
450 st->codec->codec_id = CODEC_ID_MP2;
4731
18bcd89f5809 cosmetics, remove useless braces
bcoudurier
parents: 4730
diff changeset
451 else if(type == MKTAG('s','u','b','p'))
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
452 st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
4731
18bcd89f5809 cosmetics, remove useless braces
bcoudurier
parents: 4730
diff changeset
453
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
454 get_be32(pb); /* component manufacture */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
455 get_be32(pb); /* component flags */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
456 get_be32(pb); /* component flags mask */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
457
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
458 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
459 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
460
5205
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
461 int ff_mp4_read_descr_len(ByteIOContext *pb)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
462 {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
463 int len = 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
464 int count = 4;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
465 while (count--) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
466 int c = get_byte(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
467 len = (len << 7) | (c & 0x7f);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
468 if (!(c & 0x80))
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
469 break;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
470 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
471 return len;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
472 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
473
5723
adf1ad73c63e Make mp4_read_descr static: It is only used inside libavformat/mov.c.
cehoyos
parents: 5684
diff changeset
474 static int mp4_read_descr(AVFormatContext *fc, ByteIOContext *pb, int *tag)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
475 {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
476 int len;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
477 *tag = get_byte(pb);
5205
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
478 len = ff_mp4_read_descr_len(pb);
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
479 dprintf(fc, "MPEG4 description: tag=0x%02x len=%d\n", *tag, len);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
480 return len;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
481 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
482
2028
319147157f29 clean and simplify esds reading function
bcoudurier
parents: 2027
diff changeset
483 #define MP4ESDescrTag 0x03
319147157f29 clean and simplify esds reading function
bcoudurier
parents: 2027
diff changeset
484 #define MP4DecConfigDescrTag 0x04
319147157f29 clean and simplify esds reading function
bcoudurier
parents: 2027
diff changeset
485 #define MP4DecSpecificDescrTag 0x05
319147157f29 clean and simplify esds reading function
bcoudurier
parents: 2027
diff changeset
486
3261
bf5f112efcff parse mpeg4audio config to correctly detect mp3on4, fix iso mp3on4 reference files
bcoudurier
parents: 3260
diff changeset
487 static const AVCodecTag mp4_audio_types[] = {
4749
a0e0086f7f52 MOV: Use the AOT enum for the mp4_audio_types mapping.
alexc
parents: 4742
diff changeset
488 { CODEC_ID_MP3ON4, AOT_PS }, /* old mp3on4 draft */
a0e0086f7f52 MOV: Use the AOT enum for the mp4_audio_types mapping.
alexc
parents: 4742
diff changeset
489 { CODEC_ID_MP3ON4, AOT_L1 }, /* layer 1 */
a0e0086f7f52 MOV: Use the AOT enum for the mp4_audio_types mapping.
alexc
parents: 4742
diff changeset
490 { CODEC_ID_MP3ON4, AOT_L2 }, /* layer 2 */
a0e0086f7f52 MOV: Use the AOT enum for the mp4_audio_types mapping.
alexc
parents: 4742
diff changeset
491 { CODEC_ID_MP3ON4, AOT_L3 }, /* layer 3 */
4890
9d87e5e274c8 Introduce codec id for MPEG-4 ALS and associate it with corresponding
jai_menon
parents: 4872
diff changeset
492 { CODEC_ID_MP4ALS, AOT_ALS }, /* MPEG-4 ALS */
4749
a0e0086f7f52 MOV: Use the AOT enum for the mp4_audio_types mapping.
alexc
parents: 4742
diff changeset
493 { CODEC_ID_NONE, AOT_NULL },
3261
bf5f112efcff parse mpeg4audio config to correctly detect mp3on4, fix iso mp3on4 reference files
bcoudurier
parents: 3260
diff changeset
494 };
bf5f112efcff parse mpeg4audio config to correctly detect mp3on4, fix iso mp3on4 reference files
bcoudurier
parents: 3260
diff changeset
495
5205
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
496 int ff_mov_read_esds(AVFormatContext *fc, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
497 {
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
498 AVStream *st;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
499 int tag, len;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
500
5205
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
501 if (fc->nb_streams < 1)
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
502 return 0;
5205
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
503 st = fc->streams[fc->nb_streams-1];
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
504
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
505 get_be32(pb); /* version + flags */
5205
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
506 len = mp4_read_descr(fc, pb, &tag);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
507 if (tag == MP4ESDescrTag) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
508 get_be16(pb); /* ID */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
509 get_byte(pb); /* priority */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
510 } else
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
511 get_be16(pb); /* ID */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
512
5205
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
513 len = mp4_read_descr(fc, pb, &tag);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
514 if (tag == MP4DecConfigDescrTag) {
2028
319147157f29 clean and simplify esds reading function
bcoudurier
parents: 2027
diff changeset
515 int object_type_id = get_byte(pb);
319147157f29 clean and simplify esds reading function
bcoudurier
parents: 2027
diff changeset
516 get_byte(pb); /* stream type */
319147157f29 clean and simplify esds reading function
bcoudurier
parents: 2027
diff changeset
517 get_be24(pb); /* buffer size db */
319147157f29 clean and simplify esds reading function
bcoudurier
parents: 2027
diff changeset
518 get_be32(pb); /* max bitrate */
319147157f29 clean and simplify esds reading function
bcoudurier
parents: 2027
diff changeset
519 get_be32(pb); /* avg bitrate */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
520
5058
33a244b7ca65 Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents: 5035
diff changeset
521 st->codec->codec_id= ff_codec_get_id(ff_mp4_obj_type, object_type_id);
5364
4a925b59dc1b Debug print MP4 objectTypeIndication in hex not decimal as values are listed in
alexc
parents: 5362
diff changeset
522 dprintf(fc, "esds object type id 0x%02x\n", object_type_id);
5205
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
523 len = mp4_read_descr(fc, pb, &tag);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
524 if (tag == MP4DecSpecificDescrTag) {
5205
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
525 dprintf(fc, "Specific MPEG4 header len=%d\n", len);
3078
099c8f03c62e protect malloc overflow
bcoudurier
parents: 3077
diff changeset
526 if((uint64_t)len > (1<<30))
099c8f03c62e protect malloc overflow
bcoudurier
parents: 3077
diff changeset
527 return -1;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
528 st->codec->extradata = av_mallocz(len + FF_INPUT_BUFFER_PADDING_SIZE);
3076
79fcc3c853d4 fail if extradata cannot be allocated
bcoudurier
parents: 3041
diff changeset
529 if (!st->codec->extradata)
79fcc3c853d4 fail if extradata cannot be allocated
bcoudurier
parents: 3041
diff changeset
530 return AVERROR(ENOMEM);
3077
507565d7d611 indentation
bcoudurier
parents: 3076
diff changeset
531 get_buffer(pb, st->codec->extradata, len);
507565d7d611 indentation
bcoudurier
parents: 3076
diff changeset
532 st->codec->extradata_size = len;
3261
bf5f112efcff parse mpeg4audio config to correctly detect mp3on4, fix iso mp3on4 reference files
bcoudurier
parents: 3260
diff changeset
533 if (st->codec->codec_id == CODEC_ID_AAC) {
bf5f112efcff parse mpeg4audio config to correctly detect mp3on4, fix iso mp3on4 reference files
bcoudurier
parents: 3260
diff changeset
534 MPEG4AudioConfig cfg;
bf5f112efcff parse mpeg4audio config to correctly detect mp3on4, fix iso mp3on4 reference files
bcoudurier
parents: 3260
diff changeset
535 ff_mpeg4audio_get_config(&cfg, st->codec->extradata,
bf5f112efcff parse mpeg4audio config to correctly detect mp3on4, fix iso mp3on4 reference files
bcoudurier
parents: 3260
diff changeset
536 st->codec->extradata_size);
5362
6f5a1064e48a Add a channels field to MPEG4AudioConfig.
alexc
parents: 5354
diff changeset
537 st->codec->channels = cfg.channels;
3262
07299732f3b8 set channels and sample rate from mpeg4audio config
bcoudurier
parents: 3261
diff changeset
538 if (cfg.object_type == 29 && cfg.sampling_index < 3) // old mp3on4
07299732f3b8 set channels and sample rate from mpeg4audio config
bcoudurier
parents: 3261
diff changeset
539 st->codec->sample_rate = ff_mpa_freq_tab[cfg.sampling_index];
6210
da46dcc05d4a Use ext sample from mpeg4audio config if set with AAC SBR
bcoudurier
parents: 6197
diff changeset
540 else if (cfg.ext_sample_rate)
da46dcc05d4a Use ext sample from mpeg4audio config if set with AAC SBR
bcoudurier
parents: 6197
diff changeset
541 st->codec->sample_rate = cfg.ext_sample_rate;
3262
07299732f3b8 set channels and sample rate from mpeg4audio config
bcoudurier
parents: 3261
diff changeset
542 else
6210
da46dcc05d4a Use ext sample from mpeg4audio config if set with AAC SBR
bcoudurier
parents: 6197
diff changeset
543 st->codec->sample_rate = cfg.sample_rate;
5205
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
544 dprintf(fc, "mp4a config channels %d obj %d ext obj %d "
3262
07299732f3b8 set channels and sample rate from mpeg4audio config
bcoudurier
parents: 3261
diff changeset
545 "sample rate %d ext sample rate %d\n", st->codec->channels,
07299732f3b8 set channels and sample rate from mpeg4audio config
bcoudurier
parents: 3261
diff changeset
546 cfg.object_type, cfg.ext_object_type,
07299732f3b8 set channels and sample rate from mpeg4audio config
bcoudurier
parents: 3261
diff changeset
547 cfg.sample_rate, cfg.ext_sample_rate);
5058
33a244b7ca65 Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents: 5035
diff changeset
548 if (!(st->codec->codec_id = ff_codec_get_id(mp4_audio_types,
33a244b7ca65 Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents: 5035
diff changeset
549 cfg.object_type)))
3261
bf5f112efcff parse mpeg4audio config to correctly detect mp3on4, fix iso mp3on4 reference files
bcoudurier
parents: 3260
diff changeset
550 st->codec->codec_id = CODEC_ID_AAC;
3077
507565d7d611 indentation
bcoudurier
parents: 3076
diff changeset
551 }
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
552 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
553 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
554 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
555 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
556
5205
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
557 static int mov_read_esds(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
558 {
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
559 return ff_mov_read_esds(c->fc, pb, atom);
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
560 }
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
561
4080
8ddf05b864a4 parse pasp atom and set sample aspect ratio,
bcoudurier
parents: 4079
diff changeset
562 static int mov_read_pasp(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
8ddf05b864a4 parse pasp atom and set sample aspect ratio,
bcoudurier
parents: 4079
diff changeset
563 {
8ddf05b864a4 parse pasp atom and set sample aspect ratio,
bcoudurier
parents: 4079
diff changeset
564 const int num = get_be32(pb);
8ddf05b864a4 parse pasp atom and set sample aspect ratio,
bcoudurier
parents: 4079
diff changeset
565 const int den = get_be32(pb);
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
566 AVStream *st;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
567
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
568 if (c->fc->nb_streams < 1)
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
569 return 0;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
570 st = c->fc->streams[c->fc->nb_streams-1];
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
571
4080
8ddf05b864a4 parse pasp atom and set sample aspect ratio,
bcoudurier
parents: 4079
diff changeset
572 if (den != 0) {
4264
bf7a9658de71 change sample aspect ratio test to be more clear, print old one
bcoudurier
parents: 4251
diff changeset
573 if ((st->sample_aspect_ratio.den != 1 || st->sample_aspect_ratio.num) && // default
bf7a9658de71 change sample aspect ratio test to be more clear, print old one
bcoudurier
parents: 4251
diff changeset
574 (den != st->sample_aspect_ratio.den || num != st->sample_aspect_ratio.num))
4080
8ddf05b864a4 parse pasp atom and set sample aspect ratio,
bcoudurier
parents: 4079
diff changeset
575 av_log(c->fc, AV_LOG_WARNING,
4264
bf7a9658de71 change sample aspect ratio test to be more clear, print old one
bcoudurier
parents: 4251
diff changeset
576 "sample aspect ratio already set to %d:%d, overriding by 'pasp' atom\n",
bf7a9658de71 change sample aspect ratio test to be more clear, print old one
bcoudurier
parents: 4251
diff changeset
577 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den);
4080
8ddf05b864a4 parse pasp atom and set sample aspect ratio,
bcoudurier
parents: 4079
diff changeset
578 st->sample_aspect_ratio.num = num;
8ddf05b864a4 parse pasp atom and set sample aspect ratio,
bcoudurier
parents: 4079
diff changeset
579 st->sample_aspect_ratio.den = den;
8ddf05b864a4 parse pasp atom and set sample aspect ratio,
bcoudurier
parents: 4079
diff changeset
580 }
8ddf05b864a4 parse pasp atom and set sample aspect ratio,
bcoudurier
parents: 4079
diff changeset
581 return 0;
8ddf05b864a4 parse pasp atom and set sample aspect ratio,
bcoudurier
parents: 4079
diff changeset
582 }
8ddf05b864a4 parse pasp atom and set sample aspect ratio,
bcoudurier
parents: 4079
diff changeset
583
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
584 /* this atom contains actual media data */
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
585 static int mov_read_mdat(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
586 {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
587 if(atom.size == 0) /* wrong one (MP4) */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
588 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
589 c->found_mdat=1;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
590 return 0; /* now go for moov */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
591 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
592
5234
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
593 /* read major brand, minor version and compatible brands and store them as metadata */
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
594 static int mov_read_ftyp(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
595 {
5234
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
596 uint32_t minor_ver;
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
597 int comp_brand_size;
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
598 char minor_ver_str[11]; /* 32 bit integer -> 10 digits + null */
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
599 char* comp_brands_str;
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
600 uint8_t type[5] = {0};
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
601
5234
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
602 get_buffer(pb, type, 4);
5235
bf1b8e6b3a84 100l, typo
bcoudurier
parents: 5234
diff changeset
603 if (strcmp(type, "qt "))
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
604 c->isom = 1;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
605 av_log(c->fc, AV_LOG_DEBUG, "ISO: File Type Major Brand: %.4s\n",(char *)&type);
5982
f74198942337 Mark av_metadata_set() as deprecated, and use av_metadata_set2()
stefano
parents: 5975
diff changeset
606 av_metadata_set2(&c->fc->metadata, "major_brand", type, 0);
5234
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
607 minor_ver = get_be32(pb); /* minor version */
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
608 snprintf(minor_ver_str, sizeof(minor_ver_str), "%d", minor_ver);
5982
f74198942337 Mark av_metadata_set() as deprecated, and use av_metadata_set2()
stefano
parents: 5975
diff changeset
609 av_metadata_set2(&c->fc->metadata, "minor_version", minor_ver_str, 0);
5234
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
610
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
611 comp_brand_size = atom.size - 8;
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
612 if (comp_brand_size < 0)
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
613 return -1;
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
614 comp_brands_str = av_malloc(comp_brand_size + 1); /* Add null terminator */
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
615 if (!comp_brands_str)
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
616 return AVERROR(ENOMEM);
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
617 get_buffer(pb, comp_brands_str, comp_brand_size);
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
618 comp_brands_str[comp_brand_size] = 0;
5982
f74198942337 Mark av_metadata_set() as deprecated, and use av_metadata_set2()
stefano
parents: 5975
diff changeset
619 av_metadata_set2(&c->fc->metadata, "compatible_brands", comp_brands_str, 0);
5234
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
620 av_freep(&comp_brands_str);
b133e5865370 Export mov/mp4 major and compatible brands as metadata.
bcoudurier
parents: 5205
diff changeset
621
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
622 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
623 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
624
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
625 /* this atom should contain all header atoms */
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
626 static int mov_read_moov(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
627 {
2806
1ce39cda4a59 check mov_read_default return value where appropriate, patch by takis, fix issue 285
bcoudurier
parents: 2794
diff changeset
628 if (mov_read_default(c, pb, atom) < 0)
1ce39cda4a59 check mov_read_default return value where appropriate, patch by takis, fix issue 285
bcoudurier
parents: 2794
diff changeset
629 return -1;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
630 /* we parsed the 'moov' atom, we can terminate the parsing as soon as we find the 'mdat' */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
631 /* so we don't parse the whole file if over a network */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
632 c->found_moov=1;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
633 return 0; /* now go for mdat */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
634 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
635
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
636 static int mov_read_moof(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
3169
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
637 {
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
638 c->fragment.moof_offset = url_ftell(pb) - 8;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
639 dprintf(c->fc, "moof offset %llx\n", c->fragment.moof_offset);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
640 return mov_read_default(c, pb, atom);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
641 }
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
642
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
643 static int mov_read_mdhd(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
644 {
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
645 AVStream *st;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
646 MOVStreamContext *sc;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
647 int version;
4485
9267b8cf7918 use new metadata API in mov demuxer
aurel
parents: 4454
diff changeset
648 char language[4] = {0};
4269
bbb6561a3974 'code' is used to index a table so make it unsigned
aurel
parents: 4264
diff changeset
649 unsigned lang;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
650
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
651 if (c->fc->nb_streams < 1)
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
652 return 0;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
653 st = c->fc->streams[c->fc->nb_streams-1];
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
654 sc = st->priv_data;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
655
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
656 version = get_byte(pb);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
657 if (version > 1)
3259
2df6f63c4cc5 error is -1
bcoudurier
parents: 3258
diff changeset
658 return -1; /* unsupported */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
659
3145
49989c8b181c simplify, flags is 24bits according to specs
bcoudurier
parents: 3135
diff changeset
660 get_be24(pb); /* flags */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
661 if (version == 1) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
662 get_be64(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
663 get_be64(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
664 } else {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
665 get_be32(pb); /* creation time */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
666 get_be32(pb); /* modification time */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
667 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
668
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
669 sc->time_scale = get_be32(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
670 st->duration = (version == 1) ? get_be64(pb) : get_be32(pb); /* duration */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
671
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
672 lang = get_be16(pb); /* language */
4485
9267b8cf7918 use new metadata API in mov demuxer
aurel
parents: 4454
diff changeset
673 if (ff_mov_lang_to_iso639(lang, language))
5982
f74198942337 Mark av_metadata_set() as deprecated, and use av_metadata_set2()
stefano
parents: 5975
diff changeset
674 av_metadata_set2(&st->metadata, "language", language, 0);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
675 get_be16(pb); /* quality */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
676
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
677 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
678 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
679
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
680 static int mov_read_mvhd(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
681 {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
682 int version = get_byte(pb); /* version */
3145
49989c8b181c simplify, flags is 24bits according to specs
bcoudurier
parents: 3135
diff changeset
683 get_be24(pb); /* flags */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
684
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
685 if (version == 1) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
686 get_be64(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
687 get_be64(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
688 } else {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
689 get_be32(pb); /* creation time */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
690 get_be32(pb); /* modification time */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
691 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
692 c->time_scale = get_be32(pb); /* time scale */
2044
fee0acdb8156 use dprintf with AVFormatContext and simplify
bcoudurier
parents: 2042
diff changeset
693
fee0acdb8156 use dprintf with AVFormatContext and simplify
bcoudurier
parents: 2042
diff changeset
694 dprintf(c->fc, "time scale = %i\n", c->time_scale);
fee0acdb8156 use dprintf with AVFormatContext and simplify
bcoudurier
parents: 2042
diff changeset
695
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
696 c->duration = (version == 1) ? get_be64(pb) : get_be32(pb); /* duration */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
697 get_be32(pb); /* preferred scale */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
698
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
699 get_be16(pb); /* preferred volume */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
700
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
701 url_fskip(pb, 10); /* reserved */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
702
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
703 url_fskip(pb, 36); /* display matrix */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
704
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
705 get_be32(pb); /* preview time */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
706 get_be32(pb); /* preview duration */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
707 get_be32(pb); /* poster time */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
708 get_be32(pb); /* selection time */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
709 get_be32(pb); /* selection duration */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
710 get_be32(pb); /* current time */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
711 get_be32(pb); /* next track ID */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
712
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
713 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
714 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
715
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
716 static int mov_read_smi(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
717 {
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
718 AVStream *st;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
719
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
720 if (c->fc->nb_streams < 1)
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
721 return 0;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
722 st = c->fc->streams[c->fc->nb_streams-1];
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
723
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
724 if((uint64_t)atom.size > (1<<30))
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
725 return -1;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
726
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
727 // currently SVQ3 decoder expect full STSD header - so let's fake it
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
728 // this should be fixed and just SMI header should be passed
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
729 av_free(st->codec->extradata);
3076
79fcc3c853d4 fail if extradata cannot be allocated
bcoudurier
parents: 3041
diff changeset
730 st->codec->extradata = av_mallocz(atom.size + 0x5a + FF_INPUT_BUFFER_PADDING_SIZE);
79fcc3c853d4 fail if extradata cannot be allocated
bcoudurier
parents: 3041
diff changeset
731 if (!st->codec->extradata)
79fcc3c853d4 fail if extradata cannot be allocated
bcoudurier
parents: 3041
diff changeset
732 return AVERROR(ENOMEM);
3077
507565d7d611 indentation
bcoudurier
parents: 3076
diff changeset
733 st->codec->extradata_size = 0x5a + atom.size;
507565d7d611 indentation
bcoudurier
parents: 3076
diff changeset
734 memcpy(st->codec->extradata, "SVQ3", 4); // fake
507565d7d611 indentation
bcoudurier
parents: 3076
diff changeset
735 get_buffer(pb, st->codec->extradata + 0x5a, atom.size);
507565d7d611 indentation
bcoudurier
parents: 3076
diff changeset
736 dprintf(c->fc, "Reading SMI %"PRId64" %s\n", atom.size, st->codec->extradata + 0x5a);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
737 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
738 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
739
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
740 static int mov_read_enda(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
741 {
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
742 AVStream *st;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
743 int little_endian;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
744
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
745 if (c->fc->nb_streams < 1)
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
746 return 0;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
747 st = c->fc->streams[c->fc->nb_streams-1];
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
748
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
749 little_endian = get_be16(pb);
4184
bc40129f13cc only set le if value is 1, fix boom5.mov, issue #770
bcoudurier
parents: 4123
diff changeset
750 dprintf(c->fc, "enda %d\n", little_endian);
bc40129f13cc only set le if value is 1, fix boom5.mov, issue #770
bcoudurier
parents: 4123
diff changeset
751 if (little_endian == 1) {
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
752 switch (st->codec->codec_id) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
753 case CODEC_ID_PCM_S24BE:
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
754 st->codec->codec_id = CODEC_ID_PCM_S24LE;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
755 break;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
756 case CODEC_ID_PCM_S32BE:
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
757 st->codec->codec_id = CODEC_ID_PCM_S32LE;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
758 break;
3738
0c46eb1cd9b3 Make MOV demuxer handle F32BE, F32LE, F64BE and F64LE PCM audio.
pross
parents: 3626
diff changeset
759 case CODEC_ID_PCM_F32BE:
0c46eb1cd9b3 Make MOV demuxer handle F32BE, F32LE, F64BE and F64LE PCM audio.
pross
parents: 3626
diff changeset
760 st->codec->codec_id = CODEC_ID_PCM_F32LE;
0c46eb1cd9b3 Make MOV demuxer handle F32BE, F32LE, F64BE and F64LE PCM audio.
pross
parents: 3626
diff changeset
761 break;
0c46eb1cd9b3 Make MOV demuxer handle F32BE, F32LE, F64BE and F64LE PCM audio.
pross
parents: 3626
diff changeset
762 case CODEC_ID_PCM_F64BE:
0c46eb1cd9b3 Make MOV demuxer handle F32BE, F32LE, F64BE and F64LE PCM audio.
pross
parents: 3626
diff changeset
763 st->codec->codec_id = CODEC_ID_PCM_F64LE;
0c46eb1cd9b3 Make MOV demuxer handle F32BE, F32LE, F64BE and F64LE PCM audio.
pross
parents: 3626
diff changeset
764 break;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
765 default:
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
766 break;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
767 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
768 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
769 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
770 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
771
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
772 /* FIXME modify qdm2/svq3/h264 decoders to take full atom as extradata */
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
773 static int mov_read_extradata(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
774 {
4116
f693bc71dc1e check that nb_streams is valid before setting stream, fix crash with jp2 which do not use same structure
bcoudurier
parents: 4080
diff changeset
775 AVStream *st;
f693bc71dc1e check that nb_streams is valid before setting stream, fix crash with jp2 which do not use same structure
bcoudurier
parents: 4080
diff changeset
776 uint64_t size;
2589
960795567b33 append extradata atoms when parsing, fix OLOCOONS_O3.mov
bcoudurier
parents: 2547
diff changeset
777 uint8_t *buf;
4116
f693bc71dc1e check that nb_streams is valid before setting stream, fix crash with jp2 which do not use same structure
bcoudurier
parents: 4080
diff changeset
778
f693bc71dc1e check that nb_streams is valid before setting stream, fix crash with jp2 which do not use same structure
bcoudurier
parents: 4080
diff changeset
779 if (c->fc->nb_streams < 1) // will happen with jp2 files
f693bc71dc1e check that nb_streams is valid before setting stream, fix crash with jp2 which do not use same structure
bcoudurier
parents: 4080
diff changeset
780 return 0;
f693bc71dc1e check that nb_streams is valid before setting stream, fix crash with jp2 which do not use same structure
bcoudurier
parents: 4080
diff changeset
781 st= c->fc->streams[c->fc->nb_streams-1];
f693bc71dc1e check that nb_streams is valid before setting stream, fix crash with jp2 which do not use same structure
bcoudurier
parents: 4080
diff changeset
782 size= (uint64_t)st->codec->extradata_size + atom.size + 8 + FF_INPUT_BUFFER_PADDING_SIZE;
2589
960795567b33 append extradata atoms when parsing, fix OLOCOONS_O3.mov
bcoudurier
parents: 2547
diff changeset
783 if(size > INT_MAX || (uint64_t)atom.size > INT_MAX)
960795567b33 append extradata atoms when parsing, fix OLOCOONS_O3.mov
bcoudurier
parents: 2547
diff changeset
784 return -1;
960795567b33 append extradata atoms when parsing, fix OLOCOONS_O3.mov
bcoudurier
parents: 2547
diff changeset
785 buf= av_realloc(st->codec->extradata, size);
960795567b33 append extradata atoms when parsing, fix OLOCOONS_O3.mov
bcoudurier
parents: 2547
diff changeset
786 if(!buf)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
787 return -1;
2589
960795567b33 append extradata atoms when parsing, fix OLOCOONS_O3.mov
bcoudurier
parents: 2547
diff changeset
788 st->codec->extradata= buf;
960795567b33 append extradata atoms when parsing, fix OLOCOONS_O3.mov
bcoudurier
parents: 2547
diff changeset
789 buf+= st->codec->extradata_size;
960795567b33 append extradata atoms when parsing, fix OLOCOONS_O3.mov
bcoudurier
parents: 2547
diff changeset
790 st->codec->extradata_size= size - FF_INPUT_BUFFER_PADDING_SIZE;
960795567b33 append extradata atoms when parsing, fix OLOCOONS_O3.mov
bcoudurier
parents: 2547
diff changeset
791 AV_WB32( buf , atom.size + 8);
960795567b33 append extradata atoms when parsing, fix OLOCOONS_O3.mov
bcoudurier
parents: 2547
diff changeset
792 AV_WL32( buf + 4, atom.type);
960795567b33 append extradata atoms when parsing, fix OLOCOONS_O3.mov
bcoudurier
parents: 2547
diff changeset
793 get_buffer(pb, buf + 8, atom.size);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
794 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
795 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
796
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
797 static int mov_read_wave(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
798 {
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
799 AVStream *st;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
800
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
801 if (c->fc->nb_streams < 1)
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
802 return 0;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
803 st = c->fc->streams[c->fc->nb_streams-1];
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
804
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
805 if((uint64_t)atom.size > (1<<30))
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
806 return -1;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
807
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
808 if (st->codec->codec_id == CODEC_ID_QDM2) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
809 // pass all frma atom to codec, needed at least for QDM2
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
810 av_free(st->codec->extradata);
3076
79fcc3c853d4 fail if extradata cannot be allocated
bcoudurier
parents: 3041
diff changeset
811 st->codec->extradata = av_mallocz(atom.size + FF_INPUT_BUFFER_PADDING_SIZE);
79fcc3c853d4 fail if extradata cannot be allocated
bcoudurier
parents: 3041
diff changeset
812 if (!st->codec->extradata)
79fcc3c853d4 fail if extradata cannot be allocated
bcoudurier
parents: 3041
diff changeset
813 return AVERROR(ENOMEM);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
814 st->codec->extradata_size = atom.size;
3076
79fcc3c853d4 fail if extradata cannot be allocated
bcoudurier
parents: 3041
diff changeset
815 get_buffer(pb, st->codec->extradata, atom.size);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
816 } else if (atom.size > 8) { /* to read frma, esds atoms */
2806
1ce39cda4a59 check mov_read_default return value where appropriate, patch by takis, fix issue 285
bcoudurier
parents: 2794
diff changeset
817 if (mov_read_default(c, pb, atom) < 0)
1ce39cda4a59 check mov_read_default return value where appropriate, patch by takis, fix issue 285
bcoudurier
parents: 2794
diff changeset
818 return -1;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
819 } else
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
820 url_fskip(pb, atom.size);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
821 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
822 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
823
2837
1caef0e2fb46 supports glbl atom containing generic extradata for all codecs
bcoudurier
parents: 2826
diff changeset
824 /**
1caef0e2fb46 supports glbl atom containing generic extradata for all codecs
bcoudurier
parents: 2826
diff changeset
825 * This function reads atom content and puts data in extradata without tag
1caef0e2fb46 supports glbl atom containing generic extradata for all codecs
bcoudurier
parents: 2826
diff changeset
826 * nor size unlike mov_read_extradata.
1caef0e2fb46 supports glbl atom containing generic extradata for all codecs
bcoudurier
parents: 2826
diff changeset
827 */
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
828 static int mov_read_glbl(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
829 {
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
830 AVStream *st;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
831
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
832 if (c->fc->nb_streams < 1)
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
833 return 0;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
834 st = c->fc->streams[c->fc->nb_streams-1];
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
835
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
836 if((uint64_t)atom.size > (1<<30))
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
837 return -1;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
838
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
839 av_free(st->codec->extradata);
3076
79fcc3c853d4 fail if extradata cannot be allocated
bcoudurier
parents: 3041
diff changeset
840 st->codec->extradata = av_mallocz(atom.size + FF_INPUT_BUFFER_PADDING_SIZE);
79fcc3c853d4 fail if extradata cannot be allocated
bcoudurier
parents: 3041
diff changeset
841 if (!st->codec->extradata)
79fcc3c853d4 fail if extradata cannot be allocated
bcoudurier
parents: 3041
diff changeset
842 return AVERROR(ENOMEM);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
843 st->codec->extradata_size = atom.size;
3076
79fcc3c853d4 fail if extradata cannot be allocated
bcoudurier
parents: 3041
diff changeset
844 get_buffer(pb, st->codec->extradata, atom.size);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
845 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
846 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
847
5959
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
848 /**
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
849 * An strf atom is a BITMAPINFOHEADER struct. This struct is 40 bytes itself,
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
850 * but can have extradata appended at the end after the 40 bytes belonging
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
851 * to the struct.
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
852 */
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
853 static int mov_read_strf(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
854 {
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
855 AVStream *st;
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
856
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
857 if (c->fc->nb_streams < 1)
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
858 return 0;
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
859 if (atom.size <= 40)
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
860 return 0;
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
861 st = c->fc->streams[c->fc->nb_streams-1];
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
862
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
863 if((uint64_t)atom.size > (1<<30))
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
864 return -1;
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
865
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
866 av_free(st->codec->extradata);
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
867 st->codec->extradata = av_mallocz(atom.size - 40 + FF_INPUT_BUFFER_PADDING_SIZE);
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
868 if (!st->codec->extradata)
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
869 return AVERROR(ENOMEM);
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
870 st->codec->extradata_size = atom.size - 40;
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
871 url_fskip(pb, 40);
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
872 get_buffer(pb, st->codec->extradata, atom.size - 40);
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
873 return 0;
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
874 }
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
875
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
876 static int mov_read_stco(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
877 {
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
878 AVStream *st;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
879 MOVStreamContext *sc;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
880 unsigned int i, entries;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
881
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
882 if (c->fc->nb_streams < 1)
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
883 return 0;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
884 st = c->fc->streams[c->fc->nb_streams-1];
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
885 sc = st->priv_data;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
886
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
887 get_byte(pb); /* version */
3145
49989c8b181c simplify, flags is 24bits according to specs
bcoudurier
parents: 3135
diff changeset
888 get_be24(pb); /* flags */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
889
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
890 entries = get_be32(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
891
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
892 if(entries >= UINT_MAX/sizeof(int64_t))
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
893 return -1;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
894
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
895 sc->chunk_offsets = av_malloc(entries * sizeof(int64_t));
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
896 if (!sc->chunk_offsets)
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
897 return AVERROR(ENOMEM);
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
898 sc->chunk_count = entries;
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
899
3254
8fb1e55e0a66 align and remove useless braces
bcoudurier
parents: 3253
diff changeset
900 if (atom.type == MKTAG('s','t','c','o'))
8fb1e55e0a66 align and remove useless braces
bcoudurier
parents: 3253
diff changeset
901 for(i=0; i<entries; i++)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
902 sc->chunk_offsets[i] = get_be32(pb);
3254
8fb1e55e0a66 align and remove useless braces
bcoudurier
parents: 3253
diff changeset
903 else if (atom.type == MKTAG('c','o','6','4'))
8fb1e55e0a66 align and remove useless braces
bcoudurier
parents: 3253
diff changeset
904 for(i=0; i<entries; i++)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
905 sc->chunk_offsets[i] = get_be64(pb);
3254
8fb1e55e0a66 align and remove useless braces
bcoudurier
parents: 3253
diff changeset
906 else
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
907 return -1;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
908
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
909 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
910 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
911
3625
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
912 /**
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
913 * Compute codec id for 'lpcm' tag.
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
914 * See CoreAudioTypes and AudioStreamBasicDescription at Apple.
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
915 */
5205
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
916 enum CodecID ff_mov_get_lpcm_codec_id(int bps, int flags)
3625
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
917 {
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
918 if (flags & 1) { // floating point
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
919 if (flags & 2) { // big endian
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
920 if (bps == 32) return CODEC_ID_PCM_F32BE;
3751
772eba9f4b30 enable fl32/64 le/be in mov with stsd audio v2
bcoudurier
parents: 3738
diff changeset
921 else if (bps == 64) return CODEC_ID_PCM_F64BE;
3625
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
922 } else {
3751
772eba9f4b30 enable fl32/64 le/be in mov with stsd audio v2
bcoudurier
parents: 3738
diff changeset
923 if (bps == 32) return CODEC_ID_PCM_F32LE;
772eba9f4b30 enable fl32/64 le/be in mov with stsd audio v2
bcoudurier
parents: 3738
diff changeset
924 else if (bps == 64) return CODEC_ID_PCM_F64LE;
3625
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
925 }
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
926 } else {
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
927 if (flags & 2) {
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
928 if (bps == 8)
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
929 // signed integer
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
930 if (flags & 4) return CODEC_ID_PCM_S8;
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
931 else return CODEC_ID_PCM_U8;
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
932 else if (bps == 16) return CODEC_ID_PCM_S16BE;
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
933 else if (bps == 24) return CODEC_ID_PCM_S24BE;
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
934 else if (bps == 32) return CODEC_ID_PCM_S32BE;
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
935 } else {
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
936 if (bps == 8)
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
937 if (flags & 4) return CODEC_ID_PCM_S8;
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
938 else return CODEC_ID_PCM_U8;
3626
3a7f7509bf3c fix if/else case
bcoudurier
parents: 3625
diff changeset
939 else if (bps == 16) return CODEC_ID_PCM_S16LE;
3625
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
940 else if (bps == 24) return CODEC_ID_PCM_S24LE;
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
941 else if (bps == 32) return CODEC_ID_PCM_S32LE;
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
942 }
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
943 }
3967
4fd67f05bad9 Use enum typers instead of int.
benoit
parents: 3956
diff changeset
944 return CODEC_ID_NONE;
3625
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
945 }
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
946
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
947 static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
948 {
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
949 AVStream *st;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
950 MOVStreamContext *sc;
3263
d9a40edc615a move vars decls where vars are used
bcoudurier
parents: 3262
diff changeset
951 int j, entries, pseudo_stream_id;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
952
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
953 if (c->fc->nb_streams < 1)
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
954 return 0;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
955 st = c->fc->streams[c->fc->nb_streams-1];
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
956 sc = st->priv_data;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
957
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
958 get_byte(pb); /* version */
3145
49989c8b181c simplify, flags is 24bits according to specs
bcoudurier
parents: 3135
diff changeset
959 get_be24(pb); /* flags */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
960
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
961 entries = get_be32(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
962
3167
125b08d2ad59 cosmetics, split or move too long lines
bcoudurier
parents: 3166
diff changeset
963 for(pseudo_stream_id=0; pseudo_stream_id<entries; pseudo_stream_id++) {
125b08d2ad59 cosmetics, split or move too long lines
bcoudurier
parents: 3166
diff changeset
964 //Parsing Sample description table
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
965 enum CodecID id;
5002
dc92e7858140 broken stsd length might be < 16, fix elst-assert.mp4
bcoudurier
parents: 4992
diff changeset
966 int dref_id = 1;
6173
1b9079c05f9a Improve mov atom parsing debug message, print parent atom and size in decimal
bcoudurier
parents: 6040
diff changeset
967 MOVAtom a = { AV_RL32("stsd") };
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3967
diff changeset
968 int64_t start_pos = url_ftell(pb);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
969 int size = get_be32(pb); /* size */
3263
d9a40edc615a move vars decls where vars are used
bcoudurier
parents: 3262
diff changeset
970 uint32_t format = get_le32(pb); /* data format */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
971
5002
dc92e7858140 broken stsd length might be < 16, fix elst-assert.mp4
bcoudurier
parents: 4992
diff changeset
972 if (size >= 16) {
dc92e7858140 broken stsd length might be < 16, fix elst-assert.mp4
bcoudurier
parents: 4992
diff changeset
973 get_be32(pb); /* reserved */
dc92e7858140 broken stsd length might be < 16, fix elst-assert.mp4
bcoudurier
parents: 4992
diff changeset
974 get_be16(pb); /* reserved */
dc92e7858140 broken stsd length might be < 16, fix elst-assert.mp4
bcoudurier
parents: 4992
diff changeset
975 dref_id = get_be16(pb);
dc92e7858140 broken stsd length might be < 16, fix elst-assert.mp4
bcoudurier
parents: 4992
diff changeset
976 }
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
977
3022
800db1ceafc6 Allow the user to select which codec out of several in stsd he wants.
michael
parents: 2974
diff changeset
978 if (st->codec->codec_tag &&
3299
80a497804aa8 demux all stsd ids if codec is the same, fix premature_mov_ending.mov, closes #451
bcoudurier
parents: 3286
diff changeset
979 st->codec->codec_tag != format &&
5058
33a244b7ca65 Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents: 5035
diff changeset
980 (c->fc->video_codec_id ? ff_codec_get_id(codec_movvideo_tags, format) != c->fc->video_codec_id
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
981 : st->codec->codec_tag != MKTAG('j','p','e','g'))
3022
800db1ceafc6 Allow the user to select which codec out of several in stsd he wants.
michael
parents: 2974
diff changeset
982 ){
3135
cf8df6a00eb5 misc spelling fixes
diego
parents: 3095
diff changeset
983 /* Multiple fourcc, we skip JPEG. This is not correct, we should
cf8df6a00eb5 misc spelling fixes
diego
parents: 3095
diff changeset
984 * export it as a separate AVStream but this needs a few changes
cf8df6a00eb5 misc spelling fixes
diego
parents: 3095
diff changeset
985 * in the MOV demuxer, patch welcome. */
3300
5d77af33c378 warn about multiple fourcc
bcoudurier
parents: 3299
diff changeset
986 av_log(c->fc, AV_LOG_WARNING, "multiple fourcc not supported\n");
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
987 url_fskip(pb, size - (url_ftell(pb) - start_pos));
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
988 continue;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
989 }
3299
80a497804aa8 demux all stsd ids if codec is the same, fix premature_mov_ending.mov, closes #451
bcoudurier
parents: 3286
diff changeset
990 sc->pseudo_stream_id = st->codec->codec_tag ? -1 : pseudo_stream_id;
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
991 sc->dref_id= dref_id;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
992
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
993 st->codec->codec_tag = format;
5058
33a244b7ca65 Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents: 5035
diff changeset
994 id = ff_codec_get_id(codec_movaudio_tags, format);
5027
702bfee61683 Also accept TS as a prefix for wav twoccs (used by Flip4Mac) instead of
conrad
parents: 5015
diff changeset
995 if (id<=0 && ((format&0xFFFF) == 'm'+('s'<<8) || (format&0xFFFF) == 'T'+('S'<<8)))
6248
e630da0f5861 Add av_ prefix to bswap macros
mru
parents: 6230
diff changeset
996 id = ff_codec_get_id(ff_codec_wav_tags, av_bswap32(format)&0xFFFF);
2298
4f946c9ae9b3 detect MS wav codecs
michael
parents: 2296
diff changeset
997
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
998 if (st->codec->codec_type != AVMEDIA_TYPE_VIDEO && id > 0) {
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
999 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
1000 } else if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO && /* do not overwrite codec type */
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
1001 format && format != MKTAG('m','p','4','s')) { /* skip old asf mpeg4 tag */
5058
33a244b7ca65 Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents: 5035
diff changeset
1002 id = ff_codec_get_id(codec_movvideo_tags, format);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1003 if (id <= 0)
5058
33a244b7ca65 Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents: 5035
diff changeset
1004 id = ff_codec_get_id(ff_codec_bmp_tags, format);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1005 if (id > 0)
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
1006 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
1007 else if(st->codec->codec_type == AVMEDIA_TYPE_DATA){
5058
33a244b7ca65 Add ff_ prefixes to exported symbols in libavformat/riff.h.
diego
parents: 5035
diff changeset
1008 id = ff_codec_get_id(ff_codec_movsubtitle_tags, format);
2969
f3a3115a96e4 Set correct codec type and id for text subtitles.
michael
parents: 2968
diff changeset
1009 if(id > 0)
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
1010 st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
2969
f3a3115a96e4 Set correct codec type and id for text subtitles.
michael
parents: 2968
diff changeset
1011 }
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1012 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1013
2902
cb12e3352bf5 cosmetics, split overly long lines
bcoudurier
parents: 2837
diff changeset
1014 dprintf(c->fc, "size=%d 4CC= %c%c%c%c codec_type=%d\n", size,
cb12e3352bf5 cosmetics, split overly long lines
bcoudurier
parents: 2837
diff changeset
1015 (format >> 0) & 0xff, (format >> 8) & 0xff, (format >> 16) & 0xff,
cb12e3352bf5 cosmetics, split overly long lines
bcoudurier
parents: 2837
diff changeset
1016 (format >> 24) & 0xff, st->codec->codec_type);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1017
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
1018 if(st->codec->codec_type==AVMEDIA_TYPE_VIDEO) {
5790
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
1019 unsigned int color_depth, len;
3263
d9a40edc615a move vars decls where vars are used
bcoudurier
parents: 3262
diff changeset
1020 int color_greyscale;
d9a40edc615a move vars decls where vars are used
bcoudurier
parents: 3262
diff changeset
1021
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1022 st->codec->codec_id = id;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1023 get_be16(pb); /* version */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1024 get_be16(pb); /* revision level */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1025 get_be32(pb); /* vendor */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1026 get_be32(pb); /* temporal quality */
2730
7782a46ddbf5 comment typo
diego
parents: 2665
diff changeset
1027 get_be32(pb); /* spatial quality */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1028
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1029 st->codec->width = get_be16(pb); /* width */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1030 st->codec->height = get_be16(pb); /* height */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1031
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1032 get_be32(pb); /* horiz resolution */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1033 get_be32(pb); /* vert resolution */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1034 get_be32(pb); /* data size, always 0 */
3264
5eaed4c6b97f remove unneeded variable
bcoudurier
parents: 3263
diff changeset
1035 get_be16(pb); /* frames per samples */
2044
fee0acdb8156 use dprintf with AVFormatContext and simplify
bcoudurier
parents: 2042
diff changeset
1036
5790
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
1037 len = get_byte(pb); /* codec name, pascal string */
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
1038 if (len > 31)
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
1039 len = 31;
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
1040 mov_read_mac_string(c, pb, len, st->codec->codec_name, 32);
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
1041 if (len < 31)
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
1042 url_fskip(pb, 31 - len);
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
1043 /* codec_tag YV12 triggers an UV swap in rawdec.c */
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
1044 if (!memcmp(st->codec->codec_name, "Planar Y'CbCr 8-bit 4:2:0", 25))
dba191dda275 In mov demuxer, convert mac encoded strings to utf-8
bcoudurier
parents: 5788
diff changeset
1045 st->codec->codec_tag=MKTAG('I', '4', '2', '0');
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1046
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3796
diff changeset
1047 st->codec->bits_per_coded_sample = get_be16(pb); /* depth */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1048 st->codec->color_table_id = get_be16(pb); /* colortable id */
3095
da04b574d131 set codec bps to grayscale bits, fix 256grey.mov
bcoudurier
parents: 3093
diff changeset
1049 dprintf(c->fc, "depth %d, ctab id %d\n",
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3796
diff changeset
1050 st->codec->bits_per_coded_sample, st->codec->color_table_id);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1051 /* figure out the palette situation */
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3796
diff changeset
1052 color_depth = st->codec->bits_per_coded_sample & 0x1F;
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3796
diff changeset
1053 color_greyscale = st->codec->bits_per_coded_sample & 0x20;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1054
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1055 /* if the depth is 2, 4, or 8 bpp, file is palettized */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1056 if ((color_depth == 2) || (color_depth == 4) ||
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1057 (color_depth == 8)) {
3257
2f5837726057 move vars decls where vars are used
bcoudurier
parents: 3256
diff changeset
1058 /* for palette traversal */
2f5837726057 move vars decls where vars are used
bcoudurier
parents: 3256
diff changeset
1059 unsigned int color_start, color_count, color_end;
2f5837726057 move vars decls where vars are used
bcoudurier
parents: 3256
diff changeset
1060 unsigned char r, g, b;
2f5837726057 move vars decls where vars are used
bcoudurier
parents: 3256
diff changeset
1061
4719
5dd75af88ade allocate palette in codec directly
bcoudurier
parents: 4718
diff changeset
1062 st->codec->palctrl = av_malloc(sizeof(*st->codec->palctrl));
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1063 if (color_greyscale) {
3257
2f5837726057 move vars decls where vars are used
bcoudurier
parents: 3256
diff changeset
1064 int color_index, color_dec;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1065 /* compute the greyscale palette */
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3796
diff changeset
1066 st->codec->bits_per_coded_sample = color_depth;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1067 color_count = 1 << color_depth;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1068 color_index = 255;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1069 color_dec = 256 / (color_count - 1);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1070 for (j = 0; j < color_count; j++) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1071 r = g = b = color_index;
4719
5dd75af88ade allocate palette in codec directly
bcoudurier
parents: 4718
diff changeset
1072 st->codec->palctrl->palette[j] =
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1073 (r << 16) | (g << 8) | (b);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1074 color_index -= color_dec;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1075 if (color_index < 0)
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1076 color_index = 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1077 }
3179
5f56b694f9bf according to specs, only color table id set to 0, have it in stsd, fix 4colors.mov
bcoudurier
parents: 3178
diff changeset
1078 } else if (st->codec->color_table_id) {
3257
2f5837726057 move vars decls where vars are used
bcoudurier
parents: 3256
diff changeset
1079 const uint8_t *color_table;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1080 /* if flag bit 3 is set, use the default palette */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1081 color_count = 1 << color_depth;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1082 if (color_depth == 2)
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1083 color_table = ff_qt_default_palette_4;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1084 else if (color_depth == 4)
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1085 color_table = ff_qt_default_palette_16;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1086 else
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1087 color_table = ff_qt_default_palette_256;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1088
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1089 for (j = 0; j < color_count; j++) {
4786
d5ae967cc549 Remove alpha channel from default colorspace tables, since it is unused. See
rbultje
parents: 4782
diff changeset
1090 r = color_table[j * 3 + 0];
d5ae967cc549 Remove alpha channel from default colorspace tables, since it is unused. See
rbultje
parents: 4782
diff changeset
1091 g = color_table[j * 3 + 1];
d5ae967cc549 Remove alpha channel from default colorspace tables, since it is unused. See
rbultje
parents: 4782
diff changeset
1092 b = color_table[j * 3 + 2];
4719
5dd75af88ade allocate palette in codec directly
bcoudurier
parents: 4718
diff changeset
1093 st->codec->palctrl->palette[j] =
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1094 (r << 16) | (g << 8) | (b);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1095 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1096 } else {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1097 /* load the palette from the file */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1098 color_start = get_be32(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1099 color_count = get_be16(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1100 color_end = get_be16(pb);
2809
17086a526938 Check sanity in the palette loading operation. The addresses a potential security risk in
melanson
parents: 2807
diff changeset
1101 if ((color_start <= 255) &&
17086a526938 Check sanity in the palette loading operation. The addresses a potential security risk in
melanson
parents: 2807
diff changeset
1102 (color_end <= 255)) {
2810
e106e4b43718 adjust indentation on latest patch
melanson
parents: 2809
diff changeset
1103 for (j = color_start; j <= color_end; j++) {
e106e4b43718 adjust indentation on latest patch
melanson
parents: 2809
diff changeset
1104 /* each R, G, or B component is 16 bits;
e106e4b43718 adjust indentation on latest patch
melanson
parents: 2809
diff changeset
1105 * only use the top 8 bits; skip alpha bytes
e106e4b43718 adjust indentation on latest patch
melanson
parents: 2809
diff changeset
1106 * up front */
e106e4b43718 adjust indentation on latest patch
melanson
parents: 2809
diff changeset
1107 get_byte(pb);
e106e4b43718 adjust indentation on latest patch
melanson
parents: 2809
diff changeset
1108 get_byte(pb);
e106e4b43718 adjust indentation on latest patch
melanson
parents: 2809
diff changeset
1109 r = get_byte(pb);
e106e4b43718 adjust indentation on latest patch
melanson
parents: 2809
diff changeset
1110 get_byte(pb);
e106e4b43718 adjust indentation on latest patch
melanson
parents: 2809
diff changeset
1111 g = get_byte(pb);
e106e4b43718 adjust indentation on latest patch
melanson
parents: 2809
diff changeset
1112 get_byte(pb);
e106e4b43718 adjust indentation on latest patch
melanson
parents: 2809
diff changeset
1113 b = get_byte(pb);
e106e4b43718 adjust indentation on latest patch
melanson
parents: 2809
diff changeset
1114 get_byte(pb);
4719
5dd75af88ade allocate palette in codec directly
bcoudurier
parents: 4718
diff changeset
1115 st->codec->palctrl->palette[j] =
2810
e106e4b43718 adjust indentation on latest patch
melanson
parents: 2809
diff changeset
1116 (r << 16) | (g << 8) | (b);
2809
17086a526938 Check sanity in the palette loading operation. The addresses a potential security risk in
melanson
parents: 2807
diff changeset
1117 }
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1118 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1119 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1120 st->codec->palctrl->palette_changed = 1;
4719
5dd75af88ade allocate palette in codec directly
bcoudurier
parents: 4718
diff changeset
1121 }
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
1122 } else if(st->codec->codec_type==AVMEDIA_TYPE_AUDIO) {
3622
ab0641ec543b support big endian lpcm with audio stsd v2
bcoudurier
parents: 3621
diff changeset
1123 int bits_per_sample, flags;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1124 uint16_t version = get_be16(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1125
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1126 st->codec->codec_id = id;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1127 get_be16(pb); /* revision level */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1128 get_be32(pb); /* vendor */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1129
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1130 st->codec->channels = get_be16(pb); /* channel count */
1907
b33db97089ba Give context to dprintf
mbardiaux
parents: 1848
diff changeset
1131 dprintf(c->fc, "audio channels %d\n", st->codec->channels);
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3796
diff changeset
1132 st->codec->bits_per_coded_sample = get_be16(pb); /* sample size */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1133
3029
10abe8748ec2 use correct demux mechanism when audio compression id is -2, dv audio does not matter, demux partially qt_dv_pal_test.mov which does NOT use cid -2
bcoudurier
parents: 3027
diff changeset
1134 sc->audio_cid = get_be16(pb);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1135 get_be16(pb); /* packet size = 0 */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1136
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1137 st->codec->sample_rate = ((get_be32(pb) >> 16));
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1138
3619
bd4b7c8fec83 move version specific parsing code before codec specific code, will be needed
bcoudurier
parents: 3615
diff changeset
1139 //Read QT version 1 fields. In version 0 these do not exist.
bd4b7c8fec83 move version specific parsing code before codec specific code, will be needed
bcoudurier
parents: 3615
diff changeset
1140 dprintf(c->fc, "version =%d, isom =%d\n",version,c->isom);
bd4b7c8fec83 move version specific parsing code before codec specific code, will be needed
bcoudurier
parents: 3615
diff changeset
1141 if(!c->isom) {
bd4b7c8fec83 move version specific parsing code before codec specific code, will be needed
bcoudurier
parents: 3615
diff changeset
1142 if(version==1) {
bd4b7c8fec83 move version specific parsing code before codec specific code, will be needed
bcoudurier
parents: 3615
diff changeset
1143 sc->samples_per_frame = get_be32(pb);
bd4b7c8fec83 move version specific parsing code before codec specific code, will be needed
bcoudurier
parents: 3615
diff changeset
1144 get_be32(pb); /* bytes per packet */
bd4b7c8fec83 move version specific parsing code before codec specific code, will be needed
bcoudurier
parents: 3615
diff changeset
1145 sc->bytes_per_frame = get_be32(pb);
bd4b7c8fec83 move version specific parsing code before codec specific code, will be needed
bcoudurier
parents: 3615
diff changeset
1146 get_be32(pb); /* bytes per sample */
bd4b7c8fec83 move version specific parsing code before codec specific code, will be needed
bcoudurier
parents: 3615
diff changeset
1147 } else if(version==2) {
bd4b7c8fec83 move version specific parsing code before codec specific code, will be needed
bcoudurier
parents: 3615
diff changeset
1148 get_be32(pb); /* sizeof struct only */
bd4b7c8fec83 move version specific parsing code before codec specific code, will be needed
bcoudurier
parents: 3615
diff changeset
1149 st->codec->sample_rate = av_int2dbl(get_be64(pb)); /* float 64 */
bd4b7c8fec83 move version specific parsing code before codec specific code, will be needed
bcoudurier
parents: 3615
diff changeset
1150 st->codec->channels = get_be32(pb);
bd4b7c8fec83 move version specific parsing code before codec specific code, will be needed
bcoudurier
parents: 3615
diff changeset
1151 get_be32(pb); /* always 0x7F000000 */
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3796
diff changeset
1152 st->codec->bits_per_coded_sample = get_be32(pb); /* bits per channel if sound is uncompressed */
5387
8737044ce5c3 Fix typo.
jai_menon
parents: 5383
diff changeset
1153 flags = get_be32(pb); /* lpcm format specific flag */
3620
a52f6dd66490 more complete audio stsd v2
bcoudurier
parents: 3619
diff changeset
1154 sc->bytes_per_frame = get_be32(pb); /* bytes per audio packet if constant */
a52f6dd66490 more complete audio stsd v2
bcoudurier
parents: 3619
diff changeset
1155 sc->samples_per_frame = get_be32(pb); /* lpcm frames per audio packet if constant */
3625
022f5a9504db full lpcm support in mov audio stsd v2
bcoudurier
parents: 3622
diff changeset
1156 if (format == MKTAG('l','p','c','m'))
5205
047f527ae157 Make mov LPCM and AAC parsing functions public
pross
parents: 5165
diff changeset
1157 st->codec->codec_id = ff_mov_get_lpcm_codec_id(st->codec->bits_per_coded_sample, flags);
3619
bd4b7c8fec83 move version specific parsing code before codec specific code, will be needed
bcoudurier
parents: 3615
diff changeset
1158 }
bd4b7c8fec83 move version specific parsing code before codec specific code, will be needed
bcoudurier
parents: 3615
diff changeset
1159 }
bd4b7c8fec83 move version specific parsing code before codec specific code, will be needed
bcoudurier
parents: 3615
diff changeset
1160
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1161 switch (st->codec->codec_id) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1162 case CODEC_ID_PCM_S8:
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1163 case CODEC_ID_PCM_U8:
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3796
diff changeset
1164 if (st->codec->bits_per_coded_sample == 16)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1165 st->codec->codec_id = CODEC_ID_PCM_S16BE;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1166 break;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1167 case CODEC_ID_PCM_S16LE:
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1168 case CODEC_ID_PCM_S16BE:
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3796
diff changeset
1169 if (st->codec->bits_per_coded_sample == 8)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1170 st->codec->codec_id = CODEC_ID_PCM_S8;
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3796
diff changeset
1171 else if (st->codec->bits_per_coded_sample == 24)
3621
0415fc41780a keep original codec/fourcc endianness, fix XDCAMHD.mov
bcoudurier
parents: 3620
diff changeset
1172 st->codec->codec_id =
0415fc41780a keep original codec/fourcc endianness, fix XDCAMHD.mov
bcoudurier
parents: 3620
diff changeset
1173 st->codec->codec_id == CODEC_ID_PCM_S16BE ?
0415fc41780a keep original codec/fourcc endianness, fix XDCAMHD.mov
bcoudurier
parents: 3620
diff changeset
1174 CODEC_ID_PCM_S24BE : CODEC_ID_PCM_S24LE;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1175 break;
3036
62181fbfc128 remove messy and not always correct chunk size workaround, use correct values instead
bcoudurier
parents: 3034
diff changeset
1176 /* set values for old format before stsd version 1 appeared */
62181fbfc128 remove messy and not always correct chunk size workaround, use correct values instead
bcoudurier
parents: 3034
diff changeset
1177 case CODEC_ID_MACE3:
62181fbfc128 remove messy and not always correct chunk size workaround, use correct values instead
bcoudurier
parents: 3034
diff changeset
1178 sc->samples_per_frame = 6;
62181fbfc128 remove messy and not always correct chunk size workaround, use correct values instead
bcoudurier
parents: 3034
diff changeset
1179 sc->bytes_per_frame = 2*st->codec->channels;
62181fbfc128 remove messy and not always correct chunk size workaround, use correct values instead
bcoudurier
parents: 3034
diff changeset
1180 break;
62181fbfc128 remove messy and not always correct chunk size workaround, use correct values instead
bcoudurier
parents: 3034
diff changeset
1181 case CODEC_ID_MACE6:
62181fbfc128 remove messy and not always correct chunk size workaround, use correct values instead
bcoudurier
parents: 3034
diff changeset
1182 sc->samples_per_frame = 6;
62181fbfc128 remove messy and not always correct chunk size workaround, use correct values instead
bcoudurier
parents: 3034
diff changeset
1183 sc->bytes_per_frame = 1*st->codec->channels;
62181fbfc128 remove messy and not always correct chunk size workaround, use correct values instead
bcoudurier
parents: 3034
diff changeset
1184 break;
62181fbfc128 remove messy and not always correct chunk size workaround, use correct values instead
bcoudurier
parents: 3034
diff changeset
1185 case CODEC_ID_ADPCM_IMA_QT:
62181fbfc128 remove messy and not always correct chunk size workaround, use correct values instead
bcoudurier
parents: 3034
diff changeset
1186 sc->samples_per_frame = 64;
62181fbfc128 remove messy and not always correct chunk size workaround, use correct values instead
bcoudurier
parents: 3034
diff changeset
1187 sc->bytes_per_frame = 34*st->codec->channels;
62181fbfc128 remove messy and not always correct chunk size workaround, use correct values instead
bcoudurier
parents: 3034
diff changeset
1188 break;
3252
f4fcd39c5d7f set gsm default frame size and bytes per frame, needed by old qt format, fix sample-gsm-8000.mov
bcoudurier
parents: 3245
diff changeset
1189 case CODEC_ID_GSM:
f4fcd39c5d7f set gsm default frame size and bytes per frame, needed by old qt format, fix sample-gsm-8000.mov
bcoudurier
parents: 3245
diff changeset
1190 sc->samples_per_frame = 160;
f4fcd39c5d7f set gsm default frame size and bytes per frame, needed by old qt format, fix sample-gsm-8000.mov
bcoudurier
parents: 3245
diff changeset
1191 sc->bytes_per_frame = 33;
f4fcd39c5d7f set gsm default frame size and bytes per frame, needed by old qt format, fix sample-gsm-8000.mov
bcoudurier
parents: 3245
diff changeset
1192 break;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1193 default:
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1194 break;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1195 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1196
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1197 bits_per_sample = av_get_bits_per_sample(st->codec->codec_id);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1198 if (bits_per_sample) {
3908
1d3d17de20ba Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 3796
diff changeset
1199 st->codec->bits_per_coded_sample = bits_per_sample;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1200 sc->sample_size = (bits_per_sample >> 3) * st->codec->channels;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1201 }
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
1202 } else if(st->codec->codec_type==AVMEDIA_TYPE_SUBTITLE){
4192
a48a6a414dfe Read extradata (justification, colors, fonts, etc) for mov/mp4 timed text
conrad
parents: 4184
diff changeset
1203 // ttxt stsd contains display flags, justification, background
a48a6a414dfe Read extradata (justification, colors, fonts, etc) for mov/mp4 timed text
conrad
parents: 4184
diff changeset
1204 // color, fonts, and default styles, so fake an atom to read it
a48a6a414dfe Read extradata (justification, colors, fonts, etc) for mov/mp4 timed text
conrad
parents: 4184
diff changeset
1205 MOVAtom fake_atom = { .size = size - (url_ftell(pb) - start_pos) };
4806
c3f239ee623f Support DVD subtitles in mov/mp4 as created by Nero.
reimar
parents: 4790
diff changeset
1206 if (format != AV_RL32("mp4s")) // mp4s contains a regular esds atom
4807
916678f56bfd Reindent
reimar
parents: 4806
diff changeset
1207 mov_read_glbl(c, pb, fake_atom);
2972
bc330130bdce Set subtitle codec id correctly, i hope this does not break anything.
michael
parents: 2970
diff changeset
1208 st->codec->codec_id= id;
4202
baf5439883f1 Use the dimensions in tkhd for timed text tracks
conrad
parents: 4201
diff changeset
1209 st->codec->width = sc->width;
baf5439883f1 Use the dimensions in tkhd for timed text tracks
conrad
parents: 4201
diff changeset
1210 st->codec->height = sc->height;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1211 } else {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1212 /* other codec type, just skip (rtp, mp4s, tmcd ...) */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1213 url_fskip(pb, size - (url_ftell(pb) - start_pos));
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1214 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1215 /* this will read extra atoms at the end (wave, alac, damr, avcC, SMI ...) */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1216 a.size = size - (url_ftell(pb) - start_pos);
2806
1ce39cda4a59 check mov_read_default return value where appropriate, patch by takis, fix issue 285
bcoudurier
parents: 2794
diff changeset
1217 if (a.size > 8) {
1ce39cda4a59 check mov_read_default return value where appropriate, patch by takis, fix issue 285
bcoudurier
parents: 2794
diff changeset
1218 if (mov_read_default(c, pb, a) < 0)
1ce39cda4a59 check mov_read_default return value where appropriate, patch by takis, fix issue 285
bcoudurier
parents: 2794
diff changeset
1219 return -1;
1ce39cda4a59 check mov_read_default return value where appropriate, patch by takis, fix issue 285
bcoudurier
parents: 2794
diff changeset
1220 } else if (a.size > 0)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1221 url_fskip(pb, a.size);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1222 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1223
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
1224 if(st->codec->codec_type==AVMEDIA_TYPE_AUDIO && st->codec->sample_rate==0 && sc->time_scale>1)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1225 st->codec->sample_rate= sc->time_scale;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1226
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1227 /* special codec parameters handling */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1228 switch (st->codec->codec_id) {
4206
c3102b189cb6 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 4202
diff changeset
1229 #if CONFIG_DV_DEMUXER
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1230 case CODEC_ID_DVAUDIO:
4406
146d6083662b Replace the calls to the deprecated av_alloc_format_context() with
stefano
parents: 4399
diff changeset
1231 c->dv_fctx = avformat_alloc_context();
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1232 c->dv_demux = dv_init_demux(c->dv_fctx);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1233 if (!c->dv_demux) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1234 av_log(c->fc, AV_LOG_ERROR, "dv demux context init error\n");
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1235 return -1;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1236 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1237 sc->dv_audio_container = 1;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1238 st->codec->codec_id = CODEC_ID_PCM_S16LE;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1239 break;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1240 #endif
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1241 /* no ifdef since parameters are always those */
3245
9f25267bee44 demux qcelp, so this can work with soc decoder and stream copy
bcoudurier
parents: 3242
diff changeset
1242 case CODEC_ID_QCELP:
4835
ac71e186e2fe force sample for qcelp when not stored in mov, fix #968
bcoudurier
parents: 4807
diff changeset
1243 // force sample rate for qcelp when not stored in mov
ac71e186e2fe force sample for qcelp when not stored in mov, fix #968
bcoudurier
parents: 4807
diff changeset
1244 if (st->codec->codec_tag != MKTAG('Q','c','l','p'))
ac71e186e2fe force sample for qcelp when not stored in mov, fix #968
bcoudurier
parents: 4807
diff changeset
1245 st->codec->sample_rate = 8000;
4056
a6a5fe159af7 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 4054
diff changeset
1246 st->codec->frame_size= 160;
4054
33d869ddfd06 More OKed parts of the QCELP decoder
vitor
parents: 4044
diff changeset
1247 st->codec->channels= 1; /* really needed */
4056
a6a5fe159af7 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 4054
diff changeset
1248 break;
3256
b09eff5b0e89 parser should not be needed anymore, merge cases and set frame size for amr too
bcoudurier
parents: 3255
diff changeset
1249 case CODEC_ID_AMR_NB:
3933
4ab8a237c386 merge amr wb case with amr nb and qcelp
bcoudurier
parents: 3932
diff changeset
1250 case CODEC_ID_AMR_WB:
3258
6aabf84abeef cosmetics
bcoudurier
parents: 3257
diff changeset
1251 st->codec->frame_size= sc->samples_per_frame;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1252 st->codec->channels= 1; /* really needed */
3974
a8383d02c686 set sample rate for amr to allow stream copy since no decoder is present,
bcoudurier
parents: 3973
diff changeset
1253 /* force sample rate for amr, stsd in 3gp does not store sample rate */
3989
8b2c1cfecd94 10l, fix amrwb sample rate
bcoudurier
parents: 3974
diff changeset
1254 if (st->codec->codec_id == CODEC_ID_AMR_NB)
3974
a8383d02c686 set sample rate for amr to allow stream copy since no decoder is present,
bcoudurier
parents: 3973
diff changeset
1255 st->codec->sample_rate = 8000;
3989
8b2c1cfecd94 10l, fix amrwb sample rate
bcoudurier
parents: 3974
diff changeset
1256 else if (st->codec->codec_id == CODEC_ID_AMR_WB)
8b2c1cfecd94 10l, fix amrwb sample rate
bcoudurier
parents: 3974
diff changeset
1257 st->codec->sample_rate = 16000;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1258 break;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1259 case CODEC_ID_MP2:
1953
edfd6b33d1f6 activate parser on MP3 id, fix [A-Destiny]_Konjiki_no_Gash_Bell_-_65_[71EE362C].mp4
bcoudurier
parents: 1950
diff changeset
1260 case CODEC_ID_MP3:
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
1261 st->codec->codec_type = AVMEDIA_TYPE_AUDIO; /* force type after stsd for m1a hdlr */
2023
a3e79d6e4e3c add an enum for need_parsing
aurel
parents: 2006
diff changeset
1262 st->need_parsing = AVSTREAM_PARSE_FULL;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1263 break;
3187
5c8fc77cf10a gsm in mov, demux surge-1-16-B-agsm.mov
bcoudurier
parents: 3182
diff changeset
1264 case CODEC_ID_GSM:
2299
fe59c768ecf7 set block align to stsd audio v2 bytes per frame for adpcm ms and ima wav, fix surge-2-16-L-ms11.mov and surge-2-16-L-ms02.mov
bcoudurier
parents: 2298
diff changeset
1265 case CODEC_ID_ADPCM_MS:
fe59c768ecf7 set block align to stsd audio v2 bytes per frame for adpcm ms and ima wav, fix surge-2-16-L-ms11.mov and surge-2-16-L-ms02.mov
bcoudurier
parents: 2298
diff changeset
1266 case CODEC_ID_ADPCM_IMA_WAV:
fe59c768ecf7 set block align to stsd audio v2 bytes per frame for adpcm ms and ima wav, fix surge-2-16-L-ms11.mov and surge-2-16-L-ms02.mov
bcoudurier
parents: 2298
diff changeset
1267 st->codec->block_align = sc->bytes_per_frame;
fe59c768ecf7 set block align to stsd audio v2 bytes per frame for adpcm ms and ima wav, fix surge-2-16-L-ms11.mov and surge-2-16-L-ms02.mov
bcoudurier
parents: 2298
diff changeset
1268 break;
3242
0b65c21ef10f set alac frame size from extradata
bcoudurier
parents: 3224
diff changeset
1269 case CODEC_ID_ALAC:
4122
30262468fff4 set alac channels from extradata, fix alac mono in m4a
bcoudurier
parents: 4116
diff changeset
1270 if (st->codec->extradata_size == 36) {
4123
e536841c1aeb cosmetics, remove useless parenthesis and whitespaces
bcoudurier
parents: 4122
diff changeset
1271 st->codec->frame_size = AV_RB32(st->codec->extradata+12);
e536841c1aeb cosmetics, remove useless parenthesis and whitespaces
bcoudurier
parents: 4122
diff changeset
1272 st->codec->channels = AV_RB8 (st->codec->extradata+21);
4122
30262468fff4 set alac channels from extradata, fix alac mono in m4a
bcoudurier
parents: 4116
diff changeset
1273 }
3242
0b65c21ef10f set alac frame size from extradata
bcoudurier
parents: 3224
diff changeset
1274 break;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1275 default:
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1276 break;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1277 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1278
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1279 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1280 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1281
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
1282 static int mov_read_stsc(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1283 {
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1284 AVStream *st;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1285 MOVStreamContext *sc;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1286 unsigned int i, entries;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1287
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1288 if (c->fc->nb_streams < 1)
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1289 return 0;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1290 st = c->fc->streams[c->fc->nb_streams-1];
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1291 sc = st->priv_data;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1292
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1293 get_byte(pb); /* version */
3145
49989c8b181c simplify, flags is 24bits according to specs
bcoudurier
parents: 3135
diff changeset
1294 get_be24(pb); /* flags */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1295
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1296 entries = get_be32(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1297
2044
fee0acdb8156 use dprintf with AVFormatContext and simplify
bcoudurier
parents: 2042
diff changeset
1298 dprintf(c->fc, "track[%i].stsc.entries = %i\n", c->fc->nb_streams-1, entries);
fee0acdb8156 use dprintf with AVFormatContext and simplify
bcoudurier
parents: 2042
diff changeset
1299
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1300 if(entries >= UINT_MAX / sizeof(*sc->stsc_data))
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1301 return -1;
4412
4261d0ad4d01 cosmetics: sample_to_chunk -> stsc
bcoudurier
parents: 4411
diff changeset
1302 sc->stsc_data = av_malloc(entries * sizeof(*sc->stsc_data));
4261d0ad4d01 cosmetics: sample_to_chunk -> stsc
bcoudurier
parents: 4411
diff changeset
1303 if (!sc->stsc_data)
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1304 return AVERROR(ENOMEM);
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1305 sc->stsc_count = entries;
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1306
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1307 for(i=0; i<entries; i++) {
4412
4261d0ad4d01 cosmetics: sample_to_chunk -> stsc
bcoudurier
parents: 4411
diff changeset
1308 sc->stsc_data[i].first = get_be32(pb);
4261d0ad4d01 cosmetics: sample_to_chunk -> stsc
bcoudurier
parents: 4411
diff changeset
1309 sc->stsc_data[i].count = get_be32(pb);
4261d0ad4d01 cosmetics: sample_to_chunk -> stsc
bcoudurier
parents: 4411
diff changeset
1310 sc->stsc_data[i].id = get_be32(pb);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1311 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1312 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1313 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1314
4933
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1315 static int mov_read_stps(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1316 {
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1317 AVStream *st;
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1318 MOVStreamContext *sc;
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1319 unsigned i, entries;
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1320
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1321 if (c->fc->nb_streams < 1)
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1322 return 0;
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1323 st = c->fc->streams[c->fc->nb_streams-1];
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1324 sc = st->priv_data;
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1325
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1326 get_be32(pb); // version + flags
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1327
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1328 entries = get_be32(pb);
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1329 if (entries >= UINT_MAX / sizeof(*sc->stps_data))
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1330 return -1;
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1331 sc->stps_data = av_malloc(entries * sizeof(*sc->stps_data));
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1332 if (!sc->stps_data)
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1333 return AVERROR(ENOMEM);
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1334 sc->stps_count = entries;
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1335
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1336 for (i = 0; i < entries; i++) {
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1337 sc->stps_data[i] = get_be32(pb);
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1338 //dprintf(c->fc, "stps %d\n", sc->stps_data[i]);
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1339 }
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1340
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1341 return 0;
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1342 }
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1343
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
1344 static int mov_read_stss(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1345 {
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1346 AVStream *st;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1347 MOVStreamContext *sc;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1348 unsigned int i, entries;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1349
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1350 if (c->fc->nb_streams < 1)
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1351 return 0;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1352 st = c->fc->streams[c->fc->nb_streams-1];
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1353 sc = st->priv_data;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1354
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1355 get_byte(pb); /* version */
3145
49989c8b181c simplify, flags is 24bits according to specs
bcoudurier
parents: 3135
diff changeset
1356 get_be24(pb); /* flags */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1357
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1358 entries = get_be32(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1359
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1360 dprintf(c->fc, "keyframe_count = %d\n", entries);
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1361
2030
4464239eddbb long -> int
bcoudurier
parents: 2029
diff changeset
1362 if(entries >= UINT_MAX / sizeof(int))
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1363 return -1;
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1364 sc->keyframes = av_malloc(entries * sizeof(int));
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1365 if (!sc->keyframes)
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1366 return AVERROR(ENOMEM);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1367 sc->keyframe_count = entries;
2044
fee0acdb8156 use dprintf with AVFormatContext and simplify
bcoudurier
parents: 2042
diff changeset
1368
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1369 for(i=0; i<entries; i++) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1370 sc->keyframes[i] = get_be32(pb);
2044
fee0acdb8156 use dprintf with AVFormatContext and simplify
bcoudurier
parents: 2042
diff changeset
1371 //dprintf(c->fc, "keyframes[]=%d\n", sc->keyframes[i]);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1372 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1373 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1374 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1375
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
1376 static int mov_read_stsz(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1377 {
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1378 AVStream *st;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1379 MOVStreamContext *sc;
4739
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1380 unsigned int i, entries, sample_size, field_size, num_bytes;
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1381 GetBitContext gb;
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1382 unsigned char* buf;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1383
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1384 if (c->fc->nb_streams < 1)
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1385 return 0;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1386 st = c->fc->streams[c->fc->nb_streams-1];
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1387 sc = st->priv_data;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1388
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1389 get_byte(pb); /* version */
3145
49989c8b181c simplify, flags is 24bits according to specs
bcoudurier
parents: 3135
diff changeset
1390 get_be24(pb); /* flags */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1391
4739
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1392 if (atom.type == MKTAG('s','t','s','z')) {
4740
07ac6d6584a1 Cosmetics: Re-indent after last commit
alexc
parents: 4739
diff changeset
1393 sample_size = get_be32(pb);
07ac6d6584a1 Cosmetics: Re-indent after last commit
alexc
parents: 4739
diff changeset
1394 if (!sc->sample_size) /* do not overwrite value computed in stsd */
07ac6d6584a1 Cosmetics: Re-indent after last commit
alexc
parents: 4739
diff changeset
1395 sc->sample_size = sample_size;
07ac6d6584a1 Cosmetics: Re-indent after last commit
alexc
parents: 4739
diff changeset
1396 field_size = 32;
4739
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1397 } else {
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1398 sample_size = 0;
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1399 get_be24(pb); /* reserved */
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1400 field_size = get_byte(pb);
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1401 }
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1402 entries = get_be32(pb);
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1403
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1404 dprintf(c->fc, "sample_size = %d sample_count = %d\n", sc->sample_size, entries);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1405
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1406 sc->sample_count = entries;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1407 if (sample_size)
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1408 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1409
4739
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1410 if (field_size != 4 && field_size != 8 && field_size != 16 && field_size != 32) {
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1411 av_log(c->fc, AV_LOG_ERROR, "Invalid sample field size %d\n", field_size);
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1412 return -1;
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1413 }
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1414
5165
3d4203b9c2d7 check entries against field_size, potential malloc overflow in read_stsz, fix #1357
bcoudurier
parents: 5164
diff changeset
1415 if (entries >= UINT_MAX / sizeof(int) || entries >= (UINT_MAX - 4) / field_size)
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1416 return -1;
2030
4464239eddbb long -> int
bcoudurier
parents: 2029
diff changeset
1417 sc->sample_sizes = av_malloc(entries * sizeof(int));
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1418 if (!sc->sample_sizes)
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1419 return AVERROR(ENOMEM);
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1420
4739
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1421 num_bytes = (entries*field_size+4)>>3;
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1422
4782
400ca65902d2 since code now use get_bits_long, allocate padding buffer
bcoudurier
parents: 4780
diff changeset
1423 buf = av_malloc(num_bytes+FF_INPUT_BUFFER_PADDING_SIZE);
4739
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1424 if (!buf) {
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1425 av_freep(&sc->sample_sizes);
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1426 return AVERROR(ENOMEM);
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1427 }
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1428
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1429 if (get_buffer(pb, buf, num_bytes) < num_bytes) {
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1430 av_freep(&sc->sample_sizes);
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1431 av_free(buf);
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1432 return -1;
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1433 }
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1434
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1435 init_get_bits(&gb, buf, 8*num_bytes);
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1436
3156
487b1979f195 remove useless debug print since now mov_build_index will do
bcoudurier
parents: 3155
diff changeset
1437 for(i=0; i<entries; i++)
4739
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1438 sc->sample_sizes[i] = get_bits_long(&gb, field_size);
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1439
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
1440 av_free(buf);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1441 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1442 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1443
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
1444 static int mov_read_stts(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1445 {
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1446 AVStream *st;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1447 MOVStreamContext *sc;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1448 unsigned int i, entries;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1449 int64_t duration=0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1450 int64_t total_sample_count=0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1451
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1452 if (c->fc->nb_streams < 1)
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1453 return 0;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1454 st = c->fc->streams[c->fc->nb_streams-1];
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1455 sc = st->priv_data;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1456
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1457 get_byte(pb); /* version */
3145
49989c8b181c simplify, flags is 24bits according to specs
bcoudurier
parents: 3135
diff changeset
1458 get_be24(pb); /* flags */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1459 entries = get_be32(pb);
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1460
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1461 dprintf(c->fc, "track[%i].stts.entries = %i\n", c->fc->nb_streams-1, entries);
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1462
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
1463 if(entries >= UINT_MAX / sizeof(*sc->stts_data))
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1464 return -1;
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
1465 sc->stts_data = av_malloc(entries * sizeof(*sc->stts_data));
2807
5bf4b9df2794 return error if malloc failed, found by takis, fix issue 286
bcoudurier
parents: 2806
diff changeset
1466 if (!sc->stts_data)
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1467 return AVERROR(ENOMEM);
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1468 sc->stts_count = entries;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1469
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1470 for(i=0; i<entries; i++) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1471 int sample_duration;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1472 int sample_count;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1473
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1474 sample_count=get_be32(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1475 sample_duration = get_be32(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1476 sc->stts_data[i].count= sample_count;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1477 sc->stts_data[i].duration= sample_duration;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1478
1907
b33db97089ba Give context to dprintf
mbardiaux
parents: 1848
diff changeset
1479 dprintf(c->fc, "sample_count=%d, sample_duration=%d\n",sample_count,sample_duration);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1480
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1481 duration+=(int64_t)sample_duration*sample_count;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1482 total_sample_count+=sample_count;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1483 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1484
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1485 st->nb_frames= total_sample_count;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1486 if(duration)
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1487 st->duration= duration;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1488 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1489 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1490
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
1491 static int mov_read_ctts(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1492 {
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1493 AVStream *st;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1494 MOVStreamContext *sc;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1495 unsigned int i, entries;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1496
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1497 if (c->fc->nb_streams < 1)
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1498 return 0;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1499 st = c->fc->streams[c->fc->nb_streams-1];
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1500 sc = st->priv_data;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1501
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1502 get_byte(pb); /* version */
3145
49989c8b181c simplify, flags is 24bits according to specs
bcoudurier
parents: 3135
diff changeset
1503 get_be24(pb); /* flags */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1504 entries = get_be32(pb);
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1505
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1506 dprintf(c->fc, "track[%i].ctts.entries = %i\n", c->fc->nb_streams-1, entries);
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1507
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
1508 if(entries >= UINT_MAX / sizeof(*sc->ctts_data))
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1509 return -1;
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
1510 sc->ctts_data = av_malloc(entries * sizeof(*sc->ctts_data));
2807
5bf4b9df2794 return error if malloc failed, found by takis, fix issue 286
bcoudurier
parents: 2806
diff changeset
1511 if (!sc->ctts_data)
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1512 return AVERROR(ENOMEM);
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1513 sc->ctts_count = entries;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1514
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1515 for(i=0; i<entries; i++) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1516 int count =get_be32(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1517 int duration =get_be32(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1518
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1519 sc->ctts_data[i].count = count;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1520 sc->ctts_data[i].duration= duration;
5347
f09a07cad10b compute dts shift with ctts value, cslg atom might be missing, fix #419
bcoudurier
parents: 5346
diff changeset
1521 if (duration < 0)
f09a07cad10b compute dts shift with ctts value, cslg atom might be missing, fix #419
bcoudurier
parents: 5346
diff changeset
1522 sc->dts_shift = FFMAX(sc->dts_shift, -duration);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1523 }
5347
f09a07cad10b compute dts shift with ctts value, cslg atom might be missing, fix #419
bcoudurier
parents: 5346
diff changeset
1524
5351
49d4ac4b6516 10l, typo
bcoudurier
parents: 5348
diff changeset
1525 dprintf(c->fc, "dts shift %d\n", sc->dts_shift);
5347
f09a07cad10b compute dts shift with ctts value, cslg atom might be missing, fix #419
bcoudurier
parents: 5346
diff changeset
1526
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1527 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1528 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1529
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1530 static void mov_build_index(MOVContext *mov, AVStream *st)
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1531 {
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1532 MOVStreamContext *sc = st->priv_data;
3973
549a09cf23fe Remove offset_t typedef and use int64_t directly instead.
diego
parents: 3967
diff changeset
1533 int64_t current_offset;
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1534 int64_t current_dts = 0;
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1535 unsigned int stts_index = 0;
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1536 unsigned int stsc_index = 0;
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1537 unsigned int stss_index = 0;
4933
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1538 unsigned int stps_index = 0;
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1539 unsigned int i, j;
5332
ff45ef768724 compute codec bitrate in mov demuxer, patch by haim alon, haim dot alter at gmail dot com
bcoudurier
parents: 5242
diff changeset
1540 uint64_t stream_size = 0;
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1541
4399
530e55405feb offset dts according to edit list, hackish but works, based on patch by Reimar
bcoudurier
parents: 4369
diff changeset
1542 /* adjust first dts according to edit list */
530e55405feb offset dts according to edit list, hackish but works, based on patch by Reimar
bcoudurier
parents: 4369
diff changeset
1543 if (sc->time_offset) {
4742
0496cbd94374 Extend mov edit list support to work for a first padding entry with
reimar
parents: 4740
diff changeset
1544 int rescaled = sc->time_offset < 0 ? av_rescale(sc->time_offset, sc->time_scale, mov->time_scale) : sc->time_offset;
5015
7b260f4d453d Remove time_rate, we cannot compute exactly when fragments are
bcoudurier
parents: 5002
diff changeset
1545 current_dts = -rescaled;
4790
0493d65debd7 set wrong_dts for iMovie created files which has huge ctts delay, fix ffmpeg_sample.m4v
bcoudurier
parents: 4786
diff changeset
1546 if (sc->ctts_data && sc->ctts_data[0].duration / sc->stts_data[0].duration > 16) {
0493d65debd7 set wrong_dts for iMovie created files which has huge ctts delay, fix ffmpeg_sample.m4v
bcoudurier
parents: 4786
diff changeset
1547 /* more than 16 frames delay, dts are likely wrong
0493d65debd7 set wrong_dts for iMovie created files which has huge ctts delay, fix ffmpeg_sample.m4v
bcoudurier
parents: 4786
diff changeset
1548 this happens with files created by iMovie */
0493d65debd7 set wrong_dts for iMovie created files which has huge ctts delay, fix ffmpeg_sample.m4v
bcoudurier
parents: 4786
diff changeset
1549 sc->wrong_dts = 1;
0493d65debd7 set wrong_dts for iMovie created files which has huge ctts delay, fix ffmpeg_sample.m4v
bcoudurier
parents: 4786
diff changeset
1550 st->codec->has_b_frames = 1;
0493d65debd7 set wrong_dts for iMovie created files which has huge ctts delay, fix ffmpeg_sample.m4v
bcoudurier
parents: 4786
diff changeset
1551 }
4399
530e55405feb offset dts according to edit list, hackish but works, based on patch by Reimar
bcoudurier
parents: 4369
diff changeset
1552 }
530e55405feb offset dts according to edit list, hackish but works, based on patch by Reimar
bcoudurier
parents: 4369
diff changeset
1553
3178
73b7ef886091 Only use chunk demuxing for old uncompressed audio mechanism specified by stts.
bcoudurier
parents: 3175
diff changeset
1554 /* only use old uncompressed audio chunk demuxing when stts specifies it */
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
1555 if (!(st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3178
73b7ef886091 Only use chunk demuxing for old uncompressed audio mechanism specified by stts.
bcoudurier
parents: 3175
diff changeset
1556 sc->stts_count == 1 && sc->stts_data[0].duration == 1)) {
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1557 unsigned int current_sample = 0;
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1558 unsigned int stts_sample = 0;
4933
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1559 unsigned int sample_size;
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1560 unsigned int distance = 0;
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1561 int key_off = sc->keyframes && sc->keyframes[0] == 1;
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1562
4930
1f151bcb0b27 Parse 'cslg' atom to retrieve dts shift when 'ctts' duration is negative.
bcoudurier
parents: 4890
diff changeset
1563 current_dts -= sc->dts_shift;
1f151bcb0b27 Parse 'cslg' atom to retrieve dts shift when 'ctts' duration is negative.
bcoudurier
parents: 4890
diff changeset
1564
5788
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1565 if (sc->sample_count >= UINT_MAX / sizeof(*st->index_entries))
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1566 return;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1567 st->index_entries = av_malloc(sc->sample_count*sizeof(*st->index_entries));
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1568 if (!st->index_entries)
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1569 return;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1570 st->index_entries_allocated_size = sc->sample_count*sizeof(*st->index_entries);
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1571
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1572 for (i = 0; i < sc->chunk_count; i++) {
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1573 current_offset = sc->chunk_offsets[i];
4412
4261d0ad4d01 cosmetics: sample_to_chunk -> stsc
bcoudurier
parents: 4411
diff changeset
1574 if (stsc_index + 1 < sc->stsc_count &&
4261d0ad4d01 cosmetics: sample_to_chunk -> stsc
bcoudurier
parents: 4411
diff changeset
1575 i + 1 == sc->stsc_data[stsc_index + 1].first)
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1576 stsc_index++;
4412
4261d0ad4d01 cosmetics: sample_to_chunk -> stsc
bcoudurier
parents: 4411
diff changeset
1577 for (j = 0; j < sc->stsc_data[stsc_index].count; j++) {
4933
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1578 int keyframe = 0;
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1579 if (current_sample >= sc->sample_count) {
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1580 av_log(mov->fc, AV_LOG_ERROR, "wrong sample count\n");
4717
ee2dd1b3afc3 do not modify sample_count, check against index entries
bcoudurier
parents: 4690
diff changeset
1581 return;
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1582 }
4933
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1583
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1584 if (!sc->keyframe_count || current_sample+key_off == sc->keyframes[stss_index]) {
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1585 keyframe = 1;
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1586 if (stss_index + 1 < sc->keyframe_count)
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1587 stss_index++;
4933
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1588 } else if (sc->stps_count && current_sample+key_off == sc->stps_data[stps_index]) {
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1589 keyframe = 1;
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1590 if (stps_index + 1 < sc->stps_count)
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1591 stps_index++;
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1592 }
4933
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1593 if (keyframe)
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1594 distance = 0;
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1595 sample_size = sc->sample_size > 0 ? sc->sample_size : sc->sample_sizes[current_sample];
3299
80a497804aa8 demux all stsd ids if codec is the same, fix premature_mov_ending.mov, closes #451
bcoudurier
parents: 3286
diff changeset
1596 if(sc->pseudo_stream_id == -1 ||
4412
4261d0ad4d01 cosmetics: sample_to_chunk -> stsc
bcoudurier
parents: 4411
diff changeset
1597 sc->stsc_data[stsc_index].id - 1 == sc->pseudo_stream_id) {
5788
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1598 AVIndexEntry *e = &st->index_entries[st->nb_index_entries++];
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1599 e->pos = current_offset;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1600 e->timestamp = current_dts;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1601 e->size = sample_size;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1602 e->min_distance = distance;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1603 e->flags = keyframe ? AVINDEX_KEYFRAME : 0;
3301
11b6da5ffe78 only print debug info when sample is actually added
bcoudurier
parents: 3300
diff changeset
1604 dprintf(mov->fc, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "
11b6da5ffe78 only print debug info when sample is actually added
bcoudurier
parents: 3300
diff changeset
1605 "size %d, distance %d, keyframe %d\n", st->index, current_sample,
11b6da5ffe78 only print debug info when sample is actually added
bcoudurier
parents: 3300
diff changeset
1606 current_offset, current_dts, sample_size, distance, keyframe);
11b6da5ffe78 only print debug info when sample is actually added
bcoudurier
parents: 3300
diff changeset
1607 }
4718
7bf091a4b6d9 cosmetics, add some whitespaces and empty lines
bcoudurier
parents: 4717
diff changeset
1608
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1609 current_offset += sample_size;
5332
ff45ef768724 compute codec bitrate in mov demuxer, patch by haim alon, haim dot alter at gmail dot com
bcoudurier
parents: 5242
diff changeset
1610 stream_size += sample_size;
5015
7b260f4d453d Remove time_rate, we cannot compute exactly when fragments are
bcoudurier
parents: 5002
diff changeset
1611 current_dts += sc->stts_data[stts_index].duration;
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1612 distance++;
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1613 stts_sample++;
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1614 current_sample++;
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1615 if (stts_index + 1 < sc->stts_count && stts_sample == sc->stts_data[stts_index].count) {
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1616 stts_sample = 0;
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1617 stts_index++;
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1618 }
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1619 }
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1620 }
5346
e226b1d6a6ee check that duration is set to avoid fpe
bcoudurier
parents: 5345
diff changeset
1621 if (st->duration > 0)
e226b1d6a6ee check that duration is set to avoid fpe
bcoudurier
parents: 5345
diff changeset
1622 st->codec->bit_rate = stream_size*8*sc->time_scale/st->duration;
4992
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1623 } else {
5788
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1624 unsigned chunk_samples, total = 0;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1625
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1626 // compute total chunk count
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1627 for (i = 0; i < sc->stsc_count; i++) {
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1628 unsigned count, chunk_count;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1629
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1630 chunk_samples = sc->stsc_data[i].count;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1631 if (sc->samples_per_frame && chunk_samples % sc->samples_per_frame) {
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1632 av_log(mov->fc, AV_LOG_ERROR, "error unaligned chunk\n");
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1633 return;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1634 }
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1635
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1636 if (sc->samples_per_frame >= 160) { // gsm
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1637 count = chunk_samples / sc->samples_per_frame;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1638 } else if (sc->samples_per_frame > 1) {
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1639 unsigned samples = (1024/sc->samples_per_frame)*sc->samples_per_frame;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1640 count = (chunk_samples+samples-1) / samples;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1641 } else {
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1642 count = (chunk_samples+1023) / 1024;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1643 }
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1644
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1645 if (i < sc->stsc_count - 1)
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1646 chunk_count = sc->stsc_data[i+1].first - sc->stsc_data[i].first;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1647 else
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1648 chunk_count = sc->chunk_count - (sc->stsc_data[i].first - 1);
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1649 total += chunk_count * count;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1650 }
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1651
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1652 dprintf(mov->fc, "chunk count %d\n", total);
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1653 if (total >= UINT_MAX / sizeof(*st->index_entries))
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1654 return;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1655 st->index_entries = av_malloc(total*sizeof(*st->index_entries));
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1656 if (!st->index_entries)
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1657 return;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1658 st->index_entries_allocated_size = total*sizeof(*st->index_entries);
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1659
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1660 // populate index
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1661 for (i = 0; i < sc->chunk_count; i++) {
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1662 current_offset = sc->chunk_offsets[i];
4412
4261d0ad4d01 cosmetics: sample_to_chunk -> stsc
bcoudurier
parents: 4411
diff changeset
1663 if (stsc_index + 1 < sc->stsc_count &&
4261d0ad4d01 cosmetics: sample_to_chunk -> stsc
bcoudurier
parents: 4411
diff changeset
1664 i + 1 == sc->stsc_data[stsc_index + 1].first)
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1665 stsc_index++;
4412
4261d0ad4d01 cosmetics: sample_to_chunk -> stsc
bcoudurier
parents: 4411
diff changeset
1666 chunk_samples = sc->stsc_data[stsc_index].count;
4992
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1667
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1668 while (chunk_samples > 0) {
5788
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1669 AVIndexEntry *e;
4992
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1670 unsigned size, samples;
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1671
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1672 if (sc->samples_per_frame >= 160) { // gsm
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1673 samples = sc->samples_per_frame;
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1674 size = sc->bytes_per_frame;
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1675 } else {
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1676 if (sc->samples_per_frame > 1) {
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1677 samples = FFMIN((1024 / sc->samples_per_frame)*
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1678 sc->samples_per_frame, chunk_samples);
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1679 size = (samples / sc->samples_per_frame) * sc->bytes_per_frame;
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1680 } else {
4992
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1681 samples = FFMIN(1024, chunk_samples);
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1682 size = samples * sc->sample_size;
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1683 }
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1684 }
4992
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1685
5788
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1686 if (st->nb_index_entries >= total) {
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1687 av_log(mov->fc, AV_LOG_ERROR, "wrong chunk count %d\n", total);
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1688 return;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1689 }
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1690 e = &st->index_entries[st->nb_index_entries++];
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1691 e->pos = current_offset;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1692 e->timestamp = current_dts;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1693 e->size = size;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1694 e->min_distance = 0;
8539cb618ae7 Preallocate index entries in mov demuxer, huge speedup
bcoudurier
parents: 5723
diff changeset
1695 e->flags = AVINDEX_KEYFRAME;
3167
125b08d2ad59 cosmetics, split or move too long lines
bcoudurier
parents: 3166
diff changeset
1696 dprintf(mov->fc, "AVIndex stream %d, chunk %d, offset %"PRIx64", dts %"PRId64", "
125b08d2ad59 cosmetics, split or move too long lines
bcoudurier
parents: 3166
diff changeset
1697 "size %d, duration %d\n", st->index, i, current_offset, current_dts,
4992
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1698 size, samples);
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1699
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1700 current_offset += size;
5015
7b260f4d453d Remove time_rate, we cannot compute exactly when fragments are
bcoudurier
parents: 5002
diff changeset
1701 current_dts += samples;
4992
358aec79a573 split audio chunks in mov demuxer
bcoudurier
parents: 4972
diff changeset
1702 chunk_samples -= samples;
3154
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1703 }
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1704 }
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1705 }
01f6f3c905db move mov_build_index before mov_read_trak to avoid useless declaration
bcoudurier
parents: 3153
diff changeset
1706 }
3153
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1707
5369
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1708 static int mov_open_dref(ByteIOContext **pb, char *src, MOVDref *ref)
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1709 {
5683
7dab04a73364 Do not attempt to open references through absolute pathes.
michael
parents: 5618
diff changeset
1710 /* try relative path, we do not try the absolute because it can leak information about our
7dab04a73364 Do not attempt to open references through absolute pathes.
michael
parents: 5618
diff changeset
1711 system to an attacker */
5369
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1712 if (ref->nlvl_to > 0 && ref->nlvl_from > 0) {
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1713 char filename[1024];
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1714 char *src_path;
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1715 int i, l;
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1716
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1717 /* find a source dir */
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1718 src_path = strrchr(src, '/');
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1719 if (src_path)
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1720 src_path++;
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1721 else
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1722 src_path = src;
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1723
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1724 /* find a next level down to target */
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1725 for (i = 0, l = strlen(ref->path) - 1; l >= 0; l--)
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1726 if (ref->path[l] == '/') {
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1727 if (i == ref->nlvl_to - 1)
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1728 break;
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1729 else
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1730 i++;
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1731 }
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1732
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1733 /* compose filename if next level down to target was found */
5684
9a3b8d7062d2 Make sure we dont write more bytes into filename than the array is long.
michael
parents: 5683
diff changeset
1734 if (i == ref->nlvl_to - 1 && src_path - src < sizeof(filename)) {
5369
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1735 memcpy(filename, src, src_path - src);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1736 filename[src_path - src] = 0;
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1737
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1738 for (i = 1; i < ref->nlvl_from; i++)
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1739 av_strlcat(filename, "../", 1024);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1740
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1741 av_strlcat(filename, ref->path + l + 1, 1024);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1742
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1743 if (!url_fopen(pb, filename, URL_RDONLY))
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1744 return 0;
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1745 }
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1746 }
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1747
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1748 return AVERROR(ENOENT);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1749 };
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1750
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
1751 static int mov_read_trak(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1752 {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1753 AVStream *st;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1754 MOVStreamContext *sc;
3153
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1755 int ret;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1756
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1757 st = av_new_stream(c->fc, c->fc->nb_streams);
3162
5e03e5577f79 return ENOMEM
bcoudurier
parents: 3161
diff changeset
1758 if (!st) return AVERROR(ENOMEM);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1759 sc = av_mallocz(sizeof(MOVStreamContext));
3161
60be75aa8c47 cannot free AVStream like this, and return ENOMEM
bcoudurier
parents: 3160
diff changeset
1760 if (!sc) return AVERROR(ENOMEM);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1761
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1762 st->priv_data = sc;
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
1763 st->codec->codec_type = AVMEDIA_TYPE_DATA;
4197
84251a788a67 move ffindex set before mov_read_default so it can be used in functions
bcoudurier
parents: 4192
diff changeset
1764 sc->ffindex = st->index;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1765
3153
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1766 if ((ret = mov_read_default(c, pb, atom)) < 0)
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1767 return ret;
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1768
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1769 /* sanity checks */
4718
7bf091a4b6d9 cosmetics, add some whitespaces and empty lines
bcoudurier
parents: 4717
diff changeset
1770 if (sc->chunk_count && (!sc->stts_count || !sc->stsc_count ||
7bf091a4b6d9 cosmetics, add some whitespaces and empty lines
bcoudurier
parents: 4717
diff changeset
1771 (!sc->sample_size && !sc->sample_count))) {
3180
a8fe6b542c6b print stream index in error message
bcoudurier
parents: 3179
diff changeset
1772 av_log(c->fc, AV_LOG_ERROR, "stream %d, missing mandatory atoms, broken header\n",
a8fe6b542c6b print stream index in error message
bcoudurier
parents: 3179
diff changeset
1773 st->index);
3153
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1774 return 0;
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1775 }
4718
7bf091a4b6d9 cosmetics, add some whitespaces and empty lines
bcoudurier
parents: 4717
diff changeset
1776
5345
4f2be9042fd6 warn if stream timescale is not set and set it to 1 to avoid FPE
bcoudurier
parents: 5342
diff changeset
1777 if (!sc->time_scale) {
4f2be9042fd6 warn if stream timescale is not set and set it to 1 to avoid FPE
bcoudurier
parents: 5342
diff changeset
1778 av_log(c->fc, AV_LOG_WARNING, "stream %d, timescale not set\n", st->index);
4718
7bf091a4b6d9 cosmetics, add some whitespaces and empty lines
bcoudurier
parents: 4717
diff changeset
1779 sc->time_scale = c->time_scale;
5345
4f2be9042fd6 warn if stream timescale is not set and set it to 1 to avoid FPE
bcoudurier
parents: 5342
diff changeset
1780 if (!sc->time_scale)
4f2be9042fd6 warn if stream timescale is not set and set it to 1 to avoid FPE
bcoudurier
parents: 5342
diff changeset
1781 sc->time_scale = 1;
4f2be9042fd6 warn if stream timescale is not set and set it to 1 to avoid FPE
bcoudurier
parents: 5342
diff changeset
1782 }
4718
7bf091a4b6d9 cosmetics, add some whitespaces and empty lines
bcoudurier
parents: 4717
diff changeset
1783
5015
7b260f4d453d Remove time_rate, we cannot compute exactly when fragments are
bcoudurier
parents: 5002
diff changeset
1784 av_set_pts_info(st, 64, 1, sc->time_scale);
3153
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1785
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
1786 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
4454
7d1460900c59 fix frame size, time rate is not stts duration anymore with time offset
bcoudurier
parents: 4453
diff changeset
1787 !st->codec->frame_size && sc->stts_count == 1) {
7d1460900c59 fix frame size, time rate is not stts duration anymore with time offset
bcoudurier
parents: 4453
diff changeset
1788 st->codec->frame_size = av_rescale(sc->stts_data[0].duration,
7d1460900c59 fix frame size, time rate is not stts duration anymore with time offset
bcoudurier
parents: 4453
diff changeset
1789 st->codec->sample_rate, sc->time_scale);
7d1460900c59 fix frame size, time rate is not stts duration anymore with time offset
bcoudurier
parents: 4453
diff changeset
1790 dprintf(c->fc, "frame size %d\n", st->codec->frame_size);
7d1460900c59 fix frame size, time rate is not stts duration anymore with time offset
bcoudurier
parents: 4453
diff changeset
1791 }
3153
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1792
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1793 mov_build_index(c, st);
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1794
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1795 if (sc->dref_id-1 < sc->drefs_count && sc->drefs[sc->dref_id-1].path) {
5369
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1796 MOVDref *dref = &sc->drefs[sc->dref_id - 1];
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1797 if (mov_open_dref(&sc->pb, c->fc->filename, dref) < 0)
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1798 av_log(c->fc, AV_LOG_ERROR,
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1799 "stream %d, error opening alias: path='%s', dir='%s', "
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1800 "filename='%s', volume='%s', nlvl_from=%d, nlvl_to=%d\n",
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1801 st->index, dref->path, dref->dir, dref->filename,
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
1802 dref->volume, dref->nlvl_from, dref->nlvl_to);
3153
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1803 } else
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1804 sc->pb = c->fc->pb;
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1805
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
1806 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
6211
6f6ecca6904a In mov demuxer, only set sar if not already set, patch by Andrew Wason,
bcoudurier
parents: 6210
diff changeset
1807 if (!st->sample_aspect_ratio.num &&
6f6ecca6904a In mov demuxer, only set sar if not already set, patch by Andrew Wason,
bcoudurier
parents: 6210
diff changeset
1808 (st->codec->width != sc->width || st->codec->height != sc->height)) {
6f6ecca6904a In mov demuxer, only set sar if not already set, patch by Andrew Wason,
bcoudurier
parents: 6210
diff changeset
1809 st->sample_aspect_ratio = av_d2q(((double)st->codec->height * sc->width) /
6f6ecca6904a In mov demuxer, only set sar if not already set, patch by Andrew Wason,
bcoudurier
parents: 6210
diff changeset
1810 ((double)st->codec->width * sc->height), INT_MAX);
5562
5d938dd16b34 set average frame rate in mov demuxer
bcoudurier
parents: 5561
diff changeset
1811 }
5d938dd16b34 set average frame rate in mov demuxer
bcoudurier
parents: 5561
diff changeset
1812
5d938dd16b34 set average frame rate in mov demuxer
bcoudurier
parents: 5561
diff changeset
1813 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
5d938dd16b34 set average frame rate in mov demuxer
bcoudurier
parents: 5561
diff changeset
1814 sc->time_scale*st->nb_frames, st->duration, INT_MAX);
5561
067c0af56a4c move aspect ratio code at the end of the track parsing, fix cathedral-beta2-400extra-crop-avc.mp4
bcoudurier
parents: 5546
diff changeset
1815 }
067c0af56a4c move aspect ratio code at the end of the track parsing, fix cathedral-beta2-400extra-crop-avc.mp4
bcoudurier
parents: 5546
diff changeset
1816
3153
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1817 switch (st->codec->codec_id) {
4206
c3102b189cb6 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 4202
diff changeset
1818 #if CONFIG_H261_DECODER
3153
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1819 case CODEC_ID_H261:
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1820 #endif
4206
c3102b189cb6 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 4202
diff changeset
1821 #if CONFIG_H263_DECODER
3153
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1822 case CODEC_ID_H263:
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1823 #endif
4780
75d9edccd39c reset codec width/height for h264 forcing decoder to parse extradata
bcoudurier
parents: 4749
diff changeset
1824 #if CONFIG_H264_DECODER
75d9edccd39c reset codec width/height for h264 forcing decoder to parse extradata
bcoudurier
parents: 4749
diff changeset
1825 case CODEC_ID_H264:
75d9edccd39c reset codec width/height for h264 forcing decoder to parse extradata
bcoudurier
parents: 4749
diff changeset
1826 #endif
4206
c3102b189cb6 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 4202
diff changeset
1827 #if CONFIG_MPEG4_DECODER
3153
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1828 case CODEC_ID_MPEG4:
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1829 #endif
4718
7bf091a4b6d9 cosmetics, add some whitespaces and empty lines
bcoudurier
parents: 4717
diff changeset
1830 st->codec->width = 0; /* let decoder init width/height */
3153
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1831 st->codec->height= 0;
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1832 break;
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1833 }
3155
e22efe21156d free track data asap
bcoudurier
parents: 3154
diff changeset
1834
e22efe21156d free track data asap
bcoudurier
parents: 3154
diff changeset
1835 /* Do not need those anymore. */
e22efe21156d free track data asap
bcoudurier
parents: 3154
diff changeset
1836 av_freep(&sc->chunk_offsets);
4412
4261d0ad4d01 cosmetics: sample_to_chunk -> stsc
bcoudurier
parents: 4411
diff changeset
1837 av_freep(&sc->stsc_data);
3155
e22efe21156d free track data asap
bcoudurier
parents: 3154
diff changeset
1838 av_freep(&sc->sample_sizes);
e22efe21156d free track data asap
bcoudurier
parents: 3154
diff changeset
1839 av_freep(&sc->keyframes);
e22efe21156d free track data asap
bcoudurier
parents: 3154
diff changeset
1840 av_freep(&sc->stts_data);
4933
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
1841 av_freep(&sc->stps_data);
3155
e22efe21156d free track data asap
bcoudurier
parents: 3154
diff changeset
1842
3153
4ded3fdf5c7c move specific end treatment when trak is detected, will be needed for fragments
bcoudurier
parents: 3145
diff changeset
1843 return 0;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1844 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1845
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
1846 static int mov_read_ilst(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
4033
836e25632f0b read itunes metadata, code based on Reimar's patch
bcoudurier
parents: 4028
diff changeset
1847 {
836e25632f0b read itunes metadata, code based on Reimar's patch
bcoudurier
parents: 4028
diff changeset
1848 int ret;
836e25632f0b read itunes metadata, code based on Reimar's patch
bcoudurier
parents: 4028
diff changeset
1849 c->itunes_metadata = 1;
836e25632f0b read itunes metadata, code based on Reimar's patch
bcoudurier
parents: 4028
diff changeset
1850 ret = mov_read_default(c, pb, atom);
836e25632f0b read itunes metadata, code based on Reimar's patch
bcoudurier
parents: 4028
diff changeset
1851 c->itunes_metadata = 0;
836e25632f0b read itunes metadata, code based on Reimar's patch
bcoudurier
parents: 4028
diff changeset
1852 return ret;
836e25632f0b read itunes metadata, code based on Reimar's patch
bcoudurier
parents: 4028
diff changeset
1853 }
836e25632f0b read itunes metadata, code based on Reimar's patch
bcoudurier
parents: 4028
diff changeset
1854
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
1855 static int mov_read_meta(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
4033
836e25632f0b read itunes metadata, code based on Reimar's patch
bcoudurier
parents: 4028
diff changeset
1856 {
4724
13ffc02ce5f8 search for hdlr atom in meta, some files do not store version+flags
bcoudurier
parents: 4722
diff changeset
1857 while (atom.size > 8) {
13ffc02ce5f8 search for hdlr atom in meta, some files do not store version+flags
bcoudurier
parents: 4722
diff changeset
1858 uint32_t tag = get_le32(pb);
13ffc02ce5f8 search for hdlr atom in meta, some files do not store version+flags
bcoudurier
parents: 4722
diff changeset
1859 atom.size -= 4;
13ffc02ce5f8 search for hdlr atom in meta, some files do not store version+flags
bcoudurier
parents: 4722
diff changeset
1860 if (tag == MKTAG('h','d','l','r')) {
13ffc02ce5f8 search for hdlr atom in meta, some files do not store version+flags
bcoudurier
parents: 4722
diff changeset
1861 url_fseek(pb, -8, SEEK_CUR);
13ffc02ce5f8 search for hdlr atom in meta, some files do not store version+flags
bcoudurier
parents: 4722
diff changeset
1862 atom.size += 8;
13ffc02ce5f8 search for hdlr atom in meta, some files do not store version+flags
bcoudurier
parents: 4722
diff changeset
1863 return mov_read_default(c, pb, atom);
13ffc02ce5f8 search for hdlr atom in meta, some files do not store version+flags
bcoudurier
parents: 4722
diff changeset
1864 }
13ffc02ce5f8 search for hdlr atom in meta, some files do not store version+flags
bcoudurier
parents: 4722
diff changeset
1865 }
13ffc02ce5f8 search for hdlr atom in meta, some files do not store version+flags
bcoudurier
parents: 4722
diff changeset
1866 return 0;
4033
836e25632f0b read itunes metadata, code based on Reimar's patch
bcoudurier
parents: 4028
diff changeset
1867 }
836e25632f0b read itunes metadata, code based on Reimar's patch
bcoudurier
parents: 4028
diff changeset
1868
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
1869 static int mov_read_tkhd(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1870 {
3595
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1871 int i;
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1872 int width;
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1873 int height;
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1874 int64_t disp_transform[2];
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1875 int display_matrix[3][2];
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1876 AVStream *st;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1877 MOVStreamContext *sc;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1878 int version;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1879
5060
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1880 if (c->fc->nb_streams < 1)
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1881 return 0;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1882 st = c->fc->streams[c->fc->nb_streams-1];
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1883 sc = st->priv_data;
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1884
0bac77c4a578 check stream existence before assignment, fix #1222
bcoudurier
parents: 5058
diff changeset
1885 version = get_byte(pb);
3145
49989c8b181c simplify, flags is 24bits according to specs
bcoudurier
parents: 3135
diff changeset
1886 get_be24(pb); /* flags */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1887 /*
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1888 MOV_TRACK_ENABLED 0x0001
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1889 MOV_TRACK_IN_MOVIE 0x0002
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1890 MOV_TRACK_IN_PREVIEW 0x0004
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1891 MOV_TRACK_IN_POSTER 0x0008
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1892 */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1893
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1894 if (version == 1) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1895 get_be64(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1896 get_be64(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1897 } else {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1898 get_be32(pb); /* creation time */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1899 get_be32(pb); /* modification time */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1900 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1901 st->id = (int)get_be32(pb); /* track id (NOT 0 !)*/
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1902 get_be32(pb); /* reserved */
4453
f9ab71b3ace7 do not set start time to 0, it is not the case with elst time offset
bcoudurier
parents: 4447
diff changeset
1903
3167
125b08d2ad59 cosmetics, split or move too long lines
bcoudurier
parents: 3166
diff changeset
1904 /* highlevel (considering edits) duration in movie timebase */
125b08d2ad59 cosmetics, split or move too long lines
bcoudurier
parents: 3166
diff changeset
1905 (version == 1) ? get_be64(pb) : get_be32(pb);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1906 get_be32(pb); /* reserved */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1907 get_be32(pb); /* reserved */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1908
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1909 get_be16(pb); /* layer */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1910 get_be16(pb); /* alternate group */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1911 get_be16(pb); /* volume */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1912 get_be16(pb); /* reserved */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1913
3595
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1914 //read in the display matrix (outlined in ISO 14496-12, Section 6.2.2)
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1915 // they're kept in fixed point format through all calculations
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1916 // ignore u,v,z b/c we don't need the scale factor to calc aspect ratio
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1917 for (i = 0; i < 3; i++) {
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1918 display_matrix[i][0] = get_be32(pb); // 16.16 fixed point
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1919 display_matrix[i][1] = get_be32(pb); // 16.16 fixed point
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1920 get_be32(pb); // 2.30 fixed point (not used)
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1921 }
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1922
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1923 width = get_be32(pb); // 16.16 fixed point track width
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1924 height = get_be32(pb); // 16.16 fixed point track height
4202
baf5439883f1 Use the dimensions in tkhd for timed text tracks
conrad
parents: 4201
diff changeset
1925 sc->width = width >> 16;
baf5439883f1 Use the dimensions in tkhd for timed text tracks
conrad
parents: 4201
diff changeset
1926 sc->height = height >> 16;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1927
5068
5657f855d5d0 only set par if it does not indicates a rotation, ex iphone 3GS
bcoudurier
parents: 5065
diff changeset
1928 // transform the display width/height according to the matrix
3595
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1929 // skip this if the display matrix is the default identity matrix
5068
5657f855d5d0 only set par if it does not indicates a rotation, ex iphone 3GS
bcoudurier
parents: 5065
diff changeset
1930 // or if it is rotating the picture, ex iPhone 3GS
3595
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1931 // to keep the same scale, use [width height 1<<16]
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1932 if (width && height &&
5068
5657f855d5d0 only set par if it does not indicates a rotation, ex iphone 3GS
bcoudurier
parents: 5065
diff changeset
1933 ((display_matrix[0][0] != 65536 ||
5657f855d5d0 only set par if it does not indicates a rotation, ex iphone 3GS
bcoudurier
parents: 5065
diff changeset
1934 display_matrix[1][1] != 65536) &&
5657f855d5d0 only set par if it does not indicates a rotation, ex iphone 3GS
bcoudurier
parents: 5065
diff changeset
1935 !display_matrix[0][1] &&
5657f855d5d0 only set par if it does not indicates a rotation, ex iphone 3GS
bcoudurier
parents: 5065
diff changeset
1936 !display_matrix[1][0] &&
5657f855d5d0 only set par if it does not indicates a rotation, ex iphone 3GS
bcoudurier
parents: 5065
diff changeset
1937 !display_matrix[2][0] && !display_matrix[2][1])) {
3595
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1938 for (i = 0; i < 2; i++)
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1939 disp_transform[i] =
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1940 (int64_t) width * display_matrix[0][i] +
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1941 (int64_t) height * display_matrix[1][i] +
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1942 ((int64_t) display_matrix[2][i] << 16);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1943
3595
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1944 //sample aspect ratio is new width/height divided by old width/height
3759
27537074f2a9 convert every muxer/demuxer to write/read sample_aspect_ratio from/to
aurel
parents: 3751
diff changeset
1945 st->sample_aspect_ratio = av_d2q(
3595
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1946 ((double) disp_transform[0] * height) /
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1947 ((double) disp_transform[1] * width), INT_MAX);
84584d6d4d77 Use tkhd matrix for proper display in mov.
benoit
parents: 3588
diff changeset
1948 }
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1949 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1950 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
1951
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
1952 static int mov_read_tfhd(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
3169
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1953 {
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1954 MOVFragment *frag = &c->fragment;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1955 MOVTrackExt *trex = NULL;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1956 int flags, track_id, i;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1957
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1958 get_byte(pb); /* version */
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1959 flags = get_be24(pb);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1960
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1961 track_id = get_be32(pb);
4646
774c340b9e41 MOV: fix demuxing fragmented files
alexc
parents: 4642
diff changeset
1962 if (!track_id)
3169
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1963 return -1;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1964 frag->track_id = track_id;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1965 for (i = 0; i < c->trex_count; i++)
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1966 if (c->trex_data[i].track_id == frag->track_id) {
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1967 trex = &c->trex_data[i];
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1968 break;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1969 }
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1970 if (!trex) {
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1971 av_log(c->fc, AV_LOG_ERROR, "could not find corresponding trex\n");
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1972 return -1;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1973 }
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1974
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1975 if (flags & 0x01) frag->base_data_offset = get_be64(pb);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1976 else frag->base_data_offset = frag->moof_offset;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1977 if (flags & 0x02) frag->stsd_id = get_be32(pb);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1978 else frag->stsd_id = trex->stsd_id;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1979
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1980 frag->duration = flags & 0x08 ? get_be32(pb) : trex->duration;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1981 frag->size = flags & 0x10 ? get_be32(pb) : trex->size;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1982 frag->flags = flags & 0x20 ? get_be32(pb) : trex->flags;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1983 dprintf(c->fc, "frag flags 0x%x\n", frag->flags);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1984 return 0;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1985 }
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1986
5975
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
1987 static int mov_read_chap(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
1988 {
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
1989 c->chapter_track = get_be32(pb);
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
1990 return 0;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
1991 }
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
1992
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
1993 static int mov_read_trex(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
3169
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1994 {
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1995 MOVTrackExt *trex;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1996
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1997 if ((uint64_t)c->trex_count+1 >= UINT_MAX / sizeof(*c->trex_data))
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
1998 return -1;
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
1999 trex = av_realloc(c->trex_data, (c->trex_count+1)*sizeof(*c->trex_data));
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
2000 if (!trex)
3169
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2001 return AVERROR(ENOMEM);
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
2002 c->trex_data = trex;
3169
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2003 trex = &c->trex_data[c->trex_count++];
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2004 get_byte(pb); /* version */
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2005 get_be24(pb); /* flags */
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2006 trex->track_id = get_be32(pb);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2007 trex->stsd_id = get_be32(pb);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2008 trex->duration = get_be32(pb);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2009 trex->size = get_be32(pb);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2010 trex->flags = get_be32(pb);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2011 return 0;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2012 }
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2013
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
2014 static int mov_read_trun(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
3169
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2015 {
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2016 MOVFragment *frag = &c->fragment;
4646
774c340b9e41 MOV: fix demuxing fragmented files
alexc
parents: 4642
diff changeset
2017 AVStream *st = NULL;
3190
8b95e46003f8 check frag track id before setting st
bcoudurier
parents: 3187
diff changeset
2018 MOVStreamContext *sc;
3169
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2019 uint64_t offset;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2020 int64_t dts;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2021 int data_offset = 0;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2022 unsigned entries, first_sample_flags = frag->flags;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2023 int flags, distance, i;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2024
4646
774c340b9e41 MOV: fix demuxing fragmented files
alexc
parents: 4642
diff changeset
2025 for (i = 0; i < c->fc->nb_streams; i++) {
774c340b9e41 MOV: fix demuxing fragmented files
alexc
parents: 4642
diff changeset
2026 if (c->fc->streams[i]->id == frag->track_id) {
774c340b9e41 MOV: fix demuxing fragmented files
alexc
parents: 4642
diff changeset
2027 st = c->fc->streams[i];
774c340b9e41 MOV: fix demuxing fragmented files
alexc
parents: 4642
diff changeset
2028 break;
774c340b9e41 MOV: fix demuxing fragmented files
alexc
parents: 4642
diff changeset
2029 }
774c340b9e41 MOV: fix demuxing fragmented files
alexc
parents: 4642
diff changeset
2030 }
774c340b9e41 MOV: fix demuxing fragmented files
alexc
parents: 4642
diff changeset
2031 if (!st) {
774c340b9e41 MOV: fix demuxing fragmented files
alexc
parents: 4642
diff changeset
2032 av_log(c->fc, AV_LOG_ERROR, "could not find corresponding track id %d\n", frag->track_id);
3190
8b95e46003f8 check frag track id before setting st
bcoudurier
parents: 3187
diff changeset
2033 return -1;
4646
774c340b9e41 MOV: fix demuxing fragmented files
alexc
parents: 4642
diff changeset
2034 }
3190
8b95e46003f8 check frag track id before setting st
bcoudurier
parents: 3187
diff changeset
2035 sc = st->priv_data;
3169
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2036 if (sc->pseudo_stream_id+1 != frag->stsd_id)
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2037 return 0;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2038 get_byte(pb); /* version */
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2039 flags = get_be24(pb);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2040 entries = get_be32(pb);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2041 dprintf(c->fc, "flags 0x%x entries %d\n", flags, entries);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2042 if (flags & 0x001) data_offset = get_be32(pb);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2043 if (flags & 0x004) first_sample_flags = get_be32(pb);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2044 if (flags & 0x800) {
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
2045 MOVStts *ctts_data;
3169
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2046 if ((uint64_t)entries+sc->ctts_count >= UINT_MAX/sizeof(*sc->ctts_data))
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2047 return -1;
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
2048 ctts_data = av_realloc(sc->ctts_data,
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
2049 (entries+sc->ctts_count)*sizeof(*sc->ctts_data));
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
2050 if (!ctts_data)
3169
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2051 return AVERROR(ENOMEM);
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
2052 sc->ctts_data = ctts_data;
3169
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2053 }
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2054 dts = st->duration;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2055 offset = frag->base_data_offset + data_offset;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2056 distance = 0;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2057 dprintf(c->fc, "first sample flags 0x%x\n", first_sample_flags);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2058 for (i = 0; i < entries; i++) {
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2059 unsigned sample_size = frag->size;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2060 int sample_flags = i ? frag->flags : first_sample_flags;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2061 unsigned sample_duration = frag->duration;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2062 int keyframe;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2063
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2064 if (flags & 0x100) sample_duration = get_be32(pb);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2065 if (flags & 0x200) sample_size = get_be32(pb);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2066 if (flags & 0x400) sample_flags = get_be32(pb);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2067 if (flags & 0x800) {
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2068 sc->ctts_data[sc->ctts_count].count = 1;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2069 sc->ctts_data[sc->ctts_count].duration = get_be32(pb);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2070 sc->ctts_count++;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2071 }
5910
536e5527c1e0 Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 5790
diff changeset
2072 if ((keyframe = st->codec->codec_type == AVMEDIA_TYPE_AUDIO ||
3169
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2073 (flags & 0x004 && !i && !sample_flags) || sample_flags & 0x2000000))
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2074 distance = 0;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2075 av_add_index_entry(st, offset, dts, sample_size, distance,
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2076 keyframe ? AVINDEX_KEYFRAME : 0);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2077 dprintf(c->fc, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2078 "size %d, distance %d, keyframe %d\n", st->index, sc->sample_count+i,
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2079 offset, dts, sample_size, distance, keyframe);
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2080 distance++;
5015
7b260f4d453d Remove time_rate, we cannot compute exactly when fragments are
bcoudurier
parents: 5002
diff changeset
2081 dts += sample_duration;
3169
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2082 offset += sample_size;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2083 }
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2084 frag->moof_offset = offset;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2085 st->duration = dts;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2086 return 0;
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2087 }
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2088
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2089 /* this atom should be null (from specs), but some buggy files put the 'moov' atom inside it... */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2090 /* like the files created with Adobe Premiere 5.0, for samples see */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2091 /* http://graphics.tudelft.nl/~wouter/publications/soundtests/ */
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
2092 static int mov_read_wide(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2093 {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2094 int err;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2095
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2096 if (atom.size < 8)
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2097 return 0; /* continue */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2098 if (get_be32(pb) != 0) { /* 0 sized mdat atom... use the 'wide' atom size */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2099 url_fskip(pb, atom.size - 4);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2100 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2101 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2102 atom.type = get_le32(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2103 atom.size -= 8;
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2104 if (atom.type != MKTAG('m','d','a','t')) {
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2105 url_fskip(pb, atom.size);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2106 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2107 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2108 err = mov_read_mdat(c, pb, atom);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2109 return err;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2110 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2111
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
2112 static int mov_read_cmov(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2113 {
4206
c3102b189cb6 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 4202
diff changeset
2114 #if CONFIG_ZLIB
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2115 ByteIOContext ctx;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2116 uint8_t *cmov_data;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2117 uint8_t *moov_data; /* uncompressed data */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2118 long cmov_len, moov_len;
3313
8e83e0b76105 free moov and cmov when error occurs, fix memleak, patch by Albert Astals Cid, aastals at tv-wan dot es
bcoudurier
parents: 3301
diff changeset
2119 int ret = -1;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2120
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2121 get_be32(pb); /* dcom atom */
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2122 if (get_le32(pb) != MKTAG('d','c','o','m'))
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2123 return -1;
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2124 if (get_le32(pb) != MKTAG('z','l','i','b')) {
4602
f1a4622fc4e1 Add a context to av_log() call.
benoit
parents: 4561
diff changeset
2125 av_log(c->fc, AV_LOG_ERROR, "unknown compression for cmov atom !");
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2126 return -1;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2127 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2128 get_be32(pb); /* cmvd atom */
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2129 if (get_le32(pb) != MKTAG('c','m','v','d'))
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2130 return -1;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2131 moov_len = get_be32(pb); /* uncompressed size */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2132 cmov_len = atom.size - 6 * 4;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2133
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2134 cmov_data = av_malloc(cmov_len);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2135 if (!cmov_data)
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
2136 return AVERROR(ENOMEM);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2137 moov_data = av_malloc(moov_len);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2138 if (!moov_data) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2139 av_free(cmov_data);
4560
284c22e8f739 return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
bcoudurier
parents: 4487
diff changeset
2140 return AVERROR(ENOMEM);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2141 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2142 get_buffer(pb, cmov_data, cmov_len);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2143 if(uncompress (moov_data, (uLongf *) &moov_len, (const Bytef *)cmov_data, cmov_len) != Z_OK)
3313
8e83e0b76105 free moov and cmov when error occurs, fix memleak, patch by Albert Astals Cid, aastals at tv-wan dot es
bcoudurier
parents: 3301
diff changeset
2144 goto free_and_return;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2145 if(init_put_byte(&ctx, moov_data, moov_len, 0, NULL, NULL, NULL, NULL) != 0)
3313
8e83e0b76105 free moov and cmov when error occurs, fix memleak, patch by Albert Astals Cid, aastals at tv-wan dot es
bcoudurier
parents: 3301
diff changeset
2146 goto free_and_return;
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2147 atom.type = MKTAG('m','o','o','v');
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2148 atom.size = moov_len;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2149 #ifdef DEBUG
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2150 // { int fd = open("/tmp/uncompheader.mov", O_WRONLY | O_CREAT); write(fd, moov_data, moov_len); close(fd); }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2151 #endif
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2152 ret = mov_read_default(c, &ctx, atom);
3313
8e83e0b76105 free moov and cmov when error occurs, fix memleak, patch by Albert Astals Cid, aastals at tv-wan dot es
bcoudurier
parents: 3301
diff changeset
2153 free_and_return:
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2154 av_free(moov_data);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2155 av_free(cmov_data);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2156 return ret;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2157 #else
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2158 av_log(c->fc, AV_LOG_ERROR, "this file requires zlib support compiled in\n");
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2159 return -1;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2160 #endif
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2161 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2162
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2163 /* edit list atom */
4079
82cbec030af5 remove _t in typedef for POSIX compatibility
bcoudurier
parents: 4056
diff changeset
2164 static int mov_read_elst(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2165 {
5164
99c46fe0b8a0 add one missing check for stream existence in read_elst, fix #1364
bcoudurier
parents: 5068
diff changeset
2166 MOVStreamContext *sc;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2167 int i, edit_count;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2168
5164
99c46fe0b8a0 add one missing check for stream existence in read_elst, fix #1364
bcoudurier
parents: 5068
diff changeset
2169 if (c->fc->nb_streams < 1)
99c46fe0b8a0 add one missing check for stream existence in read_elst, fix #1364
bcoudurier
parents: 5068
diff changeset
2170 return 0;
99c46fe0b8a0 add one missing check for stream existence in read_elst, fix #1364
bcoudurier
parents: 5068
diff changeset
2171 sc = c->fc->streams[c->fc->nb_streams-1]->priv_data;
99c46fe0b8a0 add one missing check for stream existence in read_elst, fix #1364
bcoudurier
parents: 5068
diff changeset
2172
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2173 get_byte(pb); /* version */
3145
49989c8b181c simplify, flags is 24bits according to specs
bcoudurier
parents: 3135
diff changeset
2174 get_be24(pb); /* flags */
4410
517f1978ce5c remove useless field
bcoudurier
parents: 4407
diff changeset
2175 edit_count = get_be32(pb); /* entries */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2176
5035
e743de5125cd check atom size against edit_count to avoid very long loop
bcoudurier
parents: 5027
diff changeset
2177 if((uint64_t)edit_count*12+8 > atom.size)
e743de5125cd check atom size against edit_count to avoid very long loop
bcoudurier
parents: 5027
diff changeset
2178 return -1;
e743de5125cd check atom size against edit_count to avoid very long loop
bcoudurier
parents: 5027
diff changeset
2179
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2180 for(i=0; i<edit_count; i++){
3038
db12cabbe337 warn use if edit list is not starting at 0, a/v desync might occur
bcoudurier
parents: 3037
diff changeset
2181 int time;
4742
0496cbd94374 Extend mov edit list support to work for a first padding entry with
reimar
parents: 4740
diff changeset
2182 int duration = get_be32(pb); /* Track duration */
3038
db12cabbe337 warn use if edit list is not starting at 0, a/v desync might occur
bcoudurier
parents: 3037
diff changeset
2183 time = get_be32(pb); /* Media time */
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2184 get_be32(pb); /* Media rate */
4742
0496cbd94374 Extend mov edit list support to work for a first padding entry with
reimar
parents: 4740
diff changeset
2185 if (i == 0 && time >= -1) {
0496cbd94374 Extend mov edit list support to work for a first padding entry with
reimar
parents: 4740
diff changeset
2186 sc->time_offset = time != -1 ? time : -duration;
4447
1fb8c4a56366 adjust time rate according to elst time offset
bcoudurier
parents: 4429
diff changeset
2187 }
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2188 }
4399
530e55405feb offset dts according to edit list, hackish but works, based on patch by Reimar
bcoudurier
parents: 4369
diff changeset
2189
530e55405feb offset dts according to edit list, hackish but works, based on patch by Reimar
bcoudurier
parents: 4369
diff changeset
2190 if(edit_count > 1)
530e55405feb offset dts according to edit list, hackish but works, based on patch by Reimar
bcoudurier
parents: 4369
diff changeset
2191 av_log(c->fc, AV_LOG_WARNING, "multiple edit list entries, "
530e55405feb offset dts according to edit list, hackish but works, based on patch by Reimar
bcoudurier
parents: 4369
diff changeset
2192 "a/v desync might occur, patch welcome\n");
530e55405feb offset dts according to edit list, hackish but works, based on patch by Reimar
bcoudurier
parents: 4369
diff changeset
2193
4429
7ed870203bfe fix compilation with DEBUG defined, field does not exist anymore
bcoudurier
parents: 4412
diff changeset
2194 dprintf(c->fc, "track[%i].edit_count = %i\n", c->fc->nb_streams-1, edit_count);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2195 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2196 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2197
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2198 static const MOVParseTableEntry mov_default_parse_table[] = {
3496
cdbf302a3c00 chinese avs demuxing support, demux AVSFileFormat.mp4
bcoudurier
parents: 3487
diff changeset
2199 { MKTAG('a','v','s','s'), mov_read_extradata },
5991
b65ecf9c2a26 mov: Read nero chapters
conrad
parents: 5982
diff changeset
2200 { MKTAG('c','h','p','l'), mov_read_chpl },
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2201 { MKTAG('c','o','6','4'), mov_read_stco },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2202 { MKTAG('c','t','t','s'), mov_read_ctts }, /* composition time to sample */
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2203 { MKTAG('d','i','n','f'), mov_read_default },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2204 { MKTAG('d','r','e','f'), mov_read_dref },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2205 { MKTAG('e','d','t','s'), mov_read_default },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2206 { MKTAG('e','l','s','t'), mov_read_elst },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2207 { MKTAG('e','n','d','a'), mov_read_enda },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2208 { MKTAG('f','i','e','l'), mov_read_extradata },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2209 { MKTAG('f','t','y','p'), mov_read_ftyp },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2210 { MKTAG('g','l','b','l'), mov_read_glbl },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2211 { MKTAG('h','d','l','r'), mov_read_hdlr },
4033
836e25632f0b read itunes metadata, code based on Reimar's patch
bcoudurier
parents: 4028
diff changeset
2212 { MKTAG('i','l','s','t'), mov_read_ilst },
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2213 { MKTAG('j','p','2','h'), mov_read_extradata },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2214 { MKTAG('m','d','a','t'), mov_read_mdat },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2215 { MKTAG('m','d','h','d'), mov_read_mdhd },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2216 { MKTAG('m','d','i','a'), mov_read_default },
4033
836e25632f0b read itunes metadata, code based on Reimar's patch
bcoudurier
parents: 4028
diff changeset
2217 { MKTAG('m','e','t','a'), mov_read_meta },
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2218 { MKTAG('m','i','n','f'), mov_read_default },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2219 { MKTAG('m','o','o','f'), mov_read_moof },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2220 { MKTAG('m','o','o','v'), mov_read_moov },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2221 { MKTAG('m','v','e','x'), mov_read_default },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2222 { MKTAG('m','v','h','d'), mov_read_mvhd },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2223 { MKTAG('S','M','I',' '), mov_read_smi }, /* Sorenson extension ??? */
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2224 { MKTAG('a','l','a','c'), mov_read_extradata }, /* alac specific atom */
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2225 { MKTAG('a','v','c','C'), mov_read_glbl },
4080
8ddf05b864a4 parse pasp atom and set sample aspect ratio,
bcoudurier
parents: 4079
diff changeset
2226 { MKTAG('p','a','s','p'), mov_read_pasp },
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2227 { MKTAG('s','t','b','l'), mov_read_default },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2228 { MKTAG('s','t','c','o'), mov_read_stco },
4933
fc6288f47467 parse 'stps' atom to set keyframe, partial sync sample for mpeg-2 open gop
bcoudurier
parents: 4931
diff changeset
2229 { MKTAG('s','t','p','s'), mov_read_stps },
5959
ed7556aaaea5 Parse strf mov atoms
mstorsjo
parents: 5913
diff changeset
2230 { MKTAG('s','t','r','f'), mov_read_strf },
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2231 { MKTAG('s','t','s','c'), mov_read_stsc },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2232 { MKTAG('s','t','s','d'), mov_read_stsd }, /* sample description */
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2233 { MKTAG('s','t','s','s'), mov_read_stss }, /* sync sample */
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2234 { MKTAG('s','t','s','z'), mov_read_stsz }, /* sample size */
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2235 { MKTAG('s','t','t','s'), mov_read_stts },
4739
436d42e64b52 MOV: Support stz2 "Compact Sample Size Box"
alexc
parents: 4731
diff changeset
2236 { MKTAG('s','t','z','2'), mov_read_stsz }, /* compact sample size */
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2237 { MKTAG('t','k','h','d'), mov_read_tkhd }, /* track header */
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2238 { MKTAG('t','f','h','d'), mov_read_tfhd }, /* track fragment header */
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2239 { MKTAG('t','r','a','k'), mov_read_trak },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2240 { MKTAG('t','r','a','f'), mov_read_default },
5975
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2241 { MKTAG('t','r','e','f'), mov_read_default },
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2242 { MKTAG('c','h','a','p'), mov_read_chap },
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2243 { MKTAG('t','r','e','x'), mov_read_trex },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2244 { MKTAG('t','r','u','n'), mov_read_trun },
4028
7d6ed3692203 simplify metadata reading
bcoudurier
parents: 3989
diff changeset
2245 { MKTAG('u','d','t','a'), mov_read_default },
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2246 { MKTAG('w','a','v','e'), mov_read_wave },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2247 { MKTAG('e','s','d','s'), mov_read_esds },
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2248 { MKTAG('w','i','d','e'), mov_read_wide }, /* place holder */
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2249 { MKTAG('c','m','o','v'), mov_read_cmov },
2826
24ad70087e67 useless 0L here
bcoudurier
parents: 2825
diff changeset
2250 { 0, NULL }
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2251 };
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2252
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2253 static int mov_probe(AVProbeData *p)
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2254 {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2255 unsigned int offset;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2256 uint32_t tag;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2257 int score = 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2258
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2259 /* check file header */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2260 offset = 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2261 for(;;) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2262 /* ignore invalid offset */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2263 if ((offset + 8) > (unsigned int)p->buf_size)
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2264 return score;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2265 tag = AV_RL32(p->buf + offset + 4);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2266 switch(tag) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2267 /* check for obvious tags */
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2268 case MKTAG('j','P',' ',' '): /* jpeg 2000 signature */
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2269 case MKTAG('m','o','o','v'):
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2270 case MKTAG('m','d','a','t'):
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2271 case MKTAG('p','n','o','t'): /* detect movs with preview pics like ew.mov and april.mov */
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2272 case MKTAG('u','d','t','a'): /* Packet Video PVAuthor adds this and a lot of more junk */
3587
7d5480d3989d Return max score when ftyp atom is encountered.
bcoudurier
parents: 3496
diff changeset
2273 case MKTAG('f','t','y','p'):
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2274 return AVPROBE_SCORE_MAX;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2275 /* those are more common words, so rate then a bit less */
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2276 case MKTAG('e','d','i','w'): /* xdcam files have reverted first tags */
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2277 case MKTAG('w','i','d','e'):
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2278 case MKTAG('f','r','e','e'):
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2279 case MKTAG('j','u','n','k'):
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2280 case MKTAG('p','i','c','t'):
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2281 return AVPROBE_SCORE_MAX - 5;
3588
f217917f4433 cosmetics, remove space
bcoudurier
parents: 3587
diff changeset
2282 case MKTAG(0x82,0x82,0x7f,0x7d):
3253
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2283 case MKTAG('s','k','i','p'):
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2284 case MKTAG('u','u','i','d'):
ab5585778359 cosmetics, remove whitespaces in tags
bcoudurier
parents: 3252
diff changeset
2285 case MKTAG('p','r','f','l'):
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2286 offset = AV_RB32(p->buf+offset) + offset;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2287 /* if we only find those cause probedata is too small at least rate them */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2288 score = AVPROBE_SCORE_MAX - 50;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2289 break;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2290 default:
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2291 /* unrecognized tag */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2292 return score;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2293 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2294 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2295 return score;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2296 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2297
5975
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2298 // must be done after parsing all trak because there's no order requirement
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2299 static void mov_read_chapters(AVFormatContext *s)
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2300 {
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2301 MOVContext *mov = s->priv_data;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2302 AVStream *st = NULL;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2303 MOVStreamContext *sc;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2304 int64_t cur_pos;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2305 uint8_t *title = NULL;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2306 int i, len, i8, i16;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2307
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2308 for (i = 0; i < s->nb_streams; i++)
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2309 if (s->streams[i]->id == mov->chapter_track) {
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2310 st = s->streams[i];
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2311 break;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2312 }
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2313 if (!st) {
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2314 av_log(s, AV_LOG_ERROR, "Referenced QT chapter track not found\n");
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2315 return;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2316 }
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2317
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2318 st->discard = AVDISCARD_ALL;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2319 sc = st->priv_data;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2320 cur_pos = url_ftell(sc->pb);
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2321
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2322 for (i = 0; i < st->nb_index_entries; i++) {
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2323 AVIndexEntry *sample = &st->index_entries[i];
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2324 int64_t end = i+1 < st->nb_index_entries ? st->index_entries[i+1].timestamp : st->duration;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2325
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2326 if (url_fseek(sc->pb, sample->pos, SEEK_SET) != sample->pos) {
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2327 av_log(s, AV_LOG_ERROR, "Chapter %d not found in file\n", i);
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2328 goto finish;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2329 }
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2330
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2331 title = av_malloc(sample->size+2);
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2332 get_buffer(sc->pb, title, sample->size);
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2333
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2334 // the first two bytes are the length of the title
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2335 len = AV_RB16(title);
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2336 if (len > sample->size-2)
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2337 continue;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2338
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2339 // The samples could theoretically be in any encoding if there's an encd
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2340 // atom following, but in practice are only utf-8 or utf-16, distinguished
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2341 // instead by the presence of a BOM
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2342 if (AV_RB16(title+2) == 0xfeff) {
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2343 uint8_t *utf8 = av_malloc(2*len+3);
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2344
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2345 i8 = i16 = 0;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2346 while (i16 < len) {
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2347 uint32_t ch;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2348 uint8_t tmp;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2349 GET_UTF16(ch, i16 < len ? AV_RB16(title + (i16+=2)) : 0, break;)
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2350 PUT_UTF8(ch, tmp, if (i8 < 2*len) utf8[2+i8++] = tmp;)
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2351 }
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2352 utf8[2+i8] = 0;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2353 av_freep(&title);
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2354 title = utf8;
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2355 }
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2356
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2357 ff_new_chapter(s, i, st->time_base, sample->timestamp, end, title+2);
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2358 av_freep(&title);
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2359 }
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2360 finish:
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2361 av_free(title);
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2362 url_fseek(sc->pb, cur_pos, SEEK_SET);
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2363 }
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2364
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2365 static int mov_read_header(AVFormatContext *s, AVFormatParameters *ap)
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2366 {
2006
2f0154760e5f Get rid of unnecessary pointer casts.
diego
parents: 2001
diff changeset
2367 MOVContext *mov = s->priv_data;
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2730
diff changeset
2368 ByteIOContext *pb = s->pb;
3155
e22efe21156d free track data asap
bcoudurier
parents: 3154
diff changeset
2369 int err;
6173
1b9079c05f9a Improve mov atom parsing debug message, print parent atom and size in decimal
bcoudurier
parents: 6040
diff changeset
2370 MOVAtom atom = { AV_RL32("root") };
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2371
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2372 mov->fc = s;
3167
125b08d2ad59 cosmetics, split or move too long lines
bcoudurier
parents: 3166
diff changeset
2373 /* .mov and .mp4 aren't streamable anyway (only progressive download if moov is before mdat) */
125b08d2ad59 cosmetics, split or move too long lines
bcoudurier
parents: 3166
diff changeset
2374 if(!url_is_streamed(pb))
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2375 atom.size = url_fsize(pb);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2376 else
2026
2e2c2dbb511d use INT64_MAX
bcoudurier
parents: 2023
diff changeset
2377 atom.size = INT64_MAX;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2378
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2379 /* check MOV header */
3204
bf14268f0f59 better error message
bcoudurier
parents: 3191
diff changeset
2380 if ((err = mov_read_default(mov, pb, atom)) < 0) {
bf14268f0f59 better error message
bcoudurier
parents: 3191
diff changeset
2381 av_log(s, AV_LOG_ERROR, "error reading header: %d\n", err);
bf14268f0f59 better error message
bcoudurier
parents: 3191
diff changeset
2382 return err;
bf14268f0f59 better error message
bcoudurier
parents: 3191
diff changeset
2383 }
bf14268f0f59 better error message
bcoudurier
parents: 3191
diff changeset
2384 if (!mov->found_moov) {
bf14268f0f59 better error message
bcoudurier
parents: 3191
diff changeset
2385 av_log(s, AV_LOG_ERROR, "moov atom not found\n");
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2386 return -1;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2387 }
3205
204a79a06c9b remove cast
bcoudurier
parents: 3204
diff changeset
2388 dprintf(mov->fc, "on_parse_exit_offset=%lld\n", url_ftell(pb));
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2389
5975
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2390 if (!url_is_streamed(pb) && mov->chapter_track > 0)
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2391 mov_read_chapters(s);
028ad8c9a6f6 mov: Read QuickTime chapters
conrad
parents: 5959
diff changeset
2392
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2393 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2394 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2395
5063
dcaea581e24d mov_read_packet: extract code that searches for the stream/sample to demux next
reimar
parents: 5062
diff changeset
2396 static AVIndexEntry *mov_find_next_sample(AVFormatContext *s, AVStream **st)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2397 {
5063
dcaea581e24d mov_read_packet: extract code that searches for the stream/sample to demux next
reimar
parents: 5062
diff changeset
2398 AVIndexEntry *sample = NULL;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2399 int64_t best_dts = INT64_MAX;
5063
dcaea581e24d mov_read_packet: extract code that searches for the stream/sample to demux next
reimar
parents: 5062
diff changeset
2400 int i;
2823
3f15b52fe817 remove duplicate field
bcoudurier
parents: 2822
diff changeset
2401 for (i = 0; i < s->nb_streams; i++) {
5061
5ff6a72c9686 In mov_read_packet remember the AVStream we want to demux next instead of the
reimar
parents: 5060
diff changeset
2402 AVStream *avst = s->streams[i];
5ff6a72c9686 In mov_read_packet remember the AVStream we want to demux next instead of the
reimar
parents: 5060
diff changeset
2403 MOVStreamContext *msc = avst->priv_data;
5064
1ed8004a3ef5 mov demuxer: Track the current position also for streams that have AVDISCARD_ALL set.
reimar
parents: 5063
diff changeset
2404 if (msc->pb && msc->current_sample < avst->nb_index_entries) {
5061
5ff6a72c9686 In mov_read_packet remember the AVStream we want to demux next instead of the
reimar
parents: 5060
diff changeset
2405 AVIndexEntry *current_sample = &avst->index_entries[msc->current_sample];
5015
7b260f4d453d Remove time_rate, we cannot compute exactly when fragments are
bcoudurier
parents: 5002
diff changeset
2406 int64_t dts = av_rescale(current_sample->timestamp, AV_TIME_BASE, msc->time_scale);
2030
4464239eddbb long -> int
bcoudurier
parents: 2029
diff changeset
2407 dprintf(s, "stream %d, sample %d, dts %"PRId64"\n", i, msc->current_sample, dts);
2817
b1b21255bbbb support streamed mov/mp4
bcoudurier
parents: 2814
diff changeset
2408 if (!sample || (url_is_streamed(s->pb) && current_sample->pos < sample->pos) ||
b1b21255bbbb support streamed mov/mp4
bcoudurier
parents: 2814
diff changeset
2409 (!url_is_streamed(s->pb) &&
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
2410 ((msc->pb != s->pb && dts < best_dts) || (msc->pb == s->pb &&
2817
b1b21255bbbb support streamed mov/mp4
bcoudurier
parents: 2814
diff changeset
2411 ((FFABS(best_dts - dts) <= AV_TIME_BASE && current_sample->pos < sample->pos) ||
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
2412 (FFABS(best_dts - dts) > AV_TIME_BASE && dts < best_dts)))))) {
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2413 sample = current_sample;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2414 best_dts = dts;
5063
dcaea581e24d mov_read_packet: extract code that searches for the stream/sample to demux next
reimar
parents: 5062
diff changeset
2415 *st = avst;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2416 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2417 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2418 }
5063
dcaea581e24d mov_read_packet: extract code that searches for the stream/sample to demux next
reimar
parents: 5062
diff changeset
2419 return sample;
dcaea581e24d mov_read_packet: extract code that searches for the stream/sample to demux next
reimar
parents: 5062
diff changeset
2420 }
dcaea581e24d mov_read_packet: extract code that searches for the stream/sample to demux next
reimar
parents: 5062
diff changeset
2421
dcaea581e24d mov_read_packet: extract code that searches for the stream/sample to demux next
reimar
parents: 5062
diff changeset
2422 static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
dcaea581e24d mov_read_packet: extract code that searches for the stream/sample to demux next
reimar
parents: 5062
diff changeset
2423 {
dcaea581e24d mov_read_packet: extract code that searches for the stream/sample to demux next
reimar
parents: 5062
diff changeset
2424 MOVContext *mov = s->priv_data;
dcaea581e24d mov_read_packet: extract code that searches for the stream/sample to demux next
reimar
parents: 5062
diff changeset
2425 MOVStreamContext *sc;
dcaea581e24d mov_read_packet: extract code that searches for the stream/sample to demux next
reimar
parents: 5062
diff changeset
2426 AVIndexEntry *sample;
dcaea581e24d mov_read_packet: extract code that searches for the stream/sample to demux next
reimar
parents: 5062
diff changeset
2427 AVStream *st = NULL;
dcaea581e24d mov_read_packet: extract code that searches for the stream/sample to demux next
reimar
parents: 5062
diff changeset
2428 int ret;
dcaea581e24d mov_read_packet: extract code that searches for the stream/sample to demux next
reimar
parents: 5062
diff changeset
2429 retry:
dcaea581e24d mov_read_packet: extract code that searches for the stream/sample to demux next
reimar
parents: 5062
diff changeset
2430 sample = mov_find_next_sample(s, &st);
3170
3c56f53f437b support fragments when non streamable
bcoudurier
parents: 3169
diff changeset
2431 if (!sample) {
3c56f53f437b support fragments when non streamable
bcoudurier
parents: 3169
diff changeset
2432 mov->found_mdat = 0;
3c56f53f437b support fragments when non streamable
bcoudurier
parents: 3169
diff changeset
2433 if (!url_is_streamed(s->pb) ||
6173
1b9079c05f9a Improve mov atom parsing debug message, print parent atom and size in decimal
bcoudurier
parents: 6040
diff changeset
2434 mov_read_default(mov, s->pb, (MOVAtom){ AV_RL32("root"), INT64_MAX }) < 0 ||
3170
3c56f53f437b support fragments when non streamable
bcoudurier
parents: 3169
diff changeset
2435 url_feof(s->pb))
4972
595e9bd313fd return AVERROR_EOF
bcoudurier
parents: 4942
diff changeset
2436 return AVERROR_EOF;
3170
3c56f53f437b support fragments when non streamable
bcoudurier
parents: 3169
diff changeset
2437 dprintf(s, "read fragments, offset 0x%llx\n", url_ftell(s->pb));
3c56f53f437b support fragments when non streamable
bcoudurier
parents: 3169
diff changeset
2438 goto retry;
3c56f53f437b support fragments when non streamable
bcoudurier
parents: 3169
diff changeset
2439 }
5061
5ff6a72c9686 In mov_read_packet remember the AVStream we want to demux next instead of the
reimar
parents: 5060
diff changeset
2440 sc = st->priv_data;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2441 /* must be done just before reading, to avoid infinite loop on sample */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2442 sc->current_sample++;
5064
1ed8004a3ef5 mov demuxer: Track the current position also for streams that have AVDISCARD_ALL set.
reimar
parents: 5063
diff changeset
2443
1ed8004a3ef5 mov demuxer: Track the current position also for streams that have AVDISCARD_ALL set.
reimar
parents: 5063
diff changeset
2444 if (st->discard != AVDISCARD_ALL) {
5065
4c7f6c2d0e0e Reindent after last patch.
reimar
parents: 5064
diff changeset
2445 if (url_fseek(sc->pb, sample->pos, SEEK_SET) != sample->pos) {
4c7f6c2d0e0e Reindent after last patch.
reimar
parents: 5064
diff changeset
2446 av_log(mov->fc, AV_LOG_ERROR, "stream %d, offset 0x%"PRIx64": partial file\n",
4c7f6c2d0e0e Reindent after last patch.
reimar
parents: 5064
diff changeset
2447 sc->ffindex, sample->pos);
4c7f6c2d0e0e Reindent after last patch.
reimar
parents: 5064
diff changeset
2448 return -1;
4c7f6c2d0e0e Reindent after last patch.
reimar
parents: 5064
diff changeset
2449 }
4c7f6c2d0e0e Reindent after last patch.
reimar
parents: 5064
diff changeset
2450 ret = av_get_packet(sc->pb, pkt, sample->size);
5062
8d81bf3822ac mov_read_packet: if dv_get_packet fails, return exactly its error value
reimar
parents: 5061
diff changeset
2451 if (ret < 0)
8d81bf3822ac mov_read_packet: if dv_get_packet fails, return exactly its error value
reimar
parents: 5061
diff changeset
2452 return ret;
5065
4c7f6c2d0e0e Reindent after last patch.
reimar
parents: 5064
diff changeset
2453 #if CONFIG_DV_DEMUXER
4c7f6c2d0e0e Reindent after last patch.
reimar
parents: 5064
diff changeset
2454 if (mov->dv_demux && sc->dv_audio_container) {
4c7f6c2d0e0e Reindent after last patch.
reimar
parents: 5064
diff changeset
2455 dv_produce_packet(mov->dv_demux, pkt, pkt->data, pkt->size);
4c7f6c2d0e0e Reindent after last patch.
reimar
parents: 5064
diff changeset
2456 av_free(pkt->data);
4c7f6c2d0e0e Reindent after last patch.
reimar
parents: 5064
diff changeset
2457 pkt->size = 0;
4c7f6c2d0e0e Reindent after last patch.
reimar
parents: 5064
diff changeset
2458 ret = dv_get_packet(mov->dv_demux, pkt);
4c7f6c2d0e0e Reindent after last patch.
reimar
parents: 5064
diff changeset
2459 if (ret < 0)
4c7f6c2d0e0e Reindent after last patch.
reimar
parents: 5064
diff changeset
2460 return ret;
4c7f6c2d0e0e Reindent after last patch.
reimar
parents: 5064
diff changeset
2461 }
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2462 #endif
5064
1ed8004a3ef5 mov demuxer: Track the current position also for streams that have AVDISCARD_ALL set.
reimar
parents: 5063
diff changeset
2463 }
1ed8004a3ef5 mov demuxer: Track the current position also for streams that have AVDISCARD_ALL set.
reimar
parents: 5063
diff changeset
2464
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2465 pkt->stream_index = sc->ffindex;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2466 pkt->dts = sample->timestamp;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2467 if (sc->ctts_data) {
5015
7b260f4d453d Remove time_rate, we cannot compute exactly when fragments are
bcoudurier
parents: 5002
diff changeset
2468 pkt->pts = pkt->dts + sc->dts_shift + sc->ctts_data[sc->ctts_index].duration;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2469 /* update ctts context */
4411
1564be9ce5cb cosmetics: sample_to_ctime -> ctts
bcoudurier
parents: 4410
diff changeset
2470 sc->ctts_sample++;
1564be9ce5cb cosmetics: sample_to_ctime -> ctts
bcoudurier
parents: 4410
diff changeset
2471 if (sc->ctts_index < sc->ctts_count &&
1564be9ce5cb cosmetics: sample_to_ctime -> ctts
bcoudurier
parents: 4410
diff changeset
2472 sc->ctts_data[sc->ctts_index].count == sc->ctts_sample) {
1564be9ce5cb cosmetics: sample_to_ctime -> ctts
bcoudurier
parents: 4410
diff changeset
2473 sc->ctts_index++;
1564be9ce5cb cosmetics: sample_to_ctime -> ctts
bcoudurier
parents: 4410
diff changeset
2474 sc->ctts_sample = 0;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2475 }
3956
8bdecea89071 support negative ctts in some way, unset wrong dts
bcoudurier
parents: 3935
diff changeset
2476 if (sc->wrong_dts)
8bdecea89071 support negative ctts in some way, unset wrong dts
bcoudurier
parents: 3935
diff changeset
2477 pkt->dts = AV_NOPTS_VALUE;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2478 } else {
4717
ee2dd1b3afc3 do not modify sample_count, check against index entries
bcoudurier
parents: 4690
diff changeset
2479 int64_t next_dts = (sc->current_sample < st->nb_index_entries) ?
3267
37e245554350 set pkt duration, only when dts == pts though,
bcoudurier
parents: 3265
diff changeset
2480 st->index_entries[sc->current_sample].timestamp : st->duration;
37e245554350 set pkt duration, only when dts == pts though,
bcoudurier
parents: 3265
diff changeset
2481 pkt->duration = next_dts - pkt->dts;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2482 pkt->pts = pkt->dts;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2483 }
5064
1ed8004a3ef5 mov demuxer: Track the current position also for streams that have AVDISCARD_ALL set.
reimar
parents: 5063
diff changeset
2484 if (st->discard == AVDISCARD_ALL)
1ed8004a3ef5 mov demuxer: Track the current position also for streams that have AVDISCARD_ALL set.
reimar
parents: 5063
diff changeset
2485 goto retry;
5913
11bb10c37225 Replace all occurences of PKT_FLAG_KEY with AV_PKT_FLAG_KEY.
cehoyos
parents: 5910
diff changeset
2486 pkt->flags |= sample->flags & AVINDEX_KEYFRAME ? AV_PKT_FLAG_KEY : 0;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2487 pkt->pos = sample->pos;
2902
cb12e3352bf5 cosmetics, split overly long lines
bcoudurier
parents: 2837
diff changeset
2488 dprintf(s, "stream %d, pts %"PRId64", dts %"PRId64", pos 0x%"PRIx64", duration %d\n",
cb12e3352bf5 cosmetics, split overly long lines
bcoudurier
parents: 2837
diff changeset
2489 pkt->stream_index, pkt->pts, pkt->dts, pkt->pos, pkt->duration);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2490 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2491 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2492
5371
a0846aa55f5e use AVFormatContext in dprintf
bcoudurier
parents: 5369
diff changeset
2493 static int mov_seek_stream(AVFormatContext *s, AVStream *st, int64_t timestamp, int flags)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2494 {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2495 MOVStreamContext *sc = st->priv_data;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2496 int sample, time_sample;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2497 int i;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2498
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2499 sample = av_index_search_timestamp(st, timestamp, flags);
5371
a0846aa55f5e use AVFormatContext in dprintf
bcoudurier
parents: 5369
diff changeset
2500 dprintf(s, "stream %d, timestamp %"PRId64", sample %d\n", st->index, timestamp, sample);
6213
525a4e7c0d30 In mov demuxer, fix seeking to the beginning when file has edit lists.
bcoudurier
parents: 6211
diff changeset
2501 if (sample < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
525a4e7c0d30 In mov demuxer, fix seeking to the beginning when file has edit lists.
bcoudurier
parents: 6211
diff changeset
2502 sample = 0;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2503 if (sample < 0) /* not sure what to do */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2504 return -1;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2505 sc->current_sample = sample;
5371
a0846aa55f5e use AVFormatContext in dprintf
bcoudurier
parents: 5369
diff changeset
2506 dprintf(s, "stream %d, found sample %d\n", st->index, sc->current_sample);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2507 /* adjust ctts index */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2508 if (sc->ctts_data) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2509 time_sample = 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2510 for (i = 0; i < sc->ctts_count; i++) {
2083
2c3887f02739 fix ctts index computation when seeking, check must be done against next ctts sample, thanks to Uoti
bcoudurier
parents: 2046
diff changeset
2511 int next = time_sample + sc->ctts_data[i].count;
2c3887f02739 fix ctts index computation when seeking, check must be done against next ctts sample, thanks to Uoti
bcoudurier
parents: 2046
diff changeset
2512 if (next > sc->current_sample) {
4411
1564be9ce5cb cosmetics: sample_to_ctime -> ctts
bcoudurier
parents: 4410
diff changeset
2513 sc->ctts_index = i;
1564be9ce5cb cosmetics: sample_to_ctime -> ctts
bcoudurier
parents: 4410
diff changeset
2514 sc->ctts_sample = sc->current_sample - time_sample;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2515 break;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2516 }
2083
2c3887f02739 fix ctts index computation when seeking, check must be done against next ctts sample, thanks to Uoti
bcoudurier
parents: 2046
diff changeset
2517 time_sample = next;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2518 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2519 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2520 return sample;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2521 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2522
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2523 static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags)
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2524 {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2525 AVStream *st;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2526 int64_t seek_timestamp, timestamp;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2527 int sample;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2528 int i;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2529
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2530 if (stream_index >= s->nb_streams)
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2531 return -1;
4290
571504a844b1 seek at 0 when timestamp requested is negative
bcoudurier
parents: 4269
diff changeset
2532 if (sample_time < 0)
571504a844b1 seek at 0 when timestamp requested is negative
bcoudurier
parents: 4269
diff changeset
2533 sample_time = 0;
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2534
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2535 st = s->streams[stream_index];
5371
a0846aa55f5e use AVFormatContext in dprintf
bcoudurier
parents: 5369
diff changeset
2536 sample = mov_seek_stream(s, st, sample_time, flags);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2537 if (sample < 0)
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2538 return -1;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2539
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2540 /* adjust seek timestamp to found sample timestamp */
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2541 seek_timestamp = st->index_entries[sample].timestamp;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2542
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2543 for (i = 0; i < s->nb_streams; i++) {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2544 st = s->streams[i];
5064
1ed8004a3ef5 mov demuxer: Track the current position also for streams that have AVDISCARD_ALL set.
reimar
parents: 5063
diff changeset
2545 if (stream_index == i)
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2546 continue;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2547
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2548 timestamp = av_rescale_q(seek_timestamp, s->streams[stream_index]->time_base, st->time_base);
5371
a0846aa55f5e use AVFormatContext in dprintf
bcoudurier
parents: 5369
diff changeset
2549 mov_seek_stream(s, st, timestamp, flags);
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2550 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2551 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2552 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2553
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2554 static int mov_read_close(AVFormatContext *s)
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2555 {
4718
7bf091a4b6d9 cosmetics, add some whitespaces and empty lines
bcoudurier
parents: 4717
diff changeset
2556 MOVContext *mov = s->priv_data;
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
2557 int i, j;
4718
7bf091a4b6d9 cosmetics, add some whitespaces and empty lines
bcoudurier
parents: 4717
diff changeset
2558
7bf091a4b6d9 cosmetics, add some whitespaces and empty lines
bcoudurier
parents: 4717
diff changeset
2559 for (i = 0; i < s->nb_streams; i++) {
4719
5dd75af88ade allocate palette in codec directly
bcoudurier
parents: 4718
diff changeset
2560 AVStream *st = s->streams[i];
5dd75af88ade allocate palette in codec directly
bcoudurier
parents: 4718
diff changeset
2561 MOVStreamContext *sc = st->priv_data;
4718
7bf091a4b6d9 cosmetics, add some whitespaces and empty lines
bcoudurier
parents: 4717
diff changeset
2562
2824
ecbfaa8712a1 do not retain useless pointers to avstream priv_data, use it directly
bcoudurier
parents: 2823
diff changeset
2563 av_freep(&sc->ctts_data);
5369
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
2564 for (j = 0; j < sc->drefs_count; j++) {
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
2565 av_freep(&sc->drefs[j].path);
5369
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
2566 av_freep(&sc->drefs[j].dir);
347123a18feb Search relative path according to alias record when opening mov reference files.
bcoudurier
parents: 5364
diff changeset
2567 }
3085
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
2568 av_freep(&sc->drefs);
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
2569 if (sc->pb && sc->pb != s->pb)
bae59276377f support mov reference files, ref.mov/ref.m2v/ref.wav and detect BrianCox.mov
bcoudurier
parents: 3084
diff changeset
2570 url_fclose(sc->pb);
4719
5dd75af88ade allocate palette in codec directly
bcoudurier
parents: 4718
diff changeset
2571
5dd75af88ade allocate palette in codec directly
bcoudurier
parents: 4718
diff changeset
2572 av_freep(&st->codec->palctrl);
2084
f5671ebda7cd simplify, no need for a function
bcoudurier
parents: 2083
diff changeset
2573 }
4718
7bf091a4b6d9 cosmetics, add some whitespaces and empty lines
bcoudurier
parents: 4717
diff changeset
2574
7bf091a4b6d9 cosmetics, add some whitespaces and empty lines
bcoudurier
parents: 4717
diff changeset
2575 if (mov->dv_demux) {
7bf091a4b6d9 cosmetics, add some whitespaces and empty lines
bcoudurier
parents: 4717
diff changeset
2576 for(i = 0; i < mov->dv_fctx->nb_streams; i++) {
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2577 av_freep(&mov->dv_fctx->streams[i]->codec);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2578 av_freep(&mov->dv_fctx->streams[i]);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2579 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2580 av_freep(&mov->dv_fctx);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2581 av_freep(&mov->dv_demux);
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2582 }
4718
7bf091a4b6d9 cosmetics, add some whitespaces and empty lines
bcoudurier
parents: 4717
diff changeset
2583
3169
8ae50c221ae6 mp4 fragments support
bcoudurier
parents: 3167
diff changeset
2584 av_freep(&mov->trex_data);
4718
7bf091a4b6d9 cosmetics, add some whitespaces and empty lines
bcoudurier
parents: 4717
diff changeset
2585
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2586 return 0;
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2587 }
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2588
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2589 AVInputFormat mov_demuxer = {
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2590 "mov,mp4,m4a,3gp,3g2,mj2",
3424
7a0230981402 Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents: 3362
diff changeset
2591 NULL_IF_CONFIG_SMALL("QuickTime/MPEG-4/Motion JPEG 2000 format"),
1845
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2592 sizeof(MOVContext),
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2593 mov_probe,
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2594 mov_read_header,
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2595 mov_read_packet,
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2596 mov_read_close,
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2597 mov_read_seek,
4c4825b91451 functional part of the commit below
michael
parents:
diff changeset
2598 };