From patchwork Tue Jul 27 13:08:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 29061 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a11:4023:0:0:0:0 with SMTP id ky35csp4833869pxb; Tue, 27 Jul 2021 06:08:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzaPJ/rVdwD4PaRK3YADHS7UbCR9mLQ2rR2ewzHA4rILL0JlyuVrvJT25FLyHTEoSx3alOs X-Received: by 2002:a17:906:6050:: with SMTP id p16mr21677041ejj.43.1627391332012; Tue, 27 Jul 2021 06:08:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627391332; cv=none; d=google.com; s=arc-20160816; b=fUJSVlHJ3nMK8kZRVrQU1adIL752QA8wENJzsCxTiJOC+Cp2vzQJd1ARYNzZhU5ih9 6f+gL92PHa98A3ybs/rEL7yCMA/BnP8oeggaavOV3t42C6gwaMhOyEyueD0cO4KgHmgQ 0m2CHtODyJwSU/zRH1m5TpY/3q7I4Jb13DtkVhTNqtX3li0LnxMW3lT/iaLvY792KdhZ s/jh+/gMz0wfeyI9truCL3O8VjkolgGLKTSBoIKnVkqxnQCnGzGH05wmZBR31yAAT5Nj s3t8V5dhiyt3YjTc/syP4rnA+o4qEqA7q5aRyTKEvVIBhYqDh4n0tHz4i+xu9ln1k42E Pf5w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=8wyBlQcwY82X9n//1BUJ4NG+FiK+UvOmaJiwYyosRnE=; b=sXHao/bAsunW73x+YAbDN/4awoVXGY4WWWMdzo2iqB2WZUUFEd74hTTIEAwTotiB4r OblEllMIZbexJZHukNZS3qUwrXI4K9i3W38jF3vAsvqVjBZrHeSgTG8rEZeK1oF1pyqw 69jkiFM2y/Uw1N16pUrldVx8EKGw+AMzU9kO5sI5QaFN8erLou1jNzdgjlMA9jYhMBh8 PdYZWYieiaLZiPHb83Yvvb27OCuTG8sftX4sU2XLPABUZo2r7szEz4Dm2n+1T4kBEHqE zc3GQMrUk84Kn0XcO7akyQe01Bs8SGf0LNuD/P5M95uc/c5lvQ7fztTGm+m9ltI3zoZP pZAw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=FamyjwT1; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id e13si2708604edj.567.2021.07.27.06.08.51; Tue, 27 Jul 2021 06:08:52 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=FamyjwT1; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 62350689D6F; Tue, 27 Jul 2021 16:08:46 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A399A688128 for ; Tue, 27 Jul 2021 16:08:39 +0300 (EEST) Received: by mail-pl1-f171.google.com with SMTP id i1so15686814plr.9 for ; Tue, 27 Jul 2021 06:08:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=WqttjUiLLmqd/tSgOMr5O2jXawHo4yu/BnEuRLn1kwo=; b=FamyjwT1A2s5uiqBXzW5w10iY97ZDSE4zfUnGTq5oiLApxpfbELsvAgYw2gMOKjFfW 1KddwmKARlMukz8XNiTxgIbxaRh4OnR8bbWBUEkcRGz5WIs/vb6kZKb2mDlLeXcv8UK3 eKCeMli8koUdPIPtBSrlu5VFibxRqASXrJacK8uzsIRbFmLL7cJdS2Vjy+QQouo8WD/1 f7yUXPGL0unWhLSXBYdGDYlZ2NRzMgvh+R38oeFj9aHwIW3eng0FHgKLoC44CQLe1sOt pQ+PfBG3zOWY1C8L5QDMmuFiAgw4z9WYbDe3ZYMusA/bFUK5f4DfOkTwIbPXvjwF1ZFj fokQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=WqttjUiLLmqd/tSgOMr5O2jXawHo4yu/BnEuRLn1kwo=; b=Gbw9AkFV0BXnHc7lt6BcbXyjBT4Xmi8mPY7nM2T/sn/2rY50IP5vbSkKc+Fhwwb7dS ITSbmkwOx+LkTgWO2dWqwNAY178Lr92AiSysP33L/Xgywxv58cAk93IEC/v3oQpRltlf 4SNpM8lJLFkVQHuEBUAXHkeDbEj7E8N/Xbii7cTUSy1ilAWgD6ls0ejkhwCoSb6L8/+D DiRjWOAxJXFA0ivsP8Lc/SAa/HuQSb91W417lXgNQUjP04LKHIoIhbfViyoLJj1jTudL cVe4Wu8BkwwQQexnpM7W4Hvey9QXgExFXuKRUo1QdnPtqYmmlxg4bm/6ezaKwtKBgKyT R2gA== X-Gm-Message-State: AOAM530ynXzsbVyA78g4/wHLutJ1TLPFHwiR1g0rCNGE7fqPvz03IplM eAFBj26xv6eHZOmy0wSt/Is2iZWOBNo= X-Received: by 2002:a17:90a:3048:: with SMTP id q8mr4218997pjl.120.1627391317268; Tue, 27 Jul 2021 06:08:37 -0700 (PDT) Received: from localhost.localdomain ([191.84.244.212]) by smtp.gmail.com with ESMTPSA id t10sm3904890pgv.52.2021.07.27.06.08.35 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Jul 2021 06:08:36 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 27 Jul 2021 10:08:19 -0300 Message-Id: <20210727130820.708-1-jamrial@gmail.com> X-Mailer: git-send-email 2.32.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] avformat/tests/movenc: fill the packets with some valid data X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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" X-TUID: tnA1M4rfomcO It will be needed in the next commit, where h264 packets will be parsed by the muxer. Signed-off-by: James Almer --- libavformat/tests/movenc.c | 12 ++++--- tests/ref/fate/movenc | 68 +++++++++++++++++++------------------- 2 files changed, 42 insertions(+), 38 deletions(-) diff --git a/libavformat/tests/movenc.c b/libavformat/tests/movenc.c index 04155dde76..0b69dad1b9 100644 --- a/libavformat/tests/movenc.c +++ b/libavformat/tests/movenc.c @@ -37,7 +37,7 @@ #define HASH_SIZE 16 static const uint8_t h264_extradata[] = { - 0x01, 0x4d, 0x40, 0x1e, 0xff, 0xe1, 0x00, 0x02, 0x67, 0x4d, 0x01, 0x00, 0x02, 0x68, 0xef + 0x01, 0x4d, 0x40, 0x1e, 0xfe, 0xe1, 0x00, 0x02, 0x67, 0x4d, 0x01, 0x00, 0x02, 0x68, 0xef }; static const uint8_t aac_extradata[] = { 0x12, 0x10 @@ -249,10 +249,13 @@ static void mux_frames(int n, int c) { int end_frames = frames + n; while (1) { - uint8_t pktdata[8] = { 0 }; + uint8_t idr_data[8] = { 0x00, 0x00, 0x05, 0x65 }; + uint8_t slice_data[8] = { 0x00, 0x00, 0x05, 0x61 }; + uint8_t audio_data[8] = { 0 }; av_packet_unref(pkt); if (av_compare_ts(audio_dts, audio_st->time_base, video_dts, video_st->time_base) < 0) { + pkt->data = audio_data; pkt->dts = pkt->pts = audio_dts; pkt->stream_index = 1; pkt->duration = audio_duration; @@ -265,10 +268,12 @@ static void mux_frames(int n, int c) pkt->duration = duration; if ((frames % gop_size) == 0) { pkt->flags |= AV_PKT_FLAG_KEY; + pkt->data = idr_data; last_picture = AV_PICTURE_TYPE_I; pkt->pts = pkt->dts + duration; video_dts = pkt->pts; } else { + pkt->data = slice_data; if (last_picture == AV_PICTURE_TYPE_P) { last_picture = AV_PICTURE_TYPE_B; pkt->pts = pkt->dts; @@ -293,8 +298,7 @@ static void mux_frames(int n, int c) if (clear_duration) pkt->duration = 0; - AV_WB32(pktdata + 4, pkt->pts); - pkt->data = pktdata; + AV_WB32(pkt->data + 4, pkt->pts); pkt->size = 8; if (skip_write) continue; diff --git a/tests/ref/fate/movenc b/tests/ref/fate/movenc index 81ea75f372..9a1da67ff5 100644 --- a/tests/ref/fate/movenc +++ b/tests/ref/fate/movenc @@ -2,17 +2,17 @@ write_data len 36, time nopts, type header atom ftyp write_data len 2429, time nopts, type header atom - write_data len 788, time 1000000, type sync atom moof write_data len 110, time nopts, type trailer atom - -6f06e338c71468d56580df40ff265066 3363 non-empty-moov +ef1fffd7c446dd90e7300dc32e8ebdc2 3363 non-empty-moov write_data len 36, time nopts, type header atom ftyp write_data len 2761, time nopts, type header atom - write_data len 908, time 966667, type sync atom moof write_data len 110, time nopts, type trailer atom - -caf0876986b5f033efc0958c338289cc 3815 non-empty-moov-elst +3734af62e2a0f5f677bdceacc64b01c1 3815 non-empty-moov-elst write_data len 36, time nopts, type header atom ftyp write_data len 2669, time nopts, type header atom - write_data len 908, time 1000000, type sync atom moof write_data len 110, time nopts, type trailer atom - -e106084014ed245ed7c4a30f1d11a3ac 3723 non-empty-moov-no-elst +fb65eb84d856ce161b4a327ca5605e82 3723 non-empty-moov-no-elst write_data len 24, time nopts, type header atom ftyp write_data len 1171, time nopts, type header atom - write_data len 728, time 0, type sync atom moof @@ -20,109 +20,109 @@ write_data len 828, time nopts, type unknown atom - write_data len 728, time 999999, type sync atom moof write_data len 812, time nopts, type unknown atom - write_data len 148, time nopts, type trailer atom - -92ce825ff40505ec8676191705adb7e7 4439 ismv +2c98886c0522d2f53cbd9956844474a5 4439 ismv write_data len 36, time nopts, type header atom ftyp write_data len 1123, time nopts, type header atom - write_data len 796, time 0, type sync atom moof write_data len 788, time 1000000, type sync atom moof write_data len 148, time nopts, type trailer atom - -08f4b3ad3a3ea224b2ee731476b9056b 2891 empty-moov +6e7fa51b8236ae5efb82e5aafb89303d 2891 empty-moov write_data len 36, time nopts, type header atom ftyp write_data len 1123, time nopts, type header atom - write_data len 1068, time 0, type sync atom moof write_data len 908, time 1000000, type sync atom moof write_data len 148, time nopts, type trailer atom - -d7a2dcb43eb0f95f92669f55fc7adeba 3283 empty-moov-no-elst +d2ad81feda9bc654610996d9bbdbec53 3283 empty-moov-no-elst write_data len 36, time nopts, type header atom ftyp write_data len 1123, time nopts, type header atom - write_data len 900, time -33333, type sync atom moof write_data len 908, time 966667, type sync atom moof write_data len 148, time nopts, type trailer atom - -ea70ca697306976879be408431c27aee 3115 empty-moov-no-elst-no-adjust +7e6a81ef39ebc536e5b56100cdf6b252 3115 empty-moov-no-elst-no-adjust write_data len 1159, time nopts, type header atom ftyp write_data len 796, time 0, type sync atom moof write_data len 788, time 1000000, type sync atom moof write_data len 148, time nopts, type trailer atom - -08f4b3ad3a3ea224b2ee731476b9056b 2891 delay-moov +6e7fa51b8236ae5efb82e5aafb89303d 2891 delay-moov write_data len 1231, time nopts, type header atom ftyp write_data len 916, time -33333, type sync atom moof write_data len 908, time 966667, type sync atom moof write_data len 148, time nopts, type trailer atom - -314cc3b6296f4ee583b328a34be50b2f 3203 delay-moov-elst +131880377ee6222006e0ca04020b2c8e 3203 delay-moov-elst write_data len 1195, time nopts, type header atom ftyp write_data len 836, time 0, type sync atom moof write_data len 67, time nopts, type trailer atom - -95d6f59a7354b0cfe7ce49927baada4e 2098 delay-moov-empty-track +9de4334a9e2509dc4ac51098e9b73da5 2098 delay-moov-empty-track write_data len 1195, time nopts, type header atom ftyp write_data len 360, time 0, type sync atom moof write_data len 360, time 1000000, type sync atom moof write_data len 86, time nopts, type trailer atom - -8805d72a27b340ea229c16edde78f974 2001 delay-moov-empty-track-flush +5162f99181c5e59d1340cdaae07c7d24 2001 delay-moov-empty-track-flush write_data len 36, time nopts, type header atom ftyp write_data len 1123, time nopts, type header atom - -351ae2c8b6d35d98b4848c309cce6704 1159 empty-moov-header +8985952a838caa36c228cc890d7cc943 1159 empty-moov-header write_data len 796, time 0, type sync atom moof write_data len 788, time 1000000, type sync atom moof -289ee982188d66988a374a462b0b5376 1584 empty-moov-content +4ee68a46f6c9d9c946bde60320dbd22a 1584 empty-moov-content write_data len 148, time nopts, type trailer atom - write_data len 1159, time nopts, type header atom ftyp -351ae2c8b6d35d98b4848c309cce6704 1159 delay-moov-header +8985952a838caa36c228cc890d7cc943 1159 delay-moov-header write_data len 796, time 0, type sync atom moof write_data len 788, time 1000000, type sync atom moof -289ee982188d66988a374a462b0b5376 1584 delay-moov-content +4ee68a46f6c9d9c946bde60320dbd22a 1584 delay-moov-content write_data len 148, time nopts, type trailer atom - write_data len 28, time nopts, type header atom - write_data len 1123, time nopts, type header atom - write_data len 884, time 0, type sync atom sidx write_data len 876, time 1000000, type sync atom sidx -c0307f99a2a362205b7e3d65b1066f86 876 empty-moov-second-frag +9088f7d32a1c72519e1dd25c86d6444a 876 empty-moov-second-frag write_data len 148, time nopts, type trailer atom - write_data len 28, time nopts, type header atom - write_data len 1123, time nopts, type header atom - write_data len 876, time 1000000, type sync atom sidx -c0307f99a2a362205b7e3d65b1066f86 876 empty-moov-second-frag-discont +9088f7d32a1c72519e1dd25c86d6444a 876 empty-moov-second-frag-discont write_data len 110, time nopts, type trailer atom - write_data len 1223, time nopts, type header atom - write_data len 876, time 1000000, type sync atom sidx -c0307f99a2a362205b7e3d65b1066f86 876 delay-moov-second-frag-discont +9088f7d32a1c72519e1dd25c86d6444a 876 delay-moov-second-frag-discont write_data len 110, time nopts, type trailer atom - write_data len 1223, time nopts, type header atom ftyp -b3811928793ed0749927eb2f7958421c 1223 delay-moov-elst-init +8d72431e55013ae14b85598b07bf0745 1223 delay-moov-elst-init write_data len 988, time -33333, type sync atom sidx write_data len 996, time 966667, type sync atom sidx -0df125407c7e81978ce722e0ae4f6f84 996 delay-moov-elst-second-frag +e7791a3a51bde1f3b235468ed0c80acd 996 delay-moov-elst-second-frag write_data len 148, time nopts, type trailer atom - write_data len 1223, time nopts, type header atom ftyp -b3811928793ed0749927eb2f7958421c 1223 delay-moov-elst-init-discont +8d72431e55013ae14b85598b07bf0745 1223 delay-moov-elst-init-discont write_data len 996, time 966667, type sync atom sidx -0df125407c7e81978ce722e0ae4f6f84 996 delay-moov-elst-second-frag-discont +e7791a3a51bde1f3b235468ed0c80acd 996 delay-moov-elst-second-frag-discont write_data len 110, time nopts, type trailer atom - write_data len 1223, time nopts, type header atom ftyp -041ac8efc35a0d023c26d05eedb20403 1223 delay-moov-elst-signal-init +0e57f12a619ed2b3d9906c7f0e8ddc0b 1223 delay-moov-elst-signal-init write_data len 1004, time -33333, type sync atom sidx write_data len 996, time 966667, type sync atom sidx -5a583d89318827d2569eecbeaa18c238 996 delay-moov-elst-signal-second-frag +fc25112079e6bf9008ab228458d96adb 996 delay-moov-elst-signal-second-frag write_data len 148, time nopts, type trailer atom - write_data len 1223, time nopts, type header atom ftyp -041ac8efc35a0d023c26d05eedb20403 1223 delay-moov-elst-signal-init-discont +0e57f12a619ed2b3d9906c7f0e8ddc0b 1223 delay-moov-elst-signal-init-discont write_data len 996, time 966667, type sync atom sidx -5a583d89318827d2569eecbeaa18c238 996 delay-moov-elst-signal-second-frag-discont +fc25112079e6bf9008ab228458d96adb 996 delay-moov-elst-signal-second-frag-discont write_data len 110, time nopts, type trailer atom - write_data len 1247, time nopts, type header atom ftyp -80511a51d1ac9cde62337eed7176ae03 1247 delay-moov-elst-signal-init-discont-largets +0d848b85b1d63cd403330302bad1112a 1247 delay-moov-elst-signal-init-discont-largets write_data len 996, time 279621233333, type sync atom sidx -dc695d65e8a0cdafee28acd8a5ccf81a 996 delay-moov-elst-signal-second-frag-discont-largets +097ab434042086066592026a1b81d592 996 delay-moov-elst-signal-second-frag-discont-largets write_data len 110, time nopts, type trailer atom - write_data len 1223, time nopts, type header atom ftyp write_data len 2572, time -333333, type sync atom sidx write_data len 996, time 5166667, type sync atom sidx write_data len 148, time nopts, type trailer atom - -d37a7eda807912b9ed05ccfe003a9e4f 4939 vfr +da879cef0972615d0ef5133907f50443 4939 vfr write_data len 1223, time nopts, type header atom ftyp write_data len 2572, time -333333, type sync atom sidx write_data len 996, time 5166667, type sync atom sidx write_data len 148, time nopts, type trailer atom - -d37a7eda807912b9ed05ccfe003a9e4f 4939 vfr-noduration +da879cef0972615d0ef5133907f50443 4939 vfr-noduration write_data len 1231, time nopts, type header atom ftyp write_data len 1500, time -333333, type sync atom moof write_data len 1500, time nopts, type unknown atom - @@ -131,7 +131,7 @@ write_data len 1500, time 9666667, type sync atom moof write_data len 1500, time nopts, type unknown atom - write_data len 1004, time nopts, type unknown atom - write_data len 148, time nopts, type trailer atom - -08b6401dc81912e5264245b7233c4ab3 9299 large_frag +3332b321c8679e8461f2260b91f54f64 9299 large_frag write_data len 1231, time nopts, type header atom ftyp write_data len 684, time -33333, type sync atom moof write_data len 504, time 800000, type boundary atom moof @@ -139,15 +139,15 @@ write_data len 420, time 1266667, type boundary atom moof write_data len 668, time 1566667, type sync atom moof write_data len 440, time 2233333, type boundary atom moof write_data len 262, time nopts, type trailer atom - -a5d087611a9229ba91eb0964cf2f17d9 4209 vfr-noduration-interleave +b355a28c9acaf8f265349ceceaee9090 4209 vfr-noduration-interleave write_data len 1231, time nopts, type header atom ftyp write_data len 916, time 0, type sync atom moof write_data len 908, time 1000000, type sync atom moof write_data len 148, time nopts, type trailer atom - -d81c3a0ce5940a2db74c99ad435e0560 3203 delay-moov-elst-neg-cts +46aba217983807ab4a6b7a854031b2bb 3203 delay-moov-elst-neg-cts write_data len 36, time nopts, type header atom ftyp write_data len 1123, time nopts, type header atom - write_data len 900, time 0, type sync atom moof write_data len 908, time 1000000, type sync atom moof write_data len 148, time nopts, type trailer atom - -3be575022e446855bca1e45b7942cc0c 3115 empty-moov-neg-cts +7428ad079e6c7b0ae63de75520a17567 3115 empty-moov-neg-cts From patchwork Tue Jul 27 13:08:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 29062 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a11:4023:0:0:0:0 with SMTP id ky35csp4834083pxb; Tue, 27 Jul 2021 06:09:06 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxwQhC4Ssfo401OzYIWj2U7pEUU9aqnnIIU066dGXgCQ1fdRHm1KiP80RAjne7ocl5PWyd0 X-Received: by 2002:aa7:cd92:: with SMTP id x18mr20845913edv.325.1627391346197; Tue, 27 Jul 2021 06:09:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627391346; cv=none; d=google.com; s=arc-20160816; b=LqW6UifY6jbJVL66XIrpBGynwsOmejPsfjXao1rrldv8UQB0u30LnoDMIfDnY/prE1 ikWYUjLXtrdLDfwv8tjSHuEYvTZ6qQaiiX3rYsXE3WuxSY/58grPo8wzIexU7P8NS5V/ BRgrlccRuDDMz7SLN51rjQHYzh5T3kxYJpY2WsW0PuNtFcXUy8AgLcltbMAaGkUsBrwD k3flnDdCYt+E6VJkEOEf8a3l0HOLuIW1fW4RSrMGdSwk298mO3/y1QIHGZqhhDzhN9Uu LbFvzahwKYBsD/84vd1ZosHbHiXYaHUgVX9ZlunSXZ6xTs+ZhH1bQspIxzzKKw3KcNUV /riQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=0UKipK7cPejr6wOnRVgdMFIhnTZ7eWjlfTpHJNELxwQ=; b=osXwPpu9U9k9zHPnmvfJrJjWEgRlGPQqK4fbBCdRIhOLmjUWFptTs5ZaHbAPFh1eLo s+j1ZqFT5nLvMtP90Pkraopj3wj8u6DjS6bz5mEq7NlSf17eDVlTakoj1RiYLgJI/jJD 0S5tKbbPygj1B1YAeSTkDksAL7KtGn4LY4mt6956bMAqxYGMm5/Rj8aKVx4DSmkQi2gD JWXa3ZhqLJo5gf2yo77AAzgRJ/7Gik7cATN0fWdvJorKof+otOjHtJ4RFmMB1V61V2rO FPfy/cbGqmMAI0LL/q/+4qTe7LcnCr1oQmROeAXIQXMgRebFVqxgNfGF+HHzmPoOfK7S KgAQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=taoFg1r5; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id eb8si3307712edb.415.2021.07.27.06.09.05; Tue, 27 Jul 2021 06:09:06 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=taoFg1r5; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8E7C76881B5; Tue, 27 Jul 2021 16:08:49 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F1E2A68813A for ; Tue, 27 Jul 2021 16:08:40 +0300 (EEST) Received: by mail-pl1-f175.google.com with SMTP id e21so11205622pla.5 for ; Tue, 27 Jul 2021 06:08:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=Gu3VUNPGNx9qiyRwGADtEYcH3BQ9Ufn5Ygdu/XhJORQ=; b=taoFg1r52aQK3tMnjG5qANE+NLjzZ10sKtHmyHxGw5xu62yWSYjB+wkIQhTZSw7ooB Ru+k3VNa6m7eis3h+pTrUmt3k2dsex8LajwBHi5+F7D2+E0T6xHGsx3RgVcZXQdAeUAc ebCT+IJvNH5GidrjnXmEPrvN0sJJCtFV24W9Ru8WzIIUxIOpSw32gWwKxdU2NB9mUdQv kuAfTJy/UH2I8QL7AA0ngVzS5h2wnS+IVbw2fiEcjhk2Z8klp8hN3VhTDfGdQhk2R7ls vUwabWx8JQYeny7evy0HsKu0sAgwlfwFyTUvZB8H02emdDJZN5JF4Oo8VHrVuoCdc9Hs XaPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Gu3VUNPGNx9qiyRwGADtEYcH3BQ9Ufn5Ygdu/XhJORQ=; b=qmBg/LwiL7gOZR6wVUM0DS+93iz9jV3MVqOos30MZjLOqpoNRSatMasH7RLPFuU5BY oaGuZl2sFG8Vbwpp6SDJnL9FMBEJB7b1RUlJXq3xR7iGa3dvIRWARk02PpzktGfV/4A9 ImNt6YXedqTIOJZNT7eO0EuyUYyLgATaTme99zosaYM3YjJv9a45t069U2uCe7pXr7AV VDs/iXP55GCQ2Li8NmJlEtKlJZ0jB/8yQoCRs9I6phPN7bMZJ6t5i4tT2ZlwMANMMDTe 2K7IxYwKv5hJplXDJBMgk5SWHGq5b5aKShdvQ5gaoafuigVpFU9zqokEfYy46fwLuLaY 0tDw== X-Gm-Message-State: AOAM532ikA56EPXzso6aC/tznsRgsqR4IZRuXC+FxA9k2cFZJbYC6a0g fDd06wHPyhtbUA9z5j7EuVLF6JSZuIo= X-Received: by 2002:a63:1913:: with SMTP id z19mr22774489pgl.315.1627391318727; Tue, 27 Jul 2021 06:08:38 -0700 (PDT) Received: from localhost.localdomain ([191.84.244.212]) by smtp.gmail.com with ESMTPSA id t10sm3904890pgv.52.2021.07.27.06.08.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Jul 2021 06:08:38 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 27 Jul 2021 10:08:20 -0300 Message-Id: <20210727130820.708-2-jamrial@gmail.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210727130820.708-1-jamrial@gmail.com> References: <20210727130820.708-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] avformat/movenc: parse h264 packets to build Sync Sample and Recovery Point tables X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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" X-TUID: a7e+D4qmBJwC Since we can't blindly trust the keyframe flag in packets and assume its contents are a valid Sync Sample, do some basic bitstream parsing to build the Sync Sample table in addition to a Random Access Recovery Point table. Suggested-by: ffmpeg@fb.com Signed-off-by: James Almer --- libavformat/movenc.c | 125 +++++++++++++++++++++++++++++++++-- libavformat/movenc.h | 1 + tests/ref/lavf-fate/h264.mp4 | 6 +- 3 files changed, 123 insertions(+), 9 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 57062f45c5..159e0261b7 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -34,13 +34,17 @@ #include "avc.h" #include "libavcodec/ac3_parser_internal.h" #include "libavcodec/dnxhddata.h" +#include "libavcodec/h264.h" +#include "libavcodec/h2645_parse.h" #include "libavcodec/flac.h" #include "libavcodec/get_bits.h" +#include "libavcodec/golomb.h" #include "libavcodec/internal.h" #include "libavcodec/put_bits.h" #include "libavcodec/vc1_common.h" #include "libavcodec/raw.h" +#include "libavcodec/sei.h" #include "internal.h" #include "libavutil/avstring.h" #include "libavutil/channel_layout.h" @@ -2537,7 +2541,9 @@ static int mov_preroll_write_stbl_atoms(AVIOContext *pb, MOVTrack *track) if (!sgpd_entries) return AVERROR(ENOMEM); - av_assert0(track->par->codec_id == AV_CODEC_ID_OPUS || track->par->codec_id == AV_CODEC_ID_AAC); + av_assert0(track->par->codec_id == AV_CODEC_ID_OPUS || + track->par->codec_id == AV_CODEC_ID_AAC || + track->par->codec_id == AV_CODEC_ID_H264); if (track->par->codec_id == AV_CODEC_ID_OPUS) { for (i = 0; i < track->entry; i++) { @@ -2545,7 +2551,7 @@ static int mov_preroll_write_stbl_atoms(AVIOContext *pb, MOVTrack *track) int distance = 0; for (j = i - 1; j >= 0; j--) { roll_samples_remaining -= get_cluster_duration(track, j); - distance++; + distance--; if (roll_samples_remaining <= 0) break; } @@ -2555,7 +2561,7 @@ static int mov_preroll_write_stbl_atoms(AVIOContext *pb, MOVTrack *track) if (roll_samples_remaining > 0) distance = 0; /* Verify distance is a maximum of 32 (2.5ms) packets. */ - if (distance > 32) + if (distance < 32) return AVERROR_INVALIDDATA; if (i && distance == sgpd_entries[entries].roll_distance) { sgpd_entries[entries].count++; @@ -2566,10 +2572,22 @@ static int mov_preroll_write_stbl_atoms(AVIOContext *pb, MOVTrack *track) sgpd_entries[entries].group_description_index = distance ? ++group : 0; } } + } else if (track->par->codec_id == AV_CODEC_ID_H264) { + for (i = 0; i < track->entry; i++) { + int distance = track->cluster[i].roll_distance; + if (i && distance == sgpd_entries[entries].roll_distance) { + sgpd_entries[entries].count++; + } else { + entries++; + sgpd_entries[entries].count = 1; + sgpd_entries[entries].roll_distance = distance; + sgpd_entries[entries].group_description_index = distance ? ++group : 0; + } + } } else { entries++; sgpd_entries[entries].count = track->sample_count; - sgpd_entries[entries].roll_distance = 1; + sgpd_entries[entries].roll_distance = -1; sgpd_entries[entries].group_description_index = ++group; } entries++; @@ -2588,7 +2606,7 @@ static int mov_preroll_write_stbl_atoms(AVIOContext *pb, MOVTrack *track) avio_wb32(pb, group); /* entry_count */ for (i = 0; i < entries; i++) { if (sgpd_entries[i].group_description_index) { - avio_wb16(pb, -sgpd_entries[i].roll_distance); /* roll_distance */ + avio_wb16(pb, sgpd_entries[i].roll_distance); /* roll_distance */ } } @@ -2639,7 +2657,9 @@ static int mov_write_stbl_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext if (track->cenc.aes_ctr) { ff_mov_cenc_write_stbl_atoms(&track->cenc, pb); } - if (track->par->codec_id == AV_CODEC_ID_OPUS || track->par->codec_id == AV_CODEC_ID_AAC) { + if (track->par->codec_id == AV_CODEC_ID_OPUS || + track->par->codec_id == AV_CODEC_ID_AAC || + track->par->codec_id == AV_CODEC_ID_H264) { mov_preroll_write_stbl_atoms(pb, track); } return update_size(pb, pos); @@ -5150,6 +5170,96 @@ static int mov_parse_mpeg2_frame(AVPacket *pkt, uint32_t *flags) return 0; } +static int mov_parse_h264_frame(AVPacket *pkt, MOVTrack *trk) +{ + GetBitContext gb; + const uint8_t *buf = pkt->data; + const uint8_t *buf_end = pkt->data + pkt->size; + uint32_t state = -1; + unsigned roll_distance = 0; + int nal_length_size = 0, nalsize; + int idr = 0; + + if (!pkt->size) + return 0; + if (trk->vos_data && trk->vos_data[0] == 1) { + if (trk->vos_len < 5) + return 0; + nal_length_size = (trk->vos_data[4] & 0x03) + 1; + } + + while (buf_end - buf >= 4) { + if (nal_length_size) { + int i = 0; + nalsize = get_nalsize(nal_length_size, buf, buf_end - buf, &i, NULL); + if (nalsize < 0) + break; + state = buf[nal_length_size]; + buf += nal_length_size + 1; + } else { + buf = avpriv_find_start_code(buf, buf_end, &state); + if (buf >= buf_end) + break; + } + + switch (state & 0x1f) { + case H264_NAL_IDR_SLICE: + idr = 1; + goto end; + case H264_NAL_SEI: + init_get_bits8(&gb, buf, buf_end - buf); + do { + GetBitContext gb_payload; + int ret, type = 0, size = 0; + + do { + if (get_bits_left(&gb) < 8) + goto end; + type += show_bits(&gb, 8); + } while (get_bits(&gb, 8) == 255); + do { + if (get_bits_left(&gb) < 8) + goto end; + size += show_bits(&gb, 8); + } while (get_bits(&gb, 8) == 255); + + if (size > get_bits_left(&gb) / 8) + goto end; + + ret = init_get_bits8(&gb_payload, gb.buffer + get_bits_count(&gb) / 8, size); + if (ret < 0) + goto end; + + switch (type) { + case SEI_TYPE_RECOVERY_POINT: + roll_distance = get_ue_golomb_long(&gb_payload); + break; + default: + break; + } + skip_bits_long(&gb, 8 * size); + } while (get_bits_left(&gb) > 0 && show_bits(&gb, 8) != 0x80); + break; + default: + break; + } + if (nal_length_size) + buf += nalsize - 1; + } + +end: + if (roll_distance != (int16_t)roll_distance) + roll_distance = 0; + trk->cluster[trk->entry].roll_distance = roll_distance; + + if (idr) { + trk->cluster[trk->entry].flags |= MOV_SYNC_SAMPLE; + trk->has_keyframes++; + } + + return 0; +} + static void mov_parse_vc1_frame(AVPacket *pkt, MOVTrack *trk) { const uint8_t *start, *next, *end = pkt->data + pkt->size; @@ -5740,6 +5850,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) trk->cluster[trk->entry].entries = samples_in_chunk; trk->cluster[trk->entry].dts = pkt->dts; trk->cluster[trk->entry].pts = pkt->pts; + trk->cluster[trk->entry].roll_distance = 0; if (!trk->entry && trk->start_dts != AV_NOPTS_VALUE) { if (!trk->frag_discont) { /* First packet of a new fragment. We already wrote the duration @@ -5821,6 +5932,8 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) if (par->codec_id == AV_CODEC_ID_VC1) { mov_parse_vc1_frame(pkt, trk); + } else if (par->codec_id == AV_CODEC_ID_H264) { + mov_parse_h264_frame(pkt, trk); } else if (par->codec_id == AV_CODEC_ID_TRUEHD) { mov_parse_truehd_frame(pkt, trk); } else if (pkt->flags & AV_PKT_FLAG_KEY) { diff --git a/libavformat/movenc.h b/libavformat/movenc.h index af1ea0bce6..73bf73ce8f 100644 --- a/libavformat/movenc.h +++ b/libavformat/movenc.h @@ -56,6 +56,7 @@ typedef struct MOVIentry { #define MOV_PARTIAL_SYNC_SAMPLE 0x0002 #define MOV_DISPOSABLE_SAMPLE 0x0004 uint32_t flags; + int16_t roll_distance; AVProducerReferenceTime prft; } MOVIentry; diff --git a/tests/ref/lavf-fate/h264.mp4 b/tests/ref/lavf-fate/h264.mp4 index a9c3823c2c..c08ee4c7ae 100644 --- a/tests/ref/lavf-fate/h264.mp4 +++ b/tests/ref/lavf-fate/h264.mp4 @@ -1,3 +1,3 @@ -fe299ea5205b71a48281f917b1256a5d *tests/data/lavf-fate/lavf.h264.mp4 -547928 tests/data/lavf-fate/lavf.h264.mp4 -tests/data/lavf-fate/lavf.h264.mp4 CRC=0x9da2c999 +2812f617314d23474fcb23898b8a56ab *tests/data/lavf-fate/lavf.h264.mp4 +548084 tests/data/lavf-fate/lavf.h264.mp4 +tests/data/lavf-fate/lavf.h264.mp4 CRC=0x396f0829