annotate mov.c @ 587:fe24632a577b libavformat

allocate a few bytes more for extradata so the bitstream reader if its used by the codec for parsing extardata, doesnt read over the end
author michael
date Sat, 13 Nov 2004 01:27:35 +0000
parents 89bd76208427
children adc5295cd0a2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2 * MOV decoder.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Copyright (c) 2001 Fabrice Bellard.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
4 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
9 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
18 */
395
c1ed10f3b052 cleanup frame_rate code, this may also fix some large file bugs
michael
parents: 383
diff changeset
19
c1ed10f3b052 cleanup frame_rate code, this may also fix some large file bugs
michael
parents: 383
diff changeset
20 #include <limits.h>
c1ed10f3b052 cleanup frame_rate code, this may also fix some large file bugs
michael
parents: 383
diff changeset
21
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
22 #include "avformat.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23 #include "avi.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
24
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25 #ifdef CONFIG_ZLIB
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
26 #include <zlib.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
28
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
29 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
30 * First version by Francois Revol revol@free.fr
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
31 * Seek function by Gael Chardon gael.dev@4now.net
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
32 *
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
33 * Features and limitations:
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
34 * - reads most of the QT files I have (at least the structure),
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
35 * the exceptions are .mov with zlib compressed headers ('cmov' section). It shouldn't be hard to implement.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
36 * FIXED, Francois Revol, 07/17/2002
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
37 * - ffmpeg has nearly none of the usual QuickTime codecs,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
38 * although I succesfully dumped raw and mp3 audio tracks off .mov files.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
39 * Sample QuickTime files with mp3 audio can be found at: http://www.3ivx.com/showcase.html
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40 * - .mp4 parsing is still hazardous, although the format really is QuickTime with some minor changes
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41 * (to make .mov parser crash maybe ?), despite what they say in the MPEG FAQ at
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
42 * http://mpeg.telecomitalialab.com/faq.htm
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
43 * - the code is quite ugly... maybe I won't do it recursive next time :-)
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
44 * - seek is not supported with files that contain edit list
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
45 *
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
46 * Funny I didn't know about http://sourceforge.net/projects/qt-ffmpeg/
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
47 * when coding this :) (it's a writer anyway)
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
48 *
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49 * Reference documents:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
50 * http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
51 * Apple:
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
52 * http://developer.apple.com/documentation/QuickTime/QTFF/
506
74ad3aa6749c 2000/00/00 to 2001/03/01 QT fileformat documentation patch by (Sebastien Bechet <s.bechet at av7 dot net>)
michael
parents: 500
diff changeset
53 * http://developer.apple.com/documentation/QuickTime/QTFF/qtff.pdf
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
54 * QuickTime is a trademark of Apple (AFAIK :))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
55 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
56
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
57 //#define DEBUG
132
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
58 #ifdef DEBUG
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
59 #include <stdio.h>
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
60 #include <fcntl.h>
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
61 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
62
302
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
63 #include "qtpalette.h"
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
64
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
65
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
66 /* Allows seeking (MOV_SPLIT_CHUNKS should also be defined) */
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
67 #define MOV_SEEK
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
68
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
69 /* allows chunk splitting - should work now... */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
70 /* in case you can't read a file, try commenting */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
71 #define MOV_SPLIT_CHUNKS
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
72
147
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
73 /* Special handling for movies created with Minolta Dimaxe Xi*/
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
74 /* this fix should not interfere with other .mov files, but just in case*/
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
75 #define MOV_MINOLTA_FIX
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
76
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
77 /* some streams in QT (and in MP4 mostly) aren't either video nor audio */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
78 /* so we first list them as this, then clean up the list of streams we give back, */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
79 /* getting rid of these */
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
80 #define CODEC_TYPE_MOV_OTHER (enum CodecType) 2
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
81
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
82 static const CodecTag mov_video_tags[] = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
83 /* { CODEC_ID_, MKTAG('c', 'v', 'i', 'd') }, *//* Cinepak */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
84 /* { CODEC_ID_H263, MKTAG('r', 'a', 'w', ' ') }, *//* Uncompressed RGB */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
85 /* { CODEC_ID_H263, MKTAG('Y', 'u', 'v', '2') }, *//* Uncompressed YUV422 */
101
0865b0aaa2af QT AVID 4CCs patch by ("Sebastien Bechet" <s dot bechet at av7 dot net>) (not tested)
mmu_man
parents: 85
diff changeset
86 /* { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', 'U', 'I') }, *//* YUV with alpha-channel (AVID Uncompressed) */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
87 /* Graphics */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
88 /* Animation */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
89 /* Apple video */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
90 /* Kodak Photo CD */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
91 { CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') }, /* PhotoJPEG */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
92 { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'e', 'g') }, /* MPEG */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
93 { CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'a') }, /* Motion-JPEG (format A) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
94 { CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'b') }, /* Motion-JPEG (format B) */
101
0865b0aaa2af QT AVID 4CCs patch by ("Sebastien Bechet" <s dot bechet at av7 dot net>) (not tested)
mmu_man
parents: 85
diff changeset
95 { CODEC_ID_MJPEG, MKTAG('A', 'V', 'D', 'J') }, /* MJPEG with alpha-channel (AVID JFIF meridien compressed) */
0865b0aaa2af QT AVID 4CCs patch by ("Sebastien Bechet" <s dot bechet at av7 dot net>) (not tested)
mmu_man
parents: 85
diff changeset
96 /* { CODEC_ID_MJPEG, MKTAG('A', 'V', 'R', 'n') }, *//* MJPEG with alpha-channel (AVID ABVB/Truevision NuVista) */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
97 /* { CODEC_ID_GIF, MKTAG('g', 'i', 'f', ' ') }, *//* embedded gif files as frames (usually one "click to play movie" frame) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
98 /* Sorenson video */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99 { CODEC_ID_SVQ1, MKTAG('S', 'V', 'Q', '1') }, /* Sorenson Video v1 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 { CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') }, /* Sorenson Video v1 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
101 { CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', 'i') }, /* Sorenson Video v1 (from QT specs)*/
129
b1843685a8f7 svq3 decoder by anonymous
michaelni
parents: 124
diff changeset
102 { CODEC_ID_SVQ3, MKTAG('S', 'V', 'Q', '3') }, /* Sorenson Video v3 */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103 { CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104 { CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') }, /* OpenDiVX *//* sample files at http://heroinewarrior.com/xmovie.php3 use this tag */
289
4baa098c12c3 added XVID fourcc (ISO MPEG-4?) and AC3 fourcc
melanson
parents: 286
diff changeset
105 { CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') },
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106 /* { CODEC_ID_, MKTAG('I', 'V', '5', '0') }, *//* Indeo 5.0 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 { CODEC_ID_H263, MKTAG('h', '2', '6', '3') }, /* H263 */
133
31f0dda651f8 * added s263 (mapped to h263 - 3gp files)
kabi
parents: 132
diff changeset
108 { CODEC_ID_H263, MKTAG('s', '2', '6', '3') }, /* H263 ?? works */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
109 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') }, /* DV NTSC */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 'p') }, /* DV PAL */
101
0865b0aaa2af QT AVID 4CCs patch by ("Sebastien Bechet" <s dot bechet at av7 dot net>) (not tested)
mmu_man
parents: 85
diff changeset
111 /* { CODEC_ID_DVVIDEO, MKTAG('A', 'V', 'd', 'v') }, *//* AVID dv */
124
a1ad0f8b75bf first pass at a new VP3 video decoder
tmmm
parents: 121
diff changeset
112 { CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') }, /* On2 VP3 */
266
8bb470d85249 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 258
diff changeset
113 { CODEC_ID_RPZA, MKTAG('r', 'p', 'z', 'a') }, /* Apple Video (RPZA) */
8bb470d85249 New demuxers: Sega FILM/CPK, Westwood VQA & AUD; new decoders: MS RLE &
tmmm
parents: 258
diff changeset
114 { CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') }, /* Cinepak */
301
4513d5ab9eb5 8BPS decoder
rtognimp
parents: 289
diff changeset
115 { CODEC_ID_8BPS, MKTAG('8', 'B', 'P', 'S') }, /* Planar RGB (8BPS) */
302
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
116 { CODEC_ID_SMC, MKTAG('s', 'm', 'c', ' ') }, /* Apple Graphics (SMC) */
358
d18a2b1fc182 initial commit for Quicktime Animation (RLE) video decoder; bit depths
melanson
parents: 308
diff changeset
117 { CODEC_ID_QTRLE, MKTAG('r', 'l', 'e', ' ') }, /* Apple Animation (RLE) */
533
59da52e5f5a5 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents: 506
diff changeset
118 { CODEC_ID_QDRAW, MKTAG('q', 'd', 'r', 'w') }, /* QuickDraw */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
119 { CODEC_ID_NONE, 0 },
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
120 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
121
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122 static const CodecTag mov_audio_tags[] = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
123 /* { CODEC_ID_PCM_S16BE, MKTAG('N', 'O', 'N', 'E') }, *//* uncompressed */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
124 { CODEC_ID_PCM_S16BE, MKTAG('t', 'w', 'o', 's') }, /* 16 bits */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
125 /* { CODEC_ID_PCM_S8, MKTAG('t', 'w', 'o', 's') },*/ /* 8 bits */
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
126 { CODEC_ID_PCM_U8, MKTAG('r', 'a', 'w', ' ') }, /* 8 bits unsigned */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127 { CODEC_ID_PCM_S16LE, MKTAG('s', 'o', 'w', 't') }, /* */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
128 { CODEC_ID_PCM_MULAW, MKTAG('u', 'l', 'a', 'w') }, /* */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
129 { CODEC_ID_PCM_ALAW, MKTAG('a', 'l', 'a', 'w') }, /* */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130 { CODEC_ID_ADPCM_IMA_QT, MKTAG('i', 'm', 'a', '4') }, /* IMA-4 ADPCM */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131 { CODEC_ID_MACE3, MKTAG('M', 'A', 'C', '3') }, /* Macintosh Audio Compression and Expansion 3:1 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
132 { CODEC_ID_MACE6, MKTAG('M', 'A', 'C', '6') }, /* Macintosh Audio Compression and Expansion 6:1 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
134 { CODEC_ID_MP2, MKTAG('.', 'm', 'p', '3') }, /* MPEG layer 3 */ /* sample files at http://www.3ivx.com/showcase.html use this tag */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
135 { CODEC_ID_MP2, 0x6D730055 }, /* MPEG layer 3 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
136 { CODEC_ID_MP2, 0x5500736D }, /* MPEG layer 3 *//* XXX: check endianness */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
137 /* { CODEC_ID_OGG_VORBIS, MKTAG('O', 'g', 'g', 'S') }, *//* sample files at http://heroinewarrior.com/xmovie.php3 use this tag */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
138 /* MP4 tags */
286
eccf0c3e3289 Using the extension m4a for audio only MPEG-4 files is increasingly
michael
parents: 266
diff changeset
139 { CODEC_ID_MPEG4AAC, MKTAG('m', 'p', '4', 'a') }, /* MPEG-4 AAC */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
140 /* The standard for mpeg4 audio is still not normalised AFAIK anyway */
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
141 { CODEC_ID_AMR_NB, MKTAG('s', 'a', 'm', 'r') }, /* AMR-NB 3gp */
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 191
diff changeset
142 { CODEC_ID_AMR_WB, MKTAG('s', 'a', 'w', 'b') }, /* AMR-WB 3gp */
289
4baa098c12c3 added XVID fourcc (ISO MPEG-4?) and AC3 fourcc
melanson
parents: 286
diff changeset
143 { CODEC_ID_AC3, MKTAG('m', 's', 0x20, 0x00) }, /* Dolby AC-3 */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
144 { CODEC_ID_NONE, 0 },
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
145 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
146
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
147 /* the QuickTime file format is quite convoluted...
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
148 * it has lots of index tables, each indexing something in another one...
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 * Here we just use what is needed to read the chunks
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
150 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
151
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
152 typedef struct MOV_sample_to_chunk_tbl {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
153 long first;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
154 long count;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
155 long id;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
156 } MOV_sample_to_chunk_tbl;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
157
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
158 typedef struct {
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
159 uint32_t type;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
160 int64_t offset;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
161 int64_t size; /* total size (excluding the size and type fields) */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
162 } MOV_atom_t;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
163
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
164 typedef struct {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
165 int seed;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
166 int flags;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
167 int size;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
168 void* clrs;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
169 } MOV_ctab_t;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
170
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
171 typedef struct {
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
172 uint8_t version;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
173 uint32_t flags; // 24bit
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
174
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
175 /* 0x03 ESDescrTag */
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
176 uint16_t es_id;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
177 #define MP4ODescrTag 0x01
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
178 #define MP4IODescrTag 0x02
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
179 #define MP4ESDescrTag 0x03
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
180 #define MP4DecConfigDescrTag 0x04
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
181 #define MP4DecSpecificDescrTag 0x05
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
182 #define MP4SLConfigDescrTag 0x06
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
183 #define MP4ContentIdDescrTag 0x07
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
184 #define MP4SupplContentIdDescrTag 0x08
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
185 #define MP4IPIPtrDescrTag 0x09
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
186 #define MP4IPMPPtrDescrTag 0x0A
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
187 #define MP4IPMPDescrTag 0x0B
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
188 #define MP4RegistrationDescrTag 0x0D
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
189 #define MP4ESIDIncDescrTag 0x0E
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
190 #define MP4ESIDRefDescrTag 0x0F
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
191 #define MP4FileIODescrTag 0x10
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
192 #define MP4FileODescrTag 0x11
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
193 #define MP4ExtProfileLevelDescrTag 0x13
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
194 #define MP4ExtDescrTagsStart 0x80
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
195 #define MP4ExtDescrTagsEnd 0xFE
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
196 uint8_t stream_priority;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
197
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
198 /* 0x04 DecConfigDescrTag */
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
199 uint8_t object_type_id;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
200 uint8_t stream_type;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
201 /* XXX: really streamType is
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
202 * only 6bit, followed by:
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
203 * 1bit upStream
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
204 * 1bit reserved
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
205 */
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
206 uint32_t buffer_size_db; // 24
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
207 uint32_t max_bitrate;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
208 uint32_t avg_bitrate;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
209
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
210 /* 0x05 DecSpecificDescrTag */
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
211 uint8_t decoder_cfg_len;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
212 uint8_t *decoder_cfg;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
213
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
214 /* 0x06 SLConfigDescrTag */
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
215 uint8_t sl_config_len;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
216 uint8_t *sl_config;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
217 } MOV_esds_t;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
218
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
219 struct MOVParseTableEntry;
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
220
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
221 typedef struct MOVStreamContext {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
222 int ffindex; /* the ffmpeg stream id */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
223 int is_ff_stream; /* Is this stream presented to ffmpeg ? i.e. is this an audio or video stream ? */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
224 long next_chunk;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
225 long chunk_count;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 25
diff changeset
226 int64_t *chunk_offsets;
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
227 int32_t stts_count;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
228 uint64_t *stts_data; /* concatenated data from the time-to-sample atom (count|duration) */
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
229 int32_t edit_count; /* number of 'edit' (elst atom) */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
230 long sample_to_chunk_sz;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
231 MOV_sample_to_chunk_tbl *sample_to_chunk;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
232 long sample_to_chunk_index;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
233 long sample_size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
234 long sample_count;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
235 long *sample_sizes;
383
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
236 long keyframe_count;
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
237 long *keyframes;
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
238 int time_scale;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
239 long current_sample;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
240 long left_in_chunk; /* how many samples before next chunk */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
241 /* specific MPEG4 header which is added at the beginning of the stream */
549
4623f54c98bb * fixing a few of gcc 'clean-code' warnings
kabi
parents: 533
diff changeset
242 unsigned int header_len;
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
243 uint8_t *header_data;
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
244 MOV_esds_t esds;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
245 } MOVStreamContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
246
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
247 typedef struct MOVContext {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
248 int mp4; /* set to 1 as soon as we are sure that the file is an .mp4 file (even some header parsing depends on this) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
249 AVFormatContext *fc;
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
250 int time_scale;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
251 int duration; /* duration of the longest track */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
252 int found_moov; /* when both 'moov' and 'mdat' sections has been found */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
253 int found_mdat; /* we suppose we have enough data to read the file */
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 25
diff changeset
254 int64_t mdat_size;
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 25
diff changeset
255 int64_t mdat_offset;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
256 int total_streams;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
257 /* some streams listed here aren't presented to the ffmpeg API, since they aren't either video nor audio
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
258 * but we need the info to be able to skip data from those streams in the 'mdat' section
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
259 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
260 MOVStreamContext *streams[MAX_STREAMS];
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
261
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 25
diff changeset
262 int64_t next_chunk_offset;
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
263 MOVStreamContext *partial; /* != 0 : there is still to read in the current chunk */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
264 int ctab_size;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
265 MOV_ctab_t **ctab; /* color tables */
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
266 const struct MOVParseTableEntry *parse_table; /* could be eventually used to change the table */
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
267 /* NOTE: for recursion save to/ restore from local variable! */
302
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
268
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
269 AVPaletteControl palette_control;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
270 } MOVContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
271
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
272
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
273 /* XXX: it's the first time I make a recursive parser I think... sorry if it's ugly :P */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
274
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
275 /* those functions parse an atom */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
276 /* return code:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
277 1: found what I wanted, exit
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
278 0: continue to parse next atom
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
279 -1: error occured, exit
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
280 */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
281 typedef int (*mov_parse_function)(MOVContext *ctx, ByteIOContext *pb, MOV_atom_t atom);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
282
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
283 /* links atom IDs to parse functions */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
284 typedef struct MOVParseTableEntry {
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 25
diff changeset
285 uint32_t type;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
286 mov_parse_function func;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
287 } MOVParseTableEntry;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
288
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
289 #ifdef DEBUG
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
290 /*
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
291 * XXX: static sux, even more in a multithreaded environment...
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
292 * Avoid them. This is here just to help debugging.
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
293 */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
294 static int debug_indent = 0;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
295 void print_atom(const char *str, MOV_atom_t atom)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
296 {
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
297 unsigned int tag, i;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
298 tag = (unsigned int) atom.type;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
299 i=debug_indent;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
300 if(tag == 0) tag = MKTAG('N', 'U', 'L', 'L');
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
301 while(i--)
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
302 av_log(NULL, AV_LOG_DEBUG, "|");
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
303 av_log(NULL, AV_LOG_DEBUG, "parse:");
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
304 av_log(NULL, AV_LOG_DEBUG, " %s: tag=%c%c%c%c offset=0x%x size=0x%x\n",
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
305 str, tag & 0xff,
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
306 (tag >> 8) & 0xff,
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
307 (tag >> 16) & 0xff,
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
308 (tag >> 24) & 0xff,
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
309 (unsigned int)atom.offset,
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
310 (unsigned int)atom.size);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
311 assert((unsigned int)atom.size < 0x7fffffff);// catching errors
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
312 }
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
313 #else
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
314 #define print_atom(a,b)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
315 #endif
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
316
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
317
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
318 static int mov_read_leaf(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
319 {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
320 print_atom("leaf", atom);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
321
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
322 if (atom.size>1)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
323 url_fskip(pb, atom.size);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
324 /* url_seek(pb, atom_offset+atom.size, SEEK_SET); */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
325 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
326 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
327
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
328 static int mov_read_default(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
329 {
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
330 int64_t total_size = 0;
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
331 MOV_atom_t a;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
332 int i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
333 int err = 0;
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
334
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
335 #ifdef DEBUG
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
336 print_atom("default", atom);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
337 debug_indent++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
338 #endif
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
339
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
340 a.offset = atom.offset;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
341
132
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
342 if (atom.size < 0)
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
343 atom.size = 0x7fffffffffffffffLL;
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
344 while(((total_size + 8) < atom.size) && !url_feof(pb) && !err) {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
345 a.size = atom.size;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
346 a.type=0L;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
347 if(atom.size >= 8) {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
348 a.size = get_be32(pb);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
349 a.type = get_le32(pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
350 }
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
351 total_size += 8;
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
352 a.offset += 8;
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
353 //av_log(NULL, AV_LOG_DEBUG, "type: %08x %.4s sz: %Lx %Lx %Lx\n", type, (char*)&type, size, atom.size, total_size);
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
354 if (a.size == 1) { /* 64 bit extended size */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
355 a.size = get_be64(pb) - 8;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
356 a.offset += 8;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
357 total_size += 8;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
358 }
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
359 if (a.size == 0) {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
360 a.size = atom.size - total_size;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
361 if (a.size <= 8)
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
362 break;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
363 }
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
364 for (i = 0; c->parse_table[i].type != 0L
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
365 && c->parse_table[i].type != a.type; i++)
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
366 /* empty */;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
367
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
368 a.size -= 8;
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
369 // av_log(NULL, AV_LOG_DEBUG, " i=%ld\n", i);
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
370 if (c->parse_table[i].type == 0) { /* skip leaf atoms data */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
371 // url_seek(pb, atom.offset+atom.size, SEEK_SET);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
372 #ifdef DEBUG
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
373 print_atom("unknown", a);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
374 #endif
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
375 url_fskip(pb, a.size);
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
376 } else {
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
377 #ifdef DEBUG
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
378 //char b[5] = { type & 0xff, (type >> 8) & 0xff, (type >> 16) & 0xff, (type >> 24) & 0xff, 0 };
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
379 //print_atom(b, type, offset, size);
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
380 #endif
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
381 err = (c->parse_table[i].func)(c, pb, a);
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
382 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
383
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
384 a.offset += a.size;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
385 total_size += a.size;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
386 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
387
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
388 if (!err && total_size < atom.size && atom.size < 0x7ffff) {
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
389 //av_log(NULL, AV_LOG_DEBUG, "RESET %Ld %Ld err:%d\n", atom.size, total_size, err);
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
390 url_fskip(pb, atom.size - total_size);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
391 }
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
392
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
393 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
394 debug_indent--;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
395 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
396 return err;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
397 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
398
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
399 static int mov_read_ctab(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
400 {
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
401 unsigned int len;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
402 MOV_ctab_t *t;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
403 //url_fskip(pb, atom.size); // for now
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
404 c->ctab = av_realloc(c->ctab, ++c->ctab_size);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
405 t = c->ctab[c->ctab_size];
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
406 t->seed = get_be32(pb);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
407 t->flags = get_be16(pb);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
408 t->size = get_be16(pb) + 1;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
409 len = 2 * t->size * 4;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
410 if (len > 0) {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
411 t->clrs = av_malloc(len); // 16bit A R G B
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
412 if (t->clrs)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
413 get_buffer(pb, t->clrs, len);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
414 }
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
415
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
416 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
417 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
418
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
419 static int mov_read_hdlr(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
420 {
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
421 AVStream *st = c->fc->streams[c->fc->nb_streams-1];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
422 int len = 0;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 25
diff changeset
423 uint32_t type;
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 25
diff changeset
424 uint32_t ctype;
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
425
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
426 print_atom("hdlr", atom);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
427
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
428 get_byte(pb); /* version */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
429 get_byte(pb); get_byte(pb); get_byte(pb); /* flags */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
430
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
431 /* component type */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
432 ctype = get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
433 type = get_le32(pb); /* component subtype */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
434
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
435 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
436 av_log(NULL, AV_LOG_DEBUG, "ctype= %c%c%c%c (0x%08lx)\n", *((char *)&ctype), ((char *)&ctype)[1], ((char *)&ctype)[2], ((char *)&ctype)[3], (long) ctype);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
437 av_log(NULL, AV_LOG_DEBUG, "stype= %c%c%c%c\n", *((char *)&type), ((char *)&type)[1], ((char *)&type)[2], ((char *)&type)[3]);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
438 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
439 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
440 /* XXX: yeah this is ugly... */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
441 if(ctype == MKTAG('m', 'h', 'l', 'r')) { /* MOV */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
442 if(type == MKTAG('v', 'i', 'd', 'e'))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
443 puts("hdlr: vide");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
444 else if(type == MKTAG('s', 'o', 'u', 'n'))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
445 puts("hdlr: soun");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
446 } else if(ctype == 0) { /* MP4 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
447 if(type == MKTAG('v', 'i', 'd', 'e'))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
448 puts("hdlr: vide");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
449 else if(type == MKTAG('s', 'o', 'u', 'n'))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
450 puts("hdlr: soun");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
451 else if(type == MKTAG('o', 'd', 's', 'm'))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
452 puts("hdlr: odsm");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
453 else if(type == MKTAG('s', 'd', 's', 'm'))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
454 puts("hdlr: sdsm");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
455 } else puts("hdlr: meta");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
456 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
457
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
458 if(ctype == MKTAG('m', 'h', 'l', 'r')) { /* MOV */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
459 /* helps parsing the string hereafter... */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
460 c->mp4 = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
461 if(type == MKTAG('v', 'i', 'd', 'e'))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
462 st->codec.codec_type = CODEC_TYPE_VIDEO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
463 else if(type == MKTAG('s', 'o', 'u', 'n'))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
464 st->codec.codec_type = CODEC_TYPE_AUDIO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
465 } else if(ctype == 0) { /* MP4 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
466 /* helps parsing the string hereafter... */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
467 c->mp4 = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
468 if(type == MKTAG('v', 'i', 'd', 'e'))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
469 st->codec.codec_type = CODEC_TYPE_VIDEO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
470 else if(type == MKTAG('s', 'o', 'u', 'n'))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
471 st->codec.codec_type = CODEC_TYPE_AUDIO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
472 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
473 get_be32(pb); /* component manufacture */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
474 get_be32(pb); /* component flags */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
475 get_be32(pb); /* component flags mask */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
476
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
477 if(atom.size <= 24)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
478 return 0; /* nothing left to read */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
479 /* XXX: MP4 uses a C string, not a pascal one */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
480 /* component name */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
481
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
482 if(c->mp4) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
483 /* .mp4: C string */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
484 while(get_byte(pb) && (++len < (atom.size - 24)));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
485 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
486 /* .mov: PASCAL string */
132
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
487 #ifdef DEBUG
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
488 char* buf;
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
489 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
490 len = get_byte(pb);
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
491 #ifdef DEBUG
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
492 buf = (uint8_t*) av_malloc(len+1);
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
493 if (buf) {
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
494 get_buffer(pb, buf, len);
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
495 buf[len] = '\0';
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
496 av_log(NULL, AV_LOG_DEBUG, "**buf='%s'\n", buf);
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
497 av_free(buf);
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
498 } else
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
499 #endif
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
500 url_fskip(pb, len);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
501 }
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
502
489
aeb69a5f3756 The atom 'skip' should be handled by 'mov_read_leaf()', not by
michael
parents: 438
diff changeset
503 url_fskip(pb, atom.size - (url_ftell(pb) - atom.offset));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
504 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
505 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
506
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
507 static int mov_mp4_read_descr_len(ByteIOContext *pb)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
508 {
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
509 int len = 0;
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
510 int count = 4;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
511 while (count--) {
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
512 int c = get_byte(pb);
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
513 len = (len << 7) | (c & 0x7f);
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
514 if (!(c & 0x80))
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
515 break;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
516 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
517 return len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
518 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
519
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
520 static int mov_mp4_read_descr(ByteIOContext *pb, int *tag)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
521 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
522 int len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
523 *tag = get_byte(pb);
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
524 len = mov_mp4_read_descr_len(pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
525 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
526 av_log(NULL, AV_LOG_DEBUG, "MPEG4 description: tag=0x%02x len=%d\n", *tag, len);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
527 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
528 return len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
529 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
530
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
531 static inline unsigned int get_be24(ByteIOContext *s)
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
532 {
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
533 unsigned int val;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
534 val = get_byte(s) << 16;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
535 val |= get_byte(s) << 8;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
536 val |= get_byte(s);
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
537 return val;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
538 }
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
539
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
540 static int mov_read_esds(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
541 {
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
542 AVStream *st = c->fc->streams[c->fc->nb_streams-1];
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
543 MOVStreamContext *sc = (MOVStreamContext *)st->priv_data;
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
544 int64_t start_pos = url_ftell(pb);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
545 int tag, len;
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
546
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
547 print_atom("esds", atom);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
548
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
549 /* Well, broken but suffisant for some MP4 streams */
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
550 get_be32(pb); /* version + flags */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
551 len = mov_mp4_read_descr(pb, &tag);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
552 if (tag == MP4ESDescrTag) {
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
553 get_be16(pb); /* ID */
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
554 get_byte(pb); /* priority */
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
555 } else
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
556 get_be16(pb); /* ID */
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
557
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
558 len = mov_mp4_read_descr(pb, &tag);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
559 if (tag == MP4DecConfigDescrTag) {
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
560 sc->esds.object_type_id = get_byte(pb);
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
561 sc->esds.stream_type = get_byte(pb);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
562 sc->esds.buffer_size_db = get_be24(pb);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
563 sc->esds.max_bitrate = get_be32(pb);
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
564 sc->esds.avg_bitrate = get_be32(pb);
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
565
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
566 len = mov_mp4_read_descr(pb, &tag);
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
567 //av_log(NULL, AV_LOG_DEBUG, "LEN %d TAG %d m:%d a:%d\n", len, tag, sc->esds.max_bitrate, sc->esds.avg_bitrate);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
568 if (tag == MP4DecSpecificDescrTag) {
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
569 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
570 av_log(NULL, AV_LOG_DEBUG, "Specific MPEG4 header len=%d\n", len);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
571 #endif
587
fe24632a577b allocate a few bytes more for extradata so the bitstream reader if its used by the codec for parsing extardata, doesnt read over the end
michael
parents: 558
diff changeset
572 st->codec.extradata = (uint8_t*) av_mallocz(len + FF_INPUT_BUFFER_PADDING_SIZE);
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
573 if (st->codec.extradata) {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
574 get_buffer(pb, st->codec.extradata, len);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
575 st->codec.extradata_size = len;
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
576 }
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
577 }
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
578 }
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
579 /* in any case, skip garbage */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
580 url_fskip(pb, atom.size - ((url_ftell(pb) - start_pos)));
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
581 return 0;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
582 }
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
583
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
584 /* this atom contains actual media data */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
585 static int mov_read_mdat(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
586 {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
587 print_atom("mdat", atom);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
588
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
589 if(atom.size == 0) /* wrong one (MP4) */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
590 return 0;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
591 c->found_mdat=1;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
592 c->mdat_offset = atom.offset;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
593 c->mdat_size = atom.size;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
594 if(c->found_moov)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
595 return 1; /* found both, just go */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
596 url_fskip(pb, atom.size);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
597 return 0; /* now go for moov */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
598 }
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
599
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
600 /* this atom should contain all header atoms */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
601 static int mov_read_moov(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
602 {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
603 int err;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
604
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
605 print_atom("moov", atom);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
606
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
607 err = mov_read_default(c, pb, atom);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
608 /* we parsed the 'moov' atom, we can terminate the parsing as soon as we find the 'mdat' */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
609 /* so we don't parse the whole file if over a network */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
610 c->found_moov=1;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
611 if(c->found_mdat)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
612 return 1; /* found both, just go */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
613 return 0; /* now go for mdat */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
614 }
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
615
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
616
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
617 static int mov_read_mdhd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
618 {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
619 print_atom("mdhd", atom);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
620
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
621 get_byte(pb); /* version */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
622
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
623 get_byte(pb); get_byte(pb);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
624 get_byte(pb); /* flags */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
625
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
626 get_be32(pb); /* creation time */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
627 get_be32(pb); /* modification time */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
628
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
629 c->streams[c->fc->nb_streams-1]->time_scale = get_be32(pb);
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
630
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
631 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
632 av_log(NULL, AV_LOG_DEBUG, "track[%i].time_scale = %i\n", c->fc->nb_streams-1, c->streams[c->fc->nb_streams-1]->time_scale); /* time scale */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
633 #endif
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
634 get_be32(pb); /* duration */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
635
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
636 get_be16(pb); /* language */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
637 get_be16(pb); /* quality */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
638
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
639 return 0;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
640 }
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
641
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
642 static int mov_read_mvhd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
643 {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
644 print_atom("mvhd", atom);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
645
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
646 get_byte(pb); /* version */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
647 get_byte(pb); get_byte(pb); get_byte(pb); /* flags */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
648
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
649 get_be32(pb); /* creation time */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
650 get_be32(pb); /* modification time */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
651 c->time_scale = get_be32(pb); /* time scale */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
652 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
653 av_log(NULL, AV_LOG_DEBUG, "time scale = %i\n", c->time_scale);
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
654 #endif
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
655 c->duration = get_be32(pb); /* duration */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
656 get_be32(pb); /* preferred scale */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
657
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
658 get_be16(pb); /* preferred volume */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
659
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
660 url_fskip(pb, 10); /* reserved */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
661
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
662 url_fskip(pb, 36); /* display matrix */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
663
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
664 get_be32(pb); /* preview time */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
665 get_be32(pb); /* preview duration */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
666 get_be32(pb); /* poster time */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
667 get_be32(pb); /* selection time */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
668 get_be32(pb); /* selection duration */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
669 get_be32(pb); /* current time */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
670 get_be32(pb); /* next track ID */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
671
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
672 return 0;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
673 }
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
674
132
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
675 static int mov_read_smi(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
676 {
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
677 AVStream *st = c->fc->streams[c->fc->nb_streams-1];
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
678
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
679 // currently SVQ3 decoder expect full STSD header - so let's fake it
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
680 // this should be fixed and just SMI header should be passed
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
681 av_free(st->codec.extradata);
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
682 st->codec.extradata_size = 0x5a + atom.size;
587
fe24632a577b allocate a few bytes more for extradata so the bitstream reader if its used by the codec for parsing extardata, doesnt read over the end
michael
parents: 558
diff changeset
683 st->codec.extradata = (uint8_t*) av_mallocz(st->codec.extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
132
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
684
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
685 if (st->codec.extradata) {
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
686 strcpy(st->codec.extradata, "SVQ3"); // fake
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
687 get_buffer(pb, st->codec.extradata + 0x5a, atom.size);
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
688 //av_log(NULL, AV_LOG_DEBUG, "Reading SMI %Ld %s\n", atom.size, (char*)st->codec.extradata + 0x5a);
132
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
689 } else
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
690 url_fskip(pb, atom.size);
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
691
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
692 return 0;
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
693 }
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
694
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
695 static int mov_read_stco(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
696 {
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
697 AVStream *st = c->fc->streams[c->fc->nb_streams-1];
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
698 MOVStreamContext *sc = (MOVStreamContext *)st->priv_data;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
699 int entries, i;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
700
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
701 print_atom("stco", atom);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
702
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
703 get_byte(pb); /* version */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
704 get_byte(pb); get_byte(pb); get_byte(pb); /* flags */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
705
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
706 entries = get_be32(pb);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
707 sc->chunk_count = entries;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
708 sc->chunk_offsets = (int64_t*) av_malloc(entries * sizeof(int64_t));
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
709 if (!sc->chunk_offsets)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
710 return -1;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
711 if (atom.type == MKTAG('s', 't', 'c', 'o')) {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
712 for(i=0; i<entries; i++) {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
713 sc->chunk_offsets[i] = get_be32(pb);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
714 }
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
715 } else if (atom.type == MKTAG('c', 'o', '6', '4')) {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
716 for(i=0; i<entries; i++) {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
717 sc->chunk_offsets[i] = get_be64(pb);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
718 }
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
719 } else
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
720 return -1;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
721 #ifdef DEBUG
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
722 /*
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
723 for(i=0; i<entries; i++) {
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
724 av_log(NULL, AV_LOG_DEBUG, "chunk offset=0x%Lx\n", sc->chunk_offsets[i]);
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
725 }
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
726 */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
727 #endif
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
728 return 0;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
729 }
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
730
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
731 static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
732 {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
733 AVStream *st = c->fc->streams[c->fc->nb_streams-1];
131
5bb5f3d201d6 * uninitialized/unused vars cleanup
kabi
parents: 130
diff changeset
734 //MOVStreamContext *sc = (MOVStreamContext *)st->priv_data;
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
735 int entries, frames_per_sample;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 25
diff changeset
736 uint32_t format;
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
737
302
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
738 /* for palette traversal */
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
739 int color_depth;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
740 int color_start;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
741 int color_count;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
742 int color_end;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
743 int color_index;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
744 int color_dec;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
745 int color_greyscale;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
746 unsigned char *color_table;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
747 int j;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
748 unsigned char r, g, b;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
749
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
750 print_atom("stsd", atom);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
751
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
752 get_byte(pb); /* version */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
753 get_byte(pb); get_byte(pb); get_byte(pb); /* flags */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
754
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
755 entries = get_be32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
756
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
757 while(entries--) { //Parsing Sample description table
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
758 enum CodecID id;
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
759 int size = get_be32(pb); /* size */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
760 format = get_le32(pb); /* data format */
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
761
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
762 get_be32(pb); /* reserved */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
763 get_be16(pb); /* reserved */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
764 get_be16(pb); /* index */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
765
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
766 /* for MPEG4: set codec type by looking for it */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
767 id = codec_get_id(mov_video_tags, format);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
768 if (id >= 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
769 AVCodec *codec;
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
770 codec = avcodec_find_decoder(id);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
771 if (codec)
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
772 st->codec.codec_type = codec->type;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
773 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
774 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
775 av_log(NULL, AV_LOG_DEBUG, "size=%d 4CC= %c%c%c%c codec_type=%d\n",
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
776 size,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
777 (format >> 0) & 0xff,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
778 (format >> 8) & 0xff,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
779 (format >> 16) & 0xff,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
780 (format >> 24) & 0xff,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
781 st->codec.codec_type);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
782 #endif
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
783 st->codec.codec_tag = format;
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
784 if(st->codec.codec_type==CODEC_TYPE_VIDEO) {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
785 MOV_atom_t a = { 0, 0, 0 };
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
786 st->codec.codec_id = id;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
787 get_be16(pb); /* version */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
788 get_be16(pb); /* revision level */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
789 get_be32(pb); /* vendor */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
790 get_be32(pb); /* temporal quality */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
791 get_be32(pb); /* spacial quality */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
792 st->codec.width = get_be16(pb); /* width */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
793 st->codec.height = get_be16(pb); /* height */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
794 #if 1
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
795 if (st->codec.codec_id == CODEC_ID_MPEG4) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
796 /* in some MPEG4 the width/height are not correct, so
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
797 we ignore this info */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
798 st->codec.width = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
799 st->codec.height = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
800 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
801 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
802 get_be32(pb); /* horiz resolution */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
803 get_be32(pb); /* vert resolution */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
804 get_be32(pb); /* data size, always 0 */
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
805 frames_per_sample = get_be16(pb); /* frames per samples */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
806 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
807 av_log(NULL, AV_LOG_DEBUG, "frames/samples = %d\n", frames_per_sample);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
808 #endif
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
809 get_buffer(pb, (uint8_t *)st->codec.codec_name, 32); /* codec name */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
810
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
811 st->codec.bits_per_sample = get_be16(pb); /* depth */
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
812 st->codec.color_table_id = get_be16(pb); /* colortable id */
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
813
147
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
814 /* These are set in mov_read_stts and might already be set!
85
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 65
diff changeset
815 st->codec.frame_rate = 25;
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 65
diff changeset
816 st->codec.frame_rate_base = 1;
147
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
817 */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
818 size -= (16+8*4+2+32+2*2);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
819 #if 0
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
820 while (size >= 8) {
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
821 MOV_atom_t a;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 25
diff changeset
822 int64_t start_pos;
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
823
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
824 a.size = get_be32(pb);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
825 a.type = get_le32(pb);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
826 size -= 8;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
827 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
828 av_log(NULL, AV_LOG_DEBUG, "VIDEO: atom_type=%c%c%c%c atom.size=%Ld size_left=%d\n",
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
829 (a.type >> 0) & 0xff,
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
830 (a.type >> 8) & 0xff,
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
831 (a.type >> 16) & 0xff,
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
832 (a.type >> 24) & 0xff,
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
833 a.size, size);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
834 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
835 start_pos = url_ftell(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
836
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
837 switch(a.type) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
838 case MKTAG('e', 's', 'd', 's'):
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
839 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
840 int tag, len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
841 /* Well, broken but suffisant for some MP4 streams */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
842 get_be32(pb); /* version + flags */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
843 len = mov_mp4_read_descr(pb, &tag);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
844 if (tag == 0x03) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
845 /* MP4ESDescrTag */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
846 get_be16(pb); /* ID */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
847 get_byte(pb); /* priority */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
848 len = mov_mp4_read_descr(pb, &tag);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
849 if (tag != 0x04)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
850 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
851 /* MP4DecConfigDescrTag */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
852 get_byte(pb); /* objectTypeId */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
853 get_be32(pb); /* streamType + buffer size */
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
854 get_be32(pb); /* max bit rate */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
855 get_be32(pb); /* avg bit rate */
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
856 len = mov_mp4_read_descr(pb, &tag);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
857 if (tag != 0x05)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
858 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
859 /* MP4DecSpecificDescrTag */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
860 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
861 av_log(NULL, AV_LOG_DEBUG, "Specific MPEG4 header len=%d\n", len);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
862 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
863 sc->header_data = av_mallocz(len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
864 if (sc->header_data) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
865 get_buffer(pb, sc->header_data, len);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
866 sc->header_len = len;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
867 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
868 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
869 /* in any case, skip garbage */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
870 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
871 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
872 default:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
873 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
874 }
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
875 fail:
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
876 av_log(NULL, AV_LOG_DEBUG, "ATOMENEWSIZE %Ld %d\n", atom.size, url_ftell(pb) - start_pos);
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
877 if (atom.size > 8) {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
878 url_fskip(pb, (atom.size - 8) -
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
879 ((url_ftell(pb) - start_pos)));
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
880 size -= atom.size - 8;
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
881 }
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
882 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
883 if (size > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
884 /* unknown extension */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
885 url_fskip(pb, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
886 }
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
887 #else
302
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
888
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
889 /* figure out the palette situation */
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
890 color_depth = st->codec.bits_per_sample & 0x1F;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
891 color_greyscale = st->codec.bits_per_sample & 0x20;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
892
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
893 /* if the depth is 2, 4, or 8 bpp, file is palettized */
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
894 if ((color_depth == 2) || (color_depth == 4) ||
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
895 (color_depth == 8)) {
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
896
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
897 if (color_greyscale) {
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
898
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
899 /* compute the greyscale palette */
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
900 color_count = 1 << color_depth;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
901 color_index = 255;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
902 color_dec = 256 / (color_count - 1);
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
903 for (j = 0; j < color_count; j++) {
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
904 r = g = b = color_index;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
905 c->palette_control.palette[j] =
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
906 (r << 16) | (g << 8) | (b);
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
907 color_index -= color_dec;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
908 if (color_index < 0)
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
909 color_index = 0;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
910 }
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
911
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
912 } else if (st->codec.color_table_id & 0x08) {
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
913
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
914 /* if flag bit 3 is set, use the default palette */
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
915 color_count = 1 << color_depth;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
916 if (color_depth == 2)
431
fe91c780d26a prefix global
michael
parents: 428
diff changeset
917 color_table = ff_qt_default_palette_4;
302
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
918 else if (color_depth == 4)
431
fe91c780d26a prefix global
michael
parents: 428
diff changeset
919 color_table = ff_qt_default_palette_16;
302
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
920 else
431
fe91c780d26a prefix global
michael
parents: 428
diff changeset
921 color_table = ff_qt_default_palette_256;
302
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
922
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
923 for (j = 0; j < color_count; j++) {
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
924 r = color_table[j * 4 + 0];
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
925 g = color_table[j * 4 + 1];
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
926 b = color_table[j * 4 + 2];
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
927 c->palette_control.palette[j] =
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
928 (r << 16) | (g << 8) | (b);
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
929 }
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
930
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
931 } else {
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
932
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
933 /* load the palette from the file */
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
934 color_start = get_be32(pb);
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
935 color_count = get_be16(pb);
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
936 color_end = get_be16(pb);
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
937 for (j = color_start; j <= color_end; j++) {
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
938 /* each R, G, or B component is 16 bits;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
939 * only use the top 8 bits; skip alpha bytes
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
940 * up front */
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
941 get_byte(pb);
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
942 get_byte(pb);
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
943 r = get_byte(pb);
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
944 get_byte(pb);
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
945 g = get_byte(pb);
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
946 get_byte(pb);
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
947 b = get_byte(pb);
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
948 get_byte(pb);
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
949 c->palette_control.palette[j] =
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
950 (r << 16) | (g << 8) | (b);
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
951 }
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
952 }
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
953
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
954 st->codec.palctrl = &c->palette_control;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
955 st->codec.palctrl->palette_changed = 1;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
956 } else
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
957 st->codec.palctrl = NULL;
6949df67922d added palette support to the QT demuxer; registered SMC video decoder
melanson
parents: 301
diff changeset
958
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
959 a.size = size;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
960 mov_read_default(c, pb, a);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
961 #endif
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
962 } else {
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
963 st->codec.codec_id = codec_get_id(mov_audio_tags, format);
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 191
diff changeset
964 if(st->codec.codec_id==CODEC_ID_AMR_NB || st->codec.codec_id==CODEC_ID_AMR_WB) //from TS26.244
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
965 {
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
966 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
967 av_log(NULL, AV_LOG_DEBUG, "AMR-NB or AMR-WB audio identified!!\n");
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
968 #endif
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
969 get_be32(pb);get_be32(pb); //Reserved_8
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
970 get_be16(pb);//Reserved_2
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
971 get_be16(pb);//Reserved_2
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
972 get_be32(pb);//Reserved_4
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
973 get_be16(pb);//TimeScale
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
974 get_be16(pb);//Reserved_2
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
975
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
976 //AMRSpecificBox.(10 bytes)
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 191
diff changeset
977
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
978 get_be32(pb); //size
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
979 get_be32(pb); //type=='damr'
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
980 get_be32(pb); //vendor
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
981 get_byte(pb); //decoder version
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
982 get_be16(pb); //mode_set
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
983 get_byte(pb); //mode_change_period
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
984 get_byte(pb); //frames_per_sample
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
985
191
efb35207fb1b update duration and start_time
bellard
parents: 157
diff changeset
986 st->duration = AV_NOPTS_VALUE;//Not possible to get from this info, must count number of AMR frames
258
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 191
diff changeset
987 if(st->codec.codec_id==CODEC_ID_AMR_NB)
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 191
diff changeset
988 {
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 191
diff changeset
989 st->codec.sample_rate=8000;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 191
diff changeset
990 st->codec.channels=1;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 191
diff changeset
991 }
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 191
diff changeset
992 else //AMR-WB
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 191
diff changeset
993 {
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 191
diff changeset
994 st->codec.sample_rate=16000;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 191
diff changeset
995 st->codec.channels=1;
59c2e84817a1 AMR-WB support by (Johannes Carlsson <joca at rixmail dot se>)
michaelni
parents: 191
diff changeset
996 }
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
997 st->codec.bits_per_sample=16;
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
998 st->codec.bit_rate=0; /*It is not possible to tell this before we have
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
999 an audio frame and even then every frame can be different*/
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1000 }
147
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1001 else if( st->codec.codec_tag == MKTAG( 'm', 'p', '4', 's' ))
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1002 {
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1003 //This is some stuff for the hint track, lets ignore it!
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1004 //Do some mp4 auto detect.
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1005 c->mp4=1;
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1006 size-=(16);
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1007 url_fskip(pb, size); /* The mp4s atom also contians a esds atom that we can skip*/
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1008 }
428
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1009 else if( st->codec.codec_tag == MKTAG( 'm', 'p', '4', 'a' ))
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1010 {
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1011 /* Handle mp4 audio tag */
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1012 get_be32(pb); /* version */
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1013 get_be32(pb);
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1014 st->codec.channels = get_be16(pb); /* channels */
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1015 st->codec.bits_per_sample = get_be16(pb); /* bits per sample */
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1016 get_be32(pb);
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1017 st->codec.sample_rate = get_be16(pb); /* sample rate, not always correct */
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1018 get_be16(pb);
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1019 c->mp4=1;
438
b3fdae08c556 libavformat/mov.c fails with gcc 2.95.3 patch by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michael
parents: 431
diff changeset
1020 {
428
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1021 MOV_atom_t a = { format, url_ftell(pb), size - (20 + 20 + 8) };
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1022 mov_read_default(c, pb, a);
438
b3fdae08c556 libavformat/mov.c fails with gcc 2.95.3 patch by ("Steven M. Schultz" <sms at 2BSD dot COM>)
michael
parents: 431
diff changeset
1023 }
428
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1024 /* Get correct sample rate from extradata */
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1025 if(st->codec.extradata_size) {
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1026 const int samplerate_table[] = {
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1027 96000, 88200, 64000, 48000, 44100, 32000,
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1028 24000, 22050, 16000, 12000, 11025, 8000,
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1029 7350, 0, 0, 0
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1030 };
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1031 unsigned char *px = st->codec.extradata;
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1032 // 5 bits objectTypeIndex, 4 bits sampleRateIndex, 4 bits channels
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1033 int samplerate_index = ((px[0] & 7) << 1) + ((px[1] >> 7) & 1);
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1034 st->codec.sample_rate = samplerate_table[samplerate_index];
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1035 }
5ac07c7b4874 correctly identify AAC audio in mov/mp4/etc. files. patch by ("Thomas Raivio" <tjraivio at cc dot hut dot fi>)
michael
parents: 401
diff changeset
1036 }
147
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1037 else if(size>=(16+20))
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1038 {//16 bytes read, reading atleast 20 more
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1039 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1040 av_log(NULL, AV_LOG_DEBUG, "audio size=0x%X\n",size);
147
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1041 #endif
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1042 uint16_t version = get_be16(pb); /* version */
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1043 get_be16(pb); /* revision level */
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1044 get_be32(pb); /* vendor */
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1045
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1046 st->codec.channels = get_be16(pb); /* channel count */
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1047 st->codec.bits_per_sample = get_be16(pb); /* sample size */
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1048
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1049 /* handle specific s8 codec */
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1050 get_be16(pb); /* compression id = 0*/
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1051 get_be16(pb); /* packet size = 0 */
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1052
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1053 st->codec.sample_rate = ((get_be32(pb) >> 16));
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1054 //av_log(NULL, AV_LOG_DEBUG, "CODECID %d %d %.4s\n", st->codec.codec_id, CODEC_ID_PCM_S16BE, (char*)&format);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1055
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1056 switch (st->codec.codec_id) {
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1057 case CODEC_ID_PCM_S16BE:
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1058 if (st->codec.bits_per_sample == 8)
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1059 st->codec.codec_id = CODEC_ID_PCM_S8;
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1060 /* fall */
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1061 case CODEC_ID_PCM_U8:
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1062 st->codec.bit_rate = st->codec.sample_rate * 8;
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1063 break;
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1064 default:
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1065 ;
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1066 }
147
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1067
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1068 //Read QT version 1 fields. In version 0 theese dont exist
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1069 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1070 av_log(NULL, AV_LOG_DEBUG, "version =%d mp4=%d\n",version,c->mp4);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1071 av_log(NULL, AV_LOG_DEBUG, "size-(16+20+16)=%d\n",size-(16+20+16));
147
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1072 #endif
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1073 if((version==1) && size>=(16+20+16))
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1074 {
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1075 get_be32(pb); /* samples per packet */
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1076 get_be32(pb); /* bytes per packet */
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1077 get_be32(pb); /* bytes per frame */
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1078 get_be32(pb); /* bytes per sample */
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1079 if(size>(16+20+16))
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1080 {
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1081 //Optional, additional atom-based fields
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1082 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1083 av_log(NULL, AV_LOG_DEBUG, "offest=0x%X, sizeleft=%d=0x%x,format=%c%c%c%c\n",(int)url_ftell(pb),size - (16 + 20 + 16 ),size - (16 + 20 + 16 ),
147
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1084 (format >> 0) & 0xff,
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1085 (format >> 8) & 0xff,
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1086 (format >> 16) & 0xff,
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1087 (format >> 24) & 0xff);
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1088 #endif
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1089 MOV_atom_t a = { format, url_ftell(pb), size - (16 + 20 + 16 + 8) };
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1090 mov_read_default(c, pb, a);
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1091 }
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1092 }
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1093 else
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1094 {
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1095 //We should be down to 0 bytes here, but lets make sure.
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1096 size-=(16+20);
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1097 #ifdef DEBUG
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1098 if(size>0)
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1099 av_log(NULL, AV_LOG_DEBUG, "skipping 0x%X bytes\n",size-(16+20));
147
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1100 #endif
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1101 url_fskip(pb, size);
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1102 }
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1103 }
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1104 else
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1105 {
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1106 size-=16;
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1107 //Unknown size, but lets do our best and skip the rest.
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1108 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1109 av_log(NULL, AV_LOG_DEBUG, "Strange size, skipping 0x%X bytes\n",size);
147
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1110 #endif
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1111 url_fskip(pb, size);
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1112 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1113 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1114 }
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1115
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1116 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1117 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1118
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1119 static int mov_read_stsc(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1120 {
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1121 AVStream *st = c->fc->streams[c->fc->nb_streams-1];
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1122 MOVStreamContext *sc = (MOVStreamContext *)st->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1123 int entries, i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1124
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1125 print_atom("stsc", atom);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1126
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1127 get_byte(pb); /* version */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1128 get_byte(pb); get_byte(pb); get_byte(pb); /* flags */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1129
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1130 entries = get_be32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1131 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1132 av_log(NULL, AV_LOG_DEBUG, "track[%i].stsc.entries = %i\n", c->fc->nb_streams-1, entries);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1133 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1134 sc->sample_to_chunk_sz = entries;
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1135 sc->sample_to_chunk = (MOV_sample_to_chunk_tbl*) av_malloc(entries * sizeof(MOV_sample_to_chunk_tbl));
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1136 if (!sc->sample_to_chunk)
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1137 return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1138 for(i=0; i<entries; i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1139 sc->sample_to_chunk[i].first = get_be32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1140 sc->sample_to_chunk[i].count = get_be32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1141 sc->sample_to_chunk[i].id = get_be32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1142 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1143 /* av_log(NULL, AV_LOG_DEBUG, "sample_to_chunk first=%ld count=%ld, id=%ld\n", sc->sample_to_chunk[i].first, sc->sample_to_chunk[i].count, sc->sample_to_chunk[i].id); */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1144 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1145 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1146 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1147 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1148
383
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1149 static int mov_read_stss(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1150 {
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1151 AVStream *st = c->fc->streams[c->fc->nb_streams-1];
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1152 MOVStreamContext *sc = (MOVStreamContext *)st->priv_data;
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1153 int entries, i;
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1154
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1155 print_atom("stss", atom);
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1156
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1157 get_byte(pb); /* version */
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1158 get_byte(pb); get_byte(pb); get_byte(pb); /* flags */
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1159
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1160 entries = get_be32(pb);
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1161 sc->keyframe_count = entries;
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1162 #ifdef DEBUG
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1163 av_log(NULL, AV_LOG_DEBUG, "keyframe_count = %ld\n", sc->keyframe_count);
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1164 #endif
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1165 sc->keyframes = (long*) av_malloc(entries * sizeof(long));
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1166 if (!sc->keyframes)
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1167 return -1;
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1168 for(i=0; i<entries; i++) {
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1169 sc->keyframes[i] = get_be32(pb);
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1170 #ifdef DEBUG
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1171 /* av_log(NULL, AV_LOG_DEBUG, "keyframes[]=%ld\n", sc->keyframes[i]); */
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1172 #endif
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1173 }
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1174 return 0;
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1175 }
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1176
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1177 static int mov_read_stsz(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1178 {
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1179 AVStream *st = c->fc->streams[c->fc->nb_streams-1];
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1180 MOVStreamContext *sc = (MOVStreamContext *)st->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1181 int entries, i;
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1182
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1183 print_atom("stsz", atom);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1184
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1185 get_byte(pb); /* version */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1186 get_byte(pb); get_byte(pb); get_byte(pb); /* flags */
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1187
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1188 sc->sample_size = get_be32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1189 entries = get_be32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1190 sc->sample_count = entries;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1191 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1192 av_log(NULL, AV_LOG_DEBUG, "sample_size = %ld sample_count = %ld\n", sc->sample_size, sc->sample_count);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1193 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1194 if(sc->sample_size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1195 return 0; /* there isn't any table following */
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1196 sc->sample_sizes = (long*) av_malloc(entries * sizeof(long));
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1197 if (!sc->sample_sizes)
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1198 return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1199 for(i=0; i<entries; i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1200 sc->sample_sizes[i] = get_be32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1201 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1202 /* av_log(NULL, AV_LOG_DEBUG, "sample_sizes[]=%ld\n", sc->sample_sizes[i]); */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1203 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1204 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1205 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1206 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1207
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1208 static int mov_read_stts(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1209 {
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1210 AVStream *st = c->fc->streams[c->fc->nb_streams-1];
131
5bb5f3d201d6 * uninitialized/unused vars cleanup
kabi
parents: 130
diff changeset
1211 //MOVStreamContext *sc = (MOVStreamContext *)st->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1212 int entries, i;
395
c1ed10f3b052 cleanup frame_rate code, this may also fix some large file bugs
michael
parents: 383
diff changeset
1213 int64_t duration=0;
c1ed10f3b052 cleanup frame_rate code, this may also fix some large file bugs
michael
parents: 383
diff changeset
1214 int64_t total_sample_count=0;
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1215
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1216 print_atom("stts", atom);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1217
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1218 get_byte(pb); /* version */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1219 get_byte(pb); get_byte(pb); get_byte(pb); /* flags */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1220 entries = get_be32(pb);
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1221
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1222 c->streams[c->fc->nb_streams-1]->stts_count = entries;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1223 c->streams[c->fc->nb_streams-1]->stts_data = (uint64_t*) av_malloc(entries * sizeof(uint64_t));
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1224
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1225 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1226 av_log(NULL, AV_LOG_DEBUG, "track[%i].stts.entries = %i\n", c->fc->nb_streams-1, entries);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1227 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1228 for(i=0; i<entries; i++) {
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1229 int32_t sample_duration;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1230 int32_t sample_count;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1231
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1232 sample_count=get_be32(pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1233 sample_duration = get_be32(pb);
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1234 c->streams[c->fc->nb_streams - 1]->stts_data[i] = (uint64_t)sample_count<<32 | (uint64_t)sample_duration;
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1235 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1236 av_log(NULL, AV_LOG_DEBUG, "sample_count=%d, sample_duration=%d\n",sample_count,sample_duration);
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1237 #endif
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1238 duration+=sample_duration*sample_count;
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1239 total_sample_count+=sample_count;
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1240
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1241 #if 0 //We calculate an average instead, needed by .mp4-files created with nec e606 3g phone
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1242
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1243 if (!i && st->codec.codec_type==CODEC_TYPE_VIDEO) {
85
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 65
diff changeset
1244 st->codec.frame_rate_base = sample_duration ? sample_duration : 1;
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1245 st->codec.frame_rate = c->streams[c->fc->nb_streams-1]->time_scale;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1246 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1247 av_log(NULL, AV_LOG_DEBUG, "VIDEO FRAME RATE= %i (sd= %i)\n", st->codec.frame_rate, sample_duration);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1248 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1249 }
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1250 #endif
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1251 }
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1252
147
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1253 /*The stsd atom which contain codec type sometimes comes after the stts so we cannot check for codec_type*/
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1254 if(duration>0)
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1255 {
395
c1ed10f3b052 cleanup frame_rate code, this may also fix some large file bugs
michael
parents: 383
diff changeset
1256 av_reduce(
c1ed10f3b052 cleanup frame_rate code, this may also fix some large file bugs
michael
parents: 383
diff changeset
1257 &st->codec.frame_rate,
c1ed10f3b052 cleanup frame_rate code, this may also fix some large file bugs
michael
parents: 383
diff changeset
1258 &st->codec.frame_rate_base,
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1259 c->streams[c->fc->nb_streams-1]->time_scale * total_sample_count,
395
c1ed10f3b052 cleanup frame_rate code, this may also fix some large file bugs
michael
parents: 383
diff changeset
1260 duration,
c1ed10f3b052 cleanup frame_rate code, this may also fix some large file bugs
michael
parents: 383
diff changeset
1261 INT_MAX
c1ed10f3b052 cleanup frame_rate code, this may also fix some large file bugs
michael
parents: 383
diff changeset
1262 );
147
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1263
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1264 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1265 av_log(NULL, AV_LOG_DEBUG, "FRAME RATE average (video or audio)= %f (tot sample count= %i ,tot dur= %i timescale=%d)\n", (float)st->codec.frame_rate/st->codec.frame_rate_base,total_sample_count,duration,c->streams[c->fc->nb_streams-1]->time_scale);
134
5cda954c6e9a AMR-NB audio support patch by (<joca at rixmail dot se>)
michaelni
parents: 133
diff changeset
1266 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1267 }
147
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1268 else
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1269 {
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1270 st->codec.frame_rate_base = 1;
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1271 st->codec.frame_rate = c->streams[c->fc->nb_streams-1]->time_scale;
147
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1272 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1273 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1274 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1275
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1276 static int mov_read_trak(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1277 {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1278 AVStream *st;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1279 MOVStreamContext *sc;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1280
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1281 print_atom("trak", atom);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1282
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1283 st = av_new_stream(c->fc, c->fc->nb_streams);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1284 if (!st) return -2;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1285 sc = (MOVStreamContext*) av_mallocz(sizeof(MOVStreamContext));
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1286 if (!sc) {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1287 av_free(st);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1288 return -1;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1289 }
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1290
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1291 sc->sample_to_chunk_index = -1;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1292 st->priv_data = sc;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1293 st->codec.codec_type = CODEC_TYPE_MOV_OTHER;
191
efb35207fb1b update duration and start_time
bellard
parents: 157
diff changeset
1294 st->start_time = 0; /* XXX: check */
efb35207fb1b update duration and start_time
bellard
parents: 157
diff changeset
1295 st->duration = (c->duration * (int64_t)AV_TIME_BASE) / c->time_scale;
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1296 c->streams[c->fc->nb_streams-1] = sc;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1297
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1298 return mov_read_default(c, pb, atom);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1299 }
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1300
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1301 static int mov_read_tkhd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1302 {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1303 AVStream *st;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1304
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1305 print_atom("tkhd", atom);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1306
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1307 st = c->fc->streams[c->fc->nb_streams-1];
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1308
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1309 get_byte(pb); /* version */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1310
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1311 get_byte(pb); get_byte(pb);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1312 get_byte(pb); /* flags */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1313 /*
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1314 MOV_TRACK_ENABLED 0x0001
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1315 MOV_TRACK_IN_MOVIE 0x0002
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1316 MOV_TRACK_IN_PREVIEW 0x0004
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1317 MOV_TRACK_IN_POSTER 0x0008
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1318 */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1319
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1320 get_be32(pb); /* creation time */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1321 get_be32(pb); /* modification time */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1322 st->id = (int)get_be32(pb); /* track id (NOT 0 !)*/
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1323 get_be32(pb); /* reserved */
191
efb35207fb1b update duration and start_time
bellard
parents: 157
diff changeset
1324 st->start_time = 0; /* check */
efb35207fb1b update duration and start_time
bellard
parents: 157
diff changeset
1325 st->duration = (get_be32(pb) * (int64_t)AV_TIME_BASE) / c->time_scale; /* duration */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1326 get_be32(pb); /* reserved */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1327 get_be32(pb); /* reserved */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1328
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1329 get_be16(pb); /* layer */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1330 get_be16(pb); /* alternate group */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1331 get_be16(pb); /* volume */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1332 get_be16(pb); /* reserved */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1333
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1334 url_fskip(pb, 36); /* display matrix */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1335
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1336 /* those are fixed-point */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1337 st->codec.width = get_be32(pb) >> 16; /* track width */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1338 st->codec.height = get_be32(pb) >> 16; /* track height */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1339
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1340 return 0;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1341 }
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1342
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1343 /* this atom should be null (from specs), but some buggy files put the 'moov' atom inside it... */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1344 /* like the files created with Adobe Premiere 5.0, for samples see */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1345 /* http://graphics.tudelft.nl/~wouter/publications/soundtests/ */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1346 static int mov_read_wide(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1347 {
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1348 int err;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1349
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1350 #ifdef DEBUG
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1351 print_atom("wide", atom);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1352 debug_indent++;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1353 #endif
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1354 if (atom.size < 8)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1355 return 0; /* continue */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1356 if (get_be32(pb) != 0) { /* 0 sized mdat atom... use the 'wide' atom size */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1357 url_fskip(pb, atom.size - 4);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1358 return 0;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1359 }
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1360 atom.type = get_le32(pb);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1361 atom.offset += 8;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1362 atom.size -= 8;
131
5bb5f3d201d6 * uninitialized/unused vars cleanup
kabi
parents: 130
diff changeset
1363 if (atom.type != MKTAG('m', 'd', 'a', 't')) {
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1364 url_fskip(pb, atom.size);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1365 return 0;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1366 }
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1367 err = mov_read_mdat(c, pb, atom);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1368 #ifdef DEBUG
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1369 debug_indent--;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1370 #endif
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1371 return err;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1372 }
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1373
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1374
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1375 #ifdef CONFIG_ZLIB
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 25
diff changeset
1376 static int null_read_packet(void *opaque, uint8_t *buf, int buf_size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1377 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1378 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1379 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1380
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1381 static int mov_read_cmov(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1382 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1383 ByteIOContext ctx;
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1384 uint8_t *cmov_data;
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1385 uint8_t *moov_data; /* uncompressed data */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1386 long cmov_len, moov_len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1387 int ret;
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1388
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1389 print_atom("cmov", atom);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1390
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1391 get_be32(pb); /* dcom atom */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1392 if (get_le32(pb) != MKTAG( 'd', 'c', 'o', 'm' ))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1393 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1394 if (get_le32(pb) != MKTAG( 'z', 'l', 'i', 'b' )) {
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1395 av_log(NULL, AV_LOG_DEBUG, "unknown compression for cmov atom !");
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1396 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1397 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1398 get_be32(pb); /* cmvd atom */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1399 if (get_le32(pb) != MKTAG( 'c', 'm', 'v', 'd' ))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1400 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1401 moov_len = get_be32(pb); /* uncompressed size */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1402 cmov_len = atom.size - 6 * 4;
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1403
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1404 cmov_data = (uint8_t *) av_malloc(cmov_len);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1405 if (!cmov_data)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1406 return -1;
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1407 moov_data = (uint8_t *) av_malloc(moov_len);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1408 if (!moov_data) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1409 av_free(cmov_data);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1410 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1411 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1412 get_buffer(pb, cmov_data, cmov_len);
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1413 if(uncompress (moov_data, (uLongf *) &moov_len, (const Bytef *)cmov_data, cmov_len) != Z_OK)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1414 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1415 if(init_put_byte(&ctx, moov_data, moov_len, 0, NULL, null_read_packet, NULL, NULL) != 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1416 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1417 ctx.buf_end = ctx.buffer + moov_len;
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1418 atom.type = MKTAG( 'm', 'o', 'o', 'v' );
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1419 atom.offset = 0;
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1420 atom.size = moov_len;
132
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
1421 #ifdef DEBUG
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
1422 { int fd = open("/tmp/uncompheader.mov", O_WRONLY | O_CREAT); write(fd, moov_data, moov_len); close(fd); }
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
1423 #endif
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1424 ret = mov_read_default(c, &ctx, atom);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1425 av_free(moov_data);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1426 av_free(cmov_data);
132
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
1427
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1428 return ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1429 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1430 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1431
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1432 /* edit list atom */
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1433 static int mov_read_elst(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1434 {
500
4070a7d58d2c mov_read_elst fix, based upon a patch by (Sebastien Bechet <s.bechet at av7 dot net>)
michael
parents: 499
diff changeset
1435 int i, edit_count;
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1436 print_atom("elst", atom);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1437
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1438 get_byte(pb); /* version */
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1439 get_byte(pb); get_byte(pb); get_byte(pb); /* flags */
500
4070a7d58d2c mov_read_elst fix, based upon a patch by (Sebastien Bechet <s.bechet at av7 dot net>)
michael
parents: 499
diff changeset
1440 edit_count= c->streams[c->fc->nb_streams-1]->edit_count = get_be32(pb); /* entries */
4070a7d58d2c mov_read_elst fix, based upon a patch by (Sebastien Bechet <s.bechet at av7 dot net>)
michael
parents: 499
diff changeset
1441
4070a7d58d2c mov_read_elst fix, based upon a patch by (Sebastien Bechet <s.bechet at av7 dot net>)
michael
parents: 499
diff changeset
1442 for(i=0; i<edit_count; i++){
4070a7d58d2c mov_read_elst fix, based upon a patch by (Sebastien Bechet <s.bechet at av7 dot net>)
michael
parents: 499
diff changeset
1443 get_be32(pb); /* Track duration */
4070a7d58d2c mov_read_elst fix, based upon a patch by (Sebastien Bechet <s.bechet at av7 dot net>)
michael
parents: 499
diff changeset
1444 get_be32(pb); /* Media time */
4070a7d58d2c mov_read_elst fix, based upon a patch by (Sebastien Bechet <s.bechet at av7 dot net>)
michael
parents: 499
diff changeset
1445 get_be32(pb); /* Media rate */
4070a7d58d2c mov_read_elst fix, based upon a patch by (Sebastien Bechet <s.bechet at av7 dot net>)
michael
parents: 499
diff changeset
1446 }
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1447 #ifdef DEBUG
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1448 av_log(NULL, AV_LOG_DEBUG, "track[%i].edit_count = %i\n", c->fc->nb_streams-1, c->streams[c->fc->nb_streams-1]->edit_count);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1449 #endif
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1450 return 0;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1451 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1452
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1453 static const MOVParseTableEntry mov_default_parse_table[] = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1454 /* mp4 atoms */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1455 { MKTAG( 'c', 'o', '6', '4' ), mov_read_stco },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1456 { MKTAG( 'c', 'p', 'r', 't' ), mov_read_default },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1457 { MKTAG( 'c', 'r', 'h', 'd' ), mov_read_default },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1458 { MKTAG( 'c', 't', 't', 's' ), mov_read_leaf }, /* composition time to sample */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1459 { MKTAG( 'd', 'i', 'n', 'f' ), mov_read_default }, /* data information */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1460 { MKTAG( 'd', 'p', 'n', 'd' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1461 { MKTAG( 'd', 'r', 'e', 'f' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1462 { MKTAG( 'e', 'd', 't', 's' ), mov_read_default },
500
4070a7d58d2c mov_read_elst fix, based upon a patch by (Sebastien Bechet <s.bechet at av7 dot net>)
michael
parents: 499
diff changeset
1463 { MKTAG( 'e', 'l', 's', 't' ), mov_read_elst },
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1464 { MKTAG( 'f', 'r', 'e', 'e' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1465 { MKTAG( 'h', 'd', 'l', 'r' ), mov_read_hdlr },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1466 { MKTAG( 'h', 'i', 'n', 't' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1467 { MKTAG( 'h', 'm', 'h', 'd' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1468 { MKTAG( 'i', 'o', 'd', 's' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1469 { MKTAG( 'm', 'd', 'a', 't' ), mov_read_mdat },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1470 { MKTAG( 'm', 'd', 'h', 'd' ), mov_read_mdhd },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1471 { MKTAG( 'm', 'd', 'i', 'a' ), mov_read_default },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1472 { MKTAG( 'm', 'i', 'n', 'f' ), mov_read_default },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1473 { MKTAG( 'm', 'o', 'o', 'v' ), mov_read_moov },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1474 { MKTAG( 'm', 'p', '4', 'a' ), mov_read_default },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1475 { MKTAG( 'm', 'p', '4', 's' ), mov_read_default },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1476 { MKTAG( 'm', 'p', '4', 'v' ), mov_read_default },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1477 { MKTAG( 'm', 'p', 'o', 'd' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1478 { MKTAG( 'm', 'v', 'h', 'd' ), mov_read_mvhd },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1479 { MKTAG( 'n', 'm', 'h', 'd' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1480 { MKTAG( 'o', 'd', 'h', 'd' ), mov_read_default },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1481 { MKTAG( 's', 'd', 'h', 'd' ), mov_read_default },
489
aeb69a5f3756 The atom 'skip' should be handled by 'mov_read_leaf()', not by
michael
parents: 438
diff changeset
1482 { MKTAG( 's', 'k', 'i', 'p' ), mov_read_leaf },
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1483 { MKTAG( 's', 'm', 'h', 'd' ), mov_read_leaf }, /* sound media info header */
132
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
1484 { MKTAG( 'S', 'M', 'I', ' ' ), mov_read_smi }, /* Sorrenson extension ??? */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1485 { MKTAG( 's', 't', 'b', 'l' ), mov_read_default },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1486 { MKTAG( 's', 't', 'c', 'o' ), mov_read_stco },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1487 { MKTAG( 's', 't', 'd', 'p' ), mov_read_default },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1488 { MKTAG( 's', 't', 's', 'c' ), mov_read_stsc },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1489 { MKTAG( 's', 't', 's', 'd' ), mov_read_stsd }, /* sample description */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1490 { MKTAG( 's', 't', 's', 'h' ), mov_read_default },
383
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1491 { MKTAG( 's', 't', 's', 's' ), mov_read_stss }, /* sync sample */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1492 { MKTAG( 's', 't', 's', 'z' ), mov_read_stsz }, /* sample size */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1493 { MKTAG( 's', 't', 't', 's' ), mov_read_stts },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1494 { MKTAG( 't', 'k', 'h', 'd' ), mov_read_tkhd }, /* track header */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1495 { MKTAG( 't', 'r', 'a', 'k' ), mov_read_trak },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1496 { MKTAG( 't', 'r', 'e', 'f' ), mov_read_default }, /* not really */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1497 { MKTAG( 'u', 'd', 't', 'a' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1498 { MKTAG( 'u', 'r', 'l', ' ' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1499 { MKTAG( 'u', 'r', 'n', ' ' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1500 { MKTAG( 'u', 'u', 'i', 'd' ), mov_read_default },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1501 { MKTAG( 'v', 'm', 'h', 'd' ), mov_read_leaf }, /* video media info header */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1502 { MKTAG( 'w', 'a', 'v', 'e' ), mov_read_default },
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1503 /* extra mp4 */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1504 { MKTAG( 'M', 'D', 'E', 'S' ), mov_read_leaf },
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1505 /* QT atoms */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1506 { MKTAG( 'c', 'h', 'a', 'p' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1507 { MKTAG( 'c', 'l', 'i', 'p' ), mov_read_default },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1508 { MKTAG( 'c', 'r', 'g', 'n' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1509 { MKTAG( 'c', 't', 'a', 'b' ), mov_read_ctab },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1510 { MKTAG( 'e', 's', 'd', 's' ), mov_read_esds },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1511 { MKTAG( 'k', 'm', 'a', 't' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1512 { MKTAG( 'm', 'a', 't', 't' ), mov_read_default },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1513 { MKTAG( 'r', 'd', 'r', 'f' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1514 { MKTAG( 'r', 'm', 'd', 'a' ), mov_read_default },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1515 { MKTAG( 'r', 'm', 'd', 'r' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1516 { MKTAG( 'r', 'm', 'r', 'a' ), mov_read_default },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1517 { MKTAG( 's', 'c', 'p', 't' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1518 { MKTAG( 's', 's', 'r', 'c' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1519 { MKTAG( 's', 'y', 'n', 'c' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1520 { MKTAG( 't', 'c', 'm', 'd' ), mov_read_leaf },
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1521 { MKTAG( 'w', 'i', 'd', 'e' ), mov_read_wide }, /* place holder */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1522 //{ MKTAG( 'r', 'm', 'q', 'u' ), mov_read_leaf },
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1523 #ifdef CONFIG_ZLIB
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1524 { MKTAG( 'c', 'm', 'o', 'v' ), mov_read_cmov },
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1525 #else
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1526 { MKTAG( 'c', 'm', 'o', 'v' ), mov_read_leaf },
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1527 #endif
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1528 { 0L, mov_read_leaf }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1529 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1530
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1531 static void mov_free_stream_context(MOVStreamContext *sc)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1532 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1533 if(sc) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1534 av_free(sc->chunk_offsets);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1535 av_free(sc->sample_to_chunk);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1536 av_free(sc->sample_sizes);
383
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1537 av_free(sc->keyframes);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1538 av_free(sc->header_data);
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1539 av_free(sc->stts_data);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1540 av_free(sc);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1541 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1542 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1543
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1544 static inline uint32_t mov_to_tag(uint8_t *buf)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1545 {
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1546 return MKTAG(buf[0], buf[1], buf[2], buf[3]);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1547 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1548
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1549 static inline uint32_t to_be32(uint8_t *buf)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1550 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1551 return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1552 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1553
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1554 /* XXX: is it sufficient ? */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1555 static int mov_probe(AVProbeData *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1556 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1557 unsigned int offset;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1558 uint32_t tag;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1559
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1560 /* check file header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1561 if (p->buf_size <= 12)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1562 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1563 offset = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1564 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1565 /* ignore invalid offset */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1566 if ((offset + 8) > (unsigned int)p->buf_size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1567 return 0;
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1568 tag = mov_to_tag(p->buf + offset + 4);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1569 switch(tag) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1570 case MKTAG( 'm', 'o', 'o', 'v' ):
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1571 case MKTAG( 'w', 'i', 'd', 'e' ):
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1572 case MKTAG( 'f', 'r', 'e', 'e' ):
24
215c0f0f916e Fix probing for some files (ew.mov, april.mov)
mmu_man
parents: 0
diff changeset
1573 case MKTAG( 'm', 'd', 'a', 't' ):
215c0f0f916e Fix probing for some files (ew.mov, april.mov)
mmu_man
parents: 0
diff changeset
1574 case MKTAG( 'p', 'n', 'o', 't' ): /* detect movs with preview pics like ew.mov and april.mov */
146
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1575 case MKTAG( 'u', 'd', 't', 'a' ): /* Packet Video PVAuthor adds this and a lot of more junk */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1576 return AVPROBE_SCORE_MAX;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1577 case MKTAG( 'f', 't', 'y', 'p' ):
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1578 case MKTAG( 's', 'k', 'i', 'p' ):
147
2f924727fd96 * missing part of the 3gp patch by Johannes Carlsson
kabi
parents: 146
diff changeset
1579 offset = to_be32(p->buf+offset) + offset;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1580 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1581 default:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1582 /* unrecognized tag */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1583 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1584 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1585 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1586 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1587 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1588
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1589 static int mov_read_header(AVFormatContext *s, AVFormatParameters *ap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1590 {
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1591 MOVContext *mov = (MOVContext *) s->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1592 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1593 int i, j, nb, err;
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1594 MOV_atom_t atom = { 0, 0, 0 };
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1595
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1596 mov->fc = s;
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1597 mov->parse_table = mov_default_parse_table;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1598 #if 0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1599 /* XXX: I think we should auto detect */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1600 if(s->iformat->name[1] == 'p')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1601 mov->mp4 = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1602 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1603 if(!url_is_streamed(pb)) /* .mov and .mp4 aren't streamable anyway (only progressive download if moov is before mdat) */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1604 atom.size = url_filesize(url_fileno(pb));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1605 else
132
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
1606 atom.size = 0x7FFFFFFFFFFFFFFFLL;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1607
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1608 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1609 av_log(NULL, AV_LOG_DEBUG, "filesz=%Ld\n", atom.size);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1610 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1611
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1612 /* check MOV header */
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1613 err = mov_read_default(mov, pb, atom);
133
31f0dda651f8 * added s263 (mapped to h263 - 3gp files)
kabi
parents: 132
diff changeset
1614 if (err<0 || (!mov->found_moov && !mov->found_mdat)) {
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 358
diff changeset
1615 av_log(s, AV_LOG_ERROR, "mov: header not found !!! (err:%d, moov:%d, mdat:%d) pos:%lld\n",
133
31f0dda651f8 * added s263 (mapped to h263 - 3gp files)
kabi
parents: 132
diff changeset
1616 err, mov->found_moov, mov->found_mdat, url_ftell(pb));
31f0dda651f8 * added s263 (mapped to h263 - 3gp files)
kabi
parents: 132
diff changeset
1617 return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1618 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1619 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1620 av_log(NULL, AV_LOG_DEBUG, "on_parse_exit_offset=%d\n", (int) url_ftell(pb));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1621 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1622 /* some cleanup : make sure we are on the mdat atom */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1623 if(!url_is_streamed(pb) && (url_ftell(pb) != mov->mdat_offset))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1624 url_fseek(pb, mov->mdat_offset, SEEK_SET);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1625
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1626 mov->next_chunk_offset = mov->mdat_offset; /* initialise reading */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1627
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1628 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1629 av_log(NULL, AV_LOG_DEBUG, "mdat_reset_offset=%d\n", (int) url_ftell(pb));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1630 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1631
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1632 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1633 av_log(NULL, AV_LOG_DEBUG, "streams= %d\n", s->nb_streams);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1634 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1635 mov->total_streams = nb = s->nb_streams;
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
1636
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1637 #if 1
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1638 for(i=0; i<s->nb_streams;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1639 if(s->streams[i]->codec.codec_type == CODEC_TYPE_MOV_OTHER) {/* not audio, not video, delete */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1640 av_free(s->streams[i]);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1641 for(j=i+1; j<s->nb_streams; j++)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1642 s->streams[j-1] = s->streams[j];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1643 s->nb_streams--;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1644 } else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1645 i++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1646 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1647 for(i=0; i<s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1648 MOVStreamContext *sc;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1649 sc = (MOVStreamContext *)s->streams[i]->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1650 sc->ffindex = i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1651 sc->is_ff_stream = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1652 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1653 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1654 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1655 av_log(NULL, AV_LOG_DEBUG, "real streams= %d\n", s->nb_streams);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1656 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1657 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1658 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1659
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1660 /* Yes, this is ugly... I didn't write the specs of QT :p */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1661 /* XXX:remove useless commented code sometime */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1662 static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1663 {
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
1664 MOVContext *mov = (MOVContext *) s->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1665 MOVStreamContext *sc;
132
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
1666 int64_t offset = 0x0FFFFFFFFFFFFFFFLL;
383
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1667 int i, a, b, m;
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1668 int size;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1669 size = 0x0FFFFFFF;
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1670
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1671 #ifdef MOV_SPLIT_CHUNKS
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1672 if (mov->partial) {
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1673
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1674 int idx;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1675
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1676 sc = mov->partial;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1677 idx = sc->sample_to_chunk_index;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1678
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1679 if (idx < 0) return 0;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1680 size = sc->sample_sizes[sc->current_sample];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1681
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1682 sc->current_sample++;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1683 sc->left_in_chunk--;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1684
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1685 if (sc->left_in_chunk <= 0)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1686 mov->partial = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1687 offset = mov->next_chunk_offset;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1688 /* extract the sample */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1689
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1690 goto readchunk;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1691 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1692 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1693
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1694 again:
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1695 sc = 0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1696 for(i=0; i<mov->total_streams; i++) {
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1697 MOVStreamContext *msc = mov->streams[i];
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1698 //av_log(NULL, AV_LOG_DEBUG, "MOCHUNK %ld %d %p pos:%Ld\n", mov->streams[i]->next_chunk, mov->total_streams, mov->streams[i], url_ftell(&s->pb));
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1699 if ((msc->next_chunk < msc->chunk_count) && msc->next_chunk >= 0
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1700 && (msc->chunk_offsets[msc->next_chunk] < offset)) {
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1701 sc = msc;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1702 offset = msc->chunk_offsets[msc->next_chunk];
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1703 //av_log(NULL, AV_LOG_DEBUG, "SELETED %Ld i:%d\n", offset, i);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1704 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1705 }
132
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
1706 if (!sc || offset==0x0FFFFFFFFFFFFFFFLL)
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1707 return -1;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1708
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1709 sc->next_chunk++;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1710
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1711 if(mov->next_chunk_offset < offset) { /* some meta data */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1712 url_fskip(&s->pb, (offset - mov->next_chunk_offset));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1713 mov->next_chunk_offset = offset;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1714 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1715
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1716 //av_log(NULL, AV_LOG_DEBUG, "chunk: [%i] %lli -> %lli\n", st_id, mov->next_chunk_offset, offset);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1717 if(!sc->is_ff_stream) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1718 url_fskip(&s->pb, (offset - mov->next_chunk_offset));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1719 mov->next_chunk_offset = offset;
132
9ca36221ae23 * passing ImageDescriptions for SVQ3 (Vertical300K.sorenson works)
kabi
parents: 131
diff changeset
1720 offset = 0x0FFFFFFFFFFFFFFFLL;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1721 goto again;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1722 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1723
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1724 /* now get the chunk size... */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1725
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1726 for(i=0; i<mov->total_streams; i++) {
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1727 MOVStreamContext *msc = mov->streams[i];
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1728 if ((msc->next_chunk < msc->chunk_count)
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1729 && ((msc->chunk_offsets[msc->next_chunk] - offset) < size))
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1730 size = msc->chunk_offsets[msc->next_chunk] - offset;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1731 }
146
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1732
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1733 #ifdef MOV_MINOLTA_FIX
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1734 //Make sure that size is according to sample_size (Needed by .mov files
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1735 //created on a Minolta Dimage Xi where audio chunks contains waste data in the end)
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1736 //Maybe we should really not only check sc->sample_size, but also sc->sample_sizes
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1737 //but I have no such movies
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1738 if (sc->sample_size > 0) {
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1739 int foundsize=0;
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1740 for(i=0; i<(sc->sample_to_chunk_sz); i++) {
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1741 if( (sc->sample_to_chunk[i].first)<=(sc->next_chunk) && (sc->sample_size>0) )
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1742 {
401
42cc78ece67f * .mov files with uncompressed audio can't be correctly processed
romansh
parents: 395
diff changeset
1743 // I can't figure out why for PCM audio sample_size is always 1
42cc78ece67f * .mov files with uncompressed audio can't be correctly processed
romansh
parents: 395
diff changeset
1744 // (it should actually be channels*bits_per_second/8) but it is.
42cc78ece67f * .mov files with uncompressed audio can't be correctly processed
romansh
parents: 395
diff changeset
1745 AVCodecContext* cod = &s->streams[sc->ffindex]->codec;
42cc78ece67f * .mov files with uncompressed audio can't be correctly processed
romansh
parents: 395
diff changeset
1746 if (sc->sample_size == 1 && (cod->codec_id == CODEC_ID_PCM_S16BE || cod->codec_id == CODEC_ID_PCM_S16LE))
42cc78ece67f * .mov files with uncompressed audio can't be correctly processed
romansh
parents: 395
diff changeset
1747 foundsize=(sc->sample_to_chunk[i].count*cod->channels*cod->bits_per_sample)/8;
42cc78ece67f * .mov files with uncompressed audio can't be correctly processed
romansh
parents: 395
diff changeset
1748 else
42cc78ece67f * .mov files with uncompressed audio can't be correctly processed
romansh
parents: 395
diff changeset
1749 foundsize=sc->sample_to_chunk[i].count*sc->sample_size;
146
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1750 }
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1751 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1752 /*av_log(NULL, AV_LOG_DEBUG, "sample_to_chunk first=%ld count=%ld, id=%ld\n", sc->sample_to_chunk[i].first, sc->sample_to_chunk[i].count, sc->sample_to_chunk[i].id);*/
146
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1753 #endif
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1754 }
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1755 if( (foundsize>0) && (foundsize<size) )
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1756 {
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1757 #ifdef DEBUG
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1758 /*av_log(NULL, AV_LOG_DEBUG, "this size should actually be %d\n",foundsize);*/
146
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1759 #endif
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1760 size=foundsize;
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1761 }
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1762 }
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1763 #endif //MOV_MINOLTA_FIX
b9703b3c10b6 * 3gp patch by Joca
kabi
parents: 136
diff changeset
1764
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1765 #ifdef MOV_SPLIT_CHUNKS
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1766 /* split chunks into samples */
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1767 if (sc->sample_size == 0) {
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1768 int idx = sc->sample_to_chunk_index;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1769 if ((idx + 1 < sc->sample_to_chunk_sz)
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1770 && (sc->next_chunk >= sc->sample_to_chunk[idx + 1].first))
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1771 idx++;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1772 sc->sample_to_chunk_index = idx;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1773 if (idx >= 0 && sc->sample_to_chunk[idx].count != 1) {
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1774 mov->partial = sc;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1775 /* we'll have to get those samples before next chunk */
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1776 sc->left_in_chunk = sc->sample_to_chunk[idx].count - 1;
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1777 size = sc->sample_sizes[sc->current_sample];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1778 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1779
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1780 sc->current_sample++;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1781 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1782 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1783
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1784 readchunk:
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1785 //av_log(NULL, AV_LOG_DEBUG, "chunk: [%i] %lli -> %lli (%i)\n", st_id, offset, offset + size, size);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1786 if(size == 0x0FFFFFFF)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1787 size = mov->mdat_size + mov->mdat_offset - offset;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1788 if(size < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1789 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1790 if(size == 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1791 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1792 url_fseek(&s->pb, offset, SEEK_SET);
118
79d651162d35 * fixed initialization and some memleak
kabi
parents: 101
diff changeset
1793
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1794 //av_log(NULL, AV_LOG_DEBUG, "READCHUNK hlen: %d %d off: %Ld pos:%Ld\n", size, sc->header_len, offset, url_ftell(&s->pb));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1795 if (sc->header_len > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1796 av_new_packet(pkt, size + sc->header_len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1797 memcpy(pkt->data, sc->header_data, sc->header_len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1798 get_buffer(&s->pb, pkt->data + sc->header_len, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1799 /* free header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1800 av_freep(&sc->header_data);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1801 sc->header_len = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1802 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1803 av_new_packet(pkt, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1804 get_buffer(&s->pb, pkt->data, pkt->size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1805 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1806 pkt->stream_index = sc->ffindex;
383
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1807
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1808 // If the keyframes table exists, mark any samples that are in the table as key frames.
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1809 // If no table exists, treat very sample as a key frame.
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1810 if (sc->keyframes) {
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1811 a = 0;
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1812 b = sc->keyframe_count - 1;
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1813
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1814 while (a < b) {
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1815 m = (a + b + 1) >> 1;
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1816 if (sc->keyframes[m] > sc->current_sample) {
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1817 b = m - 1;
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1818 } else {
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1819 a = m;
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1820 }
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1821 }
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1822
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1823 if (sc->keyframes[a] == sc->current_sample)
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1824 pkt->flags |= PKT_FLAG_KEY;
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1825 }
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1826 else
1674ed5ca2f0 Parse stss info in MOV files to get key frames patch by ("Brian Becker" <Brian dot Becker at palmone dot com>)
michael
parents: 370
diff changeset
1827 pkt->flags |= PKT_FLAG_KEY;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1828
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1829 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1830 /*
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1831 av_log(NULL, AV_LOG_DEBUG, "Packet (%d, %d, %ld) ", pkt->stream_index, st_id, pkt->size);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1832 for(i=0; i<8; i++)
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1833 av_log(NULL, AV_LOG_DEBUG, "%02x ", pkt->data[i]);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1834 for(i=0; i<8; i++)
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1835 av_log(NULL, AV_LOG_DEBUG, "%c ", (pkt->data[i]) & 0x7F);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1836 puts("");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1837 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1838 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1839
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1840 mov->next_chunk_offset = offset + size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1841
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1842 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1843 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1844
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1845 #if defined(MOV_SPLIT_CHUNKS) && defined(MOV_SEEK)
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1846 /**
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1847 * Seek method based on the one described in the Appendix C of QTFileFormat.pdf
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1848 */
558
89bd76208427 100l (forgoten seeking functions)
michael
parents: 549
diff changeset
1849 static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1850 {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1851 MOVContext* mov = (MOVContext *) s->priv_data;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1852 MOVStreamContext* sc;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1853 int32_t i, a, b, m;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1854 int64_t sample_time;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1855 int64_t start_time;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1856 int32_t seek_sample, sample;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1857 int32_t duration;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1858 int32_t count;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1859 int32_t chunk;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1860 int32_t left_in_chunk;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1861 int64_t chunk_file_offset;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1862 int64_t sample_file_offset;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1863 int32_t first_chunk_sample;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1864 int32_t sample_to_chunk_idx;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1865 int mov_idx;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1866
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1867 // Find the corresponding mov stream
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1868 for (mov_idx = 0; mov_idx < mov->total_streams; mov_idx++)
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1869 if (mov->streams[mov_idx]->ffindex == stream_index)
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1870 break;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1871 if (mov_idx == mov->total_streams) {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1872 av_log(s, AV_LOG_ERROR, "mov: requested stream was not found in mov streams (idx=%i)\n", stream_index);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1873 return -1;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1874 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1875 sc = mov->streams[mov_idx];
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1876
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1877 // Step 1. Find the edit that contains the requested time (elst)
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1878 if (sc->edit_count) {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1879 // FIXME should handle edit list
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1880 av_log(s, AV_LOG_ERROR, "mov: does not handle seeking in files that contain edit list (c:%d)\n", sc->edit_count);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1881 return -1;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1882 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1883
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1884 // Step 2. Find the corresponding sample using the Time-to-sample atom (stts) */
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1885 #ifdef DEBUG
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1886 av_log(s, AV_LOG_DEBUG, "Searching for time %li in stream #%i (time_scale=%i)\n", (long)timestamp, mov_idx, sc->time_scale);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1887 #endif
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1888 // convert timestamp from time_base unit to timescale unit
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1889 sample_time = av_rescale( timestamp,
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1890 (int64_t)sc->time_scale * s->streams[stream_index]->time_base.num,
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1891 (int64_t)s->streams[stream_index]->time_base.den);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1892 start_time = 0; // FIXME use elst atom
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1893 sample = 1; // sample are 0 based in table
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1894 #ifdef DEBUG
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1895 av_log(s, AV_LOG_DEBUG, "Searching for sample_time %li \n", (long)sample_time);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1896 #endif
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1897 for (i = 0; i < sc->stts_count; i++) {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1898 count = (uint32_t)(sc->stts_data[i]>>32);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1899 duration = (uint32_t)(sc->stts_data[i]&0xffff);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1900 //av_log(s, AV_LOG_DEBUG, "> sample_time %lli \n", (long)sample_time);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1901 //av_log(s, AV_LOG_DEBUG, "> count=%i duration=%i\n", count, duration);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1902 if ((start_time + count*duration) > sample_time) {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1903 sample += (sample_time - start_time) / duration;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1904 break;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1905 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1906 sample += count;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1907 start_time += count * duration;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1908 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1909 /* NOTE: despite what qt doc say, the dt value (Display Time in qt vocabulary) computed with the stts atom
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1910 is a decoding time stamp (dts) not a presentation time stamp. And as usual dts != pts for stream with b frames */
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1911
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1912 #ifdef DEBUG
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1913 av_log(s, AV_LOG_DEBUG, "Found time %li at sample #%u\n", (long)sample_time, sample);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1914 #endif
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1915 if (sample > sc->sample_count) {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1916 av_log(s, AV_LOG_ERROR, "mov: sample pos is too high, unable to seek (req. sample=%i, sample count=%ld)\n", sample, sc->sample_count);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1917 return -1;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1918 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1919
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1920 // Step 3. Find the prior sync. sample using the Sync sample atom (stss)
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1921 if (sc->keyframes) {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1922 a = 0;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1923 b = sc->keyframe_count - 1;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1924 while (a < b) {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1925 m = (a + b + 1) >> 1;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1926 if (sc->keyframes[m] > sample) {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1927 b = m - 1;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1928 } else {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1929 a = m;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1930 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1931 #ifdef DEBUG
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1932 // av_log(s, AV_LOG_DEBUG, "a=%i (%i) b=%i (%i) m=%i (%i) stream #%i\n", a, sc->keyframes[a], b, sc->keyframes[b], m, sc->keyframes[m], mov_idx);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1933 #endif
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1934 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1935 seek_sample = sc->keyframes[a];
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1936 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1937 else
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1938 seek_sample = sample; // else all samples are key frames
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1939 #ifdef DEBUG
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1940 av_log(s, AV_LOG_DEBUG, "Found nearest keyframe at sample #%i \n", seek_sample);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1941 #endif
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1942
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1943 // Step 4. Find the chunk of the sample using the Sample-to-chunk-atom (stsc)
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1944 for (first_chunk_sample = 1, i = 0; i < (sc->sample_to_chunk_sz - 1); i++) {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1945 b = (sc->sample_to_chunk[i + 1].first - sc->sample_to_chunk[i].first) * sc->sample_to_chunk[i].count;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1946 if (seek_sample >= first_chunk_sample && seek_sample < (first_chunk_sample + b))
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1947 break;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1948 first_chunk_sample += b;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1949 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1950 chunk = sc->sample_to_chunk[i].first + (seek_sample - first_chunk_sample) / sc->sample_to_chunk[i].count;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1951 left_in_chunk = sc->sample_to_chunk[i].count - (seek_sample - first_chunk_sample) % sc->sample_to_chunk[i].count;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1952 first_chunk_sample += ((seek_sample - first_chunk_sample) / sc->sample_to_chunk[i].count) * sc->sample_to_chunk[i].count;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1953 sample_to_chunk_idx = i;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1954 #ifdef DEBUG
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1955 av_log(s, AV_LOG_DEBUG, "Sample was found in chunk #%i at sample offset %i (idx %i)\n", chunk, seek_sample - first_chunk_sample, sample_to_chunk_idx);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1956 #endif
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1957
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1958 // Step 5. Find the offset of the chunk using the chunk offset atom
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1959 if (!sc->chunk_offsets) {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1960 av_log(s, AV_LOG_ERROR, "mov: no chunk offset atom, unable to seek\n");
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1961 return -1;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1962 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1963 if (chunk > sc->chunk_count) {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1964 av_log(s, AV_LOG_ERROR, "mov: chunk offset atom too short, unable to seek (req. chunk=%i, chunk count=%li)\n", chunk, sc->chunk_count);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1965 return -1;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1966 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1967 chunk_file_offset = sc->chunk_offsets[chunk - 1];
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1968 #ifdef DEBUG
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1969 av_log(s, AV_LOG_DEBUG, "Chunk file offset is #%llu \n", chunk_file_offset);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1970 #endif
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1971
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1972 // Step 6. Find the byte offset within the chunk using the sample size atom
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1973 sample_file_offset = chunk_file_offset;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1974 if (sc->sample_size)
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1975 sample_file_offset += (seek_sample - first_chunk_sample) * sc->sample_size;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1976 else {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1977 for (i = 0; i < (seek_sample - first_chunk_sample); i++) {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1978 sample_file_offset += sc->sample_sizes[first_chunk_sample + i - 1];
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1979 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1980 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1981 #ifdef DEBUG
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1982 av_log(s, AV_LOG_DEBUG, "Sample file offset is #%llu \n", sample_file_offset);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1983 #endif
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1984
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1985 // Step 6. Update the parser
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1986 mov->partial = sc;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1987 mov->next_chunk_offset = sample_file_offset;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1988 // Update current stream state
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1989 sc->current_sample = seek_sample - 1; // zero based
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1990 sc->left_in_chunk = left_in_chunk;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1991 sc->next_chunk = chunk; // +1 -1 (zero based)
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1992 sc->sample_to_chunk_index = sample_to_chunk_idx;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1993
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1994 // Update other streams
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1995 for (i = 0; i<mov->total_streams; i++) {
492
0ed5d359f63a compilation of mov.c broken patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 491
diff changeset
1996 MOVStreamContext *msc;
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1997 if (i == mov_idx) continue;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
1998 // Find the nearest 'next' chunk
492
0ed5d359f63a compilation of mov.c broken patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 491
diff changeset
1999 msc = mov->streams[i];
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2000 a = 0;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2001 b = msc->chunk_count - 1;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2002 while (a < b) {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2003 m = (a + b + 1) >> 1;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2004 if (msc->chunk_offsets[m] > chunk_file_offset) {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2005 b = m - 1;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2006 } else {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2007 a = m;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2008 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2009 #ifdef DEBUG
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2010 /* av_log(s, AV_LOG_DEBUG, "a=%i (%li) b=%i (%li) m=%i (%li) stream #%i\n"
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2011 , a, (long)msc->chunk_offsets[a], b, (long)msc->chunk_offsets[b], m, (long)msc->chunk_offsets[m], i); */
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2012 #endif
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2013 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2014 msc->next_chunk = a;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2015 if (msc->chunk_offsets[a] < chunk_file_offset && a < (msc->chunk_count-1))
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2016 msc->next_chunk ++;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2017 #ifdef DEBUG
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2018 av_log(s, AV_LOG_DEBUG, "Nearest next chunk for stream #%i is #%i @%lli\n", i, msc->next_chunk+1, msc->chunk_offsets[msc->next_chunk]);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2019 #endif
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2020 // Compute sample count and index in the sample_to_chunk table (what a pity)
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2021 msc->sample_to_chunk_index = 0;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2022 msc->current_sample = 0;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2023 for(; msc->sample_to_chunk_index < (msc->sample_to_chunk_sz - 1)
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2024 && msc->sample_to_chunk[msc->sample_to_chunk_index + 1].first <= (1 + msc->next_chunk); msc->sample_to_chunk_index++) {
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2025 msc->current_sample += (msc->sample_to_chunk[msc->sample_to_chunk_index + 1].first - msc->sample_to_chunk[msc->sample_to_chunk_index].first) \
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2026 * msc->sample_to_chunk[msc->sample_to_chunk_index].count;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2027 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2028 msc->current_sample += (msc->next_chunk - (msc->sample_to_chunk[msc->sample_to_chunk_index].first - 1)) * sc->sample_to_chunk[msc->sample_to_chunk_index].count;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2029 msc->left_in_chunk = msc->sample_to_chunk[msc->sample_to_chunk_index].count - 1;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2030 #ifdef DEBUG
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2031 av_log(s, AV_LOG_DEBUG, "Next Sample for stream #%i is #%i @%i\n", i, msc->current_sample + 1, msc->sample_to_chunk_index + 1);
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2032 #endif
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2033 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2034 return 0;
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2035 }
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2036 #endif
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2037
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2038 static int mov_read_close(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2039 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2040 int i;
121
b9bd706c1ac3 * simplified parameters for parse routines
kabi
parents: 118
diff changeset
2041 MOVContext *mov = (MOVContext *) s->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2042 for(i=0; i<mov->total_streams; i++)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2043 mov_free_stream_context(mov->streams[i]);
130
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
2044 /* free color tabs */
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
2045 for(i=0; i<mov->ctab_size; i++)
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
2046 av_freep(&mov->ctab[i]);
f607ed6aa365 * support for AAC audio (esds decoding - using extradata)
kabi
parents: 129
diff changeset
2047 av_freep(&mov->ctab);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2048 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2049 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2050
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2051 static AVInputFormat mov_iformat = {
286
eccf0c3e3289 Using the extension m4a for audio only MPEG-4 files is increasingly
michael
parents: 266
diff changeset
2052 "mov,mp4,m4a,3gp",
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2053 "QuickTime/MPEG4 format",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2054 sizeof(MOVContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2055 mov_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2056 mov_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2057 mov_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2058 mov_read_close,
491
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2059 #if defined(MOV_SPLIT_CHUNKS) && defined(MOV_SEEK)
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2060 mov_read_seek,
4cf46e9a1bb8 Seeking in .mov/.mp4 files
michael
parents: 489
diff changeset
2061 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2062 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2063
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2064 int mov_init(void)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2065 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2066 av_register_input_format(&mov_iformat);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2067 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2068 }