Mercurial > libavformat.hg
annotate utils.c @ 2253:3677c1667194 libavformat
avoid division by zero in av_find_stream_info() when no time base is set
author | mru |
---|---|
date | Sat, 14 Jul 2007 12:42:57 +0000 |
parents | 639597604897 |
children | c3d2ed2063a0 |
rev | line source |
---|---|
0 | 1 /* |
2 * Various utilities for ffmpeg system | |
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard | |
4 * | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1351
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1351
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1351
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
0 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1351
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
0 | 11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1351
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
0 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1351
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
887
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 20 */ |
21 #include "avformat.h" | |
1142
e3a585883bbd
Move initialisations and internal symbols in allformats.h,
gpoirier
parents:
1141
diff
changeset
|
22 #include "allformats.h" |
1278 | 23 #include "opt.h" |
2189 | 24 #include "avstring.h" |
2243
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
25 #include "riff.h" |
0 | 26 |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
27 #undef NDEBUG |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
28 #include <assert.h> |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
29 |
802
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
30 /** |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
31 * @file libavformat/utils.c |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
32 * Various utility functions for using ffmpeg library. |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
33 */ |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
34 |
1135
107f90e1551b
cleanup patch from Diego Petten <flameeyes@gentoo.org>
lu_zero
parents:
1127
diff
changeset
|
35 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den); |
107f90e1551b
cleanup patch from Diego Petten <flameeyes@gentoo.org>
lu_zero
parents:
1127
diff
changeset
|
36 static void av_frac_add(AVFrac *f, int64_t incr); |
107f90e1551b
cleanup patch from Diego Petten <flameeyes@gentoo.org>
lu_zero
parents:
1127
diff
changeset
|
37 |
802
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
38 /** head of registered input format linked list. */ |
512
8dfd00fb6a6d
Minor Patch for shared libs on Mac OSX by (Bill May <wmay at cisco dot com>)
michael
parents:
511
diff
changeset
|
39 AVInputFormat *first_iformat = NULL; |
802
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
40 /** head of registered output format linked list. */ |
512
8dfd00fb6a6d
Minor Patch for shared libs on Mac OSX by (Bill May <wmay at cisco dot com>)
michael
parents:
511
diff
changeset
|
41 AVOutputFormat *first_oformat = NULL; |
0 | 42 |
43 void av_register_input_format(AVInputFormat *format) | |
44 { | |
45 AVInputFormat **p; | |
46 p = &first_iformat; | |
47 while (*p != NULL) p = &(*p)->next; | |
48 *p = format; | |
49 format->next = NULL; | |
50 } | |
51 | |
52 void av_register_output_format(AVOutputFormat *format) | |
53 { | |
54 AVOutputFormat **p; | |
55 p = &first_oformat; | |
56 while (*p != NULL) p = &(*p)->next; | |
57 *p = format; | |
58 format->next = NULL; | |
59 } | |
60 | |
61 int match_ext(const char *filename, const char *extensions) | |
62 { | |
63 const char *ext, *p; | |
64 char ext1[32], *q; | |
65 | |
453 | 66 if(!filename) |
67 return 0; | |
885 | 68 |
0 | 69 ext = strrchr(filename, '.'); |
70 if (ext) { | |
71 ext++; | |
72 p = extensions; | |
73 for(;;) { | |
74 q = ext1; | |
885 | 75 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1) |
0 | 76 *q++ = *p++; |
77 *q = '\0'; | |
885 | 78 if (!strcasecmp(ext1, ext)) |
0 | 79 return 1; |
885 | 80 if (*p == '\0') |
0 | 81 break; |
82 p++; | |
83 } | |
84 } | |
85 return 0; | |
86 } | |
87 | |
885 | 88 AVOutputFormat *guess_format(const char *short_name, const char *filename, |
0 | 89 const char *mime_type) |
90 { | |
91 AVOutputFormat *fmt, *fmt_found; | |
92 int score_max, score; | |
93 | |
20 | 94 /* specific test for image sequences */ |
1169 | 95 #ifdef CONFIG_IMAGE2_MUXER |
885 | 96 if (!short_name && filename && |
1291
185190bdc185
Clarified API for numbered sequences, patch by Michel Bardiaux % mbardiaux A mediaxim P be %
gpoirier
parents:
1285
diff
changeset
|
97 av_filename_number_test(filename) && |
583 | 98 av_guess_image2_codec(filename) != CODEC_ID_NONE) { |
99 return guess_format("image2", NULL, NULL); | |
100 } | |
1169 | 101 #endif |
0 | 102 /* find the proper file type */ |
103 fmt_found = NULL; | |
104 score_max = 0; | |
105 fmt = first_oformat; | |
106 while (fmt != NULL) { | |
107 score = 0; | |
108 if (fmt->name && short_name && !strcmp(fmt->name, short_name)) | |
109 score += 100; | |
110 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type)) | |
111 score += 10; | |
885 | 112 if (filename && fmt->extensions && |
0 | 113 match_ext(filename, fmt->extensions)) { |
114 score += 5; | |
115 } | |
116 if (score > score_max) { | |
117 score_max = score; | |
118 fmt_found = fmt; | |
119 } | |
120 fmt = fmt->next; | |
121 } | |
122 return fmt_found; | |
885 | 123 } |
124 | |
125 AVOutputFormat *guess_stream_format(const char *short_name, const char *filename, | |
0 | 126 const char *mime_type) |
127 { | |
128 AVOutputFormat *fmt = guess_format(short_name, filename, mime_type); | |
129 | |
130 if (fmt) { | |
131 AVOutputFormat *stream_fmt; | |
132 char stream_format_name[64]; | |
133 | |
134 snprintf(stream_format_name, sizeof(stream_format_name), "%s_stream", fmt->name); | |
135 stream_fmt = guess_format(stream_format_name, NULL, NULL); | |
136 | |
137 if (stream_fmt) | |
138 fmt = stream_fmt; | |
139 } | |
140 | |
141 return fmt; | |
142 } | |
143 | |
885 | 144 enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name, |
583 | 145 const char *filename, const char *mime_type, enum CodecType type){ |
146 if(type == CODEC_TYPE_VIDEO){ | |
147 enum CodecID codec_id= CODEC_ID_NONE; | |
148 | |
1169 | 149 #ifdef CONFIG_IMAGE2_MUXER |
586 | 150 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){ |
583 | 151 codec_id= av_guess_image2_codec(filename); |
152 } | |
1169 | 153 #endif |
583 | 154 if(codec_id == CODEC_ID_NONE) |
155 codec_id= fmt->video_codec; | |
156 return codec_id; | |
157 }else if(type == CODEC_TYPE_AUDIO) | |
158 return fmt->audio_codec; | |
159 else | |
160 return CODEC_ID_NONE; | |
161 } | |
162 | |
0 | 163 AVInputFormat *av_find_input_format(const char *short_name) |
164 { | |
165 AVInputFormat *fmt; | |
166 for(fmt = first_iformat; fmt != NULL; fmt = fmt->next) { | |
167 if (!strcmp(fmt->name, short_name)) | |
168 return fmt; | |
169 } | |
170 return NULL; | |
171 } | |
172 | |
173 /* memory handling */ | |
174 | |
797
f5a231a9a2f1
support changing in bitstream global headers into extradata style and back
michael
parents:
786
diff
changeset
|
175 void av_destruct_packet(AVPacket *pkt) |
53
fb671d87824e
zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents:
32
diff
changeset
|
176 { |
fb671d87824e
zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents:
32
diff
changeset
|
177 av_free(pkt->data); |
fb671d87824e
zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents:
32
diff
changeset
|
178 pkt->data = NULL; pkt->size = 0; |
fb671d87824e
zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents:
32
diff
changeset
|
179 } |
fb671d87824e
zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents:
32
diff
changeset
|
180 |
2139 | 181 void av_init_packet(AVPacket *pkt) |
182 { | |
183 pkt->pts = AV_NOPTS_VALUE; | |
184 pkt->dts = AV_NOPTS_VALUE; | |
185 pkt->pos = -1; | |
186 pkt->duration = 0; | |
187 pkt->flags = 0; | |
188 pkt->stream_index = 0; | |
189 pkt->destruct= av_destruct_packet_nofree; | |
190 } | |
191 | |
0 | 192 int av_new_packet(AVPacket *pkt, int size) |
193 { | |
1435
3d757766c236
remove gcc warning about void * used in arithmetic
bcoudurier
parents:
1423
diff
changeset
|
194 uint8_t *data; |
639 | 195 if((unsigned)size > (unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE) |
885 | 196 return AVERROR_NOMEM; |
639 | 197 data = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE); |
53
fb671d87824e
zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents:
32
diff
changeset
|
198 if (!data) |
0 | 199 return AVERROR_NOMEM; |
53
fb671d87824e
zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents:
32
diff
changeset
|
200 memset(data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE); |
0 | 201 |
53
fb671d87824e
zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents:
32
diff
changeset
|
202 av_init_packet(pkt); |
885 | 203 pkt->data = data; |
53
fb671d87824e
zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents:
32
diff
changeset
|
204 pkt->size = size; |
fb671d87824e
zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents:
32
diff
changeset
|
205 pkt->destruct = av_destruct_packet; |
0 | 206 return 0; |
207 } | |
208 | |
775 | 209 int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size) |
210 { | |
211 int ret= av_new_packet(pkt, size); | |
212 | |
213 if(ret<0) | |
214 return ret; | |
215 | |
216 pkt->pos= url_ftell(s); | |
217 | |
218 ret= get_buffer(s, pkt->data, size); | |
219 if(ret<=0) | |
220 av_free_packet(pkt); | |
221 else | |
222 pkt->size= ret; | |
223 | |
224 return ret; | |
225 } | |
226 | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
227 int av_dup_packet(AVPacket *pkt) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
228 { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
229 if (pkt->destruct != av_destruct_packet) { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
230 uint8_t *data; |
330 | 231 /* we duplicate the packet and don't forget to put the padding |
232 again */ | |
639 | 233 if((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE) |
885 | 234 return AVERROR_NOMEM; |
330 | 235 data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE); |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
236 if (!data) { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
237 return AVERROR_NOMEM; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
238 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
239 memcpy(data, pkt->data, pkt->size); |
330 | 240 memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE); |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
241 pkt->data = data; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
242 pkt->destruct = av_destruct_packet; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
243 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
244 return 0; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
245 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
246 |
1291
185190bdc185
Clarified API for numbered sequences, patch by Michel Bardiaux % mbardiaux A mediaxim P be %
gpoirier
parents:
1285
diff
changeset
|
247 int av_filename_number_test(const char *filename) |
0 | 248 { |
249 char buf[1024]; | |
1291
185190bdc185
Clarified API for numbered sequences, patch by Michel Bardiaux % mbardiaux A mediaxim P be %
gpoirier
parents:
1285
diff
changeset
|
250 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0); |
0 | 251 } |
252 | |
1956
a60ed230798e
require at least a score of AVPROBE_SCORE_MAX/4 or reaching of PROBE_BUF_MAX
michael
parents:
1941
diff
changeset
|
253 static AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max) |
0 | 254 { |
255 AVInputFormat *fmt1, *fmt; | |
1956
a60ed230798e
require at least a score of AVPROBE_SCORE_MAX/4 or reaching of PROBE_BUF_MAX
michael
parents:
1941
diff
changeset
|
256 int score; |
0 | 257 |
258 fmt = NULL; | |
259 for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) { | |
1674
a216ebdce1ff
Demuxers with AVFMT_NOFILE will open a (possibly different) file themselves,
reimar
parents:
1627
diff
changeset
|
260 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE)) |
0 | 261 continue; |
262 score = 0; | |
263 if (fmt1->read_probe) { | |
264 score = fmt1->read_probe(pd); | |
265 } else if (fmt1->extensions) { | |
266 if (match_ext(pd->filename, fmt1->extensions)) { | |
267 score = 50; | |
268 } | |
885 | 269 } |
1956
a60ed230798e
require at least a score of AVPROBE_SCORE_MAX/4 or reaching of PROBE_BUF_MAX
michael
parents:
1941
diff
changeset
|
270 if (score > *score_max) { |
a60ed230798e
require at least a score of AVPROBE_SCORE_MAX/4 or reaching of PROBE_BUF_MAX
michael
parents:
1941
diff
changeset
|
271 *score_max = score; |
0 | 272 fmt = fmt1; |
273 } | |
274 } | |
275 return fmt; | |
276 } | |
277 | |
1956
a60ed230798e
require at least a score of AVPROBE_SCORE_MAX/4 or reaching of PROBE_BUF_MAX
michael
parents:
1941
diff
changeset
|
278 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){ |
a60ed230798e
require at least a score of AVPROBE_SCORE_MAX/4 or reaching of PROBE_BUF_MAX
michael
parents:
1941
diff
changeset
|
279 int score=0; |
a60ed230798e
require at least a score of AVPROBE_SCORE_MAX/4 or reaching of PROBE_BUF_MAX
michael
parents:
1941
diff
changeset
|
280 return av_probe_input_format2(pd, is_opened, &score); |
a60ed230798e
require at least a score of AVPROBE_SCORE_MAX/4 or reaching of PROBE_BUF_MAX
michael
parents:
1941
diff
changeset
|
281 } |
a60ed230798e
require at least a score of AVPROBE_SCORE_MAX/4 or reaching of PROBE_BUF_MAX
michael
parents:
1941
diff
changeset
|
282 |
0 | 283 /************************************************************/ |
284 /* input media file */ | |
285 | |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
286 /** |
802
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
287 * Open a media file from an IO stream. 'fmt' must be specified. |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
288 */ |
371 | 289 static const char* format_to_name(void* ptr) |
370
845f9de2c883
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
367
diff
changeset
|
290 { |
371 | 291 AVFormatContext* fc = (AVFormatContext*) ptr; |
370
845f9de2c883
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
367
diff
changeset
|
292 if(fc->iformat) return fc->iformat->name; |
845f9de2c883
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
367
diff
changeset
|
293 else if(fc->oformat) return fc->oformat->name; |
845f9de2c883
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
367
diff
changeset
|
294 else return "NULL"; |
845f9de2c883
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
367
diff
changeset
|
295 } |
845f9de2c883
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
367
diff
changeset
|
296 |
1314 | 297 #define OFFSET(x) offsetof(AVFormatContext,x) |
2164 | 298 #define DEFAULT 0 //should be NAN but it does not work as it is not a constant in glibc as required by ANSI/ISO C |
1278 | 299 //these names are too long to be readable |
300 #define E AV_OPT_FLAG_ENCODING_PARAM | |
301 #define D AV_OPT_FLAG_DECODING_PARAM | |
302 | |
303 static const AVOption options[]={ | |
1309 | 304 {"probesize", NULL, OFFSET(probesize), FF_OPT_TYPE_INT, 32000, 32, INT_MAX, D}, /* 32000 from mpegts.c: 1.0 second at 24Mbit/s */ |
1319
d93c1458d7be
Migrate the "muxrate" OptionDef option to become an AVOption.
takis
parents:
1314
diff
changeset
|
305 {"muxrate", "set mux rate", OFFSET(mux_rate), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E}, |
1320
5cda22873c51
Migrate the "packetsize" OptionDef option to become an AVOption.
takis
parents:
1319
diff
changeset
|
306 {"packetsize", "set packet size", OFFSET(packet_size), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E}, |
1423 | 307 {"fflags", NULL, OFFSET(flags), FF_OPT_TYPE_FLAGS, DEFAULT, INT_MIN, INT_MAX, D|E, "fflags"}, |
1294
12398b868e18
ignore index parameter to ignore the ODML index in avi
michael
parents:
1291
diff
changeset
|
308 {"ignidx", "ignore index", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_IGNIDX, INT_MIN, INT_MAX, D, "fflags"}, |
12398b868e18
ignore index parameter to ignore the ODML index in avi
michael
parents:
1291
diff
changeset
|
309 {"genpts", "generate pts", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_GENPTS, INT_MIN, INT_MAX, D, "fflags"}, |
1309 | 310 {"track", " set the track number", OFFSET(track), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E}, |
1301
8b14b8103d9f
enable setting the year and track number using AVOption
gpoirier
parents:
1300
diff
changeset
|
311 {"year", "set the year", OFFSET(year), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, E}, |
1984 | 312 {"analyzeduration", "how many microseconds are analyzed to estimate duration", OFFSET(max_analyze_duration), FF_OPT_TYPE_INT, 3*AV_TIME_BASE, 0, INT_MAX, D}, |
1278 | 313 {NULL}, |
314 }; | |
315 | |
1303
44c593741578
undefines a few temporary defines which were not undefined after their usage.
gpoirier
parents:
1301
diff
changeset
|
316 #undef E |
44c593741578
undefines a few temporary defines which were not undefined after their usage.
gpoirier
parents:
1301
diff
changeset
|
317 #undef D |
44c593741578
undefines a few temporary defines which were not undefined after their usage.
gpoirier
parents:
1301
diff
changeset
|
318 #undef DEFAULT |
44c593741578
undefines a few temporary defines which were not undefined after their usage.
gpoirier
parents:
1301
diff
changeset
|
319 |
1278 | 320 static const AVClass av_format_context_class = { "AVFormatContext", format_to_name, options }; |
321 | |
1626
8a13bce78882
remove #if obsoleted after last major version bump
bcoudurier
parents:
1625
diff
changeset
|
322 static void avformat_get_context_defaults(AVFormatContext *s) |
8a13bce78882
remove #if obsoleted after last major version bump
bcoudurier
parents:
1625
diff
changeset
|
323 { |
1278 | 324 memset(s, 0, sizeof(AVFormatContext)); |
1279
a12e0b434174
added option probesize; at the moment only used by mpegts.c
nicodvb
parents:
1278
diff
changeset
|
325 |
1307 | 326 s->av_class = &av_format_context_class; |
327 | |
328 av_opt_set_defaults(s); | |
1278 | 329 } |
370
845f9de2c883
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
367
diff
changeset
|
330 |
845f9de2c883
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
367
diff
changeset
|
331 AVFormatContext *av_alloc_format_context(void) |
845f9de2c883
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
367
diff
changeset
|
332 { |
845f9de2c883
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
367
diff
changeset
|
333 AVFormatContext *ic; |
1313 | 334 ic = av_malloc(sizeof(AVFormatContext)); |
370
845f9de2c883
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
367
diff
changeset
|
335 if (!ic) return ic; |
1278 | 336 avformat_get_context_defaults(ic); |
371 | 337 ic->av_class = &av_format_context_class; |
370
845f9de2c883
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
367
diff
changeset
|
338 return ic; |
845f9de2c883
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
367
diff
changeset
|
339 } |
845f9de2c883
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
367
diff
changeset
|
340 |
885 | 341 int av_open_input_stream(AVFormatContext **ic_ptr, |
342 ByteIOContext *pb, const char *filename, | |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
343 AVInputFormat *fmt, AVFormatParameters *ap) |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
344 { |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
345 int err; |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
346 AVFormatContext *ic; |
1003 | 347 AVFormatParameters default_ap; |
348 | |
349 if(!ap){ | |
350 ap=&default_ap; | |
351 memset(ap, 0, sizeof(default_ap)); | |
352 } | |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
353 |
1278 | 354 if(!ap->prealloced_context) |
355 ic = av_alloc_format_context(); | |
356 else | |
357 ic = *ic_ptr; | |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
358 if (!ic) { |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
359 err = AVERROR_NOMEM; |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
360 goto fail; |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
361 } |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
362 ic->iformat = fmt; |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
363 if (pb) |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
364 ic->pb = *pb; |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
365 ic->duration = AV_NOPTS_VALUE; |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
366 ic->start_time = AV_NOPTS_VALUE; |
2189 | 367 av_strlcpy(ic->filename, filename, sizeof(ic->filename)); |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
368 |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
369 /* allocate private data */ |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
370 if (fmt->priv_data_size > 0) { |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
371 ic->priv_data = av_mallocz(fmt->priv_data_size); |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
372 if (!ic->priv_data) { |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
373 err = AVERROR_NOMEM; |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
374 goto fail; |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
375 } |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
376 } else { |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
377 ic->priv_data = NULL; |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
378 } |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
379 |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
380 err = ic->iformat->read_header(ic, ap); |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
381 if (err < 0) |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
382 goto fail; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
383 |
1478 | 384 if (pb && !ic->data_offset) |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
385 ic->data_offset = url_ftell(&ic->pb); |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
386 |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
387 *ic_ptr = ic; |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
388 return 0; |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
389 fail: |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
390 if (ic) { |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
391 av_freep(&ic->priv_data); |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
392 } |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
393 av_free(ic); |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
394 *ic_ptr = NULL; |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
395 return err; |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
396 } |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
397 |
802
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
398 /** Size of probe buffer, for guessing file type from file contents. */ |
922
7f20b3ce1100
dynamically increase probe buffer until format is detected
michael
parents:
915
diff
changeset
|
399 #define PROBE_BUF_MIN 2048 |
1111 | 400 #define PROBE_BUF_MAX (1<<20) |
0 | 401 |
885 | 402 int av_open_input_file(AVFormatContext **ic_ptr, const char *filename, |
0 | 403 AVInputFormat *fmt, |
404 int buf_size, | |
405 AVFormatParameters *ap) | |
406 { | |
922
7f20b3ce1100
dynamically increase probe buffer until format is detected
michael
parents:
915
diff
changeset
|
407 int err, must_open_file, file_opened, probe_size; |
0 | 408 AVProbeData probe_data, *pd = &probe_data; |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
409 ByteIOContext pb1, *pb = &pb1; |
885 | 410 |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
411 file_opened = 0; |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
412 pd->filename = ""; |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
413 if (filename) |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
414 pd->filename = filename; |
922
7f20b3ce1100
dynamically increase probe buffer until format is detected
michael
parents:
915
diff
changeset
|
415 pd->buf = NULL; |
0 | 416 pd->buf_size = 0; |
417 | |
418 if (!fmt) { | |
419 /* guess format if no file can be opened */ | |
420 fmt = av_probe_input_format(pd, 0); | |
421 } | |
422 | |
172 | 423 /* do not open file if the format does not need it. XXX: specific |
424 hack needed to handle RTSP/TCP */ | |
425 must_open_file = 1; | |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
426 if (fmt && (fmt->flags & AVFMT_NOFILE)) { |
172 | 427 must_open_file = 0; |
2165 | 428 pb= NULL; //FIXME this or memset(pb, 0, sizeof(ByteIOContext)); otherwise it is uninitialized |
172 | 429 } |
430 | |
431 if (!fmt || must_open_file) { | |
20 | 432 /* if no file needed do not try to open one */ |
2080 | 433 if ((err=url_fopen(pb, filename, URL_RDONLY)) < 0) { |
0 | 434 goto fail; |
435 } | |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
436 file_opened = 1; |
0 | 437 if (buf_size > 0) { |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
438 url_setbufsize(pb, buf_size); |
0 | 439 } |
922
7f20b3ce1100
dynamically increase probe buffer until format is detected
michael
parents:
915
diff
changeset
|
440 |
7f20b3ce1100
dynamically increase probe buffer until format is detected
michael
parents:
915
diff
changeset
|
441 for(probe_size= PROBE_BUF_MIN; probe_size<=PROBE_BUF_MAX && !fmt; probe_size<<=1){ |
1956
a60ed230798e
require at least a score of AVPROBE_SCORE_MAX/4 or reaching of PROBE_BUF_MAX
michael
parents:
1941
diff
changeset
|
442 int score= probe_size < PROBE_BUF_MAX ? AVPROBE_SCORE_MAX/4 : 0; |
0 | 443 /* read probe data */ |
2001
1a3c9056982a
allocate 32 extra bytes at the end of the probe buffer and remove most probe buf_size checks
michael
parents:
1984
diff
changeset
|
444 pd->buf= av_realloc(pd->buf, probe_size + AVPROBE_PADDING_SIZE); |
922
7f20b3ce1100
dynamically increase probe buffer until format is detected
michael
parents:
915
diff
changeset
|
445 pd->buf_size = get_buffer(pb, pd->buf, probe_size); |
1824 | 446 if (url_fseek(pb, 0, SEEK_SET) < 0) { |
502
813b0119a98e
ffserver fixes by (Koos Vriezen <koos.vriezen at xs4all dot nl>)
michael
parents:
497
diff
changeset
|
447 url_fclose(pb); |
813b0119a98e
ffserver fixes by (Koos Vriezen <koos.vriezen at xs4all dot nl>)
michael
parents:
497
diff
changeset
|
448 if (url_fopen(pb, filename, URL_RDONLY) < 0) { |
941
5e15da09cd6b
Fix for url_fclose() being called on an already closed file based on a patch by (<Colin Ward> hitman codehq org)
michael
parents:
927
diff
changeset
|
449 file_opened = 0; |
502
813b0119a98e
ffserver fixes by (Koos Vriezen <koos.vriezen at xs4all dot nl>)
michael
parents:
497
diff
changeset
|
450 err = AVERROR_IO; |
813b0119a98e
ffserver fixes by (Koos Vriezen <koos.vriezen at xs4all dot nl>)
michael
parents:
497
diff
changeset
|
451 goto fail; |
813b0119a98e
ffserver fixes by (Koos Vriezen <koos.vriezen at xs4all dot nl>)
michael
parents:
497
diff
changeset
|
452 } |
813b0119a98e
ffserver fixes by (Koos Vriezen <koos.vriezen at xs4all dot nl>)
michael
parents:
497
diff
changeset
|
453 } |
922
7f20b3ce1100
dynamically increase probe buffer until format is detected
michael
parents:
915
diff
changeset
|
454 /* guess file format */ |
1956
a60ed230798e
require at least a score of AVPROBE_SCORE_MAX/4 or reaching of PROBE_BUF_MAX
michael
parents:
1941
diff
changeset
|
455 fmt = av_probe_input_format2(pd, 1, &score); |
0 | 456 } |
922
7f20b3ce1100
dynamically increase probe buffer until format is detected
michael
parents:
915
diff
changeset
|
457 av_freep(&pd->buf); |
0 | 458 } |
459 | |
460 /* if still no format found, error */ | |
461 if (!fmt) { | |
462 err = AVERROR_NOFMT; | |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
463 goto fail; |
0 | 464 } |
885 | 465 |
0 | 466 /* XXX: suppress this hack for redirectors */ |
2053 | 467 #ifdef CONFIG_REDIR_DEMUXER |
1167 | 468 if (fmt == &redir_demuxer) { |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
469 err = redir_open(ic_ptr, pb); |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
470 url_fclose(pb); |
0 | 471 return err; |
472 } | |
11
932b59c66c60
mingw patch by (Bill Eldridge <bill at rfa dot org>)
michaelni
parents:
9
diff
changeset
|
473 #endif |
0 | 474 |
20 | 475 /* check filename in case of an image number is expected */ |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
476 if (fmt->flags & AVFMT_NEEDNUMBER) { |
1291
185190bdc185
Clarified API for numbered sequences, patch by Michel Bardiaux % mbardiaux A mediaxim P be %
gpoirier
parents:
1285
diff
changeset
|
477 if (!av_filename_number_test(filename)) { |
20 | 478 err = AVERROR_NUMEXPECTED; |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
479 goto fail; |
20 | 480 } |
481 } | |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
482 err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap); |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
483 if (err) |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
484 goto fail; |
0 | 485 return 0; |
486 fail: | |
922
7f20b3ce1100
dynamically increase probe buffer until format is detected
michael
parents:
915
diff
changeset
|
487 av_freep(&pd->buf); |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
488 if (file_opened) |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
489 url_fclose(pb); |
0 | 490 *ic_ptr = NULL; |
491 return err; | |
885 | 492 |
0 | 493 } |
494 | |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
495 /*******************************************************/ |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
496 |
0 | 497 int av_read_packet(AVFormatContext *s, AVPacket *pkt) |
498 { | |
2032 | 499 av_init_packet(pkt); |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
500 return s->iformat->read_packet(s, pkt); |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
501 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
502 |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
503 /**********************************************************/ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
504 |
802
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
505 /** |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
506 * Get the number of samples of an audio frame. Return (-1) if error. |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
507 */ |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
508 static int get_audio_frame_size(AVCodecContext *enc, int size) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
509 { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
510 int frame_size; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
511 |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
512 if (enc->frame_size <= 1) { |
1158 | 513 int bits_per_sample = av_get_bits_per_sample(enc->codec_id); |
514 | |
515 if (bits_per_sample) { | |
846
fd1c2109505e
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
842
diff
changeset
|
516 if (enc->channels == 0) |
fd1c2109505e
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
842
diff
changeset
|
517 return -1; |
1160 | 518 frame_size = (size << 3) / (bits_per_sample * enc->channels); |
1158 | 519 } else { |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
520 /* used for example by ADPCM codecs */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
521 if (enc->bit_rate == 0) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
522 return -1; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
523 frame_size = (size * 8 * enc->sample_rate) / enc->bit_rate; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
524 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
525 } else { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
526 frame_size = enc->frame_size; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
527 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
528 return frame_size; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
529 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
530 |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
531 |
802
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
532 /** |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
533 * Return the frame duration in seconds, return 0 if not available. |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
534 */ |
885 | 535 static void compute_frame_duration(int *pnum, int *pden, AVStream *st, |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
536 AVCodecParserContext *pc, AVPacket *pkt) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
537 { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
538 int frame_size; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
539 |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
540 *pnum = 0; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
541 *pden = 0; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
542 switch(st->codec->codec_type) { |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
543 case CODEC_TYPE_VIDEO: |
757 | 544 if(st->time_base.num*1000LL > st->time_base.den){ |
743 | 545 *pnum = st->time_base.num; |
546 *pden = st->time_base.den; | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
547 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){ |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
548 *pnum = st->codec->time_base.num; |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
549 *pden = st->codec->time_base.den; |
747
95c9cef3c3db
prefer container time_base for frame duration guess
michael
parents:
743
diff
changeset
|
550 if (pc && pc->repeat_pict) { |
95c9cef3c3db
prefer container time_base for frame duration guess
michael
parents:
743
diff
changeset
|
551 *pden *= 2; |
95c9cef3c3db
prefer container time_base for frame duration guess
michael
parents:
743
diff
changeset
|
552 *pnum = (*pnum) * (2 + pc->repeat_pict); |
95c9cef3c3db
prefer container time_base for frame duration guess
michael
parents:
743
diff
changeset
|
553 } |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
554 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
555 break; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
556 case CODEC_TYPE_AUDIO: |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
557 frame_size = get_audio_frame_size(st->codec, pkt->size); |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
558 if (frame_size < 0) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
559 break; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
560 *pnum = frame_size; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
561 *pden = st->codec->sample_rate; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
562 break; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
563 default: |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
564 break; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
565 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
566 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
567 |
570
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
568 static int is_intra_only(AVCodecContext *enc){ |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
569 if(enc->codec_type == CODEC_TYPE_AUDIO){ |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
570 return 1; |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
571 }else if(enc->codec_type == CODEC_TYPE_VIDEO){ |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
572 switch(enc->codec_id){ |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
573 case CODEC_ID_MJPEG: |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
574 case CODEC_ID_MJPEGB: |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
575 case CODEC_ID_LJPEG: |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
576 case CODEC_ID_RAWVIDEO: |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
577 case CODEC_ID_DVVIDEO: |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
578 case CODEC_ID_HUFFYUV: |
599 | 579 case CODEC_ID_FFVHUFF: |
570
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
580 case CODEC_ID_ASV1: |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
581 case CODEC_ID_ASV2: |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
582 case CODEC_ID_VCR1: |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
583 return 1; |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
584 default: break; |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
585 } |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
586 } |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
587 return 0; |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
588 } |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
589 |
464 | 590 static int64_t lsb2full(int64_t lsb, int64_t last_ts, int lsb_bits){ |
466 | 591 int64_t mask = lsb_bits < 64 ? (1LL<<lsb_bits)-1 : -1LL; |
464 | 592 int64_t delta= last_ts - mask/2; |
593 return ((lsb - delta)&mask) + delta; | |
594 } | |
595 | |
885 | 596 static void compute_pkt_fields(AVFormatContext *s, AVStream *st, |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
597 AVCodecParserContext *pc, AVPacket *pkt) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
598 { |
1927 | 599 int num, den, presentation_delayed, delay, i; |
2020 | 600 int64_t offset; |
464 | 601 /* handle wrapping */ |
468 | 602 if(st->cur_dts != AV_NOPTS_VALUE){ |
603 if(pkt->pts != AV_NOPTS_VALUE) | |
604 pkt->pts= lsb2full(pkt->pts, st->cur_dts, st->pts_wrap_bits); | |
605 if(pkt->dts != AV_NOPTS_VALUE) | |
606 pkt->dts= lsb2full(pkt->dts, st->cur_dts, st->pts_wrap_bits); | |
607 } | |
885 | 608 |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
609 if (pkt->duration == 0) { |
470 | 610 compute_frame_duration(&num, &den, st, pc, pkt); |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
611 if (den && num) { |
464 | 612 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num); |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
613 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
614 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
615 |
2020 | 616 /* correct timestamps with byte offset if demuxers only have timestamps on packet boundaries */ |
617 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){ | |
618 /* this will estimate bitrate based on this frame's duration and size */ | |
619 offset = av_rescale(pc->offset, pkt->duration, pkt->size); | |
620 if(pkt->pts != AV_NOPTS_VALUE) | |
621 pkt->pts += offset; | |
622 if(pkt->dts != AV_NOPTS_VALUE) | |
623 pkt->dts += offset; | |
624 } | |
625 | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
626 if(is_intra_only(st->codec)) |
570
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
627 pkt->flags |= PKT_FLAG_KEY; |
d82ccc7cff1c
set keyframe flag at a more central place instead of in every demuxer for containers which only store intra only streams
michael
parents:
563
diff
changeset
|
628 |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
629 /* do we have a video B frame ? */ |
1922
59d394f558b8
add a delay variable to hold the timestamp buffer size
michael
parents:
1921
diff
changeset
|
630 delay= st->codec->has_b_frames; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
631 presentation_delayed = 0; |
1928 | 632 /* XXX: need has_b_frame, but cannot get it if the codec is |
633 not initialized */ | |
634 if (delay && | |
635 pc && pc->pict_type != FF_B_TYPE) | |
636 presentation_delayed = 1; | |
2164 | 637 /* This may be redundant, but it should not hurt. */ |
1928 | 638 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts) |
639 presentation_delayed = 1; | |
885 | 640 |
468 | 641 if(st->cur_dts == AV_NOPTS_VALUE){ |
1922
59d394f558b8
add a delay variable to hold the timestamp buffer size
michael
parents:
1921
diff
changeset
|
642 st->cur_dts = -delay * pkt->duration; |
468 | 643 } |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
644 |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1442
diff
changeset
|
645 // av_log(NULL, AV_LOG_DEBUG, "IN delayed:%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64" st:%d pc:%p\n", presentation_delayed, pkt->pts, pkt->dts, st->cur_dts, pkt->stream_index, pc); |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
646 /* interpolate PTS and DTS if they are not present */ |
1928 | 647 if(delay <=1){ |
648 if (presentation_delayed) { | |
649 /* DTS = decompression time stamp */ | |
650 /* PTS = presentation time stamp */ | |
651 if (pkt->dts == AV_NOPTS_VALUE) | |
652 pkt->dts = st->last_IP_pts; | |
653 if (pkt->dts == AV_NOPTS_VALUE) | |
654 pkt->dts = st->cur_dts; | |
1925 | 655 |
1928 | 656 /* this is tricky: the dts must be incremented by the duration |
657 of the frame we are displaying, i.e. the last I or P frame */ | |
658 if (st->last_IP_duration == 0) | |
659 st->last_IP_duration = pkt->duration; | |
660 st->cur_dts = pkt->dts + st->last_IP_duration; | |
661 st->last_IP_duration = pkt->duration; | |
662 st->last_IP_pts= pkt->pts; | |
663 /* cannot compute PTS if not present (we can compute it only | |
664 by knowing the futur */ | |
1936 | 665 } else if(pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE || pkt->duration){ |
1928 | 666 if(pkt->pts != AV_NOPTS_VALUE && pkt->duration){ |
667 int64_t old_diff= FFABS(st->cur_dts - pkt->duration - pkt->pts); | |
668 int64_t new_diff= FFABS(st->cur_dts - pkt->pts); | |
669 if(old_diff < new_diff && old_diff < (pkt->duration>>3)){ | |
670 pkt->pts += pkt->duration; | |
671 // av_log(NULL, AV_LOG_DEBUG, "id:%d old:%"PRId64" new:%"PRId64" dur:%d cur:%"PRId64" size:%d\n", pkt->stream_index, old_diff, new_diff, pkt->duration, st->cur_dts, pkt->size); | |
672 } | |
618 | 673 } |
1928 | 674 |
675 /* presentation is not delayed : PTS and DTS are the same */ | |
676 if(pkt->pts == AV_NOPTS_VALUE) | |
677 pkt->pts = pkt->dts; | |
678 if(pkt->pts == AV_NOPTS_VALUE) | |
679 pkt->pts = st->cur_dts; | |
680 pkt->dts = pkt->pts; | |
681 st->cur_dts = pkt->pts + pkt->duration; | |
618 | 682 } |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
683 } |
1927 | 684 |
685 if(pkt->pts != AV_NOPTS_VALUE){ | |
686 st->pts_buffer[0]= pkt->pts; | |
687 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++) | |
688 st->pts_buffer[i]= (i-delay-1) * pkt->duration; | |
689 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++) | |
690 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]); | |
691 if(pkt->dts == AV_NOPTS_VALUE) | |
692 pkt->dts= st->pts_buffer[0]; | |
693 if(pkt->dts > st->cur_dts) | |
694 st->cur_dts = pkt->dts; | |
695 } | |
696 | |
697 // av_log(NULL, AV_LOG_ERROR, "OUTdelayed:%d/%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64"\n", presentation_delayed, delay, pkt->pts, pkt->dts, st->cur_dts); | |
885 | 698 |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
699 /* update flags */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
700 if (pc) { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
701 pkt->flags = 0; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
702 /* key frame computation */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
703 if (pc->pict_type == FF_I_TYPE) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
704 pkt->flags |= PKT_FLAG_KEY; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
705 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
706 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
707 |
535 | 708 void av_destruct_packet_nofree(AVPacket *pkt) |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
709 { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
710 pkt->data = NULL; pkt->size = 0; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
711 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
712 |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
713 static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
714 { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
715 AVStream *st; |
333 | 716 int len, ret, i; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
717 |
2032 | 718 av_init_packet(pkt); |
719 | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
720 for(;;) { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
721 /* select current input stream component */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
722 st = s->cur_st; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
723 if (st) { |
797
f5a231a9a2f1
support changing in bitstream global headers into extradata style and back
michael
parents:
786
diff
changeset
|
724 if (!st->need_parsing || !st->parser) { |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
725 /* no parsing needed: we just output the packet as is */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
726 /* raw data support */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
727 *pkt = s->cur_pkt; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
728 compute_pkt_fields(s, st, NULL, pkt); |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
729 s->cur_st = NULL; |
1244 | 730 break; |
708 | 731 } else if (s->cur_len > 0 && st->discard < AVDISCARD_ALL) { |
885 | 732 len = av_parser_parse(st->parser, st->codec, &pkt->data, &pkt->size, |
334
7f089db11f9a
fixed incorrect PTS/DTS logic in MPEG video case (caused rare PTS glitches if start codes were between two PES packets)
bellard
parents:
333
diff
changeset
|
733 s->cur_ptr, s->cur_len, |
7f089db11f9a
fixed incorrect PTS/DTS logic in MPEG video case (caused rare PTS glitches if start codes were between two PES packets)
bellard
parents:
333
diff
changeset
|
734 s->cur_pkt.pts, s->cur_pkt.dts); |
7f089db11f9a
fixed incorrect PTS/DTS logic in MPEG video case (caused rare PTS glitches if start codes were between two PES packets)
bellard
parents:
333
diff
changeset
|
735 s->cur_pkt.pts = AV_NOPTS_VALUE; |
7f089db11f9a
fixed incorrect PTS/DTS logic in MPEG video case (caused rare PTS glitches if start codes were between two PES packets)
bellard
parents:
333
diff
changeset
|
736 s->cur_pkt.dts = AV_NOPTS_VALUE; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
737 /* increment read pointer */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
738 s->cur_ptr += len; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
739 s->cur_len -= len; |
885 | 740 |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
741 /* return packet if any */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
742 if (pkt->size) { |
333 | 743 got_packet: |
2067 | 744 pkt->pos = s->cur_pkt.pos; // Isn't quite accurate but close. |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
745 pkt->duration = 0; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
746 pkt->stream_index = st->index; |
334
7f089db11f9a
fixed incorrect PTS/DTS logic in MPEG video case (caused rare PTS glitches if start codes were between two PES packets)
bellard
parents:
333
diff
changeset
|
747 pkt->pts = st->parser->pts; |
7f089db11f9a
fixed incorrect PTS/DTS logic in MPEG video case (caused rare PTS glitches if start codes were between two PES packets)
bellard
parents:
333
diff
changeset
|
748 pkt->dts = st->parser->dts; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
749 pkt->destruct = av_destruct_packet_nofree; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
750 compute_pkt_fields(s, st, st->parser, pkt); |
1756 | 751 |
752 if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & PKT_FLAG_KEY){ | |
753 av_add_index_entry(st, st->parser->frame_offset, pkt->dts, | |
754 0, 0, AVINDEX_KEYFRAME); | |
755 } | |
756 | |
1244 | 757 break; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
758 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
759 } else { |
319 | 760 /* free packet */ |
885 | 761 av_free_packet(&s->cur_pkt); |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
762 s->cur_st = NULL; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
763 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
764 } else { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
765 /* read next packet */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
766 ret = av_read_packet(s, &s->cur_pkt); |
333 | 767 if (ret < 0) { |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1756
diff
changeset
|
768 if (ret == AVERROR(EAGAIN)) |
333 | 769 return ret; |
770 /* return the last frames, if any */ | |
771 for(i = 0; i < s->nb_streams; i++) { | |
772 st = s->streams[i]; | |
797
f5a231a9a2f1
support changing in bitstream global headers into extradata style and back
michael
parents:
786
diff
changeset
|
773 if (st->parser && st->need_parsing) { |
885 | 774 av_parser_parse(st->parser, st->codec, |
775 &pkt->data, &pkt->size, | |
776 NULL, 0, | |
334
7f089db11f9a
fixed incorrect PTS/DTS logic in MPEG video case (caused rare PTS glitches if start codes were between two PES packets)
bellard
parents:
333
diff
changeset
|
777 AV_NOPTS_VALUE, AV_NOPTS_VALUE); |
333 | 778 if (pkt->size) |
779 goto got_packet; | |
780 } | |
781 } | |
782 /* no more packets: really terminates parsing */ | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
783 return ret; |
333 | 784 } |
885 | 785 |
462
b69898ffc92a
move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents:
453
diff
changeset
|
786 st = s->streams[s->cur_pkt.stream_index]; |
1244 | 787 if(st->codec->debug & FF_DEBUG_PTS) |
1388
3172bf94c066
Use proper PRI?64 macros for %ll? format to fix printf format warnings:
rathann
parents:
1386
diff
changeset
|
788 av_log(s, AV_LOG_DEBUG, "av_read_packet stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n", |
1244 | 789 s->cur_pkt.stream_index, |
790 s->cur_pkt.pts, | |
791 s->cur_pkt.dts, | |
792 s->cur_pkt.size); | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
793 |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
794 s->cur_st = st; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
795 s->cur_ptr = s->cur_pkt.data; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
796 s->cur_len = s->cur_pkt.size; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
797 if (st->need_parsing && !st->parser) { |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
798 st->parser = av_parser_init(st->codec->codec_id); |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
799 if (!st->parser) { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
800 /* no parser available : just output the raw packets */ |
2023 | 801 st->need_parsing = AVSTREAM_PARSE_NONE; |
802 }else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){ | |
842 | 803 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
804 } |
1756 | 805 if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){ |
806 st->parser->last_frame_offset= | |
807 st->parser->cur_offset= s->cur_pkt.pos; | |
808 } | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
809 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
810 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
811 } |
1244 | 812 if(st->codec->debug & FF_DEBUG_PTS) |
1388
3172bf94c066
Use proper PRI?64 macros for %ll? format to fix printf format warnings:
rathann
parents:
1386
diff
changeset
|
813 av_log(s, AV_LOG_DEBUG, "av_read_frame_internal stream=%d, pts=%"PRId64", dts=%"PRId64", size=%d\n", |
1244 | 814 pkt->stream_index, |
815 pkt->pts, | |
816 pkt->dts, | |
817 pkt->size); | |
818 | |
819 return 0; | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
820 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
821 |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
822 int av_read_frame(AVFormatContext *s, AVPacket *pkt) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
823 { |
0 | 824 AVPacketList *pktl; |
841
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
825 int eof=0; |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
826 const int genpts= s->flags & AVFMT_FLAG_GENPTS; |
0 | 827 |
841
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
828 for(;;){ |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
829 pktl = s->packet_buffer; |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
830 if (pktl) { |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
831 AVPacket *next_pkt= &pktl->pkt; |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
832 |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
833 if(genpts && next_pkt->dts != AV_NOPTS_VALUE){ |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
834 while(pktl && next_pkt->pts == AV_NOPTS_VALUE){ |
885 | 835 if( pktl->pkt.stream_index == next_pkt->stream_index |
841
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
836 && next_pkt->dts < pktl->pkt.dts |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
837 && pktl->pkt.pts != pktl->pkt.dts //not b frame |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
838 /*&& pktl->pkt.dts != AV_NOPTS_VALUE*/){ |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
839 next_pkt->pts= pktl->pkt.dts; |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
840 } |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
841 pktl= pktl->next; |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
842 } |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
843 pktl = s->packet_buffer; |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
844 } |
885 | 845 |
846 if( next_pkt->pts != AV_NOPTS_VALUE | |
847 || next_pkt->dts == AV_NOPTS_VALUE | |
841
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
848 || !genpts || eof){ |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
849 /* read packet from packet buffer, if there is data */ |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
850 *pkt = *next_pkt; |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
851 s->packet_buffer = pktl->next; |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
852 av_free(pktl); |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
853 return 0; |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
854 } |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
855 } |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
856 if(genpts){ |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
857 AVPacketList **plast_pktl= &s->packet_buffer; |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
858 int ret= av_read_frame_internal(s, pkt); |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
859 if(ret<0){ |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1756
diff
changeset
|
860 if(pktl && ret != AVERROR(EAGAIN)){ |
841
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
861 eof=1; |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
862 continue; |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
863 }else |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
864 return ret; |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
865 } |
885 | 866 |
841
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
867 /* duplicate the packet */ |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
868 if (av_dup_packet(pkt) < 0) |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
869 return AVERROR_NOMEM; |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
870 |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
871 while(*plast_pktl) plast_pktl= &(*plast_pktl)->next; //FIXME maybe maintain pointer to the last? |
885 | 872 |
841
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
873 pktl = av_mallocz(sizeof(AVPacketList)); |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
874 if (!pktl) |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
875 return AVERROR_NOMEM; |
885 | 876 |
841
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
877 /* add the packet in the buffered packet list */ |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
878 *plast_pktl = pktl; |
885 | 879 pktl->pkt= *pkt; |
841
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
880 }else{ |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
881 assert(!s->packet_buffer); |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
882 return av_read_frame_internal(s, pkt); |
ba7631ba33a7
support fixing missing pts by parsing future frames
michael
parents:
840
diff
changeset
|
883 } |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
884 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
885 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
886 |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
887 /* XXX: suppress the packet queue */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
888 static void flush_packet_queue(AVFormatContext *s) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
889 { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
890 AVPacketList *pktl; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
891 |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
892 for(;;) { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
893 pktl = s->packet_buffer; |
885 | 894 if (!pktl) |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
895 break; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
896 s->packet_buffer = pktl->next; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
897 av_free_packet(&pktl->pkt); |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
898 av_free(pktl); |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
899 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
900 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
901 |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
902 /*******************************************************/ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
903 /* seek support */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
904 |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
905 int av_find_default_stream_index(AVFormatContext *s) |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
906 { |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
907 int i; |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
908 AVStream *st; |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
909 |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
910 if (s->nb_streams <= 0) |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
911 return -1; |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
912 for(i = 0; i < s->nb_streams; i++) { |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
913 st = s->streams[i]; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
914 if (st->codec->codec_type == CODEC_TYPE_VIDEO) { |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
915 return i; |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
916 } |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
917 } |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
918 return 0; |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
919 } |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
920 |
802
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
921 /** |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
922 * Flush the frame reader. |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
923 */ |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
924 static void av_read_frame_flush(AVFormatContext *s) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
925 { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
926 AVStream *st; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
927 int i; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
928 |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
929 flush_packet_queue(s); |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
930 |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
931 /* free previous packet */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
932 if (s->cur_st) { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
933 if (s->cur_st->parser) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
934 av_free_packet(&s->cur_pkt); |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
935 s->cur_st = NULL; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
936 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
937 /* fail safe */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
938 s->cur_ptr = NULL; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
939 s->cur_len = 0; |
885 | 940 |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
941 /* for each stream, reset read state */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
942 for(i = 0; i < s->nb_streams; i++) { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
943 st = s->streams[i]; |
885 | 944 |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
945 if (st->parser) { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
946 av_parser_close(st->parser); |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
947 st->parser = NULL; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
948 } |
464 | 949 st->last_IP_pts = AV_NOPTS_VALUE; |
1935 | 950 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */ |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
951 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
952 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
953 |
1185
13dc486b272b
Try to find out correct start time to make seeking faster and add some
reimar
parents:
1169
diff
changeset
|
954 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp){ |
560 | 955 int i; |
956 | |
957 for(i = 0; i < s->nb_streams; i++) { | |
572
640706a29efb
bug in libavformat av_update_cur_dts(), patch by (Nathan Kurz <nate at verse dot com>)
michael
parents:
570
diff
changeset
|
958 AVStream *st = s->streams[i]; |
560 | 959 |
885 | 960 st->cur_dts = av_rescale(timestamp, |
572
640706a29efb
bug in libavformat av_update_cur_dts(), patch by (Nathan Kurz <nate at verse dot com>)
michael
parents:
570
diff
changeset
|
961 st->time_base.den * (int64_t)ref_st->time_base.num, |
640706a29efb
bug in libavformat av_update_cur_dts(), patch by (Nathan Kurz <nate at verse dot com>)
michael
parents:
570
diff
changeset
|
962 st->time_base.num * (int64_t)ref_st->time_base.den); |
560 | 963 } |
964 } | |
965 | |
354
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
346
diff
changeset
|
966 int av_add_index_entry(AVStream *st, |
979 | 967 int64_t pos, int64_t timestamp, int size, int distance, int flags) |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
968 { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
969 AVIndexEntry *entries, *ie; |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
970 int index; |
885 | 971 |
639 | 972 if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry)) |
973 return -1; | |
885 | 974 |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
975 entries = av_fast_realloc(st->index_entries, |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
976 &st->index_entries_allocated_size, |
885 | 977 (st->nb_index_entries + 1) * |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
978 sizeof(AVIndexEntry)); |
639 | 979 if(!entries) |
980 return -1; | |
981 | |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
982 st->index_entries= entries; |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
983 |
698 | 984 index= av_index_search_timestamp(st, timestamp, AVSEEK_FLAG_ANY); |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
985 |
555 | 986 if(index<0){ |
354
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
346
diff
changeset
|
987 index= st->nb_index_entries++; |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
346
diff
changeset
|
988 ie= &entries[index]; |
555 | 989 assert(index==0 || ie[-1].timestamp < timestamp); |
990 }else{ | |
991 ie= &entries[index]; | |
992 if(ie->timestamp != timestamp){ | |
563
d141aa45ca86
fix assertion failure in case of timestamp discontinuities
michael
parents:
560
diff
changeset
|
993 if(ie->timestamp <= timestamp) |
d141aa45ca86
fix assertion failure in case of timestamp discontinuities
michael
parents:
560
diff
changeset
|
994 return -1; |
555 | 995 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(st->nb_index_entries - index)); |
996 st->nb_index_entries++; | |
2164 | 997 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance |
555 | 998 distance= ie->min_distance; |
354
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
346
diff
changeset
|
999 } |
555 | 1000 |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
1001 ie->pos = pos; |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
1002 ie->timestamp = timestamp; |
354
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
346
diff
changeset
|
1003 ie->min_distance= distance; |
979 | 1004 ie->size= size; |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
1005 ie->flags = flags; |
885 | 1006 |
354
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
346
diff
changeset
|
1007 return index; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1008 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1009 |
597
d814669d2c13
int / int64 fix by (Wolfram Gloger <wmglo @@@ dent:med:uni-muenchen:de>)
michael
parents:
588
diff
changeset
|
1010 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, |
698 | 1011 int flags) |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1012 { |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
1013 AVIndexEntry *entries= st->index_entries; |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
1014 int nb_entries= st->nb_index_entries; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1015 int a, b, m; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1016 int64_t timestamp; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1017 |
555 | 1018 a = - 1; |
1019 b = nb_entries; | |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
1020 |
555 | 1021 while (b - a > 1) { |
1022 m = (a + b) >> 1; | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1023 timestamp = entries[m].timestamp; |
555 | 1024 if(timestamp >= wanted_timestamp) |
1025 b = m; | |
1026 if(timestamp <= wanted_timestamp) | |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
334
diff
changeset
|
1027 a = m; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1028 } |
698 | 1029 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b; |
885 | 1030 |
698 | 1031 if(!(flags & AVSEEK_FLAG_ANY)){ |
1032 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){ | |
1033 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1; | |
1034 } | |
1035 } | |
555 | 1036 |
885 | 1037 if(m == nb_entries) |
555 | 1038 return -1; |
1039 return m; | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1040 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1041 |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1042 #define DEBUG_SEEK |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1043 |
555 | 1044 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){ |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1045 AVInputFormat *avif= s->iformat; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1046 int64_t pos_min, pos_max, pos, pos_limit; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1047 int64_t ts_min, ts_max, ts; |
1496
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1048 int index; |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1049 AVStream *st; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1050 |
463
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
462
diff
changeset
|
1051 if (stream_index < 0) |
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
462
diff
changeset
|
1052 return -1; |
885 | 1053 |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1054 #ifdef DEBUG_SEEK |
881 | 1055 av_log(s, AV_LOG_DEBUG, "read_seek: %d %"PRId64"\n", stream_index, target_ts); |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1056 #endif |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1057 |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1058 ts_max= |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1059 ts_min= AV_NOPTS_VALUE; |
2165 | 1060 pos_limit= -1; //gcc falsely says it may be uninitialized |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1061 |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1062 st= s->streams[stream_index]; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1063 if(st->index_entries){ |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1064 AVIndexEntry *e; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1065 |
698 | 1066 index= av_index_search_timestamp(st, target_ts, flags | AVSEEK_FLAG_BACKWARD); //FIXME whole func must be checked for non keyframe entries in index case, especially read_timestamp() |
555 | 1067 index= FFMAX(index, 0); |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1068 e= &st->index_entries[index]; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1069 |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1070 if(e->timestamp <= target_ts || e->pos == e->min_distance){ |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1071 pos_min= e->pos; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1072 ts_min= e->timestamp; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1073 #ifdef DEBUG_SEEK |
885 | 1074 av_log(s, AV_LOG_DEBUG, "using cached pos_min=0x%"PRIx64" dts_min=%"PRId64"\n", |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1075 pos_min,ts_min); |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1076 #endif |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1077 }else{ |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1078 assert(index==0); |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1079 } |
885 | 1080 |
1081 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD); | |
698 | 1082 assert(index < st->nb_index_entries); |
1083 if(index >= 0){ | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1084 e= &st->index_entries[index]; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1085 assert(e->timestamp >= target_ts); |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1086 pos_max= e->pos; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1087 ts_max= e->timestamp; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1088 pos_limit= pos_max - e->min_distance; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1089 #ifdef DEBUG_SEEK |
885 | 1090 av_log(s, AV_LOG_DEBUG, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%"PRId64"\n", |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1091 pos_max,pos_limit, ts_max); |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1092 #endif |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1093 } |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1094 } |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1095 |
1496
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1096 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp); |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1097 if(pos<0) |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1098 return -1; |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1099 |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1100 /* do the seek */ |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1101 url_fseek(&s->pb, pos, SEEK_SET); |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1102 |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1103 av_update_cur_dts(s, st, ts); |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1104 |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1105 return 0; |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1106 } |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1107 |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1108 int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, int64_t pos_min, int64_t pos_max, int64_t pos_limit, int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret, int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t )){ |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1109 int64_t pos, ts; |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1110 int64_t start_pos, filesize; |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1111 int no_change; |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1112 |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1113 #ifdef DEBUG_SEEK |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1114 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts); |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1115 #endif |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1116 |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1117 if(ts_min == AV_NOPTS_VALUE){ |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1118 pos_min = s->data_offset; |
1496
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1119 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX); |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1120 if (ts_min == AV_NOPTS_VALUE) |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1121 return -1; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1122 } |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1123 |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1124 if(ts_max == AV_NOPTS_VALUE){ |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1125 int step= 1024; |
810
2a84386ed2a8
avformat/av_seek_frame_binary with growing file patch by (Kenneth Aafly: kenneth, aafloy net)
michael
parents:
809
diff
changeset
|
1126 filesize = url_fsize(&s->pb); |
2a84386ed2a8
avformat/av_seek_frame_binary with growing file patch by (Kenneth Aafly: kenneth, aafloy net)
michael
parents:
809
diff
changeset
|
1127 pos_max = filesize - 1; |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1128 do{ |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1129 pos_max -= step; |
1496
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1130 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step); |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1131 step += step; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1132 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step); |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1133 if (ts_max == AV_NOPTS_VALUE) |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1134 return -1; |
885 | 1135 |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1136 for(;;){ |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1137 int64_t tmp_pos= pos_max + 1; |
1496
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1138 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX); |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1139 if(tmp_ts == AV_NOPTS_VALUE) |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1140 break; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1141 ts_max= tmp_ts; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1142 pos_max= tmp_pos; |
810
2a84386ed2a8
avformat/av_seek_frame_binary with growing file patch by (Kenneth Aafly: kenneth, aafloy net)
michael
parents:
809
diff
changeset
|
1143 if(tmp_pos >= filesize) |
2a84386ed2a8
avformat/av_seek_frame_binary with growing file patch by (Kenneth Aafly: kenneth, aafloy net)
michael
parents:
809
diff
changeset
|
1144 break; |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1145 } |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1146 pos_limit= pos_max; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1147 } |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1148 |
926 | 1149 if(ts_min > ts_max){ |
1150 return -1; | |
1151 }else if(ts_min == ts_max){ | |
1152 pos_limit= pos_min; | |
1153 } | |
1154 | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1155 no_change=0; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1156 while (pos_min < pos_limit) { |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1157 #ifdef DEBUG_SEEK |
885 | 1158 av_log(s, AV_LOG_DEBUG, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%"PRId64" dts_max=%"PRId64"\n", |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1159 pos_min, pos_max, |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1160 ts_min, ts_max); |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1161 #endif |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1162 assert(pos_limit <= pos_max); |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1163 |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1164 if(no_change==0){ |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1165 int64_t approximate_keyframe_distance= pos_max - pos_limit; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1166 // interpolate position (better than dichotomy) |
555 | 1167 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min) |
1168 + pos_min - approximate_keyframe_distance; | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1169 }else if(no_change==1){ |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1170 // bisection, if interpolation failed to change min or max pos last time |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1171 pos = (pos_min + pos_limit)>>1; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1172 }else{ |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1173 // linear search if bisection failed, can only happen if there are very few or no keframes between min/max |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1174 pos=pos_min; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1175 } |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1176 if(pos <= pos_min) |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1177 pos= pos_min + 1; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1178 else if(pos > pos_limit) |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1179 pos= pos_limit; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1180 start_pos= pos; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1181 |
1496
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1182 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1 |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1183 if(pos == pos_max) |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1184 no_change++; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1185 else |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1186 no_change=0; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1187 #ifdef DEBUG_SEEK |
881 | 1188 av_log(s, AV_LOG_DEBUG, "%"PRId64" %"PRId64" %"PRId64" / %"PRId64" %"PRId64" %"PRId64" target:%"PRId64" limit:%"PRId64" start:%"PRId64" noc:%d\n", pos_min, pos, pos_max, ts_min, ts, ts_max, target_ts, pos_limit, start_pos, no_change); |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1189 #endif |
2034 | 1190 if(ts == AV_NOPTS_VALUE){ |
1191 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n"); | |
1192 return -1; | |
1193 } | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1194 assert(ts != AV_NOPTS_VALUE); |
555 | 1195 if (target_ts <= ts) { |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1196 pos_limit = start_pos - 1; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1197 pos_max = pos; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1198 ts_max = ts; |
555 | 1199 } |
1200 if (target_ts >= ts) { | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1201 pos_min = pos; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1202 ts_min = ts; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1203 } |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1204 } |
885 | 1205 |
555 | 1206 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max; |
1207 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max; | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1208 #ifdef DEBUG_SEEK |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1209 pos_min = pos; |
1496
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1210 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX); |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1211 pos_min++; |
1496
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1212 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX); |
885 | 1213 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n", |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1214 pos, ts_min, target_ts, ts_max); |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1215 #endif |
1496
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1216 *ts_ret= ts; |
7e288adde245
split av_seek_frame_binary() so the code becomes idependant of AVInputFormat and AVIndex
michael
parents:
1478
diff
changeset
|
1217 return pos; |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1218 } |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1219 |
555 | 1220 static int av_seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){ |
1221 int64_t pos_min, pos_max; | |
1222 #if 0 | |
1223 AVStream *st; | |
1224 | |
1225 if (stream_index < 0) | |
1226 return -1; | |
1227 | |
1228 st= s->streams[stream_index]; | |
1229 #endif | |
1230 | |
1231 pos_min = s->data_offset; | |
764
cdb845a57ae4
drop most url_fileno() calls (allows to use ByteIOContext directly in caller apps instead of URLProtocol)
aurel
parents:
757
diff
changeset
|
1232 pos_max = url_fsize(&s->pb) - 1; |
555 | 1233 |
1234 if (pos < pos_min) pos= pos_min; | |
1235 else if(pos > pos_max) pos= pos_max; | |
1236 | |
1237 url_fseek(&s->pb, pos, SEEK_SET); | |
1238 | |
1239 #if 0 | |
560 | 1240 av_update_cur_dts(s, st, ts); |
555 | 1241 #endif |
1242 return 0; | |
1243 } | |
1244 | |
885 | 1245 static int av_seek_frame_generic(AVFormatContext *s, |
555 | 1246 int stream_index, int64_t timestamp, int flags) |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1247 { |
560 | 1248 int index; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1249 AVStream *st; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1250 AVIndexEntry *ie; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1251 |
1756 | 1252 st = s->streams[stream_index]; |
1253 | |
1254 index = av_index_search_timestamp(st, timestamp, flags); | |
1255 | |
2033
1f882c0d0b79
fix av_seek_frame_generic() so that it doesnt fail if the
michael
parents:
2032
diff
changeset
|
1256 if(index < 0 || index==st->nb_index_entries-1){ |
1756 | 1257 int i; |
1258 AVPacket pkt; | |
1259 | |
1260 if(st->index_entries && st->nb_index_entries){ | |
1261 ie= &st->index_entries[st->nb_index_entries-1]; | |
1262 url_fseek(&s->pb, ie->pos, SEEK_SET); | |
1263 av_update_cur_dts(s, st, ie->timestamp); | |
1264 }else | |
1265 url_fseek(&s->pb, 0, SEEK_SET); | |
1266 | |
1267 for(i=0;; i++) { | |
1268 int ret = av_read_frame(s, &pkt); | |
1269 if(ret<0) | |
1270 break; | |
1271 av_free_packet(&pkt); | |
1272 if(stream_index == pkt.stream_index){ | |
1273 if((pkt.flags & PKT_FLAG_KEY) && pkt.dts > timestamp) | |
1274 break; | |
1275 } | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1276 } |
1756 | 1277 index = av_index_search_timestamp(st, timestamp, flags); |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1278 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1279 if (index < 0) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1280 return -1; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1281 |
1756 | 1282 av_read_frame_flush(s); |
1283 if (s->iformat->read_seek){ | |
1284 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0) | |
1285 return 0; | |
1286 } | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1287 ie = &st->index_entries[index]; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1288 url_fseek(&s->pb, ie->pos, SEEK_SET); |
555 | 1289 |
560 | 1290 av_update_cur_dts(s, st, ie->timestamp); |
463
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
462
diff
changeset
|
1291 |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1292 return 0; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1293 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1294 |
555 | 1295 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1296 { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1297 int ret; |
463
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
462
diff
changeset
|
1298 AVStream *st; |
885 | 1299 |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1300 av_read_frame_flush(s); |
885 | 1301 |
555 | 1302 if(flags & AVSEEK_FLAG_BYTE) |
1303 return av_seek_frame_byte(s, stream_index, timestamp, flags); | |
885 | 1304 |
463
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
462
diff
changeset
|
1305 if(stream_index < 0){ |
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
462
diff
changeset
|
1306 stream_index= av_find_default_stream_index(s); |
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
462
diff
changeset
|
1307 if(stream_index < 0) |
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
462
diff
changeset
|
1308 return -1; |
885 | 1309 |
555 | 1310 st= s->streams[stream_index]; |
557
084de726b4d0
default stream timebase docs patch by (Nathan Kurz <nate at verse dot com>)
michael
parents:
556
diff
changeset
|
1311 /* timestamp for default must be expressed in AV_TIME_BASE units */ |
555 | 1312 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num); |
463
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
462
diff
changeset
|
1313 } |
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
462
diff
changeset
|
1314 st= s->streams[stream_index]; |
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
462
diff
changeset
|
1315 |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1316 /* first, we try the format specific seek */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1317 if (s->iformat->read_seek) |
555 | 1318 ret = s->iformat->read_seek(s, stream_index, timestamp, flags); |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1319 else |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1320 ret = -1; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1321 if (ret >= 0) { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1322 return 0; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1323 } |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1324 |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1325 if(s->iformat->read_timestamp) |
555 | 1326 return av_seek_frame_binary(s, stream_index, timestamp, flags); |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
425
diff
changeset
|
1327 else |
555 | 1328 return av_seek_frame_generic(s, stream_index, timestamp, flags); |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1329 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1330 |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
1331 /*******************************************************/ |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1332 |
802
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
1333 /** |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
1334 * Returns TRUE if the stream has accurate timings in any stream. |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
1335 * |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
1336 * @return TRUE if the stream has accurate timings for at least one component. |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
1337 */ |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1338 static int av_has_timings(AVFormatContext *ic) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1339 { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1340 int i; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1341 AVStream *st; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1342 |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1343 for(i = 0;i < ic->nb_streams; i++) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1344 st = ic->streams[i]; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1345 if (st->start_time != AV_NOPTS_VALUE && |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1346 st->duration != AV_NOPTS_VALUE) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1347 return 1; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1348 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1349 return 0; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1350 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1351 |
802
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
1352 /** |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
1353 * Estimate the stream timings from the one of each components. |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
1354 * |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
1355 * Also computes the global bitrate if possible. |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
1356 */ |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1357 static void av_update_stream_timings(AVFormatContext *ic) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1358 { |
743 | 1359 int64_t start_time, start_time1, end_time, end_time1; |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1360 int i; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1361 AVStream *st; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1362 |
1557 | 1363 start_time = INT64_MAX; |
1364 end_time = INT64_MIN; | |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1365 for(i = 0;i < ic->nb_streams; i++) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1366 st = ic->streams[i]; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1367 if (st->start_time != AV_NOPTS_VALUE) { |
743 | 1368 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q); |
1369 if (start_time1 < start_time) | |
1370 start_time = start_time1; | |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1371 if (st->duration != AV_NOPTS_VALUE) { |
743 | 1372 end_time1 = start_time1 |
1373 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q); | |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1374 if (end_time1 > end_time) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1375 end_time = end_time1; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1376 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1377 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1378 } |
1557 | 1379 if (start_time != INT64_MAX) { |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1380 ic->start_time = start_time; |
1557 | 1381 if (end_time != INT64_MIN) { |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1382 ic->duration = end_time - start_time; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1383 if (ic->file_size > 0) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1384 /* compute the bit rate */ |
885 | 1385 ic->bit_rate = (double)ic->file_size * 8.0 * AV_TIME_BASE / |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1386 (double)ic->duration; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1387 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1388 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1389 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1390 |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1391 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1392 |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1393 static void fill_all_stream_timings(AVFormatContext *ic) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1394 { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1395 int i; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1396 AVStream *st; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1397 |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1398 av_update_stream_timings(ic); |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1399 for(i = 0;i < ic->nb_streams; i++) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1400 st = ic->streams[i]; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1401 if (st->start_time == AV_NOPTS_VALUE) { |
743 | 1402 if(ic->start_time != AV_NOPTS_VALUE) |
1403 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base); | |
1404 if(ic->duration != AV_NOPTS_VALUE) | |
1405 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base); | |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1406 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1407 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1408 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1409 |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1410 static void av_estimate_timings_from_bit_rate(AVFormatContext *ic) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1411 { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1412 int64_t filesize, duration; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1413 int bit_rate, i; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1414 AVStream *st; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1415 |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1416 /* if bit_rate is already set, we believe it */ |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1417 if (ic->bit_rate == 0) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1418 bit_rate = 0; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1419 for(i=0;i<ic->nb_streams;i++) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1420 st = ic->streams[i]; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1421 bit_rate += st->codec->bit_rate; |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1422 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1423 ic->bit_rate = bit_rate; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1424 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1425 |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1426 /* if duration is already set, we believe it */ |
885 | 1427 if (ic->duration == AV_NOPTS_VALUE && |
1428 ic->bit_rate != 0 && | |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1429 ic->file_size != 0) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1430 filesize = ic->file_size; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1431 if (filesize > 0) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1432 for(i = 0; i < ic->nb_streams; i++) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1433 st = ic->streams[i]; |
743 | 1434 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num); |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1435 if (st->start_time == AV_NOPTS_VALUE || |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1436 st->duration == AV_NOPTS_VALUE) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1437 st->start_time = 0; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1438 st->duration = duration; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1439 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1440 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1441 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1442 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1443 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1444 |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1445 #define DURATION_MAX_READ_SIZE 250000 |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1446 |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1447 /* only usable for MPEG-PS streams */ |
1755 | 1448 static void av_estimate_timings_from_pts(AVFormatContext *ic, offset_t old_offset) |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1449 { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1450 AVPacket pkt1, *pkt = &pkt1; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1451 AVStream *st; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1452 int read_size, i, ret; |
838 | 1453 int64_t end_time; |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1454 int64_t filesize, offset, duration; |
885 | 1455 |
2043
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
1456 /* free previous packet */ |
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
1457 if (ic->cur_st && ic->cur_st->parser) |
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
1458 av_free_packet(&ic->cur_pkt); |
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
1459 ic->cur_st = NULL; |
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
1460 |
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
1461 /* flush packet queue */ |
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
1462 flush_packet_queue(ic); |
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
1463 |
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
1464 for(i=0;i<ic->nb_streams;i++) { |
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
1465 st = ic->streams[i]; |
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
1466 if (st->parser) { |
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
1467 av_parser_close(st->parser); |
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
1468 st->parser= NULL; |
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
1469 } |
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
1470 } |
885 | 1471 |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1472 /* we read the first packets to get the first PTS (not fully |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1473 accurate, but it is enough now) */ |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1474 url_fseek(&ic->pb, 0, SEEK_SET); |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1475 read_size = 0; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1476 for(;;) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1477 if (read_size >= DURATION_MAX_READ_SIZE) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1478 break; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1479 /* if all info is available, we can stop */ |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1480 for(i = 0;i < ic->nb_streams; i++) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1481 st = ic->streams[i]; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1482 if (st->start_time == AV_NOPTS_VALUE) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1483 break; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1484 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1485 if (i == ic->nb_streams) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1486 break; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1487 |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1488 ret = av_read_packet(ic, pkt); |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1489 if (ret != 0) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1490 break; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1491 read_size += pkt->size; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1492 st = ic->streams[pkt->stream_index]; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1493 if (pkt->pts != AV_NOPTS_VALUE) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1494 if (st->start_time == AV_NOPTS_VALUE) |
743 | 1495 st->start_time = pkt->pts; |
224
8d1569be0ee1
memory leak fix by (Tom Dexter <devel at www dot digitalaudiorock dot com>)
michaelni
parents:
205
diff
changeset
|
1496 } |
8d1569be0ee1
memory leak fix by (Tom Dexter <devel at www dot digitalaudiorock dot com>)
michaelni
parents:
205
diff
changeset
|
1497 av_free_packet(pkt); |
8d1569be0ee1
memory leak fix by (Tom Dexter <devel at www dot digitalaudiorock dot com>)
michaelni
parents:
205
diff
changeset
|
1498 } |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1499 |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1500 /* estimate the end time (duration) */ |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1501 /* XXX: may need to support wrapping */ |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1502 filesize = ic->file_size; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1503 offset = filesize - DURATION_MAX_READ_SIZE; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1504 if (offset < 0) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1505 offset = 0; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1506 |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1507 url_fseek(&ic->pb, offset, SEEK_SET); |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1508 read_size = 0; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1509 for(;;) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1510 if (read_size >= DURATION_MAX_READ_SIZE) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1511 break; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1512 /* if all info is available, we can stop */ |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1513 for(i = 0;i < ic->nb_streams; i++) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1514 st = ic->streams[i]; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1515 if (st->duration == AV_NOPTS_VALUE) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1516 break; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1517 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1518 if (i == ic->nb_streams) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1519 break; |
885 | 1520 |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1521 ret = av_read_packet(ic, pkt); |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1522 if (ret != 0) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1523 break; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1524 read_size += pkt->size; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1525 st = ic->streams[pkt->stream_index]; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1526 if (pkt->pts != AV_NOPTS_VALUE) { |
743 | 1527 end_time = pkt->pts; |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1528 duration = end_time - st->start_time; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1529 if (duration > 0) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1530 if (st->duration == AV_NOPTS_VALUE || |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1531 st->duration < duration) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1532 st->duration = duration; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1533 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1534 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1535 av_free_packet(pkt); |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1536 } |
885 | 1537 |
743 | 1538 fill_all_stream_timings(ic); |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1539 |
1755 | 1540 url_fseek(&ic->pb, old_offset, SEEK_SET); |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1541 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1542 |
1755 | 1543 static void av_estimate_timings(AVFormatContext *ic, offset_t old_offset) |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1544 { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1545 int64_t file_size; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1546 |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1547 /* get the file size, if possible */ |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1548 if (ic->iformat->flags & AVFMT_NOFILE) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1549 file_size = 0; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1550 } else { |
764
cdb845a57ae4
drop most url_fileno() calls (allows to use ByteIOContext directly in caller apps instead of URLProtocol)
aurel
parents:
757
diff
changeset
|
1551 file_size = url_fsize(&ic->pb); |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1552 if (file_size < 0) |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1553 file_size = 0; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1554 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1555 ic->file_size = file_size; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1556 |
1169 | 1557 if ((!strcmp(ic->iformat->name, "mpeg") || |
1558 !strcmp(ic->iformat->name, "mpegts")) && | |
1559 file_size && !ic->pb.is_streamed) { | |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1560 /* get accurate estimate from the PTSes */ |
1755 | 1561 av_estimate_timings_from_pts(ic, old_offset); |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1562 } else if (av_has_timings(ic)) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1563 /* at least one components has timings - we use them for all |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1564 the components */ |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1565 fill_all_stream_timings(ic); |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1566 } else { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1567 /* less precise: use bit rate info */ |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1568 av_estimate_timings_from_bit_rate(ic); |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1569 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1570 av_update_stream_timings(ic); |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1571 |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1572 #if 0 |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1573 { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1574 int i; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1575 AVStream *st; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1576 for(i = 0;i < ic->nb_streams; i++) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1577 st = ic->streams[i]; |
885 | 1578 printf("%d: start_time: %0.3f duration: %0.3f\n", |
1579 i, (double)st->start_time / AV_TIME_BASE, | |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1580 (double)st->duration / AV_TIME_BASE); |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1581 } |
885 | 1582 printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n", |
1583 (double)ic->start_time / AV_TIME_BASE, | |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1584 (double)ic->duration / AV_TIME_BASE, |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1585 ic->bit_rate / 1000); |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1586 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1587 #endif |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1588 } |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
1589 |
0 | 1590 static int has_codec_parameters(AVCodecContext *enc) |
1591 { | |
1592 int val; | |
1593 switch(enc->codec_type) { | |
1594 case CODEC_TYPE_AUDIO: | |
1595 val = enc->sample_rate; | |
1596 break; | |
1597 case CODEC_TYPE_VIDEO: | |
737 | 1598 val = enc->width && enc->pix_fmt != PIX_FMT_NONE; |
0 | 1599 break; |
1600 default: | |
1601 val = 1; | |
1602 break; | |
1603 } | |
1604 return (val != 0); | |
1605 } | |
1606 | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1607 static int try_decode_frame(AVStream *st, const uint8_t *data, int size) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1608 { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1609 int16_t *samples; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1610 AVCodec *codec; |
1818 | 1611 int got_picture, data_size, ret=0; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1612 AVFrame picture; |
885 | 1613 |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1614 if(!st->codec->codec){ |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1615 codec = avcodec_find_decoder(st->codec->codec_id); |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1616 if (!codec) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1617 return -1; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1618 ret = avcodec_open(st->codec, codec); |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1619 if (ret < 0) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1620 return ret; |
801
bca2334ff177
dont open and close codec at every call of try_decode_frame() as this is not only slow but also fails if the previous frame is needed for setting some parameters correctly
michael
parents:
797
diff
changeset
|
1621 } |
737 | 1622 |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1623 if(!has_codec_parameters(st->codec)){ |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1624 switch(st->codec->codec_type) { |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1625 case CODEC_TYPE_VIDEO: |
885 | 1626 ret = avcodec_decode_video(st->codec, &picture, |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1627 &got_picture, (uint8_t *)data, size); |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1628 break; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1629 case CODEC_TYPE_AUDIO: |
1818 | 1630 data_size = FFMAX(size, AVCODEC_MAX_AUDIO_FRAME_SIZE); |
1631 samples = av_malloc(data_size); | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1632 if (!samples) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1633 goto fail; |
1818 | 1634 ret = avcodec_decode_audio2(st->codec, samples, |
1635 &data_size, (uint8_t *)data, size); | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1636 av_free(samples); |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1637 break; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1638 default: |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1639 break; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1640 } |
737 | 1641 } |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1642 fail: |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1643 return ret; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1644 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1645 |
2018 | 1646 static int set_codec_from_probe_data(AVStream *st, AVProbeData *pd, int score) |
1647 { | |
1648 AVInputFormat *fmt; | |
1649 fmt = av_probe_input_format2(pd, 1, &score); | |
1650 | |
1651 if (fmt) { | |
1652 if (strncmp(fmt->name, "mp3", 3) == 0) | |
1653 st->codec->codec_id = CODEC_ID_MP3; | |
1654 else if (strncmp(fmt->name, "ac3", 3) == 0) | |
1655 st->codec->codec_id = CODEC_ID_AC3; | |
1656 } | |
2066 | 1657 return !!fmt; |
2018 | 1658 } |
1659 | |
2243
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1660 unsigned int codec_get_tag(const AVCodecTag *tags, int id) |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1661 { |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1662 while (tags->id != CODEC_ID_NONE) { |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1663 if (tags->id == id) |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1664 return tags->tag; |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1665 tags++; |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1666 } |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1667 return 0; |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1668 } |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1669 |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1670 enum CodecID codec_get_id(const AVCodecTag *tags, unsigned int tag) |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1671 { |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1672 while (tags->id != CODEC_ID_NONE) { |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1673 if( toupper((tag >> 0)&0xFF) == toupper((tags->tag >> 0)&0xFF) |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1674 && toupper((tag >> 8)&0xFF) == toupper((tags->tag >> 8)&0xFF) |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1675 && toupper((tag >>16)&0xFF) == toupper((tags->tag >>16)&0xFF) |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1676 && toupper((tag >>24)&0xFF) == toupper((tags->tag >>24)&0xFF)) |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1677 return tags->id; |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1678 tags++; |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1679 } |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1680 return CODEC_ID_NONE; |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1681 } |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1682 |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1683 unsigned int av_codec_get_tag(const AVCodecTag *tags[4], enum CodecID id) |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1684 { |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1685 int i; |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1686 for(i=0; tags && tags[i]; i++){ |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1687 int tag= codec_get_tag(tags[i], id); |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1688 if(tag) return tag; |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1689 } |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1690 return 0; |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1691 } |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1692 |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1693 enum CodecID av_codec_get_id(const AVCodecTag *tags[4], unsigned int tag) |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1694 { |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1695 int i; |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1696 for(i=0; tags && tags[i]; i++){ |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1697 enum CodecID id= codec_get_id(tags[i], tag); |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1698 if(id!=CODEC_ID_NONE) return id; |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1699 } |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1700 return CODEC_ID_NONE; |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1701 } |
639597604897
Move public API functions av_codec_get_tag() and av_codec_get_id()
aurel
parents:
2223
diff
changeset
|
1702 |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1703 /* absolute maximum size we read until we abort */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1704 #define MAX_READ_SIZE 5000000 |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1705 |
1569 | 1706 #define MAX_STD_TIMEBASES (60*12+5) |
1566 | 1707 static int get_std_framerate(int i){ |
1708 if(i<60*12) return i*1001; | |
1569 | 1709 else return ((int[]){24,30,60,12,15})[i-60*12]*1000*12; |
1566 | 1710 } |
1711 | |
0 | 1712 int av_find_stream_info(AVFormatContext *ic) |
1713 { | |
927 | 1714 int i, count, ret, read_size, j; |
0 | 1715 AVStream *st; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1716 AVPacket pkt1, *pkt; |
0 | 1717 AVPacketList *pktl=NULL, **ppktl; |
620 | 1718 int64_t last_dts[MAX_STREAMS]; |
750 | 1719 int duration_count[MAX_STREAMS]={0}; |
1837
7b64dd81b38d
replace the auto array "duration_error" with a malloced array.
gpoirier
parents:
1824
diff
changeset
|
1720 double (*duration_error)[MAX_STD_TIMEBASES]; |
1755 | 1721 offset_t old_offset = url_ftell(&ic->pb); |
1906
330115d147d6
remove codec_info_duration/nb_frames from AVStream
bcoudurier
parents:
1840
diff
changeset
|
1722 int64_t codec_info_duration[MAX_STREAMS]={0}; |
330115d147d6
remove codec_info_duration/nb_frames from AVStream
bcoudurier
parents:
1840
diff
changeset
|
1723 int codec_info_nb_frames[MAX_STREAMS]={0}; |
2018 | 1724 AVProbeData probe_data[MAX_STREAMS]; |
1725 int codec_identified[MAX_STREAMS]={0}; | |
0 | 1726 |
1837
7b64dd81b38d
replace the auto array "duration_error" with a malloced array.
gpoirier
parents:
1824
diff
changeset
|
1727 duration_error = av_mallocz(MAX_STREAMS * sizeof(*duration_error)); |
7b64dd81b38d
replace the auto array "duration_error" with a malloced array.
gpoirier
parents:
1824
diff
changeset
|
1728 if (!duration_error) return AVERROR_NOMEM; |
7b64dd81b38d
replace the auto array "duration_error" with a malloced array.
gpoirier
parents:
1824
diff
changeset
|
1729 |
743 | 1730 for(i=0;i<ic->nb_streams;i++) { |
1731 st = ic->streams[i]; | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1732 if(st->codec->codec_type == CODEC_TYPE_VIDEO){ |
743 | 1733 /* if(!st->time_base.num) |
1734 st->time_base= */ | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1735 if(!st->codec->time_base.num) |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1736 st->codec->time_base= st->time_base; |
743 | 1737 } |
797
f5a231a9a2f1
support changing in bitstream global headers into extradata style and back
michael
parents:
786
diff
changeset
|
1738 //only for the split stuff |
f5a231a9a2f1
support changing in bitstream global headers into extradata style and back
michael
parents:
786
diff
changeset
|
1739 if (!st->parser) { |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1740 st->parser = av_parser_init(st->codec->codec_id); |
2023 | 1741 if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){ |
842 | 1742 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES; |
1743 } | |
797
f5a231a9a2f1
support changing in bitstream global headers into extradata style and back
michael
parents:
786
diff
changeset
|
1744 } |
743 | 1745 } |
1746 | |
620 | 1747 for(i=0;i<MAX_STREAMS;i++){ |
1748 last_dts[i]= AV_NOPTS_VALUE; | |
1749 } | |
885 | 1750 |
2018 | 1751 memset(probe_data, 0, sizeof(probe_data)); |
0 | 1752 count = 0; |
1753 read_size = 0; | |
1754 ppktl = &ic->packet_buffer; | |
1755 for(;;) { | |
1756 /* check if one codec still needs to be handled */ | |
1757 for(i=0;i<ic->nb_streams;i++) { | |
1758 st = ic->streams[i]; | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1759 if (!has_codec_parameters(st->codec)) |
0 | 1760 break; |
624 | 1761 /* variable fps and no guess at the real fps */ |
1966
1185d826c6a7
analyze end condition must match r_fps selection condition
michael
parents:
1956
diff
changeset
|
1762 if( (st->codec->time_base.den >= 101LL*st->codec->time_base.num || st->codec->codec_id == CODEC_ID_MPEG2VIDEO) |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1763 && duration_count[i]<20 && st->codec->codec_type == CODEC_TYPE_VIDEO) |
624 | 1764 break; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1765 if(st->parser && st->parser->parser->split && !st->codec->extradata) |
797
f5a231a9a2f1
support changing in bitstream global headers into extradata style and back
michael
parents:
786
diff
changeset
|
1766 break; |
2018 | 1767 if (st->codec->codec_type == CODEC_TYPE_AUDIO && |
1768 st->codec->codec_id == CODEC_ID_NONE) | |
1769 break; | |
0 | 1770 } |
1771 if (i == ic->nb_streams) { | |
1772 /* NOTE: if the format has no header, then we need to read | |
1773 some packets to get most of the streams, so we cannot | |
1774 stop here */ | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1775 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) { |
0 | 1776 /* if we found the info for all the codecs, we can stop */ |
1777 ret = count; | |
1778 break; | |
1779 } | |
1327 | 1780 } |
1328 | 1781 /* we did not get all the codec info, but we read too much data */ |
1782 if (read_size >= MAX_READ_SIZE) { | |
1783 ret = count; | |
1784 break; | |
1785 } | |
0 | 1786 |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1787 /* NOTE: a new stream can be added there if no header in file |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1788 (AVFMTCTX_NOHEADER) */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1789 ret = av_read_frame_internal(ic, &pkt1); |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1790 if (ret < 0) { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1791 /* EOF or error */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1792 ret = -1; /* we could not have all the codec parameters before EOF */ |
651
6a5ba24b2c6b
fixing demuxing for short files where the framerate detection failed
michael
parents:
643
diff
changeset
|
1793 for(i=0;i<ic->nb_streams;i++) { |
6a5ba24b2c6b
fixing demuxing for short files where the framerate detection failed
michael
parents:
643
diff
changeset
|
1794 st = ic->streams[i]; |
1018
bddcb32bde33
provide more info on which streams lack codec parameters
michael
parents:
1003
diff
changeset
|
1795 if (!has_codec_parameters(st->codec)){ |
bddcb32bde33
provide more info on which streams lack codec parameters
michael
parents:
1003
diff
changeset
|
1796 char buf[256]; |
bddcb32bde33
provide more info on which streams lack codec parameters
michael
parents:
1003
diff
changeset
|
1797 avcodec_string(buf, sizeof(buf), st->codec, 0); |
bddcb32bde33
provide more info on which streams lack codec parameters
michael
parents:
1003
diff
changeset
|
1798 av_log(ic, AV_LOG_INFO, "Could not find codec parameters (%s)\n", buf); |
1139
ff241582890f
do not fail av_find_stream_info() if params for all streams could not be found
mru
parents:
1135
diff
changeset
|
1799 } else { |
ff241582890f
do not fail av_find_stream_info() if params for all streams could not be found
mru
parents:
1135
diff
changeset
|
1800 ret = 0; |
1018
bddcb32bde33
provide more info on which streams lack codec parameters
michael
parents:
1003
diff
changeset
|
1801 } |
651
6a5ba24b2c6b
fixing demuxing for short files where the framerate detection failed
michael
parents:
643
diff
changeset
|
1802 } |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1803 break; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1804 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1805 |
0 | 1806 pktl = av_mallocz(sizeof(AVPacketList)); |
1807 if (!pktl) { | |
1808 ret = AVERROR_NOMEM; | |
1809 break; | |
1810 } | |
1811 | |
1812 /* add the packet in the buffered packet list */ | |
1813 *ppktl = pktl; | |
1814 ppktl = &pktl->next; | |
1815 | |
1816 pkt = &pktl->pkt; | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1817 *pkt = pkt1; |
885 | 1818 |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1819 /* duplicate the packet */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1820 if (av_dup_packet(pkt) < 0) { |
1441
ad3b03b7b142
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
1435
diff
changeset
|
1821 ret = AVERROR_NOMEM; |
ad3b03b7b142
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
1435
diff
changeset
|
1822 break; |
0 | 1823 } |
1824 | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1825 read_size += pkt->size; |
0 | 1826 |
1827 st = ic->streams[pkt->stream_index]; | |
1906
330115d147d6
remove codec_info_duration/nb_frames from AVStream
bcoudurier
parents:
1840
diff
changeset
|
1828 if(codec_info_nb_frames[st->index]>1) |
330115d147d6
remove codec_info_duration/nb_frames from AVStream
bcoudurier
parents:
1840
diff
changeset
|
1829 codec_info_duration[st->index] += pkt->duration; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1830 if (pkt->duration != 0) |
1906
330115d147d6
remove codec_info_duration/nb_frames from AVStream
bcoudurier
parents:
1840
diff
changeset
|
1831 codec_info_nb_frames[st->index]++; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1832 |
772 | 1833 { |
750 | 1834 int index= pkt->stream_index; |
1835 int64_t last= last_dts[index]; | |
1836 int64_t duration= pkt->dts - last; | |
1837 | |
1838 if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){ | |
1566 | 1839 double dur= duration * av_q2d(st->time_base); |
1840 | |
1841 // if(st->codec->codec_type == CODEC_TYPE_VIDEO) | |
1842 // av_log(NULL, AV_LOG_ERROR, "%f\n", dur); | |
1616
dfe8b8bd6833
nth try of getting the frame rate detecton working
michael
parents:
1611
diff
changeset
|
1843 if(duration_count[index] < 2) |
1837
7b64dd81b38d
replace the auto array "duration_error" with a malloced array.
gpoirier
parents:
1824
diff
changeset
|
1844 memset(duration_error, 0, MAX_STREAMS * sizeof(*duration_error)); |
1617 | 1845 for(i=1; i<MAX_STD_TIMEBASES; i++){ |
1846 int framerate= get_std_framerate(i); | |
1847 int ticks= lrintf(dur*framerate/(1001*12)); | |
1848 double error= dur - ticks*1001*12/(double)framerate; | |
1849 duration_error[index][i] += error*error; | |
1850 } | |
1566 | 1851 duration_count[index]++; |
620 | 1852 } |
1569 | 1853 if(last == AV_NOPTS_VALUE || duration_count[index]<=1) |
1854 last_dts[pkt->stream_index]= pkt->dts; | |
2018 | 1855 |
1856 if (st->codec->codec_id == CODEC_ID_NONE) { | |
1857 AVProbeData *pd = &(probe_data[st->index]); | |
1858 pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size); | |
1859 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size); | |
1860 pd->buf_size += pkt->size; | |
1861 } | |
620 | 1862 } |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1863 if(st->parser && st->parser->parser->split && !st->codec->extradata){ |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1864 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size); |
797
f5a231a9a2f1
support changing in bitstream global headers into extradata style and back
michael
parents:
786
diff
changeset
|
1865 if(i){ |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1866 st->codec->extradata_size= i; |
1141
ef9bf68071d3
extradata may be used as bitstream reader input so allocate with padding
mru
parents:
1139
diff
changeset
|
1867 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1868 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size); |
1141
ef9bf68071d3
extradata may be used as bitstream reader input so allocate with padding
mru
parents:
1139
diff
changeset
|
1869 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE); |
797
f5a231a9a2f1
support changing in bitstream global headers into extradata style and back
michael
parents:
786
diff
changeset
|
1870 } |
f5a231a9a2f1
support changing in bitstream global headers into extradata style and back
michael
parents:
786
diff
changeset
|
1871 } |
885 | 1872 |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1873 /* if still no information, we try to open the codec and to |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1874 decompress the frame. We try to avoid that in most cases as |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1875 it takes longer and uses more memory. For MPEG4, we need to |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1876 decompress for Quicktime. */ |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1877 if (!has_codec_parameters(st->codec) /*&& |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1878 (st->codec->codec_id == CODEC_ID_FLV1 || |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1879 st->codec->codec_id == CODEC_ID_H264 || |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1880 st->codec->codec_id == CODEC_ID_H263 || |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1881 st->codec->codec_id == CODEC_ID_H261 || |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1882 st->codec->codec_id == CODEC_ID_VORBIS || |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1883 st->codec->codec_id == CODEC_ID_MJPEG || |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1884 st->codec->codec_id == CODEC_ID_PNG || |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1885 st->codec->codec_id == CODEC_ID_PAM || |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1886 st->codec->codec_id == CODEC_ID_PGM || |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1887 st->codec->codec_id == CODEC_ID_PGMYUV || |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1888 st->codec->codec_id == CODEC_ID_PBM || |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1889 st->codec->codec_id == CODEC_ID_PPM || |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1890 st->codec->codec_id == CODEC_ID_SHORTEN || |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1891 (st->codec->codec_id == CODEC_ID_MPEG4 && !st->need_parsing))*/) |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1892 try_decode_frame(st, pkt->data, pkt->size); |
885 | 1893 |
2253
3677c1667194
avoid division by zero in av_find_stream_info() when no time base is set
mru
parents:
2243
diff
changeset
|
1894 if (st->time_base.den > 0 && av_rescale_q(codec_info_duration[st->index], st->time_base, AV_TIME_BASE_Q) >= ic->max_analyze_duration) { |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1895 break; |
0 | 1896 } |
1897 count++; | |
1898 } | |
1899 | |
801
bca2334ff177
dont open and close codec at every call of try_decode_frame() as this is not only slow but also fails if the previous frame is needed for setting some parameters correctly
michael
parents:
797
diff
changeset
|
1900 // close codecs which where opened in try_decode_frame() |
bca2334ff177
dont open and close codec at every call of try_decode_frame() as this is not only slow but also fails if the previous frame is needed for setting some parameters correctly
michael
parents:
797
diff
changeset
|
1901 for(i=0;i<ic->nb_streams;i++) { |
bca2334ff177
dont open and close codec at every call of try_decode_frame() as this is not only slow but also fails if the previous frame is needed for setting some parameters correctly
michael
parents:
797
diff
changeset
|
1902 st = ic->streams[i]; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1903 if(st->codec->codec) |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1904 avcodec_close(st->codec); |
801
bca2334ff177
dont open and close codec at every call of try_decode_frame() as this is not only slow but also fails if the previous frame is needed for setting some parameters correctly
michael
parents:
797
diff
changeset
|
1905 } |
0 | 1906 for(i=0;i<ic->nb_streams;i++) { |
1907 st = ic->streams[i]; | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1908 if (st->codec->codec_type == CODEC_TYPE_VIDEO) { |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1909 if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_sample) |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1910 st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt); |
620 | 1911 |
1616
dfe8b8bd6833
nth try of getting the frame rate detecton working
michael
parents:
1611
diff
changeset
|
1912 if(duration_count[i] |
1566 | 1913 && (st->codec->time_base.num*101LL <= st->codec->time_base.den || st->codec->codec_id == CODEC_ID_MPEG2VIDEO) /*&& |
1330 | 1914 //FIXME we should not special case mpeg2, but this needs testing with non mpeg2 ... |
1566 | 1915 st->time_base.num*duration_sum[i]/duration_count[i]*101LL > st->time_base.den*/){ |
1916 double best_error= 2*av_q2d(st->time_base); | |
1917 best_error= best_error*best_error*duration_count[i]*1000*12*30; | |
1918 | |
1919 for(j=1; j<MAX_STD_TIMEBASES; j++){ | |
1920 double error= duration_error[i][j] * get_std_framerate(j); | |
1921 // if(st->codec->codec_type == CODEC_TYPE_VIDEO) | |
1922 // av_log(NULL, AV_LOG_ERROR, "%f %f\n", get_std_framerate(j) / 12.0/1001, error); | |
927 | 1923 if(error < best_error){ |
1924 best_error= error; | |
1566 | 1925 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, get_std_framerate(j), 12*1001, INT_MAX); |
927 | 1926 } |
750 | 1927 } |
620 | 1928 } |
1929 | |
743 | 1930 if (!st->r_frame_rate.num){ |
1351
244017c6b2ae
fix r_frame_rate detection in mpeg4 streams with non integer fps
michael
parents:
1330
diff
changeset
|
1931 if( st->codec->time_base.den * (int64_t)st->time_base.num |
244017c6b2ae
fix r_frame_rate detection in mpeg4 streams with non integer fps
michael
parents:
1330
diff
changeset
|
1932 <= st->codec->time_base.num * (int64_t)st->time_base.den){ |
244017c6b2ae
fix r_frame_rate detection in mpeg4 streams with non integer fps
michael
parents:
1330
diff
changeset
|
1933 st->r_frame_rate.num = st->codec->time_base.den; |
244017c6b2ae
fix r_frame_rate detection in mpeg4 streams with non integer fps
michael
parents:
1330
diff
changeset
|
1934 st->r_frame_rate.den = st->codec->time_base.num; |
244017c6b2ae
fix r_frame_rate detection in mpeg4 streams with non integer fps
michael
parents:
1330
diff
changeset
|
1935 }else{ |
244017c6b2ae
fix r_frame_rate detection in mpeg4 streams with non integer fps
michael
parents:
1330
diff
changeset
|
1936 st->r_frame_rate.num = st->time_base.den; |
244017c6b2ae
fix r_frame_rate detection in mpeg4 streams with non integer fps
michael
parents:
1330
diff
changeset
|
1937 st->r_frame_rate.den = st->time_base.num; |
244017c6b2ae
fix r_frame_rate detection in mpeg4 streams with non integer fps
michael
parents:
1330
diff
changeset
|
1938 } |
85
25062c9b1f86
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
75
diff
changeset
|
1939 } |
1804 | 1940 }else if(st->codec->codec_type == CODEC_TYPE_AUDIO) { |
2160 | 1941 if (st->codec->codec_id == CODEC_ID_NONE && probe_data[st->index].buf_size > 0) { |
2018 | 1942 codec_identified[st->index] = set_codec_from_probe_data(st, &(probe_data[st->index]), 0); |
1943 if (codec_identified[st->index]) { | |
2023 | 1944 st->need_parsing = AVSTREAM_PARSE_FULL; |
2018 | 1945 } |
1946 } | |
1804 | 1947 if(!st->codec->bits_per_sample) |
1948 st->codec->bits_per_sample= av_get_bits_per_sample(st->codec->codec_id); | |
0 | 1949 } |
1950 } | |
1951 | |
1755 | 1952 av_estimate_timings(ic, old_offset); |
2018 | 1953 |
1954 for(i=0;i<ic->nb_streams;i++) { | |
1955 st = ic->streams[i]; | |
1956 if (codec_identified[st->index]) { | |
1957 av_read_frame_flush(ic); | |
1958 av_seek_frame(ic, st->index, 0.0, 0); | |
1959 url_fseek(&ic->pb, ic->data_offset, SEEK_SET); | |
1960 } | |
1961 } | |
1962 | |
468 | 1963 #if 0 |
1964 /* correct DTS for b frame streams with no timestamps */ | |
1965 for(i=0;i<ic->nb_streams;i++) { | |
1966 st = ic->streams[i]; | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
1967 if (st->codec->codec_type == CODEC_TYPE_VIDEO) { |
468 | 1968 if(b-frames){ |
1969 ppktl = &ic->packet_buffer; | |
1970 while(ppkt1){ | |
1971 if(ppkt1->stream_index != i) | |
1972 continue; | |
1973 if(ppkt1->pkt->dts < 0) | |
1974 break; | |
1975 if(ppkt1->pkt->pts != AV_NOPTS_VALUE) | |
1976 break; | |
1977 ppkt1->pkt->dts -= delta; | |
1978 ppkt1= ppkt1->next; | |
1979 } | |
1980 if(ppkt1) | |
1981 continue; | |
1982 st->cur_dts -= delta; | |
1983 } | |
1984 } | |
1985 } | |
1986 #endif | |
1837
7b64dd81b38d
replace the auto array "duration_error" with a malloced array.
gpoirier
parents:
1824
diff
changeset
|
1987 |
7b64dd81b38d
replace the auto array "duration_error" with a malloced array.
gpoirier
parents:
1824
diff
changeset
|
1988 av_free(duration_error); |
2018 | 1989 for(i=0;i<MAX_STREAMS;i++){ |
1990 av_freep(&(probe_data[i].buf)); | |
1991 } | |
1837
7b64dd81b38d
replace the auto array "duration_error" with a malloced array.
gpoirier
parents:
1824
diff
changeset
|
1992 |
0 | 1993 return ret; |
1994 } | |
1995 | |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1996 /*******************************************************/ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1997 |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1998 int av_read_play(AVFormatContext *s) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
1999 { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2000 if (!s->iformat->read_play) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2001 return AVERROR_NOTSUPP; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2002 return s->iformat->read_play(s); |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2003 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2004 |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2005 int av_read_pause(AVFormatContext *s) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2006 { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2007 if (!s->iformat->read_pause) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2008 return AVERROR_NOTSUPP; |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2009 return s->iformat->read_pause(s); |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2010 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2011 |
0 | 2012 void av_close_input_file(AVFormatContext *s) |
2013 { | |
172 | 2014 int i, must_open_file; |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
2015 AVStream *st; |
0 | 2016 |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2017 /* free previous packet */ |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2018 if (s->cur_st && s->cur_st->parser) |
885 | 2019 av_free_packet(&s->cur_pkt); |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2020 |
0 | 2021 if (s->iformat->read_close) |
2022 s->iformat->read_close(s); | |
2023 for(i=0;i<s->nb_streams;i++) { | |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
2024 /* free all data in a stream component */ |
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
2025 st = s->streams[i]; |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2026 if (st->parser) { |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2027 av_parser_close(st->parser); |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2028 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2029 av_free(st->index_entries); |
1120 | 2030 av_free(st->codec->extradata); |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
2031 av_free(st->codec); |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
2032 av_free(st); |
0 | 2033 } |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2034 flush_packet_queue(s); |
172 | 2035 must_open_file = 1; |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
290
diff
changeset
|
2036 if (s->iformat->flags & AVFMT_NOFILE) { |
172 | 2037 must_open_file = 0; |
2038 } | |
2039 if (must_open_file) { | |
0 | 2040 url_fclose(&s->pb); |
2041 } | |
2042 av_freep(&s->priv_data); | |
2043 av_free(s); | |
2044 } | |
2045 | |
2046 AVStream *av_new_stream(AVFormatContext *s, int id) | |
2047 { | |
2048 AVStream *st; | |
1285
b5226e679a31
fix b pyramid in mp4 muxing if no dts are provided to the muxer
michael
parents:
1279
diff
changeset
|
2049 int i; |
0 | 2050 |
2051 if (s->nb_streams >= MAX_STREAMS) | |
2052 return NULL; | |
2053 | |
2054 st = av_mallocz(sizeof(AVStream)); | |
2055 if (!st) | |
2056 return NULL; | |
885 | 2057 |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
2058 st->codec= avcodec_alloc_context(); |
193 | 2059 if (s->iformat) { |
2060 /* no default bitrate if decoding */ | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
2061 st->codec->bit_rate = 0; |
193 | 2062 } |
0 | 2063 st->index = s->nb_streams; |
2064 st->id = id; | |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2065 st->start_time = AV_NOPTS_VALUE; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2066 st->duration = AV_NOPTS_VALUE; |
468 | 2067 st->cur_dts = AV_NOPTS_VALUE; |
462
b69898ffc92a
move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents:
453
diff
changeset
|
2068 |
b69898ffc92a
move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents:
453
diff
changeset
|
2069 /* default pts settings is MPEG like */ |
b69898ffc92a
move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents:
453
diff
changeset
|
2070 av_set_pts_info(st, 33, 1, 90000); |
464 | 2071 st->last_IP_pts = AV_NOPTS_VALUE; |
1285
b5226e679a31
fix b pyramid in mp4 muxing if no dts are provided to the muxer
michael
parents:
1279
diff
changeset
|
2072 for(i=0; i<MAX_REORDER_DELAY+1; i++) |
b5226e679a31
fix b pyramid in mp4 muxing if no dts are provided to the muxer
michael
parents:
1279
diff
changeset
|
2073 st->pts_buffer[i]= AV_NOPTS_VALUE; |
462
b69898ffc92a
move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents:
453
diff
changeset
|
2074 |
0 | 2075 s->streams[s->nb_streams++] = st; |
2076 return st; | |
2077 } | |
2078 | |
2079 /************************************************************/ | |
2080 /* output media file */ | |
2081 | |
20 | 2082 int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap) |
2083 { | |
2084 int ret; | |
885 | 2085 |
32 | 2086 if (s->oformat->priv_data_size > 0) { |
2087 s->priv_data = av_mallocz(s->oformat->priv_data_size); | |
2088 if (!s->priv_data) | |
2089 return AVERROR_NOMEM; | |
2090 } else | |
2091 s->priv_data = NULL; | |
885 | 2092 |
20 | 2093 if (s->oformat->set_parameters) { |
2094 ret = s->oformat->set_parameters(s, ap); | |
2095 if (ret < 0) | |
2096 return ret; | |
2097 } | |
2098 return 0; | |
2099 } | |
2100 | |
0 | 2101 int av_write_header(AVFormatContext *s) |
2102 { | |
2103 int ret, i; | |
2104 AVStream *st; | |
2105 | |
839 | 2106 // some sanity checks |
2107 for(i=0;i<s->nb_streams;i++) { | |
2108 st = s->streams[i]; | |
2109 | |
2110 switch (st->codec->codec_type) { | |
2111 case CODEC_TYPE_AUDIO: | |
2112 if(st->codec->sample_rate<=0){ | |
2113 av_log(s, AV_LOG_ERROR, "sample rate not set\n"); | |
2114 return -1; | |
2115 } | |
2116 break; | |
2117 case CODEC_TYPE_VIDEO: | |
2118 if(st->codec->time_base.num<=0 || st->codec->time_base.den<=0){ //FIXME audio too? | |
2119 av_log(s, AV_LOG_ERROR, "time base not set\n"); | |
2120 return -1; | |
2121 } | |
2122 if(st->codec->width<=0 || st->codec->height<=0){ | |
2123 av_log(s, AV_LOG_ERROR, "dimensions not set\n"); | |
2124 return -1; | |
2125 } | |
2126 break; | |
2127 } | |
1681
23c911d09382
set codec_tag from codec_id if its not set and can be set based on the AVCodecTag tables
michael
parents:
1675
diff
changeset
|
2128 |
23c911d09382
set codec_tag from codec_id if its not set and can be set based on the AVCodecTag tables
michael
parents:
1675
diff
changeset
|
2129 if(s->oformat->codec_tag){ |
23c911d09382
set codec_tag from codec_id if its not set and can be set based on the AVCodecTag tables
michael
parents:
1675
diff
changeset
|
2130 if(st->codec->codec_tag){ |
23c911d09382
set codec_tag from codec_id if its not set and can be set based on the AVCodecTag tables
michael
parents:
1675
diff
changeset
|
2131 //FIXME |
23c911d09382
set codec_tag from codec_id if its not set and can be set based on the AVCodecTag tables
michael
parents:
1675
diff
changeset
|
2132 //check that tag + id is in the table |
23c911d09382
set codec_tag from codec_id if its not set and can be set based on the AVCodecTag tables
michael
parents:
1675
diff
changeset
|
2133 //if neither is in the table -> ok |
23c911d09382
set codec_tag from codec_id if its not set and can be set based on the AVCodecTag tables
michael
parents:
1675
diff
changeset
|
2134 //if tag is in the table with another id -> FAIL |
23c911d09382
set codec_tag from codec_id if its not set and can be set based on the AVCodecTag tables
michael
parents:
1675
diff
changeset
|
2135 //if id is in the table with another tag -> FAIL unless strict < ? |
23c911d09382
set codec_tag from codec_id if its not set and can be set based on the AVCodecTag tables
michael
parents:
1675
diff
changeset
|
2136 }else |
23c911d09382
set codec_tag from codec_id if its not set and can be set based on the AVCodecTag tables
michael
parents:
1675
diff
changeset
|
2137 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id); |
23c911d09382
set codec_tag from codec_id if its not set and can be set based on the AVCodecTag tables
michael
parents:
1675
diff
changeset
|
2138 } |
839 | 2139 } |
2140 | |
1625
f1ccbe0ad364
10l, only allocate priv_data if not already done
bcoudurier
parents:
1624
diff
changeset
|
2141 if (!s->priv_data && s->oformat->priv_data_size > 0) { |
1624 | 2142 s->priv_data = av_mallocz(s->oformat->priv_data_size); |
2143 if (!s->priv_data) | |
2144 return AVERROR_NOMEM; | |
1625
f1ccbe0ad364
10l, only allocate priv_data if not already done
bcoudurier
parents:
1624
diff
changeset
|
2145 } |
1624 | 2146 |
869 | 2147 if(s->oformat->write_header){ |
2148 ret = s->oformat->write_header(s); | |
2149 if (ret < 0) | |
2150 return ret; | |
2151 } | |
0 | 2152 |
2153 /* init PTS generation */ | |
2154 for(i=0;i<s->nb_streams;i++) { | |
840
8834d33b7ca1
minor fixes for invalid audio data patch by (Wolfram Gloger: wmglo, dent med uni-muenchen de)
michael
parents:
839
diff
changeset
|
2155 int64_t den = AV_NOPTS_VALUE; |
0 | 2156 st = s->streams[i]; |
2157 | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
2158 switch (st->codec->codec_type) { |
0 | 2159 case CODEC_TYPE_AUDIO: |
840
8834d33b7ca1
minor fixes for invalid audio data patch by (Wolfram Gloger: wmglo, dent med uni-muenchen de)
michael
parents:
839
diff
changeset
|
2160 den = (int64_t)st->time_base.num * st->codec->sample_rate; |
0 | 2161 break; |
2162 case CODEC_TYPE_VIDEO: | |
840
8834d33b7ca1
minor fixes for invalid audio data patch by (Wolfram Gloger: wmglo, dent med uni-muenchen de)
michael
parents:
839
diff
changeset
|
2163 den = (int64_t)st->time_base.num * st->codec->time_base.den; |
0 | 2164 break; |
2165 default: | |
2166 break; | |
2167 } | |
840
8834d33b7ca1
minor fixes for invalid audio data patch by (Wolfram Gloger: wmglo, dent med uni-muenchen de)
michael
parents:
839
diff
changeset
|
2168 if (den != AV_NOPTS_VALUE) { |
8834d33b7ca1
minor fixes for invalid audio data patch by (Wolfram Gloger: wmglo, dent med uni-muenchen de)
michael
parents:
839
diff
changeset
|
2169 if (den <= 0) |
8834d33b7ca1
minor fixes for invalid audio data patch by (Wolfram Gloger: wmglo, dent med uni-muenchen de)
michael
parents:
839
diff
changeset
|
2170 return AVERROR_INVALIDDATA; |
8834d33b7ca1
minor fixes for invalid audio data patch by (Wolfram Gloger: wmglo, dent med uni-muenchen de)
michael
parents:
839
diff
changeset
|
2171 av_frac_init(&st->pts, 0, 0, den); |
8834d33b7ca1
minor fixes for invalid audio data patch by (Wolfram Gloger: wmglo, dent med uni-muenchen de)
michael
parents:
839
diff
changeset
|
2172 } |
0 | 2173 } |
2174 return 0; | |
2175 } | |
2176 | |
470 | 2177 //FIXME merge with compute_pkt_fields |
617
1ca4877e42f3
some sanity checks on what is muxed, invalid timestamps in mpeg are very common and lead to strange errors in the mpeg muxer otherwise
michael
parents:
616
diff
changeset
|
2178 static int compute_pkt_fields2(AVStream *st, AVPacket *pkt){ |
1285
b5226e679a31
fix b pyramid in mp4 muxing if no dts are provided to the muxer
michael
parents:
1279
diff
changeset
|
2179 int delay = FFMAX(st->codec->has_b_frames, !!st->codec->max_b_frames); |
b5226e679a31
fix b pyramid in mp4 muxing if no dts are provided to the muxer
michael
parents:
1279
diff
changeset
|
2180 int num, den, frame_size, i; |
b5226e679a31
fix b pyramid in mp4 muxing if no dts are provided to the muxer
michael
parents:
1279
diff
changeset
|
2181 |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1442
diff
changeset
|
2182 // av_log(st->codec, AV_LOG_DEBUG, "av_write_frame: pts:%"PRId64" dts:%"PRId64" cur_dts:%"PRId64" b:%d size:%d st:%d\n", pkt->pts, pkt->dts, st->cur_dts, delay, pkt->size, pkt->stream_index); |
885 | 2183 |
468 | 2184 /* if(pkt->pts == AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE) |
2185 return -1;*/ | |
885 | 2186 |
468 | 2187 /* duration field */ |
470 | 2188 if (pkt->duration == 0) { |
2189 compute_frame_duration(&num, &den, st, NULL, pkt); | |
2190 if (den && num) { | |
2191 pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num); | |
2192 } | |
2193 } | |
409 | 2194 |
468 | 2195 //XXX/FIXME this is a temporary hack until all encoders output pts |
1285
b5226e679a31
fix b pyramid in mp4 muxing if no dts are provided to the muxer
michael
parents:
1279
diff
changeset
|
2196 if((pkt->pts == 0 || pkt->pts == AV_NOPTS_VALUE) && pkt->dts == AV_NOPTS_VALUE && !delay){ |
468 | 2197 pkt->dts= |
2198 // pkt->pts= st->cur_dts; | |
2199 pkt->pts= st->pts.val; | |
2200 } | |
2201 | |
885 | 2202 //calculate dts from pts |
468 | 2203 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts == AV_NOPTS_VALUE){ |
1285
b5226e679a31
fix b pyramid in mp4 muxing if no dts are provided to the muxer
michael
parents:
1279
diff
changeset
|
2204 st->pts_buffer[0]= pkt->pts; |
b5226e679a31
fix b pyramid in mp4 muxing if no dts are provided to the muxer
michael
parents:
1279
diff
changeset
|
2205 for(i=1; i<delay+1 && st->pts_buffer[i] == AV_NOPTS_VALUE; i++) |
b5226e679a31
fix b pyramid in mp4 muxing if no dts are provided to the muxer
michael
parents:
1279
diff
changeset
|
2206 st->pts_buffer[i]= (i-delay-1) * pkt->duration; |
b5226e679a31
fix b pyramid in mp4 muxing if no dts are provided to the muxer
michael
parents:
1279
diff
changeset
|
2207 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++) |
1442 | 2208 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]); |
1285
b5226e679a31
fix b pyramid in mp4 muxing if no dts are provided to the muxer
michael
parents:
1279
diff
changeset
|
2209 |
b5226e679a31
fix b pyramid in mp4 muxing if no dts are provided to the muxer
michael
parents:
1279
diff
changeset
|
2210 pkt->dts= st->pts_buffer[0]; |
468 | 2211 } |
885 | 2212 |
617
1ca4877e42f3
some sanity checks on what is muxed, invalid timestamps in mpeg are very common and lead to strange errors in the mpeg muxer otherwise
michael
parents:
616
diff
changeset
|
2213 if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){ |
2043
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
2214 av_log(NULL, AV_LOG_ERROR, "error, non monotone timestamps %"PRId64" >= %"PRId64"\n", st->cur_dts, pkt->dts); |
617
1ca4877e42f3
some sanity checks on what is muxed, invalid timestamps in mpeg are very common and lead to strange errors in the mpeg muxer otherwise
michael
parents:
616
diff
changeset
|
2215 return -1; |
1ca4877e42f3
some sanity checks on what is muxed, invalid timestamps in mpeg are very common and lead to strange errors in the mpeg muxer otherwise
michael
parents:
616
diff
changeset
|
2216 } |
1ca4877e42f3
some sanity checks on what is muxed, invalid timestamps in mpeg are very common and lead to strange errors in the mpeg muxer otherwise
michael
parents:
616
diff
changeset
|
2217 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts < pkt->dts){ |
2043
3446000701c4
Fix reading PTSs and DTSs in libavformat, by reverting r8465.
lucabe
parents:
2037
diff
changeset
|
2218 av_log(NULL, AV_LOG_ERROR, "error, pts < dts\n"); |
617
1ca4877e42f3
some sanity checks on what is muxed, invalid timestamps in mpeg are very common and lead to strange errors in the mpeg muxer otherwise
michael
parents:
616
diff
changeset
|
2219 return -1; |
1ca4877e42f3
some sanity checks on what is muxed, invalid timestamps in mpeg are very common and lead to strange errors in the mpeg muxer otherwise
michael
parents:
616
diff
changeset
|
2220 } |
1ca4877e42f3
some sanity checks on what is muxed, invalid timestamps in mpeg are very common and lead to strange errors in the mpeg muxer otherwise
michael
parents:
616
diff
changeset
|
2221 |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1442
diff
changeset
|
2222 // av_log(NULL, AV_LOG_DEBUG, "av_write_frame: pts2:%"PRId64" dts2:%"PRId64"\n", pkt->pts, pkt->dts); |
468 | 2223 st->cur_dts= pkt->dts; |
2224 st->pts.val= pkt->dts; | |
2225 | |
0 | 2226 /* update pts */ |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
2227 switch (st->codec->codec_type) { |
0 | 2228 case CODEC_TYPE_AUDIO: |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
2229 frame_size = get_audio_frame_size(st->codec, pkt->size); |
406
ea22a438ca79
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
404
diff
changeset
|
2230 |
409 | 2231 /* HACK/FIXME, we skip the initial 0-size packets as they are most likely equal to the encoder delay, |
406
ea22a438ca79
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
404
diff
changeset
|
2232 but it would be better if we had the real timestamps from the encoder */ |
468 | 2233 if (frame_size >= 0 && (pkt->size || st->pts.num!=st->pts.den>>1 || st->pts.val)) { |
462
b69898ffc92a
move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents:
453
diff
changeset
|
2234 av_frac_add(&st->pts, (int64_t)st->time_base.den * frame_size); |
0 | 2235 } |
2236 break; | |
2237 case CODEC_TYPE_VIDEO: | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
2238 av_frac_add(&st->pts, (int64_t)st->time_base.den * st->codec->time_base.num); |
0 | 2239 break; |
2240 default: | |
2241 break; | |
2242 } | |
617
1ca4877e42f3
some sanity checks on what is muxed, invalid timestamps in mpeg are very common and lead to strange errors in the mpeg muxer otherwise
michael
parents:
616
diff
changeset
|
2243 return 0; |
470 | 2244 } |
2245 | |
2246 static void truncate_ts(AVStream *st, AVPacket *pkt){ | |
2247 int64_t pts_mask = (2LL << (st->pts_wrap_bits-1)) - 1; | |
885 | 2248 |
547 | 2249 // if(pkt->dts < 0) |
2250 // pkt->dts= 0; //this happens for low_delay=0 and b frames, FIXME, needs further invstigation about what we should do here | |
885 | 2251 |
1555
5f829140788e
cosmetics, remove braces, remove spaces just inside parens
bcoudurier
parents:
1554
diff
changeset
|
2252 if (pkt->pts != AV_NOPTS_VALUE) |
1554
1eaba8bc0ab1
do not truncate pts/dts if value is AV_NOPTS_VALUE, patch by Andy Parkins, andrew parkins at 360visiontechnology com
bcoudurier
parents:
1496
diff
changeset
|
2253 pkt->pts &= pts_mask; |
1555
5f829140788e
cosmetics, remove braces, remove spaces just inside parens
bcoudurier
parents:
1554
diff
changeset
|
2254 if (pkt->dts != AV_NOPTS_VALUE) |
1554
1eaba8bc0ab1
do not truncate pts/dts if value is AV_NOPTS_VALUE, patch by Andy Parkins, andrew parkins at 360visiontechnology com
bcoudurier
parents:
1496
diff
changeset
|
2255 pkt->dts &= pts_mask; |
470 | 2256 } |
2257 | |
2258 int av_write_frame(AVFormatContext *s, AVPacket *pkt) | |
2259 { | |
554 | 2260 int ret; |
2261 | |
617
1ca4877e42f3
some sanity checks on what is muxed, invalid timestamps in mpeg are very common and lead to strange errors in the mpeg muxer otherwise
michael
parents:
616
diff
changeset
|
2262 ret=compute_pkt_fields2(s->streams[pkt->stream_index], pkt); |
1245
e59b75051ded
dont be too picky about timestampsbeing wrong if the destination container is without timestamps and raw of the raw video / raw audio sort
michael
parents:
1244
diff
changeset
|
2263 if(ret<0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS)) |
617
1ca4877e42f3
some sanity checks on what is muxed, invalid timestamps in mpeg are very common and lead to strange errors in the mpeg muxer otherwise
michael
parents:
616
diff
changeset
|
2264 return ret; |
885 | 2265 |
470 | 2266 truncate_ts(s->streams[pkt->stream_index], pkt); |
2267 | |
554 | 2268 ret= s->oformat->write_packet(s, pkt); |
2269 if(!ret) | |
2270 ret= url_ferror(&s->pb); | |
2271 return ret; | |
470 | 2272 } |
2273 | |
1251 | 2274 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){ |
470 | 2275 AVPacketList *pktl, **next_point, *this_pktl; |
2276 int stream_count=0; | |
2277 int streams[MAX_STREAMS]; | |
536
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2278 |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2279 if(pkt){ |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2280 AVStream *st= s->streams[ pkt->stream_index]; |
470 | 2281 |
804 | 2282 // assert(pkt->destruct != av_destruct_packet); //FIXME |
470 | 2283 |
536
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2284 this_pktl = av_mallocz(sizeof(AVPacketList)); |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2285 this_pktl->pkt= *pkt; |
804 | 2286 if(pkt->destruct == av_destruct_packet) |
2287 pkt->destruct= NULL; // non shared -> must keep original from being freed | |
2288 else | |
2289 av_dup_packet(&this_pktl->pkt); //shared -> must dup | |
470 | 2290 |
536
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2291 next_point = &s->packet_buffer; |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2292 while(*next_point){ |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2293 AVStream *st2= s->streams[ (*next_point)->pkt.stream_index]; |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2294 int64_t left= st2->time_base.num * (int64_t)st ->time_base.den; |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2295 int64_t right= st ->time_base.num * (int64_t)st2->time_base.den; |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2296 if((*next_point)->pkt.dts * left > pkt->dts * right) //FIXME this can overflow |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2297 break; |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2298 next_point= &(*next_point)->next; |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2299 } |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2300 this_pktl->next= *next_point; |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2301 *next_point= this_pktl; |
470 | 2302 } |
885 | 2303 |
470 | 2304 memset(streams, 0, sizeof(streams)); |
2305 pktl= s->packet_buffer; | |
2306 while(pktl){ | |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1442
diff
changeset
|
2307 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%"PRId64"\n", pktl->pkt.stream_index, pktl->pkt.dts); |
470 | 2308 if(streams[ pktl->pkt.stream_index ] == 0) |
2309 stream_count++; | |
2310 streams[ pktl->pkt.stream_index ]++; | |
2311 pktl= pktl->next; | |
2312 } | |
885 | 2313 |
536
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2314 if(s->nb_streams == stream_count || (flush && stream_count)){ |
470 | 2315 pktl= s->packet_buffer; |
536
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2316 *out= pktl->pkt; |
885 | 2317 |
2318 s->packet_buffer= pktl->next; | |
536
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2319 av_freep(&pktl); |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2320 return 1; |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2321 }else{ |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2322 av_init_packet(out); |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2323 return 0; |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2324 } |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2325 } |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2326 |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2327 /** |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2328 * Interleaves a AVPacket correctly so it can be muxed. |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2329 * @param out the interleaved packet will be output here |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2330 * @param in the input packet |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2331 * @param flush 1 if no further packets are available as input and all |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2332 * remaining packets should be output |
885 | 2333 * @return 1 if a packet was output, 0 if no packet could be output, |
536
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2334 * < 0 if an error occured |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2335 */ |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2336 static int av_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *in, int flush){ |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2337 if(s->oformat->interleave_packet) |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2338 return s->oformat->interleave_packet(s, out, in, flush); |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2339 else |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2340 return av_interleave_packet_per_dts(s, out, in, flush); |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2341 } |
470 | 2342 |
536
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2343 int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){ |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2344 AVStream *st= s->streams[ pkt->stream_index]; |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2345 |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2346 //FIXME/XXX/HACK drop zero sized packets |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
2347 if(st->codec->codec_type == CODEC_TYPE_AUDIO && pkt->size==0) |
536
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2348 return 0; |
717
a79f89d39c3c
discard dummy packets before doing inapropriate checks on them and failing as a result
michael
parents:
708
diff
changeset
|
2349 |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1442
diff
changeset
|
2350 //av_log(NULL, AV_LOG_DEBUG, "av_interleaved_write_frame %d %"PRId64" %"PRId64"\n", pkt->size, pkt->dts, pkt->pts); |
1245
e59b75051ded
dont be too picky about timestampsbeing wrong if the destination container is without timestamps and raw of the raw video / raw audio sort
michael
parents:
1244
diff
changeset
|
2351 if(compute_pkt_fields2(st, pkt) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS)) |
717
a79f89d39c3c
discard dummy packets before doing inapropriate checks on them and failing as a result
michael
parents:
708
diff
changeset
|
2352 return -1; |
885 | 2353 |
536
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2354 if(pkt->dts == AV_NOPTS_VALUE) |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2355 return -1; |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2356 |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2357 for(;;){ |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2358 AVPacket opkt; |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2359 int ret= av_interleave_packet(s, &opkt, pkt, 0); |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2360 if(ret<=0) //FIXME cleanup needed for ret<0 ? |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2361 return ret; |
885 | 2362 |
536
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2363 truncate_ts(s->streams[opkt.stream_index], &opkt); |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2364 ret= s->oformat->write_packet(s, &opkt); |
885 | 2365 |
536
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2366 av_free_packet(&opkt); |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2367 pkt= NULL; |
885 | 2368 |
470 | 2369 if(ret<0) |
2370 return ret; | |
554 | 2371 if(url_ferror(&s->pb)) |
2372 return url_ferror(&s->pb); | |
470 | 2373 } |
0 | 2374 } |
2375 | |
2376 int av_write_trailer(AVFormatContext *s) | |
2377 { | |
540
26a477a5ebda
move free() of AVStream priv data to av_write_trailer()
michael
parents:
536
diff
changeset
|
2378 int ret, i; |
885 | 2379 |
536
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2380 for(;;){ |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2381 AVPacket pkt; |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2382 ret= av_interleave_packet(s, &pkt, NULL, 1); |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2383 if(ret<0) //FIXME cleanup needed for ret<0 ? |
540
26a477a5ebda
move free() of AVStream priv data to av_write_trailer()
michael
parents:
536
diff
changeset
|
2384 goto fail; |
536
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2385 if(!ret) |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2386 break; |
885 | 2387 |
536
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2388 truncate_ts(s->streams[pkt.stream_index], &pkt); |
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2389 ret= s->oformat->write_packet(s, &pkt); |
885 | 2390 |
536
76c47c58064f
move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
michael
parents:
535
diff
changeset
|
2391 av_free_packet(&pkt); |
885 | 2392 |
470 | 2393 if(ret<0) |
540
26a477a5ebda
move free() of AVStream priv data to av_write_trailer()
michael
parents:
536
diff
changeset
|
2394 goto fail; |
554 | 2395 if(url_ferror(&s->pb)) |
2396 goto fail; | |
470 | 2397 } |
2398 | |
869 | 2399 if(s->oformat->write_trailer) |
2400 ret = s->oformat->write_trailer(s); | |
540
26a477a5ebda
move free() of AVStream priv data to av_write_trailer()
michael
parents:
536
diff
changeset
|
2401 fail: |
554 | 2402 if(ret == 0) |
2403 ret=url_ferror(&s->pb); | |
540
26a477a5ebda
move free() of AVStream priv data to av_write_trailer()
michael
parents:
536
diff
changeset
|
2404 for(i=0;i<s->nb_streams;i++) |
26a477a5ebda
move free() of AVStream priv data to av_write_trailer()
michael
parents:
536
diff
changeset
|
2405 av_freep(&s->streams[i]->priv_data); |
0 | 2406 av_freep(&s->priv_data); |
2407 return ret; | |
2408 } | |
2409 | |
2410 /* "user interface" functions */ | |
2411 | |
2412 void dump_format(AVFormatContext *ic, | |
885 | 2413 int index, |
0 | 2414 const char *url, |
2415 int is_output) | |
2416 { | |
2417 int i, flags; | |
2418 char buf[256]; | |
2419 | |
885 | 2420 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n", |
0 | 2421 is_output ? "Output" : "Input", |
885 | 2422 index, |
2423 is_output ? ic->oformat->name : ic->iformat->name, | |
0 | 2424 is_output ? "to" : "from", url); |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2425 if (!is_output) { |
776 | 2426 av_log(NULL, AV_LOG_INFO, " Duration: "); |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2427 if (ic->duration != AV_NOPTS_VALUE) { |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2428 int hours, mins, secs, us; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2429 secs = ic->duration / AV_TIME_BASE; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2430 us = ic->duration % AV_TIME_BASE; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2431 mins = secs / 60; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2432 secs %= 60; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2433 hours = mins / 60; |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2434 mins %= 60; |
885 | 2435 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%01d", hours, mins, secs, |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2436 (10 * us) / AV_TIME_BASE); |
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2437 } else { |
776 | 2438 av_log(NULL, AV_LOG_INFO, "N/A"); |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2439 } |
556
cb5f220888c0
print start_time patch by (Wolfram Gloger <wmglo at dent dot med dot uni-muenchen dot de>)
michael
parents:
555
diff
changeset
|
2440 if (ic->start_time != AV_NOPTS_VALUE) { |
cb5f220888c0
print start_time patch by (Wolfram Gloger <wmglo at dent dot med dot uni-muenchen dot de>)
michael
parents:
555
diff
changeset
|
2441 int secs, us; |
776 | 2442 av_log(NULL, AV_LOG_INFO, ", start: "); |
556
cb5f220888c0
print start_time patch by (Wolfram Gloger <wmglo at dent dot med dot uni-muenchen dot de>)
michael
parents:
555
diff
changeset
|
2443 secs = ic->start_time / AV_TIME_BASE; |
cb5f220888c0
print start_time patch by (Wolfram Gloger <wmglo at dent dot med dot uni-muenchen dot de>)
michael
parents:
555
diff
changeset
|
2444 us = ic->start_time % AV_TIME_BASE; |
776 | 2445 av_log(NULL, AV_LOG_INFO, "%d.%06d", |
556
cb5f220888c0
print start_time patch by (Wolfram Gloger <wmglo at dent dot med dot uni-muenchen dot de>)
michael
parents:
555
diff
changeset
|
2446 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE)); |
cb5f220888c0
print start_time patch by (Wolfram Gloger <wmglo at dent dot med dot uni-muenchen dot de>)
michael
parents:
555
diff
changeset
|
2447 } |
776 | 2448 av_log(NULL, AV_LOG_INFO, ", bitrate: "); |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2449 if (ic->bit_rate) { |
776 | 2450 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000); |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2451 } else { |
776 | 2452 av_log(NULL, AV_LOG_INFO, "N/A"); |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2453 } |
776 | 2454 av_log(NULL, AV_LOG_INFO, "\n"); |
192
0316a506aeb0
initial duration/start_time generic support - displays stream duration and average total bitrate when using an input file
bellard
parents:
175
diff
changeset
|
2455 } |
0 | 2456 for(i=0;i<ic->nb_streams;i++) { |
2457 AVStream *st = ic->streams[i]; | |
855
379c4e948363
print more time_base fps stuff if av_log level is at debug or above
michael
parents:
851
diff
changeset
|
2458 int g= ff_gcd(st->time_base.num, st->time_base.den); |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
819
diff
changeset
|
2459 avcodec_string(buf, sizeof(buf), st->codec, is_output); |
776 | 2460 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d", index, i); |
0 | 2461 /* the pid is an important information, so we display it */ |
2462 /* XXX: add a generic system */ | |
2463 if (is_output) | |
2464 flags = ic->oformat->flags; | |
2465 else | |
2466 flags = ic->iformat->flags; | |
2467 if (flags & AVFMT_SHOW_IDS) { | |
776 | 2468 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id); |
0 | 2469 } |
819
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
810
diff
changeset
|
2470 if (strlen(st->language) > 0) { |
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
810
diff
changeset
|
2471 av_log(NULL, AV_LOG_INFO, "(%s)", st->language); |
a6c035e7f429
DVB subtitle decoder by (Ian Caulfield: imc25, cam ac uk)
michael
parents:
810
diff
changeset
|
2472 } |
855
379c4e948363
print more time_base fps stuff if av_log level is at debug or above
michael
parents:
851
diff
changeset
|
2473 av_log(NULL, AV_LOG_DEBUG, ", %d/%d", st->time_base.num/g, st->time_base.den/g); |
1119 | 2474 av_log(NULL, AV_LOG_INFO, ": %s", buf); |
855
379c4e948363
print more time_base fps stuff if av_log level is at debug or above
michael
parents:
851
diff
changeset
|
2475 if(st->codec->codec_type == CODEC_TYPE_VIDEO){ |
882 | 2476 if(st->r_frame_rate.den && st->r_frame_rate.num) |
2477 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(r)", av_q2d(st->r_frame_rate)); | |
2478 /* else if(st->time_base.den && st->time_base.num) | |
2479 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(m)", 1/av_q2d(st->time_base));*/ | |
2480 else | |
2481 av_log(NULL, AV_LOG_INFO, ", %5.2f fps(c)", 1/av_q2d(st->codec->time_base)); | |
855
379c4e948363
print more time_base fps stuff if av_log level is at debug or above
michael
parents:
851
diff
changeset
|
2482 } |
1119 | 2483 av_log(NULL, AV_LOG_INFO, "\n"); |
0 | 2484 } |
2485 } | |
2486 | |
2487 int parse_image_size(int *width_ptr, int *height_ptr, const char *str) | |
2488 { | |
2163
6c0176688fae
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
2160
diff
changeset
|
2489 return av_parse_video_frame_size(width_ptr, height_ptr, str); |
0 | 2490 } |
2491 | |
2163
6c0176688fae
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
2160
diff
changeset
|
2492 int parse_frame_rate(int *frame_rate_num, int *frame_rate_den, const char *arg) |
168 | 2493 { |
2163
6c0176688fae
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
2160
diff
changeset
|
2494 AVRational frame_rate; |
6c0176688fae
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
2160
diff
changeset
|
2495 int ret = av_parse_video_frame_rate(&frame_rate, arg); |
6c0176688fae
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
2160
diff
changeset
|
2496 *frame_rate_num= frame_rate.num; |
6c0176688fae
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
2160
diff
changeset
|
2497 *frame_rate_den= frame_rate.den; |
6c0176688fae
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
2160
diff
changeset
|
2498 return ret; |
168 | 2499 } |
2500 | |
65 | 2501 int64_t parse_date(const char *datestr, int duration) |
0 | 2502 { |
2503 const char *p; | |
65 | 2504 int64_t t; |
0 | 2505 struct tm dt; |
2506 int i; | |
2507 static const char *date_fmt[] = { | |
2508 "%Y-%m-%d", | |
2509 "%Y%m%d", | |
2510 }; | |
2511 static const char *time_fmt[] = { | |
2512 "%H:%M:%S", | |
2513 "%H%M%S", | |
2514 }; | |
2515 const char *q; | |
2516 int is_utc, len; | |
2517 char lastch; | |
477 | 2518 int negative = 0; |
406
ea22a438ca79
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
404
diff
changeset
|
2519 |
ea22a438ca79
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
404
diff
changeset
|
2520 #undef time |
0 | 2521 time_t now = time(0); |
2522 | |
2523 len = strlen(datestr); | |
2524 if (len > 0) | |
2525 lastch = datestr[len - 1]; | |
2526 else | |
2527 lastch = '\0'; | |
2528 is_utc = (lastch == 'z' || lastch == 'Z'); | |
2529 | |
2530 memset(&dt, 0, sizeof(dt)); | |
2531 | |
2532 p = datestr; | |
2533 q = NULL; | |
2534 if (!duration) { | |
2535 for (i = 0; i < sizeof(date_fmt) / sizeof(date_fmt[0]); i++) { | |
230
9f4f4ca9f7b5
simpler strptime - added os_support.[ch] - moved localtime_r to os_support.c
bellard
parents:
229
diff
changeset
|
2536 q = small_strptime(p, date_fmt[i], &dt); |
0 | 2537 if (q) { |
2538 break; | |
2539 } | |
2540 } | |
2541 | |
2542 if (!q) { | |
2543 if (is_utc) { | |
2544 dt = *gmtime(&now); | |
2545 } else { | |
2546 dt = *localtime(&now); | |
2547 } | |
2548 dt.tm_hour = dt.tm_min = dt.tm_sec = 0; | |
2549 } else { | |
2550 p = q; | |
2551 } | |
2552 | |
2553 if (*p == 'T' || *p == 't' || *p == ' ') | |
2554 p++; | |
2555 | |
2556 for (i = 0; i < sizeof(time_fmt) / sizeof(time_fmt[0]); i++) { | |
230
9f4f4ca9f7b5
simpler strptime - added os_support.[ch] - moved localtime_r to os_support.c
bellard
parents:
229
diff
changeset
|
2557 q = small_strptime(p, time_fmt[i], &dt); |
0 | 2558 if (q) { |
2559 break; | |
2560 } | |
2561 } | |
2562 } else { | |
887 | 2563 if (p[0] == '-') { |
2564 negative = 1; | |
2565 ++p; | |
2566 } | |
230
9f4f4ca9f7b5
simpler strptime - added os_support.[ch] - moved localtime_r to os_support.c
bellard
parents:
229
diff
changeset
|
2567 q = small_strptime(p, time_fmt[0], &dt); |
0 | 2568 if (!q) { |
2569 dt.tm_sec = strtol(p, (char **)&q, 10); | |
2570 dt.tm_min = 0; | |
2571 dt.tm_hour = 0; | |
2572 } | |
2573 } | |
2574 | |
2575 /* Now we have all the fields that we can get */ | |
2576 if (!q) { | |
2577 if (duration) | |
2578 return 0; | |
2579 else | |
1556 | 2580 return now * INT64_C(1000000); |
0 | 2581 } |
2582 | |
2583 if (duration) { | |
2584 t = dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec; | |
2585 } else { | |
2586 dt.tm_isdst = -1; /* unknown */ | |
2587 if (is_utc) { | |
2588 t = mktimegm(&dt); | |
2589 } else { | |
2590 t = mktime(&dt); | |
2591 } | |
2592 } | |
2593 | |
2594 t *= 1000000; | |
2595 | |
2596 if (*q == '.') { | |
2597 int val, n; | |
2598 q++; | |
2599 for (val = 0, n = 100000; n >= 1; n /= 10, q++) { | |
885 | 2600 if (!isdigit(*q)) |
0 | 2601 break; |
2602 val += n * (*q - '0'); | |
2603 } | |
2604 t += val; | |
2605 } | |
477 | 2606 return negative ? -t : t; |
0 | 2607 } |
2608 | |
2609 int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info) | |
2610 { | |
2611 const char *p; | |
2612 char tag[128], *q; | |
2613 | |
2614 p = info; | |
2615 if (*p == '?') | |
2616 p++; | |
2617 for(;;) { | |
2618 q = tag; | |
2619 while (*p != '\0' && *p != '=' && *p != '&') { | |
2620 if ((q - tag) < sizeof(tag) - 1) | |
2621 *q++ = *p; | |
2622 p++; | |
2623 } | |
2624 *q = '\0'; | |
2625 q = arg; | |
2626 if (*p == '=') { | |
2627 p++; | |
2628 while (*p != '&' && *p != '\0') { | |
2629 if ((q - arg) < arg_size - 1) { | |
2630 if (*p == '+') | |
2631 *q++ = ' '; | |
2632 else | |
2633 *q++ = *p; | |
2634 } | |
2635 p++; | |
2636 } | |
2637 *q = '\0'; | |
2638 } | |
885 | 2639 if (!strcmp(tag, tag1)) |
0 | 2640 return 1; |
2641 if (*p != '&') | |
2642 break; | |
2643 p++; | |
2644 } | |
2645 return 0; | |
2646 } | |
2647 | |
1291
185190bdc185
Clarified API for numbered sequences, patch by Michel Bardiaux % mbardiaux A mediaxim P be %
gpoirier
parents:
1285
diff
changeset
|
2648 int av_get_frame_filename(char *buf, int buf_size, |
185190bdc185
Clarified API for numbered sequences, patch by Michel Bardiaux % mbardiaux A mediaxim P be %
gpoirier
parents:
1285
diff
changeset
|
2649 const char *path, int number) |
0 | 2650 { |
2651 const char *p; | |
290
7a3ed84008ec
GCC 3.3.2 warnings patch by (Panagiotis Issaris <takis at lumumba dot luc dot ac dot be>)
michael
parents:
230
diff
changeset
|
2652 char *q, buf1[20], c; |
7a3ed84008ec
GCC 3.3.2 warnings patch by (Panagiotis Issaris <takis at lumumba dot luc dot ac dot be>)
michael
parents:
230
diff
changeset
|
2653 int nd, len, percentd_found; |
0 | 2654 |
2655 q = buf; | |
2656 p = path; | |
2657 percentd_found = 0; | |
2658 for(;;) { | |
2659 c = *p++; | |
2660 if (c == '\0') | |
2661 break; | |
2662 if (c == '%') { | |
9
97e61383cb81
* Extend the syntax of a filename for the img reader to allow looping. Thus
philipjsg
parents:
7
diff
changeset
|
2663 do { |
97e61383cb81
* Extend the syntax of a filename for the img reader to allow looping. Thus
philipjsg
parents:
7
diff
changeset
|
2664 nd = 0; |
97e61383cb81
* Extend the syntax of a filename for the img reader to allow looping. Thus
philipjsg
parents:
7
diff
changeset
|
2665 while (isdigit(*p)) { |
97e61383cb81
* Extend the syntax of a filename for the img reader to allow looping. Thus
philipjsg
parents:
7
diff
changeset
|
2666 nd = nd * 10 + *p++ - '0'; |
97e61383cb81
* Extend the syntax of a filename for the img reader to allow looping. Thus
philipjsg
parents:
7
diff
changeset
|
2667 } |
97e61383cb81
* Extend the syntax of a filename for the img reader to allow looping. Thus
philipjsg
parents:
7
diff
changeset
|
2668 c = *p++; |
97e61383cb81
* Extend the syntax of a filename for the img reader to allow looping. Thus
philipjsg
parents:
7
diff
changeset
|
2669 } while (isdigit(c)); |
97e61383cb81
* Extend the syntax of a filename for the img reader to allow looping. Thus
philipjsg
parents:
7
diff
changeset
|
2670 |
0 | 2671 switch(c) { |
2672 case '%': | |
2673 goto addchar; | |
2674 case 'd': | |
2675 if (percentd_found) | |
2676 goto fail; | |
2677 percentd_found = 1; | |
2678 snprintf(buf1, sizeof(buf1), "%0*d", nd, number); | |
2679 len = strlen(buf1); | |
2680 if ((q - buf + len) > buf_size - 1) | |
2681 goto fail; | |
2682 memcpy(q, buf1, len); | |
2683 q += len; | |
2684 break; | |
2685 default: | |
2686 goto fail; | |
2687 } | |
2688 } else { | |
2689 addchar: | |
2690 if ((q - buf) < buf_size - 1) | |
2691 *q++ = c; | |
2692 } | |
2693 } | |
2694 if (!percentd_found) | |
2695 goto fail; | |
2696 *q = '\0'; | |
2697 return 0; | |
2698 fail: | |
2699 *q = '\0'; | |
2700 return -1; | |
2701 } | |
2702 | |
1908
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2703 static void hex_dump_internal(void *avcl, FILE *f, int level, uint8_t *buf, int size) |
0 | 2704 { |
2705 int len, i, j, c; | |
1908
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2706 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0) |
0 | 2707 |
2708 for(i=0;i<size;i+=16) { | |
2709 len = size - i; | |
2710 if (len > 16) | |
2711 len = 16; | |
1908
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2712 PRINT("%08x ", i); |
0 | 2713 for(j=0;j<16;j++) { |
2714 if (j < len) | |
1908
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2715 PRINT(" %02x", buf[i+j]); |
0 | 2716 else |
1908
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2717 PRINT(" "); |
0 | 2718 } |
1908
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2719 PRINT(" "); |
0 | 2720 for(j=0;j<len;j++) { |
2721 c = buf[i+j]; | |
2722 if (c < ' ' || c > '~') | |
2723 c = '.'; | |
1908
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2724 PRINT("%c", c); |
0 | 2725 } |
1908
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2726 PRINT("\n"); |
0 | 2727 } |
1908
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2728 #undef PRINT |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2729 } |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2730 |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2731 void av_hex_dump(FILE *f, uint8_t *buf, int size) |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2732 { |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2733 hex_dump_internal(NULL, f, 0, buf, size); |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2734 } |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2735 |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2736 void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size) |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2737 { |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2738 hex_dump_internal(avcl, NULL, level, buf, size); |
0 | 2739 } |
2740 | |
743 | 2741 //FIXME needs to know the time_base |
1908
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2742 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload) |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2743 { |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2744 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0) |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2745 PRINT("stream #%d:\n", pkt->stream_index); |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2746 PRINT(" keyframe=%d\n", ((pkt->flags & PKT_FLAG_KEY) != 0)); |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2747 PRINT(" duration=%0.3f\n", (double)pkt->duration / AV_TIME_BASE); |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2748 /* DTS is _always_ valid after av_read_frame() */ |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2749 PRINT(" dts="); |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2750 if (pkt->dts == AV_NOPTS_VALUE) |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2751 PRINT("N/A"); |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2752 else |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2753 PRINT("%0.3f", (double)pkt->dts / AV_TIME_BASE); |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2754 /* PTS may be not known if B frames are present */ |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2755 PRINT(" pts="); |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2756 if (pkt->pts == AV_NOPTS_VALUE) |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2757 PRINT("N/A"); |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2758 else |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2759 PRINT("%0.3f", (double)pkt->pts / AV_TIME_BASE); |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2760 PRINT("\n"); |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2761 PRINT(" size=%d\n", pkt->size); |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2762 #undef PRINT |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2763 if (dump_payload) |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2764 av_hex_dump(f, pkt->data, pkt->size); |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2765 } |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2766 |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2767 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload) |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2768 { |
1908
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2769 pkt_dump_internal(NULL, f, 0, pkt, dump_payload); |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2770 } |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2771 |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2772 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload) |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2773 { |
174083eafc6c
Introduce two new logging functions av_hex_dump_log() and av_pkt_dump_log()
takis
parents:
1906
diff
changeset
|
2774 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload); |
303
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2775 } |
2833c2311b66
initial av_read_frame() and av_seek_frame() support
bellard
parents:
293
diff
changeset
|
2776 |
0 | 2777 void url_split(char *proto, int proto_size, |
511
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2778 char *authorization, int authorization_size, |
0 | 2779 char *hostname, int hostname_size, |
2780 int *port_ptr, | |
2781 char *path, int path_size, | |
2782 const char *url) | |
2783 { | |
2784 const char *p; | |
2785 char *q; | |
2786 int port; | |
2787 | |
2788 port = -1; | |
2789 | |
2790 p = url; | |
2791 q = proto; | |
2792 while (*p != ':' && *p != '\0') { | |
2793 if ((q - proto) < proto_size - 1) | |
2794 *q++ = *p; | |
2795 p++; | |
2796 } | |
2797 if (proto_size > 0) | |
2798 *q = '\0'; | |
511
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2799 if (authorization_size > 0) |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2800 authorization[0] = '\0'; |
0 | 2801 if (*p == '\0') { |
2802 if (proto_size > 0) | |
2803 proto[0] = '\0'; | |
2804 if (hostname_size > 0) | |
2805 hostname[0] = '\0'; | |
2806 p = url; | |
2807 } else { | |
511
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2808 char *at,*slash; // PETR: position of '@' character and '/' character |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2809 |
0 | 2810 p++; |
2811 if (*p == '/') | |
2812 p++; | |
2813 if (*p == '/') | |
2814 p++; | |
511
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2815 at = strchr(p,'@'); // PETR: get the position of '@' |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2816 slash = strchr(p,'/'); // PETR: get position of '/' - end of hostname |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2817 if (at && slash && at > slash) at = NULL; // PETR: not interested in '@' behind '/' |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2818 |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2819 q = at ? authorization : hostname; // PETR: if '@' exists starting with auth. |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2820 |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2821 while ((at || *p != ':') && *p != '/' && *p != '?' && *p != '\0') { // PETR: |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2822 if (*p == '@') { // PETR: passed '@' |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2823 if (authorization_size > 0) |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2824 *q = '\0'; |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2825 q = hostname; |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2826 at = NULL; |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2827 } else if (!at) { // PETR: hostname |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2828 if ((q - hostname) < hostname_size - 1) |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2829 *q++ = *p; |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2830 } else { |
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2831 if ((q - authorization) < authorization_size - 1) |
0 | 2832 *q++ = *p; |
511
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
502
diff
changeset
|
2833 } |
0 | 2834 p++; |
2835 } | |
2836 if (hostname_size > 0) | |
2837 *q = '\0'; | |
2838 if (*p == ':') { | |
2839 p++; | |
2840 port = strtoul(p, (char **)&p, 10); | |
2841 } | |
2842 } | |
2843 if (port_ptr) | |
2844 *port_ptr = port; | |
2189 | 2845 av_strlcpy(path, p, path_size); |
0 | 2846 } |
2847 | |
462
b69898ffc92a
move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents:
453
diff
changeset
|
2848 void av_set_pts_info(AVStream *s, int pts_wrap_bits, |
0 | 2849 int pts_num, int pts_den) |
2850 { | |
2851 s->pts_wrap_bits = pts_wrap_bits; | |
462
b69898ffc92a
move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents:
453
diff
changeset
|
2852 s->time_base.num = pts_num; |
b69898ffc92a
move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents:
453
diff
changeset
|
2853 s->time_base.den = pts_den; |
0 | 2854 } |
2855 | |
2856 /* fraction handling */ | |
2857 | |
2858 /** | |
802
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
2859 * f = val + (num / den) + 0.5. |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
2860 * |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
2861 * 'num' is normalized so that it is such as 0 <= num < den. |
0 | 2862 * |
2863 * @param f fractional number | |
2864 * @param val integer value | |
2865 * @param num must be >= 0 | |
885 | 2866 * @param den must be >= 1 |
0 | 2867 */ |
1135
107f90e1551b
cleanup patch from Diego Petten <flameeyes@gentoo.org>
lu_zero
parents:
1127
diff
changeset
|
2868 static void av_frac_init(AVFrac *f, int64_t val, int64_t num, int64_t den) |
0 | 2869 { |
2870 num += (den >> 1); | |
2871 if (num >= den) { | |
2872 val += num / den; | |
2873 num = num % den; | |
2874 } | |
2875 f->val = val; | |
2876 f->num = num; | |
2877 f->den = den; | |
2878 } | |
2879 | |
802
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
2880 /** |
ea0e995ac4a8
part of the 'libavformat/utils.c doxygen documentation' patch by (Daniel Kristjansson: danielk, cat nyu edu)
michael
parents:
801
diff
changeset
|
2881 * Fractionnal addition to f: f = f + (incr / f->den). |
0 | 2882 * |
2883 * @param f fractional number | |
2884 * @param incr increment, can be positive or negative | |
2885 */ | |
1135
107f90e1551b
cleanup patch from Diego Petten <flameeyes@gentoo.org>
lu_zero
parents:
1127
diff
changeset
|
2886 static void av_frac_add(AVFrac *f, int64_t incr) |
0 | 2887 { |
65 | 2888 int64_t num, den; |
0 | 2889 |
2890 num = f->num + incr; | |
2891 den = f->den; | |
2892 if (num < 0) { | |
2893 f->val += num / den; | |
2894 num = num % den; | |
2895 if (num < 0) { | |
2896 num += den; | |
2897 f->val--; | |
2898 } | |
2899 } else if (num >= den) { | |
2900 f->val += num / den; | |
2901 num = num % den; | |
2902 } | |
2903 f->num = num; | |
2904 } |