int fifo_read(FifoBuffer *f, UINT8 *buf, int buf_size, UINT8 **rptr_ptr);
void fifo_write(FifoBuffer *f, UINT8 *buf, int size, UINT8 **wptr_ptr);
-AVFormatContext *av_open_input_file(const char *filename, int buf_size);
+AVFormatContext *av_open_input_file(const char *filename,
+ const char *format_name,
+ int buf_size,
+ AVFormatParameters *ap);
int av_read_packet(AVFormatContext *s, AVPacket *pkt);
void av_close_input_file(AVFormatContext *s);
int get_frame_filename(char *buf, int buf_size,
const char *path, int number);
+
+/* grab/output specific */
+extern AVFormat video_grab_device_format;
+extern AVFormat audio_device_format;
+
+extern const char *v4l_device;
+extern const char *audio_device;
register_avformat(&pgmpipe_format);
register_avformat(&pgmyuvpipe_format);
register_avformat(&ppmpipe_format);
+#ifdef CONFIG_GRAB
+ register_avformat(&video_grab_device_format);
+ register_avformat(&audio_device_format);
+#endif
+ /* file protocols */
register_protocol(&file_protocol);
register_protocol(&pipe_protocol);
-#ifdef CONFIG_GRAB
- register_protocol(&audio_protocol);
- register_protocol(&video_protocol);
-#endif
#ifndef CONFIG_WIN32
register_protocol(&udp_protocol);
register_protocol(&http_protocol);
*wptr_ptr = wptr;
}
-/* media file handling */
-
-AVFormatContext *av_open_input_file(const char *filename, int buf_size)
+/* media file handling.
+ 'filename' is the filename to open.
+ 'format_name' is used to force the file format (NULL if auto guess).
+ 'buf_size' is the optional buffer size (zero if default is OK).
+ 'ap' are additionnal parameters needed when opening the file (NULL if default).
+*/
+
+AVFormatContext *av_open_input_file(const char *filename,
+ const char *format_name,
+ int buf_size,
+ AVFormatParameters *ap)
{
- AVFormatParameters params, *ap;
AVFormat *fmt;
AVFormatContext *ic = NULL;
- URLFormat url_format;
int err;
ic = av_mallocz(sizeof(AVFormatContext));
if (!ic)
goto fail;
- if (url_fopen(&ic->pb, filename, URL_RDONLY) < 0)
- goto fail;
-
- if (buf_size > 0) {
- url_setbufsize(&ic->pb, buf_size);
- }
/* find format */
- err = url_getformat(url_fileno(&ic->pb), &url_format);
- if (err >= 0) {
- fmt = guess_format(url_format.format_name, NULL, NULL);
- ap = ¶ms;
- ap->sample_rate = url_format.sample_rate;
- ap->frame_rate = url_format.frame_rate;
- ap->channels = url_format.channels;
- ap->width = url_format.width;
- ap->height = url_format.height;
- ap->pix_fmt = url_format.pix_fmt;
+ if (format_name != NULL) {
+ fmt = guess_format(format_name, NULL, NULL);
} else {
fmt = guess_format(NULL, filename, NULL);
- ap = NULL;
}
if (!fmt || !fmt->read_header) {
return NULL;
}
ic->format = fmt;
+ /* if no file needed do not try to open one */
+ if (!(fmt->flags & AVFMT_NOFILE)) {
+ if (url_fopen(&ic->pb, filename, URL_RDONLY) < 0)
+ goto fail;
+ if (buf_size > 0) {
+ url_setbufsize(&ic->pb, buf_size);
+ }
+ }
+
err = ic->format->read_header(ic, ap);
if (err < 0) {
- url_fclose(&ic->pb);
+ if (!(fmt->flags & AVFMT_NOFILE)) {
+ url_fclose(&ic->pb);
+ }
goto fail;
}
}
s->packet_buffer = NULL;
}
- url_fclose(&s->pb);
+ if (!(s->format->flags & AVFMT_NOFILE)) {
+ url_fclose(&s->pb);
+ }
free(s);
}