3 * Copyright (c) 2001 Fabrice Bellard
4 * Copyright (c) 2009 Baptiste Coudurier <baptiste dot coudurier at gmail dot com>
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 #include "libavutil/intreadwrite.h"
28 #include "libavutil/avstring.h"
32 #include "libavcodec/mpeg4audio.h"
33 #include "libavcodec/mpegaudiodata.h"
40 * First version by Francois Revol revol@free.fr
41 * Seek function by Gael Chardon gael.dev@4now.net
43 * Features and limitations:
44 * - reads most of the QT files I have (at least the structure),
45 * Sample QuickTime files with mp3 audio can be found at: http://www.3ivx.com/showcase.html
46 * - the code is quite ugly... maybe I won't do it recursive next time :-)
48 * Funny I didn't know about http://sourceforge.net/projects/qt-ffmpeg/
49 * when coding this :) (it's a writer anyway)
51 * Reference documents:
52 * http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt
54 * http://developer.apple.com/documentation/QuickTime/QTFF/
55 * http://developer.apple.com/documentation/QuickTime/QTFF/qtff.pdf
56 * QuickTime is a trademark of Apple (AFAIK :))
59 #include "qtpalette.h"
65 /* XXX: it's the first time I make a recursive parser I think... sorry if it's ugly :P */
67 /* those functions parse an atom */
69 0: continue to parse next atom
70 <0: error occurred, exit
72 /* links atom IDs to parse functions */
73 typedef struct MOVParseTableEntry
{
75 int (*parse
)(MOVContext
*ctx
, ByteIOContext
*pb
, MOVAtom atom
);
78 static const MOVParseTableEntry mov_default_parse_table
[];
80 static int mov_read_default(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
82 int64_t total_size
= 0;
87 a
.offset
= atom
.offset
;
90 atom
.size
= INT64_MAX
;
91 while(((total_size
+ 8) < atom
.size
) && !url_feof(pb
) && !err
) {
95 a
.size
= get_be32(pb
);
96 a
.type
= get_le32(pb
);
100 dprintf(c
->fc
, "type: %08x %.4s sz: %"PRIx64
" %"PRIx64
" %"PRIx64
"\n",
101 a
.type
, (char*)&a
.type
, a
.size
, atom
.size
, total_size
);
102 if (a
.size
== 1) { /* 64 bit extended size */
103 a
.size
= get_be64(pb
) - 8;
108 a
.size
= atom
.size
- total_size
;
115 a
.size
= FFMIN(a
.size
, atom
.size
- total_size
);
117 for (i
= 0; mov_default_parse_table
[i
].type
!= 0
118 && mov_default_parse_table
[i
].type
!= a
.type
; i
++)
121 if (mov_default_parse_table
[i
].type
== 0) { /* skip leaf atoms data */
122 url_fskip(pb
, a
.size
);
124 int64_t start_pos
= url_ftell(pb
);
126 err
= mov_default_parse_table
[i
].parse(c
, pb
, a
);
127 if (url_is_streamed(pb
) && c
->found_moov
&& c
->found_mdat
)
129 left
= a
.size
- url_ftell(pb
) + start_pos
;
130 if (left
> 0) /* skip garbage at atom end */
135 total_size
+= a
.size
;
138 if (!err
&& total_size
< atom
.size
&& atom
.size
< 0x7ffff)
139 url_fskip(pb
, atom
.size
- total_size
);
144 static int mov_read_dref(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
146 AVStream
*st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
147 MOVStreamContext
*sc
= st
->priv_data
;
150 get_be32(pb
); // version + flags
151 entries
= get_be32(pb
);
152 if (entries
>= UINT_MAX
/ sizeof(*sc
->drefs
))
154 sc
->drefs
= av_mallocz(entries
* sizeof(*sc
->drefs
));
156 return AVERROR(ENOMEM
);
157 sc
->drefs_count
= entries
;
159 for (i
= 0; i
< sc
->drefs_count
; i
++) {
160 MOVDref
*dref
= &sc
->drefs
[i
];
161 uint32_t size
= get_be32(pb
);
162 int64_t next
= url_ftell(pb
) + size
- 4;
164 dref
->type
= get_le32(pb
);
165 get_be32(pb
); // version + flags
166 dprintf(c
->fc
, "type %.4s size %d\n", (char*)&dref
->type
, size
);
168 if (dref
->type
== MKTAG('a','l','i','s') && size
> 150) {
169 /* macintosh alias record */
170 uint16_t volume_len
, len
;
176 volume_len
= get_byte(pb
);
177 volume_len
= FFMIN(volume_len
, 27);
178 get_buffer(pb
, volume
, 27);
179 volume
[volume_len
] = 0;
180 av_log(c
->fc
, AV_LOG_DEBUG
, "volume %s, len %d\n", volume
, volume_len
);
184 for (type
= 0; type
!= -1 && url_ftell(pb
) < next
; ) {
187 av_log(c
->fc
, AV_LOG_DEBUG
, "type %d, len %d\n", type
, len
);
190 if (type
== 2) { // absolute path
192 dref
->path
= av_mallocz(len
+1);
194 return AVERROR(ENOMEM
);
195 get_buffer(pb
, dref
->path
, len
);
196 if (len
> volume_len
&& !strncmp(dref
->path
, volume
, volume_len
)) {
198 memmove(dref
->path
, dref
->path
+volume_len
, len
);
201 for (j
= 0; j
< len
; j
++)
202 if (dref
->path
[j
] == ':')
204 av_log(c
->fc
, AV_LOG_DEBUG
, "path %s\n", dref
->path
);
209 url_fseek(pb
, next
, SEEK_SET
);
214 static int mov_read_hdlr(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
220 if (c
->fc
->nb_streams
< 1) // meta before first trak
223 st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
225 get_byte(pb
); /* version */
226 get_be24(pb
); /* flags */
229 ctype
= get_le32(pb
);
230 type
= get_le32(pb
); /* component subtype */
232 dprintf(c
->fc
, "ctype= %c%c%c%c (0x%08x)\n", *((char *)&ctype
), ((char *)&ctype
)[1],
233 ((char *)&ctype
)[2], ((char *)&ctype
)[3], (int) ctype
);
234 dprintf(c
->fc
, "stype= %c%c%c%c\n",
235 *((char *)&type
), ((char *)&type
)[1], ((char *)&type
)[2], ((char *)&type
)[3]);
238 if (type
== MKTAG('v','i','d','e'))
239 st
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
240 else if(type
== MKTAG('s','o','u','n'))
241 st
->codec
->codec_type
= CODEC_TYPE_AUDIO
;
242 else if(type
== MKTAG('m','1','a',' '))
243 st
->codec
->codec_id
= CODEC_ID_MP2
;
244 else if(type
== MKTAG('s','u','b','p')) {
245 st
->codec
->codec_type
= CODEC_TYPE_SUBTITLE
;
247 get_be32(pb
); /* component manufacture */
248 get_be32(pb
); /* component flags */
249 get_be32(pb
); /* component flags mask */
252 return 0; /* nothing left to read */
254 url_fskip(pb
, atom
.size
- (url_ftell(pb
) - atom
.offset
));
258 static int mp4_read_descr_len(ByteIOContext
*pb
)
263 int c
= get_byte(pb
);
264 len
= (len
<< 7) | (c
& 0x7f);
271 static int mp4_read_descr(MOVContext
*c
, ByteIOContext
*pb
, int *tag
)
275 len
= mp4_read_descr_len(pb
);
276 dprintf(c
->fc
, "MPEG4 description: tag=0x%02x len=%d\n", *tag
, len
);
280 #define MP4ESDescrTag 0x03
281 #define MP4DecConfigDescrTag 0x04
282 #define MP4DecSpecificDescrTag 0x05
284 static const AVCodecTag mp4_audio_types
[] = {
285 { CODEC_ID_MP3ON4
, 29 }, /* old mp3on4 draft */
286 { CODEC_ID_MP3ON4
, 32 }, /* layer 1 */
287 { CODEC_ID_MP3ON4
, 33 }, /* layer 2 */
288 { CODEC_ID_MP3ON4
, 34 }, /* layer 3 */
289 { CODEC_ID_NONE
, 0 },
292 static int mov_read_esds(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
294 AVStream
*st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
297 get_be32(pb
); /* version + flags */
298 len
= mp4_read_descr(c
, pb
, &tag
);
299 if (tag
== MP4ESDescrTag
) {
300 get_be16(pb
); /* ID */
301 get_byte(pb
); /* priority */
303 get_be16(pb
); /* ID */
305 len
= mp4_read_descr(c
, pb
, &tag
);
306 if (tag
== MP4DecConfigDescrTag
) {
307 int object_type_id
= get_byte(pb
);
308 get_byte(pb
); /* stream type */
309 get_be24(pb
); /* buffer size db */
310 get_be32(pb
); /* max bitrate */
311 get_be32(pb
); /* avg bitrate */
313 st
->codec
->codec_id
= codec_get_id(ff_mp4_obj_type
, object_type_id
);
314 dprintf(c
->fc
, "esds object type id %d\n", object_type_id
);
315 len
= mp4_read_descr(c
, pb
, &tag
);
316 if (tag
== MP4DecSpecificDescrTag
) {
317 dprintf(c
->fc
, "Specific MPEG4 header len=%d\n", len
);
318 if((uint64_t)len
> (1<<30))
320 st
->codec
->extradata
= av_mallocz(len
+ FF_INPUT_BUFFER_PADDING_SIZE
);
321 if (!st
->codec
->extradata
)
322 return AVERROR(ENOMEM
);
323 get_buffer(pb
, st
->codec
->extradata
, len
);
324 st
->codec
->extradata_size
= len
;
325 if (st
->codec
->codec_id
== CODEC_ID_AAC
) {
326 MPEG4AudioConfig cfg
;
327 ff_mpeg4audio_get_config(&cfg
, st
->codec
->extradata
,
328 st
->codec
->extradata_size
);
329 if (cfg
.chan_config
> 7)
331 st
->codec
->channels
= ff_mpeg4audio_channels
[cfg
.chan_config
];
332 if (cfg
.object_type
== 29 && cfg
.sampling_index
< 3) // old mp3on4
333 st
->codec
->sample_rate
= ff_mpa_freq_tab
[cfg
.sampling_index
];
335 st
->codec
->sample_rate
= cfg
.sample_rate
; // ext sample rate ?
336 dprintf(c
->fc
, "mp4a config channels %d obj %d ext obj %d "
337 "sample rate %d ext sample rate %d\n", st
->codec
->channels
,
338 cfg
.object_type
, cfg
.ext_object_type
,
339 cfg
.sample_rate
, cfg
.ext_sample_rate
);
340 if (!(st
->codec
->codec_id
= codec_get_id(mp4_audio_types
,
342 st
->codec
->codec_id
= CODEC_ID_AAC
;
349 static int mov_read_pasp(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
351 const int num
= get_be32(pb
);
352 const int den
= get_be32(pb
);
353 AVStream
* const st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
355 if ((st
->sample_aspect_ratio
.den
!= 1 || st
->sample_aspect_ratio
.num
) && // default
356 (den
!= st
->sample_aspect_ratio
.den
|| num
!= st
->sample_aspect_ratio
.num
))
357 av_log(c
->fc
, AV_LOG_WARNING
,
358 "sample aspect ratio already set to %d:%d, overriding by 'pasp' atom\n",
359 st
->sample_aspect_ratio
.num
, st
->sample_aspect_ratio
.den
);
360 st
->sample_aspect_ratio
.num
= num
;
361 st
->sample_aspect_ratio
.den
= den
;
366 /* this atom contains actual media data */
367 static int mov_read_mdat(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
369 if(atom
.size
== 0) /* wrong one (MP4) */
372 return 0; /* now go for moov */
375 static int mov_read_ftyp(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
377 uint32_t type
= get_le32(pb
);
379 if (type
!= MKTAG('q','t',' ',' '))
381 av_log(c
->fc
, AV_LOG_DEBUG
, "ISO: File Type Major Brand: %.4s\n",(char *)&type
);
382 get_be32(pb
); /* minor version */
383 url_fskip(pb
, atom
.size
- 8);
387 /* this atom should contain all header atoms */
388 static int mov_read_moov(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
390 if (mov_read_default(c
, pb
, atom
) < 0)
392 /* we parsed the 'moov' atom, we can terminate the parsing as soon as we find the 'mdat' */
393 /* so we don't parse the whole file if over a network */
395 return 0; /* now go for mdat */
398 static int mov_read_moof(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
400 c
->fragment
.moof_offset
= url_ftell(pb
) - 8;
401 dprintf(c
->fc
, "moof offset %llx\n", c
->fragment
.moof_offset
);
402 return mov_read_default(c
, pb
, atom
);
405 static int mov_read_mdhd(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
407 AVStream
*st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
408 MOVStreamContext
*sc
= st
->priv_data
;
409 int version
= get_byte(pb
);
410 char language
[4] = {0};
414 return -1; /* unsupported */
416 get_be24(pb
); /* flags */
421 get_be32(pb
); /* creation time */
422 get_be32(pb
); /* modification time */
425 sc
->time_scale
= get_be32(pb
);
426 st
->duration
= (version
== 1) ? get_be64(pb
) : get_be32(pb
); /* duration */
428 lang
= get_be16(pb
); /* language */
429 if (ff_mov_lang_to_iso639(lang
, language
))
430 av_metadata_set(&st
->metadata
, "language", language
);
431 get_be16(pb
); /* quality */
436 static int mov_read_mvhd(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
438 int version
= get_byte(pb
); /* version */
439 get_be24(pb
); /* flags */
445 get_be32(pb
); /* creation time */
446 get_be32(pb
); /* modification time */
448 c
->time_scale
= get_be32(pb
); /* time scale */
450 dprintf(c
->fc
, "time scale = %i\n", c
->time_scale
);
452 c
->duration
= (version
== 1) ? get_be64(pb
) : get_be32(pb
); /* duration */
453 get_be32(pb
); /* preferred scale */
455 get_be16(pb
); /* preferred volume */
457 url_fskip(pb
, 10); /* reserved */
459 url_fskip(pb
, 36); /* display matrix */
461 get_be32(pb
); /* preview time */
462 get_be32(pb
); /* preview duration */
463 get_be32(pb
); /* poster time */
464 get_be32(pb
); /* selection time */
465 get_be32(pb
); /* selection duration */
466 get_be32(pb
); /* current time */
467 get_be32(pb
); /* next track ID */
472 static int mov_read_smi(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
474 AVStream
*st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
476 if((uint64_t)atom
.size
> (1<<30))
479 // currently SVQ3 decoder expect full STSD header - so let's fake it
480 // this should be fixed and just SMI header should be passed
481 av_free(st
->codec
->extradata
);
482 st
->codec
->extradata
= av_mallocz(atom
.size
+ 0x5a + FF_INPUT_BUFFER_PADDING_SIZE
);
483 if (!st
->codec
->extradata
)
484 return AVERROR(ENOMEM
);
485 st
->codec
->extradata_size
= 0x5a + atom
.size
;
486 memcpy(st
->codec
->extradata
, "SVQ3", 4); // fake
487 get_buffer(pb
, st
->codec
->extradata
+ 0x5a, atom
.size
);
488 dprintf(c
->fc
, "Reading SMI %"PRId64
" %s\n", atom
.size
, st
->codec
->extradata
+ 0x5a);
492 static int mov_read_enda(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
494 AVStream
*st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
495 int little_endian
= get_be16(pb
);
497 dprintf(c
->fc
, "enda %d\n", little_endian
);
498 if (little_endian
== 1) {
499 switch (st
->codec
->codec_id
) {
500 case CODEC_ID_PCM_S24BE
:
501 st
->codec
->codec_id
= CODEC_ID_PCM_S24LE
;
503 case CODEC_ID_PCM_S32BE
:
504 st
->codec
->codec_id
= CODEC_ID_PCM_S32LE
;
506 case CODEC_ID_PCM_F32BE
:
507 st
->codec
->codec_id
= CODEC_ID_PCM_F32LE
;
509 case CODEC_ID_PCM_F64BE
:
510 st
->codec
->codec_id
= CODEC_ID_PCM_F64LE
;
519 /* FIXME modify qdm2/svq3/h264 decoders to take full atom as extradata */
520 static int mov_read_extradata(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
526 if (c
->fc
->nb_streams
< 1) // will happen with jp2 files
528 st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
529 size
= (uint64_t)st
->codec
->extradata_size
+ atom
.size
+ 8 + FF_INPUT_BUFFER_PADDING_SIZE
;
530 if(size
> INT_MAX
|| (uint64_t)atom
.size
> INT_MAX
)
532 buf
= av_realloc(st
->codec
->extradata
, size
);
535 st
->codec
->extradata
= buf
;
536 buf
+= st
->codec
->extradata_size
;
537 st
->codec
->extradata_size
= size
- FF_INPUT_BUFFER_PADDING_SIZE
;
538 AV_WB32( buf
, atom
.size
+ 8);
539 AV_WL32( buf
+ 4, atom
.type
);
540 get_buffer(pb
, buf
+ 8, atom
.size
);
544 static int mov_read_wave(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
546 AVStream
*st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
548 if((uint64_t)atom
.size
> (1<<30))
551 if (st
->codec
->codec_id
== CODEC_ID_QDM2
) {
552 // pass all frma atom to codec, needed at least for QDM2
553 av_free(st
->codec
->extradata
);
554 st
->codec
->extradata
= av_mallocz(atom
.size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
555 if (!st
->codec
->extradata
)
556 return AVERROR(ENOMEM
);
557 st
->codec
->extradata_size
= atom
.size
;
558 get_buffer(pb
, st
->codec
->extradata
, atom
.size
);
559 } else if (atom
.size
> 8) { /* to read frma, esds atoms */
560 if (mov_read_default(c
, pb
, atom
) < 0)
563 url_fskip(pb
, atom
.size
);
568 * This function reads atom content and puts data in extradata without tag
569 * nor size unlike mov_read_extradata.
571 static int mov_read_glbl(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
573 AVStream
*st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
575 if((uint64_t)atom
.size
> (1<<30))
578 av_free(st
->codec
->extradata
);
579 st
->codec
->extradata
= av_mallocz(atom
.size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
580 if (!st
->codec
->extradata
)
581 return AVERROR(ENOMEM
);
582 st
->codec
->extradata_size
= atom
.size
;
583 get_buffer(pb
, st
->codec
->extradata
, atom
.size
);
587 static int mov_read_stco(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
589 AVStream
*st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
590 MOVStreamContext
*sc
= st
->priv_data
;
591 unsigned int i
, entries
;
593 get_byte(pb
); /* version */
594 get_be24(pb
); /* flags */
596 entries
= get_be32(pb
);
598 if(entries
>= UINT_MAX
/sizeof(int64_t))
601 sc
->chunk_offsets
= av_malloc(entries
* sizeof(int64_t));
602 if (!sc
->chunk_offsets
)
603 return AVERROR(ENOMEM
);
604 sc
->chunk_count
= entries
;
606 if (atom
.type
== MKTAG('s','t','c','o'))
607 for(i
=0; i
<entries
; i
++)
608 sc
->chunk_offsets
[i
] = get_be32(pb
);
609 else if (atom
.type
== MKTAG('c','o','6','4'))
610 for(i
=0; i
<entries
; i
++)
611 sc
->chunk_offsets
[i
] = get_be64(pb
);
619 * Compute codec id for 'lpcm' tag.
620 * See CoreAudioTypes and AudioStreamBasicDescription at Apple.
622 static enum CodecID
mov_get_lpcm_codec_id(int bps
, int flags
)
624 if (flags
& 1) { // floating point
625 if (flags
& 2) { // big endian
626 if (bps
== 32) return CODEC_ID_PCM_F32BE
;
627 else if (bps
== 64) return CODEC_ID_PCM_F64BE
;
629 if (bps
== 32) return CODEC_ID_PCM_F32LE
;
630 else if (bps
== 64) return CODEC_ID_PCM_F64LE
;
636 if (flags
& 4) return CODEC_ID_PCM_S8
;
637 else return CODEC_ID_PCM_U8
;
638 else if (bps
== 16) return CODEC_ID_PCM_S16BE
;
639 else if (bps
== 24) return CODEC_ID_PCM_S24BE
;
640 else if (bps
== 32) return CODEC_ID_PCM_S32BE
;
643 if (flags
& 4) return CODEC_ID_PCM_S8
;
644 else return CODEC_ID_PCM_U8
;
645 else if (bps
== 16) return CODEC_ID_PCM_S16LE
;
646 else if (bps
== 24) return CODEC_ID_PCM_S24LE
;
647 else if (bps
== 32) return CODEC_ID_PCM_S32LE
;
650 return CODEC_ID_NONE
;
653 static int mov_read_stsd(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
655 AVStream
*st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
656 MOVStreamContext
*sc
= st
->priv_data
;
657 int j
, entries
, pseudo_stream_id
;
659 get_byte(pb
); /* version */
660 get_be24(pb
); /* flags */
662 entries
= get_be32(pb
);
664 for(pseudo_stream_id
=0; pseudo_stream_id
<entries
; pseudo_stream_id
++) {
665 //Parsing Sample description table
668 MOVAtom a
= { 0, 0, 0 };
669 int64_t start_pos
= url_ftell(pb
);
670 int size
= get_be32(pb
); /* size */
671 uint32_t format
= get_le32(pb
); /* data format */
673 get_be32(pb
); /* reserved */
674 get_be16(pb
); /* reserved */
675 dref_id
= get_be16(pb
);
677 if (st
->codec
->codec_tag
&&
678 st
->codec
->codec_tag
!= format
&&
679 (c
->fc
->video_codec_id
? codec_get_id(codec_movvideo_tags
, format
) != c
->fc
->video_codec_id
680 : st
->codec
->codec_tag
!= MKTAG('j','p','e','g'))
682 /* Multiple fourcc, we skip JPEG. This is not correct, we should
683 * export it as a separate AVStream but this needs a few changes
684 * in the MOV demuxer, patch welcome. */
685 av_log(c
->fc
, AV_LOG_WARNING
, "multiple fourcc not supported\n");
686 url_fskip(pb
, size
- (url_ftell(pb
) - start_pos
));
689 sc
->pseudo_stream_id
= st
->codec
->codec_tag
? -1 : pseudo_stream_id
;
690 sc
->dref_id
= dref_id
;
692 st
->codec
->codec_tag
= format
;
693 id
= codec_get_id(codec_movaudio_tags
, format
);
694 if (id
<=0 && (format
&0xFFFF) == 'm'+('s'<<8))
695 id
= codec_get_id(codec_wav_tags
, bswap_32(format
)&0xFFFF);
697 if (st
->codec
->codec_type
!= CODEC_TYPE_VIDEO
&& id
> 0) {
698 st
->codec
->codec_type
= CODEC_TYPE_AUDIO
;
699 } else if (st
->codec
->codec_type
!= CODEC_TYPE_AUDIO
&& /* do not overwrite codec type */
700 format
&& format
!= MKTAG('m','p','4','s')) { /* skip old asf mpeg4 tag */
701 id
= codec_get_id(codec_movvideo_tags
, format
);
703 id
= codec_get_id(codec_bmp_tags
, format
);
705 st
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
706 else if(st
->codec
->codec_type
== CODEC_TYPE_DATA
){
707 id
= codec_get_id(ff_codec_movsubtitle_tags
, format
);
709 st
->codec
->codec_type
= CODEC_TYPE_SUBTITLE
;
713 dprintf(c
->fc
, "size=%d 4CC= %c%c%c%c codec_type=%d\n", size
,
714 (format
>> 0) & 0xff, (format
>> 8) & 0xff, (format
>> 16) & 0xff,
715 (format
>> 24) & 0xff, st
->codec
->codec_type
);
717 if(st
->codec
->codec_type
==CODEC_TYPE_VIDEO
) {
718 uint8_t codec_name
[32];
719 unsigned int color_depth
;
722 st
->codec
->codec_id
= id
;
723 get_be16(pb
); /* version */
724 get_be16(pb
); /* revision level */
725 get_be32(pb
); /* vendor */
726 get_be32(pb
); /* temporal quality */
727 get_be32(pb
); /* spatial quality */
729 st
->codec
->width
= get_be16(pb
); /* width */
730 st
->codec
->height
= get_be16(pb
); /* height */
732 get_be32(pb
); /* horiz resolution */
733 get_be32(pb
); /* vert resolution */
734 get_be32(pb
); /* data size, always 0 */
735 get_be16(pb
); /* frames per samples */
737 get_buffer(pb
, codec_name
, 32); /* codec name, pascal string */
738 if (codec_name
[0] <= 31) {
739 memcpy(st
->codec
->codec_name
, &codec_name
[1],codec_name
[0]);
740 st
->codec
->codec_name
[codec_name
[0]] = 0;
743 st
->codec
->bits_per_coded_sample
= get_be16(pb
); /* depth */
744 st
->codec
->color_table_id
= get_be16(pb
); /* colortable id */
745 dprintf(c
->fc
, "depth %d, ctab id %d\n",
746 st
->codec
->bits_per_coded_sample
, st
->codec
->color_table_id
);
747 /* figure out the palette situation */
748 color_depth
= st
->codec
->bits_per_coded_sample
& 0x1F;
749 color_greyscale
= st
->codec
->bits_per_coded_sample
& 0x20;
751 /* if the depth is 2, 4, or 8 bpp, file is palettized */
752 if ((color_depth
== 2) || (color_depth
== 4) ||
753 (color_depth
== 8)) {
754 /* for palette traversal */
755 unsigned int color_start
, color_count
, color_end
;
756 unsigned char r
, g
, b
;
758 st
->codec
->palctrl
= av_malloc(sizeof(*st
->codec
->palctrl
));
759 if (color_greyscale
) {
760 int color_index
, color_dec
;
761 /* compute the greyscale palette */
762 st
->codec
->bits_per_coded_sample
= color_depth
;
763 color_count
= 1 << color_depth
;
765 color_dec
= 256 / (color_count
- 1);
766 for (j
= 0; j
< color_count
; j
++) {
767 r
= g
= b
= color_index
;
768 st
->codec
->palctrl
->palette
[j
] =
769 (r
<< 16) | (g
<< 8) | (b
);
770 color_index
-= color_dec
;
774 } else if (st
->codec
->color_table_id
) {
775 const uint8_t *color_table
;
776 /* if flag bit 3 is set, use the default palette */
777 color_count
= 1 << color_depth
;
778 if (color_depth
== 2)
779 color_table
= ff_qt_default_palette_4
;
780 else if (color_depth
== 4)
781 color_table
= ff_qt_default_palette_16
;
783 color_table
= ff_qt_default_palette_256
;
785 for (j
= 0; j
< color_count
; j
++) {
786 r
= color_table
[j
* 4 + 0];
787 g
= color_table
[j
* 4 + 1];
788 b
= color_table
[j
* 4 + 2];
789 st
->codec
->palctrl
->palette
[j
] =
790 (r
<< 16) | (g
<< 8) | (b
);
793 /* load the palette from the file */
794 color_start
= get_be32(pb
);
795 color_count
= get_be16(pb
);
796 color_end
= get_be16(pb
);
797 if ((color_start
<= 255) &&
798 (color_end
<= 255)) {
799 for (j
= color_start
; j
<= color_end
; j
++) {
800 /* each R, G, or B component is 16 bits;
801 * only use the top 8 bits; skip alpha bytes
811 st
->codec
->palctrl
->palette
[j
] =
812 (r
<< 16) | (g
<< 8) | (b
);
816 st
->codec
->palctrl
->palette_changed
= 1;
818 } else if(st
->codec
->codec_type
==CODEC_TYPE_AUDIO
) {
819 int bits_per_sample
, flags
;
820 uint16_t version
= get_be16(pb
);
822 st
->codec
->codec_id
= id
;
823 get_be16(pb
); /* revision level */
824 get_be32(pb
); /* vendor */
826 st
->codec
->channels
= get_be16(pb
); /* channel count */
827 dprintf(c
->fc
, "audio channels %d\n", st
->codec
->channels
);
828 st
->codec
->bits_per_coded_sample
= get_be16(pb
); /* sample size */
830 sc
->audio_cid
= get_be16(pb
);
831 get_be16(pb
); /* packet size = 0 */
833 st
->codec
->sample_rate
= ((get_be32(pb
) >> 16));
835 //Read QT version 1 fields. In version 0 these do not exist.
836 dprintf(c
->fc
, "version =%d, isom =%d\n",version
,c
->isom
);
839 sc
->samples_per_frame
= get_be32(pb
);
840 get_be32(pb
); /* bytes per packet */
841 sc
->bytes_per_frame
= get_be32(pb
);
842 get_be32(pb
); /* bytes per sample */
843 } else if(version
==2) {
844 get_be32(pb
); /* sizeof struct only */
845 st
->codec
->sample_rate
= av_int2dbl(get_be64(pb
)); /* float 64 */
846 st
->codec
->channels
= get_be32(pb
);
847 get_be32(pb
); /* always 0x7F000000 */
848 st
->codec
->bits_per_coded_sample
= get_be32(pb
); /* bits per channel if sound is uncompressed */
849 flags
= get_be32(pb
); /* lcpm format specific flag */
850 sc
->bytes_per_frame
= get_be32(pb
); /* bytes per audio packet if constant */
851 sc
->samples_per_frame
= get_be32(pb
); /* lpcm frames per audio packet if constant */
852 if (format
== MKTAG('l','p','c','m'))
853 st
->codec
->codec_id
= mov_get_lpcm_codec_id(st
->codec
->bits_per_coded_sample
, flags
);
857 switch (st
->codec
->codec_id
) {
858 case CODEC_ID_PCM_S8
:
859 case CODEC_ID_PCM_U8
:
860 if (st
->codec
->bits_per_coded_sample
== 16)
861 st
->codec
->codec_id
= CODEC_ID_PCM_S16BE
;
863 case CODEC_ID_PCM_S16LE
:
864 case CODEC_ID_PCM_S16BE
:
865 if (st
->codec
->bits_per_coded_sample
== 8)
866 st
->codec
->codec_id
= CODEC_ID_PCM_S8
;
867 else if (st
->codec
->bits_per_coded_sample
== 24)
868 st
->codec
->codec_id
=
869 st
->codec
->codec_id
== CODEC_ID_PCM_S16BE
?
870 CODEC_ID_PCM_S24BE
: CODEC_ID_PCM_S24LE
;
872 /* set values for old format before stsd version 1 appeared */
874 sc
->samples_per_frame
= 6;
875 sc
->bytes_per_frame
= 2*st
->codec
->channels
;
878 sc
->samples_per_frame
= 6;
879 sc
->bytes_per_frame
= 1*st
->codec
->channels
;
881 case CODEC_ID_ADPCM_IMA_QT
:
882 sc
->samples_per_frame
= 64;
883 sc
->bytes_per_frame
= 34*st
->codec
->channels
;
886 sc
->samples_per_frame
= 160;
887 sc
->bytes_per_frame
= 33;
893 bits_per_sample
= av_get_bits_per_sample(st
->codec
->codec_id
);
894 if (bits_per_sample
) {
895 st
->codec
->bits_per_coded_sample
= bits_per_sample
;
896 sc
->sample_size
= (bits_per_sample
>> 3) * st
->codec
->channels
;
898 } else if(st
->codec
->codec_type
==CODEC_TYPE_SUBTITLE
){
899 // ttxt stsd contains display flags, justification, background
900 // color, fonts, and default styles, so fake an atom to read it
901 MOVAtom fake_atom
= { .size
= size
- (url_ftell(pb
) - start_pos
) };
902 mov_read_glbl(c
, pb
, fake_atom
);
903 st
->codec
->codec_id
= id
;
904 st
->codec
->width
= sc
->width
;
905 st
->codec
->height
= sc
->height
;
907 /* other codec type, just skip (rtp, mp4s, tmcd ...) */
908 url_fskip(pb
, size
- (url_ftell(pb
) - start_pos
));
910 /* this will read extra atoms at the end (wave, alac, damr, avcC, SMI ...) */
911 a
.size
= size
- (url_ftell(pb
) - start_pos
);
913 if (mov_read_default(c
, pb
, a
) < 0)
915 } else if (a
.size
> 0)
916 url_fskip(pb
, a
.size
);
919 if(st
->codec
->codec_type
==CODEC_TYPE_AUDIO
&& st
->codec
->sample_rate
==0 && sc
->time_scale
>1)
920 st
->codec
->sample_rate
= sc
->time_scale
;
922 /* special codec parameters handling */
923 switch (st
->codec
->codec_id
) {
924 #if CONFIG_DV_DEMUXER
925 case CODEC_ID_DVAUDIO
:
926 c
->dv_fctx
= avformat_alloc_context();
927 c
->dv_demux
= dv_init_demux(c
->dv_fctx
);
929 av_log(c
->fc
, AV_LOG_ERROR
, "dv demux context init error\n");
932 sc
->dv_audio_container
= 1;
933 st
->codec
->codec_id
= CODEC_ID_PCM_S16LE
;
936 /* no ifdef since parameters are always those */
938 st
->codec
->frame_size
= 160;
939 st
->codec
->channels
= 1; /* really needed */
941 case CODEC_ID_AMR_NB
:
942 case CODEC_ID_AMR_WB
:
943 st
->codec
->frame_size
= sc
->samples_per_frame
;
944 st
->codec
->channels
= 1; /* really needed */
945 /* force sample rate for amr, stsd in 3gp does not store sample rate */
946 if (st
->codec
->codec_id
== CODEC_ID_AMR_NB
)
947 st
->codec
->sample_rate
= 8000;
948 else if (st
->codec
->codec_id
== CODEC_ID_AMR_WB
)
949 st
->codec
->sample_rate
= 16000;
953 st
->codec
->codec_type
= CODEC_TYPE_AUDIO
; /* force type after stsd for m1a hdlr */
954 st
->need_parsing
= AVSTREAM_PARSE_FULL
;
957 case CODEC_ID_ADPCM_MS
:
958 case CODEC_ID_ADPCM_IMA_WAV
:
959 st
->codec
->block_align
= sc
->bytes_per_frame
;
962 if (st
->codec
->extradata_size
== 36) {
963 st
->codec
->frame_size
= AV_RB32(st
->codec
->extradata
+12);
964 st
->codec
->channels
= AV_RB8 (st
->codec
->extradata
+21);
974 static int mov_read_stsc(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
976 AVStream
*st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
977 MOVStreamContext
*sc
= st
->priv_data
;
978 unsigned int i
, entries
;
980 get_byte(pb
); /* version */
981 get_be24(pb
); /* flags */
983 entries
= get_be32(pb
);
985 dprintf(c
->fc
, "track[%i].stsc.entries = %i\n", c
->fc
->nb_streams
-1, entries
);
987 if(entries
>= UINT_MAX
/ sizeof(*sc
->stsc_data
))
989 sc
->stsc_data
= av_malloc(entries
* sizeof(*sc
->stsc_data
));
991 return AVERROR(ENOMEM
);
992 sc
->stsc_count
= entries
;
994 for(i
=0; i
<entries
; i
++) {
995 sc
->stsc_data
[i
].first
= get_be32(pb
);
996 sc
->stsc_data
[i
].count
= get_be32(pb
);
997 sc
->stsc_data
[i
].id
= get_be32(pb
);
1002 static int mov_read_stss(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
1004 AVStream
*st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
1005 MOVStreamContext
*sc
= st
->priv_data
;
1006 unsigned int i
, entries
;
1008 get_byte(pb
); /* version */
1009 get_be24(pb
); /* flags */
1011 entries
= get_be32(pb
);
1013 dprintf(c
->fc
, "keyframe_count = %d\n", entries
);
1015 if(entries
>= UINT_MAX
/ sizeof(int))
1017 sc
->keyframes
= av_malloc(entries
* sizeof(int));
1019 return AVERROR(ENOMEM
);
1020 sc
->keyframe_count
= entries
;
1022 for(i
=0; i
<entries
; i
++) {
1023 sc
->keyframes
[i
] = get_be32(pb
);
1024 //dprintf(c->fc, "keyframes[]=%d\n", sc->keyframes[i]);
1029 static int mov_read_stsz(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
1031 AVStream
*st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
1032 MOVStreamContext
*sc
= st
->priv_data
;
1033 unsigned int i
, entries
, sample_size
;
1035 get_byte(pb
); /* version */
1036 get_be24(pb
); /* flags */
1038 sample_size
= get_be32(pb
);
1039 if (!sc
->sample_size
) /* do not overwrite value computed in stsd */
1040 sc
->sample_size
= sample_size
;
1041 entries
= get_be32(pb
);
1043 dprintf(c
->fc
, "sample_size = %d sample_count = %d\n", sc
->sample_size
, entries
);
1045 sc
->sample_count
= entries
;
1049 if(entries
>= UINT_MAX
/ sizeof(int))
1051 sc
->sample_sizes
= av_malloc(entries
* sizeof(int));
1052 if (!sc
->sample_sizes
)
1053 return AVERROR(ENOMEM
);
1055 for(i
=0; i
<entries
; i
++)
1056 sc
->sample_sizes
[i
] = get_be32(pb
);
1060 static int mov_read_stts(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
1062 AVStream
*st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
1063 MOVStreamContext
*sc
= st
->priv_data
;
1064 unsigned int i
, entries
;
1066 int64_t total_sample_count
=0;
1068 get_byte(pb
); /* version */
1069 get_be24(pb
); /* flags */
1070 entries
= get_be32(pb
);
1072 dprintf(c
->fc
, "track[%i].stts.entries = %i\n", c
->fc
->nb_streams
-1, entries
);
1074 if(entries
>= UINT_MAX
/ sizeof(*sc
->stts_data
))
1076 sc
->stts_data
= av_malloc(entries
* sizeof(*sc
->stts_data
));
1078 return AVERROR(ENOMEM
);
1079 sc
->stts_count
= entries
;
1081 for(i
=0; i
<entries
; i
++) {
1082 int sample_duration
;
1085 sample_count
=get_be32(pb
);
1086 sample_duration
= get_be32(pb
);
1087 sc
->stts_data
[i
].count
= sample_count
;
1088 sc
->stts_data
[i
].duration
= sample_duration
;
1090 sc
->time_rate
= av_gcd(sc
->time_rate
, sample_duration
);
1092 dprintf(c
->fc
, "sample_count=%d, sample_duration=%d\n",sample_count
,sample_duration
);
1094 duration
+=(int64_t)sample_duration
*sample_count
;
1095 total_sample_count
+=sample_count
;
1098 st
->nb_frames
= total_sample_count
;
1100 st
->duration
= duration
;
1104 static int mov_read_ctts(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
1106 AVStream
*st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
1107 MOVStreamContext
*sc
= st
->priv_data
;
1108 unsigned int i
, entries
;
1110 get_byte(pb
); /* version */
1111 get_be24(pb
); /* flags */
1112 entries
= get_be32(pb
);
1114 dprintf(c
->fc
, "track[%i].ctts.entries = %i\n", c
->fc
->nb_streams
-1, entries
);
1116 if(entries
>= UINT_MAX
/ sizeof(*sc
->ctts_data
))
1118 sc
->ctts_data
= av_malloc(entries
* sizeof(*sc
->ctts_data
));
1120 return AVERROR(ENOMEM
);
1121 sc
->ctts_count
= entries
;
1123 for(i
=0; i
<entries
; i
++) {
1124 int count
=get_be32(pb
);
1125 int duration
=get_be32(pb
);
1129 st
->codec
->has_b_frames
= 1;
1131 sc
->ctts_data
[i
].count
= count
;
1132 sc
->ctts_data
[i
].duration
= duration
;
1134 sc
->time_rate
= av_gcd(sc
->time_rate
, FFABS(duration
));
1139 static void mov_build_index(MOVContext
*mov
, AVStream
*st
)
1141 MOVStreamContext
*sc
= st
->priv_data
;
1142 int64_t current_offset
;
1143 int64_t current_dts
= 0;
1144 unsigned int stts_index
= 0;
1145 unsigned int stsc_index
= 0;
1146 unsigned int stss_index
= 0;
1149 /* adjust first dts according to edit list */
1150 if (sc
->time_offset
) {
1151 assert(sc
->time_offset
% sc
->time_rate
== 0);
1152 current_dts
= - (sc
->time_offset
/ sc
->time_rate
);
1155 /* only use old uncompressed audio chunk demuxing when stts specifies it */
1156 if (!(st
->codec
->codec_type
== CODEC_TYPE_AUDIO
&&
1157 sc
->stts_count
== 1 && sc
->stts_data
[0].duration
== 1)) {
1158 unsigned int current_sample
= 0;
1159 unsigned int stts_sample
= 0;
1160 unsigned int keyframe
, sample_size
;
1161 unsigned int distance
= 0;
1162 int key_off
= sc
->keyframes
&& sc
->keyframes
[0] == 1;
1164 st
->nb_frames
= sc
->sample_count
;
1165 for (i
= 0; i
< sc
->chunk_count
; i
++) {
1166 current_offset
= sc
->chunk_offsets
[i
];
1167 if (stsc_index
+ 1 < sc
->stsc_count
&&
1168 i
+ 1 == sc
->stsc_data
[stsc_index
+ 1].first
)
1170 for (j
= 0; j
< sc
->stsc_data
[stsc_index
].count
; j
++) {
1171 if (current_sample
>= sc
->sample_count
) {
1172 av_log(mov
->fc
, AV_LOG_ERROR
, "wrong sample count\n");
1175 keyframe
= !sc
->keyframe_count
|| current_sample
+key_off
== sc
->keyframes
[stss_index
];
1178 if (stss_index
+ 1 < sc
->keyframe_count
)
1181 sample_size
= sc
->sample_size
> 0 ? sc
->sample_size
: sc
->sample_sizes
[current_sample
];
1182 if(sc
->pseudo_stream_id
== -1 ||
1183 sc
->stsc_data
[stsc_index
].id
- 1 == sc
->pseudo_stream_id
) {
1184 av_add_index_entry(st
, current_offset
, current_dts
, sample_size
, distance
,
1185 keyframe
? AVINDEX_KEYFRAME
: 0);
1186 dprintf(mov
->fc
, "AVIndex stream %d, sample %d, offset %"PRIx64
", dts %"PRId64
", "
1187 "size %d, distance %d, keyframe %d\n", st
->index
, current_sample
,
1188 current_offset
, current_dts
, sample_size
, distance
, keyframe
);
1191 current_offset
+= sample_size
;
1192 assert(sc
->stts_data
[stts_index
].duration
% sc
->time_rate
== 0);
1193 current_dts
+= sc
->stts_data
[stts_index
].duration
/ sc
->time_rate
;
1197 if (stts_index
+ 1 < sc
->stts_count
&& stts_sample
== sc
->stts_data
[stts_index
].count
) {
1203 } else { /* read whole chunk */
1204 unsigned int chunk_samples
, chunk_size
, chunk_duration
;
1205 unsigned int frames
= 1;
1206 for (i
= 0; i
< sc
->chunk_count
; i
++) {
1207 current_offset
= sc
->chunk_offsets
[i
];
1208 if (stsc_index
+ 1 < sc
->stsc_count
&&
1209 i
+ 1 == sc
->stsc_data
[stsc_index
+ 1].first
)
1211 chunk_samples
= sc
->stsc_data
[stsc_index
].count
;
1212 /* get chunk size, beware of alaw/ulaw/mace */
1213 if (sc
->samples_per_frame
> 0 &&
1214 (chunk_samples
* sc
->bytes_per_frame
% sc
->samples_per_frame
== 0)) {
1215 if (sc
->samples_per_frame
< 160)
1216 chunk_size
= chunk_samples
* sc
->bytes_per_frame
/ sc
->samples_per_frame
;
1218 chunk_size
= sc
->bytes_per_frame
;
1219 frames
= chunk_samples
/ sc
->samples_per_frame
;
1220 chunk_samples
= sc
->samples_per_frame
;
1223 chunk_size
= chunk_samples
* sc
->sample_size
;
1224 for (j
= 0; j
< frames
; j
++) {
1225 av_add_index_entry(st
, current_offset
, current_dts
, chunk_size
, 0, AVINDEX_KEYFRAME
);
1226 /* get chunk duration */
1228 while (chunk_samples
> 0) {
1229 if (chunk_samples
< sc
->stts_data
[stts_index
].count
) {
1230 chunk_duration
+= sc
->stts_data
[stts_index
].duration
* chunk_samples
;
1231 sc
->stts_data
[stts_index
].count
-= chunk_samples
;
1234 chunk_duration
+= sc
->stts_data
[stts_index
].duration
* chunk_samples
;
1235 chunk_samples
-= sc
->stts_data
[stts_index
].count
;
1236 if (stts_index
+ 1 < sc
->stts_count
)
1240 current_offset
+= sc
->bytes_per_frame
;
1241 dprintf(mov
->fc
, "AVIndex stream %d, chunk %d, offset %"PRIx64
", dts %"PRId64
", "
1242 "size %d, duration %d\n", st
->index
, i
, current_offset
, current_dts
,
1243 chunk_size
, chunk_duration
);
1244 assert(chunk_duration
% sc
->time_rate
== 0);
1245 current_dts
+= chunk_duration
/ sc
->time_rate
;
1251 static int mov_read_trak(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
1254 MOVStreamContext
*sc
;
1257 st
= av_new_stream(c
->fc
, c
->fc
->nb_streams
);
1258 if (!st
) return AVERROR(ENOMEM
);
1259 sc
= av_mallocz(sizeof(MOVStreamContext
));
1260 if (!sc
) return AVERROR(ENOMEM
);
1263 st
->codec
->codec_type
= CODEC_TYPE_DATA
;
1264 sc
->ffindex
= st
->index
;
1266 if ((ret
= mov_read_default(c
, pb
, atom
)) < 0)
1270 if (sc
->chunk_count
&& (!sc
->stts_count
|| !sc
->stsc_count
||
1271 (!sc
->sample_size
&& !sc
->sample_count
))) {
1272 av_log(c
->fc
, AV_LOG_ERROR
, "stream %d, missing mandatory atoms, broken header\n",
1279 if (!sc
->time_scale
)
1280 sc
->time_scale
= c
->time_scale
;
1282 av_set_pts_info(st
, 64, sc
->time_rate
, sc
->time_scale
);
1284 if (st
->codec
->codec_type
== CODEC_TYPE_AUDIO
&&
1285 !st
->codec
->frame_size
&& sc
->stts_count
== 1) {
1286 st
->codec
->frame_size
= av_rescale(sc
->stts_data
[0].duration
,
1287 st
->codec
->sample_rate
, sc
->time_scale
);
1288 dprintf(c
->fc
, "frame size %d\n", st
->codec
->frame_size
);
1291 if (st
->duration
!= AV_NOPTS_VALUE
) {
1292 assert(st
->duration
% sc
->time_rate
== 0);
1293 st
->duration
/= sc
->time_rate
;
1296 mov_build_index(c
, st
);
1298 if (sc
->dref_id
-1 < sc
->drefs_count
&& sc
->drefs
[sc
->dref_id
-1].path
) {
1299 if (url_fopen(&sc
->pb
, sc
->drefs
[sc
->dref_id
-1].path
, URL_RDONLY
) < 0)
1300 av_log(c
->fc
, AV_LOG_ERROR
, "stream %d, error opening file %s: %s\n",
1301 st
->index
, sc
->drefs
[sc
->dref_id
-1].path
, strerror(errno
));
1305 switch (st
->codec
->codec_id
) {
1306 #if CONFIG_H261_DECODER
1309 #if CONFIG_H263_DECODER
1312 #if CONFIG_MPEG4_DECODER
1313 case CODEC_ID_MPEG4
:
1315 st
->codec
->width
= 0; /* let decoder init width/height */
1316 st
->codec
->height
= 0;
1320 /* Do not need those anymore. */
1321 av_freep(&sc
->chunk_offsets
);
1322 av_freep(&sc
->stsc_data
);
1323 av_freep(&sc
->sample_sizes
);
1324 av_freep(&sc
->keyframes
);
1325 av_freep(&sc
->stts_data
);
1330 static int mov_read_ilst(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
1333 c
->itunes_metadata
= 1;
1334 ret
= mov_read_default(c
, pb
, atom
);
1335 c
->itunes_metadata
= 0;
1339 static int mov_read_meta(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
1341 url_fskip(pb
, 4); // version + flags
1343 return mov_read_default(c
, pb
, atom
);
1346 static int mov_read_trkn(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
1349 get_be32(pb
); // type
1350 get_be32(pb
); // unknown
1351 snprintf(track
, sizeof(track
), "%d", get_be32(pb
));
1352 av_metadata_set(&c
->fc
->metadata
, "track", track
);
1353 dprintf(c
->fc
, "%.4s %s\n", (char*)&atom
.type
, track
);
1357 static int mov_read_udta_string(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
1359 char str
[1024], key2
[16], language
[4] = {0};
1360 const char *key
= NULL
;
1363 if (c
->itunes_metadata
) {
1364 int data_size
= get_be32(pb
);
1365 int tag
= get_le32(pb
);
1366 if (tag
== MKTAG('d','a','t','a')) {
1367 get_be32(pb
); // type
1368 get_be32(pb
); // unknown
1369 str_size
= data_size
- 16;
1373 str_size
= get_be16(pb
); // string length
1374 ff_mov_lang_to_iso639(get_be16(pb
), language
);
1377 switch (atom
.type
) {
1378 case MKTAG(0xa9,'n','a','m'): key
= "title"; break;
1379 case MKTAG(0xa9,'a','u','t'):
1380 case MKTAG(0xa9,'A','R','T'):
1381 case MKTAG(0xa9,'w','r','t'): key
= "author"; break;
1382 case MKTAG(0xa9,'c','p','y'): key
= "copyright"; break;
1383 case MKTAG(0xa9,'c','m','t'):
1384 case MKTAG(0xa9,'i','n','f'): key
= "comment"; break;
1385 case MKTAG(0xa9,'a','l','b'): key
= "album"; break;
1386 case MKTAG(0xa9,'d','a','y'): key
= "year"; break;
1387 case MKTAG(0xa9,'g','e','n'): key
= "genre"; break;
1388 case MKTAG(0xa9,'t','o','o'):
1389 case MKTAG(0xa9,'e','n','c'): key
= "muxer"; break;
1396 str_size
= FFMIN3(sizeof(str
)-1, str_size
, atom
.size
);
1397 get_buffer(pb
, str
, str_size
);
1399 av_metadata_set(&c
->fc
->metadata
, key
, str
);
1400 if (*language
&& strcmp(language
, "und")) {
1401 snprintf(key2
, sizeof(key2
), "%s-%s", key
, language
);
1402 av_metadata_set(&c
->fc
->metadata
, key2
, str
);
1404 dprintf(c
->fc
, "%.4s %s %d %lld\n", (char*)&atom
.type
, str
, str_size
, atom
.size
);
1408 static int mov_read_tkhd(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
1413 int64_t disp_transform
[2];
1414 int display_matrix
[3][2];
1415 AVStream
*st
= c
->fc
->streams
[c
->fc
->nb_streams
-1];
1416 MOVStreamContext
*sc
= st
->priv_data
;
1417 int version
= get_byte(pb
);
1419 get_be24(pb
); /* flags */
1421 MOV_TRACK_ENABLED 0x0001
1422 MOV_TRACK_IN_MOVIE 0x0002
1423 MOV_TRACK_IN_PREVIEW 0x0004
1424 MOV_TRACK_IN_POSTER 0x0008
1431 get_be32(pb
); /* creation time */
1432 get_be32(pb
); /* modification time */
1434 st
->id
= (int)get_be32(pb
); /* track id (NOT 0 !)*/
1435 get_be32(pb
); /* reserved */
1437 /* highlevel (considering edits) duration in movie timebase */
1438 (version
== 1) ? get_be64(pb
) : get_be32(pb
);
1439 get_be32(pb
); /* reserved */
1440 get_be32(pb
); /* reserved */
1442 get_be16(pb
); /* layer */
1443 get_be16(pb
); /* alternate group */
1444 get_be16(pb
); /* volume */
1445 get_be16(pb
); /* reserved */
1447 //read in the display matrix (outlined in ISO 14496-12, Section 6.2.2)
1448 // they're kept in fixed point format through all calculations
1449 // ignore u,v,z b/c we don't need the scale factor to calc aspect ratio
1450 for (i
= 0; i
< 3; i
++) {
1451 display_matrix
[i
][0] = get_be32(pb
); // 16.16 fixed point
1452 display_matrix
[i
][1] = get_be32(pb
); // 16.16 fixed point
1453 get_be32(pb
); // 2.30 fixed point (not used)
1456 width
= get_be32(pb
); // 16.16 fixed point track width
1457 height
= get_be32(pb
); // 16.16 fixed point track height
1458 sc
->width
= width
>> 16;
1459 sc
->height
= height
>> 16;
1461 //transform the display width/height according to the matrix
1462 // skip this if the display matrix is the default identity matrix
1463 // to keep the same scale, use [width height 1<<16]
1464 if (width
&& height
&&
1465 (display_matrix
[0][0] != 65536 || display_matrix
[0][1] ||
1466 display_matrix
[1][0] || display_matrix
[1][1] != 65536 ||
1467 display_matrix
[2][0] || display_matrix
[2][1])) {
1468 for (i
= 0; i
< 2; i
++)
1470 (int64_t) width
* display_matrix
[0][i
] +
1471 (int64_t) height
* display_matrix
[1][i
] +
1472 ((int64_t) display_matrix
[2][i
] << 16);
1474 //sample aspect ratio is new width/height divided by old width/height
1475 st
->sample_aspect_ratio
= av_d2q(
1476 ((double) disp_transform
[0] * height
) /
1477 ((double) disp_transform
[1] * width
), INT_MAX
);
1482 static int mov_read_tfhd(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
1484 MOVFragment
*frag
= &c
->fragment
;
1485 MOVTrackExt
*trex
= NULL
;
1486 int flags
, track_id
, i
;
1488 get_byte(pb
); /* version */
1489 flags
= get_be24(pb
);
1491 track_id
= get_be32(pb
);
1494 frag
->track_id
= track_id
;
1495 for (i
= 0; i
< c
->trex_count
; i
++)
1496 if (c
->trex_data
[i
].track_id
== frag
->track_id
) {
1497 trex
= &c
->trex_data
[i
];
1501 av_log(c
->fc
, AV_LOG_ERROR
, "could not find corresponding trex\n");
1505 if (flags
& 0x01) frag
->base_data_offset
= get_be64(pb
);
1506 else frag
->base_data_offset
= frag
->moof_offset
;
1507 if (flags
& 0x02) frag
->stsd_id
= get_be32(pb
);
1508 else frag
->stsd_id
= trex
->stsd_id
;
1510 frag
->duration
= flags
& 0x08 ? get_be32(pb
) : trex
->duration
;
1511 frag
->size
= flags
& 0x10 ? get_be32(pb
) : trex
->size
;
1512 frag
->flags
= flags
& 0x20 ? get_be32(pb
) : trex
->flags
;
1513 dprintf(c
->fc
, "frag flags 0x%x\n", frag
->flags
);
1517 static int mov_read_trex(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
1521 if ((uint64_t)c
->trex_count
+1 >= UINT_MAX
/ sizeof(*c
->trex_data
))
1523 trex
= av_realloc(c
->trex_data
, (c
->trex_count
+1)*sizeof(*c
->trex_data
));
1525 return AVERROR(ENOMEM
);
1526 c
->trex_data
= trex
;
1527 trex
= &c
->trex_data
[c
->trex_count
++];
1528 get_byte(pb
); /* version */
1529 get_be24(pb
); /* flags */
1530 trex
->track_id
= get_be32(pb
);
1531 trex
->stsd_id
= get_be32(pb
);
1532 trex
->duration
= get_be32(pb
);
1533 trex
->size
= get_be32(pb
);
1534 trex
->flags
= get_be32(pb
);
1538 static int mov_read_trun(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
1540 MOVFragment
*frag
= &c
->fragment
;
1541 AVStream
*st
= NULL
;
1542 MOVStreamContext
*sc
;
1545 int data_offset
= 0;
1546 unsigned entries
, first_sample_flags
= frag
->flags
;
1547 int flags
, distance
, i
;
1549 for (i
= 0; i
< c
->fc
->nb_streams
; i
++) {
1550 if (c
->fc
->streams
[i
]->id
== frag
->track_id
) {
1551 st
= c
->fc
->streams
[i
];
1556 av_log(c
->fc
, AV_LOG_ERROR
, "could not find corresponding track id %d\n", frag
->track_id
);
1560 if (sc
->pseudo_stream_id
+1 != frag
->stsd_id
)
1562 get_byte(pb
); /* version */
1563 flags
= get_be24(pb
);
1564 entries
= get_be32(pb
);
1565 dprintf(c
->fc
, "flags 0x%x entries %d\n", flags
, entries
);
1566 if (flags
& 0x001) data_offset
= get_be32(pb
);
1567 if (flags
& 0x004) first_sample_flags
= get_be32(pb
);
1568 if (flags
& 0x800) {
1570 if ((uint64_t)entries
+sc
->ctts_count
>= UINT_MAX
/sizeof(*sc
->ctts_data
))
1572 ctts_data
= av_realloc(sc
->ctts_data
,
1573 (entries
+sc
->ctts_count
)*sizeof(*sc
->ctts_data
));
1575 return AVERROR(ENOMEM
);
1576 sc
->ctts_data
= ctts_data
;
1579 offset
= frag
->base_data_offset
+ data_offset
;
1581 dprintf(c
->fc
, "first sample flags 0x%x\n", first_sample_flags
);
1582 for (i
= 0; i
< entries
; i
++) {
1583 unsigned sample_size
= frag
->size
;
1584 int sample_flags
= i
? frag
->flags
: first_sample_flags
;
1585 unsigned sample_duration
= frag
->duration
;
1588 if (flags
& 0x100) sample_duration
= get_be32(pb
);
1589 if (flags
& 0x200) sample_size
= get_be32(pb
);
1590 if (flags
& 0x400) sample_flags
= get_be32(pb
);
1591 if (flags
& 0x800) {
1592 sc
->ctts_data
[sc
->ctts_count
].count
= 1;
1593 sc
->ctts_data
[sc
->ctts_count
].duration
= get_be32(pb
);
1596 if ((keyframe
= st
->codec
->codec_type
== CODEC_TYPE_AUDIO
||
1597 (flags
& 0x004 && !i
&& !sample_flags
) || sample_flags
& 0x2000000))
1599 av_add_index_entry(st
, offset
, dts
, sample_size
, distance
,
1600 keyframe
? AVINDEX_KEYFRAME
: 0);
1601 dprintf(c
->fc
, "AVIndex stream %d, sample %d, offset %"PRIx64
", dts %"PRId64
", "
1602 "size %d, distance %d, keyframe %d\n", st
->index
, sc
->sample_count
+i
,
1603 offset
, dts
, sample_size
, distance
, keyframe
);
1605 assert(sample_duration
% sc
->time_rate
== 0);
1606 dts
+= sample_duration
/ sc
->time_rate
;
1607 offset
+= sample_size
;
1609 frag
->moof_offset
= offset
;
1614 /* this atom should be null (from specs), but some buggy files put the 'moov' atom inside it... */
1615 /* like the files created with Adobe Premiere 5.0, for samples see */
1616 /* http://graphics.tudelft.nl/~wouter/publications/soundtests/ */
1617 static int mov_read_wide(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
1622 return 0; /* continue */
1623 if (get_be32(pb
) != 0) { /* 0 sized mdat atom... use the 'wide' atom size */
1624 url_fskip(pb
, atom
.size
- 4);
1627 atom
.type
= get_le32(pb
);
1630 if (atom
.type
!= MKTAG('m','d','a','t')) {
1631 url_fskip(pb
, atom
.size
);
1634 err
= mov_read_mdat(c
, pb
, atom
);
1638 static int mov_read_cmov(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
1643 uint8_t *moov_data
; /* uncompressed data */
1644 long cmov_len
, moov_len
;
1647 get_be32(pb
); /* dcom atom */
1648 if (get_le32(pb
) != MKTAG('d','c','o','m'))
1650 if (get_le32(pb
) != MKTAG('z','l','i','b')) {
1651 av_log(c
->fc
, AV_LOG_ERROR
, "unknown compression for cmov atom !");
1654 get_be32(pb
); /* cmvd atom */
1655 if (get_le32(pb
) != MKTAG('c','m','v','d'))
1657 moov_len
= get_be32(pb
); /* uncompressed size */
1658 cmov_len
= atom
.size
- 6 * 4;
1660 cmov_data
= av_malloc(cmov_len
);
1662 return AVERROR(ENOMEM
);
1663 moov_data
= av_malloc(moov_len
);
1666 return AVERROR(ENOMEM
);
1668 get_buffer(pb
, cmov_data
, cmov_len
);
1669 if(uncompress (moov_data
, (uLongf
*) &moov_len
, (const Bytef
*)cmov_data
, cmov_len
) != Z_OK
)
1670 goto free_and_return
;
1671 if(init_put_byte(&ctx
, moov_data
, moov_len
, 0, NULL
, NULL
, NULL
, NULL
) != 0)
1672 goto free_and_return
;
1673 atom
.type
= MKTAG('m','o','o','v');
1675 atom
.size
= moov_len
;
1677 // { int fd = open("/tmp/uncompheader.mov", O_WRONLY | O_CREAT); write(fd, moov_data, moov_len); close(fd); }
1679 ret
= mov_read_default(c
, &ctx
, atom
);
1685 av_log(c
->fc
, AV_LOG_ERROR
, "this file requires zlib support compiled in\n");
1690 /* edit list atom */
1691 static int mov_read_elst(MOVContext
*c
, ByteIOContext
*pb
, MOVAtom atom
)
1693 MOVStreamContext
*sc
= c
->fc
->streams
[c
->fc
->nb_streams
-1]->priv_data
;
1696 get_byte(pb
); /* version */
1697 get_be24(pb
); /* flags */
1698 edit_count
= get_be32(pb
); /* entries */
1700 for(i
=0; i
<edit_count
; i
++){
1702 get_be32(pb
); /* Track duration */
1703 time
= get_be32(pb
); /* Media time */
1704 get_be32(pb
); /* Media rate */
1705 if (i
== 0 && time
!= -1) {
1706 sc
->time_offset
= time
;
1707 sc
->time_rate
= av_gcd(sc
->time_rate
, time
);
1712 av_log(c
->fc
, AV_LOG_WARNING
, "multiple edit list entries, "
1713 "a/v desync might occur, patch welcome\n");
1715 dprintf(c
->fc
, "track[%i].edit_count = %i\n", c
->fc
->nb_streams
-1, edit_count
);
1719 static const MOVParseTableEntry mov_default_parse_table
[] = {
1720 { MKTAG('a','v','s','s'), mov_read_extradata
},
1721 { MKTAG('c','o','6','4'), mov_read_stco
},
1722 { MKTAG('c','t','t','s'), mov_read_ctts
}, /* composition time to sample */
1723 { MKTAG('d','i','n','f'), mov_read_default
},
1724 { MKTAG('d','r','e','f'), mov_read_dref
},
1725 { MKTAG('e','d','t','s'), mov_read_default
},
1726 { MKTAG('e','l','s','t'), mov_read_elst
},
1727 { MKTAG('e','n','d','a'), mov_read_enda
},
1728 { MKTAG('f','i','e','l'), mov_read_extradata
},
1729 { MKTAG('f','t','y','p'), mov_read_ftyp
},
1730 { MKTAG('g','l','b','l'), mov_read_glbl
},
1731 { MKTAG('h','d','l','r'), mov_read_hdlr
},
1732 { MKTAG('i','l','s','t'), mov_read_ilst
},
1733 { MKTAG('j','p','2','h'), mov_read_extradata
},
1734 { MKTAG('m','d','a','t'), mov_read_mdat
},
1735 { MKTAG('m','d','h','d'), mov_read_mdhd
},
1736 { MKTAG('m','d','i','a'), mov_read_default
},
1737 { MKTAG('m','e','t','a'), mov_read_meta
},
1738 { MKTAG('m','i','n','f'), mov_read_default
},
1739 { MKTAG('m','o','o','f'), mov_read_moof
},
1740 { MKTAG('m','o','o','v'), mov_read_moov
},
1741 { MKTAG('m','v','e','x'), mov_read_default
},
1742 { MKTAG('m','v','h','d'), mov_read_mvhd
},
1743 { MKTAG('S','M','I',' '), mov_read_smi
}, /* Sorenson extension ??? */
1744 { MKTAG('a','l','a','c'), mov_read_extradata
}, /* alac specific atom */
1745 { MKTAG('a','v','c','C'), mov_read_glbl
},
1746 { MKTAG('p','a','s','p'), mov_read_pasp
},
1747 { MKTAG('s','t','b','l'), mov_read_default
},
1748 { MKTAG('s','t','c','o'), mov_read_stco
},
1749 { MKTAG('s','t','s','c'), mov_read_stsc
},
1750 { MKTAG('s','t','s','d'), mov_read_stsd
}, /* sample description */
1751 { MKTAG('s','t','s','s'), mov_read_stss
}, /* sync sample */
1752 { MKTAG('s','t','s','z'), mov_read_stsz
}, /* sample size */
1753 { MKTAG('s','t','t','s'), mov_read_stts
},
1754 { MKTAG('t','k','h','d'), mov_read_tkhd
}, /* track header */
1755 { MKTAG('t','f','h','d'), mov_read_tfhd
}, /* track fragment header */
1756 { MKTAG('t','r','a','k'), mov_read_trak
},
1757 { MKTAG('t','r','a','f'), mov_read_default
},
1758 { MKTAG('t','r','e','x'), mov_read_trex
},
1759 { MKTAG('t','r','k','n'), mov_read_trkn
},
1760 { MKTAG('t','r','u','n'), mov_read_trun
},
1761 { MKTAG('u','d','t','a'), mov_read_default
},
1762 { MKTAG('w','a','v','e'), mov_read_wave
},
1763 { MKTAG('e','s','d','s'), mov_read_esds
},
1764 { MKTAG('w','i','d','e'), mov_read_wide
}, /* place holder */
1765 { MKTAG('c','m','o','v'), mov_read_cmov
},
1766 { MKTAG(0xa9,'n','a','m'), mov_read_udta_string
},
1767 { MKTAG(0xa9,'w','r','t'), mov_read_udta_string
},
1768 { MKTAG(0xa9,'c','p','y'), mov_read_udta_string
},
1769 { MKTAG(0xa9,'i','n','f'), mov_read_udta_string
},
1770 { MKTAG(0xa9,'i','n','f'), mov_read_udta_string
},
1771 { MKTAG(0xa9,'A','R','T'), mov_read_udta_string
},
1772 { MKTAG(0xa9,'a','l','b'), mov_read_udta_string
},
1773 { MKTAG(0xa9,'c','m','t'), mov_read_udta_string
},
1774 { MKTAG(0xa9,'a','u','t'), mov_read_udta_string
},
1775 { MKTAG(0xa9,'d','a','y'), mov_read_udta_string
},
1776 { MKTAG(0xa9,'g','e','n'), mov_read_udta_string
},
1777 { MKTAG(0xa9,'e','n','c'), mov_read_udta_string
},
1778 { MKTAG(0xa9,'t','o','o'), mov_read_udta_string
},
1782 static int mov_probe(AVProbeData
*p
)
1784 unsigned int offset
;
1788 /* check file header */
1791 /* ignore invalid offset */
1792 if ((offset
+ 8) > (unsigned int)p
->buf_size
)
1794 tag
= AV_RL32(p
->buf
+ offset
+ 4);
1796 /* check for obvious tags */
1797 case MKTAG('j','P',' ',' '): /* jpeg 2000 signature */
1798 case MKTAG('m','o','o','v'):
1799 case MKTAG('m','d','a','t'):
1800 case MKTAG('p','n','o','t'): /* detect movs with preview pics like ew.mov and april.mov */
1801 case MKTAG('u','d','t','a'): /* Packet Video PVAuthor adds this and a lot of more junk */
1802 case MKTAG('f','t','y','p'):
1803 return AVPROBE_SCORE_MAX
;
1804 /* those are more common words, so rate then a bit less */
1805 case MKTAG('e','d','i','w'): /* xdcam files have reverted first tags */
1806 case MKTAG('w','i','d','e'):
1807 case MKTAG('f','r','e','e'):
1808 case MKTAG('j','u','n','k'):
1809 case MKTAG('p','i','c','t'):
1810 return AVPROBE_SCORE_MAX
- 5;
1811 case MKTAG(0x82,0x82,0x7f,0x7d):
1812 case MKTAG('s','k','i','p'):
1813 case MKTAG('u','u','i','d'):
1814 case MKTAG('p','r','f','l'):
1815 offset
= AV_RB32(p
->buf
+offset
) + offset
;
1816 /* if we only find those cause probedata is too small at least rate them */
1817 score
= AVPROBE_SCORE_MAX
- 50;
1820 /* unrecognized tag */
1827 static int mov_read_header(AVFormatContext
*s
, AVFormatParameters
*ap
)
1829 MOVContext
*mov
= s
->priv_data
;
1830 ByteIOContext
*pb
= s
->pb
;
1832 MOVAtom atom
= { 0, 0, 0 };
1835 /* .mov and .mp4 aren't streamable anyway (only progressive download if moov is before mdat) */
1836 if(!url_is_streamed(pb
))
1837 atom
.size
= url_fsize(pb
);
1839 atom
.size
= INT64_MAX
;
1841 /* check MOV header */
1842 if ((err
= mov_read_default(mov
, pb
, atom
)) < 0) {
1843 av_log(s
, AV_LOG_ERROR
, "error reading header: %d\n", err
);
1846 if (!mov
->found_moov
) {
1847 av_log(s
, AV_LOG_ERROR
, "moov atom not found\n");
1850 dprintf(mov
->fc
, "on_parse_exit_offset=%lld\n", url_ftell(pb
));
1855 static int mov_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
1857 MOVContext
*mov
= s
->priv_data
;
1858 MOVStreamContext
*sc
= 0;
1859 AVIndexEntry
*sample
= 0;
1860 int64_t best_dts
= INT64_MAX
;
1863 for (i
= 0; i
< s
->nb_streams
; i
++) {
1864 AVStream
*st
= s
->streams
[i
];
1865 MOVStreamContext
*msc
= st
->priv_data
;
1866 if (st
->discard
!= AVDISCARD_ALL
&& msc
->pb
&& msc
->current_sample
< st
->nb_index_entries
) {
1867 AVIndexEntry
*current_sample
= &st
->index_entries
[msc
->current_sample
];
1868 int64_t dts
= av_rescale(current_sample
->timestamp
* (int64_t)msc
->time_rate
,
1869 AV_TIME_BASE
, msc
->time_scale
);
1870 dprintf(s
, "stream %d, sample %d, dts %"PRId64
"\n", i
, msc
->current_sample
, dts
);
1871 if (!sample
|| (url_is_streamed(s
->pb
) && current_sample
->pos
< sample
->pos
) ||
1872 (!url_is_streamed(s
->pb
) &&
1873 ((msc
->pb
!= s
->pb
&& dts
< best_dts
) || (msc
->pb
== s
->pb
&&
1874 ((FFABS(best_dts
- dts
) <= AV_TIME_BASE
&& current_sample
->pos
< sample
->pos
) ||
1875 (FFABS(best_dts
- dts
) > AV_TIME_BASE
&& dts
< best_dts
)))))) {
1876 sample
= current_sample
;
1883 mov
->found_mdat
= 0;
1884 if (!url_is_streamed(s
->pb
) ||
1885 mov_read_default(mov
, s
->pb
, (MOVAtom
){ 0, 0, INT64_MAX
}) < 0 ||
1888 dprintf(s
, "read fragments, offset 0x%llx\n", url_ftell(s
->pb
));
1891 /* must be done just before reading, to avoid infinite loop on sample */
1892 sc
->current_sample
++;
1893 if (url_fseek(sc
->pb
, sample
->pos
, SEEK_SET
) != sample
->pos
) {
1894 av_log(mov
->fc
, AV_LOG_ERROR
, "stream %d, offset 0x%"PRIx64
": partial file\n",
1895 sc
->ffindex
, sample
->pos
);
1898 ret
= av_get_packet(sc
->pb
, pkt
, sample
->size
);
1901 #if CONFIG_DV_DEMUXER
1902 if (mov
->dv_demux
&& sc
->dv_audio_container
) {
1903 dv_produce_packet(mov
->dv_demux
, pkt
, pkt
->data
, pkt
->size
);
1906 if (dv_get_packet(mov
->dv_demux
, pkt
) < 0)
1910 pkt
->stream_index
= sc
->ffindex
;
1911 pkt
->dts
= sample
->timestamp
;
1912 if (sc
->ctts_data
) {
1913 assert(sc
->ctts_data
[sc
->ctts_index
].duration
% sc
->time_rate
== 0);
1914 pkt
->pts
= pkt
->dts
+ sc
->ctts_data
[sc
->ctts_index
].duration
/ sc
->time_rate
;
1915 /* update ctts context */
1917 if (sc
->ctts_index
< sc
->ctts_count
&&
1918 sc
->ctts_data
[sc
->ctts_index
].count
== sc
->ctts_sample
) {
1920 sc
->ctts_sample
= 0;
1923 pkt
->dts
= AV_NOPTS_VALUE
;
1925 AVStream
*st
= s
->streams
[sc
->ffindex
];
1926 int64_t next_dts
= (sc
->current_sample
< st
->nb_index_entries
) ?
1927 st
->index_entries
[sc
->current_sample
].timestamp
: st
->duration
;
1928 pkt
->duration
= next_dts
- pkt
->dts
;
1929 pkt
->pts
= pkt
->dts
;
1931 pkt
->flags
|= sample
->flags
& AVINDEX_KEYFRAME
? PKT_FLAG_KEY
: 0;
1932 pkt
->pos
= sample
->pos
;
1933 dprintf(s
, "stream %d, pts %"PRId64
", dts %"PRId64
", pos 0x%"PRIx64
", duration %d\n",
1934 pkt
->stream_index
, pkt
->pts
, pkt
->dts
, pkt
->pos
, pkt
->duration
);
1938 static int mov_seek_stream(AVStream
*st
, int64_t timestamp
, int flags
)
1940 MOVStreamContext
*sc
= st
->priv_data
;
1941 int sample
, time_sample
;
1944 sample
= av_index_search_timestamp(st
, timestamp
, flags
);
1945 dprintf(st
->codec
, "stream %d, timestamp %"PRId64
", sample %d\n", st
->index
, timestamp
, sample
);
1946 if (sample
< 0) /* not sure what to do */
1948 sc
->current_sample
= sample
;
1949 dprintf(st
->codec
, "stream %d, found sample %d\n", st
->index
, sc
->current_sample
);
1950 /* adjust ctts index */
1951 if (sc
->ctts_data
) {
1953 for (i
= 0; i
< sc
->ctts_count
; i
++) {
1954 int next
= time_sample
+ sc
->ctts_data
[i
].count
;
1955 if (next
> sc
->current_sample
) {
1957 sc
->ctts_sample
= sc
->current_sample
- time_sample
;
1966 static int mov_read_seek(AVFormatContext
*s
, int stream_index
, int64_t sample_time
, int flags
)
1969 int64_t seek_timestamp
, timestamp
;
1973 if (stream_index
>= s
->nb_streams
)
1975 if (sample_time
< 0)
1978 st
= s
->streams
[stream_index
];
1979 sample
= mov_seek_stream(st
, sample_time
, flags
);
1983 /* adjust seek timestamp to found sample timestamp */
1984 seek_timestamp
= st
->index_entries
[sample
].timestamp
;
1986 for (i
= 0; i
< s
->nb_streams
; i
++) {
1988 if (stream_index
== i
|| st
->discard
== AVDISCARD_ALL
)
1991 timestamp
= av_rescale_q(seek_timestamp
, s
->streams
[stream_index
]->time_base
, st
->time_base
);
1992 mov_seek_stream(st
, timestamp
, flags
);
1997 static int mov_read_close(AVFormatContext
*s
)
1999 MOVContext
*mov
= s
->priv_data
;
2002 for (i
= 0; i
< s
->nb_streams
; i
++) {
2003 AVStream
*st
= s
->streams
[i
];
2004 MOVStreamContext
*sc
= st
->priv_data
;
2006 av_freep(&sc
->ctts_data
);
2007 for (j
= 0; j
< sc
->drefs_count
; j
++)
2008 av_freep(&sc
->drefs
[j
].path
);
2009 av_freep(&sc
->drefs
);
2010 if (sc
->pb
&& sc
->pb
!= s
->pb
)
2013 av_freep(&st
->codec
->palctrl
);
2016 if (mov
->dv_demux
) {
2017 for(i
= 0; i
< mov
->dv_fctx
->nb_streams
; i
++) {
2018 av_freep(&mov
->dv_fctx
->streams
[i
]->codec
);
2019 av_freep(&mov
->dv_fctx
->streams
[i
]);
2021 av_freep(&mov
->dv_fctx
);
2022 av_freep(&mov
->dv_demux
);
2025 av_freep(&mov
->trex_data
);
2030 AVInputFormat mov_demuxer
= {
2031 "mov,mp4,m4a,3gp,3g2,mj2",
2032 NULL_IF_CONFIG_SMALL("QuickTime/MPEG-4/Motion JPEG 2000 format"),