[FFmpeg-devel] [PATCH] libavformat/hls: Observe Set-Cookie headers

Micah Galizia micahgalizia at gmail.com
Fri May 5 04:57:40 EEST 2017


On 2017-05-02 09:04 PM, wm4 wrote:
> On Tue,  2 May 2017 20:47:06 -0400
> Micah Galizia <micahgalizia at gmail.com> wrote:
>
>> Signed-off-by: Micah Galizia <micahgalizia at gmail.com>
>> ---
>>   libavformat/hls.c | 12 +++++++++---
>>   1 file changed, 9 insertions(+), 3 deletions(-)
>>
>> diff --git a/libavformat/hls.c b/libavformat/hls.c
>> index bac53a4350..643d50e1da 100644
>> --- a/libavformat/hls.c
>> +++ b/libavformat/hls.c
>> @@ -630,8 +630,14 @@ static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url,
>>       ret = s->io_open(s, pb, url, AVIO_FLAG_READ, &tmp);
>>       if (ret >= 0) {
>>           // update cookies on http response with setcookies.
>> -        void *u = (s->flags & AVFMT_FLAG_CUSTOM_IO) ? NULL : s->pb;
>> -        update_options(&c->cookies, "cookies", u);
>> +        char *new_cookies = NULL;
>> +
>> +        av_opt_get(*pb, "cookies", AV_OPT_SEARCH_CHILDREN, (uint8_t**)&new_cookies);
>> +        if (new_cookies) {
>> +            av_free(c->cookies);
>> +            c->cookies = new_cookies;
>> +        }
>> +
>>           av_dict_set(&opts, "cookies", c->cookies, 0);
>>       }
>>   
>> @@ -1608,7 +1614,7 @@ static int hls_close(AVFormatContext *s)
>>   
>>   static int hls_read_header(AVFormatContext *s)
>>   {
>> -    void *u = (s->flags & AVFMT_FLAG_CUSTOM_IO) ? NULL : s->pb;
>> +    void *u = s->pb;
>>       HLSContext *c = s->priv_data;
>>       int ret = 0, i;
>>       int highest_cur_seq_no = 0;
> Not comfortable with this without knowing what the purpose of this
> CUSTOM_IO check was.

Sorry, I misunderstood a prior email. Regarding why we check the custom 
IO flags, I was able to track down the following: 
https://lists.ffmpeg.org/pipermail/ffmpeg-trac/2013-February/013020.html 
for the hls_read_header. It was originally added in commit 
db6e2e848b21d988fb108995387a8c7836da4dc7 back in 2013.

After reading that, I think the problem it was trying to solve was about 
treating pb->opaque as a urlcontext -- but the code no longer does that, 
unless I've misunderstood all the casting in av_opt_get. What I believe 
it does now is call av_opt_get(*pb...), which eventually winds up in 
av_opt_find2 where it pulls options out the AVClass (av_class) contained 
in AVIOContext and starts reading its options. It doesn't seem to be 
touching opaque field in AVIOContext anymore.

Given this, I _think_ what I did is still ok. However, I can also change 
the patch to leave hls_read_header alone and add an if (s->flags ^ 
AVFMT_FLAG_CUSTOM_IO) before getting the new_cookies. This, effectively, 
fixes the bug without disregarding the check against 
AVFMT_FLAG_CUSTOM_IO -- best of both worlds and a smaller patch.

If nobody can confirm my analysis that opaque is now being left alone 
(thus, no longer requiring the check against the custom IO flag) then 
I'll just put the smaller patch up.

Thanks,



More information about the ffmpeg-devel mailing list