Luca Barbato | 1 Jun 2012 01:50
Picon
Favicon
Gravatar

[PATCH] udp: Support IGMPv3 source specific multicast and source blocking

From: Stephen D'Angelo <SDAngelo@...>

TODO:
- Docs

Signed-off-by: Luca Barbato <lu_zero@...>
---
 configure         |    3 ++
 libavformat/udp.c |   89 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 90 insertions(+), 2 deletions(-)

diff --git a/configure b/configure
index 67371c8..b9cdbaf 100755
--- a/configure
+++ b/configure
 <at>  <at>  -1124,6 +1124,7  <at>  <at>  HAVE_LIST="
     strptime
     strtok_r
     struct_addrinfo
+    struct_ip_mreq_source
     struct_ipv6_mreq
     struct_rusage_ru_maxrss
     struct_sockaddr_in6
 <at>  <at>  -2786,6 +2787,7  <at>  <at>  fi
 if enabled network; then
     check_type "sys/types.h sys/socket.h" socklen_t
     check_type netdb.h "struct addrinfo"
+    check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE
     check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE
     check_type netinet/in.h "struct sockaddr_in6"
(Continue reading)

Sean McGovern | 1 Jun 2012 03:05
Picon
Gravatar

[PATCH] fate: add _XOPEN_SOURCE=600 to host CFLAGS

Our test tools now require SUSv3 semantics for freopen(),
which is only properly enabled on Solaris when _XOPEN_SOURCE >= 600
---
 configure |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/configure b/configure
index 67371c8..a0deffe 100755
--- a/configure
+++ b/configure
 <at>  <at>  -2395,6 +2395,7  <at>  <at>  case $target_os in
         enabled x86 && SHFLAGS="-mimpure-text $SHFLAGS"
         network_extralibs="-lsocket -lnsl"
         add_cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
+        enabled cross_compile || check_host_cflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
         # When using suncc to build, the Solaris linker will mark
         # an executable with each instruction set encountered by
         # the Solaris assembler.  As our libraries contain their own
--

-- 
1.7.8.5

Justin Ruggles | 1 Jun 2012 03:58
Picon
Gravatar

[PATCH 2/6] lavr: Add x86-optimized functions for s16 to flt conversion

---
 libavresample/x86/audio_convert.asm    |   36 ++++++++++++++++++++++++++++++++
 libavresample/x86/audio_convert_init.c |    9 ++++++++
 2 files changed, 45 insertions(+), 0 deletions(-)

diff --git a/libavresample/x86/audio_convert.asm b/libavresample/x86/audio_convert.asm
index e2cfbf9..746a616 100644
--- a/libavresample/x86/audio_convert.asm
+++ b/libavresample/x86/audio_convert.asm
 <at>  <at>  -22,6 +22,11  <at>  <at> 

 %include "x86inc.asm"
 %include "x86util.asm"
+%include "util.asm"
+
+SECTION_RODATA 32
+
+pf_s16_inv_scale: times 4 dd 0x38000000

 SECTION_TEXT

 <at>  <at>  -47,6 +52,37  <at>  <at>  cglobal conv_s16_to_s32, 3,3,3, dst, src, len
     jl .loop
     REP_RET

+;------------------------------------------------------------------------------
+; void ff_conv_s16_to_flt(float *dst, const int16_t *src, int len);
+;------------------------------------------------------------------------------
+
+%macro CONV_S16_TO_FLT 0
(Continue reading)

Sean McGovern | 1 Jun 2012 04:29
Picon
Gravatar

Re: [PATCH] fate: add _XOPEN_SOURCE=600 to host CFLAGS



On Thu, May 31, 2012 at 9:05 PM, Sean McGovern <gseanmcg-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
Our test tools now require SUSv3 semantics for freopen(),
which is only properly enabled on Solaris when _XOPEN_SOURCE >= 600
---
 configure |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/configure b/configure
index 67371c8..a0deffe 100755
--- a/configure
+++ b/configure

Please ignore.

This still doesn't work. *sigh*

sean <at> tsukimi:/BUILD/libav-regression$ /usr/local/bin/make -j 3 THREADS=2 V=1 fate-vsynth1-asv1
ccache gcc-4.6 -D_ISOC99_SOURCE -O3 -g -std=c99 -Wall -D__EXTENSIONS__ -D_XOPEN_SOURCE=600 -I. -I/SOURCES/libav -c -o tests/videogen.o /SOURCES/libav/tests/videogen.c
ccache gcc-4.6  -o tests/videogen tests/videogen.o -lm
tests/videogen >tests/data/vsynth1.yuv
Bad address
make: *** [tests/data/vsynth1.yuv] Error 1
 
<div>
<br><br><div class="gmail_quote">On Thu, May 31, 2012 at 9:05 PM, Sean McGovern <span dir="ltr">&lt;<a href="mailto:gseanmcg@..." target="_blank">gseanmcg@...</a>&gt;</span> wrote:<br><blockquote class="gmail_quote">
Our test tools now require SUSv3 semantics for freopen(),<br>
which is only properly enabled on Solaris when _XOPEN_SOURCE &gt;= 600<br>
---<br>
&nbsp;configure | &nbsp; &nbsp;1 +<br>
&nbsp;1 files changed, 1 insertions(+), 0 deletions(-)<br><br>
diff --git a/configure b/configure<br>
index 67371c8..a0deffe 100755<br>
--- a/configure<br>
+++ b/configure<br>
</blockquote>
<div>
<br>Please ignore.<br><br>This still doesn't work. *sigh*≤br><br>sean <at> tsukimi:/BUILD/libav-regression$ /usr/local/bin/make -j 3 THREADS=2 V=1 fate-vsynth1-asv1<br>ccache gcc-4.6 -D_ISOC99_SOURCE -O3 -g -std=c99 -Wall -D__EXTENSIONS__ -D_XOPEN_SOURCE=600 -I. -I/SOURCES/libav -c -o tests/videogen.o /SOURCES/libav/tests/videogen.c<br>
ccache gcc-4.6&nbsp; -o tests/videogen tests/videogen.o -lm<br>tests/videogen &gt;tests/data/vsynth1.yuv<br>Bad address<br>make: *** [tests/data/vsynth1.yuv] Error 1<br>&nbsp;<br>
</div>
</div>
</div>
Måns Rullgård | 1 Jun 2012 04:59

Re: [PATCH] fate: add CPPFLAGS to host programs

Luca Barbato <lu_zero@...> writes:

> On 31/05/12 07:53, Sean McGovern wrote:
>> On Wednesday, May 30, 2012, Måns Rullgård <mans@...> wrote:
>>> Sean McGovern <gseanmcg@...> writes:
>>>
>>>>>> -     $(HOSTCC) $(HOSTCFLAGS) -c -o $ <at>  $<
>>>>>> +     $(HOSTCC) $(CPPFLAGS) $(HOSTCFLAGS) -c -o $ <at>  $<
>>>>>
>>>>> This is wrong.  CPPFLAGS might not be at all what you want on the host.
>>>>>
>>>>
>>>> It looks like we don't  have a host equivalent of CPPFLAGS. Should I
>>>> introduce one?
>>>
>>> That's not as simple as you probably think.
>> 
>> Would it be acceptable in the meantime to add these defines to HOST_CFLAGS?
>> I would really like to fix this ASAP.
>> 
>
> It shouldn't hurt IMHO.

It should be fine.  If it breaks something, I guess will find out soon
enough.

--

-- 
Måns Rullgård
mans@...
Måns Rullgård | 1 Jun 2012 05:09

Re: [PATCH] fate: add _XOPEN_SOURCE=600 to host CFLAGS

Sean McGovern <gseanmcg@...> writes:

> Our test tools now require SUSv3 semantics for freopen(),
> which is only properly enabled on Solaris when _XOPEN_SOURCE >= 600
> ---
>  configure |    1 +
>  1 files changed, 1 insertions(+), 0 deletions(-)
>
> diff --git a/configure b/configure
> index 67371c8..a0deffe 100755
> --- a/configure
> +++ b/configure
>  <at>  <at>  -2395,6 +2395,7  <at>  <at>  case $target_os in
>          enabled x86 && SHFLAGS="-mimpure-text $SHFLAGS"
>          network_extralibs="-lsocket -lnsl"
>          add_cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
> +        enabled cross_compile || check_host_cflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
>          # When using suncc to build, the Solaris linker will mark
>          # an executable with each instruction set encountered by
>          # the Solaris assembler.  As our libraries contain their own
> -- 

Just FYI, this is the wrong place to be doing this since that section
sets up things for the _target_ OS.  It would thus not do the right
thing if building on Solaris for another target.

--

-- 
Måns Rullgård
mans@...
Ronald S. Bultje | 1 Jun 2012 05:42
Picon

Re: [PATCH 2/6] lavr: Add x86-optimized functions for s16 to flt conversion

Hi,

On Thu, May 31, 2012 at 6:58 PM, Justin Ruggles
<justin.ruggles@...> wrote:
> ---
>  libavresample/x86/audio_convert.asm    |   36 ++++++++++++++++++++++++++++++++
>  libavresample/x86/audio_convert_init.c |    9 ++++++++
>  2 files changed, 45 insertions(+), 0 deletions(-)
>
> diff --git a/libavresample/x86/audio_convert.asm b/libavresample/x86/audio_convert.asm
> index e2cfbf9..746a616 100644
> --- a/libavresample/x86/audio_convert.asm
> +++ b/libavresample/x86/audio_convert.asm
>  <at>  <at>  -22,6 +22,11  <at>  <at> 
>
>  %include "x86inc.asm"
>  %include "x86util.asm"
> +%include "util.asm"
> +
> +SECTION_RODATA 32
> +
> +pf_s16_inv_scale: times 4 dd 0x38000000
>
>  SECTION_TEXT
>
>  <at>  <at>  -47,6 +52,37  <at>  <at>  cglobal conv_s16_to_s32, 3,3,3, dst, src, len
>     jl .loop
>     REP_RET
>
> +;------------------------------------------------------------------------------
> +; void ff_conv_s16_to_flt(float *dst, const int16_t *src, int len);
> +;------------------------------------------------------------------------------
> +
> +%macro CONV_S16_TO_FLT 0
> +cglobal conv_s16_to_flt, 3,3,3, dst, src, len
> +    lea      lenq, [2*lend]
> +    add      srcq, lenq
> +    lea      dstq, [dstq + 2*lenq]
> +    neg      lenq
> +    mova       m2, [pf_s16_inv_scale]
> +    ALIGN 16
> +.loop:
> +    mova       m0, [srcq+lenq]
> +    S16_TO_S32_SX 0, 1
> +    cvtdq2ps   m0, m0
> +    cvtdq2ps   m1, m1
> +    mulps      m0, m0, m2
> +    mulps      m1, m1, m2

At this point, the mulps 3 args is a little confusing. Otherwise patch OK.

Ronald
Kostya Shishkov | 1 Jun 2012 06:46
Picon

Re: [PATCH 4/4] flvdec: cosmetic

On Thu, May 31, 2012 at 02:03:38PM -0700, Luca Barbato wrote:
> Format switch statements and cleanup.
> ---
>  libavformat/flvdec.c |  483 ++++++++++++++++++++++++++++----------------------
>  1 files changed, 275 insertions(+), 208 deletions(-)
> 
> diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
> index b6ad0a1..fa94e98 100644
> --- a/libavformat/flvdec.c
> +++ b/libavformat/flvdec.c
>  <at>  <at>  -60,7 +60,10  <at>  <at>  static int flv_probe(AVProbeData *p)
>      const uint8_t *d;
>  
>      d = p->buf;
> -    if (d[0] == 'F' && d[1] == 'L' && d[2] == 'V' && d[3] < 5 && d[5]==0 && AV_RB32(d+5)>8) {
> +    if (d[0] == 'F' &&
> +        d[1] == 'L' &&
> +        d[2] == 'V' &&
> +        d[3] < 5 && d[5] == 0 && AV_RB32(d + 5) > 8) {
>          return AVPROBE_SCORE_MAX;
>      }
>      return 0;
>  <at>  <at>  -77,72 +80,96  <at>  <at>  static AVStream *create_stream(AVFormatContext *s, int tag, int codec_type)
>      return st;
>  }
>  
> -static void flv_set_audio_codec(AVFormatContext *s, AVStream *astream, AVCodecContext *acodec,
int flv_codecid) {
> -    switch(flv_codecid) {
> -        //no distinction between S16 and S8 PCM codec flags
> -        case FLV_CODECID_PCM:
> -            acodec->codec_id = acodec->bits_per_coded_sample == 8 ? CODEC_ID_PCM_U8 :
> +static void flv_set_audio_codec(AVFormatContext *s,
> +                                AVStream *astream,
> +                                AVCodecContext *acodec, int flv_codecid)
> +{
> +    switch (flv_codecid) {
> +    //no distinction between S16 and S8 PCM codec flags
> +    case FLV_CODECID_PCM:
> +        acodec->codec_id = acodec->bits_per_coded_sample == 8 ? CODEC_ID_PCM_U8 :
>  #if HAVE_BIGENDIAN
> -                                CODEC_ID_PCM_S16BE;
> +                            CODEC_ID_PCM_S16BE;
>  #else
> -                                CODEC_ID_PCM_S16LE;
> +                            CODEC_ID_PCM_S16LE;
>  #endif
> -            break;
> -        case FLV_CODECID_PCM_LE:
> -            acodec->codec_id = acodec->bits_per_coded_sample == 8 ? CODEC_ID_PCM_U8 : CODEC_ID_PCM_S16LE; break;
> -        case FLV_CODECID_AAC  : acodec->codec_id = CODEC_ID_AAC;                                    break;
> -        case FLV_CODECID_ADPCM: acodec->codec_id = CODEC_ID_ADPCM_SWF;                              break;
> -        case FLV_CODECID_SPEEX:
> -            acodec->codec_id = CODEC_ID_SPEEX;
> -            acodec->sample_rate = 16000;
> -            break;
> -        case FLV_CODECID_MP3  : acodec->codec_id = CODEC_ID_MP3      ; astream->need_parsing =
AVSTREAM_PARSE_FULL; break;
> -        case FLV_CODECID_NELLYMOSER_8KHZ_MONO:
> -            acodec->sample_rate = 8000; //in case metadata does not otherwise declare samplerate
> -            acodec->codec_id = CODEC_ID_NELLYMOSER;
> -            break;
> -        case FLV_CODECID_NELLYMOSER_16KHZ_MONO:
> -            acodec->sample_rate = 16000;
> -            acodec->codec_id = CODEC_ID_NELLYMOSER;
> -            break;
> -        case FLV_CODECID_NELLYMOSER:
> -            acodec->codec_id = CODEC_ID_NELLYMOSER;
> -            break;
> -        default:
> -            av_log(s, AV_LOG_INFO, "Unsupported audio codec (%x)\n", flv_codecid >> FLV_AUDIO_CODECID_OFFSET);
> -            acodec->codec_tag = flv_codecid >> FLV_AUDIO_CODECID_OFFSET;
> +        break;
> +    case FLV_CODECID_PCM_LE:
> +        acodec->codec_id = acodec->bits_per_coded_sample == 8 ? CODEC_ID_PCM_U8 : CODEC_ID_PCM_S16LE;
> +        break;
> +    case FLV_CODECID_AAC:
> +        acodec->codec_id = CODEC_ID_AAC;
> +        break;
> +    case FLV_CODECID_ADPCM:
> +        acodec->codec_id = CODEC_ID_ADPCM_SWF;
> +        break;
> +    case FLV_CODECID_SPEEX:
> +        acodec->codec_id = CODEC_ID_SPEEX;
> +        acodec->sample_rate = 16000;
> +        break;
> +    case FLV_CODECID_MP3:
> +        acodec->codec_id = CODEC_ID_MP3;
> +        astream->need_parsing = AVSTREAM_PARSE_FULL;
> +        break;
> +    case FLV_CODECID_NELLYMOSER_8KHZ_MONO:
> +        acodec->sample_rate = 8000; //in case metadata does not otherwise declare samplerate
> +        acodec->codec_id = CODEC_ID_NELLYMOSER;
> +        break;
> +    case FLV_CODECID_NELLYMOSER_16KHZ_MONO:
> +        acodec->sample_rate = 16000;
> +        acodec->codec_id = CODEC_ID_NELLYMOSER;
> +        break;
> +    case FLV_CODECID_NELLYMOSER:
> +        acodec->codec_id = CODEC_ID_NELLYMOSER;
> +        break;
> +    default:
> +        av_log(s, AV_LOG_INFO, "Unsupported audio codec (%x)\n",
> +               flv_codecid >> FLV_AUDIO_CODECID_OFFSET);
> +        acodec->codec_tag = flv_codecid >> FLV_AUDIO_CODECID_OFFSET;
>      }
>  }
>  
> -static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream, int flv_codecid) {
> +static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream,
> +                               int flv_codecid)
> +{
>      AVCodecContext *vcodec = vstream->codec;
> +
>      switch(flv_codecid) {
> -        case FLV_CODECID_H263  : vcodec->codec_id = CODEC_ID_FLV1   ; break;
> -        case FLV_CODECID_SCREEN: vcodec->codec_id = CODEC_ID_FLASHSV; break;
> -        case FLV_CODECID_SCREEN2: vcodec->codec_id = CODEC_ID_FLASHSV2; break;
> -        case FLV_CODECID_VP6   : vcodec->codec_id = CODEC_ID_VP6F   ;
> -        case FLV_CODECID_VP6A  :
> -            if(flv_codecid == FLV_CODECID_VP6A)
> -                vcodec->codec_id = CODEC_ID_VP6A;
> -            if(vcodec->extradata_size != 1) {
> -                vcodec->extradata_size = 1;
> -                vcodec->extradata = av_malloc(1);
> -            }
> -            vcodec->extradata[0] = avio_r8(s->pb);
> -            return 1; // 1 byte body size adjustment for flv_read_packet()
> -        case FLV_CODECID_H264:
> -            vcodec->codec_id = CODEC_ID_H264;
> -            return 3; // not 4, reading packet type will consume one byte
> -        default:
> -            av_log(s, AV_LOG_INFO, "Unsupported video codec (%x)\n", flv_codecid);
> -            vcodec->codec_tag = flv_codecid;
> +    case FLV_CODECID_H263:
> +        vcodec->codec_id = CODEC_ID_FLV1;
> +        break;
> +    case FLV_CODECID_SCREEN:
> +        vcodec->codec_id = CODEC_ID_FLASHSV;
> +        break;
> +    case FLV_CODECID_SCREEN2:
> +        vcodec->codec_id = CODEC_ID_FLASHSV2;
> +        break;
> +    case FLV_CODECID_VP6:
> +        vcodec->codec_id = CODEC_ID_VP6F;
> +    case FLV_CODECID_VP6A  :
> +        if (flv_codecid == FLV_CODECID_VP6A)
> +            vcodec->codec_id = CODEC_ID_VP6A;
> +        if (vcodec->extradata_size != 1) {
> +            vcodec->extradata_size = 1;
> +            vcodec->extradata = av_malloc(1);
> +        }
> +        vcodec->extradata[0] = avio_r8(s->pb);
> +        return 1; // 1 byte body size adjustment for flv_read_packet()
> +    case FLV_CODECID_H264:
> +        vcodec->codec_id = CODEC_ID_H264;
> +        return 3; // not 4, reading packet type will consume one byte
> +    default:
> +        av_log(s, AV_LOG_INFO, "Unsupported video codec (%x)\n", flv_codecid);
> +        vcodec->codec_tag = flv_codecid;
>      }
>  
>      return 0;
>  }
>  
> -static int amf_get_string(AVIOContext *ioc, char *buffer, int buffsize) {
> +static int amf_get_string(AVIOContext *ioc, char *buffer, int buffsize)
> +{
>      int length = avio_rb16(ioc);
> +
>      if(length >= buffsize) {
>          avio_skip(ioc, length);
>          return -1;
>  <at>  <at>  -155,7 +182,10  <at>  <at>  static int amf_get_string(AVIOContext *ioc, char *buffer, int buffsize) {
>      return length;
>  }
>  
> -static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream *vstream,
int64_t max_pos) {
> +static int parse_keyframes_index(AVFormatContext *s,
> +                                 AVIOContext *ioc, AVStream *vstream,
> +                                 int64_t max_pos)
> +{
>      FLVContext *flv = s->priv_data;
>      unsigned int arraylen = 0, timeslen = 0, fileposlen = 0, i;
>      double num_val;
>  <at>  <at>  -168,7 +198,8  <at>  <at>  static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream
>      if (s->flags & AVFMT_FLAG_IGNIDX)
>          return 0;
>  
> -    while (avio_tell(ioc) < max_pos - 2 && amf_get_string(ioc, str_val, sizeof(str_val)) > 0) {
> +    while (avio_tell(ioc) < max_pos - 2 &&
> +           amf_get_string(ioc, str_val, sizeof(str_val)) > 0) {
>          int64_t* current_array;
>  
>          // Expect array object in context
>  <at>  <at>  -180,8 +211,8  <at>  <at>  static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream
>              break;
>  
>          /*
> -         * Expect only 'times' or 'filepositions' sub-arrays in other case refuse to use such metadata
> -         * for indexing
> +         * Expect only 'times' or 'filepositions' sub-arrays in other case
> +         * refuse to use such metadata for indexing
>           */
>          if (!strcmp(KEYFRAMES_TIMESTAMP_TAG, str_val) && !times) {
>              if (!(times = av_mallocz(sizeof(*times) * arraylen))) {
>  <at>  <at>  -190,7 +221,8  <at>  <at>  static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream
>              }
>              timeslen = arraylen;
>              current_array = times;
> -        } else if (!strcmp(KEYFRAMES_BYTEOFFSET_TAG, str_val) && !filepositions) {
> +        } else if (!strcmp(KEYFRAMES_BYTEOFFSET_TAG, str_val) &&
> +                   !filepositions) {
>              if (!(filepositions = av_mallocz(sizeof(*filepositions) * arraylen))) {
>                  ret = AVERROR(ENOMEM);
>                  goto finish;
>  <at>  <at>  -237,7 +269,10  <at>  <at>  finish:
>      return ret;
>  }
>  
> -static int amf_parse_object(AVFormatContext *s, AVStream *astream, AVStream *vstream, const char
*key, int64_t max_pos, int depth) {
> +static int amf_parse_object(AVFormatContext *s,
> +                            AVStream *astream, AVStream *vstream,
> +                            const char *key, int64_t max_pos, int depth)
> +{
>      AVCodecContext *acodec, *vcodec;
>      AVIOContext *ioc;
>      AMFDataType amf_type;
>  <at>  <at>  -250,59 +285,66  <at>  <at>  static int amf_parse_object(AVFormatContext *s, AVStream *astream, AVStream *vst
>      amf_type = avio_r8(ioc);
>  
>      switch(amf_type) {
> -        case AMF_DATA_TYPE_NUMBER:
> -            num_val = av_int2double(avio_rb64(ioc)); break;
> -        case AMF_DATA_TYPE_BOOL:
> -            num_val = avio_r8(ioc); break;
> -        case AMF_DATA_TYPE_STRING:
> -            if(amf_get_string(ioc, str_val, sizeof(str_val)) < 0)
> -                return -1;
> -            break;
> -        case AMF_DATA_TYPE_OBJECT:
> -            if ((vstream || astream) && key && !strcmp(KEYFRAMES_TAG, key) && depth == 1)
> -                if (parse_keyframes_index(s, ioc, vstream ? vstream : astream,
> -                                          max_pos) < 0)
> -                    return -1;
> -
> -            while (avio_tell(ioc) < max_pos - 2 && amf_get_string(ioc, str_val, sizeof(str_val)) > 0) {
> -                if (amf_parse_object(s, astream, vstream, str_val, max_pos, depth + 1) < 0)
> -                    return -1; //if we couldn't skip, bomb out.
> -            }
> -            if(avio_r8(ioc) != AMF_END_OF_OBJECT)
> -                return -1;
> -            break;
> -        case AMF_DATA_TYPE_NULL:
> -        case AMF_DATA_TYPE_UNDEFINED:
> -        case AMF_DATA_TYPE_UNSUPPORTED:
> -            break; //these take up no additional space
> -        case AMF_DATA_TYPE_MIXEDARRAY:
> -            avio_skip(ioc, 4); //skip 32-bit max array index
> -            while(avio_tell(ioc) < max_pos - 2 && amf_get_string(ioc, str_val, sizeof(str_val)) > 0) {
> -                //this is the only case in which we would want a nested parse to not skip over the object
> -                if(amf_parse_object(s, astream, vstream, str_val, max_pos, depth + 1) < 0)
> -                    return -1;
> -            }
> -            if(avio_r8(ioc) != AMF_END_OF_OBJECT)
> +    case AMF_DATA_TYPE_NUMBER:
> +        num_val = av_int2double(avio_rb64(ioc));
> +        break;
> +    case AMF_DATA_TYPE_BOOL:
> +        num_val = avio_r8(ioc);
> +        break;
> +    case AMF_DATA_TYPE_STRING:
> +        if(amf_get_string(ioc, str_val, sizeof(str_val)) < 0)

diego-space-nit

> +            return -1;
> +        break;
> +    case AMF_DATA_TYPE_OBJECT:
> +        if ((vstream || astream) && key &&
> +            !strcmp(KEYFRAMES_TAG, key) && depth == 1)
> +            if (parse_keyframes_index(s, ioc, vstream ? vstream : astream,
> +                                      max_pos) < 0)
>                  return -1;
> -            break;
> -        case AMF_DATA_TYPE_ARRAY: {
> -            unsigned int arraylen, i;
>  
> -            arraylen = avio_rb32(ioc);
> -            for(i = 0; i < arraylen && avio_tell(ioc) < max_pos - 1; i++) {
> -                if(amf_parse_object(s, NULL, NULL, NULL, max_pos, depth + 1) < 0)
> -                    return -1; //if we couldn't skip, bomb out.
> -            }
> +        while (avio_tell(ioc) < max_pos - 2 &&
> +               amf_get_string(ioc, str_val, sizeof(str_val)) > 0) {
> +            if (amf_parse_object(s, astream, vstream, str_val,
> +                max_pos, depth + 1) < 0)
> +                return -1; //if we couldn't skip, bomb out.
>          }
> -            break;
> -        case AMF_DATA_TYPE_DATE:
> -            avio_skip(ioc, 8 + 2); //timestamp (double) and UTC offset (int16)
> -            break;
> -        default: //unsupported type, we couldn't skip
> +        if (avio_r8(ioc) != AMF_END_OF_OBJECT)
>              return -1;
> +        break;
> +    case AMF_DATA_TYPE_NULL:
> +    case AMF_DATA_TYPE_UNDEFINED:
> +    case AMF_DATA_TYPE_UNSUPPORTED:
> +        break; //these take up no additional space
> +    case AMF_DATA_TYPE_MIXEDARRAY:
> +        avio_skip(ioc, 4); //skip 32-bit max array index
> +        while(avio_tell(ioc) < max_pos - 2 &&
> +              amf_get_string(ioc, str_val, sizeof(str_val)) > 0) {
> +            //this is the only case in which we would want a nested parse to not skip over the object
> +            if (amf_parse_object(s, astream, vstream, str_val, max_pos, depth + 1) < 0)
> +                return -1;
> +        }
> +        if(avio_r8(ioc) != AMF_END_OF_OBJECT)

diego-space-nits for while() and if()

> +            return -1;
> +        break;
> +    case AMF_DATA_TYPE_ARRAY: {
> +        unsigned int arraylen, i;
> +
> +        arraylen = avio_rb32(ioc);
> +        for (i = 0; i < arraylen && avio_tell(ioc) < max_pos - 1; i++) {
> +            if (amf_parse_object(s, NULL, NULL, NULL, max_pos, depth + 1) < 0)
> +                return -1; //if we couldn't skip, bomb out.
> +        }
> +    }
> +        break;
> +    case AMF_DATA_TYPE_DATE:
> +        avio_skip(ioc, 8 + 2); //timestamp (double) and UTC offset (int16)
> +        break;
> +    default: //unsupported type, we couldn't skip
> +        return -1;
>      }
>  
> -    if(depth == 1 && key) { //only look for metadata values when we are not nested and key != NULL
> +    //only look for metadata values when we are not nested and key != NULL
> +    if (depth == 1 && key) {
>          acodec = astream ? astream->codec : NULL;
>          vcodec = vstream ? vstream->codec : NULL;
>  
>  <at>  <at>  -348,18 +390,19  <at>  <at>  static int amf_parse_object(AVFormatContext *s, AVStream *astream, AVStream *vst
>      return 0;
>  }
>  
> -static int flv_read_metabody(AVFormatContext *s, int64_t next_pos) {
> +static int flv_read_metabody(AVFormatContext *s, int64_t next_pos)
> +{
>      AMFDataType type;
>      AVStream *stream, *astream, *vstream;
>      AVIOContext *ioc;
>      int i;
> -    char buffer[11]; //only needs to hold the string "onMetaData". Anything longer is something we don't want.
> +    char buffer[11]; // We are interested only in onMetaData and onTextData
>  
>      astream = NULL;
>      vstream = NULL;
>      ioc = s->pb;
>  
> -    //first object needs to be "onMetaData" string
> +    // first object needs to be a string
>      type = avio_r8(ioc);
>      if (type != AMF_DATA_TYPE_STRING ||
>          amf_get_string(ioc, buffer, sizeof(buffer)) < 0)
>  <at>  <at>  -371,14 +414,19  <at>  <at>  static int flv_read_metabody(AVFormatContext *s, int64_t next_pos) {
>      if (strcmp(buffer, "onMetaData"))
>          return -1;
>  
> -    //find the streams now so that amf_parse_object doesn't need to do the lookup every time it is called.
> +    /*
> +     * find the streams now so that amf_parse_object does not need
> +     * to do the lookup every time it is called.
> +     */
>      for(i = 0; i < s->nb_streams; i++) {
>          stream = s->streams[i];
> -        if     (stream->codec->codec_type == AVMEDIA_TYPE_AUDIO) astream = stream;
> -        else if(stream->codec->codec_type == AVMEDIA_TYPE_VIDEO) vstream = stream;
> +        if (stream->codec->codec_type == AVMEDIA_TYPE_AUDIO)
> +            astream = stream;
> +        else if (stream->codec->codec_type == AVMEDIA_TYPE_VIDEO)
> +            vstream = stream;
>      }
>  
> -    //parse the second object (we want a mixed array)
> +    // parse the second object (we want a mixed array)
>      if(amf_parse_object(s, astream, vstream, buffer, next_pos, 0) < 0)
>          return -1;
>  
>  <at>  <at>  -395,7 +443,9  <at>  <at>  static int flv_read_header(AVFormatContext *s)
>      /* FIXME: better fix needed */
>      if (!flags) {
>          flags = FLV_HEADER_FLAG_HASVIDEO | FLV_HEADER_FLAG_HASAUDIO;
> -        av_log(s, AV_LOG_WARNING, "Broken FLV file, which says no streams present, this might fail\n");
> +        av_log(s, AV_LOG_WARNING,
> +               "Broken FLV file, which says no streams present, "
> +               "this might fail\n");
>      }
>  
>      if((flags & (FLV_HEADER_FLAG_HASVIDEO|FLV_HEADER_FLAG_HASAUDIO))
>  <at>  <at>  -454,7 +504,8  <at>  <at>  static int flv_queue_extradata(FLVContext *flv, AVIOContext *pb, int stream,
>  static void clear_index_entries(AVFormatContext *s, int64_t pos)
>  {
>      int i, j, out;
> -    av_log(s, AV_LOG_WARNING, "Found invalid index entries, clearing the index.\n");
> +    av_log(s, AV_LOG_WARNING,
> +           "Found invalid index entries, clearing the index.\n");
>      for (i = 0; i < s->nb_streams; i++) {
>          AVStream *st = s->streams[i];
>          /* Remove all index entries that point to >= pos */
>  <at>  <at>  -490,7 +541,7  <at>  <at>  static int flv_data_packet(AVFormatContext *s, AVPacket *pkt,
>          goto out;
>  
>      amf_get_string(pb, buf, sizeof(buf));
> -    //FIXME parse it as codec_id
> +    // FIXME parse it as codec_id
>      amf_get_string(pb, buf, sizeof(buf));
>      if (strcmp(buf, "text") || avio_r8(pb) != AMF_DATA_TYPE_STRING)
>          goto out;
>  <at>  <at>  -536,99 +587,107  <at>  <at>  static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
>      int sample_rate = 0, channels = 0;
>      AVStream *st = NULL;
>  
> - for(;;avio_skip(s->pb, 4)){ /* pkt size is repeated at end. skip it */
> -    pos = avio_tell(s->pb);
> -    type = avio_r8(s->pb);
> -    size = avio_rb24(s->pb);
> -    dts = avio_rb24(s->pb);
> -    dts |= avio_r8(s->pb) << 24;
> -    av_dlog(s, "type:%d, size:%d, dts:%"PRId64"\n", type, size, dts);
> -    if (s->pb->eof_reached)
> -        return AVERROR_EOF;
> -    avio_skip(s->pb, 3); /* stream id, always 0 */
> -    flags = 0;
> -
> -    if (flv->validate_next < flv->validate_count) {
> -        int64_t validate_pos = flv->validate_index[flv->validate_next].pos;
> -        if (pos == validate_pos) {
> -            if (FFABS(dts - flv->validate_index[flv->validate_next].dts) <=
> -                VALIDATE_INDEX_TS_THRESH) {
> -                flv->validate_next++;
> -            } else {
> +    for(;;avio_skip(s->pb, 4)) { /* pkt size is repeated at end. skip it */
> +        pos  = avio_tell(s->pb);
> +        type = avio_r8(s->pb);
> +        size = avio_rb24(s->pb);
> +        dts  = avio_rb24(s->pb);
> +        dts |= avio_r8(s->pb) << 24;
> +        av_dlog(s, "type:%d, size:%d, dts:%"PRId64"\n", type, size, dts);
> +        if (s->pb->eof_reached)
> +            return AVERROR_EOF;
> +        avio_skip(s->pb, 3); /* stream id, always 0 */
> +        flags = 0;
> +
> +        if (flv->validate_next < flv->validate_count) {
> +            int64_t validate_pos = flv->validate_index[flv->validate_next].pos;
> +            if (pos == validate_pos) {
> +                if (FFABS(dts - flv->validate_index[flv->validate_next].dts) <=
> +                    VALIDATE_INDEX_TS_THRESH) {
> +                    flv->validate_next++;
> +                } else {
> +                    clear_index_entries(s, validate_pos);
> +                    flv->validate_count = 0;
> +                }
> +            } else if (pos > validate_pos) {
>                  clear_index_entries(s, validate_pos);
>                  flv->validate_count = 0;
>              }
> -        } else if (pos > validate_pos) {
> -            clear_index_entries(s, validate_pos);
> -            flv->validate_count = 0;
>          }
> -    }
> -
> -    if(size == 0)
> -        continue;
>  
> -    next= size + avio_tell(s->pb);
> +        if (size == 0)
> +            continue;
> +
> +        next= size + avio_tell(s->pb);

ahem

> +
> +        if (type == FLV_TAG_TYPE_AUDIO) {
> +            is_audio = 1;
> +            flags = avio_r8(s->pb);
> +            size--;
> +        } else if (type == FLV_TAG_TYPE_VIDEO) {
> +            is_audio = 0;
> +            flags = avio_r8(s->pb);
> +            size--;
> +            if ((flags & 0xf0) == 0x50) /* video info / command frame */
> +                goto skip;
> +        } else {
> +            if (type == FLV_TAG_TYPE_META && size > 13 + 1 + 4)
> +                if (flv_read_metabody(s, next) > 0) {
> +                    return flv_data_packet(s, pkt, dts, next);
> +                }
> +            else /* skip packet */
> +                av_log(s, AV_LOG_DEBUG,
> +                       "skipping flv packet: type %d, size %d, flags %d\n",
> +                       type, size, flags);
> +        skip:
> +            avio_seek(s->pb, next, SEEK_SET);
> +            continue;
> +        }
>  
> -    if (type == FLV_TAG_TYPE_AUDIO) {
> -        is_audio=1;
> -        flags = avio_r8(s->pb);
> -        size--;
> -    } else if (type == FLV_TAG_TYPE_VIDEO) {
> -        is_audio=0;
> -        flags = avio_r8(s->pb);
> -        size--;
> -        if ((flags & 0xf0) == 0x50) /* video info / command frame */
> -            goto skip;
> -    } else {
> -        if (type == FLV_TAG_TYPE_META && size > 13+1+4)
> -            if (flv_read_metabody(s, next) > 0) {
> -                return flv_data_packet(s, pkt, dts, next);
> -            }
> -        else /* skip packet */
> -            av_log(s, AV_LOG_DEBUG, "skipping flv packet: type %d, size %d, flags %d\n", type, size, flags);
> -    skip:
> -        avio_seek(s->pb, next, SEEK_SET);
> -        continue;
> -    }
> +        /* skip empty data packets */
> +        if (!size)
> +            continue;
>  
> -    /* skip empty data packets */
> -    if (!size)
> -        continue;
> +        /* now find stream */
> +        for(i=0;i<s->nb_streams;i++) {
> +            st = s->streams[i];
> +            if (st->id == is_audio)
> +                break;
> +        }
>  
> -    /* now find stream */
> -    for(i=0;i<s->nb_streams;i++) {
> -        st = s->streams[i];
> -        if (st->id == is_audio)
> -            break;
> -    }
> -    if(i == s->nb_streams){
> -        av_log(s, AV_LOG_ERROR, "invalid stream\n");
> -        st = create_stream(s, is_audio,
> -             is_audio ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO);
> -        s->ctx_flags &= ~AVFMTCTX_NOHEADER;
> -    }
> -    av_dlog(s, "%d %X %d \n", is_audio, flags, st->discard);
> -    if(  (st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY ||         is_audio))
> -       ||(st->discard >= AVDISCARD_BIDIR  &&  ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_DISP_INTER
&& !is_audio))
> -       || st->discard >= AVDISCARD_ALL
> -       ){
> -        avio_seek(s->pb, next, SEEK_SET);
> -        continue;
> -    }
> -    if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY)
> -        av_add_index_entry(st, pos, dts, size, 0, AVINDEX_KEYFRAME);
> -    break;
> - }
> +        if (i == s->nb_streams) {
> +            av_log(s, AV_LOG_ERROR, "invalid stream\n");
> +            st = create_stream(s, is_audio,
> +                               is_audio ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO);
> +            s->ctx_flags &= ~AVFMTCTX_NOHEADER;
> +        }
> +        av_dlog(s, "%d %X %d \n", is_audio, flags, st->discard);
> +        if ((st->discard >= AVDISCARD_NONKEY &&
> +             !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY ||
> +                is_audio)) ||
> +            (st->discard >= AVDISCARD_BIDIR  &&
> +              ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_DISP_INTER &&
> +               !is_audio)) ||
> +             st->discard >= AVDISCARD_ALL
> +           ) {
> +            avio_seek(s->pb, next, SEEK_SET);
> +            continue;
> +        }
> +        if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY)
> +            av_add_index_entry(st, pos, dts, size, 0, AVINDEX_KEYFRAME);
> +        break;
> +     }
>  
>      // if not streamed and no duration from metadata then seek to end to find the duration from the timestamps
> -    if(s->pb->seekable && (!s->duration || s->duration==AV_NOPTS_VALUE)){
> +    if (s->pb->seekable && (!s->duration || s->duration==AV_NOPTS_VALUE)) {
>          int size;
> -        const int64_t pos= avio_tell(s->pb);
> -        const int64_t fsize= avio_size(s->pb);
> -        avio_seek(s->pb, fsize-4, SEEK_SET);
> +        const int64_t pos   = avio_tell(s->pb);
> +        const int64_t fsize = avio_size(s->pb);
> +
> +        avio_seek(s->pb, fsize - 4, SEEK_SET);
>          size= avio_rb32(s->pb);
> -        avio_seek(s->pb, fsize-3-size, SEEK_SET);
> -        if(size == avio_rb24(s->pb) + 11){
> +        avio_seek(s->pb, fsize - 3 - size, SEEK_SET);
> +        if(size == avio_rb24(s->pb) + 11) {

diego-space-nit

>              uint32_t ts = avio_rb24(s->pb);
>              ts |= avio_r8(s->pb) << 24;
>              s->duration = ts * (int64_t)AV_TIME_BASE / 1000;
>  <at>  <at>  -636,18 +695,21  <at>  <at>  static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
>          avio_seek(s->pb, pos, SEEK_SET);
>      }
>  
> -    if(is_audio){
> +    if (is_audio) {
>          int bits_per_coded_sample;
>          channels    = (flags & FLV_AUDIO_CHANNEL_MASK) == FLV_STEREO ? 2 : 1;
>          sample_rate = (44100 << ((flags & FLV_AUDIO_SAMPLERATE_MASK) >> FLV_AUDIO_SAMPLERATE_OFFSET) >> 3);
>          bits_per_coded_sample = (flags & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8;
> -        if(!st->codec->channels || !st->codec->sample_rate || !st->codec->bits_per_coded_sample) {
> +        if (!st->codec->channels    ||
> +            !st->codec->sample_rate ||
> +            !st->codec->bits_per_coded_sample) {
>              st->codec->channels              = channels;
>              st->codec->sample_rate           = sample_rate;
>              st->codec->bits_per_coded_sample = bits_per_coded_sample;
>          }
> -        if(!st->codec->codec_id){
> -            flv_set_audio_codec(s, st, st->codec, flags & FLV_AUDIO_CODECID_MASK);
> +        if (!st->codec->codec_id) {
> +            flv_set_audio_codec(s, st, st->codec,
> +                                flags & FLV_AUDIO_CODECID_MASK);
>              flv->last_sample_rate = sample_rate = st->codec->sample_rate;
>              flv->last_channels    = channels    = st->codec->channels;
>          } else {
>  <at>  <at>  -656,7 +718,7  <at>  <at>  static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
>              flv_set_audio_codec(s, st, &ctx, flags & FLV_AUDIO_CODECID_MASK);
>              sample_rate = ctx.sample_rate;
>          }
> -    }else{
> +    } else {
>          size -= flv_set_video_codec(s, st, flags & FLV_VIDEO_CODECID_MASK);
>      }
>  
>  <at>  <at>  -665,11 +727,14  <at>  <at>  static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
>          int type = avio_r8(s->pb);
>          size--;
>          if (st->codec->codec_id == CODEC_ID_H264) {
> -            int32_t cts = (avio_rb24(s->pb)+0xff800000)^0xff800000; // sign extension
> +            // sign extension
> +            int32_t cts = (avio_rb24(s->pb) + 0xff800000)^0xff800000;
> +
>              pts = dts + cts;
>              if (cts < 0) { // dts are wrong
>                  flv->wrong_dts = 1;
> -                av_log(s, AV_LOG_WARNING, "negative cts, previous timestamps might be wrong\n");
> +                av_log(s, AV_LOG_WARNING,
> +                       "negative cts, previous timestamps might be wrong\n");
>              }
>              if (flv->wrong_dts)
>                  dts = AV_NOPTS_VALUE;
>  <at>  <at>  -707,15 +772,16  <at>  <at>  static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
>          goto leave;
>      }
>  
> -    ret= av_get_packet(s->pb, pkt, size);
> +    ret = av_get_packet(s->pb, pkt, size);
>      if (ret < 0) {
>          return AVERROR(EIO);
>      }
>      /* note: we need to modify the packet size here to handle the last
>         packet */
>      pkt->size = ret;
> -    pkt->dts = dts;
> -    pkt->pts = pts == AV_NOPTS_VALUE ? dts : pts;
> +    pkt->dts  = dts;
> +    pkt->pts  = pts == AV_NOPTS_VALUE ? dts : pts;
> +
>      pkt->stream_index = st->index;
>      if (flv->new_extradata[is_audio]) {
>          uint8_t *side = av_packet_new_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA,
>  <at>  <at>  -727,6 +793,7  <at>  <at>  static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
>              flv->new_extradata_size[is_audio] = 0;
>          }
>      }
> +
>      if (is_audio && (sample_rate != flv->last_sample_rate ||
>                       channels != flv->last_channels)) {
>          flv->last_sample_rate = sample_rate;
>  <at>  <at>  -743,7 +810,7  <at>  <at>  leave:
>  }
>  
>  static int flv_read_seek(AVFormatContext *s, int stream_index,
> -    int64_t ts, int flags)
> +                         int64_t ts, int flags)
>  {
>      FLVContext *flv = s->priv_data;
>      flv->validate_count = 0;
> -- 

if you fix these (and add spaces to for() loop in flv_packet_data())
you can commit it, probably even squashing all cosmetics patches together

Patchset in general LGTM
aviad rozenhek | 1 Jun 2012 06:49
Picon
Gravatar

Re: IGMP v3



On 1 ביונ 2012, at 01:55, "Martin Storsjö" <martin-TqfNSX0MhmxeoWH0uzbU5w@public.gmane.org> wrote:

On Fri, 25 May 2012, Martin Storsjᅵ wrote:

On Thu, 24 May 2012, Martin Storsjᅵ wrote:

On Thu, 24 May 2012, aviad rozenhek wrote:
On Sun, May 20, 2012 at 8:10 PM, aviad rozenhek <aviadr1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
           >> I had a copy of the old mail and have added it to
           my local git repo. I'll
           >> add it to my todo list to try to rebase it on top
           of the latest version and
           >> have a look at it...
           >>
           >> // Martin
           >
           >
           > thanks! I actually just managed to find it by
           including omitted search
           > results from google ... :-)
           >
Seems straightforward, just needs some changes to fit with the
new udp
proto indeed.
lu
did you have a chance to rebase the patch?
if you can provide a build, I have a test environment I can run it on.
Sorry, haven't gotten to this yet.

Here's a rebased version. I haven't touched at all yet, it doesn't compile on OS X, but seems to compile on Linux. I'll try to have a closer look at it later...

Attached is a slightly cleaned up version, although I haven't tested it. Aviad, does this still work for you?


I'll test on monday, thanks!

// Martin
<0001-udp-Support-IGMPv3-source-specific-multicast-and-sou.patch>
_______________________________________________
libav-devel mailing list
libav-devel-LOOeJiBropLYtjvyW6yDsg@public.gmane.org
https://lists.libav.org/mailman/listinfo/libav-devel
<div>
<div><div><br></div></div>
<div>
<br>On 1 &#1489;&#1497;&#1493;&#1504; 2012, at 01:55, "Martin Storsj&ouml;" &lt;<a href="mailto:martin <at> martin.st">martin@...</a>&gt; wrote:<br><br>
</div>
<div></div>
<blockquote type="cite"><div>
<span>On Fri, 25 May 2012, Martin Storsj&iuml;&iquest;&oelig; wrote:</span><br><span></span><br><blockquote type="cite">
<span>On Thu, 24 May 2012, Martin Storsj&iuml;&iquest;&oelig; wrote:</span><br>
</blockquote>
<blockquote type="cite">
<span></span><br>
</blockquote>
<blockquote type="cite"><blockquote type="cite">
<span>On Thu, 24 May 2012, aviad rozenhek wrote:</span><br>
</blockquote></blockquote>
<blockquote type="cite"><blockquote type="cite">
<blockquote type="cite">
<span>On Sun, May 20, 2012 at 8:10 PM, aviad rozenhek &lt;<a href="mailto:aviadr1@...">aviadr1@...</a>&gt; wrote:</span><br>
</blockquote>
</blockquote></blockquote>
<blockquote type="cite">
<blockquote type="cite"><blockquote type="cite">
<span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt; I had a copy of the old mail and have added it to</span><br>
</blockquote></blockquote>
</blockquote>
<blockquote type="cite"><blockquote type="cite">
<blockquote type="cite">
<span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my local git repo. I'll</span><br>
</blockquote>
</blockquote></blockquote>
<blockquote type="cite"><blockquote type="cite"><blockquote type="cite">
<span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt; add it to my todo list to try to rebase it on top</span><br>
</blockquote></blockquote></blockquote>
<blockquote type="cite"><blockquote type="cite"><blockquote type="cite">
<span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of the latest version and</span><br>
</blockquote></blockquote></blockquote>
<blockquote type="cite">
<blockquote type="cite"><blockquote type="cite">
<span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt; have a look at it...</span><br>
</blockquote></blockquote>
</blockquote>
<blockquote type="cite"><blockquote type="cite"><blockquote type="cite">
<span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt;</span><br>
</blockquote></blockquote></blockquote>
<blockquote type="cite"><blockquote type="cite"><blockquote type="cite">
<span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt; // Martin</span><br>
</blockquote></blockquote></blockquote>
<blockquote type="cite">
<blockquote type="cite"><blockquote type="cite">
<span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;</span><br>
</blockquote></blockquote>
</blockquote>
<blockquote type="cite"><blockquote type="cite"><blockquote type="cite">
<span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;</span><br>
</blockquote></blockquote></blockquote>
<blockquote type="cite"><blockquote type="cite"><blockquote type="cite">
<span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt; thanks! I actually just managed to find it by</span><br>
</blockquote></blockquote></blockquote>
<blockquote type="cite"><blockquote type="cite"><blockquote type="cite">
<span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;including omitted search</span><br>
</blockquote></blockquote></blockquote>
<blockquote type="cite"><blockquote type="cite"><blockquote type="cite">
<span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt; results from google ... :-)</span><br>
</blockquote></blockquote></blockquote>
<blockquote type="cite">
<blockquote type="cite"><blockquote type="cite">
<span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;</span><br>
</blockquote></blockquote>
</blockquote>
<blockquote type="cite"><blockquote type="cite"><blockquote type="cite">
<span>Seems straightforward, just needs some changes to fit with the</span><br>
</blockquote></blockquote></blockquote>
<blockquote type="cite">
<blockquote type="cite"><blockquote type="cite">
<span>new udp</span><br>
</blockquote></blockquote>
</blockquote>
<blockquote type="cite"><blockquote type="cite">
<blockquote type="cite">
<span>proto indeed.</span><br>
</blockquote>
</blockquote></blockquote>
<blockquote type="cite"><blockquote type="cite"><blockquote type="cite">
<span>lu</span><br>
</blockquote></blockquote></blockquote>
<blockquote type="cite"><blockquote type="cite"><blockquote type="cite">
<span>did you have a chance to rebase the patch?</span><br>
</blockquote></blockquote></blockquote>
<blockquote type="cite"><blockquote type="cite"><blockquote type="cite">
<span>if you can provide a build, I have a test environment I can run it on.</span><br>
</blockquote></blockquote></blockquote>
<blockquote type="cite"><blockquote type="cite">
<span>Sorry, haven't gotten to this yet.</span><br>
</blockquote></blockquote>
<blockquote type="cite">
<span></span><br>
</blockquote>
<blockquote type="cite">
<span>Here's a rebased version. I haven't touched at all yet, it doesn't compile on OS X, but seems to compile on Linux. I'll try to have a closer look at it later...</span><br>
</blockquote>
<span></span><br><span>Attached is a slightly cleaned up version, although I haven't tested it. Aviad, does this still work for you?</span><br><span></span><br>
</div></blockquote>
<div><br></div>
<div>I'll test on monday, thanks!</div>
<br><blockquote type="cite"><div><span>// Martin</span></div></blockquote>
<blockquote type="cite"><div>&lt;0001-udp-Support-IGMPv3-source-specific-multicast-and-sou.patch&gt;</div></blockquote>
<blockquote type="cite"><div>
<span>_______________________________________________</span><br><span>libav-devel mailing list</span><br><span><a href="mailto:libav-devel@...">libav-devel@...</a></span><br><span><a href="https://lists.libav.org/mailman/listinfo/libav-devel">https://lists.libav.org/mailman/listinfo/libav-devel</a></span><br>
</div></blockquote>
</div>
Martin Storsjö | 1 Jun 2012 09:54

Re: [PATCH] udp: Support IGMPv3 source specific multicast and source blocking

On Thu, 31 May 2012, Luca Barbato wrote:

>  <at>  <at>  -163,6 +166,49  <at>  <at>  static struct addrinfo* udp_resolve_host(const char *hostname, int port,
>     return res;
> }
>
> +static int udp_set_multicast_sources(int sockfd, struct sockaddr *addr,
> +                                     char **sources, int nb_sources,
> +                                     int include)
> +{
> +    int i;
> +    if (addr->sa_family != AF_INET) {
> +        av_log(NULL, AV_LOG_ERROR,
> +               "Setting multicast sources only supported for IPv4 for now\n");
> +        return AVERROR_PATCHWELCOME;
> +    }
> +#if HAVE_STRUCT_IP_MREQ_SOURCE && defined(IP_BLOCK_SOURCE)
> +    for (i = 0; i < nb_sources; i++) {
> +        struct ip_mreq_source mreqs;
> +        struct addrinfo *sourceaddr = udp_resolve_host(sources[i], 0,
> +                                                       SOCK_DGRAM, AF_UNSPEC,
> +                                                       AI_NUMERICHOST);
> +        if (!sourceaddr)
> +            return -1;
> +        if (sourceaddr->ai_addr->sa_family != AF_INET) {
> +            freeaddrinfo(sourceaddr);
> +            av_log(NULL, AV_LOG_ERROR, "%s is of incorrect protocol family\n",
> +                   sources[i]);
> +            return AVERROR(EINVAL);
> +        }
> +
> +        mreqs.imr_multiaddr.s_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
> +        mreqs.imr_interface.s_addr = INADDR_ANY;
> +        mreqs.imr_sourceaddr.s_addr = ((struct sockaddr_in *)sourceaddr->ai_addr)->sin_addr.s_addr;
> +        freeaddrinfo(sourceaddr);
> +
> +        if (setsockopt(sockfd, IPPROTO_IP,
> +                       include ? IP_ADD_SOURCE_MEMBERSHIP : IP_BLOCK_SOURCE,
> +                       (const void *)&mreqs, sizeof(mreqs)) < 0) {
> +            int err = errno;
> +            av_log(NULL, AV_LOG_ERROR, "setsockopt(%s): %s\n",
> +                   include ? "IP_ADD_SOURCE_MEMBERSHIP" : "IP_BLOCK_SOURCE",
> +                   strerror(err));
> +            return AVERROR(err);
> +        }

Was this errno fix the only change from my version? This doesn't 
necessarily work on windows, we should use ff_neterrno() instead, but I'm 
not sure if we have anything hooked up for using that with strerror (otoh, 
iirc winsock doesn't even have any function for getting a suitable string 
for a socket error). While this in principle is better than just returning 
-1, I'm afraid this might just return 0 on windows.

// Martin

Gmane