annotate mov.c @ 5910:536e5527c1e0 libavformat

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