From patchwork Wed Jan 13 12:25:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Idan Freiberg X-Patchwork-Id: 24937 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 3F186448BEF for ; Wed, 13 Jan 2021 14:51:18 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1A16868ABEF; Wed, 13 Jan 2021 14:51:18 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f174.google.com (mail-lj1-f174.google.com [209.85.208.174]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9706068AB8F for ; Wed, 13 Jan 2021 14:51:11 +0200 (EET) Received: by mail-lj1-f174.google.com with SMTP id e7so2374707ljg.10 for ; Wed, 13 Jan 2021 04:51:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=Aq4NCAioZhqBGgoQJ+ilQn4HhjMoc5DrekOqrGRSjWQ=; b=EbfTyrckfu3XXw/ZymaVNZChrqn2N67o09hMJY8BOWFBa0FZ60kcwGmARRCBqxzpSW i9mlqD9x97arZ+/pUOHo8hnFaoCSd6rMyTd3Nx+WLPItXMUHx8IR8xG59Ai2n7jCdTc5 JoxFzSpKyP9WHmDTj7xchRLANmTpktsVKWSb+tEDka6uxGMM80klgJ3Mt6r//pQkssD+ UA+BCTJRilgGM7mnfQU+RSyZ8UpYwPXUrKTZ7QRAzYSa4L46uZ4KAr+RMSLIiCFGRJ1s 3OX4XRM6GF/M8NOWtsDVIN/9thQSLzHAMYSgLXRWw17Tto95OC/V352kxozNCl34La/i Me2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=Aq4NCAioZhqBGgoQJ+ilQn4HhjMoc5DrekOqrGRSjWQ=; b=gn+tEMU3l12bEn2dXLZMqKl8w+hY7O0kSGBnmF5nxrHPjj2kJxHN5jy+es+UoMip3b +T/kqZJ1QiN8Lp0Gu7wqPihd2N8kgHZNUwEkMksEykM5Btj8ZJSFPCGxhJM1NPauKVBU cRuBbLe3rQBQyF8s6T/sVENBssJ8Vg7zR2Q/cYnwXpK3HkU5nd/JnTsKVRi0wM/s8+U0 RcviCPzlhofR+GPRZ+TWKGKDd5TQE4oxwJbTYE3+8nSIONbPfSbAxkisC1pfIR4+U2De zhvznHKmWV8OyN0ygDyMnYtK2KHYP1ghILnqzTFBPzx/tqVt+8Vgm2i+O6LApQU+YEOm 8/2Q== X-Gm-Message-State: AOAM532T/YbEHezHSxoYNuWVFmgnAGgxJ/D54iY4aQs/ZU++h1AOsp32 g5R3j+OvI2W4NbhwRNCzBv1qFyVCMfaU96HL9WMHNz/eIHq3uw== X-Google-Smtp-Source: ABdhPJxYIHuVMtwdyGkhFFon0bLiI8L3+xoRWoYj2Ao4xH1Z4vt4aGXxu6FpVfALvgve8pfD/qQbyF0Iaj2Q+3Z3a/A= X-Received: by 2002:a05:651c:87:: with SMTP id 7mr857265ljq.312.1610540751197; Wed, 13 Jan 2021 04:25:51 -0800 (PST) MIME-Version: 1.0 From: Idan Freiberg Date: Wed, 13 Jan 2021 14:25:40 +0200 Message-ID: To: ffmpeg-devel@ffmpeg.org X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: [FFmpeg-devel] Fix for avformat DHAV parsing issue. X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Hello FFmpeg developers, Iv'e noticed some DAV files containing a 0xff's padding in between DHAV chunks. This is possible when the Dahua DVR device generates a DAV file which is concatenated from 2 different DAV files kept on the device hard drive. Here is a 30 seconds sample DAV file with such concatenation. The current code (master) fails to parse frame at 11:00:12 (clock on frame) as it incorrectly skips valid DHAV chunks in the file after detecting the padding. Proposing a possible patch for this issue (git formatted patch is attached). Will like to hear your thoughts and insights. Thank you diff --git a/libavformat/dhav.c b/libavformat/dhav.c index 00e0d8476e..6a6c235e65 100644 --- a/libavformat/dhav.c +++ b/libavformat/dhav.c @@ -173,18 +173,9 @@ static int read_chunk(AVFormatContext *s) if (avio_feof(s->pb)) return AVERROR_EOF; - if (avio_rl32(s->pb) != MKTAG('D','H','A','V') && dhav->last_good_pos < INT64_MAX - 0x8000) { - dhav->last_good_pos += 0x8000; - avio_seek(s->pb, dhav->last_good_pos, SEEK_SET); - - while (avio_rl32(s->pb) != MKTAG('D','H','A','V')) { - if (avio_feof(s->pb) || dhav->last_good_pos >= INT64_MAX - 0x8000) - return AVERROR_EOF; - dhav->last_good_pos += 0x8000; - ret = avio_skip(s->pb, 0x8000 - 4); - if (ret < 0) - return ret; - } + while (avio_r8(s->pb) != 'D' || avio_r8(s->pb) != 'H' || avio_r8(s->pb) != 'A' || avio_r8(s->pb) != 'V') { + if (avio_feof(s->pb)) + return AVERROR_EOF; } start = avio_tell(s->pb) - 4;