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.
> + if (!rt->app) {
> + rtmp_close(s);
> + return AVERROR(ENOMEM);
> + }
> +
> //extract "app" part from path
> if (!strncmp(path, "/ondemand/", 10)) {
> fname = path + 10;
> @@ -868,6 +883,13 @@ static int rtmp_open(URLContext *s, const char *uri, int
> flags)
> }
> }
> }
> +
> + if (old_app) {
> + // The name of application has been defined by the user, override it.
> + av_free(rt->app);
> + rt->app = old_app;
> + }
> +
> if (!strchr(fname, ':') &&
> (!strcmp(fname + strlen(fname) - 4, ".f4v") ||
> !strcmp(fname + strlen(fname) - 4, ".mp4"))) {
> @@ -1013,6 +1035,21 @@ static int rtmp_write(URLContext *s, const uint8_t
> *buf, int size)
> return size;
> }
>
> +#define OFFSET(x) offsetof(RTMPContext, x)
> +#define DEC AV_OPT_FLAG_DECODING_PARAM
> +
> +static const AVOption rtmp_options[] = {
> + {"app", "Name of application to connect to on the RTMP server",
> OFFSET(app), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC},
I believe I already said this on IRC, but let me repeat it here --
simply 'app' is a bit too short and uninformative for such a relatively
obscure option. Something like 'rtmp_app' would be better IMO.
--
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel