@ -25,6 +25,7 @@
*/
# include "libavutil/avstring.h"
# include "libavutil/bprint.h"
# include "libavutil/mathematics.h"
# include "libavutil/opt.h"
# include "avformat.h"
@ -38,6 +39,7 @@
typedef struct LibRTMPContext {
const AVClass * class ;
AVBPrint filename ;
RTMP rtmp ;
char * app ;
char * conn ;
@ -50,7 +52,6 @@ typedef struct LibRTMPContext {
char * pageurl ;
char * client_buffer_time ;
int live ;
char * temp_filename ;
int buffer_size ;
} LibRTMPContext ;
@ -76,7 +77,7 @@ static int rtmp_close(URLContext *s)
RTMP * r = & ctx - > rtmp ;
RTMP_Close ( r ) ;
av_freep ( & ctx - > temp_ filename) ;
av_bprint_finalize ( & ctx - > filename , NULL ) ;
return 0 ;
}
@ -97,8 +98,8 @@ static int rtmp_open(URLContext *s, const char *uri, int flags)
LibRTMPContext * ctx = s - > priv_data ;
RTMP * r = & ctx - > rtmp ;
int rc = 0 , level ;
char * filename = s - > filename ;
int len = strlen ( s - > filename ) + 1 ;
/* This needs to stay allocated for as long as the RTMP context exists. */
av_bprint_init ( & ctx - > filename , 0 , AV_BPRINT_SIZE_UNLIMITED ) ;
switch ( av_log_get_level ( ) ) {
default :
@ -112,118 +113,58 @@ static int rtmp_open(URLContext *s, const char *uri, int flags)
RTMP_LogSetLevel ( level ) ;
RTMP_LogSetCallback ( rtmp_log ) ;
if ( ctx - > app ) len + = strlen ( ctx - > app ) + sizeof ( " app= " ) ;
if ( ctx - > tcurl ) len + = strlen ( ctx - > tcurl ) + sizeof ( " tcUrl= " ) ;
if ( ctx - > pageurl ) len + = strlen ( ctx - > pageurl ) + sizeof ( " pageUrl= " ) ;
if ( ctx - > flashver ) len + = strlen ( ctx - > flashver ) + sizeof ( " flashver= " ) ;
av_bprintf ( & ctx - > filename , " %s " , s - > filename ) ;
if ( ctx - > app )
av_bprintf ( & ctx - > filename , " app=%s " , ctx - > app ) ;
if ( ctx - > tcurl )
av_bprintf ( & ctx - > filename , " tcUrl=%s " , ctx - > tcurl ) ;
if ( ctx - > pageurl )
av_bprintf ( & ctx - > filename , " pageUrl=%s " , ctx - > pageurl ) ;
if ( ctx - > swfurl )
av_bprintf ( & ctx - > filename , " swfUrl=%s " , ctx - > swfurl ) ;
if ( ctx - > flashver )
av_bprintf ( & ctx - > filename , " flashVer=%s " , ctx - > flashver ) ;
if ( ctx - > conn ) {
char * sep , * p = ctx - > conn ;
int options = 0 ;
while ( p ) {
options + + ;
av_bprintf ( & ctx - > filename , " conn= " ) ;
p + = strspn ( p , " " ) ;
if ( ! * p )
break ;
sep = strchr ( p , ' ' ) ;
if ( sep )
* sep = ' \0 ' ;
av_bprintf ( & ctx - > filename , " %s " , p ) ;
if ( sep )
p = sep + 1 ;
else
break ;
}
len + = options * sizeof ( " conn= " ) ;
len + = strlen ( ctx - > conn ) ;
}
if ( ctx - > playpath )
len + = strlen ( ctx - > playpath ) + sizeof ( " playpath= " ) ;
av_bprintf ( & ctx - > filename , " playpath=%s " , ctx - > playpath ) ;
if ( ctx - > live )
len + = sizeof ( " live=1 " ) ;
av_bprintf ( & ctx - > filename , " live=1 " ) ;
if ( ctx - > subscribe )
len + = strlen ( ctx - > subscribe ) + sizeof ( " subscribe= " ) ;
av_bprintf ( & ctx - > filename , " subscribe=%s " , ctx - > subscribe ) ;
if ( ctx - > client_buffer_time )
len + = strlen ( ctx - > client_buffer_time ) + sizeof ( " buffer= " ) ;
av_bprintf ( & ctx - > filename , " buffer=%s " , ctx - > client_buffer_time ) ;
if ( ctx - > swfurl | | ctx - > swfverify ) {
len + = sizeof ( " swfUrl= " ) ;
if ( ctx - > swfverify )
len + = strlen ( ctx - > swfverify ) + sizeof ( " swfVfy=1 " ) ;
av_bprintf ( & ctx - > filename , " swfUrl=%s swfVfy=1 " , ctx - > swfverify ) ;
else
len + = strlen ( ctx - > swfurl ) ;
av_bprintf ( & ctx - > filename , " swfUrl=%s " , ctx - > swfurl ) ;
}
if ( ! ( ctx - > temp_filename = filename = av_malloc ( len ) ) )
if ( ! av_bprint_is_complete ( & ctx - > filename ) ) {
av_bprint_finalize ( & ctx - > filename , NULL ) ;
return AVERROR ( ENOMEM ) ;
av_strlcpy ( filename , s - > filename , len ) ;
if ( ctx - > app ) {
av_strlcat ( filename , " app= " , len ) ;
av_strlcat ( filename , ctx - > app , len ) ;
}
if ( ctx - > tcurl ) {
av_strlcat ( filename , " tcUrl= " , len ) ;
av_strlcat ( filename , ctx - > tcurl , len ) ;
}
if ( ctx - > pageurl ) {
av_strlcat ( filename , " pageUrl= " , len ) ;
av_strlcat ( filename , ctx - > pageurl , len ) ;
}
if ( ctx - > swfurl ) {
av_strlcat ( filename , " swfUrl= " , len ) ;
av_strlcat ( filename , ctx - > swfurl , len ) ;
}
if ( ctx - > flashver ) {
av_strlcat ( filename , " flashVer= " , len ) ;
av_strlcat ( filename , ctx - > flashver , len ) ;
}
if ( ctx - > conn ) {
char * sep , * p = ctx - > conn ;
while ( p ) {
av_strlcat ( filename , " conn= " , len ) ;
p + = strspn ( p , " " ) ;
if ( ! * p )
break ;
sep = strchr ( p , ' ' ) ;
if ( sep )
* sep = ' \0 ' ;
av_strlcat ( filename , p , len ) ;
if ( sep )
p = sep + 1 ;
else
break ;
}
}
if ( ctx - > playpath ) {
av_strlcat ( filename , " playpath= " , len ) ;
av_strlcat ( filename , ctx - > playpath , len ) ;
}
if ( ctx - > live )
av_strlcat ( filename , " live=1 " , len ) ;
if ( ctx - > subscribe ) {
av_strlcat ( filename , " subscribe= " , len ) ;
av_strlcat ( filename , ctx - > subscribe , len ) ;
}
if ( ctx - > client_buffer_time ) {
av_strlcat ( filename , " buffer= " , len ) ;
av_strlcat ( filename , ctx - > client_buffer_time , len ) ;
}
if ( ctx - > swfurl | | ctx - > swfverify ) {
av_strlcat ( filename , " swfUrl= " , len ) ;
if ( ctx - > swfverify ) {
av_strlcat ( filename , ctx - > swfverify , len ) ;
av_strlcat ( filename , " swfVfy=1 " , len ) ;
} else {
av_strlcat ( filename , ctx - > swfurl , len ) ;
}
}
RTMP_Init ( r ) ;
if ( ! RTMP_SetupURL ( r , filename ) ) {
/* This will modify filename by null terminating the URL portion */
if ( ! RTMP_SetupURL ( r , ctx - > filename . str ) ) {
rc = AVERROR_UNKNOWN ;
goto fail ;
}
@ -249,9 +190,10 @@ static int rtmp_open(URLContext *s, const char *uri, int flags)
s - > is_streamed = 1 ;
return 0 ;
fail :
av_freep ( & ctx - > temp_filename ) ;
if ( rc )
RTMP_Close ( r ) ;
av_bprint_finalize ( & ctx - > filename , NULL ) ;
return rc ;
}