[FFmpeg-devel] [PATCH 2/8] lavf/avio: add ffurl_accept and ffurl_handshake
Nicolas George
george at nsup.org
Tue Jul 21 11:03:42 CEST 2015
Le tridi 3 thermidor, an CCXXIII, Stephan Holljes a écrit :
> Signed-off-by: Stephan Holljes <klaxa1337 at googlemail.com>
> ---
> libavformat/avio.c | 19 +++++++++++++++++++
> libavformat/url.h | 18 ++++++++++++++++++
> 2 files changed, 37 insertions(+)
>
> diff --git a/libavformat/avio.c b/libavformat/avio.c
> index c188adc..1182336 100644
> --- a/libavformat/avio.c
> +++ b/libavformat/avio.c
> @@ -211,6 +211,25 @@ int ffurl_connect(URLContext *uc, AVDictionary **options)
> return 0;
> }
>
> +int ffurl_accept(URLContext *s, URLContext **c)
> +{
Maybe "av_assert0(!*c);" here would make sense: the application would have
to clear the pointer initially. That way, we are free to expand the API
later to allow using a context that was already allocated or something. If
you think it makes sense, do not forget to update the doxys.
> + if (s->prot->url_accept)
> + return s->prot->url_accept(s, c);
> + return 0;
I had not spotted it earlier: an error code here would probably make more
sense. AVERROR(EBADF) would probably be the best choice, it is supposed to
be portable.
> +}
> +
> +int ffurl_handshake(URLContext *c)
> +{
> + int ret;
> + if (c->prot->url_handshake) {
> + ret = c->prot->url_handshake(c);
> + if (ret)
> + return ret;
> + }
> + c->is_connected = 1;
> + return 0;
> +}
> +
> #define URL_SCHEME_CHARS \
> "abcdefghijklmnopqrstuvwxyz" \
> "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
> diff --git a/libavformat/url.h b/libavformat/url.h
> index 99a3201..d010a77 100644
> --- a/libavformat/url.h
> +++ b/libavformat/url.h
> @@ -58,6 +58,8 @@ typedef struct URLProtocol {
> * for those nested protocols.
> */
> int (*url_open2)(URLContext *h, const char *url, int flags, AVDictionary **options);
> + int (*url_accept)(URLContext *s, URLContext **c);
> + int (*url_handshake)(URLContext *c);
Since the API has become non-trivial, it needs a doxy. I suggest something
like this:
/**
* Perform one step of the protocol handshake to accept a new client.
* See avio_handshake() for details.
* Implementations should try to return decreasing values.
* If the protocol uses an underlying protocol, the underlying handshake is
* usually the first step, and the return value can be:
* (largest value for this protocol) + (return value from other protocol)
*/
It references a doxy that is in a later patch; this would be a deal breaker
if it was a function call, but for a doxy that seems acceptable.
The doxy for avio_handshake() must explain in more details:
/**
* 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 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.
*
* @return 0 if the handshake is complete and successful;
* >0 if the handshake has progressed but is not complete;
* <0 for an AVERROR code
*/
Feel free to alter the wording if you find better.
>
> /**
> * Read data from the protocol.
> @@ -140,6 +142,22 @@ int ffurl_open(URLContext **puc, const char *filename, int flags,
> const AVIOInterruptCB *int_cb, AVDictionary **options);
>
> /**
> + * Accept an URLContext c on an URLContext s
> + * @param s server context
> + * @param c client context
> + * @return >= 0 on success, ff_neterrno() on failure.
> + */
> +int ffurl_accept(URLContext *s, URLContext **c);
> +
> +/**
> + * Perform a protocol handshake on the passed client context.
> + * @param c the client context
> + * @return >= 0 on success or a negative value corresponding
> + * to an AVERROR code on failure
> + */
> +int ffurl_handshake(URLContext *c);
> +
> +/**
> * Read up to size bytes from the resource accessed by h, and store
> * the read bytes in buf.
> *
Regards,
--
Nicolas George
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20150721/f91e8282/attachment.sig>
More information about the ffmpeg-devel
mailing list