Some RTSP servers ("HiIpcam/V100R003 VodServer/1.0.0") respond to our keepalive GET_PARAMETER request by a truncated RTSP header (lacking the final empty line to indicate a complete response header). Prior to 764ec70149, this worked just fine since we reacted to the $ as interleaved packet indicator anywhere.
Since $ is a valid character within the response header lines, 764ec70149 changed it to be ignored there. But to keep compatibility with such broken servers, we need to at least allow reacting to it at the start of lines. --- I think doing this should be pretty safe; no valid RTSP response (nor request) header line should start with a $ as far as I know. (It is valid within the actual content of the header lines though.) Unrelatedly, we could also skip sending the keepalive requests completely when using tcp as transport method. That would avoid this issue, but wouldn't be a complete fix in itself. This fixes playback of -rtsp_transport tcp rtsp://176.106.65.249:555/12 (which currently breaks once the first keepalive message is sent), broken since 764ec70149. --- libavformat/rtsp.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index d2c99ea..f62e370 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -1128,7 +1128,6 @@ int ff_rtsp_read_reply(AVFormatContext *s, RTSPMessageHeader *reply, unsigned char ch; const char *p; int ret, content_length, line_count = 0, request = 0; - int first_line = 1; unsigned char *content = NULL; start: @@ -1148,7 +1147,7 @@ start: return AVERROR_EOF; if (ch == '\n') break; - if (ch == '$' && first_line && q == buf) { + if (ch == '$' && q == buf) { if (return_on_interleaved_data) { return 1; } else @@ -1159,7 +1158,6 @@ start: } } *q = '\0'; - first_line = 0; av_log(s, AV_LOG_TRACE, "line='%s'\n", buf); -- 2.3.8 (Apple Git-58) _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel