[FFmpeg-cvslog] avio: Support private options in URLProtocols
Michael Niedermayer
git at videolan.org
Tue Nov 22 21:16:50 CET 2011
ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Thu Nov 10 04:34:35 2011 +0100| [6161c41817f6e53abb3021d67ca0f19def682718] | committer: Michael Niedermayer
avio: Support private options in URLProtocols
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6161c41817f6e53abb3021d67ca0f19def682718
---
libavformat/avio.c | 25 +++++++++++++++++++++++++
1 files changed, 25 insertions(+), 0 deletions(-)
diff --git a/libavformat/avio.c b/libavformat/avio.c
index 446f681..a9f4253 100644
--- a/libavformat/avio.c
+++ b/libavformat/avio.c
@@ -145,8 +145,31 @@ static int url_alloc_for_protocol (URLContext **puc, struct URLProtocol *up,
if (up->priv_data_size) {
uc->priv_data = av_mallocz(up->priv_data_size);
if (up->priv_data_class) {
+ char *start = strchr(uc->filename, ',');
*(const AVClass**)uc->priv_data = up->priv_data_class;
av_opt_set_defaults(uc->priv_data);
+ if(start){
+ int ret= 0;
+ char *p= start;
+ char sep= *++p;
+ char *key, *val;
+ p++;
+ while(ret >= 0 && (key= strchr(p, sep)) && p<key && (val = strchr(key+1, sep))){
+ *val= *key= 0;
+ ret= av_opt_set(uc->priv_data, p, key+1, 0);
+ if (ret == AVERROR_OPTION_NOT_FOUND)
+ av_log(uc, AV_LOG_ERROR, "Key '%s' not found.\n", p);
+ *val= *key= sep;
+ p= val+1;
+ }
+ if(ret<0 || p!=key){
+ av_log(uc, AV_LOG_ERROR, "Error parsing options string %s\n", start);
+ av_freep(&uc->priv_data);
+ av_freep(&uc);
+ goto fail;
+ }
+ memmove(start, key+1, strlen(key));
+ }
}
}
if (int_cb)
@@ -277,6 +300,8 @@ int ffurl_alloc(URLContext **puc, const char *filename, int flags,
else
av_strlcpy(proto_str, filename, FFMIN(proto_end-filename+1, sizeof(proto_str)));
+ if ((ptr = strchr(proto_str, ',')))
+ *ptr = '\0';
av_strlcpy(proto_nested, proto_str, sizeof(proto_nested));
if ((ptr = strchr(proto_nested, '+')))
*ptr = '\0';
More information about the ffmpeg-cvslog
mailing list