annotate mov.c @ 6193:da9998b48dff libavformat

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