On Thu, 12 Apr 2012, Samuel Pitoiset wrote:



On Thu, Apr 12, 2012 at 6:18 PM, Samuel Pitoiset <[email protected]>
wrote:


      ---------- Forwarded message ----------
      From: Samuel Pitoiset <[email protected]>
      Date: Thu, Apr 12, 2012 at 6:17 PM
      Subject: Re: [libav-devel] [PATCH] rtmp: Support 'app', an
      option which overrides the name of application [GSoC]
      To: Anton Khirnov <[email protected]>




      On Thu, Apr 12, 2012 at 8:00 AM, Anton Khirnov
      <[email protected]> wrote:

            On Mon,  9 Apr 2012 00:51:26 +0200, Samuel Pitoiset
            <[email protected]> wrote:
            > Sometimes the URL parser cannot determine the app
            name automatically,
            > so it must be given explicitly using this option
            (ie. -app).
            > ---
            >  libavformat/rtmpproto.c |   40
            +++++++++++++++++++++++++++++++++++++++-
            >  1 file changed, 39 insertions(+), 1 deletion(-)
            >
            > diff --git a/libavformat/rtmpproto.c
            b/libavformat/rtmpproto.c
            > index 7683559..be82f0f 100644
            > --- a/libavformat/rtmpproto.c
            > +++ b/libavformat/rtmpproto.c
            > @@ -28,6 +28,7 @@
            >  #include "libavutil/avstring.h"
            >  #include "libavutil/intfloat.h"
            >  #include "libavutil/lfg.h"
            > +#include "libavutil/opt.h"
            >  #include "libavutil/sha.h"
            >  #include "avformat.h"
            >  #include "internal.h"
            > @@ -41,6 +42,8 @@
            >
            >  //#define DEBUG
            >
            > +#define APP_MAX_LENGTH 128
            > +
            >  /** RTMP protocol handler state */
            >  typedef enum {
            >      STATE_START,      ///< client has not done
            anything yet
            > @@ -56,12 +59,13 @@ typedef enum {
            >
            >  /** protocol handler context */
            >  typedef struct RTMPContext {
            > +    const AVClass *class;
            >      URLContext*   stream;                    
            ///< TCP stream used in interactions with RTMP
            server
            >      RTMPPacket    prev_pkt[2][RTMP_CHANNELS];
            ///< packet history used when reading and sending
            packets
            >      int           chunk_size;                
            ///< size of the chunks RTMP packets are divided
            into
            >      int           is_input;                  
            ///< input/output flag
            >      char          playpath[256];            
             ///< path to filename to play (with possible "mp4:"
            prefix)
            > -    char          app[128];                  
            ///< application
            > +    char          *app;                      
            ///< name of application
            >      ClientState   state;                    
             ///< current state
            >      int           main_channel_id;          
             ///< an additional channel ID which is used for
            some invocations
            >      uint8_t*      flv_data;                  
            ///< buffer with data for demuxer
            > @@ -822,6 +826,7 @@ static int
            rtmp_open(URLContext *s, const char *uri, int flags)
            >  {
            >      RTMPContext *rt = s->priv_data;
            >      char proto[8], hostname[256], path[1024],
            *fname;
            > +    char *old_app;
            >      uint8_t buf[2048];
            >      int port;
            >      int ret;
            > @@ -847,6 +852,16 @@ static int
            rtmp_open(URLContext *s, const char *uri, int flags)
            >
            >      rt->chunk_size = 128;
            >      rt->state = STATE_HANDSHAKED;
            > +
            > +    // Keep the application name when it has been
            defined by the user.
            > +    old_app = rt->app ? av_strdup(rt->app) :
            NULL;
            > +
            > +    rt->app = av_malloc(APP_MAX_LENGTH);

Aren't you leaking rt->app here?
Strings set by AVOptions are malloced, there's no need for
strdup I
think.


No, there is no memleaks here.

Did you try it in valgrind? When I try, I get leaks here.

And Martin Storsjö said "IIRC this shouldn't be needed, if you've
declared it as an option, the normal option handling logic should free
it (regardless if you've set it via an option or set by the protocol
code itself)."

No, that wasn't related to these particular lines. I meant that you don't need to free the app pointer in the rtmp_close function, since the option freeing logic will free it.

I have to store the old value of the application name when it has been
defined by the user, so strdup() is required.

No - if the string is set here already, it is an allocated string (with no other references to it than this), so if you strdup it, you will have two allocations of the same and leak the first one.



Bonus issue to fix: Earlier, you'd have to specify everything as rtmp://server/<app>/<playpath>. Now you can do e.g. avconv -application <app> -playpath <playpath> -i rtmp://server/.

If you instead of -i rtmp://server/ just do -i rtmp://server, the code will use uninitialized memory. A fix for that is also welcome. :-)


Also, I'd much rather have the parameter named rtmp_app instead of the overly generic app/application, I think all others also agreed on that.

We've got the option rtsp_transport for rtsp, too, since it would feel overly generic without the prefix.

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

Reply via email to