<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body><div><br></div>
<div><br></div>
<div>On Fri, Jul 7, 2017, at 22:00, Oliver Collyer wrote:<br></div>
<blockquote type="cite"><div>Hi<br></div>
<div><br></div>
<div>I'm trying to fix this bug in VideoToolbox:<br></div>
<div><br></div>
<div><a href="https://trac.videolan.org/vlc/ticket/18416">https://trac.videolan.org/vlc/ticket/18416</a><br></div>
<div><br></div>
<div>It was introduced by this commit:<br></div>
<div><br></div>
<div><a href="https://github.com/videolan/vlc/commit/b6d73612d383b25ab12e2f8aad289d045200281a">https://github.com/videolan/vlc/commit/b6d73612d383b25ab12e2f8aad289d045200281a</a><br></div>
<div><br></div>
<div>I've traced it through to the code block below in hxxx_helper.c, inside h264_helper_parse_nal:<br></div>
<div><br></div>
<div>What is happening is that every few seconds (every keyframe?) it is detecting a new PPS and thus setting *p_config_changed to true, which causes the decoder to be restarted. This leads to the green corruption.<br></div>
<div><br></div>
<div>I found that:<br></div>
<div><br></div>
<div>- helper_search_pps detects that the PPS is different. i_nal is normally 82 but every few seconds a PPS arrives of size 53 and this one triggers the change<br></div>
<div>- despite the above, all entries of the h264_picture_parameter_set_t structure are the same, although I noticed that in h264_parse_picture_parameter_set_rbsp in h264_nal.c it only parses and reads in a few of them<br></div>
<div>- if I disable the line that sets *p_config_changed = true it fixes the bug with no visible side-effects<br></div>
<div><br></div>
<div>So a couple of Qs to anyone familiar with this area:<br></div>
<div><br></div>
<div>1) is it correct behaviour to restart the decoder whenever the PPS changes?<br></div>
</blockquote><div><br></div>
<div>Yes it is, we have a create a new avcC containing all SPS/PPS, see avcCFromAnnexBCreate() function.<br></div>
<div>This new avcC should contain all previous SPS/PPS. So, normally, decoder should be restarted only if there is a new one. Maybe there is a bug in hxxx_helper that fail to see if a SPS/PPS already exists.<br></div>
<div>As your stream can be played without restart, I would assume that there is an issue in hxxx_helper<br></div>
<div><br></div>
<blockquote type="cite"><div>2) if yes, what are the circumstances where it should restart the decoder/set config_changed to true, because it would seem that this shouldn't be one of them.<br></div>
<div>3) if no, then it's a simple patch not to set *p_config_changed to true, correct?<br></div>
<div><br></div>
<div>Note that this issue seems specific to interlaced content. I've not seen it with progressive content and as you will see from the bug report it has been independently reported with other interlaced h.264 files too.<br></div>
<div><br></div>
<div>Regards<br></div>
<div><br></div>
<div>Oliver<br></div>
<div><br></div>
<div>        else if (i_nal_type == H264_NAL_PPS)<br></div>
<div>        {<br></div>
<div>            if (helper_search_pps(hh, p_nal, i_nal) != NULL)<br></div>
<div>                continue;<br></div>
<div>            h264_picture_parameter_set_t *p_pps =<br></div>
<div>                h264_decode_pps(p_nal, i_nal, true);<br></div>
<div>            if (!p_pps)<br></div>
<div>                return VLC_EGENERIC;<br></div>
<div><br></div>
<div>            struct hxxx_helper_nal *hnal = &hh->h264.pps_list[p_pps->i_id];<br></div>
<div><br></div>
<div>            if (helper_dup_buf(hnal, p_nal, i_nal))<br></div>
<div>            {<br></div>
<div>                h264_release_pps(p_pps);<br></div>
<div>                return VLC_EGENERIC;<br></div>
<div>            }<br></div>
<div>            if (hnal->h264_pps)<br></div>
<div>                h264_release_pps(hnal->h264_pps);<br></div>
<div>            else<br></div>
<div>                hh->h264.i_pps_count++;<br></div>
<div><br></div>
<div>            hnal->h264_pps = p_pps;<br></div>
<div>            *p_config_changed = true;<br></div>
<div>            msg_Dbg(hh->p_obj, "new PPS parsed: %u", p_pps->i_id);<br></div>
<div>        }<br></div>
<div><br></div>
<div><u>_______________________________________________</u><br></div>
<div>vlc-devel mailing list<br></div>
<div>To unsubscribe or modify your subscription options:<br></div>
<div><a href="https://mailman.videolan.org/listinfo/vlc-devel">https://mailman.videolan.org/listinfo/vlc-devel</a><br></div>
</blockquote><div><br></div>
</body>
</html>