diff options
author | Samuel Pitoiset <samuel.pitoiset@gmail.com> | 2012-08-09 14:57:50 +0200 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2012-08-09 22:44:30 +0200 |
commit | 71036a3a5eeda1c0a7eef6acf37aa0c33d488a36 (patch) | |
tree | 54e78122e1e840a2ce86df346929ddef6757e925 /libavformat | |
parent | 5e6001db8f235e3665df2bde489d96b19b4cfad5 (diff) | |
download | ffmpeg-71036a3a5eeda1c0a7eef6acf37aa0c33d488a36.tar.gz |
rtmp: Factorize the code by adding handle_invoke_status
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/rtmpproto.c | 58 |
1 files changed, 34 insertions, 24 deletions
diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c index c2021deee1..a2d2529aa1 100644 --- a/libavformat/rtmpproto.c +++ b/libavformat/rtmpproto.c @@ -1098,10 +1098,41 @@ fail: return ret; } -static int handle_invoke(URLContext *s, RTMPPacket *pkt) +static int handle_invoke_status(URLContext *s, RTMPPacket *pkt) { RTMPContext *rt = s->priv_data; + const uint8_t *data_end = pkt->data + pkt->data_size; + const uint8_t *ptr = pkt->data + 11; + uint8_t tmpstr[256]; int i, t; + + for (i = 0; i < 2; i++) { + t = ff_amf_tag_size(ptr, data_end); + if (t < 0) + return 1; + ptr += t; + } + + t = ff_amf_get_field_value(ptr, data_end, "level", tmpstr, sizeof(tmpstr)); + if (!t && !strcmp(tmpstr, "error")) { + if (!ff_amf_get_field_value(ptr, data_end, + "description", tmpstr, sizeof(tmpstr))) + av_log(s, AV_LOG_ERROR, "Server error: %s\n", tmpstr); + return -1; + } + + t = ff_amf_get_field_value(ptr, data_end, "code", tmpstr, sizeof(tmpstr)); + if (!t && !strcmp(tmpstr, "NetStream.Play.Start")) rt->state = STATE_PLAYING; + if (!t && !strcmp(tmpstr, "NetStream.Play.Stop")) rt->state = STATE_STOPPED; + if (!t && !strcmp(tmpstr, "NetStream.Play.UnpublishNotify")) rt->state = STATE_STOPPED; + if (!t && !strcmp(tmpstr, "NetStream.Publish.Start")) rt->state = STATE_PUBLISHING; + + return 0; +} + +static int handle_invoke(URLContext *s, RTMPPacket *pkt) +{ + RTMPContext *rt = s->priv_data; const uint8_t *data_end = pkt->data + pkt->data_size; int ret = 0; @@ -1117,29 +1148,8 @@ static int handle_invoke(URLContext *s, RTMPPacket *pkt) if ((ret = handle_invoke_result(s, pkt)) < 0) return ret; } else if (!memcmp(pkt->data, "\002\000\010onStatus", 11)) { - const uint8_t* ptr = pkt->data + 11; - uint8_t tmpstr[256]; - - for (i = 0; i < 2; i++) { - t = ff_amf_tag_size(ptr, data_end); - if (t < 0) - return 1; - ptr += t; - } - t = ff_amf_get_field_value(ptr, data_end, - "level", tmpstr, sizeof(tmpstr)); - if (!t && !strcmp(tmpstr, "error")) { - if (!ff_amf_get_field_value(ptr, data_end, - "description", tmpstr, sizeof(tmpstr))) - av_log(s, AV_LOG_ERROR, "Server error: %s\n",tmpstr); - return -1; - } - t = ff_amf_get_field_value(ptr, data_end, - "code", tmpstr, sizeof(tmpstr)); - if (!t && !strcmp(tmpstr, "NetStream.Play.Start")) rt->state = STATE_PLAYING; - if (!t && !strcmp(tmpstr, "NetStream.Play.Stop")) rt->state = STATE_STOPPED; - if (!t && !strcmp(tmpstr, "NetStream.Play.UnpublishNotify")) rt->state = STATE_STOPPED; - if (!t && !strcmp(tmpstr, "NetStream.Publish.Start")) rt->state = STATE_PUBLISHING; + if ((ret = handle_invoke_status(s, pkt)) < 0) + return ret; } else if (!memcmp(pkt->data, "\002\000\010onBWDone", 11)) { if ((ret = gen_check_bw(s, rt)) < 0) return ret; |