diff options
author | Stephan Holljes <klaxa1337@googlemail.com> | 2015-07-03 03:25:51 +0300 |
---|---|---|
committer | Stephan Holljes <klaxa1337@googlemail.com> | 2015-08-01 01:58:31 +0300 |
commit | 63c07a956bb240ebd5aeb0509953fe80e08e4699 (patch) | |
tree | 3c13d2e5e58406dd5104b283eaa850295a8e2240 | |
parent | 5125e4b53f71ca3c7d34c5812425f6f2fb963375 (diff) |
lavf/avio: add avio_accept and avio_handshake
Signed-off-by: Stephan Holljes <klaxa1337@googlemail.com>
-rw-r--r-- | libavformat/avio.h | 29 | ||||
-rw-r--r-- | libavformat/aviobuf.c | 17 |
2 files changed, 46 insertions, 0 deletions
diff --git a/libavformat/avio.h b/libavformat/avio.h index 9b8fcce3eb..06dd7f5ef8 100644 --- a/libavformat/avio.h +++ b/libavformat/avio.h @@ -648,4 +648,33 @@ struct AVBPrint; */ int avio_read_to_bprint(AVIOContext *h, struct AVBPrint *pb, size_t max_size); +/** + * Accept and allocate a client context on a server context. + * @param s the server context + * @param c the client context, must be unallocated + * @return >= 0 on success or a negative value corresponding + * to an AVERROR on failure + */ +int avio_accept(AVIOContext *s, AVIOContext **c); + +/** + * Perform one step of the protocol handshake to accept a new client. + * This function must be called on a client returned by avio_accept() before + * using it as a read/write context. + * It is separate from avio_accept() because it may block. + * A step of the handshake is defined by places where the application may + * decide to change the proceedings. + * For example, on a protocol with a request header and a reply header, each + * one can constitute a step because the application may use the parameters + * from the request to change parameters in the reply; or each individual + * chunk of the request can constitute a step. + * If the handshake is already finished, avio_handshake() does nothing and + * returns 0 immediately. + * + * @param c the client context to perform the handshake on + * @return 0 on a complete and successful handshake + * > 0 if the handshake progressed, but is not complete + * < 0 for an AVERROR code + */ +int avio_handshake(AVIOContext *c); #endif /* AVFORMAT_AVIO_H */ diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index aceb3bfcb7..1b3d5f5b80 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -1021,6 +1021,23 @@ int avio_read_to_bprint(AVIOContext *h, AVBPrint *pb, size_t max_size) return 0; } +int avio_accept(AVIOContext *s, AVIOContext **c) +{ + int ret; + URLContext *sc = s->opaque; + URLContext *cc = NULL; + ret = ffurl_accept(sc, &cc); + if (ret < 0) + return ret; + return ffio_fdopen(c, cc); +} + +int avio_handshake(AVIOContext *c) +{ + URLContext *cc = c->opaque; + return ffurl_handshake(cc); +} + /* output in a dynamic buffer */ typedef struct DynBuffer { |