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