yading@11
|
1 /*
|
yading@11
|
2 * various utility functions for use within FFmpeg
|
yading@11
|
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
|
yading@11
|
4 *
|
yading@11
|
5 * This file is part of FFmpeg.
|
yading@11
|
6 *
|
yading@11
|
7 * FFmpeg is free software; you can redistribute it and/or
|
yading@11
|
8 * modify it under the terms of the GNU Lesser General Public
|
yading@11
|
9 * License as published by the Free Software Foundation; either
|
yading@11
|
10 * version 2.1 of the License, or (at your option) any later version.
|
yading@11
|
11 *
|
yading@11
|
12 * FFmpeg is distributed in the hope that it will be useful,
|
yading@11
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@11
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@11
|
15 * Lesser General Public License for more details.
|
yading@11
|
16 *
|
yading@11
|
17 * You should have received a copy of the GNU Lesser General Public
|
yading@11
|
18 * License along with FFmpeg; if not, write to the Free Software
|
yading@11
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@11
|
20 */
|
yading@11
|
21
|
yading@11
|
22 /* #define DEBUG */
|
yading@11
|
23
|
yading@11
|
24 #include "avformat.h"
|
yading@11
|
25 #include "avio_internal.h"
|
yading@11
|
26 #include "internal.h"
|
yading@11
|
27 #include "libavcodec/internal.h"
|
yading@11
|
28 #include "libavcodec/raw.h"
|
yading@11
|
29 #include "libavcodec/bytestream.h"
|
yading@11
|
30 #include "libavutil/avassert.h"
|
yading@11
|
31 #include "libavutil/opt.h"
|
yading@11
|
32 #include "libavutil/dict.h"
|
yading@11
|
33 #include "libavutil/pixdesc.h"
|
yading@11
|
34 #include "metadata.h"
|
yading@11
|
35 #include "id3v2.h"
|
yading@11
|
36 #include "libavutil/avassert.h"
|
yading@11
|
37 #include "libavutil/avstring.h"
|
yading@11
|
38 #include "libavutil/mathematics.h"
|
yading@11
|
39 #include "libavutil/parseutils.h"
|
yading@11
|
40 #include "libavutil/time.h"
|
yading@11
|
41 #include "libavutil/timestamp.h"
|
yading@11
|
42 #include "riff.h"
|
yading@11
|
43 #include "audiointerleave.h"
|
yading@11
|
44 #include "url.h"
|
yading@11
|
45 #include <stdarg.h>
|
yading@11
|
46 #if CONFIG_NETWORK
|
yading@11
|
47 #include "network.h"
|
yading@11
|
48 #endif
|
yading@11
|
49
|
yading@11
|
50 #undef NDEBUG
|
yading@11
|
51 #include <assert.h>
|
yading@11
|
52
|
yading@11
|
53 /**
|
yading@11
|
54 * @file
|
yading@11
|
55 * various utility functions for use within FFmpeg
|
yading@11
|
56 */
|
yading@11
|
57
|
yading@11
|
58 unsigned avformat_version(void)
|
yading@11
|
59 {
|
yading@11
|
60 av_assert0(LIBAVFORMAT_VERSION_MICRO >= 100);
|
yading@11
|
61 return LIBAVFORMAT_VERSION_INT;
|
yading@11
|
62 }
|
yading@11
|
63
|
yading@11
|
64 const char *avformat_configuration(void)
|
yading@11
|
65 {
|
yading@11
|
66 return FFMPEG_CONFIGURATION;
|
yading@11
|
67 }
|
yading@11
|
68
|
yading@11
|
69 const char *avformat_license(void)
|
yading@11
|
70 {
|
yading@11
|
71 #define LICENSE_PREFIX "libavformat license: "
|
yading@11
|
72 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
|
yading@11
|
73 }
|
yading@11
|
74
|
yading@11
|
75 #define RELATIVE_TS_BASE (INT64_MAX - (1LL<<48))
|
yading@11
|
76
|
yading@11
|
77 static int is_relative(int64_t ts) {
|
yading@11
|
78 return ts > (RELATIVE_TS_BASE - (1LL<<48));
|
yading@11
|
79 }
|
yading@11
|
80
|
yading@11
|
81 /**
|
yading@11
|
82 * Wrap a given time stamp, if there is an indication for an overflow
|
yading@11
|
83 *
|
yading@11
|
84 * @param st stream
|
yading@11
|
85 * @param timestamp the time stamp to wrap
|
yading@11
|
86 * @return resulting time stamp
|
yading@11
|
87 */
|
yading@11
|
88 static int64_t wrap_timestamp(AVStream *st, int64_t timestamp)
|
yading@11
|
89 {
|
yading@11
|
90 if (st->pts_wrap_behavior != AV_PTS_WRAP_IGNORE &&
|
yading@11
|
91 st->pts_wrap_reference != AV_NOPTS_VALUE && timestamp != AV_NOPTS_VALUE) {
|
yading@11
|
92 if (st->pts_wrap_behavior == AV_PTS_WRAP_ADD_OFFSET &&
|
yading@11
|
93 timestamp < st->pts_wrap_reference)
|
yading@11
|
94 return timestamp + (1ULL<<st->pts_wrap_bits);
|
yading@11
|
95 else if (st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET &&
|
yading@11
|
96 timestamp >= st->pts_wrap_reference)
|
yading@11
|
97 return timestamp - (1ULL<<st->pts_wrap_bits);
|
yading@11
|
98 }
|
yading@11
|
99 return timestamp;
|
yading@11
|
100 }
|
yading@11
|
101
|
yading@11
|
102 #define MAKE_ACCESSORS(str, name, type, field) \
|
yading@11
|
103 type av_##name##_get_##field(const str *s) { return s->field; } \
|
yading@11
|
104 void av_##name##_set_##field(str *s, type v) { s->field = v; }
|
yading@11
|
105
|
yading@11
|
106 MAKE_ACCESSORS(AVStream, stream, AVRational, r_frame_rate)
|
yading@11
|
107
|
yading@11
|
108 /** head of registered input format linked list */
|
yading@11
|
109 static AVInputFormat *first_iformat = NULL;
|
yading@11
|
110 /** head of registered output format linked list */
|
yading@11
|
111 static AVOutputFormat *first_oformat = NULL;
|
yading@11
|
112
|
yading@11
|
113 AVInputFormat *av_iformat_next(AVInputFormat *f)
|
yading@11
|
114 {
|
yading@11
|
115 if(f) return f->next;
|
yading@11
|
116 else return first_iformat;
|
yading@11
|
117 }
|
yading@11
|
118
|
yading@11
|
119 AVOutputFormat *av_oformat_next(AVOutputFormat *f)
|
yading@11
|
120 {
|
yading@11
|
121 if(f) return f->next;
|
yading@11
|
122 else return first_oformat;
|
yading@11
|
123 }
|
yading@11
|
124
|
yading@11
|
125 void av_register_input_format(AVInputFormat *format)
|
yading@11
|
126 {
|
yading@11
|
127 AVInputFormat **p;
|
yading@11
|
128 p = &first_iformat;
|
yading@11
|
129 while (*p != NULL) p = &(*p)->next;
|
yading@11
|
130 *p = format;
|
yading@11
|
131 format->next = NULL;
|
yading@11
|
132 }
|
yading@11
|
133
|
yading@11
|
134 void av_register_output_format(AVOutputFormat *format)
|
yading@11
|
135 {
|
yading@11
|
136 AVOutputFormat **p;
|
yading@11
|
137 p = &first_oformat;
|
yading@11
|
138 while (*p != NULL) p = &(*p)->next;
|
yading@11
|
139 *p = format;
|
yading@11
|
140 format->next = NULL;
|
yading@11
|
141 }
|
yading@11
|
142
|
yading@11
|
143 int av_match_ext(const char *filename, const char *extensions)
|
yading@11
|
144 {
|
yading@11
|
145 const char *ext, *p;
|
yading@11
|
146 char ext1[32], *q;
|
yading@11
|
147
|
yading@11
|
148 if(!filename)
|
yading@11
|
149 return 0;
|
yading@11
|
150
|
yading@11
|
151 ext = strrchr(filename, '.');
|
yading@11
|
152 if (ext) {
|
yading@11
|
153 ext++;
|
yading@11
|
154 p = extensions;
|
yading@11
|
155 for(;;) {
|
yading@11
|
156 q = ext1;
|
yading@11
|
157 while (*p != '\0' && *p != ',' && q-ext1<sizeof(ext1)-1)
|
yading@11
|
158 *q++ = *p++;
|
yading@11
|
159 *q = '\0';
|
yading@11
|
160 if (!av_strcasecmp(ext1, ext))
|
yading@11
|
161 return 1;
|
yading@11
|
162 if (*p == '\0')
|
yading@11
|
163 break;
|
yading@11
|
164 p++;
|
yading@11
|
165 }
|
yading@11
|
166 }
|
yading@11
|
167 return 0;
|
yading@11
|
168 }
|
yading@11
|
169
|
yading@11
|
170 static int match_format(const char *name, const char *names)
|
yading@11
|
171 {
|
yading@11
|
172 const char *p;
|
yading@11
|
173 int len, namelen;
|
yading@11
|
174
|
yading@11
|
175 if (!name || !names)
|
yading@11
|
176 return 0;
|
yading@11
|
177
|
yading@11
|
178 namelen = strlen(name);
|
yading@11
|
179 while ((p = strchr(names, ','))) {
|
yading@11
|
180 len = FFMAX(p - names, namelen);
|
yading@11
|
181 if (!av_strncasecmp(name, names, len))
|
yading@11
|
182 return 1;
|
yading@11
|
183 names = p+1;
|
yading@11
|
184 }
|
yading@11
|
185 return !av_strcasecmp(name, names);
|
yading@11
|
186 }
|
yading@11
|
187
|
yading@11
|
188 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
|
yading@11
|
189 const char *mime_type)
|
yading@11
|
190 {
|
yading@11
|
191 AVOutputFormat *fmt = NULL, *fmt_found;
|
yading@11
|
192 int score_max, score;
|
yading@11
|
193
|
yading@11
|
194 /* specific test for image sequences */
|
yading@11
|
195 #if CONFIG_IMAGE2_MUXER
|
yading@11
|
196 if (!short_name && filename &&
|
yading@11
|
197 av_filename_number_test(filename) &&
|
yading@11
|
198 ff_guess_image2_codec(filename) != AV_CODEC_ID_NONE) {
|
yading@11
|
199 return av_guess_format("image2", NULL, NULL);
|
yading@11
|
200 }
|
yading@11
|
201 #endif
|
yading@11
|
202 /* Find the proper file type. */
|
yading@11
|
203 fmt_found = NULL;
|
yading@11
|
204 score_max = 0;
|
yading@11
|
205 while ((fmt = av_oformat_next(fmt))) {
|
yading@11
|
206 score = 0;
|
yading@11
|
207 if (fmt->name && short_name && match_format(short_name, fmt->name))
|
yading@11
|
208 score += 100;
|
yading@11
|
209 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
|
yading@11
|
210 score += 10;
|
yading@11
|
211 if (filename && fmt->extensions &&
|
yading@11
|
212 av_match_ext(filename, fmt->extensions)) {
|
yading@11
|
213 score += 5;
|
yading@11
|
214 }
|
yading@11
|
215 if (score > score_max) {
|
yading@11
|
216 score_max = score;
|
yading@11
|
217 fmt_found = fmt;
|
yading@11
|
218 }
|
yading@11
|
219 }
|
yading@11
|
220 return fmt_found;
|
yading@11
|
221 }
|
yading@11
|
222
|
yading@11
|
223 enum AVCodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
|
yading@11
|
224 const char *filename, const char *mime_type, enum AVMediaType type){
|
yading@11
|
225 if (!strcmp(fmt->name, "segment") || !strcmp(fmt->name, "ssegment")) {
|
yading@11
|
226 fmt = av_guess_format(NULL, filename, NULL);
|
yading@11
|
227 }
|
yading@11
|
228
|
yading@11
|
229 if(type == AVMEDIA_TYPE_VIDEO){
|
yading@11
|
230 enum AVCodecID codec_id= AV_CODEC_ID_NONE;
|
yading@11
|
231
|
yading@11
|
232 #if CONFIG_IMAGE2_MUXER
|
yading@11
|
233 if(!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")){
|
yading@11
|
234 codec_id= ff_guess_image2_codec(filename);
|
yading@11
|
235 }
|
yading@11
|
236 #endif
|
yading@11
|
237 if(codec_id == AV_CODEC_ID_NONE)
|
yading@11
|
238 codec_id= fmt->video_codec;
|
yading@11
|
239 return codec_id;
|
yading@11
|
240 }else if(type == AVMEDIA_TYPE_AUDIO)
|
yading@11
|
241 return fmt->audio_codec;
|
yading@11
|
242 else if (type == AVMEDIA_TYPE_SUBTITLE)
|
yading@11
|
243 return fmt->subtitle_codec;
|
yading@11
|
244 else
|
yading@11
|
245 return AV_CODEC_ID_NONE;
|
yading@11
|
246 }
|
yading@11
|
247
|
yading@11
|
248 AVInputFormat *av_find_input_format(const char *short_name)
|
yading@11
|
249 {
|
yading@11
|
250 AVInputFormat *fmt = NULL;
|
yading@11
|
251 while ((fmt = av_iformat_next(fmt))) {
|
yading@11
|
252 if (match_format(short_name, fmt->name))
|
yading@11
|
253 return fmt;
|
yading@11
|
254 }
|
yading@11
|
255 return NULL;
|
yading@11
|
256 }
|
yading@11
|
257
|
yading@11
|
258 /* an arbitrarily chosen "sane" max packet size -- 50M */
|
yading@11
|
259 #define SANE_CHUNK_SIZE (50000000)
|
yading@11
|
260
|
yading@11
|
261 int ffio_limit(AVIOContext *s, int size)
|
yading@11
|
262 {
|
yading@11
|
263 if(s->maxsize>=0){
|
yading@11
|
264 int64_t remaining= s->maxsize - avio_tell(s);
|
yading@11
|
265 if(remaining < size){
|
yading@11
|
266 int64_t newsize= avio_size(s);
|
yading@11
|
267 if(!s->maxsize || s->maxsize<newsize)
|
yading@11
|
268 s->maxsize= newsize - !newsize;
|
yading@11
|
269 remaining= s->maxsize - avio_tell(s);
|
yading@11
|
270 remaining= FFMAX(remaining, 0);
|
yading@11
|
271 }
|
yading@11
|
272
|
yading@11
|
273 if(s->maxsize>=0 && remaining+1 < size){
|
yading@11
|
274 av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG, "Truncating packet of size %d to %"PRId64"\n", size, remaining+1);
|
yading@11
|
275 size= remaining+1;
|
yading@11
|
276 }
|
yading@11
|
277 }
|
yading@11
|
278 return size;
|
yading@11
|
279 }
|
yading@11
|
280
|
yading@11
|
281 /*
|
yading@11
|
282 * Read the data in sane-sized chunks and append to pkt.
|
yading@11
|
283 * Return the number of bytes read or an error.
|
yading@11
|
284 */
|
yading@11
|
285 static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size)
|
yading@11
|
286 {
|
yading@11
|
287 int orig_pos = pkt->pos; // av_grow_packet might reset pos
|
yading@11
|
288 int orig_size = pkt->size;
|
yading@11
|
289 int ret;
|
yading@11
|
290
|
yading@11
|
291 do {
|
yading@11
|
292 int prev_size = pkt->size;
|
yading@11
|
293 int read_size;
|
yading@11
|
294
|
yading@11
|
295 /*
|
yading@11
|
296 * When the caller requests a lot of data, limit it to the amount left
|
yading@11
|
297 * in file or SANE_CHUNK_SIZE when it is not known
|
yading@11
|
298 */
|
yading@11
|
299 read_size = size;
|
yading@11
|
300 if (read_size > SANE_CHUNK_SIZE/10) {
|
yading@11
|
301 read_size = ffio_limit(s, read_size);
|
yading@11
|
302 // If filesize/maxsize is unknown, limit to SANE_CHUNK_SIZE
|
yading@11
|
303 if (s->maxsize < 0)
|
yading@11
|
304 read_size = FFMIN(read_size, SANE_CHUNK_SIZE);
|
yading@11
|
305 }
|
yading@11
|
306
|
yading@11
|
307 ret = av_grow_packet(pkt, read_size);
|
yading@11
|
308 if (ret < 0)
|
yading@11
|
309 break;
|
yading@11
|
310
|
yading@11
|
311 ret = avio_read(s, pkt->data + prev_size, read_size);
|
yading@11
|
312 if (ret != read_size) {
|
yading@11
|
313 av_shrink_packet(pkt, prev_size + FFMAX(ret, 0));
|
yading@11
|
314 break;
|
yading@11
|
315 }
|
yading@11
|
316
|
yading@11
|
317 size -= read_size;
|
yading@11
|
318 } while (size > 0);
|
yading@11
|
319 if (size > 0)
|
yading@11
|
320 pkt->flags |= AV_PKT_FLAG_CORRUPT;
|
yading@11
|
321
|
yading@11
|
322 pkt->pos = orig_pos;
|
yading@11
|
323 if (!pkt->size)
|
yading@11
|
324 av_free_packet(pkt);
|
yading@11
|
325 return pkt->size > orig_size ? pkt->size - orig_size : ret;
|
yading@11
|
326 }
|
yading@11
|
327
|
yading@11
|
328 int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
|
yading@11
|
329 {
|
yading@11
|
330 av_init_packet(pkt);
|
yading@11
|
331 pkt->data = NULL;
|
yading@11
|
332 pkt->size = 0;
|
yading@11
|
333 pkt->pos = avio_tell(s);
|
yading@11
|
334
|
yading@11
|
335 return append_packet_chunked(s, pkt, size);
|
yading@11
|
336 }
|
yading@11
|
337
|
yading@11
|
338 int av_append_packet(AVIOContext *s, AVPacket *pkt, int size)
|
yading@11
|
339 {
|
yading@11
|
340 if (!pkt->size)
|
yading@11
|
341 return av_get_packet(s, pkt, size);
|
yading@11
|
342 return append_packet_chunked(s, pkt, size);
|
yading@11
|
343 }
|
yading@11
|
344
|
yading@11
|
345
|
yading@11
|
346 int av_filename_number_test(const char *filename)
|
yading@11
|
347 {
|
yading@11
|
348 char buf[1024];
|
yading@11
|
349 return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
|
yading@11
|
350 }
|
yading@11
|
351
|
yading@11
|
352 AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret)
|
yading@11
|
353 {
|
yading@11
|
354 AVProbeData lpd = *pd;
|
yading@11
|
355 AVInputFormat *fmt1 = NULL, *fmt;
|
yading@11
|
356 int score, nodat = 0, score_max=0;
|
yading@11
|
357 const static uint8_t zerobuffer[AVPROBE_PADDING_SIZE];
|
yading@11
|
358
|
yading@11
|
359 if (!lpd.buf)
|
yading@11
|
360 lpd.buf = zerobuffer;
|
yading@11
|
361
|
yading@11
|
362 if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
|
yading@11
|
363 int id3len = ff_id3v2_tag_len(lpd.buf);
|
yading@11
|
364 if (lpd.buf_size > id3len + 16) {
|
yading@11
|
365 lpd.buf += id3len;
|
yading@11
|
366 lpd.buf_size -= id3len;
|
yading@11
|
367 }else
|
yading@11
|
368 nodat = 1;
|
yading@11
|
369 }
|
yading@11
|
370
|
yading@11
|
371 fmt = NULL;
|
yading@11
|
372 while ((fmt1 = av_iformat_next(fmt1))) {
|
yading@11
|
373 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE))
|
yading@11
|
374 continue;
|
yading@11
|
375 score = 0;
|
yading@11
|
376 if (fmt1->read_probe) {
|
yading@11
|
377 score = fmt1->read_probe(&lpd);
|
yading@11
|
378 if(fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
|
yading@11
|
379 score = FFMAX(score, nodat ? AVPROBE_SCORE_MAX/4-1 : 1);
|
yading@11
|
380 } else if (fmt1->extensions) {
|
yading@11
|
381 if (av_match_ext(lpd.filename, fmt1->extensions)) {
|
yading@11
|
382 score = 50;
|
yading@11
|
383 }
|
yading@11
|
384 }
|
yading@11
|
385 if (score > score_max) {
|
yading@11
|
386 score_max = score;
|
yading@11
|
387 fmt = fmt1;
|
yading@11
|
388 }else if (score == score_max)
|
yading@11
|
389 fmt = NULL;
|
yading@11
|
390 }
|
yading@11
|
391 if(nodat)
|
yading@11
|
392 score_max = FFMIN(AVPROBE_SCORE_MAX/4-1, score_max);
|
yading@11
|
393 *score_ret= score_max;
|
yading@11
|
394
|
yading@11
|
395 return fmt;
|
yading@11
|
396 }
|
yading@11
|
397
|
yading@11
|
398 AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
|
yading@11
|
399 {
|
yading@11
|
400 int score_ret;
|
yading@11
|
401 AVInputFormat *fmt= av_probe_input_format3(pd, is_opened, &score_ret);
|
yading@11
|
402 if(score_ret > *score_max){
|
yading@11
|
403 *score_max= score_ret;
|
yading@11
|
404 return fmt;
|
yading@11
|
405 }else
|
yading@11
|
406 return NULL;
|
yading@11
|
407 }
|
yading@11
|
408
|
yading@11
|
409 AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
|
yading@11
|
410 int score=0;
|
yading@11
|
411 return av_probe_input_format2(pd, is_opened, &score);
|
yading@11
|
412 }
|
yading@11
|
413
|
yading@11
|
414 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd)
|
yading@11
|
415 {
|
yading@11
|
416 static const struct {
|
yading@11
|
417 const char *name; enum AVCodecID id; enum AVMediaType type;
|
yading@11
|
418 } fmt_id_type[] = {
|
yading@11
|
419 { "aac" , AV_CODEC_ID_AAC , AVMEDIA_TYPE_AUDIO },
|
yading@11
|
420 { "ac3" , AV_CODEC_ID_AC3 , AVMEDIA_TYPE_AUDIO },
|
yading@11
|
421 { "dts" , AV_CODEC_ID_DTS , AVMEDIA_TYPE_AUDIO },
|
yading@11
|
422 { "eac3" , AV_CODEC_ID_EAC3 , AVMEDIA_TYPE_AUDIO },
|
yading@11
|
423 { "h264" , AV_CODEC_ID_H264 , AVMEDIA_TYPE_VIDEO },
|
yading@11
|
424 { "loas" , AV_CODEC_ID_AAC_LATM , AVMEDIA_TYPE_AUDIO },
|
yading@11
|
425 { "m4v" , AV_CODEC_ID_MPEG4 , AVMEDIA_TYPE_VIDEO },
|
yading@11
|
426 { "mp3" , AV_CODEC_ID_MP3 , AVMEDIA_TYPE_AUDIO },
|
yading@11
|
427 { "mpegvideo", AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
|
yading@11
|
428 { 0 }
|
yading@11
|
429 };
|
yading@11
|
430 int score;
|
yading@11
|
431 AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
|
yading@11
|
432
|
yading@11
|
433 if (fmt && st->request_probe <= score) {
|
yading@11
|
434 int i;
|
yading@11
|
435 av_log(s, AV_LOG_DEBUG, "Probe with size=%d, packets=%d detected %s with score=%d\n",
|
yading@11
|
436 pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets, fmt->name, score);
|
yading@11
|
437 for (i = 0; fmt_id_type[i].name; i++) {
|
yading@11
|
438 if (!strcmp(fmt->name, fmt_id_type[i].name)) {
|
yading@11
|
439 st->codec->codec_id = fmt_id_type[i].id;
|
yading@11
|
440 st->codec->codec_type = fmt_id_type[i].type;
|
yading@11
|
441 break;
|
yading@11
|
442 }
|
yading@11
|
443 }
|
yading@11
|
444 }
|
yading@11
|
445 return score;
|
yading@11
|
446 }
|
yading@11
|
447
|
yading@11
|
448 /************************************************************/
|
yading@11
|
449 /* input media file */
|
yading@11
|
450
|
yading@11
|
451 int av_demuxer_open(AVFormatContext *ic){
|
yading@11
|
452 int err;
|
yading@11
|
453
|
yading@11
|
454 if (ic->iformat->read_header) {
|
yading@11
|
455 err = ic->iformat->read_header(ic);
|
yading@11
|
456 if (err < 0)
|
yading@11
|
457 return err;
|
yading@11
|
458 }
|
yading@11
|
459
|
yading@11
|
460 if (ic->pb && !ic->data_offset)
|
yading@11
|
461 ic->data_offset = avio_tell(ic->pb);
|
yading@11
|
462
|
yading@11
|
463 return 0;
|
yading@11
|
464 }
|
yading@11
|
465
|
yading@11
|
466
|
yading@11
|
467 /** size of probe buffer, for guessing file type from file contents */
|
yading@11
|
468 #define PROBE_BUF_MIN 2048
|
yading@11
|
469 #define PROBE_BUF_MAX (1<<20)
|
yading@11
|
470
|
yading@11
|
471 int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
|
yading@11
|
472 const char *filename, void *logctx,
|
yading@11
|
473 unsigned int offset, unsigned int max_probe_size)
|
yading@11
|
474 {
|
yading@11
|
475 AVProbeData pd = { filename ? filename : "", NULL, -offset };
|
yading@11
|
476 unsigned char *buf = NULL;
|
yading@11
|
477 uint8_t *mime_type;
|
yading@11
|
478 int ret = 0, probe_size, buf_offset = 0;
|
yading@11
|
479
|
yading@11
|
480 if (!max_probe_size) {
|
yading@11
|
481 max_probe_size = PROBE_BUF_MAX;
|
yading@11
|
482 } else if (max_probe_size > PROBE_BUF_MAX) {
|
yading@11
|
483 max_probe_size = PROBE_BUF_MAX;
|
yading@11
|
484 } else if (max_probe_size < PROBE_BUF_MIN) {
|
yading@11
|
485 av_log(logctx, AV_LOG_ERROR,
|
yading@11
|
486 "Specified probe size value %u cannot be < %u\n", max_probe_size, PROBE_BUF_MIN);
|
yading@11
|
487 return AVERROR(EINVAL);
|
yading@11
|
488 }
|
yading@11
|
489
|
yading@11
|
490 if (offset >= max_probe_size) {
|
yading@11
|
491 return AVERROR(EINVAL);
|
yading@11
|
492 }
|
yading@11
|
493
|
yading@11
|
494 if (!*fmt && pb->av_class && av_opt_get(pb, "mime_type", AV_OPT_SEARCH_CHILDREN, &mime_type) >= 0 && mime_type) {
|
yading@11
|
495 if (!av_strcasecmp(mime_type, "audio/aacp")) {
|
yading@11
|
496 *fmt = av_find_input_format("aac");
|
yading@11
|
497 }
|
yading@11
|
498 av_freep(&mime_type);
|
yading@11
|
499 }
|
yading@11
|
500
|
yading@11
|
501 for(probe_size= PROBE_BUF_MIN; probe_size<=max_probe_size && !*fmt;
|
yading@11
|
502 probe_size = FFMIN(probe_size<<1, FFMAX(max_probe_size, probe_size+1))) {
|
yading@11
|
503 int score = probe_size < max_probe_size ? AVPROBE_SCORE_RETRY : 0;
|
yading@11
|
504 void *buftmp;
|
yading@11
|
505
|
yading@11
|
506 if (probe_size < offset) {
|
yading@11
|
507 continue;
|
yading@11
|
508 }
|
yading@11
|
509
|
yading@11
|
510 /* read probe data */
|
yading@11
|
511 buftmp = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);
|
yading@11
|
512 if(!buftmp){
|
yading@11
|
513 av_free(buf);
|
yading@11
|
514 return AVERROR(ENOMEM);
|
yading@11
|
515 }
|
yading@11
|
516 buf=buftmp;
|
yading@11
|
517 if ((ret = avio_read(pb, buf + buf_offset, probe_size - buf_offset)) < 0) {
|
yading@11
|
518 /* fail if error was not end of file, otherwise, lower score */
|
yading@11
|
519 if (ret != AVERROR_EOF) {
|
yading@11
|
520 av_free(buf);
|
yading@11
|
521 return ret;
|
yading@11
|
522 }
|
yading@11
|
523 score = 0;
|
yading@11
|
524 ret = 0; /* error was end of file, nothing read */
|
yading@11
|
525 }
|
yading@11
|
526 pd.buf_size = buf_offset += ret;
|
yading@11
|
527 pd.buf = &buf[offset];
|
yading@11
|
528
|
yading@11
|
529 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
|
yading@11
|
530
|
yading@11
|
531 /* guess file format */
|
yading@11
|
532 *fmt = av_probe_input_format2(&pd, 1, &score);
|
yading@11
|
533 if(*fmt){
|
yading@11
|
534 if(score <= AVPROBE_SCORE_RETRY){ //this can only be true in the last iteration
|
yading@11
|
535 av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
|
yading@11
|
536 }else
|
yading@11
|
537 av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
|
yading@11
|
538 }
|
yading@11
|
539 }
|
yading@11
|
540
|
yading@11
|
541 if (!*fmt) {
|
yading@11
|
542 av_free(buf);
|
yading@11
|
543 return AVERROR_INVALIDDATA;
|
yading@11
|
544 }
|
yading@11
|
545
|
yading@11
|
546 /* rewind. reuse probe buffer to avoid seeking */
|
yading@11
|
547 ret = ffio_rewind_with_probe_data(pb, &buf, pd.buf_size);
|
yading@11
|
548
|
yading@11
|
549 return ret;
|
yading@11
|
550 }
|
yading@11
|
551
|
yading@11
|
552 /* open input file and probe the format if necessary */
|
yading@11
|
553 static int init_input(AVFormatContext *s, const char *filename, AVDictionary **options)
|
yading@11
|
554 {
|
yading@11
|
555 int ret;
|
yading@11
|
556 AVProbeData pd = {filename, NULL, 0};
|
yading@11
|
557 int score = AVPROBE_SCORE_RETRY;
|
yading@11
|
558
|
yading@11
|
559 if (s->pb) {
|
yading@11
|
560 s->flags |= AVFMT_FLAG_CUSTOM_IO;
|
yading@11
|
561 if (!s->iformat)
|
yading@11
|
562 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, s->probesize);
|
yading@11
|
563 else if (s->iformat->flags & AVFMT_NOFILE)
|
yading@11
|
564 av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
|
yading@11
|
565 "will be ignored with AVFMT_NOFILE format.\n");
|
yading@11
|
566 return 0;
|
yading@11
|
567 }
|
yading@11
|
568
|
yading@11
|
569 if ( (s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
|
yading@11
|
570 (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
|
yading@11
|
571 return 0;
|
yading@11
|
572
|
yading@11
|
573 if ((ret = avio_open2(&s->pb, filename, AVIO_FLAG_READ | s->avio_flags,
|
yading@11
|
574 &s->interrupt_callback, options)) < 0)
|
yading@11
|
575 return ret;
|
yading@11
|
576 if (s->iformat)
|
yading@11
|
577 return 0;
|
yading@11
|
578 return av_probe_input_buffer(s->pb, &s->iformat, filename, s, 0, s->probesize);
|
yading@11
|
579 }
|
yading@11
|
580
|
yading@11
|
581 static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
|
yading@11
|
582 AVPacketList **plast_pktl){
|
yading@11
|
583 AVPacketList *pktl = av_mallocz(sizeof(AVPacketList));
|
yading@11
|
584 if (!pktl)
|
yading@11
|
585 return NULL;
|
yading@11
|
586
|
yading@11
|
587 if (*packet_buffer)
|
yading@11
|
588 (*plast_pktl)->next = pktl;
|
yading@11
|
589 else
|
yading@11
|
590 *packet_buffer = pktl;
|
yading@11
|
591
|
yading@11
|
592 /* add the packet in the buffered packet list */
|
yading@11
|
593 *plast_pktl = pktl;
|
yading@11
|
594 pktl->pkt= *pkt;
|
yading@11
|
595 return &pktl->pkt;
|
yading@11
|
596 }
|
yading@11
|
597
|
yading@11
|
598 int avformat_queue_attached_pictures(AVFormatContext *s)
|
yading@11
|
599 {
|
yading@11
|
600 int i;
|
yading@11
|
601 for (i = 0; i < s->nb_streams; i++)
|
yading@11
|
602 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
|
yading@11
|
603 s->streams[i]->discard < AVDISCARD_ALL) {
|
yading@11
|
604 AVPacket copy = s->streams[i]->attached_pic;
|
yading@11
|
605 copy.buf = av_buffer_ref(copy.buf);
|
yading@11
|
606 if (!copy.buf)
|
yading@11
|
607 return AVERROR(ENOMEM);
|
yading@11
|
608
|
yading@11
|
609 add_to_pktbuf(&s->raw_packet_buffer, ©, &s->raw_packet_buffer_end);
|
yading@11
|
610 }
|
yading@11
|
611 return 0;
|
yading@11
|
612 }
|
yading@11
|
613
|
yading@11
|
614 int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
|
yading@11
|
615 {
|
yading@11
|
616 AVFormatContext *s = *ps;
|
yading@11
|
617 int ret = 0;
|
yading@11
|
618 AVDictionary *tmp = NULL;
|
yading@11
|
619 ID3v2ExtraMeta *id3v2_extra_meta = NULL;
|
yading@11
|
620
|
yading@11
|
621 if (!s && !(s = avformat_alloc_context()))
|
yading@11
|
622 return AVERROR(ENOMEM);
|
yading@11
|
623 if (!s->av_class){
|
yading@11
|
624 av_log(NULL, AV_LOG_ERROR, "Input context has not been properly allocated by avformat_alloc_context() and is not NULL either\n");
|
yading@11
|
625 return AVERROR(EINVAL);
|
yading@11
|
626 }
|
yading@11
|
627 if (fmt)
|
yading@11
|
628 s->iformat = fmt;
|
yading@11
|
629
|
yading@11
|
630 if (options)
|
yading@11
|
631 av_dict_copy(&tmp, *options, 0);
|
yading@11
|
632
|
yading@11
|
633 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
|
yading@11
|
634 goto fail;
|
yading@11
|
635
|
yading@11
|
636 if ((ret = init_input(s, filename, &tmp)) < 0)
|
yading@11
|
637 goto fail;
|
yading@11
|
638 avio_skip(s->pb, s->skip_initial_bytes);
|
yading@11
|
639
|
yading@11
|
640 /* check filename in case an image number is expected */
|
yading@11
|
641 if (s->iformat->flags & AVFMT_NEEDNUMBER) {
|
yading@11
|
642 if (!av_filename_number_test(filename)) {
|
yading@11
|
643 ret = AVERROR(EINVAL);
|
yading@11
|
644 goto fail;
|
yading@11
|
645 }
|
yading@11
|
646 }
|
yading@11
|
647
|
yading@11
|
648 s->duration = s->start_time = AV_NOPTS_VALUE;
|
yading@11
|
649 av_strlcpy(s->filename, filename ? filename : "", sizeof(s->filename));
|
yading@11
|
650
|
yading@11
|
651 /* allocate private data */
|
yading@11
|
652 if (s->iformat->priv_data_size > 0) {
|
yading@11
|
653 if (!(s->priv_data = av_mallocz(s->iformat->priv_data_size))) {
|
yading@11
|
654 ret = AVERROR(ENOMEM);
|
yading@11
|
655 goto fail;
|
yading@11
|
656 }
|
yading@11
|
657 if (s->iformat->priv_class) {
|
yading@11
|
658 *(const AVClass**)s->priv_data = s->iformat->priv_class;
|
yading@11
|
659 av_opt_set_defaults(s->priv_data);
|
yading@11
|
660 if ((ret = av_opt_set_dict(s->priv_data, &tmp)) < 0)
|
yading@11
|
661 goto fail;
|
yading@11
|
662 }
|
yading@11
|
663 }
|
yading@11
|
664
|
yading@11
|
665 /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
|
yading@11
|
666 if (s->pb)
|
yading@11
|
667 ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
|
yading@11
|
668
|
yading@11
|
669 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
|
yading@11
|
670 if ((ret = s->iformat->read_header(s)) < 0)
|
yading@11
|
671 goto fail;
|
yading@11
|
672
|
yading@11
|
673 if (id3v2_extra_meta) {
|
yading@11
|
674 if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac")) {
|
yading@11
|
675 if((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
|
yading@11
|
676 goto fail;
|
yading@11
|
677 } else
|
yading@11
|
678 av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
|
yading@11
|
679 }
|
yading@11
|
680 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
|
yading@11
|
681
|
yading@11
|
682 if ((ret = avformat_queue_attached_pictures(s)) < 0)
|
yading@11
|
683 goto fail;
|
yading@11
|
684
|
yading@11
|
685 if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
|
yading@11
|
686 s->data_offset = avio_tell(s->pb);
|
yading@11
|
687
|
yading@11
|
688 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
|
yading@11
|
689
|
yading@11
|
690 if (options) {
|
yading@11
|
691 av_dict_free(options);
|
yading@11
|
692 *options = tmp;
|
yading@11
|
693 }
|
yading@11
|
694 *ps = s;
|
yading@11
|
695 return 0;
|
yading@11
|
696
|
yading@11
|
697 fail:
|
yading@11
|
698 ff_id3v2_free_extra_meta(&id3v2_extra_meta);
|
yading@11
|
699 av_dict_free(&tmp);
|
yading@11
|
700 if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
|
yading@11
|
701 avio_close(s->pb);
|
yading@11
|
702 avformat_free_context(s);
|
yading@11
|
703 *ps = NULL;
|
yading@11
|
704 return ret;
|
yading@11
|
705 }
|
yading@11
|
706
|
yading@11
|
707 /*******************************************************/
|
yading@11
|
708
|
yading@11
|
709 static void force_codec_ids(AVFormatContext *s, AVStream *st)
|
yading@11
|
710 {
|
yading@11
|
711 switch(st->codec->codec_type){
|
yading@11
|
712 case AVMEDIA_TYPE_VIDEO:
|
yading@11
|
713 if(s->video_codec_id) st->codec->codec_id= s->video_codec_id;
|
yading@11
|
714 break;
|
yading@11
|
715 case AVMEDIA_TYPE_AUDIO:
|
yading@11
|
716 if(s->audio_codec_id) st->codec->codec_id= s->audio_codec_id;
|
yading@11
|
717 break;
|
yading@11
|
718 case AVMEDIA_TYPE_SUBTITLE:
|
yading@11
|
719 if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
|
yading@11
|
720 break;
|
yading@11
|
721 }
|
yading@11
|
722 }
|
yading@11
|
723
|
yading@11
|
724 static void probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
|
yading@11
|
725 {
|
yading@11
|
726 if(st->request_probe>0){
|
yading@11
|
727 AVProbeData *pd = &st->probe_data;
|
yading@11
|
728 int end;
|
yading@11
|
729 av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
|
yading@11
|
730 --st->probe_packets;
|
yading@11
|
731
|
yading@11
|
732 if (pkt) {
|
yading@11
|
733 uint8_t *new_buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
|
yading@11
|
734 if(!new_buf)
|
yading@11
|
735 goto no_packet;
|
yading@11
|
736 pd->buf = new_buf;
|
yading@11
|
737 memcpy(pd->buf+pd->buf_size, pkt->data, pkt->size);
|
yading@11
|
738 pd->buf_size += pkt->size;
|
yading@11
|
739 memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
|
yading@11
|
740 } else {
|
yading@11
|
741 no_packet:
|
yading@11
|
742 st->probe_packets = 0;
|
yading@11
|
743 if (!pd->buf_size) {
|
yading@11
|
744 av_log(s, AV_LOG_WARNING, "nothing to probe for stream %d\n",
|
yading@11
|
745 st->index);
|
yading@11
|
746 }
|
yading@11
|
747 }
|
yading@11
|
748
|
yading@11
|
749 end= s->raw_packet_buffer_remaining_size <= 0
|
yading@11
|
750 || st->probe_packets<=0;
|
yading@11
|
751
|
yading@11
|
752 if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
|
yading@11
|
753 int score= set_codec_from_probe_data(s, st, pd);
|
yading@11
|
754 if( (st->codec->codec_id != AV_CODEC_ID_NONE && score > AVPROBE_SCORE_RETRY)
|
yading@11
|
755 || end){
|
yading@11
|
756 pd->buf_size=0;
|
yading@11
|
757 av_freep(&pd->buf);
|
yading@11
|
758 st->request_probe= -1;
|
yading@11
|
759 if(st->codec->codec_id != AV_CODEC_ID_NONE){
|
yading@11
|
760 av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
|
yading@11
|
761 }else
|
yading@11
|
762 av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
|
yading@11
|
763 }
|
yading@11
|
764 force_codec_ids(s, st);
|
yading@11
|
765 }
|
yading@11
|
766 }
|
yading@11
|
767 }
|
yading@11
|
768
|
yading@11
|
769 int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
|
yading@11
|
770 {
|
yading@11
|
771 int ret, i;
|
yading@11
|
772 AVStream *st;
|
yading@11
|
773
|
yading@11
|
774 for(;;){
|
yading@11
|
775 AVPacketList *pktl = s->raw_packet_buffer;
|
yading@11
|
776
|
yading@11
|
777 if (pktl) {
|
yading@11
|
778 *pkt = pktl->pkt;
|
yading@11
|
779 st = s->streams[pkt->stream_index];
|
yading@11
|
780 if (s->raw_packet_buffer_remaining_size <= 0)
|
yading@11
|
781 probe_codec(s, st, NULL);
|
yading@11
|
782 if(st->request_probe <= 0){
|
yading@11
|
783 s->raw_packet_buffer = pktl->next;
|
yading@11
|
784 s->raw_packet_buffer_remaining_size += pkt->size;
|
yading@11
|
785 av_free(pktl);
|
yading@11
|
786 return 0;
|
yading@11
|
787 }
|
yading@11
|
788 }
|
yading@11
|
789
|
yading@11
|
790 pkt->data = NULL;
|
yading@11
|
791 pkt->size = 0;
|
yading@11
|
792 av_init_packet(pkt);
|
yading@11
|
793 ret= s->iformat->read_packet(s, pkt);
|
yading@11
|
794 if (ret < 0) {
|
yading@11
|
795 if (!pktl || ret == AVERROR(EAGAIN))
|
yading@11
|
796 return ret;
|
yading@11
|
797 for (i = 0; i < s->nb_streams; i++) {
|
yading@11
|
798 st = s->streams[i];
|
yading@11
|
799 if (st->probe_packets) {
|
yading@11
|
800 probe_codec(s, st, NULL);
|
yading@11
|
801 }
|
yading@11
|
802 av_assert0(st->request_probe <= 0);
|
yading@11
|
803 }
|
yading@11
|
804 continue;
|
yading@11
|
805 }
|
yading@11
|
806
|
yading@11
|
807 if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
|
yading@11
|
808 (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
|
yading@11
|
809 av_log(s, AV_LOG_WARNING,
|
yading@11
|
810 "Dropped corrupted packet (stream = %d)\n",
|
yading@11
|
811 pkt->stream_index);
|
yading@11
|
812 av_free_packet(pkt);
|
yading@11
|
813 continue;
|
yading@11
|
814 }
|
yading@11
|
815
|
yading@11
|
816 if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
|
yading@11
|
817 av_packet_merge_side_data(pkt);
|
yading@11
|
818
|
yading@11
|
819 if(pkt->stream_index >= (unsigned)s->nb_streams){
|
yading@11
|
820 av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
|
yading@11
|
821 continue;
|
yading@11
|
822 }
|
yading@11
|
823
|
yading@11
|
824 st= s->streams[pkt->stream_index];
|
yading@11
|
825 pkt->dts = wrap_timestamp(st, pkt->dts);
|
yading@11
|
826 pkt->pts = wrap_timestamp(st, pkt->pts);
|
yading@11
|
827
|
yading@11
|
828 force_codec_ids(s, st);
|
yading@11
|
829
|
yading@11
|
830 /* TODO: audio: time filter; video: frame reordering (pts != dts) */
|
yading@11
|
831 if (s->use_wallclock_as_timestamps)
|
yading@11
|
832 pkt->dts = pkt->pts = av_rescale_q(av_gettime(), AV_TIME_BASE_Q, st->time_base);
|
yading@11
|
833
|
yading@11
|
834 if(!pktl && st->request_probe <= 0)
|
yading@11
|
835 return ret;
|
yading@11
|
836
|
yading@11
|
837 add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
|
yading@11
|
838 s->raw_packet_buffer_remaining_size -= pkt->size;
|
yading@11
|
839
|
yading@11
|
840 probe_codec(s, st, pkt);
|
yading@11
|
841 }
|
yading@11
|
842 }
|
yading@11
|
843
|
yading@11
|
844 #if FF_API_READ_PACKET
|
yading@11
|
845 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
|
yading@11
|
846 {
|
yading@11
|
847 return ff_read_packet(s, pkt);
|
yading@11
|
848 }
|
yading@11
|
849 #endif
|
yading@11
|
850
|
yading@11
|
851
|
yading@11
|
852 /**********************************************************/
|
yading@11
|
853
|
yading@11
|
854 static int determinable_frame_size(AVCodecContext *avctx)
|
yading@11
|
855 {
|
yading@11
|
856 if (/*avctx->codec_id == AV_CODEC_ID_AAC ||*/
|
yading@11
|
857 avctx->codec_id == AV_CODEC_ID_MP1 ||
|
yading@11
|
858 avctx->codec_id == AV_CODEC_ID_MP2 ||
|
yading@11
|
859 avctx->codec_id == AV_CODEC_ID_MP3/* ||
|
yading@11
|
860 avctx->codec_id == AV_CODEC_ID_CELT*/)
|
yading@11
|
861 return 1;
|
yading@11
|
862 return 0;
|
yading@11
|
863 }
|
yading@11
|
864
|
yading@11
|
865 /**
|
yading@11
|
866 * Get the number of samples of an audio frame. Return -1 on error.
|
yading@11
|
867 */
|
yading@11
|
868 int ff_get_audio_frame_size(AVCodecContext *enc, int size, int mux)
|
yading@11
|
869 {
|
yading@11
|
870 int frame_size;
|
yading@11
|
871
|
yading@11
|
872 /* give frame_size priority if demuxing */
|
yading@11
|
873 if (!mux && enc->frame_size > 1)
|
yading@11
|
874 return enc->frame_size;
|
yading@11
|
875
|
yading@11
|
876 if ((frame_size = av_get_audio_frame_duration(enc, size)) > 0)
|
yading@11
|
877 return frame_size;
|
yading@11
|
878
|
yading@11
|
879 /* fallback to using frame_size if muxing */
|
yading@11
|
880 if (enc->frame_size > 1)
|
yading@11
|
881 return enc->frame_size;
|
yading@11
|
882
|
yading@11
|
883 //For WMA we currently have no other means to calculate duration thus we
|
yading@11
|
884 //do it here by assuming CBR, which is true for all known cases.
|
yading@11
|
885 if(!mux && enc->bit_rate>0 && size>0 && enc->sample_rate>0 && enc->block_align>1) {
|
yading@11
|
886 if (enc->codec_id == AV_CODEC_ID_WMAV1 || enc->codec_id == AV_CODEC_ID_WMAV2)
|
yading@11
|
887 return ((int64_t)size * 8 * enc->sample_rate) / enc->bit_rate;
|
yading@11
|
888 }
|
yading@11
|
889
|
yading@11
|
890 return -1;
|
yading@11
|
891 }
|
yading@11
|
892
|
yading@11
|
893
|
yading@11
|
894 /**
|
yading@11
|
895 * Return the frame duration in seconds. Return 0 if not available.
|
yading@11
|
896 */
|
yading@11
|
897 void ff_compute_frame_duration(int *pnum, int *pden, AVStream *st,
|
yading@11
|
898 AVCodecParserContext *pc, AVPacket *pkt)
|
yading@11
|
899 {
|
yading@11
|
900 int frame_size;
|
yading@11
|
901
|
yading@11
|
902 *pnum = 0;
|
yading@11
|
903 *pden = 0;
|
yading@11
|
904 switch(st->codec->codec_type) {
|
yading@11
|
905 case AVMEDIA_TYPE_VIDEO:
|
yading@11
|
906 if (st->r_frame_rate.num && !pc) {
|
yading@11
|
907 *pnum = st->r_frame_rate.den;
|
yading@11
|
908 *pden = st->r_frame_rate.num;
|
yading@11
|
909 } else if(st->time_base.num*1000LL > st->time_base.den) {
|
yading@11
|
910 *pnum = st->time_base.num;
|
yading@11
|
911 *pden = st->time_base.den;
|
yading@11
|
912 }else if(st->codec->time_base.num*1000LL > st->codec->time_base.den){
|
yading@11
|
913 *pnum = st->codec->time_base.num;
|
yading@11
|
914 *pden = st->codec->time_base.den;
|
yading@11
|
915 if (pc && pc->repeat_pict) {
|
yading@11
|
916 if (*pnum > INT_MAX / (1 + pc->repeat_pict))
|
yading@11
|
917 *pden /= 1 + pc->repeat_pict;
|
yading@11
|
918 else
|
yading@11
|
919 *pnum *= 1 + pc->repeat_pict;
|
yading@11
|
920 }
|
yading@11
|
921 //If this codec can be interlaced or progressive then we need a parser to compute duration of a packet
|
yading@11
|
922 //Thus if we have no parser in such case leave duration undefined.
|
yading@11
|
923 if(st->codec->ticks_per_frame>1 && !pc){
|
yading@11
|
924 *pnum = *pden = 0;
|
yading@11
|
925 }
|
yading@11
|
926 }
|
yading@11
|
927 break;
|
yading@11
|
928 case AVMEDIA_TYPE_AUDIO:
|
yading@11
|
929 frame_size = ff_get_audio_frame_size(st->codec, pkt->size, 0);
|
yading@11
|
930 if (frame_size <= 0 || st->codec->sample_rate <= 0)
|
yading@11
|
931 break;
|
yading@11
|
932 *pnum = frame_size;
|
yading@11
|
933 *pden = st->codec->sample_rate;
|
yading@11
|
934 break;
|
yading@11
|
935 default:
|
yading@11
|
936 break;
|
yading@11
|
937 }
|
yading@11
|
938 }
|
yading@11
|
939
|
yading@11
|
940 static int is_intra_only(AVCodecContext *enc){
|
yading@11
|
941 const AVCodecDescriptor *desc;
|
yading@11
|
942
|
yading@11
|
943 if(enc->codec_type != AVMEDIA_TYPE_VIDEO)
|
yading@11
|
944 return 1;
|
yading@11
|
945
|
yading@11
|
946 desc = av_codec_get_codec_descriptor(enc);
|
yading@11
|
947 if (!desc) {
|
yading@11
|
948 desc = avcodec_descriptor_get(enc->codec_id);
|
yading@11
|
949 av_codec_set_codec_descriptor(enc, desc);
|
yading@11
|
950 }
|
yading@11
|
951 if (desc)
|
yading@11
|
952 return !!(desc->props & AV_CODEC_PROP_INTRA_ONLY);
|
yading@11
|
953 return 0;
|
yading@11
|
954 }
|
yading@11
|
955
|
yading@11
|
956 static int has_decode_delay_been_guessed(AVStream *st)
|
yading@11
|
957 {
|
yading@11
|
958 if(st->codec->codec_id != AV_CODEC_ID_H264) return 1;
|
yading@11
|
959 if(!st->info) // if we have left find_stream_info then nb_decoded_frames wont increase anymore for stream copy
|
yading@11
|
960 return 1;
|
yading@11
|
961 #if CONFIG_H264_DECODER
|
yading@11
|
962 if(st->codec->has_b_frames &&
|
yading@11
|
963 avpriv_h264_has_num_reorder_frames(st->codec) == st->codec->has_b_frames)
|
yading@11
|
964 return 1;
|
yading@11
|
965 #endif
|
yading@11
|
966 if(st->codec->has_b_frames<3)
|
yading@11
|
967 return st->nb_decoded_frames >= 7;
|
yading@11
|
968 else if(st->codec->has_b_frames<4)
|
yading@11
|
969 return st->nb_decoded_frames >= 18;
|
yading@11
|
970 else
|
yading@11
|
971 return st->nb_decoded_frames >= 20;
|
yading@11
|
972 }
|
yading@11
|
973
|
yading@11
|
974 static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList *pktl)
|
yading@11
|
975 {
|
yading@11
|
976 if (pktl->next)
|
yading@11
|
977 return pktl->next;
|
yading@11
|
978 if (pktl == s->parse_queue_end)
|
yading@11
|
979 return s->packet_buffer;
|
yading@11
|
980 return NULL;
|
yading@11
|
981 }
|
yading@11
|
982
|
yading@11
|
983 static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index)
|
yading@11
|
984 {
|
yading@11
|
985 if (s->correct_ts_overflow && st->pts_wrap_bits < 63 &&
|
yading@11
|
986 st->pts_wrap_reference == AV_NOPTS_VALUE && st->first_dts != AV_NOPTS_VALUE) {
|
yading@11
|
987 int i;
|
yading@11
|
988
|
yading@11
|
989 // reference time stamp should be 60 s before first time stamp
|
yading@11
|
990 int64_t pts_wrap_reference = st->first_dts - av_rescale(60, st->time_base.den, st->time_base.num);
|
yading@11
|
991 // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
|
yading@11
|
992 int pts_wrap_behavior = (st->first_dts < (1LL<<st->pts_wrap_bits) - (1LL<<st->pts_wrap_bits-3)) ||
|
yading@11
|
993 (st->first_dts < (1LL<<st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num)) ?
|
yading@11
|
994 AV_PTS_WRAP_ADD_OFFSET : AV_PTS_WRAP_SUB_OFFSET;
|
yading@11
|
995
|
yading@11
|
996 AVProgram *first_program = av_find_program_from_stream(s, NULL, stream_index);
|
yading@11
|
997
|
yading@11
|
998 if (!first_program) {
|
yading@11
|
999 int default_stream_index = av_find_default_stream_index(s);
|
yading@11
|
1000 if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
|
yading@11
|
1001 for (i=0; i<s->nb_streams; i++) {
|
yading@11
|
1002 s->streams[i]->pts_wrap_reference = pts_wrap_reference;
|
yading@11
|
1003 s->streams[i]->pts_wrap_behavior = pts_wrap_behavior;
|
yading@11
|
1004 }
|
yading@11
|
1005 }
|
yading@11
|
1006 else {
|
yading@11
|
1007 st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
|
yading@11
|
1008 st->pts_wrap_behavior = s->streams[default_stream_index]->pts_wrap_behavior;
|
yading@11
|
1009 }
|
yading@11
|
1010 }
|
yading@11
|
1011 else {
|
yading@11
|
1012 AVProgram *program = first_program;
|
yading@11
|
1013 while (program) {
|
yading@11
|
1014 if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
|
yading@11
|
1015 pts_wrap_reference = program->pts_wrap_reference;
|
yading@11
|
1016 pts_wrap_behavior = program->pts_wrap_behavior;
|
yading@11
|
1017 break;
|
yading@11
|
1018 }
|
yading@11
|
1019 program = av_find_program_from_stream(s, program, stream_index);
|
yading@11
|
1020 }
|
yading@11
|
1021
|
yading@11
|
1022 // update every program with differing pts_wrap_reference
|
yading@11
|
1023 program = first_program;
|
yading@11
|
1024 while(program) {
|
yading@11
|
1025 if (program->pts_wrap_reference != pts_wrap_reference) {
|
yading@11
|
1026 for (i=0; i<program->nb_stream_indexes; i++) {
|
yading@11
|
1027 s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
|
yading@11
|
1028 s->streams[program->stream_index[i]]->pts_wrap_behavior = pts_wrap_behavior;
|
yading@11
|
1029 }
|
yading@11
|
1030
|
yading@11
|
1031 program->pts_wrap_reference = pts_wrap_reference;
|
yading@11
|
1032 program->pts_wrap_behavior = pts_wrap_behavior;
|
yading@11
|
1033 }
|
yading@11
|
1034 program = av_find_program_from_stream(s, program, stream_index);
|
yading@11
|
1035 }
|
yading@11
|
1036 }
|
yading@11
|
1037 return 1;
|
yading@11
|
1038 }
|
yading@11
|
1039 return 0;
|
yading@11
|
1040 }
|
yading@11
|
1041
|
yading@11
|
1042 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
|
yading@11
|
1043 int64_t dts, int64_t pts, AVPacket *pkt)
|
yading@11
|
1044 {
|
yading@11
|
1045 AVStream *st= s->streams[stream_index];
|
yading@11
|
1046 AVPacketList *pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
|
yading@11
|
1047 int64_t pts_buffer[MAX_REORDER_DELAY+1];
|
yading@11
|
1048 int64_t shift;
|
yading@11
|
1049 int i, delay;
|
yading@11
|
1050
|
yading@11
|
1051 if(st->first_dts != AV_NOPTS_VALUE || dts == AV_NOPTS_VALUE || st->cur_dts == AV_NOPTS_VALUE || is_relative(dts))
|
yading@11
|
1052 return;
|
yading@11
|
1053
|
yading@11
|
1054 delay = st->codec->has_b_frames;
|
yading@11
|
1055 st->first_dts= dts - (st->cur_dts - RELATIVE_TS_BASE);
|
yading@11
|
1056 st->cur_dts= dts;
|
yading@11
|
1057 shift = st->first_dts - RELATIVE_TS_BASE;
|
yading@11
|
1058
|
yading@11
|
1059 for (i=0; i<MAX_REORDER_DELAY+1; i++)
|
yading@11
|
1060 pts_buffer[i] = AV_NOPTS_VALUE;
|
yading@11
|
1061
|
yading@11
|
1062 if (is_relative(pts))
|
yading@11
|
1063 pts += shift;
|
yading@11
|
1064
|
yading@11
|
1065 for(; pktl; pktl= get_next_pkt(s, st, pktl)){
|
yading@11
|
1066 if(pktl->pkt.stream_index != stream_index)
|
yading@11
|
1067 continue;
|
yading@11
|
1068 if(is_relative(pktl->pkt.pts))
|
yading@11
|
1069 pktl->pkt.pts += shift;
|
yading@11
|
1070
|
yading@11
|
1071 if(is_relative(pktl->pkt.dts))
|
yading@11
|
1072 pktl->pkt.dts += shift;
|
yading@11
|
1073
|
yading@11
|
1074 if(st->start_time == AV_NOPTS_VALUE && pktl->pkt.pts != AV_NOPTS_VALUE)
|
yading@11
|
1075 st->start_time= pktl->pkt.pts;
|
yading@11
|
1076
|
yading@11
|
1077 if(pktl->pkt.pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)){
|
yading@11
|
1078 pts_buffer[0]= pktl->pkt.pts;
|
yading@11
|
1079 for(i=0; i<delay && pts_buffer[i] > pts_buffer[i+1]; i++)
|
yading@11
|
1080 FFSWAP(int64_t, pts_buffer[i], pts_buffer[i+1]);
|
yading@11
|
1081 if(pktl->pkt.dts == AV_NOPTS_VALUE)
|
yading@11
|
1082 pktl->pkt.dts= pts_buffer[0];
|
yading@11
|
1083 }
|
yading@11
|
1084 }
|
yading@11
|
1085
|
yading@11
|
1086 if (update_wrap_reference(s, st, stream_index) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
|
yading@11
|
1087 // correct first time stamps to negative values
|
yading@11
|
1088 st->first_dts = wrap_timestamp(st, st->first_dts);
|
yading@11
|
1089 st->cur_dts = wrap_timestamp(st, st->cur_dts);
|
yading@11
|
1090 pkt->dts = wrap_timestamp(st, pkt->dts);
|
yading@11
|
1091 pkt->pts = wrap_timestamp(st, pkt->pts);
|
yading@11
|
1092 pts = wrap_timestamp(st, pts);
|
yading@11
|
1093 }
|
yading@11
|
1094
|
yading@11
|
1095 if (st->start_time == AV_NOPTS_VALUE)
|
yading@11
|
1096 st->start_time = pts;
|
yading@11
|
1097 }
|
yading@11
|
1098
|
yading@11
|
1099 static void update_initial_durations(AVFormatContext *s, AVStream *st,
|
yading@11
|
1100 int stream_index, int duration)
|
yading@11
|
1101 {
|
yading@11
|
1102 AVPacketList *pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
|
yading@11
|
1103 int64_t cur_dts= RELATIVE_TS_BASE;
|
yading@11
|
1104
|
yading@11
|
1105 if(st->first_dts != AV_NOPTS_VALUE){
|
yading@11
|
1106 cur_dts= st->first_dts;
|
yading@11
|
1107 for(; pktl; pktl= get_next_pkt(s, st, pktl)){
|
yading@11
|
1108 if(pktl->pkt.stream_index == stream_index){
|
yading@11
|
1109 if(pktl->pkt.pts != pktl->pkt.dts || pktl->pkt.dts != AV_NOPTS_VALUE || pktl->pkt.duration)
|
yading@11
|
1110 break;
|
yading@11
|
1111 cur_dts -= duration;
|
yading@11
|
1112 }
|
yading@11
|
1113 }
|
yading@11
|
1114 if(pktl && pktl->pkt.dts != st->first_dts) {
|
yading@11
|
1115 av_log(s, AV_LOG_DEBUG, "first_dts %s not matching first dts %s in the queue\n", av_ts2str(st->first_dts), av_ts2str(pktl->pkt.dts));
|
yading@11
|
1116 return;
|
yading@11
|
1117 }
|
yading@11
|
1118 if(!pktl) {
|
yading@11
|
1119 av_log(s, AV_LOG_DEBUG, "first_dts %s but no packet with dts in the queue\n", av_ts2str(st->first_dts));
|
yading@11
|
1120 return;
|
yading@11
|
1121 }
|
yading@11
|
1122 pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
|
yading@11
|
1123 st->first_dts = cur_dts;
|
yading@11
|
1124 }else if(st->cur_dts != RELATIVE_TS_BASE)
|
yading@11
|
1125 return;
|
yading@11
|
1126
|
yading@11
|
1127 for(; pktl; pktl= get_next_pkt(s, st, pktl)){
|
yading@11
|
1128 if(pktl->pkt.stream_index != stream_index)
|
yading@11
|
1129 continue;
|
yading@11
|
1130 if(pktl->pkt.pts == pktl->pkt.dts && (pktl->pkt.dts == AV_NOPTS_VALUE || pktl->pkt.dts == st->first_dts)
|
yading@11
|
1131 && !pktl->pkt.duration){
|
yading@11
|
1132 pktl->pkt.dts= cur_dts;
|
yading@11
|
1133 if(!st->codec->has_b_frames)
|
yading@11
|
1134 pktl->pkt.pts= cur_dts;
|
yading@11
|
1135 // if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
|
yading@11
|
1136 pktl->pkt.duration = duration;
|
yading@11
|
1137 }else
|
yading@11
|
1138 break;
|
yading@11
|
1139 cur_dts = pktl->pkt.dts + pktl->pkt.duration;
|
yading@11
|
1140 }
|
yading@11
|
1141 if(!pktl)
|
yading@11
|
1142 st->cur_dts= cur_dts;
|
yading@11
|
1143 }
|
yading@11
|
1144
|
yading@11
|
1145 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
|
yading@11
|
1146 AVCodecParserContext *pc, AVPacket *pkt)
|
yading@11
|
1147 {
|
yading@11
|
1148 int num, den, presentation_delayed, delay, i;
|
yading@11
|
1149 int64_t offset;
|
yading@11
|
1150
|
yading@11
|
1151 if (s->flags & AVFMT_FLAG_NOFILLIN)
|
yading@11
|
1152 return;
|
yading@11
|
1153
|
yading@11
|
1154 if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
|
yading@11
|
1155 pkt->dts= AV_NOPTS_VALUE;
|
yading@11
|
1156
|
yading@11
|
1157 if (st->codec->codec_id != AV_CODEC_ID_H264 && pc && pc->pict_type == AV_PICTURE_TYPE_B)
|
yading@11
|
1158 //FIXME Set low_delay = 0 when has_b_frames = 1
|
yading@11
|
1159 st->codec->has_b_frames = 1;
|
yading@11
|
1160
|
yading@11
|
1161 /* do we have a video B-frame ? */
|
yading@11
|
1162 delay= st->codec->has_b_frames;
|
yading@11
|
1163 presentation_delayed = 0;
|
yading@11
|
1164
|
yading@11
|
1165 /* XXX: need has_b_frame, but cannot get it if the codec is
|
yading@11
|
1166 not initialized */
|
yading@11
|
1167 if (delay &&
|
yading@11
|
1168 pc && pc->pict_type != AV_PICTURE_TYPE_B)
|
yading@11
|
1169 presentation_delayed = 1;
|
yading@11
|
1170
|
yading@11
|
1171 if(pkt->pts != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE && st->pts_wrap_bits<63 && pkt->dts - (1LL<<(st->pts_wrap_bits-1)) > pkt->pts){
|
yading@11
|
1172 if(is_relative(st->cur_dts) || pkt->dts - (1LL<<(st->pts_wrap_bits-1)) > st->cur_dts) {
|
yading@11
|
1173 pkt->dts -= 1LL<<st->pts_wrap_bits;
|
yading@11
|
1174 } else
|
yading@11
|
1175 pkt->pts += 1LL<<st->pts_wrap_bits;
|
yading@11
|
1176 }
|
yading@11
|
1177
|
yading@11
|
1178 // some mpeg2 in mpeg-ps lack dts (issue171 / input_file.mpg)
|
yading@11
|
1179 // we take the conservative approach and discard both
|
yading@11
|
1180 // Note, if this is misbehaving for a H.264 file then possibly presentation_delayed is not set correctly.
|
yading@11
|
1181 if(delay==1 && pkt->dts == pkt->pts && pkt->dts != AV_NOPTS_VALUE && presentation_delayed){
|
yading@11
|
1182 av_log(s, AV_LOG_DEBUG, "invalid dts/pts combination %"PRIi64"\n", pkt->dts);
|
yading@11
|
1183 if(strcmp(s->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")) // otherwise we discard correct timestamps for vc1-wmapro.ism
|
yading@11
|
1184 pkt->dts= AV_NOPTS_VALUE;
|
yading@11
|
1185 }
|
yading@11
|
1186
|
yading@11
|
1187 if (pkt->duration == 0) {
|
yading@11
|
1188 ff_compute_frame_duration(&num, &den, st, pc, pkt);
|
yading@11
|
1189 if (den && num) {
|
yading@11
|
1190 pkt->duration = av_rescale_rnd(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num, AV_ROUND_DOWN);
|
yading@11
|
1191 }
|
yading@11
|
1192 }
|
yading@11
|
1193 if(pkt->duration != 0 && (s->packet_buffer || s->parse_queue))
|
yading@11
|
1194 update_initial_durations(s, st, pkt->stream_index, pkt->duration);
|
yading@11
|
1195
|
yading@11
|
1196 /* correct timestamps with byte offset if demuxers only have timestamps
|
yading@11
|
1197 on packet boundaries */
|
yading@11
|
1198 if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
|
yading@11
|
1199 /* this will estimate bitrate based on this frame's duration and size */
|
yading@11
|
1200 offset = av_rescale(pc->offset, pkt->duration, pkt->size);
|
yading@11
|
1201 if(pkt->pts != AV_NOPTS_VALUE)
|
yading@11
|
1202 pkt->pts += offset;
|
yading@11
|
1203 if(pkt->dts != AV_NOPTS_VALUE)
|
yading@11
|
1204 pkt->dts += offset;
|
yading@11
|
1205 }
|
yading@11
|
1206
|
yading@11
|
1207 if (pc && pc->dts_sync_point >= 0) {
|
yading@11
|
1208 // we have synchronization info from the parser
|
yading@11
|
1209 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
|
yading@11
|
1210 if (den > 0) {
|
yading@11
|
1211 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
|
yading@11
|
1212 if (pkt->dts != AV_NOPTS_VALUE) {
|
yading@11
|
1213 // got DTS from the stream, update reference timestamp
|
yading@11
|
1214 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
|
yading@11
|
1215 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
|
yading@11
|
1216 } else if (st->reference_dts != AV_NOPTS_VALUE) {
|
yading@11
|
1217 // compute DTS based on reference timestamp
|
yading@11
|
1218 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
|
yading@11
|
1219 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
|
yading@11
|
1220 }
|
yading@11
|
1221 if (pc->dts_sync_point > 0)
|
yading@11
|
1222 st->reference_dts = pkt->dts; // new reference
|
yading@11
|
1223 }
|
yading@11
|
1224 }
|
yading@11
|
1225
|
yading@11
|
1226 /* This may be redundant, but it should not hurt. */
|
yading@11
|
1227 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
|
yading@11
|
1228 presentation_delayed = 1;
|
yading@11
|
1229
|
yading@11
|
1230 av_dlog(NULL, "IN delayed:%d pts:%s, dts:%s cur_dts:%s st:%d pc:%p duration:%d\n",
|
yading@11
|
1231 presentation_delayed, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), pkt->stream_index, pc, pkt->duration);
|
yading@11
|
1232 /* interpolate PTS and DTS if they are not present */
|
yading@11
|
1233 //We skip H264 currently because delay and has_b_frames are not reliably set
|
yading@11
|
1234 if((delay==0 || (delay==1 && pc)) && st->codec->codec_id != AV_CODEC_ID_H264){
|
yading@11
|
1235 if (presentation_delayed) {
|
yading@11
|
1236 /* DTS = decompression timestamp */
|
yading@11
|
1237 /* PTS = presentation timestamp */
|
yading@11
|
1238 if (pkt->dts == AV_NOPTS_VALUE)
|
yading@11
|
1239 pkt->dts = st->last_IP_pts;
|
yading@11
|
1240 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
|
yading@11
|
1241 if (pkt->dts == AV_NOPTS_VALUE)
|
yading@11
|
1242 pkt->dts = st->cur_dts;
|
yading@11
|
1243
|
yading@11
|
1244 /* this is tricky: the dts must be incremented by the duration
|
yading@11
|
1245 of the frame we are displaying, i.e. the last I- or P-frame */
|
yading@11
|
1246 if (st->last_IP_duration == 0)
|
yading@11
|
1247 st->last_IP_duration = pkt->duration;
|
yading@11
|
1248 if(pkt->dts != AV_NOPTS_VALUE)
|
yading@11
|
1249 st->cur_dts = pkt->dts + st->last_IP_duration;
|
yading@11
|
1250 st->last_IP_duration = pkt->duration;
|
yading@11
|
1251 st->last_IP_pts= pkt->pts;
|
yading@11
|
1252 /* cannot compute PTS if not present (we can compute it only
|
yading@11
|
1253 by knowing the future */
|
yading@11
|
1254 } else if (pkt->pts != AV_NOPTS_VALUE ||
|
yading@11
|
1255 pkt->dts != AV_NOPTS_VALUE ||
|
yading@11
|
1256 pkt->duration ) {
|
yading@11
|
1257 int duration = pkt->duration;
|
yading@11
|
1258
|
yading@11
|
1259 /* presentation is not delayed : PTS and DTS are the same */
|
yading@11
|
1260 if (pkt->pts == AV_NOPTS_VALUE)
|
yading@11
|
1261 pkt->pts = pkt->dts;
|
yading@11
|
1262 update_initial_timestamps(s, pkt->stream_index, pkt->pts,
|
yading@11
|
1263 pkt->pts, pkt);
|
yading@11
|
1264 if (pkt->pts == AV_NOPTS_VALUE)
|
yading@11
|
1265 pkt->pts = st->cur_dts;
|
yading@11
|
1266 pkt->dts = pkt->pts;
|
yading@11
|
1267 if (pkt->pts != AV_NOPTS_VALUE)
|
yading@11
|
1268 st->cur_dts = pkt->pts + duration;
|
yading@11
|
1269 }
|
yading@11
|
1270 }
|
yading@11
|
1271
|
yading@11
|
1272 if(pkt->pts != AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY && has_decode_delay_been_guessed(st)){
|
yading@11
|
1273 st->pts_buffer[0]= pkt->pts;
|
yading@11
|
1274 for(i=0; i<delay && st->pts_buffer[i] > st->pts_buffer[i+1]; i++)
|
yading@11
|
1275 FFSWAP(int64_t, st->pts_buffer[i], st->pts_buffer[i+1]);
|
yading@11
|
1276 if(pkt->dts == AV_NOPTS_VALUE)
|
yading@11
|
1277 pkt->dts= st->pts_buffer[0];
|
yading@11
|
1278 }
|
yading@11
|
1279 if(st->codec->codec_id == AV_CODEC_ID_H264){ // we skipped it above so we try here
|
yading@11
|
1280 update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt); // this should happen on the first packet
|
yading@11
|
1281 }
|
yading@11
|
1282 if(pkt->dts > st->cur_dts)
|
yading@11
|
1283 st->cur_dts = pkt->dts;
|
yading@11
|
1284
|
yading@11
|
1285 av_dlog(NULL, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
|
yading@11
|
1286 presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts));
|
yading@11
|
1287
|
yading@11
|
1288 /* update flags */
|
yading@11
|
1289 if (is_intra_only(st->codec))
|
yading@11
|
1290 pkt->flags |= AV_PKT_FLAG_KEY;
|
yading@11
|
1291 if (pc)
|
yading@11
|
1292 pkt->convergence_duration = pc->convergence_duration;
|
yading@11
|
1293 }
|
yading@11
|
1294
|
yading@11
|
1295 static void free_packet_buffer(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end)
|
yading@11
|
1296 {
|
yading@11
|
1297 while (*pkt_buf) {
|
yading@11
|
1298 AVPacketList *pktl = *pkt_buf;
|
yading@11
|
1299 *pkt_buf = pktl->next;
|
yading@11
|
1300 av_free_packet(&pktl->pkt);
|
yading@11
|
1301 av_freep(&pktl);
|
yading@11
|
1302 }
|
yading@11
|
1303 *pkt_buf_end = NULL;
|
yading@11
|
1304 }
|
yading@11
|
1305
|
yading@11
|
1306 /**
|
yading@11
|
1307 * Parse a packet, add all split parts to parse_queue
|
yading@11
|
1308 *
|
yading@11
|
1309 * @param pkt packet to parse, NULL when flushing the parser at end of stream
|
yading@11
|
1310 */
|
yading@11
|
1311 static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
|
yading@11
|
1312 {
|
yading@11
|
1313 AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
|
yading@11
|
1314 AVStream *st = s->streams[stream_index];
|
yading@11
|
1315 uint8_t *data = pkt ? pkt->data : NULL;
|
yading@11
|
1316 int size = pkt ? pkt->size : 0;
|
yading@11
|
1317 int ret = 0, got_output = 0;
|
yading@11
|
1318
|
yading@11
|
1319 if (!pkt) {
|
yading@11
|
1320 av_init_packet(&flush_pkt);
|
yading@11
|
1321 pkt = &flush_pkt;
|
yading@11
|
1322 got_output = 1;
|
yading@11
|
1323 } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
|
yading@11
|
1324 // preserve 0-size sync packets
|
yading@11
|
1325 compute_pkt_fields(s, st, st->parser, pkt);
|
yading@11
|
1326 }
|
yading@11
|
1327
|
yading@11
|
1328 while (size > 0 || (pkt == &flush_pkt && got_output)) {
|
yading@11
|
1329 int len;
|
yading@11
|
1330
|
yading@11
|
1331 av_init_packet(&out_pkt);
|
yading@11
|
1332 len = av_parser_parse2(st->parser, st->codec,
|
yading@11
|
1333 &out_pkt.data, &out_pkt.size, data, size,
|
yading@11
|
1334 pkt->pts, pkt->dts, pkt->pos);
|
yading@11
|
1335
|
yading@11
|
1336 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
|
yading@11
|
1337 pkt->pos = -1;
|
yading@11
|
1338 /* increment read pointer */
|
yading@11
|
1339 data += len;
|
yading@11
|
1340 size -= len;
|
yading@11
|
1341
|
yading@11
|
1342 got_output = !!out_pkt.size;
|
yading@11
|
1343
|
yading@11
|
1344 if (!out_pkt.size)
|
yading@11
|
1345 continue;
|
yading@11
|
1346
|
yading@11
|
1347 /* set the duration */
|
yading@11
|
1348 out_pkt.duration = 0;
|
yading@11
|
1349 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
|
yading@11
|
1350 if (st->codec->sample_rate > 0) {
|
yading@11
|
1351 out_pkt.duration = av_rescale_q_rnd(st->parser->duration,
|
yading@11
|
1352 (AVRational){ 1, st->codec->sample_rate },
|
yading@11
|
1353 st->time_base,
|
yading@11
|
1354 AV_ROUND_DOWN);
|
yading@11
|
1355 }
|
yading@11
|
1356 } else if (st->codec->time_base.num != 0 &&
|
yading@11
|
1357 st->codec->time_base.den != 0) {
|
yading@11
|
1358 out_pkt.duration = av_rescale_q_rnd(st->parser->duration,
|
yading@11
|
1359 st->codec->time_base,
|
yading@11
|
1360 st->time_base,
|
yading@11
|
1361 AV_ROUND_DOWN);
|
yading@11
|
1362 }
|
yading@11
|
1363
|
yading@11
|
1364 out_pkt.stream_index = st->index;
|
yading@11
|
1365 out_pkt.pts = st->parser->pts;
|
yading@11
|
1366 out_pkt.dts = st->parser->dts;
|
yading@11
|
1367 out_pkt.pos = st->parser->pos;
|
yading@11
|
1368
|
yading@11
|
1369 if(st->need_parsing == AVSTREAM_PARSE_FULL_RAW)
|
yading@11
|
1370 out_pkt.pos = st->parser->frame_offset;
|
yading@11
|
1371
|
yading@11
|
1372 if (st->parser->key_frame == 1 ||
|
yading@11
|
1373 (st->parser->key_frame == -1 &&
|
yading@11
|
1374 st->parser->pict_type == AV_PICTURE_TYPE_I))
|
yading@11
|
1375 out_pkt.flags |= AV_PKT_FLAG_KEY;
|
yading@11
|
1376
|
yading@11
|
1377 if(st->parser->key_frame == -1 && st->parser->pict_type==AV_PICTURE_TYPE_NONE && (pkt->flags&AV_PKT_FLAG_KEY))
|
yading@11
|
1378 out_pkt.flags |= AV_PKT_FLAG_KEY;
|
yading@11
|
1379
|
yading@11
|
1380 compute_pkt_fields(s, st, st->parser, &out_pkt);
|
yading@11
|
1381
|
yading@11
|
1382 if (out_pkt.data == pkt->data && out_pkt.size == pkt->size) {
|
yading@11
|
1383 out_pkt.buf = pkt->buf;
|
yading@11
|
1384 pkt->buf = NULL;
|
yading@11
|
1385 #if FF_API_DESTRUCT_PACKET
|
yading@11
|
1386 out_pkt.destruct = pkt->destruct;
|
yading@11
|
1387 pkt->destruct = NULL;
|
yading@11
|
1388 #endif
|
yading@11
|
1389 }
|
yading@11
|
1390 if ((ret = av_dup_packet(&out_pkt)) < 0)
|
yading@11
|
1391 goto fail;
|
yading@11
|
1392
|
yading@11
|
1393 if (!add_to_pktbuf(&s->parse_queue, &out_pkt, &s->parse_queue_end)) {
|
yading@11
|
1394 av_free_packet(&out_pkt);
|
yading@11
|
1395 ret = AVERROR(ENOMEM);
|
yading@11
|
1396 goto fail;
|
yading@11
|
1397 }
|
yading@11
|
1398 }
|
yading@11
|
1399
|
yading@11
|
1400
|
yading@11
|
1401 /* end of the stream => close and free the parser */
|
yading@11
|
1402 if (pkt == &flush_pkt) {
|
yading@11
|
1403 av_parser_close(st->parser);
|
yading@11
|
1404 st->parser = NULL;
|
yading@11
|
1405 }
|
yading@11
|
1406
|
yading@11
|
1407 fail:
|
yading@11
|
1408 av_free_packet(pkt);
|
yading@11
|
1409 return ret;
|
yading@11
|
1410 }
|
yading@11
|
1411
|
yading@11
|
1412 static int read_from_packet_buffer(AVPacketList **pkt_buffer,
|
yading@11
|
1413 AVPacketList **pkt_buffer_end,
|
yading@11
|
1414 AVPacket *pkt)
|
yading@11
|
1415 {
|
yading@11
|
1416 AVPacketList *pktl;
|
yading@11
|
1417 av_assert0(*pkt_buffer);
|
yading@11
|
1418 pktl = *pkt_buffer;
|
yading@11
|
1419 *pkt = pktl->pkt;
|
yading@11
|
1420 *pkt_buffer = pktl->next;
|
yading@11
|
1421 if (!pktl->next)
|
yading@11
|
1422 *pkt_buffer_end = NULL;
|
yading@11
|
1423 av_freep(&pktl);
|
yading@11
|
1424 return 0;
|
yading@11
|
1425 }
|
yading@11
|
1426
|
yading@11
|
1427 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
|
yading@11
|
1428 {
|
yading@11
|
1429 int ret = 0, i, got_packet = 0;
|
yading@11
|
1430
|
yading@11
|
1431 av_init_packet(pkt);
|
yading@11
|
1432
|
yading@11
|
1433 while (!got_packet && !s->parse_queue) {
|
yading@11
|
1434 AVStream *st;
|
yading@11
|
1435 AVPacket cur_pkt;
|
yading@11
|
1436
|
yading@11
|
1437 /* read next packet */
|
yading@11
|
1438 ret = ff_read_packet(s, &cur_pkt);
|
yading@11
|
1439 if (ret < 0) {
|
yading@11
|
1440 if (ret == AVERROR(EAGAIN))
|
yading@11
|
1441 return ret;
|
yading@11
|
1442 /* flush the parsers */
|
yading@11
|
1443 for(i = 0; i < s->nb_streams; i++) {
|
yading@11
|
1444 st = s->streams[i];
|
yading@11
|
1445 if (st->parser && st->need_parsing)
|
yading@11
|
1446 parse_packet(s, NULL, st->index);
|
yading@11
|
1447 }
|
yading@11
|
1448 /* all remaining packets are now in parse_queue =>
|
yading@11
|
1449 * really terminate parsing */
|
yading@11
|
1450 break;
|
yading@11
|
1451 }
|
yading@11
|
1452 ret = 0;
|
yading@11
|
1453 st = s->streams[cur_pkt.stream_index];
|
yading@11
|
1454
|
yading@11
|
1455 if (cur_pkt.pts != AV_NOPTS_VALUE &&
|
yading@11
|
1456 cur_pkt.dts != AV_NOPTS_VALUE &&
|
yading@11
|
1457 cur_pkt.pts < cur_pkt.dts) {
|
yading@11
|
1458 av_log(s, AV_LOG_WARNING, "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
|
yading@11
|
1459 cur_pkt.stream_index,
|
yading@11
|
1460 av_ts2str(cur_pkt.pts),
|
yading@11
|
1461 av_ts2str(cur_pkt.dts),
|
yading@11
|
1462 cur_pkt.size);
|
yading@11
|
1463 }
|
yading@11
|
1464 if (s->debug & FF_FDEBUG_TS)
|
yading@11
|
1465 av_log(s, AV_LOG_DEBUG, "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%d, flags=%d\n",
|
yading@11
|
1466 cur_pkt.stream_index,
|
yading@11
|
1467 av_ts2str(cur_pkt.pts),
|
yading@11
|
1468 av_ts2str(cur_pkt.dts),
|
yading@11
|
1469 cur_pkt.size,
|
yading@11
|
1470 cur_pkt.duration,
|
yading@11
|
1471 cur_pkt.flags);
|
yading@11
|
1472
|
yading@11
|
1473 if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
|
yading@11
|
1474 st->parser = av_parser_init(st->codec->codec_id);
|
yading@11
|
1475 if (!st->parser) {
|
yading@11
|
1476 av_log(s, AV_LOG_VERBOSE, "parser not found for codec "
|
yading@11
|
1477 "%s, packets or times may be invalid.\n",
|
yading@11
|
1478 avcodec_get_name(st->codec->codec_id));
|
yading@11
|
1479 /* no parser available: just output the raw packets */
|
yading@11
|
1480 st->need_parsing = AVSTREAM_PARSE_NONE;
|
yading@11
|
1481 } else if(st->need_parsing == AVSTREAM_PARSE_HEADERS) {
|
yading@11
|
1482 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
|
yading@11
|
1483 } else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE) {
|
yading@11
|
1484 st->parser->flags |= PARSER_FLAG_ONCE;
|
yading@11
|
1485 } else if(st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
|
yading@11
|
1486 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
|
yading@11
|
1487 }
|
yading@11
|
1488 }
|
yading@11
|
1489
|
yading@11
|
1490 if (!st->need_parsing || !st->parser) {
|
yading@11
|
1491 /* no parsing needed: we just output the packet as is */
|
yading@11
|
1492 *pkt = cur_pkt;
|
yading@11
|
1493 compute_pkt_fields(s, st, NULL, pkt);
|
yading@11
|
1494 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
|
yading@11
|
1495 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
|
yading@11
|
1496 ff_reduce_index(s, st->index);
|
yading@11
|
1497 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
|
yading@11
|
1498 }
|
yading@11
|
1499 got_packet = 1;
|
yading@11
|
1500 } else if (st->discard < AVDISCARD_ALL) {
|
yading@11
|
1501 if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
|
yading@11
|
1502 return ret;
|
yading@11
|
1503 } else {
|
yading@11
|
1504 /* free packet */
|
yading@11
|
1505 av_free_packet(&cur_pkt);
|
yading@11
|
1506 }
|
yading@11
|
1507 if (pkt->flags & AV_PKT_FLAG_KEY)
|
yading@11
|
1508 st->skip_to_keyframe = 0;
|
yading@11
|
1509 if (st->skip_to_keyframe) {
|
yading@11
|
1510 av_free_packet(&cur_pkt);
|
yading@11
|
1511 got_packet = 0;
|
yading@11
|
1512 }
|
yading@11
|
1513 }
|
yading@11
|
1514
|
yading@11
|
1515 if (!got_packet && s->parse_queue)
|
yading@11
|
1516 ret = read_from_packet_buffer(&s->parse_queue, &s->parse_queue_end, pkt);
|
yading@11
|
1517
|
yading@11
|
1518 if(s->debug & FF_FDEBUG_TS)
|
yading@11
|
1519 av_log(s, AV_LOG_DEBUG, "read_frame_internal stream=%d, pts=%s, dts=%s, size=%d, duration=%d, flags=%d\n",
|
yading@11
|
1520 pkt->stream_index,
|
yading@11
|
1521 av_ts2str(pkt->pts),
|
yading@11
|
1522 av_ts2str(pkt->dts),
|
yading@11
|
1523 pkt->size,
|
yading@11
|
1524 pkt->duration,
|
yading@11
|
1525 pkt->flags);
|
yading@11
|
1526
|
yading@11
|
1527 return ret;
|
yading@11
|
1528 }
|
yading@11
|
1529
|
yading@11
|
1530 int av_read_frame(AVFormatContext *s, AVPacket *pkt)
|
yading@11
|
1531 {
|
yading@11
|
1532 const int genpts = s->flags & AVFMT_FLAG_GENPTS;
|
yading@11
|
1533 int eof = 0;
|
yading@11
|
1534 int ret;
|
yading@11
|
1535 AVStream *st;
|
yading@11
|
1536
|
yading@11
|
1537 if (!genpts) {
|
yading@11
|
1538 ret = s->packet_buffer ?
|
yading@11
|
1539 read_from_packet_buffer(&s->packet_buffer, &s->packet_buffer_end, pkt) :
|
yading@11
|
1540 read_frame_internal(s, pkt);
|
yading@11
|
1541 if (ret < 0)
|
yading@11
|
1542 return ret;
|
yading@11
|
1543 goto return_packet;
|
yading@11
|
1544 }
|
yading@11
|
1545
|
yading@11
|
1546 for (;;) {
|
yading@11
|
1547 AVPacketList *pktl = s->packet_buffer;
|
yading@11
|
1548
|
yading@11
|
1549 if (pktl) {
|
yading@11
|
1550 AVPacket *next_pkt = &pktl->pkt;
|
yading@11
|
1551
|
yading@11
|
1552 if (next_pkt->dts != AV_NOPTS_VALUE) {
|
yading@11
|
1553 int wrap_bits = s->streams[next_pkt->stream_index]->pts_wrap_bits;
|
yading@11
|
1554 // last dts seen for this stream. if any of packets following
|
yading@11
|
1555 // current one had no dts, we will set this to AV_NOPTS_VALUE.
|
yading@11
|
1556 int64_t last_dts = next_pkt->dts;
|
yading@11
|
1557 while (pktl && next_pkt->pts == AV_NOPTS_VALUE) {
|
yading@11
|
1558 if (pktl->pkt.stream_index == next_pkt->stream_index &&
|
yading@11
|
1559 (av_compare_mod(next_pkt->dts, pktl->pkt.dts, 2LL << (wrap_bits - 1)) < 0)) {
|
yading@11
|
1560 if (av_compare_mod(pktl->pkt.pts, pktl->pkt.dts, 2LL << (wrap_bits - 1))) { //not b frame
|
yading@11
|
1561 next_pkt->pts = pktl->pkt.dts;
|
yading@11
|
1562 }
|
yading@11
|
1563 if (last_dts != AV_NOPTS_VALUE) {
|
yading@11
|
1564 // Once last dts was set to AV_NOPTS_VALUE, we don't change it.
|
yading@11
|
1565 last_dts = pktl->pkt.dts;
|
yading@11
|
1566 }
|
yading@11
|
1567 }
|
yading@11
|
1568 pktl = pktl->next;
|
yading@11
|
1569 }
|
yading@11
|
1570 if (eof && next_pkt->pts == AV_NOPTS_VALUE && last_dts != AV_NOPTS_VALUE) {
|
yading@11
|
1571 // Fixing the last reference frame had none pts issue (For MXF etc).
|
yading@11
|
1572 // We only do this when
|
yading@11
|
1573 // 1. eof.
|
yading@11
|
1574 // 2. we are not able to resolve a pts value for current packet.
|
yading@11
|
1575 // 3. the packets for this stream at the end of the files had valid dts.
|
yading@11
|
1576 next_pkt->pts = last_dts + next_pkt->duration;
|
yading@11
|
1577 }
|
yading@11
|
1578 pktl = s->packet_buffer;
|
yading@11
|
1579 }
|
yading@11
|
1580
|
yading@11
|
1581 /* read packet from packet buffer, if there is data */
|
yading@11
|
1582 if (!(next_pkt->pts == AV_NOPTS_VALUE &&
|
yading@11
|
1583 next_pkt->dts != AV_NOPTS_VALUE && !eof)) {
|
yading@11
|
1584 ret = read_from_packet_buffer(&s->packet_buffer,
|
yading@11
|
1585 &s->packet_buffer_end, pkt);
|
yading@11
|
1586 goto return_packet;
|
yading@11
|
1587 }
|
yading@11
|
1588 }
|
yading@11
|
1589
|
yading@11
|
1590 ret = read_frame_internal(s, pkt);
|
yading@11
|
1591 if (ret < 0) {
|
yading@11
|
1592 if (pktl && ret != AVERROR(EAGAIN)) {
|
yading@11
|
1593 eof = 1;
|
yading@11
|
1594 continue;
|
yading@11
|
1595 } else
|
yading@11
|
1596 return ret;
|
yading@11
|
1597 }
|
yading@11
|
1598
|
yading@11
|
1599 if (av_dup_packet(add_to_pktbuf(&s->packet_buffer, pkt,
|
yading@11
|
1600 &s->packet_buffer_end)) < 0)
|
yading@11
|
1601 return AVERROR(ENOMEM);
|
yading@11
|
1602 }
|
yading@11
|
1603
|
yading@11
|
1604 return_packet:
|
yading@11
|
1605
|
yading@11
|
1606 st = s->streams[pkt->stream_index];
|
yading@11
|
1607 if (st->skip_samples) {
|
yading@11
|
1608 uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
|
yading@11
|
1609 AV_WL32(p, st->skip_samples);
|
yading@11
|
1610 av_log(s, AV_LOG_DEBUG, "demuxer injecting skip %d\n", st->skip_samples);
|
yading@11
|
1611 st->skip_samples = 0;
|
yading@11
|
1612 }
|
yading@11
|
1613
|
yading@11
|
1614 if ((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY) {
|
yading@11
|
1615 ff_reduce_index(s, st->index);
|
yading@11
|
1616 av_add_index_entry(st, pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME);
|
yading@11
|
1617 }
|
yading@11
|
1618
|
yading@11
|
1619 if (is_relative(pkt->dts))
|
yading@11
|
1620 pkt->dts -= RELATIVE_TS_BASE;
|
yading@11
|
1621 if (is_relative(pkt->pts))
|
yading@11
|
1622 pkt->pts -= RELATIVE_TS_BASE;
|
yading@11
|
1623
|
yading@11
|
1624 return ret;
|
yading@11
|
1625 }
|
yading@11
|
1626
|
yading@11
|
1627 /* XXX: suppress the packet queue */
|
yading@11
|
1628 static void flush_packet_queue(AVFormatContext *s)
|
yading@11
|
1629 {
|
yading@11
|
1630 free_packet_buffer(&s->parse_queue, &s->parse_queue_end);
|
yading@11
|
1631 free_packet_buffer(&s->packet_buffer, &s->packet_buffer_end);
|
yading@11
|
1632 free_packet_buffer(&s->raw_packet_buffer, &s->raw_packet_buffer_end);
|
yading@11
|
1633
|
yading@11
|
1634 s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
|
yading@11
|
1635 }
|
yading@11
|
1636
|
yading@11
|
1637 /*******************************************************/
|
yading@11
|
1638 /* seek support */
|
yading@11
|
1639
|
yading@11
|
1640 int av_find_default_stream_index(AVFormatContext *s)
|
yading@11
|
1641 {
|
yading@11
|
1642 int first_audio_index = -1;
|
yading@11
|
1643 int i;
|
yading@11
|
1644 AVStream *st;
|
yading@11
|
1645
|
yading@11
|
1646 if (s->nb_streams <= 0)
|
yading@11
|
1647 return -1;
|
yading@11
|
1648 for(i = 0; i < s->nb_streams; i++) {
|
yading@11
|
1649 st = s->streams[i];
|
yading@11
|
1650 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
|
yading@11
|
1651 !(st->disposition & AV_DISPOSITION_ATTACHED_PIC)) {
|
yading@11
|
1652 return i;
|
yading@11
|
1653 }
|
yading@11
|
1654 if (first_audio_index < 0 && st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
|
yading@11
|
1655 first_audio_index = i;
|
yading@11
|
1656 }
|
yading@11
|
1657 return first_audio_index >= 0 ? first_audio_index : 0;
|
yading@11
|
1658 }
|
yading@11
|
1659
|
yading@11
|
1660 /**
|
yading@11
|
1661 * Flush the frame reader.
|
yading@11
|
1662 */
|
yading@11
|
1663 void ff_read_frame_flush(AVFormatContext *s)
|
yading@11
|
1664 {
|
yading@11
|
1665 AVStream *st;
|
yading@11
|
1666 int i, j;
|
yading@11
|
1667
|
yading@11
|
1668 flush_packet_queue(s);
|
yading@11
|
1669
|
yading@11
|
1670 /* for each stream, reset read state */
|
yading@11
|
1671 for(i = 0; i < s->nb_streams; i++) {
|
yading@11
|
1672 st = s->streams[i];
|
yading@11
|
1673
|
yading@11
|
1674 if (st->parser) {
|
yading@11
|
1675 av_parser_close(st->parser);
|
yading@11
|
1676 st->parser = NULL;
|
yading@11
|
1677 }
|
yading@11
|
1678 st->last_IP_pts = AV_NOPTS_VALUE;
|
yading@11
|
1679 if(st->first_dts == AV_NOPTS_VALUE) st->cur_dts = RELATIVE_TS_BASE;
|
yading@11
|
1680 else st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
|
yading@11
|
1681 st->reference_dts = AV_NOPTS_VALUE;
|
yading@11
|
1682
|
yading@11
|
1683 st->probe_packets = MAX_PROBE_PACKETS;
|
yading@11
|
1684
|
yading@11
|
1685 for(j=0; j<MAX_REORDER_DELAY+1; j++)
|
yading@11
|
1686 st->pts_buffer[j]= AV_NOPTS_VALUE;
|
yading@11
|
1687 }
|
yading@11
|
1688 }
|
yading@11
|
1689
|
yading@11
|
1690 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
|
yading@11
|
1691 {
|
yading@11
|
1692 int i;
|
yading@11
|
1693
|
yading@11
|
1694 for(i = 0; i < s->nb_streams; i++) {
|
yading@11
|
1695 AVStream *st = s->streams[i];
|
yading@11
|
1696
|
yading@11
|
1697 st->cur_dts = av_rescale(timestamp,
|
yading@11
|
1698 st->time_base.den * (int64_t)ref_st->time_base.num,
|
yading@11
|
1699 st->time_base.num * (int64_t)ref_st->time_base.den);
|
yading@11
|
1700 }
|
yading@11
|
1701 }
|
yading@11
|
1702
|
yading@11
|
1703 void ff_reduce_index(AVFormatContext *s, int stream_index)
|
yading@11
|
1704 {
|
yading@11
|
1705 AVStream *st= s->streams[stream_index];
|
yading@11
|
1706 unsigned int max_entries= s->max_index_size / sizeof(AVIndexEntry);
|
yading@11
|
1707
|
yading@11
|
1708 if((unsigned)st->nb_index_entries >= max_entries){
|
yading@11
|
1709 int i;
|
yading@11
|
1710 for(i=0; 2*i<st->nb_index_entries; i++)
|
yading@11
|
1711 st->index_entries[i]= st->index_entries[2*i];
|
yading@11
|
1712 st->nb_index_entries= i;
|
yading@11
|
1713 }
|
yading@11
|
1714 }
|
yading@11
|
1715
|
yading@11
|
1716 int ff_add_index_entry(AVIndexEntry **index_entries,
|
yading@11
|
1717 int *nb_index_entries,
|
yading@11
|
1718 unsigned int *index_entries_allocated_size,
|
yading@11
|
1719 int64_t pos, int64_t timestamp, int size, int distance, int flags)
|
yading@11
|
1720 {
|
yading@11
|
1721 AVIndexEntry *entries, *ie;
|
yading@11
|
1722 int index;
|
yading@11
|
1723
|
yading@11
|
1724 if((unsigned)*nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
|
yading@11
|
1725 return -1;
|
yading@11
|
1726
|
yading@11
|
1727 if(timestamp == AV_NOPTS_VALUE)
|
yading@11
|
1728 return AVERROR(EINVAL);
|
yading@11
|
1729
|
yading@11
|
1730 if (is_relative(timestamp)) //FIXME this maintains previous behavior but we should shift by the correct offset once known
|
yading@11
|
1731 timestamp -= RELATIVE_TS_BASE;
|
yading@11
|
1732
|
yading@11
|
1733 entries = av_fast_realloc(*index_entries,
|
yading@11
|
1734 index_entries_allocated_size,
|
yading@11
|
1735 (*nb_index_entries + 1) *
|
yading@11
|
1736 sizeof(AVIndexEntry));
|
yading@11
|
1737 if(!entries)
|
yading@11
|
1738 return -1;
|
yading@11
|
1739
|
yading@11
|
1740 *index_entries= entries;
|
yading@11
|
1741
|
yading@11
|
1742 index= ff_index_search_timestamp(*index_entries, *nb_index_entries, timestamp, AVSEEK_FLAG_ANY);
|
yading@11
|
1743
|
yading@11
|
1744 if(index<0){
|
yading@11
|
1745 index= (*nb_index_entries)++;
|
yading@11
|
1746 ie= &entries[index];
|
yading@11
|
1747 av_assert0(index==0 || ie[-1].timestamp < timestamp);
|
yading@11
|
1748 }else{
|
yading@11
|
1749 ie= &entries[index];
|
yading@11
|
1750 if(ie->timestamp != timestamp){
|
yading@11
|
1751 if(ie->timestamp <= timestamp)
|
yading@11
|
1752 return -1;
|
yading@11
|
1753 memmove(entries + index + 1, entries + index, sizeof(AVIndexEntry)*(*nb_index_entries - index));
|
yading@11
|
1754 (*nb_index_entries)++;
|
yading@11
|
1755 }else if(ie->pos == pos && distance < ie->min_distance) //do not reduce the distance
|
yading@11
|
1756 distance= ie->min_distance;
|
yading@11
|
1757 }
|
yading@11
|
1758
|
yading@11
|
1759 ie->pos = pos;
|
yading@11
|
1760 ie->timestamp = timestamp;
|
yading@11
|
1761 ie->min_distance= distance;
|
yading@11
|
1762 ie->size= size;
|
yading@11
|
1763 ie->flags = flags;
|
yading@11
|
1764
|
yading@11
|
1765 return index;
|
yading@11
|
1766 }
|
yading@11
|
1767
|
yading@11
|
1768 int av_add_index_entry(AVStream *st,
|
yading@11
|
1769 int64_t pos, int64_t timestamp, int size, int distance, int flags)
|
yading@11
|
1770 {
|
yading@11
|
1771 timestamp = wrap_timestamp(st, timestamp);
|
yading@11
|
1772 return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
|
yading@11
|
1773 &st->index_entries_allocated_size, pos,
|
yading@11
|
1774 timestamp, size, distance, flags);
|
yading@11
|
1775 }
|
yading@11
|
1776
|
yading@11
|
1777 int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
|
yading@11
|
1778 int64_t wanted_timestamp, int flags)
|
yading@11
|
1779 {
|
yading@11
|
1780 int a, b, m;
|
yading@11
|
1781 int64_t timestamp;
|
yading@11
|
1782
|
yading@11
|
1783 a = - 1;
|
yading@11
|
1784 b = nb_entries;
|
yading@11
|
1785
|
yading@11
|
1786 //optimize appending index entries at the end
|
yading@11
|
1787 if(b && entries[b-1].timestamp < wanted_timestamp)
|
yading@11
|
1788 a= b-1;
|
yading@11
|
1789
|
yading@11
|
1790 while (b - a > 1) {
|
yading@11
|
1791 m = (a + b) >> 1;
|
yading@11
|
1792 timestamp = entries[m].timestamp;
|
yading@11
|
1793 if(timestamp >= wanted_timestamp)
|
yading@11
|
1794 b = m;
|
yading@11
|
1795 if(timestamp <= wanted_timestamp)
|
yading@11
|
1796 a = m;
|
yading@11
|
1797 }
|
yading@11
|
1798 m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
|
yading@11
|
1799
|
yading@11
|
1800 if(!(flags & AVSEEK_FLAG_ANY)){
|
yading@11
|
1801 while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
|
yading@11
|
1802 m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
|
yading@11
|
1803 }
|
yading@11
|
1804 }
|
yading@11
|
1805
|
yading@11
|
1806 if(m == nb_entries)
|
yading@11
|
1807 return -1;
|
yading@11
|
1808 return m;
|
yading@11
|
1809 }
|
yading@11
|
1810
|
yading@11
|
1811 int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
|
yading@11
|
1812 int flags)
|
yading@11
|
1813 {
|
yading@11
|
1814 return ff_index_search_timestamp(st->index_entries, st->nb_index_entries,
|
yading@11
|
1815 wanted_timestamp, flags);
|
yading@11
|
1816 }
|
yading@11
|
1817
|
yading@11
|
1818 static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
|
yading@11
|
1819 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
|
yading@11
|
1820 {
|
yading@11
|
1821 int64_t ts = read_timestamp(s, stream_index, ppos, pos_limit);
|
yading@11
|
1822 if (stream_index >= 0)
|
yading@11
|
1823 ts = wrap_timestamp(s->streams[stream_index], ts);
|
yading@11
|
1824 return ts;
|
yading@11
|
1825 }
|
yading@11
|
1826
|
yading@11
|
1827 int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
|
yading@11
|
1828 {
|
yading@11
|
1829 AVInputFormat *avif= s->iformat;
|
yading@11
|
1830 int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
|
yading@11
|
1831 int64_t ts_min, ts_max, ts;
|
yading@11
|
1832 int index;
|
yading@11
|
1833 int64_t ret;
|
yading@11
|
1834 AVStream *st;
|
yading@11
|
1835
|
yading@11
|
1836 if (stream_index < 0)
|
yading@11
|
1837 return -1;
|
yading@11
|
1838
|
yading@11
|
1839 av_dlog(s, "read_seek: %d %s\n", stream_index, av_ts2str(target_ts));
|
yading@11
|
1840
|
yading@11
|
1841 ts_max=
|
yading@11
|
1842 ts_min= AV_NOPTS_VALUE;
|
yading@11
|
1843 pos_limit= -1; //gcc falsely says it may be uninitialized
|
yading@11
|
1844
|
yading@11
|
1845 st= s->streams[stream_index];
|
yading@11
|
1846 if(st->index_entries){
|
yading@11
|
1847 AVIndexEntry *e;
|
yading@11
|
1848
|
yading@11
|
1849 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()
|
yading@11
|
1850 index= FFMAX(index, 0);
|
yading@11
|
1851 e= &st->index_entries[index];
|
yading@11
|
1852
|
yading@11
|
1853 if(e->timestamp <= target_ts || e->pos == e->min_distance){
|
yading@11
|
1854 pos_min= e->pos;
|
yading@11
|
1855 ts_min= e->timestamp;
|
yading@11
|
1856 av_dlog(s, "using cached pos_min=0x%"PRIx64" dts_min=%s\n",
|
yading@11
|
1857 pos_min, av_ts2str(ts_min));
|
yading@11
|
1858 }else{
|
yading@11
|
1859 av_assert1(index==0);
|
yading@11
|
1860 }
|
yading@11
|
1861
|
yading@11
|
1862 index= av_index_search_timestamp(st, target_ts, flags & ~AVSEEK_FLAG_BACKWARD);
|
yading@11
|
1863 av_assert0(index < st->nb_index_entries);
|
yading@11
|
1864 if(index >= 0){
|
yading@11
|
1865 e= &st->index_entries[index];
|
yading@11
|
1866 av_assert1(e->timestamp >= target_ts);
|
yading@11
|
1867 pos_max= e->pos;
|
yading@11
|
1868 ts_max= e->timestamp;
|
yading@11
|
1869 pos_limit= pos_max - e->min_distance;
|
yading@11
|
1870 av_dlog(s, "using cached pos_max=0x%"PRIx64" pos_limit=0x%"PRIx64" dts_max=%s\n",
|
yading@11
|
1871 pos_max, pos_limit, av_ts2str(ts_max));
|
yading@11
|
1872 }
|
yading@11
|
1873 }
|
yading@11
|
1874
|
yading@11
|
1875 pos= ff_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp);
|
yading@11
|
1876 if(pos<0)
|
yading@11
|
1877 return -1;
|
yading@11
|
1878
|
yading@11
|
1879 /* do the seek */
|
yading@11
|
1880 if ((ret = avio_seek(s->pb, pos, SEEK_SET)) < 0)
|
yading@11
|
1881 return ret;
|
yading@11
|
1882
|
yading@11
|
1883 ff_read_frame_flush(s);
|
yading@11
|
1884 ff_update_cur_dts(s, st, ts);
|
yading@11
|
1885
|
yading@11
|
1886 return 0;
|
yading@11
|
1887 }
|
yading@11
|
1888
|
yading@11
|
1889 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
|
yading@11
|
1890 int64_t pos_min, int64_t pos_max, int64_t pos_limit,
|
yading@11
|
1891 int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
|
yading@11
|
1892 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
|
yading@11
|
1893 {
|
yading@11
|
1894 int64_t pos, ts;
|
yading@11
|
1895 int64_t start_pos, filesize;
|
yading@11
|
1896 int no_change;
|
yading@11
|
1897
|
yading@11
|
1898 av_dlog(s, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
|
yading@11
|
1899
|
yading@11
|
1900 if(ts_min == AV_NOPTS_VALUE){
|
yading@11
|
1901 pos_min = s->data_offset;
|
yading@11
|
1902 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
|
yading@11
|
1903 if (ts_min == AV_NOPTS_VALUE)
|
yading@11
|
1904 return -1;
|
yading@11
|
1905 }
|
yading@11
|
1906
|
yading@11
|
1907 if(ts_min >= target_ts){
|
yading@11
|
1908 *ts_ret= ts_min;
|
yading@11
|
1909 return pos_min;
|
yading@11
|
1910 }
|
yading@11
|
1911
|
yading@11
|
1912 if(ts_max == AV_NOPTS_VALUE){
|
yading@11
|
1913 int step= 1024;
|
yading@11
|
1914 filesize = avio_size(s->pb);
|
yading@11
|
1915 pos_max = filesize - 1;
|
yading@11
|
1916 do{
|
yading@11
|
1917 pos_max = FFMAX(0, pos_max - step);
|
yading@11
|
1918 ts_max = ff_read_timestamp(s, stream_index, &pos_max, pos_max + step, read_timestamp);
|
yading@11
|
1919 step += step;
|
yading@11
|
1920 }while(ts_max == AV_NOPTS_VALUE && pos_max > 0);
|
yading@11
|
1921 if (ts_max == AV_NOPTS_VALUE)
|
yading@11
|
1922 return -1;
|
yading@11
|
1923
|
yading@11
|
1924 for(;;){
|
yading@11
|
1925 int64_t tmp_pos= pos_max + 1;
|
yading@11
|
1926 int64_t tmp_ts= ff_read_timestamp(s, stream_index, &tmp_pos, INT64_MAX, read_timestamp);
|
yading@11
|
1927 if(tmp_ts == AV_NOPTS_VALUE)
|
yading@11
|
1928 break;
|
yading@11
|
1929 ts_max= tmp_ts;
|
yading@11
|
1930 pos_max= tmp_pos;
|
yading@11
|
1931 if(tmp_pos >= filesize)
|
yading@11
|
1932 break;
|
yading@11
|
1933 }
|
yading@11
|
1934 pos_limit= pos_max;
|
yading@11
|
1935 }
|
yading@11
|
1936
|
yading@11
|
1937 if(ts_max <= target_ts){
|
yading@11
|
1938 *ts_ret= ts_max;
|
yading@11
|
1939 return pos_max;
|
yading@11
|
1940 }
|
yading@11
|
1941
|
yading@11
|
1942 if(ts_min > ts_max){
|
yading@11
|
1943 return -1;
|
yading@11
|
1944 }else if(ts_min == ts_max){
|
yading@11
|
1945 pos_limit= pos_min;
|
yading@11
|
1946 }
|
yading@11
|
1947
|
yading@11
|
1948 no_change=0;
|
yading@11
|
1949 while (pos_min < pos_limit) {
|
yading@11
|
1950 av_dlog(s, "pos_min=0x%"PRIx64" pos_max=0x%"PRIx64" dts_min=%s dts_max=%s\n",
|
yading@11
|
1951 pos_min, pos_max, av_ts2str(ts_min), av_ts2str(ts_max));
|
yading@11
|
1952 assert(pos_limit <= pos_max);
|
yading@11
|
1953
|
yading@11
|
1954 if(no_change==0){
|
yading@11
|
1955 int64_t approximate_keyframe_distance= pos_max - pos_limit;
|
yading@11
|
1956 // interpolate position (better than dichotomy)
|
yading@11
|
1957 pos = av_rescale(target_ts - ts_min, pos_max - pos_min, ts_max - ts_min)
|
yading@11
|
1958 + pos_min - approximate_keyframe_distance;
|
yading@11
|
1959 }else if(no_change==1){
|
yading@11
|
1960 // bisection, if interpolation failed to change min or max pos last time
|
yading@11
|
1961 pos = (pos_min + pos_limit)>>1;
|
yading@11
|
1962 }else{
|
yading@11
|
1963 /* linear search if bisection failed, can only happen if there
|
yading@11
|
1964 are very few or no keyframes between min/max */
|
yading@11
|
1965 pos=pos_min;
|
yading@11
|
1966 }
|
yading@11
|
1967 if(pos <= pos_min)
|
yading@11
|
1968 pos= pos_min + 1;
|
yading@11
|
1969 else if(pos > pos_limit)
|
yading@11
|
1970 pos= pos_limit;
|
yading@11
|
1971 start_pos= pos;
|
yading@11
|
1972
|
yading@11
|
1973 ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp); //may pass pos_limit instead of -1
|
yading@11
|
1974 if(pos == pos_max)
|
yading@11
|
1975 no_change++;
|
yading@11
|
1976 else
|
yading@11
|
1977 no_change=0;
|
yading@11
|
1978 av_dlog(s, "%"PRId64" %"PRId64" %"PRId64" / %s %s %s target:%s limit:%"PRId64" start:%"PRId64" noc:%d\n",
|
yading@11
|
1979 pos_min, pos, pos_max,
|
yading@11
|
1980 av_ts2str(ts_min), av_ts2str(ts), av_ts2str(ts_max), av_ts2str(target_ts),
|
yading@11
|
1981 pos_limit, start_pos, no_change);
|
yading@11
|
1982 if(ts == AV_NOPTS_VALUE){
|
yading@11
|
1983 av_log(s, AV_LOG_ERROR, "read_timestamp() failed in the middle\n");
|
yading@11
|
1984 return -1;
|
yading@11
|
1985 }
|
yading@11
|
1986 assert(ts != AV_NOPTS_VALUE);
|
yading@11
|
1987 if (target_ts <= ts) {
|
yading@11
|
1988 pos_limit = start_pos - 1;
|
yading@11
|
1989 pos_max = pos;
|
yading@11
|
1990 ts_max = ts;
|
yading@11
|
1991 }
|
yading@11
|
1992 if (target_ts >= ts) {
|
yading@11
|
1993 pos_min = pos;
|
yading@11
|
1994 ts_min = ts;
|
yading@11
|
1995 }
|
yading@11
|
1996 }
|
yading@11
|
1997
|
yading@11
|
1998 pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max;
|
yading@11
|
1999 ts = (flags & AVSEEK_FLAG_BACKWARD) ? ts_min : ts_max;
|
yading@11
|
2000 #if 0
|
yading@11
|
2001 pos_min = pos;
|
yading@11
|
2002 ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
|
yading@11
|
2003 pos_min++;
|
yading@11
|
2004 ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
|
yading@11
|
2005 av_dlog(s, "pos=0x%"PRIx64" %s<=%s<=%s\n",
|
yading@11
|
2006 pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
|
yading@11
|
2007 #endif
|
yading@11
|
2008 *ts_ret= ts;
|
yading@11
|
2009 return pos;
|
yading@11
|
2010 }
|
yading@11
|
2011
|
yading@11
|
2012 static int seek_frame_byte(AVFormatContext *s, int stream_index, int64_t pos, int flags){
|
yading@11
|
2013 int64_t pos_min, pos_max;
|
yading@11
|
2014
|
yading@11
|
2015 pos_min = s->data_offset;
|
yading@11
|
2016 pos_max = avio_size(s->pb) - 1;
|
yading@11
|
2017
|
yading@11
|
2018 if (pos < pos_min) pos= pos_min;
|
yading@11
|
2019 else if(pos > pos_max) pos= pos_max;
|
yading@11
|
2020
|
yading@11
|
2021 avio_seek(s->pb, pos, SEEK_SET);
|
yading@11
|
2022
|
yading@11
|
2023 s->io_repositioned = 1;
|
yading@11
|
2024
|
yading@11
|
2025 return 0;
|
yading@11
|
2026 }
|
yading@11
|
2027
|
yading@11
|
2028 static int seek_frame_generic(AVFormatContext *s,
|
yading@11
|
2029 int stream_index, int64_t timestamp, int flags)
|
yading@11
|
2030 {
|
yading@11
|
2031 int index;
|
yading@11
|
2032 int64_t ret;
|
yading@11
|
2033 AVStream *st;
|
yading@11
|
2034 AVIndexEntry *ie;
|
yading@11
|
2035
|
yading@11
|
2036 st = s->streams[stream_index];
|
yading@11
|
2037
|
yading@11
|
2038 index = av_index_search_timestamp(st, timestamp, flags);
|
yading@11
|
2039
|
yading@11
|
2040 if(index < 0 && st->nb_index_entries && timestamp < st->index_entries[0].timestamp)
|
yading@11
|
2041 return -1;
|
yading@11
|
2042
|
yading@11
|
2043 if(index < 0 || index==st->nb_index_entries-1){
|
yading@11
|
2044 AVPacket pkt;
|
yading@11
|
2045 int nonkey=0;
|
yading@11
|
2046
|
yading@11
|
2047 if(st->nb_index_entries){
|
yading@11
|
2048 av_assert0(st->index_entries);
|
yading@11
|
2049 ie= &st->index_entries[st->nb_index_entries-1];
|
yading@11
|
2050 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
|
yading@11
|
2051 return ret;
|
yading@11
|
2052 ff_update_cur_dts(s, st, ie->timestamp);
|
yading@11
|
2053 }else{
|
yading@11
|
2054 if ((ret = avio_seek(s->pb, s->data_offset, SEEK_SET)) < 0)
|
yading@11
|
2055 return ret;
|
yading@11
|
2056 }
|
yading@11
|
2057 for (;;) {
|
yading@11
|
2058 int read_status;
|
yading@11
|
2059 do{
|
yading@11
|
2060 read_status = av_read_frame(s, &pkt);
|
yading@11
|
2061 } while (read_status == AVERROR(EAGAIN));
|
yading@11
|
2062 if (read_status < 0)
|
yading@11
|
2063 break;
|
yading@11
|
2064 av_free_packet(&pkt);
|
yading@11
|
2065 if(stream_index == pkt.stream_index && pkt.dts > timestamp){
|
yading@11
|
2066 if(pkt.flags & AV_PKT_FLAG_KEY)
|
yading@11
|
2067 break;
|
yading@11
|
2068 if(nonkey++ > 1000 && st->codec->codec_id != AV_CODEC_ID_CDGRAPHICS){
|
yading@11
|
2069 av_log(s, AV_LOG_ERROR,"seek_frame_generic failed as this stream seems to contain no keyframes after the target timestamp, %d non keyframes found\n", nonkey);
|
yading@11
|
2070 break;
|
yading@11
|
2071 }
|
yading@11
|
2072 }
|
yading@11
|
2073 }
|
yading@11
|
2074 index = av_index_search_timestamp(st, timestamp, flags);
|
yading@11
|
2075 }
|
yading@11
|
2076 if (index < 0)
|
yading@11
|
2077 return -1;
|
yading@11
|
2078
|
yading@11
|
2079 ff_read_frame_flush(s);
|
yading@11
|
2080 if (s->iformat->read_seek){
|
yading@11
|
2081 if(s->iformat->read_seek(s, stream_index, timestamp, flags) >= 0)
|
yading@11
|
2082 return 0;
|
yading@11
|
2083 }
|
yading@11
|
2084 ie = &st->index_entries[index];
|
yading@11
|
2085 if ((ret = avio_seek(s->pb, ie->pos, SEEK_SET)) < 0)
|
yading@11
|
2086 return ret;
|
yading@11
|
2087 ff_update_cur_dts(s, st, ie->timestamp);
|
yading@11
|
2088
|
yading@11
|
2089 return 0;
|
yading@11
|
2090 }
|
yading@11
|
2091
|
yading@11
|
2092 static int seek_frame_internal(AVFormatContext *s, int stream_index,
|
yading@11
|
2093 int64_t timestamp, int flags)
|
yading@11
|
2094 {
|
yading@11
|
2095 int ret;
|
yading@11
|
2096 AVStream *st;
|
yading@11
|
2097
|
yading@11
|
2098 if (flags & AVSEEK_FLAG_BYTE) {
|
yading@11
|
2099 if (s->iformat->flags & AVFMT_NO_BYTE_SEEK)
|
yading@11
|
2100 return -1;
|
yading@11
|
2101 ff_read_frame_flush(s);
|
yading@11
|
2102 return seek_frame_byte(s, stream_index, timestamp, flags);
|
yading@11
|
2103 }
|
yading@11
|
2104
|
yading@11
|
2105 if(stream_index < 0){
|
yading@11
|
2106 stream_index= av_find_default_stream_index(s);
|
yading@11
|
2107 if(stream_index < 0)
|
yading@11
|
2108 return -1;
|
yading@11
|
2109
|
yading@11
|
2110 st= s->streams[stream_index];
|
yading@11
|
2111 /* timestamp for default must be expressed in AV_TIME_BASE units */
|
yading@11
|
2112 timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
|
yading@11
|
2113 }
|
yading@11
|
2114
|
yading@11
|
2115 /* first, we try the format specific seek */
|
yading@11
|
2116 if (s->iformat->read_seek) {
|
yading@11
|
2117 ff_read_frame_flush(s);
|
yading@11
|
2118 ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
|
yading@11
|
2119 } else
|
yading@11
|
2120 ret = -1;
|
yading@11
|
2121 if (ret >= 0) {
|
yading@11
|
2122 return 0;
|
yading@11
|
2123 }
|
yading@11
|
2124
|
yading@11
|
2125 if (s->iformat->read_timestamp && !(s->iformat->flags & AVFMT_NOBINSEARCH)) {
|
yading@11
|
2126 ff_read_frame_flush(s);
|
yading@11
|
2127 return ff_seek_frame_binary(s, stream_index, timestamp, flags);
|
yading@11
|
2128 } else if (!(s->iformat->flags & AVFMT_NOGENSEARCH)) {
|
yading@11
|
2129 ff_read_frame_flush(s);
|
yading@11
|
2130 return seek_frame_generic(s, stream_index, timestamp, flags);
|
yading@11
|
2131 }
|
yading@11
|
2132 else
|
yading@11
|
2133 return -1;
|
yading@11
|
2134 }
|
yading@11
|
2135
|
yading@11
|
2136 int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
|
yading@11
|
2137 {
|
yading@11
|
2138 int ret = seek_frame_internal(s, stream_index, timestamp, flags);
|
yading@11
|
2139
|
yading@11
|
2140 if (ret >= 0)
|
yading@11
|
2141 ret = avformat_queue_attached_pictures(s);
|
yading@11
|
2142
|
yading@11
|
2143 return ret;
|
yading@11
|
2144 }
|
yading@11
|
2145
|
yading@11
|
2146 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
|
yading@11
|
2147 {
|
yading@11
|
2148 if(min_ts > ts || max_ts < ts)
|
yading@11
|
2149 return -1;
|
yading@11
|
2150 if (stream_index < -1 || stream_index >= (int)s->nb_streams)
|
yading@11
|
2151 return AVERROR(EINVAL);
|
yading@11
|
2152
|
yading@11
|
2153 if(s->seek2any>0)
|
yading@11
|
2154 flags |= AVSEEK_FLAG_ANY;
|
yading@11
|
2155
|
yading@11
|
2156 if (s->iformat->read_seek2) {
|
yading@11
|
2157 int ret;
|
yading@11
|
2158 ff_read_frame_flush(s);
|
yading@11
|
2159
|
yading@11
|
2160 if (stream_index == -1 && s->nb_streams == 1) {
|
yading@11
|
2161 AVRational time_base = s->streams[0]->time_base;
|
yading@11
|
2162 ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
|
yading@11
|
2163 min_ts = av_rescale_rnd(min_ts, time_base.den,
|
yading@11
|
2164 time_base.num * (int64_t)AV_TIME_BASE,
|
yading@11
|
2165 AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
|
yading@11
|
2166 max_ts = av_rescale_rnd(max_ts, time_base.den,
|
yading@11
|
2167 time_base.num * (int64_t)AV_TIME_BASE,
|
yading@11
|
2168 AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
|
yading@11
|
2169 }
|
yading@11
|
2170
|
yading@11
|
2171 ret = s->iformat->read_seek2(s, stream_index, min_ts, ts, max_ts, flags);
|
yading@11
|
2172
|
yading@11
|
2173 if (ret >= 0)
|
yading@11
|
2174 ret = avformat_queue_attached_pictures(s);
|
yading@11
|
2175 return ret;
|
yading@11
|
2176 }
|
yading@11
|
2177
|
yading@11
|
2178 if(s->iformat->read_timestamp){
|
yading@11
|
2179 //try to seek via read_timestamp()
|
yading@11
|
2180 }
|
yading@11
|
2181
|
yading@11
|
2182 //Fallback to old API if new is not implemented but old is
|
yading@11
|
2183 //Note the old has somewhat different semantics
|
yading@11
|
2184 if (s->iformat->read_seek || 1) {
|
yading@11
|
2185 int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
|
yading@11
|
2186 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
|
yading@11
|
2187 if (ret<0 && ts != min_ts && max_ts != ts) {
|
yading@11
|
2188 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
|
yading@11
|
2189 if (ret >= 0)
|
yading@11
|
2190 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
|
yading@11
|
2191 }
|
yading@11
|
2192 return ret;
|
yading@11
|
2193 }
|
yading@11
|
2194
|
yading@11
|
2195 // try some generic seek like seek_frame_generic() but with new ts semantics
|
yading@11
|
2196 return -1; //unreachable
|
yading@11
|
2197 }
|
yading@11
|
2198
|
yading@11
|
2199 /*******************************************************/
|
yading@11
|
2200
|
yading@11
|
2201 /**
|
yading@11
|
2202 * Return TRUE if the stream has accurate duration in any stream.
|
yading@11
|
2203 *
|
yading@11
|
2204 * @return TRUE if the stream has accurate duration for at least one component.
|
yading@11
|
2205 */
|
yading@11
|
2206 static int has_duration(AVFormatContext *ic)
|
yading@11
|
2207 {
|
yading@11
|
2208 int i;
|
yading@11
|
2209 AVStream *st;
|
yading@11
|
2210
|
yading@11
|
2211 for(i = 0;i < ic->nb_streams; i++) {
|
yading@11
|
2212 st = ic->streams[i];
|
yading@11
|
2213 if (st->duration != AV_NOPTS_VALUE)
|
yading@11
|
2214 return 1;
|
yading@11
|
2215 }
|
yading@11
|
2216 if (ic->duration != AV_NOPTS_VALUE)
|
yading@11
|
2217 return 1;
|
yading@11
|
2218 return 0;
|
yading@11
|
2219 }
|
yading@11
|
2220
|
yading@11
|
2221 /**
|
yading@11
|
2222 * Estimate the stream timings from the one of each components.
|
yading@11
|
2223 *
|
yading@11
|
2224 * Also computes the global bitrate if possible.
|
yading@11
|
2225 */
|
yading@11
|
2226 static void update_stream_timings(AVFormatContext *ic)
|
yading@11
|
2227 {
|
yading@11
|
2228 int64_t start_time, start_time1, start_time_text, end_time, end_time1;
|
yading@11
|
2229 int64_t duration, duration1, filesize;
|
yading@11
|
2230 int i;
|
yading@11
|
2231 AVStream *st;
|
yading@11
|
2232 AVProgram *p;
|
yading@11
|
2233
|
yading@11
|
2234 start_time = INT64_MAX;
|
yading@11
|
2235 start_time_text = INT64_MAX;
|
yading@11
|
2236 end_time = INT64_MIN;
|
yading@11
|
2237 duration = INT64_MIN;
|
yading@11
|
2238 for(i = 0;i < ic->nb_streams; i++) {
|
yading@11
|
2239 st = ic->streams[i];
|
yading@11
|
2240 if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
|
yading@11
|
2241 start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
|
yading@11
|
2242 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codec->codec_type == AVMEDIA_TYPE_DATA) {
|
yading@11
|
2243 if (start_time1 < start_time_text)
|
yading@11
|
2244 start_time_text = start_time1;
|
yading@11
|
2245 } else
|
yading@11
|
2246 start_time = FFMIN(start_time, start_time1);
|
yading@11
|
2247 end_time1 = AV_NOPTS_VALUE;
|
yading@11
|
2248 if (st->duration != AV_NOPTS_VALUE) {
|
yading@11
|
2249 end_time1 = start_time1
|
yading@11
|
2250 + av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
|
yading@11
|
2251 end_time = FFMAX(end_time, end_time1);
|
yading@11
|
2252 }
|
yading@11
|
2253 for(p = NULL; (p = av_find_program_from_stream(ic, p, i)); ){
|
yading@11
|
2254 if(p->start_time == AV_NOPTS_VALUE || p->start_time > start_time1)
|
yading@11
|
2255 p->start_time = start_time1;
|
yading@11
|
2256 if(p->end_time < end_time1)
|
yading@11
|
2257 p->end_time = end_time1;
|
yading@11
|
2258 }
|
yading@11
|
2259 }
|
yading@11
|
2260 if (st->duration != AV_NOPTS_VALUE) {
|
yading@11
|
2261 duration1 = av_rescale_q(st->duration, st->time_base, AV_TIME_BASE_Q);
|
yading@11
|
2262 duration = FFMAX(duration, duration1);
|
yading@11
|
2263 }
|
yading@11
|
2264 }
|
yading@11
|
2265 if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
|
yading@11
|
2266 start_time = start_time_text;
|
yading@11
|
2267 else if(start_time > start_time_text)
|
yading@11
|
2268 av_log(ic, AV_LOG_VERBOSE, "Ignoring outlier non primary stream starttime %f\n", start_time_text / (float)AV_TIME_BASE);
|
yading@11
|
2269
|
yading@11
|
2270 if (start_time != INT64_MAX) {
|
yading@11
|
2271 ic->start_time = start_time;
|
yading@11
|
2272 if (end_time != INT64_MIN) {
|
yading@11
|
2273 if (ic->nb_programs) {
|
yading@11
|
2274 for (i=0; i<ic->nb_programs; i++) {
|
yading@11
|
2275 p = ic->programs[i];
|
yading@11
|
2276 if(p->start_time != AV_NOPTS_VALUE && p->end_time > p->start_time)
|
yading@11
|
2277 duration = FFMAX(duration, p->end_time - p->start_time);
|
yading@11
|
2278 }
|
yading@11
|
2279 } else
|
yading@11
|
2280 duration = FFMAX(duration, end_time - start_time);
|
yading@11
|
2281 }
|
yading@11
|
2282 }
|
yading@11
|
2283 if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
|
yading@11
|
2284 ic->duration = duration;
|
yading@11
|
2285 }
|
yading@11
|
2286 if (ic->pb && (filesize = avio_size(ic->pb)) > 0 && ic->duration != AV_NOPTS_VALUE) {
|
yading@11
|
2287 /* compute the bitrate */
|
yading@11
|
2288 double bitrate = (double)filesize * 8.0 * AV_TIME_BASE /
|
yading@11
|
2289 (double)ic->duration;
|
yading@11
|
2290 if (bitrate >= 0 && bitrate <= INT_MAX)
|
yading@11
|
2291 ic->bit_rate = bitrate;
|
yading@11
|
2292 }
|
yading@11
|
2293 }
|
yading@11
|
2294
|
yading@11
|
2295 static void fill_all_stream_timings(AVFormatContext *ic)
|
yading@11
|
2296 {
|
yading@11
|
2297 int i;
|
yading@11
|
2298 AVStream *st;
|
yading@11
|
2299
|
yading@11
|
2300 update_stream_timings(ic);
|
yading@11
|
2301 for(i = 0;i < ic->nb_streams; i++) {
|
yading@11
|
2302 st = ic->streams[i];
|
yading@11
|
2303 if (st->start_time == AV_NOPTS_VALUE) {
|
yading@11
|
2304 if(ic->start_time != AV_NOPTS_VALUE)
|
yading@11
|
2305 st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q, st->time_base);
|
yading@11
|
2306 if(ic->duration != AV_NOPTS_VALUE)
|
yading@11
|
2307 st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q, st->time_base);
|
yading@11
|
2308 }
|
yading@11
|
2309 }
|
yading@11
|
2310 }
|
yading@11
|
2311
|
yading@11
|
2312 static void estimate_timings_from_bit_rate(AVFormatContext *ic)
|
yading@11
|
2313 {
|
yading@11
|
2314 int64_t filesize, duration;
|
yading@11
|
2315 int bit_rate, i, show_warning = 0;
|
yading@11
|
2316 AVStream *st;
|
yading@11
|
2317
|
yading@11
|
2318 /* if bit_rate is already set, we believe it */
|
yading@11
|
2319 if (ic->bit_rate <= 0) {
|
yading@11
|
2320 bit_rate = 0;
|
yading@11
|
2321 for(i=0;i<ic->nb_streams;i++) {
|
yading@11
|
2322 st = ic->streams[i];
|
yading@11
|
2323 if (st->codec->bit_rate > 0)
|
yading@11
|
2324 bit_rate += st->codec->bit_rate;
|
yading@11
|
2325 }
|
yading@11
|
2326 ic->bit_rate = bit_rate;
|
yading@11
|
2327 }
|
yading@11
|
2328
|
yading@11
|
2329 /* if duration is already set, we believe it */
|
yading@11
|
2330 if (ic->duration == AV_NOPTS_VALUE &&
|
yading@11
|
2331 ic->bit_rate != 0) {
|
yading@11
|
2332 filesize = ic->pb ? avio_size(ic->pb) : 0;
|
yading@11
|
2333 if (filesize > 0) {
|
yading@11
|
2334 for(i = 0; i < ic->nb_streams; i++) {
|
yading@11
|
2335 st = ic->streams[i];
|
yading@11
|
2336 if ( st->time_base.num <= INT64_MAX / ic->bit_rate
|
yading@11
|
2337 && st->duration == AV_NOPTS_VALUE) {
|
yading@11
|
2338 duration= av_rescale(8*filesize, st->time_base.den, ic->bit_rate*(int64_t)st->time_base.num);
|
yading@11
|
2339 st->duration = duration;
|
yading@11
|
2340 show_warning = 1;
|
yading@11
|
2341 }
|
yading@11
|
2342 }
|
yading@11
|
2343 }
|
yading@11
|
2344 }
|
yading@11
|
2345 if (show_warning)
|
yading@11
|
2346 av_log(ic, AV_LOG_WARNING, "Estimating duration from bitrate, this may be inaccurate\n");
|
yading@11
|
2347 }
|
yading@11
|
2348
|
yading@11
|
2349 #define DURATION_MAX_READ_SIZE 250000LL
|
yading@11
|
2350 #define DURATION_MAX_RETRY 4
|
yading@11
|
2351
|
yading@11
|
2352 /* only usable for MPEG-PS streams */
|
yading@11
|
2353 static void estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
|
yading@11
|
2354 {
|
yading@11
|
2355 AVPacket pkt1, *pkt = &pkt1;
|
yading@11
|
2356 AVStream *st;
|
yading@11
|
2357 int read_size, i, ret;
|
yading@11
|
2358 int64_t end_time;
|
yading@11
|
2359 int64_t filesize, offset, duration;
|
yading@11
|
2360 int retry=0;
|
yading@11
|
2361
|
yading@11
|
2362 /* flush packet queue */
|
yading@11
|
2363 flush_packet_queue(ic);
|
yading@11
|
2364
|
yading@11
|
2365 for (i=0; i<ic->nb_streams; i++) {
|
yading@11
|
2366 st = ic->streams[i];
|
yading@11
|
2367 if (st->start_time == AV_NOPTS_VALUE && st->first_dts == AV_NOPTS_VALUE)
|
yading@11
|
2368 av_log(st->codec, AV_LOG_WARNING, "start time is not set in estimate_timings_from_pts\n");
|
yading@11
|
2369
|
yading@11
|
2370 if (st->parser) {
|
yading@11
|
2371 av_parser_close(st->parser);
|
yading@11
|
2372 st->parser= NULL;
|
yading@11
|
2373 }
|
yading@11
|
2374 }
|
yading@11
|
2375
|
yading@11
|
2376 /* estimate the end time (duration) */
|
yading@11
|
2377 /* XXX: may need to support wrapping */
|
yading@11
|
2378 filesize = ic->pb ? avio_size(ic->pb) : 0;
|
yading@11
|
2379 end_time = AV_NOPTS_VALUE;
|
yading@11
|
2380 do{
|
yading@11
|
2381 offset = filesize - (DURATION_MAX_READ_SIZE<<retry);
|
yading@11
|
2382 if (offset < 0)
|
yading@11
|
2383 offset = 0;
|
yading@11
|
2384
|
yading@11
|
2385 avio_seek(ic->pb, offset, SEEK_SET);
|
yading@11
|
2386 read_size = 0;
|
yading@11
|
2387 for(;;) {
|
yading@11
|
2388 if (read_size >= DURATION_MAX_READ_SIZE<<(FFMAX(retry-1,0)))
|
yading@11
|
2389 break;
|
yading@11
|
2390
|
yading@11
|
2391 do {
|
yading@11
|
2392 ret = ff_read_packet(ic, pkt);
|
yading@11
|
2393 } while(ret == AVERROR(EAGAIN));
|
yading@11
|
2394 if (ret != 0)
|
yading@11
|
2395 break;
|
yading@11
|
2396 read_size += pkt->size;
|
yading@11
|
2397 st = ic->streams[pkt->stream_index];
|
yading@11
|
2398 if (pkt->pts != AV_NOPTS_VALUE &&
|
yading@11
|
2399 (st->start_time != AV_NOPTS_VALUE ||
|
yading@11
|
2400 st->first_dts != AV_NOPTS_VALUE)) {
|
yading@11
|
2401 duration = end_time = pkt->pts;
|
yading@11
|
2402 if (st->start_time != AV_NOPTS_VALUE)
|
yading@11
|
2403 duration -= st->start_time;
|
yading@11
|
2404 else
|
yading@11
|
2405 duration -= st->first_dts;
|
yading@11
|
2406 if (duration > 0) {
|
yading@11
|
2407 if (st->duration == AV_NOPTS_VALUE || st->info->last_duration<=0 ||
|
yading@11
|
2408 (st->duration < duration && FFABS(duration - st->info->last_duration) < 60LL*st->time_base.den / st->time_base.num))
|
yading@11
|
2409 st->duration = duration;
|
yading@11
|
2410 st->info->last_duration = duration;
|
yading@11
|
2411 }
|
yading@11
|
2412 }
|
yading@11
|
2413 av_free_packet(pkt);
|
yading@11
|
2414 }
|
yading@11
|
2415 }while( end_time==AV_NOPTS_VALUE
|
yading@11
|
2416 && filesize > (DURATION_MAX_READ_SIZE<<retry)
|
yading@11
|
2417 && ++retry <= DURATION_MAX_RETRY);
|
yading@11
|
2418
|
yading@11
|
2419 fill_all_stream_timings(ic);
|
yading@11
|
2420
|
yading@11
|
2421 avio_seek(ic->pb, old_offset, SEEK_SET);
|
yading@11
|
2422 for (i=0; i<ic->nb_streams; i++) {
|
yading@11
|
2423 st= ic->streams[i];
|
yading@11
|
2424 st->cur_dts= st->first_dts;
|
yading@11
|
2425 st->last_IP_pts = AV_NOPTS_VALUE;
|
yading@11
|
2426 st->reference_dts = AV_NOPTS_VALUE;
|
yading@11
|
2427 }
|
yading@11
|
2428 }
|
yading@11
|
2429
|
yading@11
|
2430 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
|
yading@11
|
2431 {
|
yading@11
|
2432 int64_t file_size;
|
yading@11
|
2433
|
yading@11
|
2434 /* get the file size, if possible */
|
yading@11
|
2435 if (ic->iformat->flags & AVFMT_NOFILE) {
|
yading@11
|
2436 file_size = 0;
|
yading@11
|
2437 } else {
|
yading@11
|
2438 file_size = avio_size(ic->pb);
|
yading@11
|
2439 file_size = FFMAX(0, file_size);
|
yading@11
|
2440 }
|
yading@11
|
2441
|
yading@11
|
2442 if ((!strcmp(ic->iformat->name, "mpeg") ||
|
yading@11
|
2443 !strcmp(ic->iformat->name, "mpegts")) &&
|
yading@11
|
2444 file_size && ic->pb->seekable) {
|
yading@11
|
2445 /* get accurate estimate from the PTSes */
|
yading@11
|
2446 estimate_timings_from_pts(ic, old_offset);
|
yading@11
|
2447 ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
|
yading@11
|
2448 } else if (has_duration(ic)) {
|
yading@11
|
2449 /* at least one component has timings - we use them for all
|
yading@11
|
2450 the components */
|
yading@11
|
2451 fill_all_stream_timings(ic);
|
yading@11
|
2452 ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
|
yading@11
|
2453 } else {
|
yading@11
|
2454 /* less precise: use bitrate info */
|
yading@11
|
2455 estimate_timings_from_bit_rate(ic);
|
yading@11
|
2456 ic->duration_estimation_method = AVFMT_DURATION_FROM_BITRATE;
|
yading@11
|
2457 }
|
yading@11
|
2458 update_stream_timings(ic);
|
yading@11
|
2459
|
yading@11
|
2460 {
|
yading@11
|
2461 int i;
|
yading@11
|
2462 AVStream av_unused *st;
|
yading@11
|
2463 for(i = 0;i < ic->nb_streams; i++) {
|
yading@11
|
2464 st = ic->streams[i];
|
yading@11
|
2465 av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
|
yading@11
|
2466 (double) st->start_time / AV_TIME_BASE,
|
yading@11
|
2467 (double) st->duration / AV_TIME_BASE);
|
yading@11
|
2468 }
|
yading@11
|
2469 av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
|
yading@11
|
2470 (double) ic->start_time / AV_TIME_BASE,
|
yading@11
|
2471 (double) ic->duration / AV_TIME_BASE,
|
yading@11
|
2472 ic->bit_rate / 1000);
|
yading@11
|
2473 }
|
yading@11
|
2474 }
|
yading@11
|
2475
|
yading@11
|
2476 static int has_codec_parameters(AVStream *st, const char **errmsg_ptr)
|
yading@11
|
2477 {
|
yading@11
|
2478 AVCodecContext *avctx = st->codec;
|
yading@11
|
2479
|
yading@11
|
2480 #define FAIL(errmsg) do { \
|
yading@11
|
2481 if (errmsg_ptr) \
|
yading@11
|
2482 *errmsg_ptr = errmsg; \
|
yading@11
|
2483 return 0; \
|
yading@11
|
2484 } while (0)
|
yading@11
|
2485
|
yading@11
|
2486 switch (avctx->codec_type) {
|
yading@11
|
2487 case AVMEDIA_TYPE_AUDIO:
|
yading@11
|
2488 if (!avctx->frame_size && determinable_frame_size(avctx))
|
yading@11
|
2489 FAIL("unspecified frame size");
|
yading@11
|
2490 if (st->info->found_decoder >= 0 && avctx->sample_fmt == AV_SAMPLE_FMT_NONE)
|
yading@11
|
2491 FAIL("unspecified sample format");
|
yading@11
|
2492 if (!avctx->sample_rate)
|
yading@11
|
2493 FAIL("unspecified sample rate");
|
yading@11
|
2494 if (!avctx->channels)
|
yading@11
|
2495 FAIL("unspecified number of channels");
|
yading@11
|
2496 if (st->info->found_decoder >= 0 && !st->nb_decoded_frames && avctx->codec_id == AV_CODEC_ID_DTS)
|
yading@11
|
2497 FAIL("no decodable DTS frames");
|
yading@11
|
2498 break;
|
yading@11
|
2499 case AVMEDIA_TYPE_VIDEO:
|
yading@11
|
2500 if (!avctx->width)
|
yading@11
|
2501 FAIL("unspecified size");
|
yading@11
|
2502 if (st->info->found_decoder >= 0 && avctx->pix_fmt == AV_PIX_FMT_NONE)
|
yading@11
|
2503 FAIL("unspecified pixel format");
|
yading@11
|
2504 if (st->codec->codec_id == AV_CODEC_ID_RV30 || st->codec->codec_id == AV_CODEC_ID_RV40)
|
yading@11
|
2505 if (!st->sample_aspect_ratio.num && !st->codec->sample_aspect_ratio.num && !st->codec_info_nb_frames)
|
yading@11
|
2506 FAIL("no frame in rv30/40 and no sar");
|
yading@11
|
2507 break;
|
yading@11
|
2508 case AVMEDIA_TYPE_SUBTITLE:
|
yading@11
|
2509 if (avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE && !avctx->width)
|
yading@11
|
2510 FAIL("unspecified size");
|
yading@11
|
2511 break;
|
yading@11
|
2512 case AVMEDIA_TYPE_DATA:
|
yading@11
|
2513 if(avctx->codec_id == AV_CODEC_ID_NONE) return 1;
|
yading@11
|
2514 }
|
yading@11
|
2515
|
yading@11
|
2516 if (avctx->codec_id == AV_CODEC_ID_NONE)
|
yading@11
|
2517 FAIL("unknown codec");
|
yading@11
|
2518 return 1;
|
yading@11
|
2519 }
|
yading@11
|
2520
|
yading@11
|
2521 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
|
yading@11
|
2522 static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
|
yading@11
|
2523 {
|
yading@11
|
2524 const AVCodec *codec;
|
yading@11
|
2525 int got_picture = 1, ret = 0;
|
yading@11
|
2526 AVFrame *frame = avcodec_alloc_frame();
|
yading@11
|
2527 AVSubtitle subtitle;
|
yading@11
|
2528 AVPacket pkt = *avpkt;
|
yading@11
|
2529
|
yading@11
|
2530 if (!frame)
|
yading@11
|
2531 return AVERROR(ENOMEM);
|
yading@11
|
2532
|
yading@11
|
2533 if (!avcodec_is_open(st->codec) && !st->info->found_decoder) {
|
yading@11
|
2534 AVDictionary *thread_opt = NULL;
|
yading@11
|
2535
|
yading@11
|
2536 codec = st->codec->codec ? st->codec->codec :
|
yading@11
|
2537 avcodec_find_decoder(st->codec->codec_id);
|
yading@11
|
2538
|
yading@11
|
2539 if (!codec) {
|
yading@11
|
2540 st->info->found_decoder = -1;
|
yading@11
|
2541 ret = -1;
|
yading@11
|
2542 goto fail;
|
yading@11
|
2543 }
|
yading@11
|
2544
|
yading@11
|
2545 /* force thread count to 1 since the h264 decoder will not extract SPS
|
yading@11
|
2546 * and PPS to extradata during multi-threaded decoding */
|
yading@11
|
2547 av_dict_set(options ? options : &thread_opt, "threads", "1", 0);
|
yading@11
|
2548 ret = avcodec_open2(st->codec, codec, options ? options : &thread_opt);
|
yading@11
|
2549 if (!options)
|
yading@11
|
2550 av_dict_free(&thread_opt);
|
yading@11
|
2551 if (ret < 0) {
|
yading@11
|
2552 st->info->found_decoder = -1;
|
yading@11
|
2553 goto fail;
|
yading@11
|
2554 }
|
yading@11
|
2555 st->info->found_decoder = 1;
|
yading@11
|
2556 } else if (!st->info->found_decoder)
|
yading@11
|
2557 st->info->found_decoder = 1;
|
yading@11
|
2558
|
yading@11
|
2559 if (st->info->found_decoder < 0) {
|
yading@11
|
2560 ret = -1;
|
yading@11
|
2561 goto fail;
|
yading@11
|
2562 }
|
yading@11
|
2563
|
yading@11
|
2564 while ((pkt.size > 0 || (!pkt.data && got_picture)) &&
|
yading@11
|
2565 ret >= 0 &&
|
yading@11
|
2566 (!has_codec_parameters(st, NULL) ||
|
yading@11
|
2567 !has_decode_delay_been_guessed(st) ||
|
yading@11
|
2568 (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
|
yading@11
|
2569 got_picture = 0;
|
yading@11
|
2570 avcodec_get_frame_defaults(frame);
|
yading@11
|
2571 switch(st->codec->codec_type) {
|
yading@11
|
2572 case AVMEDIA_TYPE_VIDEO:
|
yading@11
|
2573 ret = avcodec_decode_video2(st->codec, frame,
|
yading@11
|
2574 &got_picture, &pkt);
|
yading@11
|
2575 break;
|
yading@11
|
2576 case AVMEDIA_TYPE_AUDIO:
|
yading@11
|
2577 ret = avcodec_decode_audio4(st->codec, frame, &got_picture, &pkt);
|
yading@11
|
2578 break;
|
yading@11
|
2579 case AVMEDIA_TYPE_SUBTITLE:
|
yading@11
|
2580 ret = avcodec_decode_subtitle2(st->codec, &subtitle,
|
yading@11
|
2581 &got_picture, &pkt);
|
yading@11
|
2582 ret = pkt.size;
|
yading@11
|
2583 break;
|
yading@11
|
2584 default:
|
yading@11
|
2585 break;
|
yading@11
|
2586 }
|
yading@11
|
2587 if (ret >= 0) {
|
yading@11
|
2588 if (got_picture)
|
yading@11
|
2589 st->nb_decoded_frames++;
|
yading@11
|
2590 pkt.data += ret;
|
yading@11
|
2591 pkt.size -= ret;
|
yading@11
|
2592 ret = got_picture;
|
yading@11
|
2593 }
|
yading@11
|
2594 }
|
yading@11
|
2595
|
yading@11
|
2596 if(!pkt.data && !got_picture)
|
yading@11
|
2597 ret = -1;
|
yading@11
|
2598
|
yading@11
|
2599 fail:
|
yading@11
|
2600 avcodec_free_frame(&frame);
|
yading@11
|
2601 return ret;
|
yading@11
|
2602 }
|
yading@11
|
2603
|
yading@11
|
2604 unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id)
|
yading@11
|
2605 {
|
yading@11
|
2606 while (tags->id != AV_CODEC_ID_NONE) {
|
yading@11
|
2607 if (tags->id == id)
|
yading@11
|
2608 return tags->tag;
|
yading@11
|
2609 tags++;
|
yading@11
|
2610 }
|
yading@11
|
2611 return 0;
|
yading@11
|
2612 }
|
yading@11
|
2613
|
yading@11
|
2614 enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
|
yading@11
|
2615 {
|
yading@11
|
2616 int i;
|
yading@11
|
2617 for(i=0; tags[i].id != AV_CODEC_ID_NONE;i++) {
|
yading@11
|
2618 if(tag == tags[i].tag)
|
yading@11
|
2619 return tags[i].id;
|
yading@11
|
2620 }
|
yading@11
|
2621 for(i=0; tags[i].id != AV_CODEC_ID_NONE; i++) {
|
yading@11
|
2622 if (avpriv_toupper4(tag) == avpriv_toupper4(tags[i].tag))
|
yading@11
|
2623 return tags[i].id;
|
yading@11
|
2624 }
|
yading@11
|
2625 return AV_CODEC_ID_NONE;
|
yading@11
|
2626 }
|
yading@11
|
2627
|
yading@11
|
2628 enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
|
yading@11
|
2629 {
|
yading@11
|
2630 if (flt) {
|
yading@11
|
2631 switch (bps) {
|
yading@11
|
2632 case 32: return be ? AV_CODEC_ID_PCM_F32BE : AV_CODEC_ID_PCM_F32LE;
|
yading@11
|
2633 case 64: return be ? AV_CODEC_ID_PCM_F64BE : AV_CODEC_ID_PCM_F64LE;
|
yading@11
|
2634 default: return AV_CODEC_ID_NONE;
|
yading@11
|
2635 }
|
yading@11
|
2636 } else {
|
yading@11
|
2637 bps += 7;
|
yading@11
|
2638 bps >>= 3;
|
yading@11
|
2639 if (sflags & (1 << (bps - 1))) {
|
yading@11
|
2640 switch (bps) {
|
yading@11
|
2641 case 1: return AV_CODEC_ID_PCM_S8;
|
yading@11
|
2642 case 2: return be ? AV_CODEC_ID_PCM_S16BE : AV_CODEC_ID_PCM_S16LE;
|
yading@11
|
2643 case 3: return be ? AV_CODEC_ID_PCM_S24BE : AV_CODEC_ID_PCM_S24LE;
|
yading@11
|
2644 case 4: return be ? AV_CODEC_ID_PCM_S32BE : AV_CODEC_ID_PCM_S32LE;
|
yading@11
|
2645 default: return AV_CODEC_ID_NONE;
|
yading@11
|
2646 }
|
yading@11
|
2647 } else {
|
yading@11
|
2648 switch (bps) {
|
yading@11
|
2649 case 1: return AV_CODEC_ID_PCM_U8;
|
yading@11
|
2650 case 2: return be ? AV_CODEC_ID_PCM_U16BE : AV_CODEC_ID_PCM_U16LE;
|
yading@11
|
2651 case 3: return be ? AV_CODEC_ID_PCM_U24BE : AV_CODEC_ID_PCM_U24LE;
|
yading@11
|
2652 case 4: return be ? AV_CODEC_ID_PCM_U32BE : AV_CODEC_ID_PCM_U32LE;
|
yading@11
|
2653 default: return AV_CODEC_ID_NONE;
|
yading@11
|
2654 }
|
yading@11
|
2655 }
|
yading@11
|
2656 }
|
yading@11
|
2657 }
|
yading@11
|
2658
|
yading@11
|
2659 unsigned int av_codec_get_tag(const AVCodecTag * const *tags, enum AVCodecID id)
|
yading@11
|
2660 {
|
yading@11
|
2661 unsigned int tag;
|
yading@11
|
2662 if (!av_codec_get_tag2(tags, id, &tag))
|
yading@11
|
2663 return 0;
|
yading@11
|
2664 return tag;
|
yading@11
|
2665 }
|
yading@11
|
2666
|
yading@11
|
2667 int av_codec_get_tag2(const AVCodecTag * const *tags, enum AVCodecID id,
|
yading@11
|
2668 unsigned int *tag)
|
yading@11
|
2669 {
|
yading@11
|
2670 int i;
|
yading@11
|
2671 for(i=0; tags && tags[i]; i++){
|
yading@11
|
2672 const AVCodecTag *codec_tags = tags[i];
|
yading@11
|
2673 while (codec_tags->id != AV_CODEC_ID_NONE) {
|
yading@11
|
2674 if (codec_tags->id == id) {
|
yading@11
|
2675 *tag = codec_tags->tag;
|
yading@11
|
2676 return 1;
|
yading@11
|
2677 }
|
yading@11
|
2678 codec_tags++;
|
yading@11
|
2679 }
|
yading@11
|
2680 }
|
yading@11
|
2681 return 0;
|
yading@11
|
2682 }
|
yading@11
|
2683
|
yading@11
|
2684 enum AVCodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
|
yading@11
|
2685 {
|
yading@11
|
2686 int i;
|
yading@11
|
2687 for(i=0; tags && tags[i]; i++){
|
yading@11
|
2688 enum AVCodecID id= ff_codec_get_id(tags[i], tag);
|
yading@11
|
2689 if(id!=AV_CODEC_ID_NONE) return id;
|
yading@11
|
2690 }
|
yading@11
|
2691 return AV_CODEC_ID_NONE;
|
yading@11
|
2692 }
|
yading@11
|
2693
|
yading@11
|
2694 static void compute_chapters_end(AVFormatContext *s)
|
yading@11
|
2695 {
|
yading@11
|
2696 unsigned int i, j;
|
yading@11
|
2697 int64_t max_time = s->duration + ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time);
|
yading@11
|
2698
|
yading@11
|
2699 for (i = 0; i < s->nb_chapters; i++)
|
yading@11
|
2700 if (s->chapters[i]->end == AV_NOPTS_VALUE) {
|
yading@11
|
2701 AVChapter *ch = s->chapters[i];
|
yading@11
|
2702 int64_t end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
|
yading@11
|
2703 : INT64_MAX;
|
yading@11
|
2704
|
yading@11
|
2705 for (j = 0; j < s->nb_chapters; j++) {
|
yading@11
|
2706 AVChapter *ch1 = s->chapters[j];
|
yading@11
|
2707 int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
|
yading@11
|
2708 if (j != i && next_start > ch->start && next_start < end)
|
yading@11
|
2709 end = next_start;
|
yading@11
|
2710 }
|
yading@11
|
2711 ch->end = (end == INT64_MAX) ? ch->start : end;
|
yading@11
|
2712 }
|
yading@11
|
2713 }
|
yading@11
|
2714
|
yading@11
|
2715 static int get_std_framerate(int i){
|
yading@11
|
2716 if(i<60*12) return (i+1)*1001;
|
yading@11
|
2717 else return ((const int[]){24,30,60,12,15,48})[i-60*12]*1000*12;
|
yading@11
|
2718 }
|
yading@11
|
2719
|
yading@11
|
2720 /*
|
yading@11
|
2721 * Is the time base unreliable.
|
yading@11
|
2722 * This is a heuristic to balance between quick acceptance of the values in
|
yading@11
|
2723 * the headers vs. some extra checks.
|
yading@11
|
2724 * Old DivX and Xvid often have nonsense timebases like 1fps or 2fps.
|
yading@11
|
2725 * MPEG-2 commonly misuses field repeat flags to store different framerates.
|
yading@11
|
2726 * And there are "variable" fps files this needs to detect as well.
|
yading@11
|
2727 */
|
yading@11
|
2728 static int tb_unreliable(AVCodecContext *c){
|
yading@11
|
2729 if( c->time_base.den >= 101L*c->time_base.num
|
yading@11
|
2730 || c->time_base.den < 5L*c->time_base.num
|
yading@11
|
2731 /* || c->codec_tag == AV_RL32("DIVX")
|
yading@11
|
2732 || c->codec_tag == AV_RL32("XVID")*/
|
yading@11
|
2733 || c->codec_tag == AV_RL32("mp4v")
|
yading@11
|
2734 || c->codec_id == AV_CODEC_ID_MPEG2VIDEO
|
yading@11
|
2735 || c->codec_id == AV_CODEC_ID_H264
|
yading@11
|
2736 )
|
yading@11
|
2737 return 1;
|
yading@11
|
2738 return 0;
|
yading@11
|
2739 }
|
yading@11
|
2740
|
yading@11
|
2741 #if FF_API_FORMAT_PARAMETERS
|
yading@11
|
2742 int av_find_stream_info(AVFormatContext *ic)
|
yading@11
|
2743 {
|
yading@11
|
2744 return avformat_find_stream_info(ic, NULL);
|
yading@11
|
2745 }
|
yading@11
|
2746 #endif
|
yading@11
|
2747
|
yading@11
|
2748 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
|
yading@11
|
2749 {
|
yading@11
|
2750 int i, count, ret, j;
|
yading@11
|
2751 int64_t read_size;
|
yading@11
|
2752 AVStream *st;
|
yading@11
|
2753 AVPacket pkt1, *pkt;
|
yading@11
|
2754 int64_t old_offset = avio_tell(ic->pb);
|
yading@11
|
2755 int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
|
yading@11
|
2756 int flush_codecs = ic->probesize > 0;
|
yading@11
|
2757
|
yading@11
|
2758 if(ic->pb)
|
yading@11
|
2759 av_log(ic, AV_LOG_DEBUG, "File position before avformat_find_stream_info() is %"PRId64"\n", avio_tell(ic->pb));
|
yading@11
|
2760
|
yading@11
|
2761 for(i=0;i<ic->nb_streams;i++) {
|
yading@11
|
2762 const AVCodec *codec;
|
yading@11
|
2763 AVDictionary *thread_opt = NULL;
|
yading@11
|
2764 st = ic->streams[i];
|
yading@11
|
2765
|
yading@11
|
2766 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
|
yading@11
|
2767 st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
|
yading@11
|
2768 /* if(!st->time_base.num)
|
yading@11
|
2769 st->time_base= */
|
yading@11
|
2770 if(!st->codec->time_base.num)
|
yading@11
|
2771 st->codec->time_base= st->time_base;
|
yading@11
|
2772 }
|
yading@11
|
2773 //only for the split stuff
|
yading@11
|
2774 if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
|
yading@11
|
2775 st->parser = av_parser_init(st->codec->codec_id);
|
yading@11
|
2776 if(st->parser){
|
yading@11
|
2777 if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
|
yading@11
|
2778 st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
|
yading@11
|
2779 } else if(st->need_parsing == AVSTREAM_PARSE_FULL_RAW) {
|
yading@11
|
2780 st->parser->flags |= PARSER_FLAG_USE_CODEC_TS;
|
yading@11
|
2781 }
|
yading@11
|
2782 } else if (st->need_parsing) {
|
yading@11
|
2783 av_log(ic, AV_LOG_VERBOSE, "parser not found for codec "
|
yading@11
|
2784 "%s, packets or times may be invalid.\n",
|
yading@11
|
2785 avcodec_get_name(st->codec->codec_id));
|
yading@11
|
2786 }
|
yading@11
|
2787 }
|
yading@11
|
2788 codec = st->codec->codec ? st->codec->codec :
|
yading@11
|
2789 avcodec_find_decoder(st->codec->codec_id);
|
yading@11
|
2790
|
yading@11
|
2791 /* force thread count to 1 since the h264 decoder will not extract SPS
|
yading@11
|
2792 * and PPS to extradata during multi-threaded decoding */
|
yading@11
|
2793 av_dict_set(options ? &options[i] : &thread_opt, "threads", "1", 0);
|
yading@11
|
2794
|
yading@11
|
2795 /* Ensure that subtitle_header is properly set. */
|
yading@11
|
2796 if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
|
yading@11
|
2797 && codec && !st->codec->codec)
|
yading@11
|
2798 avcodec_open2(st->codec, codec, options ? &options[i]
|
yading@11
|
2799 : &thread_opt);
|
yading@11
|
2800
|
yading@11
|
2801 //try to just open decoders, in case this is enough to get parameters
|
yading@11
|
2802 if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
|
yading@11
|
2803 if (codec && !st->codec->codec)
|
yading@11
|
2804 avcodec_open2(st->codec, codec, options ? &options[i]
|
yading@11
|
2805 : &thread_opt);
|
yading@11
|
2806 }
|
yading@11
|
2807 if (!options)
|
yading@11
|
2808 av_dict_free(&thread_opt);
|
yading@11
|
2809 }
|
yading@11
|
2810
|
yading@11
|
2811 for (i=0; i<ic->nb_streams; i++) {
|
yading@11
|
2812 #if FF_API_R_FRAME_RATE
|
yading@11
|
2813 ic->streams[i]->info->last_dts = AV_NOPTS_VALUE;
|
yading@11
|
2814 #endif
|
yading@11
|
2815 ic->streams[i]->info->fps_first_dts = AV_NOPTS_VALUE;
|
yading@11
|
2816 ic->streams[i]->info->fps_last_dts = AV_NOPTS_VALUE;
|
yading@11
|
2817 }
|
yading@11
|
2818
|
yading@11
|
2819 count = 0;
|
yading@11
|
2820 read_size = 0;
|
yading@11
|
2821 for(;;) {
|
yading@11
|
2822 if (ff_check_interrupt(&ic->interrupt_callback)){
|
yading@11
|
2823 ret= AVERROR_EXIT;
|
yading@11
|
2824 av_log(ic, AV_LOG_DEBUG, "interrupted\n");
|
yading@11
|
2825 break;
|
yading@11
|
2826 }
|
yading@11
|
2827
|
yading@11
|
2828 /* check if one codec still needs to be handled */
|
yading@11
|
2829 for(i=0;i<ic->nb_streams;i++) {
|
yading@11
|
2830 int fps_analyze_framecount = 20;
|
yading@11
|
2831
|
yading@11
|
2832 st = ic->streams[i];
|
yading@11
|
2833 if (!has_codec_parameters(st, NULL))
|
yading@11
|
2834 break;
|
yading@11
|
2835 /* if the timebase is coarse (like the usual millisecond precision
|
yading@11
|
2836 of mkv), we need to analyze more frames to reliably arrive at
|
yading@11
|
2837 the correct fps */
|
yading@11
|
2838 if (av_q2d(st->time_base) > 0.0005)
|
yading@11
|
2839 fps_analyze_framecount *= 2;
|
yading@11
|
2840 if (ic->fps_probe_size >= 0)
|
yading@11
|
2841 fps_analyze_framecount = ic->fps_probe_size;
|
yading@11
|
2842 if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
|
yading@11
|
2843 fps_analyze_framecount = 0;
|
yading@11
|
2844 /* variable fps and no guess at the real fps */
|
yading@11
|
2845 if( tb_unreliable(st->codec) && !(st->r_frame_rate.num && st->avg_frame_rate.num)
|
yading@11
|
2846 && st->info->duration_count < fps_analyze_framecount
|
yading@11
|
2847 && st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
|
yading@11
|
2848 break;
|
yading@11
|
2849 if(st->parser && st->parser->parser->split && !st->codec->extradata)
|
yading@11
|
2850 break;
|
yading@11
|
2851 if (st->first_dts == AV_NOPTS_VALUE &&
|
yading@11
|
2852 (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
|
yading@11
|
2853 st->codec->codec_type == AVMEDIA_TYPE_AUDIO))
|
yading@11
|
2854 break;
|
yading@11
|
2855 }
|
yading@11
|
2856 if (i == ic->nb_streams) {
|
yading@11
|
2857 /* NOTE: if the format has no header, then we need to read
|
yading@11
|
2858 some packets to get most of the streams, so we cannot
|
yading@11
|
2859 stop here */
|
yading@11
|
2860 if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
|
yading@11
|
2861 /* if we found the info for all the codecs, we can stop */
|
yading@11
|
2862 ret = count;
|
yading@11
|
2863 av_log(ic, AV_LOG_DEBUG, "All info found\n");
|
yading@11
|
2864 flush_codecs = 0;
|
yading@11
|
2865 break;
|
yading@11
|
2866 }
|
yading@11
|
2867 }
|
yading@11
|
2868 /* we did not get all the codec info, but we read too much data */
|
yading@11
|
2869 if (read_size >= ic->probesize) {
|
yading@11
|
2870 ret = count;
|
yading@11
|
2871 av_log(ic, AV_LOG_DEBUG, "Probe buffer size limit of %d bytes reached\n", ic->probesize);
|
yading@11
|
2872 for (i = 0; i < ic->nb_streams; i++)
|
yading@11
|
2873 if (!ic->streams[i]->r_frame_rate.num &&
|
yading@11
|
2874 ic->streams[i]->info->duration_count <= 1)
|
yading@11
|
2875 av_log(ic, AV_LOG_WARNING,
|
yading@11
|
2876 "Stream #%d: not enough frames to estimate rate; "
|
yading@11
|
2877 "consider increasing probesize\n", i);
|
yading@11
|
2878 break;
|
yading@11
|
2879 }
|
yading@11
|
2880
|
yading@11
|
2881 /* NOTE: a new stream can be added there if no header in file
|
yading@11
|
2882 (AVFMTCTX_NOHEADER) */
|
yading@11
|
2883 ret = read_frame_internal(ic, &pkt1);
|
yading@11
|
2884 if (ret == AVERROR(EAGAIN))
|
yading@11
|
2885 continue;
|
yading@11
|
2886
|
yading@11
|
2887 if (ret < 0) {
|
yading@11
|
2888 /* EOF or error*/
|
yading@11
|
2889 break;
|
yading@11
|
2890 }
|
yading@11
|
2891
|
yading@11
|
2892 if (ic->flags & AVFMT_FLAG_NOBUFFER) {
|
yading@11
|
2893 pkt = &pkt1;
|
yading@11
|
2894 } else {
|
yading@11
|
2895 pkt = add_to_pktbuf(&ic->packet_buffer, &pkt1,
|
yading@11
|
2896 &ic->packet_buffer_end);
|
yading@11
|
2897 if ((ret = av_dup_packet(pkt)) < 0)
|
yading@11
|
2898 goto find_stream_info_err;
|
yading@11
|
2899 }
|
yading@11
|
2900
|
yading@11
|
2901 read_size += pkt->size;
|
yading@11
|
2902
|
yading@11
|
2903 st = ic->streams[pkt->stream_index];
|
yading@11
|
2904 if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
|
yading@11
|
2905 /* check for non-increasing dts */
|
yading@11
|
2906 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
|
yading@11
|
2907 st->info->fps_last_dts >= pkt->dts) {
|
yading@11
|
2908 av_log(ic, AV_LOG_DEBUG, "Non-increasing DTS in stream %d: "
|
yading@11
|
2909 "packet %d with DTS %"PRId64", packet %d with DTS "
|
yading@11
|
2910 "%"PRId64"\n", st->index, st->info->fps_last_dts_idx,
|
yading@11
|
2911 st->info->fps_last_dts, st->codec_info_nb_frames, pkt->dts);
|
yading@11
|
2912 st->info->fps_first_dts = st->info->fps_last_dts = AV_NOPTS_VALUE;
|
yading@11
|
2913 }
|
yading@11
|
2914 /* check for a discontinuity in dts - if the difference in dts
|
yading@11
|
2915 * is more than 1000 times the average packet duration in the sequence,
|
yading@11
|
2916 * we treat it as a discontinuity */
|
yading@11
|
2917 if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
|
yading@11
|
2918 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
|
yading@11
|
2919 (pkt->dts - st->info->fps_last_dts) / 1000 >
|
yading@11
|
2920 (st->info->fps_last_dts - st->info->fps_first_dts) / (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
|
yading@11
|
2921 av_log(ic, AV_LOG_WARNING, "DTS discontinuity in stream %d: "
|
yading@11
|
2922 "packet %d with DTS %"PRId64", packet %d with DTS "
|
yading@11
|
2923 "%"PRId64"\n", st->index, st->info->fps_last_dts_idx,
|
yading@11
|
2924 st->info->fps_last_dts, st->codec_info_nb_frames, pkt->dts);
|
yading@11
|
2925 st->info->fps_first_dts = st->info->fps_last_dts = AV_NOPTS_VALUE;
|
yading@11
|
2926 }
|
yading@11
|
2927
|
yading@11
|
2928 /* update stored dts values */
|
yading@11
|
2929 if (st->info->fps_first_dts == AV_NOPTS_VALUE) {
|
yading@11
|
2930 st->info->fps_first_dts = pkt->dts;
|
yading@11
|
2931 st->info->fps_first_dts_idx = st->codec_info_nb_frames;
|
yading@11
|
2932 }
|
yading@11
|
2933 st->info->fps_last_dts = pkt->dts;
|
yading@11
|
2934 st->info->fps_last_dts_idx = st->codec_info_nb_frames;
|
yading@11
|
2935 }
|
yading@11
|
2936 if (st->codec_info_nb_frames>1) {
|
yading@11
|
2937 int64_t t=0;
|
yading@11
|
2938 if (st->time_base.den > 0)
|
yading@11
|
2939 t = av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q);
|
yading@11
|
2940 if (st->avg_frame_rate.num > 0)
|
yading@11
|
2941 t = FFMAX(t, av_rescale_q(st->codec_info_nb_frames, av_inv_q(st->avg_frame_rate), AV_TIME_BASE_Q));
|
yading@11
|
2942
|
yading@11
|
2943 if (t >= ic->max_analyze_duration) {
|
yading@11
|
2944 av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64" microseconds\n", ic->max_analyze_duration, t);
|
yading@11
|
2945 break;
|
yading@11
|
2946 }
|
yading@11
|
2947 if (pkt->duration) {
|
yading@11
|
2948 st->info->codec_info_duration += pkt->duration;
|
yading@11
|
2949 st->info->codec_info_duration_fields += st->parser && st->codec->ticks_per_frame==2 ? st->parser->repeat_pict + 1 : 2;
|
yading@11
|
2950 }
|
yading@11
|
2951 }
|
yading@11
|
2952 #if FF_API_R_FRAME_RATE
|
yading@11
|
2953 {
|
yading@11
|
2954 int64_t last = st->info->last_dts;
|
yading@11
|
2955
|
yading@11
|
2956 if( pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last
|
yading@11
|
2957 && pkt->dts - (uint64_t)last < INT64_MAX){
|
yading@11
|
2958 double dts= (is_relative(pkt->dts) ? pkt->dts - RELATIVE_TS_BASE : pkt->dts) * av_q2d(st->time_base);
|
yading@11
|
2959 int64_t duration= pkt->dts - last;
|
yading@11
|
2960
|
yading@11
|
2961 if (!st->info->duration_error)
|
yading@11
|
2962 st->info->duration_error = av_mallocz(sizeof(st->info->duration_error[0])*2);
|
yading@11
|
2963
|
yading@11
|
2964 // if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
|
yading@11
|
2965 // av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
|
yading@11
|
2966 for (i=0; i<MAX_STD_TIMEBASES; i++) {
|
yading@11
|
2967 int framerate= get_std_framerate(i);
|
yading@11
|
2968 double sdts= dts*framerate/(1001*12);
|
yading@11
|
2969 for(j=0; j<2; j++){
|
yading@11
|
2970 int64_t ticks= llrint(sdts+j*0.5);
|
yading@11
|
2971 double error= sdts - ticks + j*0.5;
|
yading@11
|
2972 st->info->duration_error[j][0][i] += error;
|
yading@11
|
2973 st->info->duration_error[j][1][i] += error*error;
|
yading@11
|
2974 }
|
yading@11
|
2975 }
|
yading@11
|
2976 st->info->duration_count++;
|
yading@11
|
2977 // ignore the first 4 values, they might have some random jitter
|
yading@11
|
2978 if (st->info->duration_count > 3 && is_relative(pkt->dts) == is_relative(last))
|
yading@11
|
2979 st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);
|
yading@11
|
2980 }
|
yading@11
|
2981 if (pkt->dts != AV_NOPTS_VALUE)
|
yading@11
|
2982 st->info->last_dts = pkt->dts;
|
yading@11
|
2983 }
|
yading@11
|
2984 #endif
|
yading@11
|
2985 if(st->parser && st->parser->parser->split && !st->codec->extradata){
|
yading@11
|
2986 int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
|
yading@11
|
2987 if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
|
yading@11
|
2988 st->codec->extradata_size= i;
|
yading@11
|
2989 st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
|
yading@11
|
2990 if (!st->codec->extradata)
|
yading@11
|
2991 return AVERROR(ENOMEM);
|
yading@11
|
2992 memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
|
yading@11
|
2993 memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
|
yading@11
|
2994 }
|
yading@11
|
2995 }
|
yading@11
|
2996
|
yading@11
|
2997 /* if still no information, we try to open the codec and to
|
yading@11
|
2998 decompress the frame. We try to avoid that in most cases as
|
yading@11
|
2999 it takes longer and uses more memory. For MPEG-4, we need to
|
yading@11
|
3000 decompress for QuickTime.
|
yading@11
|
3001
|
yading@11
|
3002 If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
|
yading@11
|
3003 least one frame of codec data, this makes sure the codec initializes
|
yading@11
|
3004 the channel configuration and does not only trust the values from the container.
|
yading@11
|
3005 */
|
yading@11
|
3006 try_decode_frame(st, pkt, (options && i < orig_nb_streams ) ? &options[i] : NULL);
|
yading@11
|
3007
|
yading@11
|
3008 st->codec_info_nb_frames++;
|
yading@11
|
3009 count++;
|
yading@11
|
3010 }
|
yading@11
|
3011
|
yading@11
|
3012 if (flush_codecs) {
|
yading@11
|
3013 AVPacket empty_pkt = { 0 };
|
yading@11
|
3014 int err = 0;
|
yading@11
|
3015 av_init_packet(&empty_pkt);
|
yading@11
|
3016
|
yading@11
|
3017 ret = -1; /* we could not have all the codec parameters before EOF */
|
yading@11
|
3018 for(i=0;i<ic->nb_streams;i++) {
|
yading@11
|
3019 const char *errmsg;
|
yading@11
|
3020
|
yading@11
|
3021 st = ic->streams[i];
|
yading@11
|
3022
|
yading@11
|
3023 /* flush the decoders */
|
yading@11
|
3024 if (st->info->found_decoder == 1) {
|
yading@11
|
3025 do {
|
yading@11
|
3026 err = try_decode_frame(st, &empty_pkt,
|
yading@11
|
3027 (options && i < orig_nb_streams) ?
|
yading@11
|
3028 &options[i] : NULL);
|
yading@11
|
3029 } while (err > 0 && !has_codec_parameters(st, NULL));
|
yading@11
|
3030
|
yading@11
|
3031 if (err < 0) {
|
yading@11
|
3032 av_log(ic, AV_LOG_INFO,
|
yading@11
|
3033 "decoding for stream %d failed\n", st->index);
|
yading@11
|
3034 }
|
yading@11
|
3035 }
|
yading@11
|
3036
|
yading@11
|
3037 if (!has_codec_parameters(st, &errmsg)) {
|
yading@11
|
3038 char buf[256];
|
yading@11
|
3039 avcodec_string(buf, sizeof(buf), st->codec, 0);
|
yading@11
|
3040 av_log(ic, AV_LOG_WARNING,
|
yading@11
|
3041 "Could not find codec parameters for stream %d (%s): %s\n"
|
yading@11
|
3042 "Consider increasing the value for the 'analyzeduration' and 'probesize' options\n",
|
yading@11
|
3043 i, buf, errmsg);
|
yading@11
|
3044 } else {
|
yading@11
|
3045 ret = 0;
|
yading@11
|
3046 }
|
yading@11
|
3047 }
|
yading@11
|
3048 }
|
yading@11
|
3049
|
yading@11
|
3050 // close codecs which were opened in try_decode_frame()
|
yading@11
|
3051 for(i=0;i<ic->nb_streams;i++) {
|
yading@11
|
3052 st = ic->streams[i];
|
yading@11
|
3053 avcodec_close(st->codec);
|
yading@11
|
3054 }
|
yading@11
|
3055 for(i=0;i<ic->nb_streams;i++) {
|
yading@11
|
3056 st = ic->streams[i];
|
yading@11
|
3057 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
|
yading@11
|
3058 if(st->codec->codec_id == AV_CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
|
yading@11
|
3059 uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
|
yading@11
|
3060 if (avpriv_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
|
yading@11
|
3061 st->codec->codec_tag= tag;
|
yading@11
|
3062 }
|
yading@11
|
3063
|
yading@11
|
3064 /* estimate average framerate if not set by demuxer */
|
yading@11
|
3065 if (st->info->codec_info_duration_fields && !st->avg_frame_rate.num && st->info->codec_info_duration) {
|
yading@11
|
3066 int best_fps = 0;
|
yading@11
|
3067 double best_error = 0.01;
|
yading@11
|
3068
|
yading@11
|
3069 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
|
yading@11
|
3070 st->info->codec_info_duration_fields*(int64_t)st->time_base.den,
|
yading@11
|
3071 st->info->codec_info_duration*2*(int64_t)st->time_base.num, 60000);
|
yading@11
|
3072
|
yading@11
|
3073 /* round guessed framerate to a "standard" framerate if it's
|
yading@11
|
3074 * within 1% of the original estimate*/
|
yading@11
|
3075 for (j = 1; j < MAX_STD_TIMEBASES; j++) {
|
yading@11
|
3076 AVRational std_fps = { get_std_framerate(j), 12*1001 };
|
yading@11
|
3077 double error = fabs(av_q2d(st->avg_frame_rate) / av_q2d(std_fps) - 1);
|
yading@11
|
3078
|
yading@11
|
3079 if (error < best_error) {
|
yading@11
|
3080 best_error = error;
|
yading@11
|
3081 best_fps = std_fps.num;
|
yading@11
|
3082 }
|
yading@11
|
3083 }
|
yading@11
|
3084 if (best_fps) {
|
yading@11
|
3085 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
|
yading@11
|
3086 best_fps, 12*1001, INT_MAX);
|
yading@11
|
3087 }
|
yading@11
|
3088 }
|
yading@11
|
3089 // the check for tb_unreliable() is not completely correct, since this is not about handling
|
yading@11
|
3090 // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
|
yading@11
|
3091 // ipmovie.c produces.
|
yading@11
|
3092 if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !st->r_frame_rate.num)
|
yading@11
|
3093 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * st->info->duration_gcd, INT_MAX);
|
yading@11
|
3094 if (st->info->duration_count>1 && !st->r_frame_rate.num
|
yading@11
|
3095 && tb_unreliable(st->codec)) {
|
yading@11
|
3096 int num = 0;
|
yading@11
|
3097 double best_error= 0.01;
|
yading@11
|
3098
|
yading@11
|
3099 for (j=0; j<MAX_STD_TIMEBASES; j++) {
|
yading@11
|
3100 int k;
|
yading@11
|
3101
|
yading@11
|
3102 if(st->info->codec_info_duration && st->info->codec_info_duration*av_q2d(st->time_base) < (1001*12.0)/get_std_framerate(j))
|
yading@11
|
3103 continue;
|
yading@11
|
3104 if(!st->info->codec_info_duration && 1.0 < (1001*12.0)/get_std_framerate(j))
|
yading@11
|
3105 continue;
|
yading@11
|
3106 for(k=0; k<2; k++){
|
yading@11
|
3107 int n= st->info->duration_count;
|
yading@11
|
3108 double a= st->info->duration_error[k][0][j] / n;
|
yading@11
|
3109 double error= st->info->duration_error[k][1][j]/n - a*a;
|
yading@11
|
3110
|
yading@11
|
3111 if(error < best_error && best_error> 0.000000001){
|
yading@11
|
3112 best_error= error;
|
yading@11
|
3113 num = get_std_framerate(j);
|
yading@11
|
3114 }
|
yading@11
|
3115 if(error < 0.02)
|
yading@11
|
3116 av_log(NULL, AV_LOG_DEBUG, "rfps: %f %f\n", get_std_framerate(j) / 12.0/1001, error);
|
yading@11
|
3117 }
|
yading@11
|
3118 }
|
yading@11
|
3119 // do not increase frame rate by more than 1 % in order to match a standard rate.
|
yading@11
|
3120 if (num && (!st->r_frame_rate.num || (double)num/(12*1001) < 1.01 * av_q2d(st->r_frame_rate)))
|
yading@11
|
3121 av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, num, 12*1001, INT_MAX);
|
yading@11
|
3122 }
|
yading@11
|
3123
|
yading@11
|
3124 if (!st->r_frame_rate.num){
|
yading@11
|
3125 if( st->codec->time_base.den * (int64_t)st->time_base.num
|
yading@11
|
3126 <= st->codec->time_base.num * st->codec->ticks_per_frame * (int64_t)st->time_base.den){
|
yading@11
|
3127 st->r_frame_rate.num = st->codec->time_base.den;
|
yading@11
|
3128 st->r_frame_rate.den = st->codec->time_base.num * st->codec->ticks_per_frame;
|
yading@11
|
3129 }else{
|
yading@11
|
3130 st->r_frame_rate.num = st->time_base.den;
|
yading@11
|
3131 st->r_frame_rate.den = st->time_base.num;
|
yading@11
|
3132 }
|
yading@11
|
3133 }
|
yading@11
|
3134 }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
|
yading@11
|
3135 if(!st->codec->bits_per_coded_sample)
|
yading@11
|
3136 st->codec->bits_per_coded_sample= av_get_bits_per_sample(st->codec->codec_id);
|
yading@11
|
3137 // set stream disposition based on audio service type
|
yading@11
|
3138 switch (st->codec->audio_service_type) {
|
yading@11
|
3139 case AV_AUDIO_SERVICE_TYPE_EFFECTS:
|
yading@11
|
3140 st->disposition = AV_DISPOSITION_CLEAN_EFFECTS; break;
|
yading@11
|
3141 case AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED:
|
yading@11
|
3142 st->disposition = AV_DISPOSITION_VISUAL_IMPAIRED; break;
|
yading@11
|
3143 case AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED:
|
yading@11
|
3144 st->disposition = AV_DISPOSITION_HEARING_IMPAIRED; break;
|
yading@11
|
3145 case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
|
yading@11
|
3146 st->disposition = AV_DISPOSITION_COMMENT; break;
|
yading@11
|
3147 case AV_AUDIO_SERVICE_TYPE_KARAOKE:
|
yading@11
|
3148 st->disposition = AV_DISPOSITION_KARAOKE; break;
|
yading@11
|
3149 }
|
yading@11
|
3150 }
|
yading@11
|
3151 }
|
yading@11
|
3152
|
yading@11
|
3153 if(ic->probesize)
|
yading@11
|
3154 estimate_timings(ic, old_offset);
|
yading@11
|
3155
|
yading@11
|
3156 compute_chapters_end(ic);
|
yading@11
|
3157
|
yading@11
|
3158 find_stream_info_err:
|
yading@11
|
3159 for (i=0; i < ic->nb_streams; i++) {
|
yading@11
|
3160 st = ic->streams[i];
|
yading@11
|
3161 if (ic->streams[i]->codec)
|
yading@11
|
3162 ic->streams[i]->codec->thread_count = 0;
|
yading@11
|
3163 if (st->info)
|
yading@11
|
3164 av_freep(&st->info->duration_error);
|
yading@11
|
3165 av_freep(&ic->streams[i]->info);
|
yading@11
|
3166 }
|
yading@11
|
3167 if(ic->pb)
|
yading@11
|
3168 av_log(ic, AV_LOG_DEBUG, "File position after avformat_find_stream_info() is %"PRId64"\n", avio_tell(ic->pb));
|
yading@11
|
3169 return ret;
|
yading@11
|
3170 }
|
yading@11
|
3171
|
yading@11
|
3172 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
|
yading@11
|
3173 {
|
yading@11
|
3174 int i, j;
|
yading@11
|
3175
|
yading@11
|
3176 for (i = 0; i < ic->nb_programs; i++) {
|
yading@11
|
3177 if (ic->programs[i] == last) {
|
yading@11
|
3178 last = NULL;
|
yading@11
|
3179 } else {
|
yading@11
|
3180 if (!last)
|
yading@11
|
3181 for (j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
|
yading@11
|
3182 if (ic->programs[i]->stream_index[j] == s)
|
yading@11
|
3183 return ic->programs[i];
|
yading@11
|
3184 }
|
yading@11
|
3185 }
|
yading@11
|
3186 return NULL;
|
yading@11
|
3187 }
|
yading@11
|
3188
|
yading@11
|
3189 int av_find_best_stream(AVFormatContext *ic,
|
yading@11
|
3190 enum AVMediaType type,
|
yading@11
|
3191 int wanted_stream_nb,
|
yading@11
|
3192 int related_stream,
|
yading@11
|
3193 AVCodec **decoder_ret,
|
yading@11
|
3194 int flags)
|
yading@11
|
3195 {
|
yading@11
|
3196 int i, nb_streams = ic->nb_streams;
|
yading@11
|
3197 int ret = AVERROR_STREAM_NOT_FOUND, best_count = -1, best_bitrate = -1, best_multiframe = -1, count, bitrate, multiframe;
|
yading@11
|
3198 unsigned *program = NULL;
|
yading@11
|
3199 AVCodec *decoder = NULL, *best_decoder = NULL;
|
yading@11
|
3200
|
yading@11
|
3201 if (related_stream >= 0 && wanted_stream_nb < 0) {
|
yading@11
|
3202 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
|
yading@11
|
3203 if (p) {
|
yading@11
|
3204 program = p->stream_index;
|
yading@11
|
3205 nb_streams = p->nb_stream_indexes;
|
yading@11
|
3206 }
|
yading@11
|
3207 }
|
yading@11
|
3208 for (i = 0; i < nb_streams; i++) {
|
yading@11
|
3209 int real_stream_index = program ? program[i] : i;
|
yading@11
|
3210 AVStream *st = ic->streams[real_stream_index];
|
yading@11
|
3211 AVCodecContext *avctx = st->codec;
|
yading@11
|
3212 if (avctx->codec_type != type)
|
yading@11
|
3213 continue;
|
yading@11
|
3214 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
|
yading@11
|
3215 continue;
|
yading@11
|
3216 if (st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_VISUAL_IMPAIRED))
|
yading@11
|
3217 continue;
|
yading@11
|
3218 if (decoder_ret) {
|
yading@11
|
3219 decoder = avcodec_find_decoder(st->codec->codec_id);
|
yading@11
|
3220 if (!decoder) {
|
yading@11
|
3221 if (ret < 0)
|
yading@11
|
3222 ret = AVERROR_DECODER_NOT_FOUND;
|
yading@11
|
3223 continue;
|
yading@11
|
3224 }
|
yading@11
|
3225 }
|
yading@11
|
3226 count = st->codec_info_nb_frames;
|
yading@11
|
3227 bitrate = avctx->bit_rate;
|
yading@11
|
3228 multiframe = FFMIN(5, count);
|
yading@11
|
3229 if ((best_multiframe > multiframe) ||
|
yading@11
|
3230 (best_multiframe == multiframe && best_bitrate > bitrate) ||
|
yading@11
|
3231 (best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
|
yading@11
|
3232 continue;
|
yading@11
|
3233 best_count = count;
|
yading@11
|
3234 best_bitrate = bitrate;
|
yading@11
|
3235 best_multiframe = multiframe;
|
yading@11
|
3236 ret = real_stream_index;
|
yading@11
|
3237 best_decoder = decoder;
|
yading@11
|
3238 if (program && i == nb_streams - 1 && ret < 0) {
|
yading@11
|
3239 program = NULL;
|
yading@11
|
3240 nb_streams = ic->nb_streams;
|
yading@11
|
3241 i = 0; /* no related stream found, try again with everything */
|
yading@11
|
3242 }
|
yading@11
|
3243 }
|
yading@11
|
3244 if (decoder_ret)
|
yading@11
|
3245 *decoder_ret = best_decoder;
|
yading@11
|
3246 return ret;
|
yading@11
|
3247 }
|
yading@11
|
3248
|
yading@11
|
3249 /*******************************************************/
|
yading@11
|
3250
|
yading@11
|
3251 int av_read_play(AVFormatContext *s)
|
yading@11
|
3252 {
|
yading@11
|
3253 if (s->iformat->read_play)
|
yading@11
|
3254 return s->iformat->read_play(s);
|
yading@11
|
3255 if (s->pb)
|
yading@11
|
3256 return avio_pause(s->pb, 0);
|
yading@11
|
3257 return AVERROR(ENOSYS);
|
yading@11
|
3258 }
|
yading@11
|
3259
|
yading@11
|
3260 int av_read_pause(AVFormatContext *s)
|
yading@11
|
3261 {
|
yading@11
|
3262 if (s->iformat->read_pause)
|
yading@11
|
3263 return s->iformat->read_pause(s);
|
yading@11
|
3264 if (s->pb)
|
yading@11
|
3265 return avio_pause(s->pb, 1);
|
yading@11
|
3266 return AVERROR(ENOSYS);
|
yading@11
|
3267 }
|
yading@11
|
3268
|
yading@11
|
3269 void ff_free_stream(AVFormatContext *s, AVStream *st){
|
yading@11
|
3270 av_assert0(s->nb_streams>0);
|
yading@11
|
3271 av_assert0(s->streams[ s->nb_streams-1 ] == st);
|
yading@11
|
3272
|
yading@11
|
3273 if (st->parser) {
|
yading@11
|
3274 av_parser_close(st->parser);
|
yading@11
|
3275 }
|
yading@11
|
3276 if (st->attached_pic.data)
|
yading@11
|
3277 av_free_packet(&st->attached_pic);
|
yading@11
|
3278 av_dict_free(&st->metadata);
|
yading@11
|
3279 av_freep(&st->probe_data.buf);
|
yading@11
|
3280 av_freep(&st->index_entries);
|
yading@11
|
3281 av_freep(&st->codec->extradata);
|
yading@11
|
3282 av_freep(&st->codec->subtitle_header);
|
yading@11
|
3283 av_freep(&st->codec);
|
yading@11
|
3284 av_freep(&st->priv_data);
|
yading@11
|
3285 if (st->info)
|
yading@11
|
3286 av_freep(&st->info->duration_error);
|
yading@11
|
3287 av_freep(&st->info);
|
yading@11
|
3288 av_freep(&s->streams[ --s->nb_streams ]);
|
yading@11
|
3289 }
|
yading@11
|
3290
|
yading@11
|
3291 void avformat_free_context(AVFormatContext *s)
|
yading@11
|
3292 {
|
yading@11
|
3293 int i;
|
yading@11
|
3294
|
yading@11
|
3295 if (!s)
|
yading@11
|
3296 return;
|
yading@11
|
3297
|
yading@11
|
3298 av_opt_free(s);
|
yading@11
|
3299 if (s->iformat && s->iformat->priv_class && s->priv_data)
|
yading@11
|
3300 av_opt_free(s->priv_data);
|
yading@11
|
3301
|
yading@11
|
3302 for(i=s->nb_streams-1; i>=0; i--) {
|
yading@11
|
3303 ff_free_stream(s, s->streams[i]);
|
yading@11
|
3304 }
|
yading@11
|
3305 for(i=s->nb_programs-1; i>=0; i--) {
|
yading@11
|
3306 av_dict_free(&s->programs[i]->metadata);
|
yading@11
|
3307 av_freep(&s->programs[i]->stream_index);
|
yading@11
|
3308 av_freep(&s->programs[i]);
|
yading@11
|
3309 }
|
yading@11
|
3310 av_freep(&s->programs);
|
yading@11
|
3311 av_freep(&s->priv_data);
|
yading@11
|
3312 while(s->nb_chapters--) {
|
yading@11
|
3313 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
|
yading@11
|
3314 av_freep(&s->chapters[s->nb_chapters]);
|
yading@11
|
3315 }
|
yading@11
|
3316 av_freep(&s->chapters);
|
yading@11
|
3317 av_dict_free(&s->metadata);
|
yading@11
|
3318 av_freep(&s->streams);
|
yading@11
|
3319 av_free(s);
|
yading@11
|
3320 }
|
yading@11
|
3321
|
yading@11
|
3322 #if FF_API_CLOSE_INPUT_FILE
|
yading@11
|
3323 void av_close_input_file(AVFormatContext *s)
|
yading@11
|
3324 {
|
yading@11
|
3325 avformat_close_input(&s);
|
yading@11
|
3326 }
|
yading@11
|
3327 #endif
|
yading@11
|
3328
|
yading@11
|
3329 void avformat_close_input(AVFormatContext **ps)
|
yading@11
|
3330 {
|
yading@11
|
3331 AVFormatContext *s = *ps;
|
yading@11
|
3332 AVIOContext *pb = s->pb;
|
yading@11
|
3333
|
yading@11
|
3334 if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
|
yading@11
|
3335 (s->flags & AVFMT_FLAG_CUSTOM_IO))
|
yading@11
|
3336 pb = NULL;
|
yading@11
|
3337
|
yading@11
|
3338 flush_packet_queue(s);
|
yading@11
|
3339
|
yading@11
|
3340 if (s->iformat) {
|
yading@11
|
3341 if (s->iformat->read_close)
|
yading@11
|
3342 s->iformat->read_close(s);
|
yading@11
|
3343 }
|
yading@11
|
3344
|
yading@11
|
3345 avformat_free_context(s);
|
yading@11
|
3346
|
yading@11
|
3347 *ps = NULL;
|
yading@11
|
3348
|
yading@11
|
3349 avio_close(pb);
|
yading@11
|
3350 }
|
yading@11
|
3351
|
yading@11
|
3352 #if FF_API_NEW_STREAM
|
yading@11
|
3353 AVStream *av_new_stream(AVFormatContext *s, int id)
|
yading@11
|
3354 {
|
yading@11
|
3355 AVStream *st = avformat_new_stream(s, NULL);
|
yading@11
|
3356 if (st)
|
yading@11
|
3357 st->id = id;
|
yading@11
|
3358 return st;
|
yading@11
|
3359 }
|
yading@11
|
3360 #endif
|
yading@11
|
3361
|
yading@11
|
3362 AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
|
yading@11
|
3363 {
|
yading@11
|
3364 AVStream *st;
|
yading@11
|
3365 int i;
|
yading@11
|
3366 AVStream **streams;
|
yading@11
|
3367
|
yading@11
|
3368 if (s->nb_streams >= INT_MAX/sizeof(*streams))
|
yading@11
|
3369 return NULL;
|
yading@11
|
3370 streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams));
|
yading@11
|
3371 if (!streams)
|
yading@11
|
3372 return NULL;
|
yading@11
|
3373 s->streams = streams;
|
yading@11
|
3374
|
yading@11
|
3375 st = av_mallocz(sizeof(AVStream));
|
yading@11
|
3376 if (!st)
|
yading@11
|
3377 return NULL;
|
yading@11
|
3378 if (!(st->info = av_mallocz(sizeof(*st->info)))) {
|
yading@11
|
3379 av_free(st);
|
yading@11
|
3380 return NULL;
|
yading@11
|
3381 }
|
yading@11
|
3382 st->info->last_dts = AV_NOPTS_VALUE;
|
yading@11
|
3383
|
yading@11
|
3384 st->codec = avcodec_alloc_context3(c);
|
yading@11
|
3385 if (s->iformat) {
|
yading@11
|
3386 /* no default bitrate if decoding */
|
yading@11
|
3387 st->codec->bit_rate = 0;
|
yading@11
|
3388 }
|
yading@11
|
3389 st->index = s->nb_streams;
|
yading@11
|
3390 st->start_time = AV_NOPTS_VALUE;
|
yading@11
|
3391 st->duration = AV_NOPTS_VALUE;
|
yading@11
|
3392 /* we set the current DTS to 0 so that formats without any timestamps
|
yading@11
|
3393 but durations get some timestamps, formats with some unknown
|
yading@11
|
3394 timestamps have their first few packets buffered and the
|
yading@11
|
3395 timestamps corrected before they are returned to the user */
|
yading@11
|
3396 st->cur_dts = s->iformat ? RELATIVE_TS_BASE : 0;
|
yading@11
|
3397 st->first_dts = AV_NOPTS_VALUE;
|
yading@11
|
3398 st->probe_packets = MAX_PROBE_PACKETS;
|
yading@11
|
3399 st->pts_wrap_reference = AV_NOPTS_VALUE;
|
yading@11
|
3400 st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
|
yading@11
|
3401
|
yading@11
|
3402 /* default pts setting is MPEG-like */
|
yading@11
|
3403 avpriv_set_pts_info(st, 33, 1, 90000);
|
yading@11
|
3404 st->last_IP_pts = AV_NOPTS_VALUE;
|
yading@11
|
3405 for(i=0; i<MAX_REORDER_DELAY+1; i++)
|
yading@11
|
3406 st->pts_buffer[i]= AV_NOPTS_VALUE;
|
yading@11
|
3407 st->reference_dts = AV_NOPTS_VALUE;
|
yading@11
|
3408
|
yading@11
|
3409 st->sample_aspect_ratio = (AVRational){0,1};
|
yading@11
|
3410
|
yading@11
|
3411 #if FF_API_R_FRAME_RATE
|
yading@11
|
3412 st->info->last_dts = AV_NOPTS_VALUE;
|
yading@11
|
3413 #endif
|
yading@11
|
3414 st->info->fps_first_dts = AV_NOPTS_VALUE;
|
yading@11
|
3415 st->info->fps_last_dts = AV_NOPTS_VALUE;
|
yading@11
|
3416
|
yading@11
|
3417 s->streams[s->nb_streams++] = st;
|
yading@11
|
3418 return st;
|
yading@11
|
3419 }
|
yading@11
|
3420
|
yading@11
|
3421 AVProgram *av_new_program(AVFormatContext *ac, int id)
|
yading@11
|
3422 {
|
yading@11
|
3423 AVProgram *program=NULL;
|
yading@11
|
3424 int i;
|
yading@11
|
3425
|
yading@11
|
3426 av_dlog(ac, "new_program: id=0x%04x\n", id);
|
yading@11
|
3427
|
yading@11
|
3428 for(i=0; i<ac->nb_programs; i++)
|
yading@11
|
3429 if(ac->programs[i]->id == id)
|
yading@11
|
3430 program = ac->programs[i];
|
yading@11
|
3431
|
yading@11
|
3432 if(!program){
|
yading@11
|
3433 program = av_mallocz(sizeof(AVProgram));
|
yading@11
|
3434 if (!program)
|
yading@11
|
3435 return NULL;
|
yading@11
|
3436 dynarray_add(&ac->programs, &ac->nb_programs, program);
|
yading@11
|
3437 program->discard = AVDISCARD_NONE;
|
yading@11
|
3438 }
|
yading@11
|
3439 program->id = id;
|
yading@11
|
3440 program->pts_wrap_reference = AV_NOPTS_VALUE;
|
yading@11
|
3441 program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
|
yading@11
|
3442
|
yading@11
|
3443 program->start_time =
|
yading@11
|
3444 program->end_time = AV_NOPTS_VALUE;
|
yading@11
|
3445
|
yading@11
|
3446 return program;
|
yading@11
|
3447 }
|
yading@11
|
3448
|
yading@11
|
3449 AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title)
|
yading@11
|
3450 {
|
yading@11
|
3451 AVChapter *chapter = NULL;
|
yading@11
|
3452 int i;
|
yading@11
|
3453
|
yading@11
|
3454 for(i=0; i<s->nb_chapters; i++)
|
yading@11
|
3455 if(s->chapters[i]->id == id)
|
yading@11
|
3456 chapter = s->chapters[i];
|
yading@11
|
3457
|
yading@11
|
3458 if(!chapter){
|
yading@11
|
3459 chapter= av_mallocz(sizeof(AVChapter));
|
yading@11
|
3460 if(!chapter)
|
yading@11
|
3461 return NULL;
|
yading@11
|
3462 dynarray_add(&s->chapters, &s->nb_chapters, chapter);
|
yading@11
|
3463 }
|
yading@11
|
3464 av_dict_set(&chapter->metadata, "title", title, 0);
|
yading@11
|
3465 chapter->id = id;
|
yading@11
|
3466 chapter->time_base= time_base;
|
yading@11
|
3467 chapter->start = start;
|
yading@11
|
3468 chapter->end = end;
|
yading@11
|
3469
|
yading@11
|
3470 return chapter;
|
yading@11
|
3471 }
|
yading@11
|
3472
|
yading@11
|
3473 void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
|
yading@11
|
3474 {
|
yading@11
|
3475 int i, j;
|
yading@11
|
3476 AVProgram *program=NULL;
|
yading@11
|
3477 void *tmp;
|
yading@11
|
3478
|
yading@11
|
3479 if (idx >= ac->nb_streams) {
|
yading@11
|
3480 av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
|
yading@11
|
3481 return;
|
yading@11
|
3482 }
|
yading@11
|
3483
|
yading@11
|
3484 for(i=0; i<ac->nb_programs; i++){
|
yading@11
|
3485 if(ac->programs[i]->id != progid)
|
yading@11
|
3486 continue;
|
yading@11
|
3487 program = ac->programs[i];
|
yading@11
|
3488 for(j=0; j<program->nb_stream_indexes; j++)
|
yading@11
|
3489 if(program->stream_index[j] == idx)
|
yading@11
|
3490 return;
|
yading@11
|
3491
|
yading@11
|
3492 tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1));
|
yading@11
|
3493 if(!tmp)
|
yading@11
|
3494 return;
|
yading@11
|
3495 program->stream_index = tmp;
|
yading@11
|
3496 program->stream_index[program->nb_stream_indexes++] = idx;
|
yading@11
|
3497 return;
|
yading@11
|
3498 }
|
yading@11
|
3499 }
|
yading@11
|
3500
|
yading@11
|
3501 static void print_fps(double d, const char *postfix){
|
yading@11
|
3502 uint64_t v= lrintf(d*100);
|
yading@11
|
3503 if (v% 100 ) av_log(NULL, AV_LOG_INFO, ", %3.2f %s", d, postfix);
|
yading@11
|
3504 else if(v%(100*1000)) av_log(NULL, AV_LOG_INFO, ", %1.0f %s", d, postfix);
|
yading@11
|
3505 else av_log(NULL, AV_LOG_INFO, ", %1.0fk %s", d/1000, postfix);
|
yading@11
|
3506 }
|
yading@11
|
3507
|
yading@11
|
3508 static void dump_metadata(void *ctx, AVDictionary *m, const char *indent)
|
yading@11
|
3509 {
|
yading@11
|
3510 if(m && !(av_dict_count(m) == 1 && av_dict_get(m, "language", NULL, 0))){
|
yading@11
|
3511 AVDictionaryEntry *tag=NULL;
|
yading@11
|
3512
|
yading@11
|
3513 av_log(ctx, AV_LOG_INFO, "%sMetadata:\n", indent);
|
yading@11
|
3514 while((tag=av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
|
yading@11
|
3515 if(strcmp("language", tag->key)){
|
yading@11
|
3516 const char *p = tag->value;
|
yading@11
|
3517 av_log(ctx, AV_LOG_INFO, "%s %-16s: ", indent, tag->key);
|
yading@11
|
3518 while(*p) {
|
yading@11
|
3519 char tmp[256];
|
yading@11
|
3520 size_t len = strcspn(p, "\x8\xa\xb\xc\xd");
|
yading@11
|
3521 av_strlcpy(tmp, p, FFMIN(sizeof(tmp), len+1));
|
yading@11
|
3522 av_log(ctx, AV_LOG_INFO, "%s", tmp);
|
yading@11
|
3523 p += len;
|
yading@11
|
3524 if (*p == 0xd) av_log(ctx, AV_LOG_INFO, " ");
|
yading@11
|
3525 if (*p == 0xa) av_log(ctx, AV_LOG_INFO, "\n%s %-16s: ", indent, "");
|
yading@11
|
3526 if (*p) p++;
|
yading@11
|
3527 }
|
yading@11
|
3528 av_log(ctx, AV_LOG_INFO, "\n");
|
yading@11
|
3529 }
|
yading@11
|
3530 }
|
yading@11
|
3531 }
|
yading@11
|
3532 }
|
yading@11
|
3533
|
yading@11
|
3534 /* "user interface" functions */
|
yading@11
|
3535 static void dump_stream_format(AVFormatContext *ic, int i, int index, int is_output)
|
yading@11
|
3536 {
|
yading@11
|
3537 char buf[256];
|
yading@11
|
3538 int flags = (is_output ? ic->oformat->flags : ic->iformat->flags);
|
yading@11
|
3539 AVStream *st = ic->streams[i];
|
yading@11
|
3540 int g = av_gcd(st->time_base.num, st->time_base.den);
|
yading@11
|
3541 AVDictionaryEntry *lang = av_dict_get(st->metadata, "language", NULL, 0);
|
yading@11
|
3542 avcodec_string(buf, sizeof(buf), st->codec, is_output);
|
yading@11
|
3543 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d", index, i);
|
yading@11
|
3544 /* the pid is an important information, so we display it */
|
yading@11
|
3545 /* XXX: add a generic system */
|
yading@11
|
3546 if (flags & AVFMT_SHOW_IDS)
|
yading@11
|
3547 av_log(NULL, AV_LOG_INFO, "[0x%x]", st->id);
|
yading@11
|
3548 if (lang)
|
yading@11
|
3549 av_log(NULL, AV_LOG_INFO, "(%s)", lang->value);
|
yading@11
|
3550 av_log(NULL, AV_LOG_DEBUG, ", %d, %d/%d", st->codec_info_nb_frames, st->time_base.num/g, st->time_base.den/g);
|
yading@11
|
3551 av_log(NULL, AV_LOG_INFO, ": %s", buf);
|
yading@11
|
3552 if (st->sample_aspect_ratio.num && // default
|
yading@11
|
3553 av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)) {
|
yading@11
|
3554 AVRational display_aspect_ratio;
|
yading@11
|
3555 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
|
yading@11
|
3556 st->codec->width*st->sample_aspect_ratio.num,
|
yading@11
|
3557 st->codec->height*st->sample_aspect_ratio.den,
|
yading@11
|
3558 1024*1024);
|
yading@11
|
3559 av_log(NULL, AV_LOG_INFO, ", SAR %d:%d DAR %d:%d",
|
yading@11
|
3560 st->sample_aspect_ratio.num, st->sample_aspect_ratio.den,
|
yading@11
|
3561 display_aspect_ratio.num, display_aspect_ratio.den);
|
yading@11
|
3562 }
|
yading@11
|
3563 if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
|
yading@11
|
3564 if(st->avg_frame_rate.den && st->avg_frame_rate.num)
|
yading@11
|
3565 print_fps(av_q2d(st->avg_frame_rate), "fps");
|
yading@11
|
3566 #if FF_API_R_FRAME_RATE
|
yading@11
|
3567 if(st->r_frame_rate.den && st->r_frame_rate.num)
|
yading@11
|
3568 print_fps(av_q2d(st->r_frame_rate), "tbr");
|
yading@11
|
3569 #endif
|
yading@11
|
3570 if(st->time_base.den && st->time_base.num)
|
yading@11
|
3571 print_fps(1/av_q2d(st->time_base), "tbn");
|
yading@11
|
3572 if(st->codec->time_base.den && st->codec->time_base.num)
|
yading@11
|
3573 print_fps(1/av_q2d(st->codec->time_base), "tbc");
|
yading@11
|
3574 }
|
yading@11
|
3575 if (st->disposition & AV_DISPOSITION_DEFAULT)
|
yading@11
|
3576 av_log(NULL, AV_LOG_INFO, " (default)");
|
yading@11
|
3577 if (st->disposition & AV_DISPOSITION_DUB)
|
yading@11
|
3578 av_log(NULL, AV_LOG_INFO, " (dub)");
|
yading@11
|
3579 if (st->disposition & AV_DISPOSITION_ORIGINAL)
|
yading@11
|
3580 av_log(NULL, AV_LOG_INFO, " (original)");
|
yading@11
|
3581 if (st->disposition & AV_DISPOSITION_COMMENT)
|
yading@11
|
3582 av_log(NULL, AV_LOG_INFO, " (comment)");
|
yading@11
|
3583 if (st->disposition & AV_DISPOSITION_LYRICS)
|
yading@11
|
3584 av_log(NULL, AV_LOG_INFO, " (lyrics)");
|
yading@11
|
3585 if (st->disposition & AV_DISPOSITION_KARAOKE)
|
yading@11
|
3586 av_log(NULL, AV_LOG_INFO, " (karaoke)");
|
yading@11
|
3587 if (st->disposition & AV_DISPOSITION_FORCED)
|
yading@11
|
3588 av_log(NULL, AV_LOG_INFO, " (forced)");
|
yading@11
|
3589 if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
|
yading@11
|
3590 av_log(NULL, AV_LOG_INFO, " (hearing impaired)");
|
yading@11
|
3591 if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
|
yading@11
|
3592 av_log(NULL, AV_LOG_INFO, " (visual impaired)");
|
yading@11
|
3593 if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
|
yading@11
|
3594 av_log(NULL, AV_LOG_INFO, " (clean effects)");
|
yading@11
|
3595 av_log(NULL, AV_LOG_INFO, "\n");
|
yading@11
|
3596 dump_metadata(NULL, st->metadata, " ");
|
yading@11
|
3597 }
|
yading@11
|
3598
|
yading@11
|
3599 void av_dump_format(AVFormatContext *ic,
|
yading@11
|
3600 int index,
|
yading@11
|
3601 const char *url,
|
yading@11
|
3602 int is_output)
|
yading@11
|
3603 {
|
yading@11
|
3604 int i;
|
yading@11
|
3605 uint8_t *printed = ic->nb_streams ? av_mallocz(ic->nb_streams) : NULL;
|
yading@11
|
3606 if (ic->nb_streams && !printed)
|
yading@11
|
3607 return;
|
yading@11
|
3608
|
yading@11
|
3609 av_log(NULL, AV_LOG_INFO, "%s #%d, %s, %s '%s':\n",
|
yading@11
|
3610 is_output ? "Output" : "Input",
|
yading@11
|
3611 index,
|
yading@11
|
3612 is_output ? ic->oformat->name : ic->iformat->name,
|
yading@11
|
3613 is_output ? "to" : "from", url);
|
yading@11
|
3614 dump_metadata(NULL, ic->metadata, " ");
|
yading@11
|
3615 if (!is_output) {
|
yading@11
|
3616 av_log(NULL, AV_LOG_INFO, " Duration: ");
|
yading@11
|
3617 if (ic->duration != AV_NOPTS_VALUE) {
|
yading@11
|
3618 int hours, mins, secs, us;
|
yading@11
|
3619 int64_t duration = ic->duration + 5000;
|
yading@11
|
3620 secs = duration / AV_TIME_BASE;
|
yading@11
|
3621 us = duration % AV_TIME_BASE;
|
yading@11
|
3622 mins = secs / 60;
|
yading@11
|
3623 secs %= 60;
|
yading@11
|
3624 hours = mins / 60;
|
yading@11
|
3625 mins %= 60;
|
yading@11
|
3626 av_log(NULL, AV_LOG_INFO, "%02d:%02d:%02d.%02d", hours, mins, secs,
|
yading@11
|
3627 (100 * us) / AV_TIME_BASE);
|
yading@11
|
3628 } else {
|
yading@11
|
3629 av_log(NULL, AV_LOG_INFO, "N/A");
|
yading@11
|
3630 }
|
yading@11
|
3631 if (ic->start_time != AV_NOPTS_VALUE) {
|
yading@11
|
3632 int secs, us;
|
yading@11
|
3633 av_log(NULL, AV_LOG_INFO, ", start: ");
|
yading@11
|
3634 secs = ic->start_time / AV_TIME_BASE;
|
yading@11
|
3635 us = abs(ic->start_time % AV_TIME_BASE);
|
yading@11
|
3636 av_log(NULL, AV_LOG_INFO, "%d.%06d",
|
yading@11
|
3637 secs, (int)av_rescale(us, 1000000, AV_TIME_BASE));
|
yading@11
|
3638 }
|
yading@11
|
3639 av_log(NULL, AV_LOG_INFO, ", bitrate: ");
|
yading@11
|
3640 if (ic->bit_rate) {
|
yading@11
|
3641 av_log(NULL, AV_LOG_INFO,"%d kb/s", ic->bit_rate / 1000);
|
yading@11
|
3642 } else {
|
yading@11
|
3643 av_log(NULL, AV_LOG_INFO, "N/A");
|
yading@11
|
3644 }
|
yading@11
|
3645 av_log(NULL, AV_LOG_INFO, "\n");
|
yading@11
|
3646 }
|
yading@11
|
3647 for (i = 0; i < ic->nb_chapters; i++) {
|
yading@11
|
3648 AVChapter *ch = ic->chapters[i];
|
yading@11
|
3649 av_log(NULL, AV_LOG_INFO, " Chapter #%d.%d: ", index, i);
|
yading@11
|
3650 av_log(NULL, AV_LOG_INFO, "start %f, ", ch->start * av_q2d(ch->time_base));
|
yading@11
|
3651 av_log(NULL, AV_LOG_INFO, "end %f\n", ch->end * av_q2d(ch->time_base));
|
yading@11
|
3652
|
yading@11
|
3653 dump_metadata(NULL, ch->metadata, " ");
|
yading@11
|
3654 }
|
yading@11
|
3655 if(ic->nb_programs) {
|
yading@11
|
3656 int j, k, total = 0;
|
yading@11
|
3657 for(j=0; j<ic->nb_programs; j++) {
|
yading@11
|
3658 AVDictionaryEntry *name = av_dict_get(ic->programs[j]->metadata,
|
yading@11
|
3659 "name", NULL, 0);
|
yading@11
|
3660 av_log(NULL, AV_LOG_INFO, " Program %d %s\n", ic->programs[j]->id,
|
yading@11
|
3661 name ? name->value : "");
|
yading@11
|
3662 dump_metadata(NULL, ic->programs[j]->metadata, " ");
|
yading@11
|
3663 for(k=0; k<ic->programs[j]->nb_stream_indexes; k++) {
|
yading@11
|
3664 dump_stream_format(ic, ic->programs[j]->stream_index[k], index, is_output);
|
yading@11
|
3665 printed[ic->programs[j]->stream_index[k]] = 1;
|
yading@11
|
3666 }
|
yading@11
|
3667 total += ic->programs[j]->nb_stream_indexes;
|
yading@11
|
3668 }
|
yading@11
|
3669 if (total < ic->nb_streams)
|
yading@11
|
3670 av_log(NULL, AV_LOG_INFO, " No Program\n");
|
yading@11
|
3671 }
|
yading@11
|
3672 for(i=0;i<ic->nb_streams;i++)
|
yading@11
|
3673 if (!printed[i])
|
yading@11
|
3674 dump_stream_format(ic, i, index, is_output);
|
yading@11
|
3675
|
yading@11
|
3676 av_free(printed);
|
yading@11
|
3677 }
|
yading@11
|
3678
|
yading@11
|
3679 uint64_t ff_ntp_time(void)
|
yading@11
|
3680 {
|
yading@11
|
3681 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
|
yading@11
|
3682 }
|
yading@11
|
3683
|
yading@11
|
3684 int av_get_frame_filename(char *buf, int buf_size,
|
yading@11
|
3685 const char *path, int number)
|
yading@11
|
3686 {
|
yading@11
|
3687 const char *p;
|
yading@11
|
3688 char *q, buf1[20], c;
|
yading@11
|
3689 int nd, len, percentd_found;
|
yading@11
|
3690
|
yading@11
|
3691 q = buf;
|
yading@11
|
3692 p = path;
|
yading@11
|
3693 percentd_found = 0;
|
yading@11
|
3694 for(;;) {
|
yading@11
|
3695 c = *p++;
|
yading@11
|
3696 if (c == '\0')
|
yading@11
|
3697 break;
|
yading@11
|
3698 if (c == '%') {
|
yading@11
|
3699 do {
|
yading@11
|
3700 nd = 0;
|
yading@11
|
3701 while (av_isdigit(*p)) {
|
yading@11
|
3702 nd = nd * 10 + *p++ - '0';
|
yading@11
|
3703 }
|
yading@11
|
3704 c = *p++;
|
yading@11
|
3705 } while (av_isdigit(c));
|
yading@11
|
3706
|
yading@11
|
3707 switch(c) {
|
yading@11
|
3708 case '%':
|
yading@11
|
3709 goto addchar;
|
yading@11
|
3710 case 'd':
|
yading@11
|
3711 if (percentd_found)
|
yading@11
|
3712 goto fail;
|
yading@11
|
3713 percentd_found = 1;
|
yading@11
|
3714 snprintf(buf1, sizeof(buf1), "%0*d", nd, number);
|
yading@11
|
3715 len = strlen(buf1);
|
yading@11
|
3716 if ((q - buf + len) > buf_size - 1)
|
yading@11
|
3717 goto fail;
|
yading@11
|
3718 memcpy(q, buf1, len);
|
yading@11
|
3719 q += len;
|
yading@11
|
3720 break;
|
yading@11
|
3721 default:
|
yading@11
|
3722 goto fail;
|
yading@11
|
3723 }
|
yading@11
|
3724 } else {
|
yading@11
|
3725 addchar:
|
yading@11
|
3726 if ((q - buf) < buf_size - 1)
|
yading@11
|
3727 *q++ = c;
|
yading@11
|
3728 }
|
yading@11
|
3729 }
|
yading@11
|
3730 if (!percentd_found)
|
yading@11
|
3731 goto fail;
|
yading@11
|
3732 *q = '\0';
|
yading@11
|
3733 return 0;
|
yading@11
|
3734 fail:
|
yading@11
|
3735 *q = '\0';
|
yading@11
|
3736 return -1;
|
yading@11
|
3737 }
|
yading@11
|
3738
|
yading@11
|
3739 static void hex_dump_internal(void *avcl, FILE *f, int level,
|
yading@11
|
3740 const uint8_t *buf, int size)
|
yading@11
|
3741 {
|
yading@11
|
3742 int len, i, j, c;
|
yading@11
|
3743 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
|
yading@11
|
3744
|
yading@11
|
3745 for(i=0;i<size;i+=16) {
|
yading@11
|
3746 len = size - i;
|
yading@11
|
3747 if (len > 16)
|
yading@11
|
3748 len = 16;
|
yading@11
|
3749 PRINT("%08x ", i);
|
yading@11
|
3750 for(j=0;j<16;j++) {
|
yading@11
|
3751 if (j < len)
|
yading@11
|
3752 PRINT(" %02x", buf[i+j]);
|
yading@11
|
3753 else
|
yading@11
|
3754 PRINT(" ");
|
yading@11
|
3755 }
|
yading@11
|
3756 PRINT(" ");
|
yading@11
|
3757 for(j=0;j<len;j++) {
|
yading@11
|
3758 c = buf[i+j];
|
yading@11
|
3759 if (c < ' ' || c > '~')
|
yading@11
|
3760 c = '.';
|
yading@11
|
3761 PRINT("%c", c);
|
yading@11
|
3762 }
|
yading@11
|
3763 PRINT("\n");
|
yading@11
|
3764 }
|
yading@11
|
3765 #undef PRINT
|
yading@11
|
3766 }
|
yading@11
|
3767
|
yading@11
|
3768 void av_hex_dump(FILE *f, const uint8_t *buf, int size)
|
yading@11
|
3769 {
|
yading@11
|
3770 hex_dump_internal(NULL, f, 0, buf, size);
|
yading@11
|
3771 }
|
yading@11
|
3772
|
yading@11
|
3773 void av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size)
|
yading@11
|
3774 {
|
yading@11
|
3775 hex_dump_internal(avcl, NULL, level, buf, size);
|
yading@11
|
3776 }
|
yading@11
|
3777
|
yading@11
|
3778 static void pkt_dump_internal(void *avcl, FILE *f, int level, AVPacket *pkt, int dump_payload, AVRational time_base)
|
yading@11
|
3779 {
|
yading@11
|
3780 #define PRINT(...) do { if (!f) av_log(avcl, level, __VA_ARGS__); else fprintf(f, __VA_ARGS__); } while(0)
|
yading@11
|
3781 PRINT("stream #%d:\n", pkt->stream_index);
|
yading@11
|
3782 PRINT(" keyframe=%d\n", ((pkt->flags & AV_PKT_FLAG_KEY) != 0));
|
yading@11
|
3783 PRINT(" duration=%0.3f\n", pkt->duration * av_q2d(time_base));
|
yading@11
|
3784 /* DTS is _always_ valid after av_read_frame() */
|
yading@11
|
3785 PRINT(" dts=");
|
yading@11
|
3786 if (pkt->dts == AV_NOPTS_VALUE)
|
yading@11
|
3787 PRINT("N/A");
|
yading@11
|
3788 else
|
yading@11
|
3789 PRINT("%0.3f", pkt->dts * av_q2d(time_base));
|
yading@11
|
3790 /* PTS may not be known if B-frames are present. */
|
yading@11
|
3791 PRINT(" pts=");
|
yading@11
|
3792 if (pkt->pts == AV_NOPTS_VALUE)
|
yading@11
|
3793 PRINT("N/A");
|
yading@11
|
3794 else
|
yading@11
|
3795 PRINT("%0.3f", pkt->pts * av_q2d(time_base));
|
yading@11
|
3796 PRINT("\n");
|
yading@11
|
3797 PRINT(" size=%d\n", pkt->size);
|
yading@11
|
3798 #undef PRINT
|
yading@11
|
3799 if (dump_payload)
|
yading@11
|
3800 av_hex_dump(f, pkt->data, pkt->size);
|
yading@11
|
3801 }
|
yading@11
|
3802
|
yading@11
|
3803 #if FF_API_PKT_DUMP
|
yading@11
|
3804 void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload)
|
yading@11
|
3805 {
|
yading@11
|
3806 AVRational tb = { 1, AV_TIME_BASE };
|
yading@11
|
3807 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, tb);
|
yading@11
|
3808 }
|
yading@11
|
3809 #endif
|
yading@11
|
3810
|
yading@11
|
3811 void av_pkt_dump2(FILE *f, AVPacket *pkt, int dump_payload, AVStream *st)
|
yading@11
|
3812 {
|
yading@11
|
3813 pkt_dump_internal(NULL, f, 0, pkt, dump_payload, st->time_base);
|
yading@11
|
3814 }
|
yading@11
|
3815
|
yading@11
|
3816 #if FF_API_PKT_DUMP
|
yading@11
|
3817 void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload)
|
yading@11
|
3818 {
|
yading@11
|
3819 AVRational tb = { 1, AV_TIME_BASE };
|
yading@11
|
3820 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, tb);
|
yading@11
|
3821 }
|
yading@11
|
3822 #endif
|
yading@11
|
3823
|
yading@11
|
3824 void av_pkt_dump_log2(void *avcl, int level, AVPacket *pkt, int dump_payload,
|
yading@11
|
3825 AVStream *st)
|
yading@11
|
3826 {
|
yading@11
|
3827 pkt_dump_internal(avcl, NULL, level, pkt, dump_payload, st->time_base);
|
yading@11
|
3828 }
|
yading@11
|
3829
|
yading@11
|
3830 void av_url_split(char *proto, int proto_size,
|
yading@11
|
3831 char *authorization, int authorization_size,
|
yading@11
|
3832 char *hostname, int hostname_size,
|
yading@11
|
3833 int *port_ptr,
|
yading@11
|
3834 char *path, int path_size,
|
yading@11
|
3835 const char *url)
|
yading@11
|
3836 {
|
yading@11
|
3837 const char *p, *ls, *ls2, *at, *at2, *col, *brk;
|
yading@11
|
3838
|
yading@11
|
3839 if (port_ptr) *port_ptr = -1;
|
yading@11
|
3840 if (proto_size > 0) proto[0] = 0;
|
yading@11
|
3841 if (authorization_size > 0) authorization[0] = 0;
|
yading@11
|
3842 if (hostname_size > 0) hostname[0] = 0;
|
yading@11
|
3843 if (path_size > 0) path[0] = 0;
|
yading@11
|
3844
|
yading@11
|
3845 /* parse protocol */
|
yading@11
|
3846 if ((p = strchr(url, ':'))) {
|
yading@11
|
3847 av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
|
yading@11
|
3848 p++; /* skip ':' */
|
yading@11
|
3849 if (*p == '/') p++;
|
yading@11
|
3850 if (*p == '/') p++;
|
yading@11
|
3851 } else {
|
yading@11
|
3852 /* no protocol means plain filename */
|
yading@11
|
3853 av_strlcpy(path, url, path_size);
|
yading@11
|
3854 return;
|
yading@11
|
3855 }
|
yading@11
|
3856
|
yading@11
|
3857 /* separate path from hostname */
|
yading@11
|
3858 ls = strchr(p, '/');
|
yading@11
|
3859 ls2 = strchr(p, '?');
|
yading@11
|
3860 if(!ls)
|
yading@11
|
3861 ls = ls2;
|
yading@11
|
3862 else if (ls && ls2)
|
yading@11
|
3863 ls = FFMIN(ls, ls2);
|
yading@11
|
3864 if(ls)
|
yading@11
|
3865 av_strlcpy(path, ls, path_size);
|
yading@11
|
3866 else
|
yading@11
|
3867 ls = &p[strlen(p)]; // XXX
|
yading@11
|
3868
|
yading@11
|
3869 /* the rest is hostname, use that to parse auth/port */
|
yading@11
|
3870 if (ls != p) {
|
yading@11
|
3871 /* authorization (user[:pass]@hostname) */
|
yading@11
|
3872 at2 = p;
|
yading@11
|
3873 while ((at = strchr(p, '@')) && at < ls) {
|
yading@11
|
3874 av_strlcpy(authorization, at2,
|
yading@11
|
3875 FFMIN(authorization_size, at + 1 - at2));
|
yading@11
|
3876 p = at + 1; /* skip '@' */
|
yading@11
|
3877 }
|
yading@11
|
3878
|
yading@11
|
3879 if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
|
yading@11
|
3880 /* [host]:port */
|
yading@11
|
3881 av_strlcpy(hostname, p + 1,
|
yading@11
|
3882 FFMIN(hostname_size, brk - p));
|
yading@11
|
3883 if (brk[1] == ':' && port_ptr)
|
yading@11
|
3884 *port_ptr = atoi(brk + 2);
|
yading@11
|
3885 } else if ((col = strchr(p, ':')) && col < ls) {
|
yading@11
|
3886 av_strlcpy(hostname, p,
|
yading@11
|
3887 FFMIN(col + 1 - p, hostname_size));
|
yading@11
|
3888 if (port_ptr) *port_ptr = atoi(col + 1);
|
yading@11
|
3889 } else
|
yading@11
|
3890 av_strlcpy(hostname, p,
|
yading@11
|
3891 FFMIN(ls + 1 - p, hostname_size));
|
yading@11
|
3892 }
|
yading@11
|
3893 }
|
yading@11
|
3894
|
yading@11
|
3895 char *ff_data_to_hex(char *buff, const uint8_t *src, int s, int lowercase)
|
yading@11
|
3896 {
|
yading@11
|
3897 int i;
|
yading@11
|
3898 static const char hex_table_uc[16] = { '0', '1', '2', '3',
|
yading@11
|
3899 '4', '5', '6', '7',
|
yading@11
|
3900 '8', '9', 'A', 'B',
|
yading@11
|
3901 'C', 'D', 'E', 'F' };
|
yading@11
|
3902 static const char hex_table_lc[16] = { '0', '1', '2', '3',
|
yading@11
|
3903 '4', '5', '6', '7',
|
yading@11
|
3904 '8', '9', 'a', 'b',
|
yading@11
|
3905 'c', 'd', 'e', 'f' };
|
yading@11
|
3906 const char *hex_table = lowercase ? hex_table_lc : hex_table_uc;
|
yading@11
|
3907
|
yading@11
|
3908 for(i = 0; i < s; i++) {
|
yading@11
|
3909 buff[i * 2] = hex_table[src[i] >> 4];
|
yading@11
|
3910 buff[i * 2 + 1] = hex_table[src[i] & 0xF];
|
yading@11
|
3911 }
|
yading@11
|
3912
|
yading@11
|
3913 return buff;
|
yading@11
|
3914 }
|
yading@11
|
3915
|
yading@11
|
3916 int ff_hex_to_data(uint8_t *data, const char *p)
|
yading@11
|
3917 {
|
yading@11
|
3918 int c, len, v;
|
yading@11
|
3919
|
yading@11
|
3920 len = 0;
|
yading@11
|
3921 v = 1;
|
yading@11
|
3922 for (;;) {
|
yading@11
|
3923 p += strspn(p, SPACE_CHARS);
|
yading@11
|
3924 if (*p == '\0')
|
yading@11
|
3925 break;
|
yading@11
|
3926 c = av_toupper((unsigned char) *p++);
|
yading@11
|
3927 if (c >= '0' && c <= '9')
|
yading@11
|
3928 c = c - '0';
|
yading@11
|
3929 else if (c >= 'A' && c <= 'F')
|
yading@11
|
3930 c = c - 'A' + 10;
|
yading@11
|
3931 else
|
yading@11
|
3932 break;
|
yading@11
|
3933 v = (v << 4) | c;
|
yading@11
|
3934 if (v & 0x100) {
|
yading@11
|
3935 if (data)
|
yading@11
|
3936 data[len] = v;
|
yading@11
|
3937 len++;
|
yading@11
|
3938 v = 1;
|
yading@11
|
3939 }
|
yading@11
|
3940 }
|
yading@11
|
3941 return len;
|
yading@11
|
3942 }
|
yading@11
|
3943
|
yading@11
|
3944 #if FF_API_SET_PTS_INFO
|
yading@11
|
3945 void av_set_pts_info(AVStream *s, int pts_wrap_bits,
|
yading@11
|
3946 unsigned int pts_num, unsigned int pts_den)
|
yading@11
|
3947 {
|
yading@11
|
3948 avpriv_set_pts_info(s, pts_wrap_bits, pts_num, pts_den);
|
yading@11
|
3949 }
|
yading@11
|
3950 #endif
|
yading@11
|
3951
|
yading@11
|
3952 void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits,
|
yading@11
|
3953 unsigned int pts_num, unsigned int pts_den)
|
yading@11
|
3954 {
|
yading@11
|
3955 AVRational new_tb;
|
yading@11
|
3956 if(av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)){
|
yading@11
|
3957 if(new_tb.num != pts_num)
|
yading@11
|
3958 av_log(NULL, AV_LOG_DEBUG, "st:%d removing common factor %d from timebase\n", s->index, pts_num/new_tb.num);
|
yading@11
|
3959 }else
|
yading@11
|
3960 av_log(NULL, AV_LOG_WARNING, "st:%d has too large timebase, reducing\n", s->index);
|
yading@11
|
3961
|
yading@11
|
3962 if(new_tb.num <= 0 || new_tb.den <= 0) {
|
yading@11
|
3963 av_log(NULL, AV_LOG_ERROR, "Ignoring attempt to set invalid timebase %d/%d for st:%d\n", new_tb.num, new_tb.den, s->index);
|
yading@11
|
3964 return;
|
yading@11
|
3965 }
|
yading@11
|
3966 s->time_base = new_tb;
|
yading@11
|
3967 av_codec_set_pkt_timebase(s->codec, new_tb);
|
yading@11
|
3968 s->pts_wrap_bits = pts_wrap_bits;
|
yading@11
|
3969 }
|
yading@11
|
3970
|
yading@11
|
3971 int ff_url_join(char *str, int size, const char *proto,
|
yading@11
|
3972 const char *authorization, const char *hostname,
|
yading@11
|
3973 int port, const char *fmt, ...)
|
yading@11
|
3974 {
|
yading@11
|
3975 #if CONFIG_NETWORK
|
yading@11
|
3976 struct addrinfo hints = { 0 }, *ai;
|
yading@11
|
3977 #endif
|
yading@11
|
3978
|
yading@11
|
3979 str[0] = '\0';
|
yading@11
|
3980 if (proto)
|
yading@11
|
3981 av_strlcatf(str, size, "%s://", proto);
|
yading@11
|
3982 if (authorization && authorization[0])
|
yading@11
|
3983 av_strlcatf(str, size, "%s@", authorization);
|
yading@11
|
3984 #if CONFIG_NETWORK && defined(AF_INET6)
|
yading@11
|
3985 /* Determine if hostname is a numerical IPv6 address,
|
yading@11
|
3986 * properly escape it within [] in that case. */
|
yading@11
|
3987 hints.ai_flags = AI_NUMERICHOST;
|
yading@11
|
3988 if (!getaddrinfo(hostname, NULL, &hints, &ai)) {
|
yading@11
|
3989 if (ai->ai_family == AF_INET6) {
|
yading@11
|
3990 av_strlcat(str, "[", size);
|
yading@11
|
3991 av_strlcat(str, hostname, size);
|
yading@11
|
3992 av_strlcat(str, "]", size);
|
yading@11
|
3993 } else {
|
yading@11
|
3994 av_strlcat(str, hostname, size);
|
yading@11
|
3995 }
|
yading@11
|
3996 freeaddrinfo(ai);
|
yading@11
|
3997 } else
|
yading@11
|
3998 #endif
|
yading@11
|
3999 /* Not an IPv6 address, just output the plain string. */
|
yading@11
|
4000 av_strlcat(str, hostname, size);
|
yading@11
|
4001
|
yading@11
|
4002 if (port >= 0)
|
yading@11
|
4003 av_strlcatf(str, size, ":%d", port);
|
yading@11
|
4004 if (fmt) {
|
yading@11
|
4005 va_list vl;
|
yading@11
|
4006 int len = strlen(str);
|
yading@11
|
4007
|
yading@11
|
4008 va_start(vl, fmt);
|
yading@11
|
4009 vsnprintf(str + len, size > len ? size - len : 0, fmt, vl);
|
yading@11
|
4010 va_end(vl);
|
yading@11
|
4011 }
|
yading@11
|
4012 return strlen(str);
|
yading@11
|
4013 }
|
yading@11
|
4014
|
yading@11
|
4015 int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt,
|
yading@11
|
4016 AVFormatContext *src)
|
yading@11
|
4017 {
|
yading@11
|
4018 AVPacket local_pkt;
|
yading@11
|
4019
|
yading@11
|
4020 local_pkt = *pkt;
|
yading@11
|
4021 local_pkt.stream_index = dst_stream;
|
yading@11
|
4022 if (pkt->pts != AV_NOPTS_VALUE)
|
yading@11
|
4023 local_pkt.pts = av_rescale_q(pkt->pts,
|
yading@11
|
4024 src->streams[pkt->stream_index]->time_base,
|
yading@11
|
4025 dst->streams[dst_stream]->time_base);
|
yading@11
|
4026 if (pkt->dts != AV_NOPTS_VALUE)
|
yading@11
|
4027 local_pkt.dts = av_rescale_q(pkt->dts,
|
yading@11
|
4028 src->streams[pkt->stream_index]->time_base,
|
yading@11
|
4029 dst->streams[dst_stream]->time_base);
|
yading@11
|
4030 if (pkt->duration)
|
yading@11
|
4031 local_pkt.duration = av_rescale_q(pkt->duration,
|
yading@11
|
4032 src->streams[pkt->stream_index]->time_base,
|
yading@11
|
4033 dst->streams[dst_stream]->time_base);
|
yading@11
|
4034 return av_write_frame(dst, &local_pkt);
|
yading@11
|
4035 }
|
yading@11
|
4036
|
yading@11
|
4037 void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf,
|
yading@11
|
4038 void *context)
|
yading@11
|
4039 {
|
yading@11
|
4040 const char *ptr = str;
|
yading@11
|
4041
|
yading@11
|
4042 /* Parse key=value pairs. */
|
yading@11
|
4043 for (;;) {
|
yading@11
|
4044 const char *key;
|
yading@11
|
4045 char *dest = NULL, *dest_end;
|
yading@11
|
4046 int key_len, dest_len = 0;
|
yading@11
|
4047
|
yading@11
|
4048 /* Skip whitespace and potential commas. */
|
yading@11
|
4049 while (*ptr && (av_isspace(*ptr) || *ptr == ','))
|
yading@11
|
4050 ptr++;
|
yading@11
|
4051 if (!*ptr)
|
yading@11
|
4052 break;
|
yading@11
|
4053
|
yading@11
|
4054 key = ptr;
|
yading@11
|
4055
|
yading@11
|
4056 if (!(ptr = strchr(key, '=')))
|
yading@11
|
4057 break;
|
yading@11
|
4058 ptr++;
|
yading@11
|
4059 key_len = ptr - key;
|
yading@11
|
4060
|
yading@11
|
4061 callback_get_buf(context, key, key_len, &dest, &dest_len);
|
yading@11
|
4062 dest_end = dest + dest_len - 1;
|
yading@11
|
4063
|
yading@11
|
4064 if (*ptr == '\"') {
|
yading@11
|
4065 ptr++;
|
yading@11
|
4066 while (*ptr && *ptr != '\"') {
|
yading@11
|
4067 if (*ptr == '\\') {
|
yading@11
|
4068 if (!ptr[1])
|
yading@11
|
4069 break;
|
yading@11
|
4070 if (dest && dest < dest_end)
|
yading@11
|
4071 *dest++ = ptr[1];
|
yading@11
|
4072 ptr += 2;
|
yading@11
|
4073 } else {
|
yading@11
|
4074 if (dest && dest < dest_end)
|
yading@11
|
4075 *dest++ = *ptr;
|
yading@11
|
4076 ptr++;
|
yading@11
|
4077 }
|
yading@11
|
4078 }
|
yading@11
|
4079 if (*ptr == '\"')
|
yading@11
|
4080 ptr++;
|
yading@11
|
4081 } else {
|
yading@11
|
4082 for (; *ptr && !(av_isspace(*ptr) || *ptr == ','); ptr++)
|
yading@11
|
4083 if (dest && dest < dest_end)
|
yading@11
|
4084 *dest++ = *ptr;
|
yading@11
|
4085 }
|
yading@11
|
4086 if (dest)
|
yading@11
|
4087 *dest = 0;
|
yading@11
|
4088 }
|
yading@11
|
4089 }
|
yading@11
|
4090
|
yading@11
|
4091 int ff_find_stream_index(AVFormatContext *s, int id)
|
yading@11
|
4092 {
|
yading@11
|
4093 int i;
|
yading@11
|
4094 for (i = 0; i < s->nb_streams; i++) {
|
yading@11
|
4095 if (s->streams[i]->id == id)
|
yading@11
|
4096 return i;
|
yading@11
|
4097 }
|
yading@11
|
4098 return -1;
|
yading@11
|
4099 }
|
yading@11
|
4100
|
yading@11
|
4101 void ff_make_absolute_url(char *buf, int size, const char *base,
|
yading@11
|
4102 const char *rel)
|
yading@11
|
4103 {
|
yading@11
|
4104 char *sep, *path_query;
|
yading@11
|
4105 /* Absolute path, relative to the current server */
|
yading@11
|
4106 if (base && strstr(base, "://") && rel[0] == '/') {
|
yading@11
|
4107 if (base != buf)
|
yading@11
|
4108 av_strlcpy(buf, base, size);
|
yading@11
|
4109 sep = strstr(buf, "://");
|
yading@11
|
4110 if (sep) {
|
yading@11
|
4111 /* Take scheme from base url */
|
yading@11
|
4112 if (rel[1] == '/') {
|
yading@11
|
4113 sep[1] = '\0';
|
yading@11
|
4114 } else {
|
yading@11
|
4115 /* Take scheme and host from base url */
|
yading@11
|
4116 sep += 3;
|
yading@11
|
4117 sep = strchr(sep, '/');
|
yading@11
|
4118 if (sep)
|
yading@11
|
4119 *sep = '\0';
|
yading@11
|
4120 }
|
yading@11
|
4121 }
|
yading@11
|
4122 av_strlcat(buf, rel, size);
|
yading@11
|
4123 return;
|
yading@11
|
4124 }
|
yading@11
|
4125 /* If rel actually is an absolute url, just copy it */
|
yading@11
|
4126 if (!base || strstr(rel, "://") || rel[0] == '/') {
|
yading@11
|
4127 av_strlcpy(buf, rel, size);
|
yading@11
|
4128 return;
|
yading@11
|
4129 }
|
yading@11
|
4130 if (base != buf)
|
yading@11
|
4131 av_strlcpy(buf, base, size);
|
yading@11
|
4132
|
yading@11
|
4133 /* Strip off any query string from base */
|
yading@11
|
4134 path_query = strchr(buf, '?');
|
yading@11
|
4135 if (path_query != NULL)
|
yading@11
|
4136 *path_query = '\0';
|
yading@11
|
4137
|
yading@11
|
4138 /* Is relative path just a new query part? */
|
yading@11
|
4139 if (rel[0] == '?') {
|
yading@11
|
4140 av_strlcat(buf, rel, size);
|
yading@11
|
4141 return;
|
yading@11
|
4142 }
|
yading@11
|
4143
|
yading@11
|
4144 /* Remove the file name from the base url */
|
yading@11
|
4145 sep = strrchr(buf, '/');
|
yading@11
|
4146 if (sep)
|
yading@11
|
4147 sep[1] = '\0';
|
yading@11
|
4148 else
|
yading@11
|
4149 buf[0] = '\0';
|
yading@11
|
4150 while (av_strstart(rel, "../", NULL) && sep) {
|
yading@11
|
4151 /* Remove the path delimiter at the end */
|
yading@11
|
4152 sep[0] = '\0';
|
yading@11
|
4153 sep = strrchr(buf, '/');
|
yading@11
|
4154 /* If the next directory name to pop off is "..", break here */
|
yading@11
|
4155 if (!strcmp(sep ? &sep[1] : buf, "..")) {
|
yading@11
|
4156 /* Readd the slash we just removed */
|
yading@11
|
4157 av_strlcat(buf, "/", size);
|
yading@11
|
4158 break;
|
yading@11
|
4159 }
|
yading@11
|
4160 /* Cut off the directory name */
|
yading@11
|
4161 if (sep)
|
yading@11
|
4162 sep[1] = '\0';
|
yading@11
|
4163 else
|
yading@11
|
4164 buf[0] = '\0';
|
yading@11
|
4165 rel += 3;
|
yading@11
|
4166 }
|
yading@11
|
4167 av_strlcat(buf, rel, size);
|
yading@11
|
4168 }
|
yading@11
|
4169
|
yading@11
|
4170 int64_t ff_iso8601_to_unix_time(const char *datestr)
|
yading@11
|
4171 {
|
yading@11
|
4172 struct tm time1 = {0}, time2 = {0};
|
yading@11
|
4173 char *ret1, *ret2;
|
yading@11
|
4174 ret1 = av_small_strptime(datestr, "%Y - %m - %d %H:%M:%S", &time1);
|
yading@11
|
4175 ret2 = av_small_strptime(datestr, "%Y - %m - %dT%H:%M:%S", &time2);
|
yading@11
|
4176 if (ret2 && !ret1)
|
yading@11
|
4177 return av_timegm(&time2);
|
yading@11
|
4178 else
|
yading@11
|
4179 return av_timegm(&time1);
|
yading@11
|
4180 }
|
yading@11
|
4181
|
yading@11
|
4182 int avformat_query_codec(AVOutputFormat *ofmt, enum AVCodecID codec_id, int std_compliance)
|
yading@11
|
4183 {
|
yading@11
|
4184 if (ofmt) {
|
yading@11
|
4185 if (ofmt->query_codec)
|
yading@11
|
4186 return ofmt->query_codec(codec_id, std_compliance);
|
yading@11
|
4187 else if (ofmt->codec_tag)
|
yading@11
|
4188 return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
|
yading@11
|
4189 else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
|
yading@11
|
4190 codec_id == ofmt->subtitle_codec)
|
yading@11
|
4191 return 1;
|
yading@11
|
4192 }
|
yading@11
|
4193 return AVERROR_PATCHWELCOME;
|
yading@11
|
4194 }
|
yading@11
|
4195
|
yading@11
|
4196 int avformat_network_init(void)
|
yading@11
|
4197 {
|
yading@11
|
4198 #if CONFIG_NETWORK
|
yading@11
|
4199 int ret;
|
yading@11
|
4200 ff_network_inited_globally = 1;
|
yading@11
|
4201 if ((ret = ff_network_init()) < 0)
|
yading@11
|
4202 return ret;
|
yading@11
|
4203 ff_tls_init();
|
yading@11
|
4204 #endif
|
yading@11
|
4205 return 0;
|
yading@11
|
4206 }
|
yading@11
|
4207
|
yading@11
|
4208 int avformat_network_deinit(void)
|
yading@11
|
4209 {
|
yading@11
|
4210 #if CONFIG_NETWORK
|
yading@11
|
4211 ff_network_close();
|
yading@11
|
4212 ff_tls_deinit();
|
yading@11
|
4213 #endif
|
yading@11
|
4214 return 0;
|
yading@11
|
4215 }
|
yading@11
|
4216
|
yading@11
|
4217 int ff_add_param_change(AVPacket *pkt, int32_t channels,
|
yading@11
|
4218 uint64_t channel_layout, int32_t sample_rate,
|
yading@11
|
4219 int32_t width, int32_t height)
|
yading@11
|
4220 {
|
yading@11
|
4221 uint32_t flags = 0;
|
yading@11
|
4222 int size = 4;
|
yading@11
|
4223 uint8_t *data;
|
yading@11
|
4224 if (!pkt)
|
yading@11
|
4225 return AVERROR(EINVAL);
|
yading@11
|
4226 if (channels) {
|
yading@11
|
4227 size += 4;
|
yading@11
|
4228 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT;
|
yading@11
|
4229 }
|
yading@11
|
4230 if (channel_layout) {
|
yading@11
|
4231 size += 8;
|
yading@11
|
4232 flags |= AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT;
|
yading@11
|
4233 }
|
yading@11
|
4234 if (sample_rate) {
|
yading@11
|
4235 size += 4;
|
yading@11
|
4236 flags |= AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE;
|
yading@11
|
4237 }
|
yading@11
|
4238 if (width || height) {
|
yading@11
|
4239 size += 8;
|
yading@11
|
4240 flags |= AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS;
|
yading@11
|
4241 }
|
yading@11
|
4242 data = av_packet_new_side_data(pkt, AV_PKT_DATA_PARAM_CHANGE, size);
|
yading@11
|
4243 if (!data)
|
yading@11
|
4244 return AVERROR(ENOMEM);
|
yading@11
|
4245 bytestream_put_le32(&data, flags);
|
yading@11
|
4246 if (channels)
|
yading@11
|
4247 bytestream_put_le32(&data, channels);
|
yading@11
|
4248 if (channel_layout)
|
yading@11
|
4249 bytestream_put_le64(&data, channel_layout);
|
yading@11
|
4250 if (sample_rate)
|
yading@11
|
4251 bytestream_put_le32(&data, sample_rate);
|
yading@11
|
4252 if (width || height) {
|
yading@11
|
4253 bytestream_put_le32(&data, width);
|
yading@11
|
4254 bytestream_put_le32(&data, height);
|
yading@11
|
4255 }
|
yading@11
|
4256 return 0;
|
yading@11
|
4257 }
|
yading@11
|
4258
|
yading@11
|
4259 const struct AVCodecTag *avformat_get_riff_video_tags(void)
|
yading@11
|
4260 {
|
yading@11
|
4261 return ff_codec_bmp_tags;
|
yading@11
|
4262 }
|
yading@11
|
4263 const struct AVCodecTag *avformat_get_riff_audio_tags(void)
|
yading@11
|
4264 {
|
yading@11
|
4265 return ff_codec_wav_tags;
|
yading@11
|
4266 }
|
yading@11
|
4267
|
yading@11
|
4268 AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
|
yading@11
|
4269 {
|
yading@11
|
4270 AVRational undef = {0, 1};
|
yading@11
|
4271 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
|
yading@11
|
4272 AVRational codec_sample_aspect_ratio = stream && stream->codec ? stream->codec->sample_aspect_ratio : undef;
|
yading@11
|
4273 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
|
yading@11
|
4274
|
yading@11
|
4275 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
|
yading@11
|
4276 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
|
yading@11
|
4277 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
|
yading@11
|
4278 stream_sample_aspect_ratio = undef;
|
yading@11
|
4279
|
yading@11
|
4280 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
|
yading@11
|
4281 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
|
yading@11
|
4282 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
|
yading@11
|
4283 frame_sample_aspect_ratio = undef;
|
yading@11
|
4284
|
yading@11
|
4285 if (stream_sample_aspect_ratio.num)
|
yading@11
|
4286 return stream_sample_aspect_ratio;
|
yading@11
|
4287 else
|
yading@11
|
4288 return frame_sample_aspect_ratio;
|
yading@11
|
4289 }
|
yading@11
|
4290
|
yading@11
|
4291 AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
|
yading@11
|
4292 {
|
yading@11
|
4293 AVRational fr = st->r_frame_rate;
|
yading@11
|
4294
|
yading@11
|
4295 if (st->codec->ticks_per_frame > 1) {
|
yading@11
|
4296 AVRational codec_fr = av_inv_q(st->codec->time_base);
|
yading@11
|
4297 AVRational avg_fr = st->avg_frame_rate;
|
yading@11
|
4298 codec_fr.den *= st->codec->ticks_per_frame;
|
yading@11
|
4299 if ( codec_fr.num > 0 && codec_fr.den > 0 && av_q2d(codec_fr) < av_q2d(fr)*0.7
|
yading@11
|
4300 && fabs(1.0 - av_q2d(av_div_q(avg_fr, fr))) > 0.1)
|
yading@11
|
4301 fr = codec_fr;
|
yading@11
|
4302 }
|
yading@11
|
4303
|
yading@11
|
4304 return fr;
|
yading@11
|
4305 }
|
yading@11
|
4306
|
yading@11
|
4307 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
|
yading@11
|
4308 const char *spec)
|
yading@11
|
4309 {
|
yading@11
|
4310 if (*spec <= '9' && *spec >= '0') /* opt:index */
|
yading@11
|
4311 return strtol(spec, NULL, 0) == st->index;
|
yading@11
|
4312 else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
|
yading@11
|
4313 *spec == 't') { /* opt:[vasdt] */
|
yading@11
|
4314 enum AVMediaType type;
|
yading@11
|
4315
|
yading@11
|
4316 switch (*spec++) {
|
yading@11
|
4317 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
|
yading@11
|
4318 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
|
yading@11
|
4319 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
|
yading@11
|
4320 case 'd': type = AVMEDIA_TYPE_DATA; break;
|
yading@11
|
4321 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
|
yading@11
|
4322 default: av_assert0(0);
|
yading@11
|
4323 }
|
yading@11
|
4324 if (type != st->codec->codec_type)
|
yading@11
|
4325 return 0;
|
yading@11
|
4326 if (*spec++ == ':') { /* possibly followed by :index */
|
yading@11
|
4327 int i, index = strtol(spec, NULL, 0);
|
yading@11
|
4328 for (i = 0; i < s->nb_streams; i++)
|
yading@11
|
4329 if (s->streams[i]->codec->codec_type == type && index-- == 0)
|
yading@11
|
4330 return i == st->index;
|
yading@11
|
4331 return 0;
|
yading@11
|
4332 }
|
yading@11
|
4333 return 1;
|
yading@11
|
4334 } else if (*spec == 'p' && *(spec + 1) == ':') {
|
yading@11
|
4335 int prog_id, i, j;
|
yading@11
|
4336 char *endptr;
|
yading@11
|
4337 spec += 2;
|
yading@11
|
4338 prog_id = strtol(spec, &endptr, 0);
|
yading@11
|
4339 for (i = 0; i < s->nb_programs; i++) {
|
yading@11
|
4340 if (s->programs[i]->id != prog_id)
|
yading@11
|
4341 continue;
|
yading@11
|
4342
|
yading@11
|
4343 if (*endptr++ == ':') {
|
yading@11
|
4344 int stream_idx = strtol(endptr, NULL, 0);
|
yading@11
|
4345 return stream_idx >= 0 &&
|
yading@11
|
4346 stream_idx < s->programs[i]->nb_stream_indexes &&
|
yading@11
|
4347 st->index == s->programs[i]->stream_index[stream_idx];
|
yading@11
|
4348 }
|
yading@11
|
4349
|
yading@11
|
4350 for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
|
yading@11
|
4351 if (st->index == s->programs[i]->stream_index[j])
|
yading@11
|
4352 return 1;
|
yading@11
|
4353 }
|
yading@11
|
4354 return 0;
|
yading@11
|
4355 } else if (*spec == '#') {
|
yading@11
|
4356 int sid;
|
yading@11
|
4357 char *endptr;
|
yading@11
|
4358 sid = strtol(spec + 1, &endptr, 0);
|
yading@11
|
4359 if (!*endptr)
|
yading@11
|
4360 return st->id == sid;
|
yading@11
|
4361 } else if (!*spec) /* empty specifier, matches everything */
|
yading@11
|
4362 return 1;
|
yading@11
|
4363
|
yading@11
|
4364 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
|
yading@11
|
4365 return AVERROR(EINVAL);
|
yading@11
|
4366 }
|
yading@11
|
4367
|
yading@11
|
4368 void ff_generate_avci_extradata(AVStream *st)
|
yading@11
|
4369 {
|
yading@11
|
4370 static const uint8_t avci100_1080p_extradata[] = {
|
yading@11
|
4371 // SPS
|
yading@11
|
4372 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
|
yading@11
|
4373 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
|
yading@11
|
4374 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
|
yading@11
|
4375 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
|
yading@11
|
4376 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
|
yading@11
|
4377 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
|
yading@11
|
4378 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
|
yading@11
|
4379 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
|
yading@11
|
4380 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
yading@11
|
4381 // PPS
|
yading@11
|
4382 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
|
yading@11
|
4383 0xd0
|
yading@11
|
4384 };
|
yading@11
|
4385 static const uint8_t avci100_1080i_extradata[] = {
|
yading@11
|
4386 // SPS
|
yading@11
|
4387 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
|
yading@11
|
4388 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
|
yading@11
|
4389 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
|
yading@11
|
4390 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
|
yading@11
|
4391 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
|
yading@11
|
4392 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
|
yading@11
|
4393 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
|
yading@11
|
4394 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
|
yading@11
|
4395 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
|
yading@11
|
4396 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
|
yading@11
|
4397 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x00,
|
yading@11
|
4398 // PPS
|
yading@11
|
4399 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
|
yading@11
|
4400 0xd0
|
yading@11
|
4401 };
|
yading@11
|
4402 static const uint8_t avci50_1080i_extradata[] = {
|
yading@11
|
4403 // SPS
|
yading@11
|
4404 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
|
yading@11
|
4405 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
|
yading@11
|
4406 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
|
yading@11
|
4407 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
|
yading@11
|
4408 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
|
yading@11
|
4409 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
|
yading@11
|
4410 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
|
yading@11
|
4411 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
|
yading@11
|
4412 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
|
yading@11
|
4413 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
|
yading@11
|
4414 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
|
yading@11
|
4415 // PPS
|
yading@11
|
4416 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
|
yading@11
|
4417 0x11
|
yading@11
|
4418 };
|
yading@11
|
4419 static const uint8_t avci100_720p_extradata[] = {
|
yading@11
|
4420 // SPS
|
yading@11
|
4421 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
|
yading@11
|
4422 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
|
yading@11
|
4423 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
|
yading@11
|
4424 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
|
yading@11
|
4425 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
|
yading@11
|
4426 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
|
yading@11
|
4427 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
|
yading@11
|
4428 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
|
yading@11
|
4429 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
|
yading@11
|
4430 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
|
yading@11
|
4431 // PPS
|
yading@11
|
4432 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
|
yading@11
|
4433 0x11
|
yading@11
|
4434 };
|
yading@11
|
4435 int size = 0;
|
yading@11
|
4436 const uint8_t *data = 0;
|
yading@11
|
4437 if (st->codec->width == 1920) {
|
yading@11
|
4438 if (st->codec->field_order == AV_FIELD_PROGRESSIVE) {
|
yading@11
|
4439 data = avci100_1080p_extradata;
|
yading@11
|
4440 size = sizeof(avci100_1080p_extradata);
|
yading@11
|
4441 } else {
|
yading@11
|
4442 data = avci100_1080i_extradata;
|
yading@11
|
4443 size = sizeof(avci100_1080i_extradata);
|
yading@11
|
4444 }
|
yading@11
|
4445 } else if (st->codec->width == 1440) {
|
yading@11
|
4446 data = avci50_1080i_extradata;
|
yading@11
|
4447 size = sizeof(avci50_1080i_extradata);
|
yading@11
|
4448 } else if (st->codec->width == 1280) {
|
yading@11
|
4449 data = avci100_720p_extradata;
|
yading@11
|
4450 size = sizeof(avci100_720p_extradata);
|
yading@11
|
4451 }
|
yading@11
|
4452 if (!size)
|
yading@11
|
4453 return;
|
yading@11
|
4454 av_freep(&st->codec->extradata);
|
yading@11
|
4455 st->codec->extradata_size = 0;
|
yading@11
|
4456 st->codec->extradata = av_mallocz(size + FF_INPUT_BUFFER_PADDING_SIZE);
|
yading@11
|
4457 if (!st->codec->extradata)
|
yading@11
|
4458 return;
|
yading@11
|
4459 memcpy(st->codec->extradata, data, size);
|
yading@11
|
4460 st->codec->extradata_size = size;
|
yading@11
|
4461 }
|
yading@11
|
4462
|
yading@11
|
4463 static int match_host_pattern(const char *pattern, const char *hostname)
|
yading@11
|
4464 {
|
yading@11
|
4465 int len_p, len_h;
|
yading@11
|
4466 if (!strcmp(pattern, "*"))
|
yading@11
|
4467 return 1;
|
yading@11
|
4468 // Skip a possible *. at the start of the pattern
|
yading@11
|
4469 if (pattern[0] == '*')
|
yading@11
|
4470 pattern++;
|
yading@11
|
4471 if (pattern[0] == '.')
|
yading@11
|
4472 pattern++;
|
yading@11
|
4473 len_p = strlen(pattern);
|
yading@11
|
4474 len_h = strlen(hostname);
|
yading@11
|
4475 if (len_p > len_h)
|
yading@11
|
4476 return 0;
|
yading@11
|
4477 // Simply check if the end of hostname is equal to 'pattern'
|
yading@11
|
4478 if (!strcmp(pattern, &hostname[len_h - len_p])) {
|
yading@11
|
4479 if (len_h == len_p)
|
yading@11
|
4480 return 1; // Exact match
|
yading@11
|
4481 if (hostname[len_h - len_p - 1] == '.')
|
yading@11
|
4482 return 1; // The matched substring is a domain and not just a substring of a domain
|
yading@11
|
4483 }
|
yading@11
|
4484 return 0;
|
yading@11
|
4485 }
|
yading@11
|
4486
|
yading@11
|
4487 int ff_http_match_no_proxy(const char *no_proxy, const char *hostname)
|
yading@11
|
4488 {
|
yading@11
|
4489 char *buf, *start;
|
yading@11
|
4490 int ret = 0;
|
yading@11
|
4491 if (!no_proxy)
|
yading@11
|
4492 return 0;
|
yading@11
|
4493 if (!hostname)
|
yading@11
|
4494 return 0;
|
yading@11
|
4495 buf = av_strdup(no_proxy);
|
yading@11
|
4496 if (!buf)
|
yading@11
|
4497 return 0;
|
yading@11
|
4498 start = buf;
|
yading@11
|
4499 while (start) {
|
yading@11
|
4500 char *sep, *next = NULL;
|
yading@11
|
4501 start += strspn(start, " ,");
|
yading@11
|
4502 sep = start + strcspn(start, " ,");
|
yading@11
|
4503 if (*sep) {
|
yading@11
|
4504 next = sep + 1;
|
yading@11
|
4505 *sep = '\0';
|
yading@11
|
4506 }
|
yading@11
|
4507 if (match_host_pattern(start, hostname)) {
|
yading@11
|
4508 ret = 1;
|
yading@11
|
4509 break;
|
yading@11
|
4510 }
|
yading@11
|
4511 start = next;
|
yading@11
|
4512 }
|
yading@11
|
4513 av_free(buf);
|
yading@11
|
4514 return ret;
|
yading@11
|
4515 }
|