From patchwork Thu Jul 9 10:35:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20912 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 C2B2944873B for ; Thu, 9 Jul 2020 14:33:27 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 98BAD68B5C3; Thu, 9 Jul 2020 14:33:27 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f68.google.com (mail-ej1-f68.google.com [209.85.218.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C4F8D689C71 for ; Thu, 9 Jul 2020 14:33:21 +0300 (EEST) Received: by mail-ej1-f68.google.com with SMTP id p20so1866648ejd.13 for ; Thu, 09 Jul 2020 04:33:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=6edRKoW96giz6Ylon7sZGV/tG8V2ltgWeuQFQl31hGI=; b=gbFm+BvNGkIchsDC9Z0XHJKfaDujSqXPlD3B+0+3ZxTKxuFZ/eA1M+zb78ZO7/4CV8 KIr9rcCvBMErfqLjVr8pZCJjPxNIyDP6+sADZx+FyajTQnxsCzL/lJvwocLQgAV9AJZK kSH5TvaYdw6l3odvuh+i4KbmjvJQ/uhultQO0d7cbtvYLyGgZj3pm4k91GYbxnUN+qxe Z+TzZC+fZ6ISJijTrqgVqerojS0Lv4chyT1HCCOZcRogTQ13iw4NTHLYEU4/QtfyWT37 8x67j2yZ4JFgW+OZC4drdl2ymrFhPYgElhefbPP5exbNWG+xPr2TaI0GNB/zcUnO40RK TXgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=6edRKoW96giz6Ylon7sZGV/tG8V2ltgWeuQFQl31hGI=; b=DM9N6pCVBgfLkBLQMIKZeO8qd4UJQk4nc2vYPdKkWiR5cvOuo3Aev0f3gkMXgIGK2m 0kZz9jrx5kkQtvUZ9UM2ZwA/suSQVX9gbNsn8pD6+33pgUaH2OlTMAzRtZDcxM42anDE rqBmudGIn29fs5K+oxaJUfcY2CX9O7iPzpqSc7SgGx3qkUKbqfJJ3K+E3OPye1K02RW7 Atm8lFFVOJkhvbggl6p7smJiYo6qlbVAvWlXE7FDq+cPox7FeD6FkuuZTOFuHHGpL6oA TLqt1m5n5ZYFWyYrydKPCHQv7/QPF8AgGx/qDiN3IGyf+6OXBWX3u/fVHien/eOwrOFo PMPw== X-Gm-Message-State: AOAM530XE0K1hu+Cpc2w6TZLP7N7eF0Xbbdd/tDLPdbVwDskZOMF82oH B6pRYHz1v6NlS5qnrKSO2mg72foe X-Google-Smtp-Source: ABdhPJxxnVVVVYU03MuyimHU0Um88G955r+Ksn7a8pbDlnp+wXIR6n1jVdejc5Xnuh8f9x3DeOSfZw== X-Received: by 2002:adf:9286:: with SMTP id 6mr63046532wrn.361.1594290951352; Thu, 09 Jul 2020 03:35:51 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id c15sm4155623wme.23.2020.07.09.03.35.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 03:35:50 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 12:35:36 +0200 Message-Id: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/7] avformat/avc: Fix undefined shift and assert when reading exp-golomb num 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" The current code for parsing unsigned exponential-golomb codes is not suitable for long codes: If there are enough leading zeroes, it left-shifts 1 by 32 places and uses get_bitsz to read 32 bits, although it is only suitable to read 0-25 bits. There is an av_assert2 to ensure this when using the uncached bitstream reader; with valid input one can still run into the assert and left-shift 1 by 31 which is undefined. This commit changes this. All valid data is parsed correctly; invalid data does no longer lead to undefined behaviour or to asserts. Parsing all valid data correctly also necessitated changing the return value to unsigned; also an intermediate variable used for parsing signed exponential-golomb codes needed to be made unsigned, too, in order to parse long signed codes correctly. Signed-off-by: Andreas Rheinhardt --- Moving the function to the beginning is done in preparation for another commit that I'll send soon. libavformat/avc.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/libavformat/avc.c b/libavformat/avc.c index b5e2921388..55494eb08a 100644 --- a/libavformat/avc.c +++ b/libavformat/avc.c @@ -27,6 +27,21 @@ #include "avc.h" #include "avio_internal.h" +static inline unsigned get_ue_golomb(GetBitContext *gb) +{ + int i; + for (i = 1; i <= 32; i++) { + if (get_bits_left(gb) < i) + return 0; + if (show_bits1(gb)) + break; + skip_bits1(gb); + } + if (i > 32) + return 0; + return get_bits_long(gb, i) - 1; +} + static const uint8_t *avc_find_startcode_internal(const uint8_t *p, const uint8_t *end) { const uint8_t *a = p + 4 - ((intptr_t)p & 3); @@ -318,15 +333,8 @@ static const AVRational avc_sample_aspect_ratio[17] = { { 2, 1 }, }; -static inline int get_ue_golomb(GetBitContext *gb) { - int i; - for (i = 0; i < 32 && !get_bits1(gb); i++) - ; - return get_bitsz(gb, i) + (1 << i) - 1; -} - static inline int get_se_golomb(GetBitContext *gb) { - int v = get_ue_golomb(gb) + 1; + unsigned v = get_ue_golomb(gb) + 1; int sign = -(v & 1); return ((v >> 1) ^ sign) - sign; } From patchwork Thu Jul 9 10:35:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20906 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 2D6CF44B499 for ; Thu, 9 Jul 2020 13:37:14 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0843C68B5AD; Thu, 9 Jul 2020 13:37:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 50C9268B4BB for ; Thu, 9 Jul 2020 13:37:08 +0300 (EEST) Received: by mail-wr1-f67.google.com with SMTP id z2so1811973wrp.2 for ; Thu, 09 Jul 2020 03:37:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=IHK5FVxC6IzkghrqyLkn2VMnWZWyUxvcUjm3j60bp5Q=; b=DF9NFHEVV4cMbjxzrbbhGNi/I8JkxgOxF9fIKK7+6PVeciOEoLIkcARvePdBb1rmsV Hc8LbL6ycyfOxGAFK8LfaDvl1ekBN5lAPJ7OnaK0+G2/GktWoUzBSlM3DOBg1qyB5AMm uHTB8j2w8F7/r/7njsMhll8roT2srfCSCB+Z8L8JWcnyKCaYXlZSYb6Voe3JAMf+LEoM j6RZ6tCVQ/SaxQp03WgWh2H9jc7DzIDL8dISgqJrdkynZUT2EOgdG44XO7dJe+laqWeP bb5pxF67lqlVhQJgkRQxG2QvkkXELdROUvqg6Q+jXeePSZxJMDVZ9Dlg4UX9DWvegH3J LEtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=IHK5FVxC6IzkghrqyLkn2VMnWZWyUxvcUjm3j60bp5Q=; b=nCHMcOiICm6/h8sgBkZWR2kjtJIgIdspSZ9BhYVeTwLqNcOqQHl4GHE2wvnHVfiYTW XAh8RGhBvl9ObyByhChUizh5/iapePHpVwNgQ7O4R70CuB8dKKzVPL8xln2nuteweXeC SZ/9Sn43DD9mfPKGHSzE/DEC3i90zt+CWfDf2TP24jV0BCg4eL0zV1At9Af5Z+2n7Koa n7d+2d11vVkLuPt57Ro1Sm+ZA4LG8BQTLVhUkoYXUcva9YiS3yt2LevkpP5H3Mz/VRZw 6IyYNP8I6VPh+DnxJrTwogcGVeP5KqELmf1ImiemGDA6braPwZUIGnU5T5xl9JSLTL7R UJPA== X-Gm-Message-State: AOAM532ZQymANCnMXk9AZpAgSfoLAxndVXFuPeT1U40++XkQmcSCewt+ a3BedllWNV72MR6Gl9JXVl3eOTfI X-Google-Smtp-Source: ABdhPJy7pKHw+ezJi2adhMswskRZoM5ApoFKtnTq4hSQUUiVCMDTcdffbQldqqFUD0+CFtd1amQbZg== X-Received: by 2002:adf:9286:: with SMTP id 6mr63051787wrn.361.1594291027509; Thu, 09 Jul 2020 03:37:07 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id c15sm4155623wme.23.2020.07.09.03.37.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 03:37:06 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 12:35:37 +0200 Message-Id: <20200709103542.19909-2-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> References: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/7] avformat/avc: Fix undefined pointer arithmetic for small buffers 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" avc_find_startcode_internal() would subtract 6 from a pointer (representing the end of a buffer) without checking whether the buffer was actually large enough; but pointer arithmetic is undefined except when one stays in the buffer. Signed-off-by: Andreas Rheinhardt --- libavformat/avc.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/libavformat/avc.c b/libavformat/avc.c index 55494eb08a..cc92fb1038 100644 --- a/libavformat/avc.c +++ b/libavformat/avc.c @@ -44,14 +44,15 @@ static inline unsigned get_ue_golomb(GetBitContext *gb) static const uint8_t *avc_find_startcode_internal(const uint8_t *p, const uint8_t *end) { - const uint8_t *a = p + 4 - ((intptr_t)p & 3); + if (end - p <= 5) + goto rest; - for (end -= 3; p < a && p < end; p++) { + for (; (uintptr_t)p & 3; p++) { if (p[0] == 0 && p[1] == 0 && p[2] == 1) return p; } - for (end -= 3; p < end; p += 4) { + for (end -= 6; p < end; p += 4) { uint32_t x = *(const uint32_t*)p; // if ((x - 0x01000100) & (~x) & 0x80008000) // little endian // if ((x - 0x00010001) & (~x) & 0x00800080) // big endian @@ -70,13 +71,15 @@ static const uint8_t *avc_find_startcode_internal(const uint8_t *p, const uint8_ } } } + end += 6; - for (end += 3; p < end; p++) { +rest: + for (; end - p > 3; p++) { if (p[0] == 0 && p[1] == 0 && p[2] == 1) return p; } - return end + 3; + return end; } const uint8_t *ff_avc_find_startcode(const uint8_t *p, const uint8_t *end){ From patchwork Thu Jul 9 10:35:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20907 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 1BDA844B499 for ; Thu, 9 Jul 2020 13:37:15 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0AA7A68B5B0; Thu, 9 Jul 2020 13:37:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2F41C68B5B7 for ; Thu, 9 Jul 2020 13:37:09 +0300 (EEST) Received: by mail-wr1-f66.google.com with SMTP id f7so1825563wrw.1 for ; Thu, 09 Jul 2020 03:37:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=5dlAuJmQiySIJF3k5oMbGPEszlTfkknan2NlKLxE1pY=; b=NLOvUlK1iBlj3NEw09Hr+F9HiSRxodbWbNheKy5atJswd1G6/4MsRsT5YeKZcunlrz fQwYGYvgcsgj2VcceRN7dA267R1g85pGUn6kLPTnCPyp7VILa6ZLaNCTS/RO9AYCLwf1 qPvMMLiOXYJNnZg28YZ6rcC/R5Auhye0c62ZMyMujZg3+rH5QkQ268lcMLFA0X+F12pV iZzBS+iKoOypIx7bjOqiDReS81Hc4oqWfqsd1VNR7HRqvxxgq7KjpFOlgBmg5zpjqP7s UR1HexB6yIYv/LsUA2hMWlPjEpCXI+W0UrPs665Ie1SRCd4p8ZD5FpXUAwHttdl+xY1z hU9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=5dlAuJmQiySIJF3k5oMbGPEszlTfkknan2NlKLxE1pY=; b=lMox1HKLDhAYo6jdnvOmV/i/7pFTFBcj3LUgyncvwl0pXaR5L6y7YdeWvCAcKfSjSE DHj+SrgxdjKZTmJQ65tyE+FmCX66DHVETNVe6BOM1wCLrptOVgtGz1q1sZokAJ28Lyct sf6Qp+48HI94EZ4iAwZOHxI+GgQdq0y9YZ5fa6vNaRyHoMNFNmKQX3mDu8c+nA75Tt39 BtdGMbl4PD75X9L6z9TH5D9CJzCc1xTI9EJKxM3bSA4Jcl4DZkdNBtEW/kfIUUkd7Xs6 x5Uf75PrbiBiJT+oN2TFptzu/5BSGzvN6tvY6vWa9FO8YMR6xDCrjG3hhWMYCvE4HS04 1eJg== X-Gm-Message-State: AOAM5330HSBWr2rE7ga9QPVB3bTPjNwyOve+b8JqmXocpHbkG5Dm2UGK D9MwqpgPRkQZHJcAi4C3eUSlmAD0 X-Google-Smtp-Source: ABdhPJw7jpBAynEfjqEow1Ke60rPQ/InCNgG7KneIv3jJvsEExLc+VaxXW/aVVl+sQFvJukjac3H9A== X-Received: by 2002:adf:84e2:: with SMTP id 89mr65342227wrg.139.1594291028431; Thu, 09 Jul 2020 03:37:08 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id c15sm4155623wme.23.2020.07.09.03.37.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 03:37:07 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 12:35:38 +0200 Message-Id: <20200709103542.19909-3-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> References: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/7] avformat/sdp: Fix potential write beyond end of buffer 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Andreas Rheinhardt --- libavformat/sdp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/sdp.c b/libavformat/sdp.c index 34e9839b67..2ce1a62262 100644 --- a/libavformat/sdp.c +++ b/libavformat/sdp.c @@ -212,7 +212,7 @@ static char *extradata2psets(AVFormatContext *s, AVCodecParameters *par) p += strlen(p); r = r1; } - if (sps && sps_end - sps >= 4) { + if (sps && sps_end - sps >= 4 && p - psets <= MAX_PSET_SIZE - strlen(profile_string) - 7) { memcpy(p, profile_string, strlen(profile_string)); p += strlen(p); ff_data_to_hex(p, sps + 1, 3, 0); From patchwork Thu Jul 9 10:35:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20908 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 E53F544B499 for ; Thu, 9 Jul 2020 13:37:17 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CBFE568B5CB; Thu, 9 Jul 2020 13:37:17 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3065668B5BF for ; Thu, 9 Jul 2020 13:37:10 +0300 (EEST) Received: by mail-wr1-f65.google.com with SMTP id f7so1825612wrw.1 for ; Thu, 09 Jul 2020 03:37:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=HeslXwNlZuT44xvtTzsUPwBe0dWYR2oGbKKcjjxXpIU=; b=hqzCXbHJG8JxJVunao4jA73ax8xUq3ycaQrWyzr2VyR1P1davXMBEPDuM+8ek8Trnx ubpks8dnnZje6D0D3LllkEbWMtl1elSxjCyGYkdq+U0Er5UO6180231mcsyaOd0stAGk 6arPhi31pE8oLzApofjog5E34K1xG4tFfDi2p427uan8Ctn/T6gcarj4fd5VMZQIxGzL PM2RRyO/uaEuSi00cpTKRhJIysBO/RqRsSSSK/DZMra23RWHYA2uLTR4ULjrJqeOr7yj PWMJP5iTwjOLaY8yiaf40FMLs1OJlVGsesU6gshgqk5/vo6uwhprqzCC4Fsqb7dlzgjT uJvA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HeslXwNlZuT44xvtTzsUPwBe0dWYR2oGbKKcjjxXpIU=; b=umA0Nd8daUf3wOhJ6eFzQu5g8SsiaKrQXwwUYxRvI/9Zt89jY+89isRBy1a/pZ7TG5 5px2OrGitX58Y1wxDATSuHLpphZcHdKeuQchw98uo5IZB1m+AoqPL8+gBjimUPPZvdir ZzqWmnn4kDNFk0JJE/Gq8QaZmCWqLCEUeUKEbTQpImLA5JbV1W8MrzdC4bxtW9TWx0gA Pt+J3P60YyvjoCWENjwsIc8dCqyqdx3hjj4cjhYH45NM9yVX1yo8yVSQDQ4NwVnrm7Uy 6GWqvthRWZ/cGs9NWe0BPyiVMGuA7/HyS2IXlbo4UJvpSQbTkJ+smOXGNQZ/HrMcrHJ0 Ojng== X-Gm-Message-State: AOAM533v3zgUO46IE2HzWQy7C7CBgfIY92J62JRrLqJoAC/LaUIarqoo wbw3AfYi8s69yQmqDYTVHffNeTP7 X-Google-Smtp-Source: ABdhPJw9auOhmwiINPjqoWFnax/esAthLvT6keUZHoS009++3SYGNtb5dxnwyL77OhZzJBNvZ1ZhXw== X-Received: by 2002:adf:f5ce:: with SMTP id k14mr59824192wrp.234.1594291029384; Thu, 09 Jul 2020 03:37:09 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id c15sm4155623wme.23.2020.07.09.03.37.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 03:37:08 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 12:35:39 +0200 Message-Id: <20200709103542.19909-4-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> References: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/7] avformat/mm: Check for existence of audio stream 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" No audio stream is created unconditionally and if none has been created, no packet with stream_index 1 may be returned. This fixes an assert in ff_read_packet() in libavformat/utils reported in ticket #8782. Signed-off-by: Andreas Rheinhardt --- libavformat/mm.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libavformat/mm.c b/libavformat/mm.c index d40fd12acc..02ffbcd824 100644 --- a/libavformat/mm.c +++ b/libavformat/mm.c @@ -175,6 +175,8 @@ static int read_packet(AVFormatContext *s, return 0; case MM_TYPE_AUDIO : + if (s->nb_streams < 2) + return AVERROR_INVALIDDATA; if ((ret = av_get_packet(s->pb, pkt, length)) < 0) return ret; pkt->stream_index = 1; From patchwork Thu Jul 9 10:35:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20909 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 AA37744B499 for ; Thu, 9 Jul 2020 13:37:18 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9875268B5BE; Thu, 9 Jul 2020 13:37:18 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7E71A68B51A for ; Thu, 9 Jul 2020 13:37:11 +0300 (EEST) Received: by mail-wr1-f65.google.com with SMTP id b6so1778412wrs.11 for ; Thu, 09 Jul 2020 03:37:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=vAMlq2xLXbZUwfYpNybdxEvY0EAWbwCuIDKl7cluQ48=; b=YgCXo+YKyD7K/HYh+BJhq74BGav7NQmMcInlGEpmoGK4lysdLb1jCnXXJjHCQ72xKN /zMhA/1yWomnIKtGOu9DH9Blszi03sMcLcPr7hmlID1TirP+Ho3JHsm5SRlP4CzGQkEJ STEyGwFH2ZgywKiECKrENRdyVTA+JaHW4IO3y2KSEPD1fhZQ2hk34yEMA5Ndoba3CkSx oxW9cHdT8kP3KCzHoApWeF74kIlmxVf+4WAK3as3CIcrVwTo6mE4ShWRTwynnM4e9Qgv m3GXh6qzSfbTrBZmKOXL0TPFg6ZqF53Da6AL/YTCNnTLlMaWpLQumTnCPy3wPxY508Z8 c2mQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vAMlq2xLXbZUwfYpNybdxEvY0EAWbwCuIDKl7cluQ48=; b=s3HaDV38guTMlTXmxI4Qs4CxFnaoMe6p5FU9569Dlk4O3WrxCEiNdTLr6Y1iHHnztC fgkk3N9ElmbQ36ToRIAXHLNsk+yOg7S62dTWpmX+45w21+WHhiKxdZsMBrUdO3se4HnJ OQmkS485QNe/cIWJyapGIdz4p6ts/jQUyCMLhGqmrm7F2VUQtsNqrVF1mhRlBlDsbAPb cVkkOM35CukN7KFQjjF9DbPTQnSyQN3LcQbHPiqLDi10ZX4k7PWCVRsTdnBMV+NNiook kvASTbCa0FhP4AeDwTqmWcdIx4EARIP0vFFijTK08Lmd4g5sJ+IDJi+d267TLJvS4DE5 Ww3Q== X-Gm-Message-State: AOAM531fGNxcIQP1YjcRKJOHib8x9nS3vcJtTX5SVCdjxsPnU/nCnxqa tpQcU3Psa6I+Yeqr4V73hDj0jzgs X-Google-Smtp-Source: ABdhPJxFJtpdoKBcKxcuAjADe8tD/0S0ZfNDhFTI+u+eiTznjD1vaDGUOlaNjM35ACJTnOnpkemckw== X-Received: by 2002:adf:d084:: with SMTP id y4mr61327153wrh.161.1594291030630; Thu, 09 Jul 2020 03:37:10 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id c15sm4155623wme.23.2020.07.09.03.37.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 03:37:09 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 12:35:40 +0200 Message-Id: <20200709103542.19909-5-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> References: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/7] avformat/sdp: Avoid allocation for small HEVC annex B extradata 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" In this case, extradata2psets_hevc would have used avio_open_dyn_buf() + avio_close_dyn_buf() to convert the annex B extradata to the hvcc format (which is easier parseable); the temporary buffer would then be freed. avio_close_dyn_buf() + av_free() can be replaced by avio_get_dyn_buf() + ffio_free_dyn_buf(). This saves an allocation and a memcpy if the hvcc is so small that it fits into the dynamic buffer's write buffer. Signed-off-by: Andreas Rheinhardt --- libavformat/sdp.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/libavformat/sdp.c b/libavformat/sdp.c index 2ce1a62262..3acbf5d197 100644 --- a/libavformat/sdp.c +++ b/libavformat/sdp.c @@ -27,6 +27,7 @@ #include "libavcodec/xiph.h" #include "libavcodec/mpeg4audio.h" #include "avformat.h" +#include "avio_internal.h" #include "internal.h" #include "avc.h" #include "hevc.h" @@ -228,7 +229,7 @@ static char *extradata2psets_hevc(AVCodecParameters *par) char *psets; uint8_t *extradata = par->extradata; int extradata_size = par->extradata_size; - uint8_t *tmpbuf = NULL; + AVIOContext *pb = NULL; int ps_pos[3] = { 0 }; static const char * const ps_names[3] = { "vps", "sps", "pps" }; int num_arrays, num_nalus; @@ -239,15 +240,12 @@ static char *extradata2psets_hevc(AVCodecParameters *par) // other anyway, we get away with a little less work by using the hvcc // format. if (par->extradata[0] != 1) { - AVIOContext *pb; if (avio_open_dyn_buf(&pb) < 0) return NULL; if (ff_isom_write_hvcc(pb, par->extradata, par->extradata_size, 0) < 0) { - avio_close_dyn_buf(pb, &tmpbuf); goto err; } - extradata_size = avio_close_dyn_buf(pb, &extradata); - tmpbuf = extradata; + extradata_size = avio_get_dyn_buf(pb, &extradata); } if (extradata_size < 23) @@ -315,12 +313,12 @@ static char *extradata2psets_hevc(AVCodecParameters *par) pos += len; } } - av_free(tmpbuf); + ffio_free_dyn_buf(&pb); return psets; err: - av_free(tmpbuf); + ffio_free_dyn_buf(&pb); return NULL; } From patchwork Thu Jul 9 10:35:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20910 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 9B4D644B499 for ; Thu, 9 Jul 2020 13:37:20 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7FB4B68B5D7; Thu, 9 Jul 2020 13:37:20 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A979968B5B2 for ; Thu, 9 Jul 2020 13:37:12 +0300 (EEST) Received: by mail-wr1-f66.google.com with SMTP id a6so1807187wrm.4 for ; Thu, 09 Jul 2020 03:37:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=rn5DYxpw9/O4OqJMyJpOhBJ670gBCiqb4/nq/ClM+dU=; b=edo/JFDi2zcQSAs275hTMJ+SYRVAZA8w7df7C69ual4BvdlNKQk8LuXmGlAEdUWo8S fVcPsPV1HbOjoCyejfOc+1fdEJeX64V2xpkBPVPzhovH4PGT5/cYsML6FpcERpv2gU+O QPKig2I6FPT+i28Kv9FlsJWLz/+f1q4lZxQbt5dMoiuFRr1VObgUeS/j2dR7ZckgCFOn 7JsT+fGtp41wwWHqIwN4glKch+hBgEczZ4enVgzwbRrOC5byFkdGBYFUuGoIU15grmJL InyKMYwMx7uCfttCo2n5q730YSZejT8CDpTUlmvrpioWJXH4gENZlFNcSVpotVek2ZHA CuXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=rn5DYxpw9/O4OqJMyJpOhBJ670gBCiqb4/nq/ClM+dU=; b=W++eyvG2Ekod5E239AMuKHet8qBByAjHrBGVGmmI84vpdynclhzL4EcjgzZSq5ChNz WTuC3GFH7RtDb/12vVdcMlHC62Z8ANDMFLBK43sVl+D1HggYHnOQbw69fotoINnWvv0M V7f9jV+RNojEXY20ycVYisX9mJ//BM9e0XN3CATyt6KIPRaqNZwci34b53/mwxM6GuYD toLKe+evP8Cbpw/sAStUYJrmqkU+Lc8KRBvYp8i22Qw9jXLFS6xkz3JU1cJXN+2co6vx ZtHpJowTUCXz1iDR1xQJzlqjATCNRybJ/PwrE13obJOGPwrv1+210I+lyGs4K3LdCxOG ybFg== X-Gm-Message-State: AOAM531G/eXE5vdGBxh6kdK/M5ERNfzdM/NR3jP+NO7zKujLhh/rEfLt cC5m/adu9/KXKJqf7OLNpTJiYAXI X-Google-Smtp-Source: ABdhPJzBhjn0N9QUlG4sp2voqMOLMwG58WoIOQAV54KocB7qEC9FO9bCPysPBjStOrA0FkTsh5kU+g== X-Received: by 2002:adf:f10a:: with SMTP id r10mr31720124wro.406.1594291031863; Thu, 09 Jul 2020 03:37:11 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id c15sm4155623wme.23.2020.07.09.03.37.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 03:37:11 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 12:35:41 +0200 Message-Id: <20200709103542.19909-6-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> References: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 6/7] avformat/sdp: Store strings instead of pointers to strings in array 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Andreas Rheinhardt --- libavformat/sdp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/sdp.c b/libavformat/sdp.c index 3acbf5d197..aa0569cd0d 100644 --- a/libavformat/sdp.c +++ b/libavformat/sdp.c @@ -231,7 +231,7 @@ static char *extradata2psets_hevc(AVCodecParameters *par) int extradata_size = par->extradata_size; AVIOContext *pb = NULL; int ps_pos[3] = { 0 }; - static const char * const ps_names[3] = { "vps", "sps", "pps" }; + static const char ps_names[3][4] = { "vps", "sps", "pps" }; int num_arrays, num_nalus; int pos, i, j; From patchwork Thu Jul 9 10:35:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20911 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 7B25844A1A8 for ; Thu, 9 Jul 2020 13:44:34 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 593226881A5; Thu, 9 Jul 2020 13:44:34 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6B66F680220 for ; Thu, 9 Jul 2020 13:44:28 +0300 (EEST) Received: by mail-wm1-f65.google.com with SMTP id f139so1305024wmf.5 for ; Thu, 09 Jul 2020 03:44:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=tLNzPoH1bR6r/9m7LSME8G1DAv5nG3r6Xg4bMcFpl/k=; b=CX1kimKG6oCuJQp8fKYZUmdH0sm8FludRs1+6mBEc237onfwVXGT8BR+j1J+IRhjLI XA/0z9+Zwvz9JgFULg+ZCYFW9FyWuI0ZM391wb4dJPHMv/QwSCLQoJc9CBp+3mhCQYWU Xfmie3JvPvJwcklgRlUYzb3WHuMoX3ziHRnCLoFI6WbwZWdxAmc3vW9cblvw4sv01inz Zew4QT7dqoe9g+hUZUTgg7VY26P6TPwX+Nw0tx0E/PHncNokQXKa4OiEkaYbVCP4flBj PnQ0fJEQbhW04iLYo6NCz9MC1WSuspUteW05b0uwZUVKI/d+xg9D6nnMFgCZvK6KQP1D +9+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=tLNzPoH1bR6r/9m7LSME8G1DAv5nG3r6Xg4bMcFpl/k=; b=MkvAP8udp2hIgL5OxTXf2m7W2n1ZyLEcgow9UIQLxnZ192WUu5WBcxwR+z9JqLwxOY tfgombx6a+2a9y/wur279H03Snf4qy/8DgDI9bFzBRCybeZ+V09h4nyyo1+yFMlPR6gr g5SVox12HOjvghbQ016CQnw6H2CJIC82lkHsIY/uYi7J5AynhHmGLgwKKy8BmN7RnXw7 qrNKbo0a6ZXi34iwOA8vGSzKwrc1QlTz8qg43mZUkpX8n74XWZDPm2yCrVRxKDRgJa0E P57fBGTx3rq3OvBtoTBi1UmefFEyLT0Rsmtfxi3pq2EcjBPFuYeh/EX1oQ2msAAo3mJO 93Hw== X-Gm-Message-State: AOAM532/LpYKc4TWDcVzizy1/hrqE238BOfWKEvInizuvImqHjUebNFB zItaozB8UVbpjH7zZgO4hBBLb1di X-Google-Smtp-Source: ABdhPJwGap0HfzfnV0M5wo9m3AW6ayrWMu5zVbWWsp2UE37A/qR2EbXcUKagJ+eqIt0MgTOl80TItw== X-Received: by 2002:a1c:49d4:: with SMTP id w203mr14379607wma.13.1594291033247; Thu, 09 Jul 2020 03:37:13 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id c15sm4155623wme.23.2020.07.09.03.37.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 03:37:12 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 12:35:42 +0200 Message-Id: <20200709103542.19909-7-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> References: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 7/7] avformat/sdp: Actually check that parameter set is SPS 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Andreas Rheinhardt --- libavformat/sdp.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libavformat/sdp.c b/libavformat/sdp.c index aa0569cd0d..023c88a583 100644 --- a/libavformat/sdp.c +++ b/libavformat/sdp.c @@ -24,6 +24,7 @@ #include "libavutil/dict.h" #include "libavutil/parseutils.h" #include "libavutil/opt.h" +#include "libavcodec/h264.h" #include "libavcodec/xiph.h" #include "libavcodec/mpeg4audio.h" #include "avformat.h" @@ -161,7 +162,7 @@ static char *extradata2psets(AVFormatContext *s, AVCodecParameters *par) uint8_t *extradata = par->extradata; int extradata_size = par->extradata_size; uint8_t *tmpbuf = NULL; - const uint8_t *sps = NULL, *sps_end; + const uint8_t *sps = NULL; if (par->extradata_size > MAX_EXTRADATA_SIZE) { av_log(s, AV_LOG_ERROR, "Too much extradata!\n"); @@ -199,10 +200,9 @@ static char *extradata2psets(AVFormatContext *s, AVCodecParameters *par) *p = ','; p++; } - if (!sps) { + if (nal_type == H264_NAL_SPS && !sps && r1 - r >= 4) sps = r; - sps_end = r1; - } + if (!av_base64_encode(p, MAX_PSET_SIZE - (p - psets), r, r1 - r)) { av_log(s, AV_LOG_ERROR, "Cannot Base64-encode %"PTRDIFF_SPECIFIER" %"PTRDIFF_SPECIFIER"!\n", MAX_PSET_SIZE - (p - psets), r1 - r); av_free(psets); @@ -213,7 +213,7 @@ static char *extradata2psets(AVFormatContext *s, AVCodecParameters *par) p += strlen(p); r = r1; } - if (sps && sps_end - sps >= 4 && p - psets <= MAX_PSET_SIZE - strlen(profile_string) - 7) { + if (sps && p - psets <= MAX_PSET_SIZE - strlen(profile_string) - 7) { memcpy(p, profile_string, strlen(profile_string)); p += strlen(p); ff_data_to_hex(p, sps + 1, 3, 0); From patchwork Thu Jul 9 19:17:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20929 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 9440344AA01 for ; Thu, 9 Jul 2020 22:18:45 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7295A68B543; Thu, 9 Jul 2020 22:18:45 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C19F7689E53 for ; Thu, 9 Jul 2020 22:18:38 +0300 (EEST) Received: by mail-wr1-f66.google.com with SMTP id f2so3525498wrp.7 for ; Thu, 09 Jul 2020 12:18:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=lSl5oFVpruvh+QvPLyhF06kPvKek3v9K0l0emEgqdkI=; b=DYLiG9LLhLEEjnFRBVm4/5gBweY3u77LGaQYze5iok6+HyKC0HJeeCSO1C24cyN8Rs 6kFfGgS+I5JtzxOy3n8FddVhwHLoFgBRk2PsE05eq1iAGZuIcUMGEKb4/Jj73D2PpTbE a0M3EECj3i9a5Ud9Fmcwkx6EbECSleSm2BZngCtT4d5A4kn/QwtfRuklF6tf1RvXXlQM qSMaFTRWKF3u+pYS2rUcS0vO7V3+czai+QFQqgUTp/FKzTSWUPmbN8H2Bm64yqhrXBn4 Ex34dH+vj+sNM2fj06AitqgbwavEgw+3AezXxMiAEMYlGYWNzoJDkn72/viU6xDLkLAw 9B3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=lSl5oFVpruvh+QvPLyhF06kPvKek3v9K0l0emEgqdkI=; b=s3Sw6mtbx11s3zsAxLVQ+2QladIgjgjX+2uVV6qc83TYxOgNzb7Rhu20edFPk6eduq 4pQt0YotQPgiqCg69P72UnKhYR5WWDSo7Gcpb1Upiph3nWSf+mySgfaVu/gPxBZZfmKK XBYMdmw3bqxOMN7/R4Oq5sEcJa/lKny8jWuuCbj6gZbc3xcc8ng074lIE6hpSxpAv1EA hE3LjMWVJ/fvd4ngRNSVINKwvk1S2wf3FE6oJjuHKrjXiA7Xx3ug1uAmRzyWW/QrPfL5 e2PcSI0w3NFQaSNWoWE+C9/Yow5FPV63lraQnGmccDFQ2NSstCeeWRpHukBw50GQPmri 3JpQ== X-Gm-Message-State: AOAM533dZfyVbAWHwttoAS3WFnSBj10YsW/ASq6CCREG18tcW8h+h8ey Zq02G9LhoPQOeZB+cR4NSvnRDYUv X-Google-Smtp-Source: ABdhPJwYe/b9WGp61xpJT6nyQliKwBgC0cYZiB6iMhX/YQAkrMeHuVTMpWPC/ZFvY9qoE5n8zpEGAw== X-Received: by 2002:a05:6000:10c4:: with SMTP id b4mr60768136wrx.50.1594322317833; Thu, 09 Jul 2020 12:18:37 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id y77sm6574988wmd.36.2020.07.09.12.18.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 12:18:37 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 21:17:55 +0200 Message-Id: <20200709191805.21648-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> References: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 08/17] avformat/avc: Add helper function to parse annex B NAL unit in one go 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Up until now, a caller had no function to easily parse a single annex B NAL unit. There was a "low-level" function that returned the position of the beginning of the next start code, which could be used to get the beginning and the end of NAL units. Yet using this function still required calling the startcode function twice and actually getting the start of the NAL unit data required a loop (because the offset from the start of the unit might be three or four). In practice, several functions that transformed from annex B to mp4 used the same scheme to do so while other (the functions to write H.264/HEVC extradata) used the former to at first transform the input into something more manageable. This commit adds a helper function to easily parse one annex B NAL unit in one go. Signed-off-by: Andreas Rheinhardt --- libavformat/avc.c | 30 +++++++++++++++++++++++++++++- libavformat/avc.h | 2 ++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/libavformat/avc.c b/libavformat/avc.c index cc92fb1038..39078aa5be 100644 --- a/libavformat/avc.c +++ b/libavformat/avc.c @@ -79,15 +79,43 @@ rest: return p; } - return end; + return NULL; } const uint8_t *ff_avc_find_startcode(const uint8_t *p, const uint8_t *end){ const uint8_t *out = avc_find_startcode_internal(p, end); + out = out ? out : end; if(p p && !next[-1] ? next - 1 : next; + next += 3; + } else { + *nal_end = end; + } + *start = next; + return p; +} + int ff_avc_parse_nal_units(AVIOContext *pb, const uint8_t *buf_in, int size) { const uint8_t *p = buf_in; diff --git a/libavformat/avc.h b/libavformat/avc.h index 9792b77913..b3df0a7b6b 100644 --- a/libavformat/avc.h +++ b/libavformat/avc.h @@ -29,6 +29,8 @@ int ff_avc_parse_nal_units(AVIOContext *s, const uint8_t *buf, int size); int ff_avc_parse_nal_units_buf(const uint8_t *buf_in, uint8_t **buf, int *size); int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len); const uint8_t *ff_avc_find_startcode(const uint8_t *p, const uint8_t *end); +const uint8_t *ff_avc_parse_nalu(const uint8_t **start, const uint8_t **nal_end, + const uint8_t *end); int ff_avc_write_annexb_extradata(const uint8_t *in, uint8_t **buf, int *size); const uint8_t *ff_avc_mp4_find_startcode(const uint8_t *start, const uint8_t *end, From patchwork Thu Jul 9 19:20:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20930 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 CE62844B0C4 for ; Thu, 9 Jul 2020 22:20:38 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A5526688151; Thu, 9 Jul 2020 22:20:38 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 80B27688151 for ; Thu, 9 Jul 2020 22:20:32 +0300 (EEST) Received: by mail-wr1-f66.google.com with SMTP id f18so3579728wrs.0 for ; Thu, 09 Jul 2020 12:20:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=QGb0Fun7ZmQM2Zc2eKyv5Ej+M1TPlDgabwzDhFbif5Y=; b=X4HlFsrhjgtneVSBRgIm7SM6LEAgiIPcUQZx6lqOn819U2r5a6E+rBWjtjOwDQfyLE M6tPTKa0mbhy1pi+/WTTMvdAyNUfMQiVf/UMK6Y7I2BL/UiSIsgKvYj7ARU8XXUk/UBl 2D45YMWJ3S6hDJskWGUnNw/fDKig2oZV4x+2DRc1hj8MQcmHxJ48+OaiOM+Q0pIqnBl/ 0b55aITpYPal4Xtev2hyoAkjVwdAWNQKpFdhQ4+dc+A3lx4iG/Ydfmvrmav9dL7/9EzP qgSm6ni/UfiHENRxyoDhX1hFIleQ8zvMwDROxBfwPegNlCHCqwDQYIoSe/834qeBg9gg w/Iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=QGb0Fun7ZmQM2Zc2eKyv5Ej+M1TPlDgabwzDhFbif5Y=; b=QD54sG65MW4q2kZ2IMVjjpVT0EKZ/bGhlfW94IO3VyCQhL2+e4tSrrbx+7R08LcgJu EOWFHVmS/NZ2we7XYIAp4zrY4Ljb3CpQhCJcL96gkuh5TIMvIXj90uTPDbBIj4WcHZAR NE31/jEajMHLlEmcB8VoNrYVHKAdbdzOqcOq454lr9q4GsP5frUmCPZMx3uZ1YVfqmTv +N+wamYWeHiookXROwsRujkeu6i+/KBVO22151IjXFckFtJsblmal5wuigNdHcHvk1ES ehygQj7oBOfId+/zQ3r5PUpdPKGMpChZsjKUwBw6z45qdnoqjXP41opkeZ38TBX88wXH gKRQ== X-Gm-Message-State: AOAM532S+1YASscl0A9IEgPNbQbf8hvzOhrBWbX2ncKrytnx8elspajS IFhlmILkF744cCvXisa8BxbyD8fb X-Google-Smtp-Source: ABdhPJxVylIxohXvVIGNB8aRrPt/cZ+kn1N92pqcGAyTWuNu/NHUHwNBTf3xNRBIWMaippcQdaM1Lw== X-Received: by 2002:adf:f10a:: with SMTP id r10mr33749941wro.406.1594322431706; Thu, 09 Jul 2020 12:20:31 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id p25sm5485330wmg.39.2020.07.09.12.20.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 12:20:31 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 21:20:14 +0200 Message-Id: <20200709192022.9412-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> References: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 09/17] avformat/avc, movenccenc: Simplify annex B->mp4 transformation 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" by using the new ff_avc_parse_nalu function. Signed-off-by: Andreas Rheinhardt --- libavformat/avc.c | 11 ++--------- libavformat/movenccenc.c | 12 ++---------- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/libavformat/avc.c b/libavformat/avc.c index 39078aa5be..d089051034 100644 --- a/libavformat/avc.c +++ b/libavformat/avc.c @@ -120,20 +120,13 @@ int ff_avc_parse_nal_units(AVIOContext *pb, const uint8_t *buf_in, int size) { const uint8_t *p = buf_in; const uint8_t *end = p + size; - const uint8_t *nal_start, *nal_end; + const uint8_t *nal_start, *nal_end = NULL; size = 0; - nal_start = ff_avc_find_startcode(p, end); - for (;;) { - while (nal_start < end && !*(nal_start++)); - if (nal_start == end) - break; - - nal_end = ff_avc_find_startcode(nal_start, end); + while (nal_start = ff_avc_parse_nalu(&p, &nal_end, end)) { avio_wb32(pb, nal_end - nal_start); avio_write(pb, nal_start, nal_end - nal_start); size += 4 + nal_end - nal_start; - nal_start = nal_end; } return size; } diff --git a/libavformat/movenccenc.c b/libavformat/movenccenc.c index b91294f706..75244ab70b 100644 --- a/libavformat/movenccenc.c +++ b/libavformat/movenccenc.c @@ -194,7 +194,7 @@ int ff_mov_cenc_avc_parse_nal_units(MOVMuxCencContext* ctx, AVIOContext *pb, { const uint8_t *p = buf_in; const uint8_t *end = p + size; - const uint8_t *nal_start, *nal_end; + const uint8_t *nal_start, *nal_end = NULL; int ret; ret = mov_cenc_start_packet(ctx); @@ -203,14 +203,7 @@ int ff_mov_cenc_avc_parse_nal_units(MOVMuxCencContext* ctx, AVIOContext *pb, } size = 0; - nal_start = ff_avc_find_startcode(p, end); - for (;;) { - while (nal_start < end && !*(nal_start++)); - if (nal_start == end) - break; - - nal_end = ff_avc_find_startcode(nal_start, end); - + while (nal_start = ff_avc_parse_nalu(&p, &nal_end, end)) { avio_wb32(pb, nal_end - nal_start); avio_w8(pb, *nal_start); mov_cenc_write_encrypted(ctx, pb, nal_start + 1, nal_end - nal_start - 1); @@ -218,7 +211,6 @@ int ff_mov_cenc_avc_parse_nal_units(MOVMuxCencContext* ctx, AVIOContext *pb, auxiliary_info_add_subsample(ctx, 5, nal_end - nal_start - 1); size += 4 + nal_end - nal_start; - nal_start = nal_end; } ret = mov_cenc_end_packet(ctx); From patchwork Thu Jul 9 19:20:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20931 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 D93CF44B0C4 for ; Thu, 9 Jul 2020 22:20:43 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BE63B68B5B0; Thu, 9 Jul 2020 22:20:43 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4B79A68B485 for ; Thu, 9 Jul 2020 22:20:37 +0300 (EEST) Received: by mail-wm1-f66.google.com with SMTP id j18so3167474wmi.3 for ; Thu, 09 Jul 2020 12:20:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=G6N4bXwH4+xxXK5kWZrX9yMURWDP7v9T5kgeJH+7O7c=; b=ZeEmcjAp+ppaykdGeJgURxlQsHP1uZ88bpdxBBbK1IlpLSXtECgC9/Q7/iagAIsh/T KI5XjMOamMmgu2wPHczcURouLwHz86SHI/sKJj8Iu8uPtGqMQMhTMMmyWn+X1zAu2eSP VveDxxwGYCUn6e/dh25RlfFiThHNvcOLb+UhhlfSyPNMhB4h747TPVBGVqQzPegyNXv/ bYcSzl82aoz/nzfZnXqp0jUqmmULBQjjE69AhsBxdzaSiGi5cC4Nex/v83rs90i751Ld 2dVe9StRFv79nybyyGbJxy/3FZkxqEQqKfxCUGUWVpm0bNP7iGgUxPVnlSXW7EqhF5iu 3V4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=G6N4bXwH4+xxXK5kWZrX9yMURWDP7v9T5kgeJH+7O7c=; b=B4rEKjVOHpiPMSPkbEDkx36/GdfUNXekgJ4F27oC/WMQ2EyUn8r/oFGjUjCnhN8XUt cjWkHC9GM2jqDITU9QpZxcZYz4jPrQoH81RPA549avyHgseWrtWKiWsRF1GzkdHZp26h mKrcyUY3ukjd9OqF4XxA+7t0jS8ZgV6m7KHHbg3vQfG61axMhNrxF6V0A+9tX5LtNiu0 BVzbNzhPVkbYYHk9xMPpjjzNwBlxl4uY4BMqBdDUqJdQVIJkuRFmKI89+KoBGUvf8wZx DcoeIvJDN+J+TuRDNarxr0FTF+RWNVWYRiiZ6DlmrcFNqBln4T3vMumRYlIdK9Tam0yk vEnQ== X-Gm-Message-State: AOAM533FgfEZJ6hxvHGVPnv3rj+L7KTCUi5FXdYhFtM45K+5BrvG99oi f4xsUct4URzQTzsyETiM0YeWhahL X-Google-Smtp-Source: ABdhPJwh2RmH1LuzXXoXKGeiPj/uwC+QMbCWxcBBPdbQZiDo8VWGcoNrbxYRbzJxtdzza4X7CRhtHA== X-Received: by 2002:a7b:c259:: with SMTP id b25mr1411095wmj.107.1594322436489; Thu, 09 Jul 2020 12:20:36 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id p25sm5485330wmg.39.2020.07.09.12.20.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 12:20:35 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 21:20:15 +0200 Message-Id: <20200709192022.9412-2-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> References: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 10/17] avformat/sdp: Simplify creating H.264 media attributes 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" by using ff_avc_parse_nalu() which means that one no longer has to take care of finding both the start as well as the end of a NAL unit separately. Signed-off-by: Andreas Rheinhardt --- libavformat/sdp.c | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/libavformat/sdp.c b/libavformat/sdp.c index 023c88a583..bc0c39c8b5 100644 --- a/libavformat/sdp.c +++ b/libavformat/sdp.c @@ -156,11 +156,10 @@ static int sdp_get_address(char *dest_addr, int size, int *ttl, const char *url) static char *extradata2psets(AVFormatContext *s, AVCodecParameters *par) { char *psets, *p; - const uint8_t *r; static const char pset_string[] = "; sprop-parameter-sets="; static const char profile_string[] = "; profile-level-id="; - uint8_t *extradata = par->extradata; - int extradata_size = par->extradata_size; + const uint8_t *r = par->extradata, *end = r + par->extradata_size; + const uint8_t *nal, *nal_end = NULL; uint8_t *tmpbuf = NULL; const uint8_t *sps = NULL; @@ -170,10 +169,12 @@ static char *extradata2psets(AVFormatContext *s, AVCodecParameters *par) return NULL; } if (par->extradata[0] == 1) { - if (ff_avc_write_annexb_extradata(par->extradata, &extradata, + int extradata_size = par->extradata_size; + if (ff_avc_write_annexb_extradata(par->extradata, &tmpbuf, &extradata_size)) return NULL; - tmpbuf = extradata; + r = tmpbuf; + end = r + extradata_size; } psets = av_mallocz(MAX_PSET_SIZE); @@ -184,34 +185,29 @@ static char *extradata2psets(AVFormatContext *s, AVCodecParameters *par) } memcpy(psets, pset_string, strlen(pset_string)); p = psets + strlen(pset_string); - r = ff_avc_find_startcode(extradata, extradata + extradata_size); - while (r < extradata + extradata_size) { - const uint8_t *r1; - uint8_t nal_type; - - while (!*(r++)); - nal_type = *r & 0x1f; - r1 = ff_avc_find_startcode(r, extradata + extradata_size); + while (nal = ff_avc_parse_nalu(&r, &nal_end, end)) { + uint8_t nal_type = *nal & 0x1f; + ptrdiff_t size = nal_end - nal; + if (nal_type != 7 && nal_type != 8) { /* Only output SPS and PPS */ - r = r1; continue; } if (p != (psets + strlen(pset_string))) { *p = ','; p++; } - if (nal_type == H264_NAL_SPS && !sps && r1 - r >= 4) - sps = r; + if (nal_type == H264_NAL_SPS && !sps && size >= 4) + sps = nal; - if (!av_base64_encode(p, MAX_PSET_SIZE - (p - psets), r, r1 - r)) { - av_log(s, AV_LOG_ERROR, "Cannot Base64-encode %"PTRDIFF_SPECIFIER" %"PTRDIFF_SPECIFIER"!\n", MAX_PSET_SIZE - (p - psets), r1 - r); + if (!av_base64_encode(p, MAX_PSET_SIZE - (p - psets), nal, size)) { + av_log(s, AV_LOG_ERROR, "Cannot Base64-encode %"PTRDIFF_SPECIFIER" " + "%"PTRDIFF_SPECIFIER"!\n", MAX_PSET_SIZE - (p - psets), size); av_free(psets); av_free(tmpbuf); return NULL; } p += strlen(p); - r = r1; } if (sps && p - psets <= MAX_PSET_SIZE - strlen(profile_string) - 7) { memcpy(p, profile_string, strlen(profile_string)); From patchwork Thu Jul 9 19:20:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20932 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 D839244B0C4 for ; Thu, 9 Jul 2020 22:20:44 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BFE2F68B58A; Thu, 9 Jul 2020 22:20:44 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 740A868B53E for ; Thu, 9 Jul 2020 22:20:38 +0300 (EEST) Received: by mail-wr1-f66.google.com with SMTP id f2so3530558wrp.7 for ; Thu, 09 Jul 2020 12:20:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=4FmibtMG4qeH31Mjm+6n3Z2VmGsec+h854RHHqchcGc=; b=dRB5HAhOlpzIWOyrLR0gNQAV+VLFTY3yeMxboPEHLtiLdaDlyIZCuE00yeUcEUHlBN 1eVxr7cbEiJ4YVQSg1nXRlRiPcNbrJjsCiYNz3adkMeEp4NXX+Vc1+7xbqYInZBoV5Gm 7Gmcv3FUBpVGwcbv1vCZ5plZQ5iCjC+2mfO9u++FLYea3ggEg++6C4bZiN6USouUbt2A 4IEi3N+yAM4xS+c2Vz7KK6uVXG5crwNpzs+DlRcl3KvdxL2H8w8Z8Pvy2W4JQmMeIdpY crthJwGsV9Sk2GxmenIe+/10eiauBU49okWkoSucbu+ZzbJbUlKzobvX4mgo3xTr4hnG /Txw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=4FmibtMG4qeH31Mjm+6n3Z2VmGsec+h854RHHqchcGc=; b=X42vFNrdRcoFaVo+oLcBig9UyxHiLvjZEBaKHw0ozggVPGYZa4YV81LQIW0Rw0Ivy4 3FmVFZunTPek6dJ6/H7zRUXnUmz0C0laRimhOe220hw0cwW72mGGFcL0dMDMQHfe/Buy Xf8qCcHd5PIMIzEjW5HeajkbAyqDBXe1Xk53IYXwNRMxmIgvkY7XdGYTCgqbcvjLPwZ9 M9yJmhBnky3Zc6KSaQ1jItXp86kZAY8tjWYenHcV6+RFlLbte7M8b2fwr4Gj6VVd9C0q FbK+9XdE+oZ0DgSjSHOJEjT2tEKJ0jGBxubHO52kzQnCAB0abkY+mFL+PUbjgctuPKpt ZB0w== X-Gm-Message-State: AOAM530UkaAD8MtKaMbEKuZYzv/RPLXqI6waXoCRjK+pEvCQvSxRfHha hl4+u90yjQF6WFOCBBJkV0OTrbYj X-Google-Smtp-Source: ABdhPJydsZNSuFE3hQeLBpSvTTKyJsAjBHH+w4Odj6/ak4irwI8B7DyXvtp/QUiklGobE3sV8cHk3g== X-Received: by 2002:a5d:69c5:: with SMTP id s5mr64511215wrw.197.1594322437439; Thu, 09 Jul 2020 12:20:37 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id p25sm5485330wmg.39.2020.07.09.12.20.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 12:20:36 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 21:20:16 +0200 Message-Id: <20200709192022.9412-3-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> References: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 11/17] avformat/avc, hevc: Avoid intermediate buffers when parsing annex B 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" When creating H.264 or HEVC extradata from annex B extradata or when transforming annex B into HEVC while also filtering parameter sets away, the whole input has first been transformed into mp4-style H.264/HEVC in order to simplify parsing at the next step. By using ff_avc_parse_nalu, one can avoid these intermediate steps (which involved (re)allocations). Signed-off-by: Andreas Rheinhardt --- libavformat/avc.c | 28 ++++++++----------------- libavformat/hevc.c | 52 +++++++++++++--------------------------------- 2 files changed, 23 insertions(+), 57 deletions(-) diff --git a/libavformat/avc.c b/libavformat/avc.c index d089051034..98462940ad 100644 --- a/libavformat/avc.c +++ b/libavformat/avc.c @@ -147,7 +147,7 @@ int ff_avc_parse_nal_units_buf(const uint8_t *buf_in, uint8_t **buf, int *size) int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) { AVIOContext *sps_pb = NULL, *pps_pb = NULL, *sps_ext_pb = NULL; - uint8_t *buf, *end, *start; + const uint8_t *nal, *nal_end, *end; uint8_t *sps, *pps, *sps_ext; uint32_t sps_size = 0, pps_size = 0, sps_ext_size = 0; int ret, nb_sps = 0, nb_pps = 0, nb_sps_ext = 0; @@ -162,12 +162,6 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) return 0; } - ret = ff_avc_parse_nal_units_buf(data, &buf, &len); - if (ret < 0) - return ret; - start = buf; - end = buf + len; - ret = avio_open_dyn_buf(&sps_pb); if (ret < 0) goto fail; @@ -179,12 +173,11 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) goto fail; /* look for sps and pps */ - while (end - buf > 4) { - uint32_t size; - uint8_t nal_type; - size = FFMIN(AV_RB32(buf), end - buf - 4); - buf += 4; - nal_type = buf[0] & 0x1f; + nal_end = NULL; + end = data + len; + while (nal = ff_avc_parse_nalu(&data, &nal_end, end)) { + uint32_t size = nal_end - nal; + uint8_t nal_type = nal[0] & 0x1f; if (nal_type == 7) { /* SPS */ nb_sps++; @@ -193,7 +186,7 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) goto fail; } avio_wb16(sps_pb, size); - avio_write(sps_pb, buf, size); + avio_write(sps_pb, nal, size); } else if (nal_type == 8) { /* PPS */ nb_pps++; if (size > UINT16_MAX || nb_pps >= H264_MAX_PPS_COUNT) { @@ -201,7 +194,7 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) goto fail; } avio_wb16(pps_pb, size); - avio_write(pps_pb, buf, size); + avio_write(pps_pb, nal, size); } else if (nal_type == 13) { /* SPS_EXT */ nb_sps_ext++; if (size > UINT16_MAX || nb_sps_ext >= 256) { @@ -209,10 +202,8 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) goto fail; } avio_wb16(sps_ext_pb, size); - avio_write(sps_ext_pb, buf, size); + avio_write(sps_ext_pb, nal, size); } - - buf += size; } sps_size = avio_get_dyn_buf(sps_pb, &sps); pps_size = avio_get_dyn_buf(pps_pb, &pps); @@ -252,7 +243,6 @@ fail: ffio_free_dyn_buf(&sps_pb); ffio_free_dyn_buf(&pps_pb); ffio_free_dyn_buf(&sps_ext_pb); - av_free(start); return ret; } diff --git a/libavformat/hevc.c b/libavformat/hevc.c index 94eb3a9cb1..095988b7df 100644 --- a/libavformat/hevc.c +++ b/libavformat/hevc.c @@ -35,7 +35,7 @@ typedef struct HVCCNALUnitArray { uint8_t NAL_unit_type; uint16_t numNalus; uint16_t *nalUnitLength; - uint8_t **nalUnit; + const uint8_t **nalUnit; } HVCCNALUnitArray; typedef struct HEVCDecoderConfigurationRecord { @@ -657,7 +657,7 @@ static void nal_unit_parse_header(GetBitContext *gb, uint8_t *nal_type) skip_bits(gb, 9); } -static int hvcc_array_add_nal_unit(uint8_t *nal_buf, uint32_t nal_size, +static int hvcc_array_add_nal_unit(const uint8_t *nal_buf, uint32_t nal_size, uint8_t nal_type, int ps_array_completeness, HEVCDecoderConfigurationRecord *hvcc) { @@ -710,7 +710,7 @@ static int hvcc_array_add_nal_unit(uint8_t *nal_buf, uint32_t nal_size, return 0; } -static int hvcc_add_nal_unit(uint8_t *nal_buf, uint32_t nal_size, +static int hvcc_add_nal_unit(const uint8_t *nal_buf, uint32_t nal_size, int ps_array_completeness, HEVCDecoderConfigurationRecord *hvcc) { @@ -1000,26 +1000,16 @@ int ff_hevc_annexb2mp4(AVIOContext *pb, const uint8_t *buf_in, int size, int filter_ps, int *ps_count) { int num_ps = 0, ret = 0; - uint8_t *buf, *end, *start = NULL; + const uint8_t *nal, *nal_end = NULL, *end = buf_in + size; if (!filter_ps) { ret = ff_avc_parse_nal_units(pb, buf_in, size); goto end; } - ret = ff_avc_parse_nal_units_buf(buf_in, &start, &size); - if (ret < 0) - goto end; - - ret = 0; - buf = start; - end = start + size; - - while (end - buf > 4) { - uint32_t len = FFMIN(AV_RB32(buf), end - buf - 4); - uint8_t type = (buf[4] >> 1) & 0x3f; - - buf += 4; + while (nal = ff_avc_parse_nalu(&buf_in, &nal_end, end)) { + uint32_t len = nal_end - nal; + uint8_t type = (nal[0] >> 1) & 0x3f; switch (type) { case HEVC_NAL_VPS: @@ -1030,15 +1020,12 @@ int ff_hevc_annexb2mp4(AVIOContext *pb, const uint8_t *buf_in, default: ret += 4 + len; avio_wb32(pb, len); - avio_write(pb, buf, len); + avio_write(pb, nal, len); break; } - - buf += len; } end: - av_free(start); if (ps_count) *ps_count = num_ps; return ret; @@ -1069,7 +1056,7 @@ int ff_isom_write_hvcc(AVIOContext *pb, const uint8_t *data, int size, int ps_array_completeness) { HEVCDecoderConfigurationRecord hvcc; - uint8_t *buf, *end, *start; + const uint8_t *nal, *nal_end = NULL, *end; int ret; if (size < 6) { @@ -1084,20 +1071,12 @@ int ff_isom_write_hvcc(AVIOContext *pb, const uint8_t *data, return AVERROR_INVALIDDATA; } - ret = ff_avc_parse_nal_units_buf(data, &start, &size); - if (ret < 0) - return ret; - hvcc_init(&hvcc); - buf = start; - end = start + size; - - while (end - buf > 4) { - uint32_t len = FFMIN(AV_RB32(buf), end - buf - 4); - uint8_t type = (buf[4] >> 1) & 0x3f; - - buf += 4; + end = data + size; + while (nal = ff_avc_parse_nalu(&data, &nal_end, end)) { + uint32_t len = nal_end - nal; + uint8_t type = (nal[0] >> 1) & 0x3f; switch (type) { case HEVC_NAL_VPS: @@ -1105,21 +1084,18 @@ int ff_isom_write_hvcc(AVIOContext *pb, const uint8_t *data, case HEVC_NAL_PPS: case HEVC_NAL_SEI_PREFIX: case HEVC_NAL_SEI_SUFFIX: - ret = hvcc_add_nal_unit(buf, len, ps_array_completeness, &hvcc); + ret = hvcc_add_nal_unit(nal, len, ps_array_completeness, &hvcc); if (ret < 0) goto end; break; default: break; } - - buf += len; } ret = hvcc_write(pb, &hvcc); end: hvcc_close(&hvcc); - av_free(start); return ret; } From patchwork Thu Jul 9 19:20:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20933 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 E6A0544B0C4 for ; Thu, 9 Jul 2020 22:20:46 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C970568B5C3; Thu, 9 Jul 2020 22:20:46 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5DC3F68B56F for ; Thu, 9 Jul 2020 22:20:39 +0300 (EEST) Received: by mail-wm1-f67.google.com with SMTP id j18so3167595wmi.3 for ; Thu, 09 Jul 2020 12:20:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=C2JaW9aGVXYRTc/+3DxAGnxH0IeA2UecFx46rGFGknk=; b=I0L0o8SDUIwp132J2XgzUIypN/wsShLiMsRPpofvQDBWKrdkZG1NpZAH0rYApZNroi uHcm+6g58MiGRho5rUeY96fFu1p5prWwRM4ovpef/PaLK01pAvkjsXXqMFNx8+MwMbXi jtHpJmkeCXBOIJ8bBXuuEPfiElRhr6ILlXHIL9Acg2ahnQ0Gtz4m9yHIX+2v14bC2hVq wFtfh9Tilw7W6sr3tSn0Lfjr/s0ZS7EIivQRMQ43xBDdwRuD9HEPDhpGO4dLV7z5FzOB V+xxqXPi+ds3AVw4Kc9n2MS4iK9p8uL6GVsI3ltJG0e9aVioEgnF/vt+5nBJhMtWtYvA 5ziQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=C2JaW9aGVXYRTc/+3DxAGnxH0IeA2UecFx46rGFGknk=; b=h6mmy/lrIwinq4PuPI4QBeo7a1OWTIHujHCYzzJfXFFFBZVn6bdKGy7bHImIV2XSHy 9I9pk61MmzrkkQhBB4WHERF8zAnuSIS+Gv6jyi/CLndUhlINz8vr2xxoSAfAa9o17wOl C2A2dOOf8zzBfUyNkNqsmaEaXrrlPQDsqjcJlkAXtiRY8+V++KP1llTSiycZR07qMghy qcVg73K24Oh8ehcO4QGwykci9ENyBtN8z30dmqyxe/JvTYLUH4C+zEnQ3TadhmE2SWnI FyO7ClzOFyHu8s0CSNOVZEanuqxV4QHrjRzAwDqP9CcODNw/IgVgO07UMz9PHQkTvuTJ ujRw== X-Gm-Message-State: AOAM533jsu0dCkvSQjZeg10e9F/dfv7gvH0ZM5F1vszx3a3w4t81WDk9 XwsMhvLfhAmpzUP0VMIExgDhHRrD X-Google-Smtp-Source: ABdhPJwiUNbxXng9XaonRQyBkRcgHeKAd5B5th2hlk7F1jvq5rOFvZ8cggeqy9JWCLi0p2UWOpv6Cw== X-Received: by 2002:a1c:449:: with SMTP id 70mr1322574wme.149.1594322438605; Thu, 09 Jul 2020 12:20:38 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id p25sm5485330wmg.39.2020.07.09.12.20.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 12:20:37 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 21:20:17 +0200 Message-Id: <20200709192022.9412-4-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> References: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 12/17] avformat/avc: Discard empty NAL units during annex B->mp4 conversion 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" When an empty annex B NAL unit (i.e. 0x000001 immediately followed by a three or four-byte start code) is encountered during annex B->mp4 conversion, a NAL unit of size zero is created; this is invalid. Furthermore, several functions simply presumed all NAL units to be nonempty and treated the first byte as the NAL unit type. Ticket #7200 contains a sample with such NAL units. This commit skips empty NAL units during annex B->mp4 conversion, ensuring that the callers don't need to check for themselves. Signed-off-by: Andreas Rheinhardt --- libavformat/avc.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libavformat/avc.c b/libavformat/avc.c index 98462940ad..17fcd1e73f 100644 --- a/libavformat/avc.c +++ b/libavformat/avc.c @@ -104,6 +104,7 @@ const uint8_t *ff_avc_parse_nalu(const uint8_t **start, const uint8_t **nal_end, p += 3; } +search_again: next = avc_find_startcode_internal(p, end); if (next) { @@ -112,6 +113,12 @@ const uint8_t *ff_avc_parse_nalu(const uint8_t **start, const uint8_t **nal_end, } else { *nal_end = end; } + if (*nal_end == p) { + if (!next) + return NULL; + p = next; + goto search_again; + } *start = next; return p; } From patchwork Thu Jul 9 19:20:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20934 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 0B3F844B0C4 for ; Thu, 9 Jul 2020 22:20:48 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EC26268B5F4; Thu, 9 Jul 2020 22:20:47 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 91F6168B5D7 for ; Thu, 9 Jul 2020 22:20:40 +0300 (EEST) Received: by mail-wr1-f67.google.com with SMTP id f7so3577701wrw.1 for ; Thu, 09 Jul 2020 12:20:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=OndvtoTXzV3yb71OAlr5q2tht6lkO7X0KXR2RR6ScFM=; b=jKkpcWGvXAZZR06d+yGMkKG9wdsP82MU6kz1zAvlJjD0rDaP6UUdJCq5DGm/UaOJCq BOckQ3xT22Aqw+5PsbDpxcfJ8LZ7z5Vm/NgP2wFBY2UjPxmYWX7ZjP7Xms2teWRblUtc +rCbjjz0C2GqOaMwUYNG+VZkucgbF4dSsB943DEsjdnk0hv0Qg4VzXEllDTOIc7J+3OB dGSqFhqMJ0R0n3Z0C8m22LRph3DlZUiDPw8vkV38Wij6gHfGOk5RkqAkfm4YbRZXSG5/ 2EoEeNokP11ZNJxjcSbUNu6t70gu93gEJdGAWEysg2zrEuSM+kQE1fNYjtuC5P7/2T+y mKcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=OndvtoTXzV3yb71OAlr5q2tht6lkO7X0KXR2RR6ScFM=; b=qzHaR6slhJ0czpaNnCmO+QnNvdxK4G5cCICko3FuWztyIhQvPDthxVR+Ld3S9bL6Sh Qf+qWHD8NLA2a+2RoScN5vNjamkV6lBXPcmOrbefeCQNc7O2rDQMujY9KkbvxJqF6Fwn BXqNzt3N7BmnFiYJwqImRwI2eGJK9QSDJBWNgROaV5X9630gbPSOBGHLltUdWavz09zj V+QolukcALcJQxwqRaezROX8W+8oADUy6ScVvaZz7v94OXlsh1PYnt5725/K6KTDbHqB 7PSi0holItQNornfSEpjIDHNqnxvLT3zBswpHcB8VrVkI0u1rkROujrzqFKcDd+xFwD+ mosA== X-Gm-Message-State: AOAM530OpQFBHxQMgMT/ivS8lM1VdrKF4d0kdBt5RsqweIHb6/u6Kwyl E/QyH8WsYZ63OOCJPBWoU0a9K49M X-Google-Smtp-Source: ABdhPJx8Mp6iO8I6HKzhLl2Nns0lhdJ3AtorEyfTRNar31OZan57RjJeq/BHWHw5lKtlhvD9Q97TXA== X-Received: by 2002:a5d:4710:: with SMTP id y16mr67030972wrq.189.1594322439578; Thu, 09 Jul 2020 12:20:39 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id p25sm5485330wmg.39.2020.07.09.12.20.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 12:20:38 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 21:20:18 +0200 Message-Id: <20200709192022.9412-5-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> References: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 13/17] avformat/avc: Remove trailing zero bytes during annex B->mp4 conversion 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" The annex B format of H.264 and HEVC allows there to be trailing zero bytes in byte stream NAL units; this means that there can be trailing zero bytes after the actual NAL units (besides start codes prepended to them). Samples in mp4 contain a sequence of length-prefixed NAL units and not byte stream NAL units; as such, the trailing zero bytes are actually not allowed. Therefore this commit strips them away. Two fate-tests needed to be updated: hevc-bsf-mp4toannexb because the HEVC parser does not properly check for four byte startcodes and instead assigns the leading zero to the end of the preceding packet (it is now stripped away) and lavf-fate-h264.mp4 because of an oddity of ff_h2645_extract_rbsp: It also assigns the first byte of a four-byte startcode to the preceding unit and this meant that the extradata (from the extract extradata bsf) has a trailing zero at the end which is now discarded. Signed-off-by: Andreas Rheinhardt --- libavformat/avc.c | 11 +++++++---- tests/fate/hevc.mak | 2 +- tests/ref/lavf-fate/h264.mp4 | 4 ++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/libavformat/avc.c b/libavformat/avc.c index 17fcd1e73f..9f375ca992 100644 --- a/libavformat/avc.c +++ b/libavformat/avc.c @@ -92,7 +92,7 @@ const uint8_t *ff_avc_find_startcode(const uint8_t *p, const uint8_t *end){ const uint8_t *ff_avc_parse_nalu(const uint8_t **start, const uint8_t **nal_end, const uint8_t *end) { - const uint8_t *p = *start, *next; + const uint8_t *p = *start, *next, *end_temp; if (!p) return NULL; @@ -108,18 +108,21 @@ search_again: next = avc_find_startcode_internal(p, end); if (next) { - *nal_end = next > p && !next[-1] ? next - 1 : next; + end_temp = next; next += 3; } else { - *nal_end = end; + end_temp = end; } - if (*nal_end == p) { + while (end_temp > p && !end_temp[-1]) + end_temp--; + if (end_temp == p) { if (!next) return NULL; p = next; goto search_again; } *start = next; + *nal_end = end_temp; return p; } diff --git a/tests/fate/hevc.mak b/tests/fate/hevc.mak index 65c5a262e9..bd94cc6cff 100644 --- a/tests/fate/hevc.mak +++ b/tests/fate/hevc.mak @@ -251,7 +251,7 @@ FATE_HEVC-$(call ALLYES, HEVC_DEMUXER MOV_DEMUXER HEVC_MP4TOANNEXB_BSF MOV_MUXER fate-hevc-bsf-mp4toannexb: tests/data/hevc-mp4.mov fate-hevc-bsf-mp4toannexb: CMD = md5 -i $(TARGET_PATH)/tests/data/hevc-mp4.mov -c:v copy -fflags +bitexact -f hevc fate-hevc-bsf-mp4toannexb: CMP = oneline -fate-hevc-bsf-mp4toannexb: REF = 1873662a3af1848c37e4eb25722c8df9 +fate-hevc-bsf-mp4toannexb: REF = 73019329ed7f81c24f9af67c34c640c0 fate-hevc-skiploopfilter: CMD = framemd5 -skip_loop_filter nokey -i $(TARGET_SAMPLES)/hevc-conformance/SAO_D_Samsung_5.bit -sws_flags bitexact FATE_HEVC += fate-hevc-skiploopfilter diff --git a/tests/ref/lavf-fate/h264.mp4 b/tests/ref/lavf-fate/h264.mp4 index bb52f45758..7a84b7a983 100644 --- a/tests/ref/lavf-fate/h264.mp4 +++ b/tests/ref/lavf-fate/h264.mp4 @@ -1,3 +1,3 @@ -6d158b25efe7391c803f6f61c7a80aa0 *tests/data/lavf-fate/lavf.h264.mp4 -547908 tests/data/lavf-fate/lavf.h264.mp4 +aaf8b3d9340ab1fdebced54ada2447d5 *tests/data/lavf-fate/lavf.h264.mp4 +547907 tests/data/lavf-fate/lavf.h264.mp4 tests/data/lavf-fate/lavf.h264.mp4 CRC=0x9da2c999 From patchwork Thu Jul 9 19:20:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20935 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 DFEE844B0C4 for ; Thu, 9 Jul 2020 22:20:50 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C63A168B600; Thu, 9 Jul 2020 22:20:50 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F3C2F68B5CC for ; Thu, 9 Jul 2020 22:20:41 +0300 (EEST) Received: by mail-wm1-f67.google.com with SMTP id a6so6889313wmm.0 for ; Thu, 09 Jul 2020 12:20:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=/zdnZ5O6Wnevk+uV5xxUeYQNohe54Um0PsfhThkXdOA=; b=teMNlMXo5VTa3rSfR1RCSbb+ziqMQdAff3pk1O5/nyJWOQRi4apUpo1YLSNAJooETE 0TYhkZwHfEF4/bU5IDsyQKKhLWXLKsQwZKrnyxSUY9B7yfZZknfjilCtO4aDNel7sfbT eCUdLRs4ZW6v+mzNVr0FDG20TYy0ivC1WJMlq54Y8DrrmaCeWgFYHq4gpOGgqGuEaet7 mJwEJf+ZLrugcn6t5r2CNGoKTloq2uV1VRk1is183Rc6l0zqIJneS332iHcbEXWCQXxO Ndkw6Pe9cT5fQmrgdpNcRDmlT+PEodVLr4wvSGwJJDBQtmQoAVjQAMoqthi+ZSP0G3Kk p/hQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=/zdnZ5O6Wnevk+uV5xxUeYQNohe54Um0PsfhThkXdOA=; b=p0QfsoDyLDbymk+TxWS370gPxyM+cCsLbjyQ3BISpbZfoNPzvyIGVZZvXRAxawmrrv tMRs51zoW2X11hTRpnOQzELxZ8ANkiPoKMfhJ9Uz1GuUFkF8wcKpKSv/KWpjDtN12x3j Nn91IS/a/Au3b7kdnQEV5l7is+YfNz+eoBl+8Gfs+i/wFaqBn35M5YFp1BtDWwdvA3Ie hsfabkfHM/eB/RsPdP9iEiZ/bFw2SZ/k0owTRYNuUAjif/VgvpCkgv1yLm6/x/mT/8FJ fAI3MjsaNxVsnigND0+K6M9snyMKWTA+81UVgQUn6hC+tkuMSCkdzqM4g/QZAuxpP8T8 b2rQ== X-Gm-Message-State: AOAM5336kV8Yma4Z3F2QhGnpIySU3X7lYxO+JnnEyw0hKAI0XwqqiigO yun9BuDv1xQm9gn72/wqHvKlWULP X-Google-Smtp-Source: ABdhPJwXcLdJpwfM4u9Yd9b4ByzMvCH7GAlOwaerBh5CgiF5RCU/aP/AJXr9HsLOr5qyEGxArqB7ag== X-Received: by 2002:a1c:ba0b:: with SMTP id k11mr1421521wmf.140.1594322440711; Thu, 09 Jul 2020 12:20:40 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id p25sm5485330wmg.39.2020.07.09.12.20.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 12:20:39 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 21:20:19 +0200 Message-Id: <20200709192022.9412-6-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> References: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 14/17] avformat/avc: Be more strict when parsing SPS 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This commit adds some basic checks for invalid values when parsing an SPS; e.g. the earlier code did not check whether the values read from the bitstream get truncated when returned via the H264SPS struct (whose members are uint8_t), so that a caller could not even check for this error itself. Signed-off-by: Andreas Rheinhardt --- libavformat/avc.c | 91 ++++++++++++++++++++++++++++---------------- libavformat/avc.h | 4 +- libavformat/mxfenc.c | 2 +- 3 files changed, 61 insertions(+), 36 deletions(-) diff --git a/libavformat/avc.c b/libavformat/avc.c index 9f375ca992..6246410ad0 100644 --- a/libavformat/avc.c +++ b/libavformat/avc.c @@ -27,19 +27,32 @@ #include "avc.h" #include "avio_internal.h" -static inline unsigned get_ue_golomb(GetBitContext *gb) +static int get_ue_golomb(GetBitContext *gb, unsigned *val) { int i; for (i = 1; i <= 32; i++) { if (get_bits_left(gb) < i) - return 0; + return AVERROR_INVALIDDATA; if (show_bits1(gb)) break; skip_bits1(gb); } if (i > 32) - return 0; - return get_bits_long(gb, i) - 1; + return AVERROR_INVALIDDATA; + *val = get_bits_long(gb, i) - 1; + return 0; +} + +static int get_se_golomb(GetBitContext *gb, int *val) +{ + unsigned v; + int sign, ret = get_ue_golomb(gb, &v); + + if (ret < 0) + return ret; + sign = -(v & 1); + *val = ((v >> 1) ^ sign) - sign; + return 0; } static const uint8_t *avc_find_startcode_internal(const uint8_t *p, const uint8_t *end) @@ -242,8 +255,8 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) goto fail; avio_w8(pb, 0xfc | seq.chroma_format_idc); /* 6 bits reserved (111111) + chroma_format_idc */ - avio_w8(pb, 0xf8 | (seq.bit_depth_luma - 8)); /* 5 bits reserved (11111) + bit_depth_luma_minus8 */ - avio_w8(pb, 0xf8 | (seq.bit_depth_chroma - 8)); /* 5 bits reserved (11111) + bit_depth_chroma_minus8 */ + avio_w8(pb, 0xf8 | seq.bit_depth_luma_minus8); /* 5 bits reserved (11111) + bit_depth_luma_minus8 */ + avio_w8(pb, 0xf8 | seq.bit_depth_chroma_minus8); /* 5 bits reserved (11111) + bit_depth_chroma_minus8 */ avio_w8(pb, nb_sps_ext); /* number of sps ext */ if (nb_sps_ext) avio_write(pb, sps_ext, sps_ext_size); @@ -357,12 +370,26 @@ static const AVRational avc_sample_aspect_ratio[17] = { { 2, 1 }, }; -static inline int get_se_golomb(GetBitContext *gb) { - unsigned v = get_ue_golomb(gb) + 1; - int sign = -(v & 1); - return ((v >> 1) ^ sign) - sign; -} - +#define GET_UE_GOLOMB(dst, max) do { \ + unsigned val; \ + ret = get_ue_golomb(&gb, &val); \ + if (ret < 0) \ + goto end; \ + if (val > (max)) { \ + ret = AVERROR_INVALIDDATA; \ + goto end; \ + } \ + (dst) = val; \ + } while (0) +#define GET_SE_GOLOMB(dst) do { \ + int val; \ + ret = get_se_golomb(&gb, &val); \ + if (ret < 0) \ + goto end; \ + (dst) = val; \ + } while (0) +#define SKIP_UE_GOLOMB GET_UE_GOLOMB(val, UINT_MAX) +#define SKIP_SE_GOLOMB GET_SE_GOLOMB(val) int ff_avc_decode_sps(H264SPS *sps, const uint8_t *buf, int buf_size) { int i, j, ret, rbsp_size, aspect_ratio_idc, pic_order_cnt_type; @@ -391,19 +418,19 @@ int ff_avc_decode_sps(H264SPS *sps, const uint8_t *buf, int buf_size) sps->constraint_set_flags |= get_bits1(&gb) << 5; // constraint_set5_flag skip_bits(&gb, 2); // reserved_zero_2bits sps->level_idc = get_bits(&gb, 8); - sps->id = get_ue_golomb(&gb); + GET_UE_GOLOMB(sps->id, H264_MAX_SPS_COUNT - 1); if (sps->profile_idc == 100 || sps->profile_idc == 110 || sps->profile_idc == 122 || sps->profile_idc == 244 || sps->profile_idc == 44 || sps->profile_idc == 83 || sps->profile_idc == 86 || sps->profile_idc == 118 || sps->profile_idc == 128 || sps->profile_idc == 138 || sps->profile_idc == 139 || sps->profile_idc == 134) { - sps->chroma_format_idc = get_ue_golomb(&gb); // chroma_format_idc + GET_UE_GOLOMB(sps->chroma_format_idc, 3); if (sps->chroma_format_idc == 3) { skip_bits1(&gb); // separate_colour_plane_flag } - sps->bit_depth_luma = get_ue_golomb(&gb) + 8; - sps->bit_depth_chroma = get_ue_golomb(&gb) + 8; + GET_UE_GOLOMB(sps->bit_depth_luma_minus8, 6); + GET_UE_GOLOMB(sps->bit_depth_chroma_minus8, 6); skip_bits1(&gb); // qpprime_y_zero_transform_bypass_flag if (get_bits1(&gb)) { // seq_scaling_matrix_present_flag for (i = 0; i < ((sps->chroma_format_idc != 3) ? 8 : 12); i++) { @@ -414,7 +441,7 @@ int ff_avc_decode_sps(H264SPS *sps, const uint8_t *buf, int buf_size) sizeOfScalingList = i < 6 ? 16 : 64; for (j = 0; j < sizeOfScalingList; j++) { if (nextScale != 0) { - delta_scale = get_se_golomb(&gb); + GET_SE_GOLOMB(delta_scale); nextScale = (lastScale + delta_scale) & 0xff; } lastScale = nextScale == 0 ? lastScale : nextScale; @@ -423,28 +450,26 @@ int ff_avc_decode_sps(H264SPS *sps, const uint8_t *buf, int buf_size) } } else { sps->chroma_format_idc = 1; - sps->bit_depth_luma = 8; - sps->bit_depth_chroma = 8; } - get_ue_golomb(&gb); // log2_max_frame_num_minus4 - pic_order_cnt_type = get_ue_golomb(&gb); + SKIP_UE_GOLOMB; // log2_max_frame_num_minus4 + GET_UE_GOLOMB(pic_order_cnt_type, 2); if (pic_order_cnt_type == 0) { - get_ue_golomb(&gb); // log2_max_pic_order_cnt_lsb_minus4 + SKIP_UE_GOLOMB; // log2_max_pic_order_cnt_lsb_minus4 } else if (pic_order_cnt_type == 1) { skip_bits1(&gb); // delta_pic_order_always_zero - get_se_golomb(&gb); // offset_for_non_ref_pic - get_se_golomb(&gb); // offset_for_top_to_bottom_field - num_ref_frames_in_pic_order_cnt_cycle = get_ue_golomb(&gb); + SKIP_SE_GOLOMB; // offset_for_non_ref_pic + SKIP_SE_GOLOMB; // offset_for_top_to_bottom_field + GET_UE_GOLOMB(num_ref_frames_in_pic_order_cnt_cycle, 255); for (i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) - get_se_golomb(&gb); // offset_for_ref_frame + SKIP_SE_GOLOMB; // offset_for_ref_frame } - get_ue_golomb(&gb); // max_num_ref_frames + SKIP_UE_GOLOMB; // max_num_ref_frames skip_bits1(&gb); // gaps_in_frame_num_value_allowed_flag - get_ue_golomb(&gb); // pic_width_in_mbs_minus1 - get_ue_golomb(&gb); // pic_height_in_map_units_minus1 + SKIP_UE_GOLOMB; // pic_width_in_mbs_minus1 + SKIP_UE_GOLOMB; // pic_height_in_map_units_minus1 sps->frame_mbs_only_flag = get_bits1(&gb); if (!sps->frame_mbs_only_flag) @@ -453,10 +478,10 @@ int ff_avc_decode_sps(H264SPS *sps, const uint8_t *buf, int buf_size) skip_bits1(&gb); // direct_8x8_inference_flag if (get_bits1(&gb)) { // frame_cropping_flag - get_ue_golomb(&gb); // frame_crop_left_offset - get_ue_golomb(&gb); // frame_crop_right_offset - get_ue_golomb(&gb); // frame_crop_top_offset - get_ue_golomb(&gb); // frame_crop_bottom_offset + SKIP_UE_GOLOMB; // frame_crop_left_offset + SKIP_UE_GOLOMB; // frame_crop_right_offset + SKIP_UE_GOLOMB; // frame_crop_top_offset + SKIP_UE_GOLOMB; // frame_crop_bottom_offset } if (get_bits1(&gb)) { // vui_parameters_present_flag diff --git a/libavformat/avc.h b/libavformat/avc.h index b3df0a7b6b..db1d3334dd 100644 --- a/libavformat/avc.h +++ b/libavformat/avc.h @@ -44,8 +44,8 @@ typedef struct { uint8_t level_idc; uint8_t constraint_set_flags; uint8_t chroma_format_idc; - uint8_t bit_depth_luma; - uint8_t bit_depth_chroma; + uint8_t bit_depth_luma_minus8; + uint8_t bit_depth_chroma_minus8; uint8_t frame_mbs_only_flag; AVRational sar; } H264SPS; diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c index 5a3a609bf6..5eeeb9ab84 100644 --- a/libavformat/mxfenc.c +++ b/libavformat/mxfenc.c @@ -2206,7 +2206,7 @@ static int mxf_parse_h264_frame(AVFormatContext *s, AVStream *st, sc->aspect_ratio.num, sc->aspect_ratio.den, 1024*1024); intra_only = (sps->constraint_set_flags >> 3) & 1; sc->interlaced = !sps->frame_mbs_only_flag; - sc->component_depth = sps->bit_depth_luma; + sc->component_depth = sps->bit_depth_luma_minus8 + 8; buf = nal_end; break; From patchwork Thu Jul 9 19:20:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20936 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 9FEB844B0C4 for ; Thu, 9 Jul 2020 22:20:51 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8AB6A68B603; Thu, 9 Jul 2020 22:20:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 212C768B5F8 for ; Thu, 9 Jul 2020 22:20:43 +0300 (EEST) Received: by mail-wr1-f65.google.com with SMTP id a6so3556047wrm.4 for ; Thu, 09 Jul 2020 12:20:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=/WUsuvVM+e84vGgOMU6uI/x1UosYEyfgHmTO9H1aOLI=; b=nDO3fzVrkbrzKQrMmK+rif3YvzeqbJeTmr3F18UhgHTNSW36JbQxN5gxqfZCzqEqqA e1jE5J8uM/+pfH1ydej+Lyb7ZGvNpUcF07Or9HpWE2DiyIcpT+BcYIdmJ+9TTiJfMKvS S9WjKD12dgIDzQQ+qX4AWCSKWnTEY5Dq+CoTzT1FP8ij26AhCtK2HR0Fd9cl4Rj/Ckch Lj+HFtUUeM7XILf2/DtkI1DjJbk1KmIMjSEKh/xC916xyCvjF28nF/Ciwy9sPq9Cbv9S MhBPc3SMqhkdaSqdGL2JFDOncoeIcEYNdYlP85xvxlkS8lpz7vlDwhdikhi9lJYl9sKr kWJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=/WUsuvVM+e84vGgOMU6uI/x1UosYEyfgHmTO9H1aOLI=; b=BN08JxRqOQ0MvSx604BolO9W1X+pQTrfwrw3//N2TQ+Icp7Q+ZP5vSAJE7jUd9UxgH UscwCdG7qAmZnegzb9GiA+pL1Rsk7h8C8PJ2gOPS6+mweoJmvXHZr+nspCXn97N1C15/ kH9NrBPhcZjlwwiBtbgYJ2rrHBoa0tckxLNHI8/O91LaUwE4n6jaRm0IIgTXEn/c8pWz kO1w9v3K5yrMl2lI7NNq0SulLEW9JqxTXzlABi7tOFrKAM/cYMJtWJaSY15oZNrZTstC ixyQYJd09lxrJL/U0GMG1WtAD9a7nDBkXUTbn7IHxSlHSAg+XRxV0f+z4dayu7u95mPz hQQg== X-Gm-Message-State: AOAM533LBn0/pQrDEdMQ/J98Yl/Qdr3x5hxuUmEDroRjB2+LfT/fsuwZ 6oxX7hrXCgjgC8LLIE1oCeYJz327 X-Google-Smtp-Source: ABdhPJyortoVyzKw20V122LSDgPUCbKNEfOZHkAQojZpkbHLGXmY9Lw9UVqm039ZGPqlabsZHcuAxw== X-Received: by 2002:a5d:5388:: with SMTP id d8mr63760860wrv.35.1594322442141; Thu, 09 Jul 2020 12:20:42 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id p25sm5485330wmg.39.2020.07.09.12.20.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 12:20:41 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 21:20:20 +0200 Message-Id: <20200709192022.9412-7-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> References: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 15/17] avformat/avc: Use the constraint_setx_flags as is 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" and also keep the reserved_zero_2bits in the corresponding H264SPS member. This simplifies parsing and will prove beneficial in ff_isom_write_avcc. Signed-off-by: Andreas Rheinhardt --- libavformat/avc.c | 8 +------- libavformat/avc.h | 2 +- libavformat/mxfenc.c | 2 +- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/libavformat/avc.c b/libavformat/avc.c index 6246410ad0..c106fe5792 100644 --- a/libavformat/avc.c +++ b/libavformat/avc.c @@ -410,13 +410,7 @@ int ff_avc_decode_sps(H264SPS *sps, const uint8_t *buf, int buf_size) memset(sps, 0, sizeof(*sps)); sps->profile_idc = get_bits(&gb, 8); - sps->constraint_set_flags |= get_bits1(&gb) << 0; // constraint_set0_flag - sps->constraint_set_flags |= get_bits1(&gb) << 1; // constraint_set1_flag - sps->constraint_set_flags |= get_bits1(&gb) << 2; // constraint_set2_flag - sps->constraint_set_flags |= get_bits1(&gb) << 3; // constraint_set3_flag - sps->constraint_set_flags |= get_bits1(&gb) << 4; // constraint_set4_flag - sps->constraint_set_flags |= get_bits1(&gb) << 5; // constraint_set5_flag - skip_bits(&gb, 2); // reserved_zero_2bits + sps->constraint_set_flags = get_bits(&gb, 8); sps->level_idc = get_bits(&gb, 8); GET_UE_GOLOMB(sps->id, H264_MAX_SPS_COUNT - 1); diff --git a/libavformat/avc.h b/libavformat/avc.h index db1d3334dd..2c7004a5ef 100644 --- a/libavformat/avc.h +++ b/libavformat/avc.h @@ -42,7 +42,7 @@ typedef struct { uint8_t id; uint8_t profile_idc; uint8_t level_idc; - uint8_t constraint_set_flags; + uint8_t constraint_set_flags; /* Also contains the reserved_zero_*bits. */ uint8_t chroma_format_idc; uint8_t bit_depth_luma_minus8; uint8_t bit_depth_chroma_minus8; diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c index 5eeeb9ab84..5168b17a2c 100644 --- a/libavformat/mxfenc.c +++ b/libavformat/mxfenc.c @@ -2204,7 +2204,7 @@ static int mxf_parse_h264_frame(AVFormatContext *s, AVStream *st, sc->aspect_ratio.den = st->codecpar->height * sps->sar.den; av_reduce(&sc->aspect_ratio.num, &sc->aspect_ratio.den, sc->aspect_ratio.num, sc->aspect_ratio.den, 1024*1024); - intra_only = (sps->constraint_set_flags >> 3) & 1; + intra_only = (sps->constraint_set_flags >> 4) & 1; sc->interlaced = !sps->frame_mbs_only_flag; sc->component_depth = sps->bit_depth_luma_minus8 + 8; From patchwork Thu Jul 9 19:20:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20937 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 56CFC44B0C4 for ; Thu, 9 Jul 2020 22:20:52 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4506B68B617; Thu, 9 Jul 2020 22:20:52 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C868368B5E3 for ; Thu, 9 Jul 2020 22:20:44 +0300 (EEST) Received: by mail-wr1-f66.google.com with SMTP id a6so3556137wrm.4 for ; Thu, 09 Jul 2020 12:20:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=46O5mmXgNHMYcLyffXZcgf8odNCmwsP6AwEX9kvfeDI=; b=g1PDQHsyRTVRN2XBbVq7bmHacpjGBIXR6u58N1HZxadLfFfYLjVmVUcr9cAlhGPVvM +95C1Il0G8GeD4xb/hMBTqKYJZL4GHl/PRzEM9dBPKe3UpdNb3sUlymAFGAXx9KfmhqP Fi1JioYEGGlAqJNOxd0XJgpc/Li7NfFnNdI5/M23hLQ0jj3qENrQDjdDz8biWOAACQKY dAK2ECxSytCi6zqmiHv1gxoPksEmml5Fee+J1z9URh7wI4OeyV9+CEaOZUdAGHkeBTmP HelUuFObusmkIkZ0RQ7q3aQqHzoa97R30O6u36XTilXuK7H/xr/SqxJcQuKmVpD3lMHT 5mEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=46O5mmXgNHMYcLyffXZcgf8odNCmwsP6AwEX9kvfeDI=; b=n35q38myYCGTPwmk+cQ/pTq2Q9rmb+QnLSbjiKWr+c1/ERbIfWwmkYEcRw8J+LnDEm EfXKCTxnBGLAOGdjqYTxuusOTOFPoMzQz8qgpLA2Tpvsmeowls+N6EXdNBkikRDULPGi 4qHICb6Iup+oSpRXPQvIO3zV14YQOoczy1APWbg6wieUrjQWd7I2JQvXxvm7cJb/mHKt VClbdgp7Cn2zt3rh/8jvo93A0kyS7jU6u/d3Tix7rFHCbpuQ9tx9NJX+RHwxzu0KMa+z VPKIBPIRQ1F9a0Cddb4oelOJS6YOoMvpfgqpGijDnyV5sEmqdA83jau6P1C+c7otXco4 MzTA== X-Gm-Message-State: AOAM5308ymqWiH40xfEjSmeWHlkci9nQyGHpGnBztVtpBbSIwUzRyfqz fOOxClfh+iBmz/btc7sbzfyxB7tH X-Google-Smtp-Source: ABdhPJzpkTiJS9NLEiMJeUonj4ByqO3Ybgh69aIvFB5wGUxTC0FzFV/RgAffPvCayxXLAv5HAs2/3Q== X-Received: by 2002:a5d:4e81:: with SMTP id e1mr61319887wru.22.1594322443663; Thu, 09 Jul 2020 12:20:43 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id p25sm5485330wmg.39.2020.07.09.12.20.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 12:20:42 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 21:20:21 +0200 Message-Id: <20200709192022.9412-8-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> References: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 16/17] avformat/avc: Improve writing AVCDecoderConfigurationRecord 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" According to the specifications, both the SPS as well as the PPS in an AVCDecoderConfigurationRecord (the mp4-style extradata for H.264) are supposed to be ordered according to increasing SPS/PPS id. ff_isom_write_avcc did not ensure this; in fact, it did not even ensure that there are no two parameter sets of the same type with the same id. This commit changes this. Only the last occurence of any SPS/PPS id is kept, i.e. just like with in-band parameter sets, new parameter sets overwrite old parameter sets with the same id, and those parameter sets that are kept are written in the order of their id. This also led to the removal of one round of copying implicit in the usage of dynamic buffers. (mkvextract simply converts the mp4-style extradata contained in the CodecPrivate of a Matroska file and prepends it to the frame data (which is also converted to annex B); if the file had in-band extradata, the created file would have the extradata twice at the beginning and extract_extradata would include all of these parameter sets.) Signed-off-by: Andreas Rheinhardt --- libavformat/avc.c | 131 +++++++++++++++++++++++----------------------- 1 file changed, 66 insertions(+), 65 deletions(-) diff --git a/libavformat/avc.c b/libavformat/avc.c index c106fe5792..0f43b295a4 100644 --- a/libavformat/avc.c +++ b/libavformat/avc.c @@ -167,13 +167,32 @@ int ff_avc_parse_nal_units_buf(const uint8_t *buf_in, uint8_t **buf, int *size) return 0; } +static void write_array(AVIOContext *pb, const uint8_t *const *ps, + const uint16_t *const ps_sizes, + int nb_ps, int array_size, uint8_t reserved) +{ + avio_w8(pb, reserved | nb_ps); + for (int i = 0; i < array_size; i++) { + if (ps_sizes[i]) { + avio_wb16(pb, ps_sizes[i]); + avio_write(pb, ps[i], ps_sizes[i]); + nb_ps--; + } + } + av_assert1(nb_ps == 0); +} + int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) { - AVIOContext *sps_pb = NULL, *pps_pb = NULL, *sps_ext_pb = NULL; const uint8_t *nal, *nal_end, *end; - uint8_t *sps, *pps, *sps_ext; - uint32_t sps_size = 0, pps_size = 0, sps_ext_size = 0; int ret, nb_sps = 0, nb_pps = 0, nb_sps_ext = 0; + const uint8_t *sps[H264_MAX_SPS_COUNT]; + const uint8_t *pps[H264_MAX_PPS_COUNT]; + const uint8_t *sps_ext[H264_MAX_SPS_COUNT]; + uint16_t sps_sizes[H264_MAX_SPS_COUNT] = { 0 }; + uint16_t pps_sizes[H264_MAX_PPS_COUNT] = { 0 }; + uint16_t sps_ext_sizes[H264_MAX_SPS_COUNT] = { 0 }; + H264SPS seq; if (len <= 6) return AVERROR_INVALIDDATA; @@ -185,16 +204,6 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) return 0; } - ret = avio_open_dyn_buf(&sps_pb); - if (ret < 0) - goto fail; - ret = avio_open_dyn_buf(&pps_pb); - if (ret < 0) - goto fail; - ret = avio_open_dyn_buf(&sps_ext_pb); - if (ret < 0) - goto fail; - /* look for sps and pps */ nal_end = NULL; end = data + len; @@ -203,71 +212,63 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) uint8_t nal_type = nal[0] & 0x1f; if (nal_type == 7) { /* SPS */ - nb_sps++; - if (size > UINT16_MAX || nb_sps >= H264_MAX_SPS_COUNT) { - ret = AVERROR_INVALIDDATA; - goto fail; - } - avio_wb16(sps_pb, size); - avio_write(sps_pb, nal, size); - } else if (nal_type == 8) { /* PPS */ - nb_pps++; - if (size > UINT16_MAX || nb_pps >= H264_MAX_PPS_COUNT) { - ret = AVERROR_INVALIDDATA; - goto fail; - } - avio_wb16(pps_pb, size); - avio_write(pps_pb, nal, size); - } else if (nal_type == 13) { /* SPS_EXT */ - nb_sps_ext++; - if (size > UINT16_MAX || nb_sps_ext >= 256) { - ret = AVERROR_INVALIDDATA; - goto fail; + if (size > UINT16_MAX) + return AVERROR_INVALIDDATA; + ret = ff_avc_decode_sps(&seq, nal + 1, size - 1); + if (ret < 0) + return ret; + nb_sps += 1 - !!sps_sizes[seq.id]; + sps[seq.id] = nal; + sps_sizes[seq.id] = size; + } else if (nal_type == H264_NAL_PPS || nal_type == H264_NAL_SPS_EXT) { + GetBitContext gb; + unsigned id; + if (size > UINT16_MAX) + return AVERROR_INVALIDDATA; + /* No need to unescape here */ + ret = init_get_bits8(&gb, nal + 1, size - 1); + av_assert1(ret >= 0); + ret = get_ue_golomb(&gb, &id); + if (ret < 0) + return ret; + if (nal_type == H264_NAL_PPS) { + if (id >= H264_MAX_PPS_COUNT) + return AVERROR_INVALIDDATA; + nb_pps += 1 - !!pps_sizes[id]; + pps[id] = nal; + pps_sizes[id] = size; + } else { + if (id >= H264_MAX_SPS_COUNT) + return AVERROR_INVALIDDATA; + if (!sps_sizes[id]) + continue; + nb_sps_ext += 1 - !!sps_ext_sizes[id]; + sps_ext[id] = nal; + sps_ext_sizes[id] = size; } - avio_wb16(sps_ext_pb, size); - avio_write(sps_ext_pb, nal, size); } } - sps_size = avio_get_dyn_buf(sps_pb, &sps); - pps_size = avio_get_dyn_buf(pps_pb, &pps); - sps_ext_size = avio_get_dyn_buf(sps_ext_pb, &sps_ext); - if (sps_size < 6 || !pps_size) { - ret = AVERROR_INVALIDDATA; - goto fail; - } + if (!nb_sps || nb_sps == H264_MAX_SPS_COUNT || + !nb_pps || nb_pps == H264_MAX_PPS_COUNT) + return AVERROR_INVALIDDATA; avio_w8(pb, 1); /* version */ - avio_w8(pb, sps[3]); /* profile */ - avio_w8(pb, sps[4]); /* profile compat */ - avio_w8(pb, sps[5]); /* level */ + avio_w8(pb, seq.profile_idc); + avio_w8(pb, seq.constraint_set_flags); /* profile compat */ + avio_w8(pb, seq.level_idc); avio_w8(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ - avio_w8(pb, 0xe0 | nb_sps); /* 3 bits reserved (111) + 5 bits number of sps */ - - avio_write(pb, sps, sps_size); - avio_w8(pb, nb_pps); /* number of pps */ - avio_write(pb, pps, pps_size); - - if (sps[3] != 66 && sps[3] != 77 && sps[3] != 88) { - H264SPS seq; - ret = ff_avc_decode_sps(&seq, sps + 3, sps_size - 3); - if (ret < 0) - goto fail; + write_array(pb, sps, sps_sizes, nb_sps, H264_MAX_SPS_COUNT, 0xe0); + write_array(pb, pps, pps_sizes, nb_pps, H264_MAX_PPS_COUNT, 0x00); + if (seq.profile_idc != 66 && seq.profile_idc != 77 && seq.profile_idc != 88) { avio_w8(pb, 0xfc | seq.chroma_format_idc); /* 6 bits reserved (111111) + chroma_format_idc */ avio_w8(pb, 0xf8 | seq.bit_depth_luma_minus8); /* 5 bits reserved (11111) + bit_depth_luma_minus8 */ avio_w8(pb, 0xf8 | seq.bit_depth_chroma_minus8); /* 5 bits reserved (11111) + bit_depth_chroma_minus8 */ - avio_w8(pb, nb_sps_ext); /* number of sps ext */ - if (nb_sps_ext) - avio_write(pb, sps_ext, sps_ext_size); + write_array(pb, sps_ext, sps_ext_sizes, nb_sps_ext, H264_MAX_SPS_COUNT, 0); } -fail: - ffio_free_dyn_buf(&sps_pb); - ffio_free_dyn_buf(&pps_pb); - ffio_free_dyn_buf(&sps_ext_pb); - - return ret; + return 0; } int ff_avc_write_annexb_extradata(const uint8_t *in, uint8_t **buf, int *size) From patchwork Thu Jul 9 19:20:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 20938 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 1761644B0C4 for ; Thu, 9 Jul 2020 22:20:54 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id ED52068B615; Thu, 9 Jul 2020 22:20:53 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 08E9468B56F for ; Thu, 9 Jul 2020 22:20:46 +0300 (EEST) Received: by mail-wr1-f65.google.com with SMTP id a6so3556206wrm.4 for ; Thu, 09 Jul 2020 12:20:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=8O6FbEHXMM6O5BXXne0/I2m5O7O831Q14P7ayGF5rKU=; b=WkxRACf5AaYbubfpyPqpDrXh03d1WI4ynac7nHr/HF9K9+n8wRkbesk/Ozpt4rv6+R C+ihwg8iUXVln36wux9miVfSbVfFIrcM4UDuiqq+PaUXUhi1xPy+8nxc/kJ8f2YYwnUi z9LOJMtMleKQoO7YFC30regJoD2eo9b0oSj8/toZkfOVc9f9aGbrGk/5SB3+OtlU6yKT cYPedIJuS+lYlaZNVp6o4vULGcSVOA50D3RoxyQL2wAr+FutSRHrdUSiN8koivcY51tL IFZwqgx0VwP4iB/GjP/XFv/M387UYxIQ0qJwb91xrdT5Kbxc59NnwuTTYpIJ9iQ5tYLk GS9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=8O6FbEHXMM6O5BXXne0/I2m5O7O831Q14P7ayGF5rKU=; b=lMnC0xdDLlTMGXx65a6XIoFUl8yY0iX+iNY3nbbUTL2THMoegJBdRLejkMxkaVKaoc RSHtvumCbKxjjgY0/Z6Ysajr7jYa+HArOmUQOZSEc8jVIBDrvyzjV16TnZP1In1/OIah Ba+s0c4bJGAAMt991MUFNHpIgtJGunaVggOM8babqJi6CnfWjo1WdU/RTo9ZJ4JwgMNm +aRSg6JOKZyzN4gNK8d6w+fzIBiWOE59MFPqFBUnSU9GHfE0lJHyP614wyVtX+ZRHkVS c6ufx47WzTB9uQAO4hnh983J9XSROFm1K2Qpa6MdIV2rtx2Ug01J6DIbwznn3nimi41N C2XQ== X-Gm-Message-State: AOAM532k26GnT7SbS6x1URVCNIroUOejbESb7Y+tM2982GUhyUkWz81W fdvFZA1BKKTz2k7Q2XvaCQ3uiI86 X-Google-Smtp-Source: ABdhPJwqd/SBDLWp7pMWdpLK0S1Nxybqx3Vk5xF65bJuZbjnJcoY36C/GWaVF0kKZRwgds+dko1xFA== X-Received: by 2002:adf:dd8d:: with SMTP id x13mr63538482wrl.362.1594322445149; Thu, 09 Jul 2020 12:20:45 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id p25sm5485330wmg.39.2020.07.09.12.20.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 12:20:44 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Jul 2020 21:20:22 +0200 Message-Id: <20200709192022.9412-9-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> References: <20200709103542.19909-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 17/17] avformat/avc: Don't discard SPS extensions for some profiles 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" For some profiles, the AVCDecoderConfigurationRecord contains an array containing all the SPS Extension NAL units; for the other profiles, these NAL units should be put into the SPS array. Yet the latter hasn't been done. This commit implements it. Signed-off-by: Andreas Rheinhardt --- Honestly, I have no sample containing an SPS extension, so this is untested. Btw: The spec is quiet on the order in the SPS array in this case. Should it be all SPS first, then the extensions or should the it be that an SPS is immediately followed by its extension (if present) followed by the next SPS? All it says is that they should be placed in the SPS array. libavformat/avc.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/libavformat/avc.c b/libavformat/avc.c index 0f43b295a4..84a55fdc98 100644 --- a/libavformat/avc.c +++ b/libavformat/avc.c @@ -185,13 +185,13 @@ static void write_array(AVIOContext *pb, const uint8_t *const *ps, int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) { const uint8_t *nal, *nal_end, *end; - int ret, nb_sps = 0, nb_pps = 0, nb_sps_ext = 0; - const uint8_t *sps[H264_MAX_SPS_COUNT]; + int ret, nb_sps = 0, nb_pps = 0, nb_sps_ext = 0, ext_in_sps_array; + const uint8_t *sps[2 * H264_MAX_SPS_COUNT]; const uint8_t *pps[H264_MAX_PPS_COUNT]; - const uint8_t *sps_ext[H264_MAX_SPS_COUNT]; - uint16_t sps_sizes[H264_MAX_SPS_COUNT] = { 0 }; + uint16_t sps_sizes[2 * H264_MAX_SPS_COUNT] = { 0 }; uint16_t pps_sizes[H264_MAX_PPS_COUNT] = { 0 }; - uint16_t sps_ext_sizes[H264_MAX_SPS_COUNT] = { 0 }; + const uint8_t **const sps_ext = &sps[H264_MAX_SPS_COUNT]; + uint16_t *const sps_ext_sizes = &sps_sizes[H264_MAX_SPS_COUNT]; H264SPS seq; if (len <= 6) @@ -249,8 +249,14 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) } } - if (!nb_sps || nb_sps == H264_MAX_SPS_COUNT || - !nb_pps || nb_pps == H264_MAX_PPS_COUNT) + if (!nb_sps || !nb_pps) + return AVERROR_INVALIDDATA; + ext_in_sps_array = seq.profile_idc == 66 || + seq.profile_idc == 77 || + seq.profile_idc == 88; + if (ext_in_sps_array) + nb_sps += nb_sps_ext; + if (nb_sps >= H264_MAX_SPS_COUNT || nb_pps >= H264_MAX_PPS_COUNT) return AVERROR_INVALIDDATA; avio_w8(pb, 1); /* version */ @@ -258,10 +264,11 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) avio_w8(pb, seq.constraint_set_flags); /* profile compat */ avio_w8(pb, seq.level_idc); avio_w8(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ - write_array(pb, sps, sps_sizes, nb_sps, H264_MAX_SPS_COUNT, 0xe0); + write_array(pb, sps, sps_sizes, nb_sps, + H264_MAX_SPS_COUNT * (1 + ext_in_sps_array), 0xe0); write_array(pb, pps, pps_sizes, nb_pps, H264_MAX_PPS_COUNT, 0x00); - if (seq.profile_idc != 66 && seq.profile_idc != 77 && seq.profile_idc != 88) { + if (!ext_in_sps_array) { avio_w8(pb, 0xfc | seq.chroma_format_idc); /* 6 bits reserved (111111) + chroma_format_idc */ avio_w8(pb, 0xf8 | seq.bit_depth_luma_minus8); /* 5 bits reserved (11111) + bit_depth_luma_minus8 */ avio_w8(pb, 0xf8 | seq.bit_depth_chroma_minus8); /* 5 bits reserved (11111) + bit_depth_chroma_minus8 */