From patchwork Wed Nov 29 01:43:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 6437 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp3918341jah; Tue, 28 Nov 2017 17:44:21 -0800 (PST) X-Google-Smtp-Source: AGs4zMYxqt7o2yxMJ79qiTwg3FT5W1SZByxJNZgVFEmMvWkeRf5Knn/RqzW1wF1uDeFLbEtWWMty X-Received: by 10.28.9.146 with SMTP id 140mr1131780wmj.117.1511919861122; Tue, 28 Nov 2017 17:44:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511919861; cv=none; d=google.com; s=arc-20160816; b=dE0pajzYDcxSRV7umQSLpngsv0dVg+S2r6U5pwtQbJsi0JHVyfQDKqcDDQHuM4G6Vl jqBD7I+r702ldFy8smiJ8QJ1oORBY3bGbUCYQqDm6bpU5yqPh88aoeN4F6t1i6RYLrQx e+QmayfVawVSv2Q5PApW7keP9WRTC4/WrhidFnlN+qHVjpj0YIPZJ+kNkUc0qzFHPzDI wOfWjvTBtsKot5rOaqZFeSoXFkiKn2AWwuj4rZzsQ8lG5HdRN9URR6EKjmnsJN8KzdsD JL84VJldeg3LhlrHw/EdAjUUyPaEq0E+vU5GSBk5ScJpW5d19S3KeffQe0qihDnjahUv zi+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=QYA1tEq/nhc2fWfputgtcX/+YkiVPAZiH+d1l2CDN1Y=; b=htJSyf/zK/ryXWMK2dz5NVyV9w5SvjFt8VvNdI5lCom0IPwG4HdHqLDTEhLQ8EAU6C reQspTsqQk9Q33PlQru6WI68l/uVylnHOEnRc9FWhs/8ANTHf4R7GMhNG+83SiS3cPoL ja9xbkFL087l2Me4NqTYMLezmB7lU26qTa5tCCoZK2PjtPAXAxIr/i3XUU6aYba3Um06 dSeqY9MLabY2uz4z2LTcLs/MVJAVyUpSoIaDDyAxPy/xHhfG+H/w9by9wp0tC43xYxRg CvVxZH2xRrhHG5W0JLE7umwQ95e01LLGMfIe/iLnnHhnJOvuxqu1E/PIUlUu2aFsmsMk bpmg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=TE+9VZbf; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 60si383723wrq.164.2017.11.28.17.44.20; Tue, 28 Nov 2017 17:44:21 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=TE+9VZbf; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A2D4268A261; Wed, 29 Nov 2017 03:43:45 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f194.google.com (mail-qt0-f194.google.com [209.85.216.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6F11668A1AC for ; Wed, 29 Nov 2017 03:43:36 +0200 (EET) Received: by mail-qt0-f194.google.com with SMTP id e2so2498836qti.0 for ; Tue, 28 Nov 2017 17:43:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=Uu6AeIgiiZLtn8BlRK9n3H8oKywzAUluSxbHJuIPdpw=; b=TE+9VZbf8Yng5W4QRstFYcpuDzA7fT3YsETJPW5/O3Lwz22n0Wv9J9/lnKFgUWupau 8kkv1Ss7osxx44gw3o8OJiAvrJIk3iNOt3TecIsOxQ/kXf2QHwPq8CaoFace79sxfnAG MyaB6y8bZfcynwa8S/A29wx49AqItt5ezuWLWC14NbKvtbIxNuIHOISdRP4LgCFE6OnL HNIhC80Ry9InkxtESmNPwDEMRUdofmYrp/WO4sKNlaNWX6Snshv5n3ij/27qOpoRfXHq iemAwSKXrpIG/okghhtlsGdDZkLuCDDFu+G/DuJaFSL8D/7hwzq1E4ja0kccTTk3YlPx Qehw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=Uu6AeIgiiZLtn8BlRK9n3H8oKywzAUluSxbHJuIPdpw=; b=bJNjFEN3obNy4DcW7siPJIyfOcKrX6K4WYv9du4MRyaRe6SsK0iY9IK0iBtZd+mhF3 /Bwc++wvoe3A9/6sc+RT/9DBko/6y/evQW7nZvtvilNjXAMG0zn+yY9Oi+DZScj5n2eX APaFIGz+xcF4zm/wlop/UlUQRFPGh/OG9ME2BdRtdR56fSV6Txa5oTzKQ6B4kNppepWe HOIA2YRPY94LkK7Dz3fsu8r5oyUtSFHxmpVgj4P2lDbkome58reARkfyk4QNVMsX2Ogd X0pHRJQIK2AwBH64P51vcUEJeiKZoF1qaJ7tQ3E8nrHGmyebW/gt7xpt8puIBuDn5NKM PcKQ== X-Gm-Message-State: AJaThX5MwqxLY3kFT0bxF03qhdgP18qCjp9FFHpKn3JTpt5cc8+CAqo1 7AI85okOBrSsCB2o4OT8yVWCWA== X-Received: by 10.200.43.119 with SMTP id 52mr1986380qtv.143.1511919818098; Tue, 28 Nov 2017 17:43:38 -0800 (PST) Received: from localhost.localdomain ([181.231.59.220]) by smtp.gmail.com with ESMTPSA id k7sm407365qkf.57.2017.11.28.17.43.37 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 28 Nov 2017 17:43:37 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 28 Nov 2017 22:43:03 -0300 Message-Id: <20171129014303.3716-5-jamrial@gmail.com> X-Mailer: git-send-email 2.15.0 In-Reply-To: <20171129014303.3716-1-jamrial@gmail.com> References: <20171129014303.3716-1-jamrial@gmail.com> Subject: [FFmpeg-devel] [PATCH 5/5] avformat/avc: support writting more than one sps/pps in ff_isom_write_avcc 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Addresses ticket #6864 Signed-off-by: James Almer --- I don't have the h264 in isobmff spec at hand, so i just looked at what the h264_mp4toannexb bsf does to handle more than one sps and pps and worked with that. If there's a pps limit it's not currently enforced, but adding it is trivial. The sps limit i added is arbitrarily 2^5-1, as that's the amount of bits available for it. libavformat/avc.c | 50 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/libavformat/avc.c b/libavformat/avc.c index 6ef6e08778..634324aee5 100644 --- a/libavformat/avc.c +++ b/libavformat/avc.c @@ -105,10 +105,11 @@ 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; uint8_t *buf = NULL, *end, *start; uint8_t *sps = NULL, *pps = NULL; uint32_t sps_size = 0, pps_size = 0; - int ret; + int ret, nb_sps = 0, nb_pps = 0; if (len < 6) return AVERROR_INVALIDDATA; @@ -126,6 +127,13 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) start = buf; end = buf + len; + ret = avio_open_dyn_buf(&sps_pb); + if (ret < 0) + goto fail; + ret = avio_open_dyn_buf(&pps_pb); + if (ret < 0) + goto fail; + /* look for sps and pps */ while (end - buf > 4) { uint32_t size; @@ -135,35 +143,51 @@ int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len) nal_type = buf[0] & 0x1f; if (nal_type == 7) { /* SPS */ - sps = buf; - sps_size = size; + if (size > UINT16_MAX) { + ret = AVERROR_INVALIDDATA; + goto fail; + } + avio_wb16(sps_pb, size); + avio_write(sps_pb, buf, size); + nb_sps++; } else if (nal_type == 8) { /* PPS */ - pps = buf; - pps_size = size; + if (size > UINT16_MAX) { + ret = AVERROR_INVALIDDATA; + goto fail; + } + avio_wb16(pps_pb, size); + avio_write(pps_pb, buf, size); + nb_pps++; } buf += size; } + sps_size = avio_close_dyn_buf(sps_pb, &sps); + pps_size = avio_close_dyn_buf(pps_pb, &pps); - if (!sps || !pps || sps_size < 4 || sps_size > UINT16_MAX || pps_size > UINT16_MAX) { + if (nb_sps > 31 || sps_size < 6 || !pps_size) { ret = AVERROR_INVALIDDATA; goto fail; } avio_w8(pb, 1); /* version */ - avio_w8(pb, sps[1]); /* profile */ - avio_w8(pb, sps[2]); /* profile compat */ - avio_w8(pb, sps[3]); /* level */ + avio_w8(pb, sps[3]); /* profile */ + avio_w8(pb, sps[4]); /* profile compat */ + avio_w8(pb, sps[5]); /* level */ avio_w8(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ - avio_w8(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ + avio_w8(pb, 0xe0 | nb_sps); /* 3 bits reserved (111) + 5 bits number of sps */ - avio_wb16(pb, sps_size); avio_write(pb, sps, sps_size); - avio_w8(pb, 1); /* number of pps */ - avio_wb16(pb, pps_size); + avio_w8(pb, nb_pps); /* number of pps */ avio_write(pb, pps, pps_size); fail: + if (!sps) + avio_close_dyn_buf(sps_pb, &sps); + if (!pps) + avio_close_dyn_buf(pps_pb, &pps); + av_free(sps); + av_free(pps); av_free(start); return ret;