On 18/06/14 08:21, Martin Storsjö wrote:
> On Tue, 17 Jun 2014, Luca Barbato wrote:
> 
>> From: Joshua Kordani <[email protected]>
>>
>> Issue present in Avigilon IP cameras.
>> ---
>>
>> Amended adding strlcpy and resetting the seen flags on 'm', some
>> testing welcome =)
>>
>> libavformat/rtsp.c | 19 ++++++++++++++++---
>> 1 file changed, 16 insertions(+), 3 deletions(-)
>>
>> diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
>> index adea3c6..23d7da1 100644
>> --- a/libavformat/rtsp.c
>> +++ b/libavformat/rtsp.c
>> @@ -292,6 +292,9 @@ typedef struct SDPParseState {
>>     struct RTSPSource **default_include_source_addrs; /**<
>> Source-specific multicast include source IP address (from SDP content) */
>>     int nb_default_exclude_source_addrs; /**< Number of
>> source-specific multicast exclude source IP address (from SDP content) */
>>     struct RTSPSource **default_exclude_source_addrs; /**<
>> Source-specific multicast exclude source IP address (from SDP content) */
>> +    int seen_rtpmap;
>> +    int seen_fmtp;
>> +    char delayed_fmtp[2048];
>> } SDPParseState;
>>
>> static void copy_default_source_addrs(struct RTSPSource **addrs, int
>> count,
>> @@ -381,7 +384,9 @@ static void sdp_parse_line(AVFormatContext *s,
>> SDPParseState *s1,
>>         break;
>>     case 'm':
>>         /* new stream */
>> -        s1->skip_media = 0;
>> +        s1->skip_media  = 0;
>> +        s1->seen_fmtp   = 0;
>> +        s1->seen_rtpmap = 0;
>>         codec_type = AVMEDIA_TYPE_UNKNOWN;
>>         get_word(st_type, sizeof(st_type), &p);
>>         if (!strcmp(st_type, "audio")) {
>> @@ -504,13 +509,21 @@ static void sdp_parse_line(AVFormatContext *s,
>> SDPParseState *s1,
>>                 st = s->streams[rtsp_st->stream_index];
>>                 sdp_parse_rtpmap(s, st, rtsp_st, payload_type, p);
>>             }
>> +            s1->seen_rtpmap = 1;
>> +            if (s1->seen_fmtp) {
>> +                parse_fmtp(s, rt, payload_type, s1->delayed_fmtp);
>> +            }
>>         } else if (av_strstart(p, "fmtp:", &p) ||
>>                    av_strstart(p, "framesize:", &p)) {
>> -            /* NOTE: fmtp is only supported AFTER the 'a=rtpmap:xxx'
>> tag */
>>             // let dynamic protocol handlers have a stab at the line.
>>             get_word(buf1, sizeof(buf1), &p);
>>             payload_type = atoi(buf1);
>> -            parse_fmtp(s, rt, payload_type, buf);
>> +            if (s1->seen_rtpmap) {
>> +                parse_fmtp(s, rt, payload_type, buf);
>> +            } else {
>> +                s1->seen_fmtp = 1;
>> +                av_strlcpy(s1->delayed_fmtp, buf,
>> sizeof(s1->delayed_fmtp));
>> +            }
> 
> If one would want to reduce the amount of possibly ambigous state, one
> could check whether delayed_fmtp[0] is non-null instead of using
> seen_fmtp (but I don't mind having it like this either - this is clearer
> at least).

Considered that, then I maintained the submitter approach using clearer
names.

> Tested on a couple files with multiple stream (where each stream has got
> a fmtp line), so seems ok to me.

I'll push in a while with the rest.

Thank you

lu

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to