27 #include "libavutil/avstring.h"
28 #include "libavutil/mathematics.h"
29 #include "libavutil/opt.h"
33 #include <librtmp/rtmp.h>
34 #include <librtmp/log.h>
108 RTMP_LogSetLevel(
level);
111 if (ctx->
app) len += strlen(ctx->
app) +
sizeof(
" app=");
112 if (ctx->
tcurl) len += strlen(ctx->
tcurl) +
sizeof(
" tcUrl=");
113 if (ctx->
pageurl) len += strlen(ctx->
pageurl) +
sizeof(
" pageUrl=");
117 char *sep, *p = ctx->
conn;
125 sep = strchr(p,
' ');
131 len += options *
sizeof(
" conn=");
132 len += strlen(ctx->
conn);
136 len += strlen(ctx->
playpath) +
sizeof(
" playpath=");
138 len +=
sizeof(
" live=1");
140 len += strlen(ctx->
subscribe) +
sizeof(
" subscribe=");
146 len +=
sizeof(
" swfUrl=");
149 len += strlen(ctx->
swfverify) +
sizeof(
" swfVfy=1");
151 len += strlen(ctx->
swfurl);
179 char *sep, *p = ctx->
conn;
185 sep = strchr(p,
' ');
220 if (!RTMP_SetupURL(r, filename)) {
228 if (!RTMP_Connect(r,
NULL) || !RTMP_ConnectStream(r, 0)) {
243 RTMP *
r = &ctx->
rtmp;
245 return RTMP_Write(r, buf, size);
251 RTMP *
r = &ctx->
rtmp;
253 return RTMP_Read(r, buf, size);
259 RTMP *
r = &ctx->
rtmp;
261 if (!RTMP_Pause(r, pause))
267 int64_t timestamp,
int flags)
270 RTMP *
r = &ctx->
rtmp;
276 if (stream_index < 0)
280 if (!RTMP_SendSeek(r, timestamp))
288 RTMP *
r = &ctx->
rtmp;
290 return RTMP_Socket(r);
293 #define OFFSET(x) offsetof(LibRTMPContext, x)
294 #define DEC AV_OPT_FLAG_DECODING_PARAM
295 #define ENC AV_OPT_FLAG_ENCODING_PARAM
298 {
"rtmp_buffer",
"Set buffer time in milliseconds. The default is 3000.",
OFFSET(client_buffer_time),
AV_OPT_TYPE_STRING, {.str =
"3000"}, 0, 0,
DEC|
ENC},
301 {
"rtmp_live",
"Specify that the media is a live stream.",
OFFSET(live),
AV_OPT_TYPE_INT, {.i64 = 0}, INT_MIN, INT_MAX,
DEC,
"rtmp_live"},
305 {
"rtmp_pageurl",
"URL of the web page in which the media was embedded. By default no value will be sent.",
OFFSET(pageurl),
AV_OPT_TYPE_STRING, {.str =
NULL }, 0, 0,
DEC},
307 {
"rtmp_subscribe",
"Name of live stream to subscribe to. Defaults to rtmp_playpath.",
OFFSET(subscribe),
AV_OPT_TYPE_STRING, {.str =
NULL }, 0, 0,
DEC},
309 {
"rtmp_swfverify",
"URL to player swf file, compute hash/size automatically. (unimplemented)",
OFFSET(swfverify),
AV_OPT_TYPE_STRING, {.str =
NULL }, 0, 0,
DEC},
314 #define RTMP_CLASS(flavor)\
315 static const AVClass lib ## flavor ## _class = {\
316 .class_name = "lib" #flavor " protocol",\
317 .item_name = av_default_item_name,\
319 .version = LIBAVUTIL_VERSION_INT,\
333 .priv_data_class = &librtmp_class,
348 .priv_data_class = &librtmpt_class,
363 .priv_data_class = &librtmpe_class,
378 .priv_data_class = &librtmpte_class,
393 .priv_data_class = &librtmps_class,
#define URL_PROTOCOL_FLAG_NETWORK
static int64_t rtmp_read_seek(URLContext *s, int stream_index, int64_t timestamp, int flags)
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding) av_const
Rescale a 64-bit integer with specified rounding.
#define AV_LOG_WARNING
Something somehow does not look correct.
int is_streamed
true if streamed (no seek possible), default = false
void av_log(void *avcl, int level, const char *fmt,...) av_printf_format(3
Send the specified message to the log if the level is less than or equal to the current av_log_level...
static int rtmp_read_pause(URLContext *s, int pause)
void av_freep(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
static int rtmp_close(URLContext *s)
static int rtmp_open(URLContext *s, const char *uri, int flags)
Open RTMP connection and verify that the stream can be played.
URLProtocol ff_librtmpt_protocol
#define AV_LOG_VERBOSE
Detailed information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static void rtmp_log(int level, const char *fmt, va_list args)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
int av_log_get_level(void)
Get the current log level.
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
URLProtocol ff_librtmpte_protocol
#define AV_TIME_BASE
Internal time base represented as integer.
void * av_malloc(size_t size) av_malloc_attrib 1(1)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
URLProtocol ff_librtmpe_protocol
URLProtocol ff_librtmp_protocol
char * client_buffer_time
#define AV_LOG_INFO
Standard information.
static const AVOption options[]
Describe the class of an AVClass context structure.
void void av_vlog(void *avcl, int level, const char *fmt, va_list vl)
Send the specified message to the log if the level is less than or equal to the current av_log_level...
static int rtmp_write(URLContext *s, const uint8_t *buf, int size)
size_t av_strlcat(char *dst, const char *src, size_t size)
Append the string src to the string dst, but to a total length of no more than size - 1 bytes...
char * filename
specified URL
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
static int rtmp_get_file_handle(URLContext *s)
URLProtocol ff_librtmps_protocol
static int rtmp_read(URLContext *s, uint8_t *buf, int size)
unbuffered private I/O API
#define AV_LOG_FATAL
Something went wrong and recovery is not possible.
#define RTMP_CLASS(flavor)