On 17/03/16 07:51, Hendrik Leppkes wrote:
> On Thu, Mar 17, 2016 at 12:50 AM, Mark Thompson <s...@jkqxz.net> wrote:
>> On 16/03/16 23:41, Hendrik Leppkes wrote:
>>> On Wed, Mar 16, 2016 at 9:37 PM, Mark Thompson <s...@jkqxz.net> wrote:
>>>> ---
>>>> libavcodec/hevc_parse.c | 14 ++++++++++++++
>>>> 1 file changed, 14 insertions(+)
>>>>
>>>> diff --git a/libavcodec/hevc_parse.c b/libavcodec/hevc_parse.c
>>>> index 63ed84a..8c629ff 100644
>>>> --- a/libavcodec/hevc_parse.c
>>>> +++ b/libavcodec/hevc_parse.c
>>>> @@ -227,6 +227,20 @@ int ff_hevc_split_packet(HEVCContext *s, HEVCPacket 
>>>> *pkt, const uint8_t *buf, in
>>>>                 return AVERROR_INVALIDDATA;
>>>>             }
>>>>         } else {
>>>> +            if (pkt->nals > 0) {
>>>> +                // Discard arbtrarily many trailing_zero_8bits before the
>>>> +                // start code of the next NAL unit.
>>>> +                while (buf[0] == 0 && buf[1] == 0 && buf[2] == 0) {
>>>> +                    ++buf;
>>>> +                    --length;
>>>> +                    if (length < 4)
>>>> +                        break;
>>>> +                }
>>>> +                if (length < 4) {
>>>> +                    // There are only zeroes left, so no more NAL units 
>>>> here.
>>>> +                    break;
>>>> +                }
>>>> +            }
>>>>             /* search start code */
>>>>             while (buf[0] != 0 || buf[1] != 0 || buf[2] != 1) {
>>>>                 ++buf;
>>>
>>> I'm slightly confused, wouldn't the loop right after skip over the
>>> zeroes until it finds a valid start code?
>>> It essentially does the same on a cursory look.
>>
>> Yes - it doesn't change the scanning process, but it does change the return 
>> value because in the current code we return failure (and give up on the 
>> packet entirely) if there aren't any more NAL units to be found.
>>
>> We actually want to return success if we already have at least one NAL unit 
>> and then there are zeroes to the end of the packet.
>>
> 
> Wouldn't it be simpler then to add a condition to the existing loop to
> only error out when no NALs exist?

I apologise if I'm not understanding exactly what you mean, but wouldn't that
then accept any trailing garbage at all as long as there is one valid NAL unit?

I was trying to make the minimum change to additionally accept all streams with
trailing zero bytes like the one in the bug report.  A broader modification like
that would also work, but it's not obvious (to me) that it would be a positive
change overall.  (Though admittedly it does already accept up to three bytes of
trailing garbage because of the < 4 test.)

> PS: You probably want to check pkt->nb_nals, not pkt->nals, the second
> is a memory buffer.

Yep, thanks for catching that.  (And somewhat disappointed that the compiler
didn't - seems to be in Wextra but not Wall for gcc.)

- Mark

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to