Mercurial > libavformat.hg
changeset 5430:bbfed6be7f29 libavformat
Do not try to interact with RTMP server after "stop" command was received.
Patch by Martin Storsj ($name at $name dot `Sao Tome and Principe domain`)
author | kostya |
---|---|
date | Fri, 11 Dec 2009 11:37:21 +0000 |
parents | 2abcf559f2c2 |
children | b0eb87793222 |
files | rtmpproto.c |
diffstat | 1 files changed, 10 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/rtmpproto.c Thu Dec 10 23:06:23 2009 +0000 +++ b/rtmpproto.c Fri Dec 11 11:37:21 2009 +0000 @@ -53,6 +53,7 @@ STATE_READY, ///< client has sent all needed commands and waits for server reply STATE_PLAYING, ///< client has started receiving multimedia data from server STATE_PUBLISHING, ///< client has started sending multimedia data to server (for output) + STATE_STOPPED, ///< the broadcast has been stopped } ClientState; /** protocol handler context */ @@ -619,6 +620,8 @@ 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; } break; @@ -642,6 +645,9 @@ RTMPContext *rt = s->priv_data; int ret; + if (rt->state == STATE_STOPPED) + return AVERROR_EOF; + for (;;) { RTMPPacket rpkt; if ((ret = ff_rtmp_packet_read(rt->stream, &rpkt, @@ -658,6 +664,10 @@ ff_rtmp_packet_destroy(&rpkt); return -1; } + if (rt->state == STATE_STOPPED) { + ff_rtmp_packet_destroy(&rpkt); + return AVERROR_EOF; + } if (for_header && (rt->state == STATE_PLAYING || rt->state == STATE_PUBLISHING)) { ff_rtmp_packet_destroy(&rpkt); return 0;