summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorFabrice Bellard <fabrice@bellard.org>2003-07-17 10:25:36 +0000
committerFabrice Bellard <fabrice@bellard.org>2003-07-17 10:25:36 +0000
commit019ac05ace07ce3e911b90acaee64758028e7375 (patch)
tree51cab1d95c3946105ceaa6715963faa7c9583729 /libavformat
parentd5809b0aa2852957bc34aaaa69f159c136d97359 (diff)
added primitive aborting system
Originally committed as revision 2058 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/avio.c22
-rw-r--r--libavformat/avio.h11
2 files changed, 32 insertions, 1 deletions
diff --git a/libavformat/avio.c b/libavformat/avio.c
index 3cd9e4d991..2c25c8a059 100644
--- a/libavformat/avio.c
+++ b/libavformat/avio.c
@@ -19,7 +19,10 @@
#include "avformat.h"
#include <ctype.h>
+static int default_interrupt_cb(void);
+
URLProtocol *first_protocol = NULL;
+URLInterruptCB *url_interrupt_cb = default_interrupt_cb;
int register_protocol(URLProtocol *protocol)
{
@@ -165,3 +168,22 @@ void url_get_filename(URLContext *h, char *buf, int buf_size)
{
pstrcpy(buf, buf_size, h->filename);
}
+
+
+static int default_interrupt_cb(void)
+{
+ return 0;
+}
+
+/**
+ * The callback is called in blocking functions to test regulary if
+ * asynchronous interruption is needed. -EINTR is returned in this
+ * case by the interrupted function. 'NULL' means no interrupt
+ * callback is given.
+ */
+void url_set_interrupt_cb(URLInterruptCB *interrupt_cb)
+{
+ if (!interrupt_cb)
+ interrupt_cb = default_interrupt_cb;
+ url_interrupt_cb = interrupt_cb;
+}
diff --git a/libavformat/avio.h b/libavformat/avio.h
index 29e9489d60..b31689ab25 100644
--- a/libavformat/avio.h
+++ b/libavformat/avio.h
@@ -28,6 +28,8 @@ typedef struct URLPollEntry {
#define URL_WRONLY 1
#define URL_RDWR 2
+typedef int URLInterruptCB(void);
+
int url_open(URLContext **h, const char *filename, int flags);
int url_read(URLContext *h, unsigned char *buf, int size);
int url_write(URLContext *h, unsigned char *buf, int size);
@@ -38,6 +40,12 @@ offset_t url_filesize(URLContext *h);
int url_get_max_packet_size(URLContext *h);
void url_get_filename(URLContext *h, char *buf, int buf_size);
+/* the callback is called in blocking functions to test regulary if
+ asynchronous interruption is needed. -EINTR is returned in this
+ case by the interrupted function. 'NULL' means no interrupt
+ callback is given. */
+void url_set_interrupt_cb(URLInterruptCB *interrupt_cb);
+
/* not implemented */
int url_poll(URLPollEntry *poll_table, int n, int timeout);
@@ -52,6 +60,7 @@ typedef struct URLProtocol {
} URLProtocol;
extern URLProtocol *first_protocol;
+extern URLInterruptCB *url_interrupt_cb;
int register_protocol(URLProtocol *protocol);
@@ -100,7 +109,7 @@ int url_feof(ByteIOContext *s);
#define URL_EOF (-1)
int url_fgetc(ByteIOContext *s);
-int url_fprintf(ByteIOContext *s, const char *fmt, ...);
+int url_fprintf(ByteIOContext *s, const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
char *url_fgets(ByteIOContext *s, char *buf, int buf_size);
void put_flush_packet(ByteIOContext *s);