[FFmpeg-devel] [PATCH] RTMFP integration
Michael Niedermayer
michael at niedermayer.cc
Mon Feb 18 19:31:45 EET 2019
On Sat, Feb 16, 2019 at 09:40:06PM +0100, Thomas Jammet wrote:
> Hi everybody,
>
> You will find in attachment a patch proposal to add an optional RTMFP
> support in ffmpeg using librtmfp.
>
> For more information : https://github.com/MonaSolutions/librtmfp
>
> *--*
>
> *Thomas JAMMET*
> configure | 4
> doc/protocols.texi | 120 ++++++++++++++++++++++
> libavformat/Makefile | 1
> libavformat/librtmfp.c | 260 ++++++++++++++++++++++++++++++++++++++++++++++++
> libavformat/protocols.c | 1
> 5 files changed, 386 insertions(+)
> a4c87a2eea01d1e0886f6bdcfb96a39f5b38cd97 0001-Added-RTMFP-protocol-to-ffmpeg.patch
> From 2d6877f5cb7a9eeb65ed93fe1f6e1ba06229159d Mon Sep 17 00:00:00 2001
> From: Jammet Thomas <jammetthomas at gmail.com>
> Date: Sat, 16 Feb 2019 21:35:46 +0100
> Subject: [PATCH] Added RTMFP protocol to ffmpeg
>
> ---
> configure | 4 +
> doc/protocols.texi | 120 ++++++++++++++++++++++
> libavformat/Makefile | 1 +
> libavformat/librtmfp.c | 260 ++++++++++++++++++++++++++++++++++++++++++++++++
> libavformat/protocols.c | 1 +
> 5 files changed, 386 insertions(+)
> create mode 100644 libavformat/librtmfp.c
>
> diff --git a/configure b/configure
> index bf40c1dcb9..1b1fae433d 100755
> --- a/configure
> +++ b/configure
> @@ -257,6 +257,7 @@ External library support:
> --enable-librsvg enable SVG rasterization via librsvg [no]
> --enable-librubberband enable rubberband needed for rubberband filter [no]
> --enable-librtmp enable RTMP[E] support via librtmp [no]
> + --enable-librtmfp enable RTMFP support via librtmfp [no]
> --enable-libshine enable fixed-point MP3 encoding via libshine [no]
> --enable-libsmbclient enable Samba protocol via libsmbclient [no]
> --enable-libsnappy enable Snappy compression, needed for hap encoding [no]
> @@ -1754,6 +1755,7 @@ EXTERNAL_LIBRARY_LIST="
> libpulse
> librsvg
> librtmp
> + librtmfp
> libshine
> libsmbclient
> libsnappy
> @@ -3365,6 +3367,7 @@ librtmpe_protocol_deps="librtmp"
> librtmps_protocol_deps="librtmp"
> librtmpt_protocol_deps="librtmp"
> librtmpte_protocol_deps="librtmp"
> +librtmfp_protocol_deps="librtmfp"
> libsmbclient_protocol_deps="libsmbclient gplv3"
> libsrt_protocol_deps="libsrt"
> libsrt_protocol_select="network"
> @@ -6169,6 +6172,7 @@ enabled libopus && {
> enabled libpulse && require_pkg_config libpulse libpulse pulse/pulseaudio.h pa_context_new
> enabled librsvg && require_pkg_config librsvg librsvg-2.0 librsvg-2.0/librsvg/rsvg.h rsvg_handle_render_cairo
> enabled librtmp && require_pkg_config librtmp librtmp librtmp/rtmp.h RTMP_Socket
> +enabled librtmfp && require_pkg_config librtmfp librtmfp librtmfp/librtmfp.h RTMFP_Connect
> enabled librubberband && require_pkg_config librubberband "rubberband >= 1.8.1" rubberband/rubberband-c.h rubberband_new -lstdc++ && append librubberband_extralibs "-lstdc++"
> enabled libshine && require_pkg_config libshine shine shine/layer3.h shine_encode_buffer
> enabled libsmbclient && { check_pkg_config libsmbclient smbclient libsmbclient.h smbc_init ||
> diff --git a/doc/protocols.texi b/doc/protocols.texi
> index fb7725e058..e2e974a5cb 100644
> --- a/doc/protocols.texi
> +++ b/doc/protocols.texi
> @@ -834,6 +834,126 @@ To play the same stream using @command{ffplay}:
> ffplay "rtmp://myserver/live/mystream live=1"
> @end example
>
> + at section librtmfp
> +
> +Real-Time Media Flow Protocol.
> +
> +Requires the presence of the librtmfp headers and library during
> +configuration. You need to explicitly configure the build with
> +"--enable-librtmfp".
> +
> +This protocol provides most functionalities of the UDP protocol RTMFP :
> +unicast, direct p2p and multicast (via NetGroup).
> +
> +The required syntax for an RTMFP URL is:
> + at example
> +rtmfp://@var{hostname}[:@var{port}][/@var{app}][/@var{playpath}]
> + at end example
> +
> +The accepted parameters are:
> + at table @option
> +
> + at item hostname
> +The address of the RTMFP server.
> +
> + at item port
> +The number of the UDP port to use (by default is 1935).
> +
> + at item app
> +It is the name of the application to access. It usually corresponds to the
> +path where the application is installed on the RTMFP server (e.g.
> +/ondemand/,/flash/live/, etc.).
> +
> + at item playpath
> +It is the path or name of the resource to play with reference to the
> +application specified in app.
> + at end table
> +
> +Additionally, the following parameters can be set via command line options
> +(or in code via @code{AVOption}s):
> + at table @option
> +
> + at item rtmfp_socketReceiveSize
> +Socket receive buffer size.
> +
> + at item rtmfp_socketSendSize
> +Socket send buffer size.
> +
> + at item rtmfp_audioUnbuffered
> +Unbuffered audio mode (default to false).
> +
> + at item rtmfp_videoUnbuffered
> +Unbuffered video mode (default to false).
> +
> + at item rtmfp_peerId
> +Connect to a peer for playing.
> +
> + at item rtmfp_p2pPublishing
> +Publish the stream in p2p mode (default to false).
> +
> + at item rtmfp_netgroup
> +Publish/Play the stream into a NetGroup (multicast).
> +
> + at item rtmfp_fallbackUrl
> +(Only with @code{rtmfp_negtroup}) Try to play an RTMFP unicast stream url
> +until the NetGroup connection is not ready. Can produce undefined behavior
> +if the stream codecs are different.
> +
> + at item rtmfp_fallbackTimeout
> +(Only with @code{rtmfp_negtroup}) Set the timeout in milliseconds to start
> +fallback to unicast.
> +
> + at item rtmfp_disableRateControl
> +(Only with @code{rtmfp_negtroup}) Disable the P2P connection rate control
> +to avoid unwanted disconnection.
> +
> + at item rtmfp_pushLimit
> +(Only with @code{rtmfp_negtroup}) Specifies the maximum number (-1) of
> +peers to which we will send push fragments.
> +
> + at item rtmfp_updatePeriod
> +(Only with @code{rtmfp_negtroup}) Specifies the interval in milliseconds
> +between messages sent to peers informating them that the local node has
> +new p2p multicast media fragments available.
> +
> + at item rtmfp_windowDuration
> +(Only with @code{rtmfp_negtroup}) Specifies the duration in milliseconds
> +of the p2p multicast reassembly window.
> +
> + at item rtmfp_swfurl
> +URL of the SWF player. By default no value will be sent.
> +
> + at item rtmfp_app
> +Name of application to connect to on the RTMFP server (by default 'live').
> +
> + at item rtmfp_pageurl
> +URL of the web page in which the media was embedded. By default no value
> +will be sent.
> +
> + at item rtmfp_flashver
> +Version of the Flash plugin used to run the SWF player. By default
> + at code{WIN 20,0,0,286}.
> +
> + at item rtmfp_host
> +IPv4 host address to bind to (use this if you ave multiple interfaces).
> +
> + at item rtmfp_hostIPv6
> +IPv6 host address to bind to (use this if you ave multiple interfaces).
> + at end table
> +
> +For example to read with @command{ffplay} a multimedia resource named
> +"sample" from the application "vod" from an RTMFP server "myserver":
> + at example
> +ffplay rtmfp://myserver/vod/sample
> + at end example
> +
> +To publish a multimedia resource named "sample" to an RTMFP server:
> + at example
> +ffmpeg -re -i <input> -f flv rtmfp://myserver/sample
> + at end example
> +
> +For more information see: @url{https://github.com/MonaSolutions/librtmfp}.
> +
> @section rtp
>
> Real-time Transport Protocol.
> diff --git a/libavformat/Makefile b/libavformat/Makefile
> index c010fc83f9..fb3ccb9006 100644
> --- a/libavformat/Makefile
> +++ b/libavformat/Makefile
> @@ -626,6 +626,7 @@ OBJS-$(CONFIG_LIBRTMPE_PROTOCOL) += librtmp.o
> OBJS-$(CONFIG_LIBRTMPS_PROTOCOL) += librtmp.o
> OBJS-$(CONFIG_LIBRTMPT_PROTOCOL) += librtmp.o
> OBJS-$(CONFIG_LIBRTMPTE_PROTOCOL) += librtmp.o
> +OBJS-$(CONFIG_LIBRTMFP_PROTOCOL) += librtmfp.o
> OBJS-$(CONFIG_LIBSMBCLIENT_PROTOCOL) += libsmbclient.o
> OBJS-$(CONFIG_LIBSRT_PROTOCOL) += libsrt.o
> OBJS-$(CONFIG_LIBSSH_PROTOCOL) += libssh.o
> diff --git a/libavformat/librtmfp.c b/libavformat/librtmfp.c
> new file mode 100644
> index 0000000000..2e914deb88
> --- /dev/null
> +++ b/libavformat/librtmfp.c
> @@ -0,0 +1,260 @@
> +/*
> + * RTMFP network protocol
> + * Copyright (c) 2019 Thomas Jammet
> + *
> + * This file is part of FFmpeg.
> + *
> + * FFmpeg is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * FFmpeg is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with FFmpeg; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> + */
> +
> +/**
> + * @file
> + * RTMFP protocol based on https://github.com/MonaSolutions/librtmfp librtmfp
> + */
> +
> +#include "libavutil/avstring.h"
> +#include "libavutil/opt.h"
> +#include "avformat.h"
> +#if CONFIG_NETWORK
> +#include "network.h"
> +#endif
> +#include <sys/time.h>
> +
> +#include <librtmfp/librtmfp.h>
> +
> +typedef struct LibRTMFPContext {
> + const AVClass* class;
> + RTMFPConfig rtmfp;
> + unsigned int id;
> + int audioUnbuffered;
> + int videoUnbuffered;
> + int p2pPublishing;
> + char* peerId;
> + char* publication;
> + unsigned short streamId;
> + const char* swfUrl;
> + const char* app;
> + const char* pageUrl;
> + const char* flashVer;
> + const char* host;
> + const char* hostIPv6;
> +
> + // General options
> + int socketReceiveSize;
> + int socketSendSize;
> +
> + // NetGroup members
> + RTMFPGroupConfig group;
> + char* netgroup;
> + unsigned int updatePeriod;
> + unsigned int windowDuration;
> + unsigned int pushLimit;
> + char* fallbackUrl;
> + unsigned int fallbackTimeout;
> + int disableRateCtl;
> +} LibRTMFPContext;
> +
> +static void rtmfp_log(unsigned int level, const char* fileName, long line, const char* message)
> +{
> + const char* strLevel = "";
> + time_t today2 ;
> + struct tm *today = NULL;
> + struct timeval tv;
> +
> + switch (level) {
> + default:
> + case 1: level = AV_LOG_FATAL; strLevel = "FATAL"; break;
> + case 2:
> + case 3: level = AV_LOG_ERROR; strLevel = "ERROR"; break;
> + case 4: level = AV_LOG_WARNING; strLevel = "WARN"; break;
> + case 5:
> + case 6: level = AV_LOG_INFO; strLevel = "INFO"; break;
> + case 7: level = AV_LOG_DEBUG; strLevel = "DEBUG"; break;
> + case 8: level = AV_LOG_TRACE; strLevel = "TRACE"; break;
> + }
> +
> + today2 = time(NULL);
> + today = localtime(&today2);
> + gettimeofday(&tv, NULL);
> + av_log(NULL, level, "%.2d:%.2d:%.2d.%d [%s] %s\n", today->tm_hour, today->tm_min, today->tm_sec, (int)((tv.tv_usec / 1000) / 100), strLevel, message);
iam not sure adding the time is a good idea, but
it should be ommited when bitexact mode is used to keep messages repeatable
also localtime is not thread safe
> +}
> +
> +/*static void rtmfp_dump(const char* header, const void* data, unsigned int size) {
> + av_log(NULL, AV_LOG_DEBUG, "%s\n%.*s", header, size, (const char*)data);
> +}*/
this doesnt belong in the patch
> +
> +static int rtmfp_close(URLContext *s)
> +{
> + LibRTMFPContext *ctx = s->priv_data;
> +
> + av_log(NULL, AV_LOG_INFO, "Closing RTMFP connection...\n");
missing log context
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
The real ebay dictionary, page 2
"100% positive feedback" - "All either got their money back or didnt complain"
"Best seller ever, very honest" - "Seller refunded buyer after failed scam"
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20190218/a296be4d/attachment.sig>
More information about the ffmpeg-devel
mailing list