aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/rtmpproto.c
diff options
context:
space:
mode:
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>2012-06-13 14:47:26 +0200
committerMartin Storsjö <martin@martin.st>2012-06-13 16:52:52 +0300
commitc2d38beab2858307f76b01070e7044f2577b8600 (patch)
treef8949c25b3dd36baed4c5409e9e996361a0964b6 /libavformat/rtmpproto.c
parent9ff930aace0d61a355f14e49f9fa1d95b8c0e5be (diff)
downloadffmpeg-c2d38beab2858307f76b01070e7044f2577b8600.tar.gz
rtmp: Handle server bandwidth packets
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/rtmpproto.c')
-rw-r--r--libavformat/rtmpproto.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c
index 945ad49faa..729e2d7af4 100644
--- a/libavformat/rtmpproto.c
+++ b/libavformat/rtmpproto.c
@@ -88,6 +88,7 @@ typedef struct RTMPContext {
char* tcurl; ///< url of the target stream
char* flashver; ///< version of the flash plugin
char* swfurl; ///< url of the swf player
+ int server_bw; ///< server bandwidth
} RTMPContext;
#define PLAYER_KEY_OPEN_PART_LEN 30 ///< length of partial key used for first client digest signing
@@ -523,7 +524,7 @@ static int gen_server_bw(URLContext *s, RTMPContext *rt)
return ret;
p = pkt.data;
- bytestream_put_be32(&p, 2500000);
+ bytestream_put_be32(&p, rt->server_bw);
ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size,
rt->prev_pkt[1]);
ff_rtmp_packet_destroy(&pkt);
@@ -851,6 +852,14 @@ static int rtmp_parse_result(URLContext *s, RTMPContext *rt, RTMPPacket *pkt)
av_log(s, AV_LOG_DEBUG, "Client bandwidth = %d\n", AV_RB32(pkt->data));
rt->client_report_size = AV_RB32(pkt->data) >> 1;
break;
+ case RTMP_PT_SERVER_BW:
+ rt->server_bw = AV_RB32(pkt->data);
+ if (rt->server_bw <= 0) {
+ av_log(s, AV_LOG_ERROR, "Incorrect server bandwidth %d\n", rt->server_bw);
+ return AVERROR(EINVAL);
+ }
+ av_log(s, AV_LOG_DEBUG, "Server bandwidth = %d\n", rt->server_bw);
+ break;
case RTMP_PT_INVOKE:
//TODO: check for the messages sent for wrong state?
if (!memcmp(pkt->data, "\002\000\006_error", 9)) {
@@ -1198,6 +1207,7 @@ static int rtmp_open(URLContext *s, const char *uri, int flags)
rt->client_report_size = 1048576;
rt->bytes_read = 0;
rt->last_bytes_read = 0;
+ rt->server_bw = 2500000;
av_log(s, AV_LOG_DEBUG, "Proto = %s, path = %s, app = %s, fname = %s\n",
proto, path, rt->app, rt->playpath);