From patchwork Sat Jul 18 00:06:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21150 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 B663144BDE1 for ; Sat, 18 Jul 2020 03:14:18 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8FED468B684; Sat, 18 Jul 2020 03:14:18 +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 639A268B622 for ; Sat, 18 Jul 2020 03:14:12 +0300 (EEST) Received: by mail-ej1-f68.google.com with SMTP id y10so12690477eje.1 for ; Fri, 17 Jul 2020 17:14: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:mime-version :content-transfer-encoding; bh=XfJJYiZjlBS8AHvTyrXObMeZScQ/PquMl7VzCfosGfk=; b=G2FT+pgRNxxg8/WOezqH7bNOVARju7fir4jfrbNU8q41gq2lyvOaOp+gHO7/xgQPzT U8PxprpgPDgbtGFZCNPyQ1llNTraQPx+3meXVEDUJ8Y4dW6Y7R2mevzE+2SnArinhO/d Q1H2U/v5vaBlOygw9+Fm51IEqfCKV3xUVoa/BGaWvzDlfEMN5eZTsARX3Mzy3BiwbwoA q8yC7XyE8FKq38O4+UF3HmXiAS5RBPuMYEJj/gC7qXTO8vmVqvdb+h1f4qlZagA8aWqp +3WfdM2j9kY7nLiH0r8rn+K71iAf8yMGNgx1beJKUurnP0VFP2BMsIRKtLBs7fWfreOl uVfg== 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=XfJJYiZjlBS8AHvTyrXObMeZScQ/PquMl7VzCfosGfk=; b=Y4oUCCNqhJ55ZiUtAsYs+KucsNWD8gzsPFysggLa/7XIPRtWjrdorXD7Qp0i0bEWIL s/k0zV3o3NnIz3gM9tDpMmJTsGFl41EuByOOHK4uP/4AeSBiXLMVbEx3z00Gnw5iCfYm t2zBQFBxeY9kuII6nrEnyFbGPtBJ26l1NyWaN7SBwG/l7XExOZc8p7CCOD/VuGOFVwfF PICJZ6+T6v7IEJ/6Wl577UkeAyCu/eIX3etQPg/wy6GRGS904Mp8AW6rT1OeMN1CwF4t xUdLEpYvtKi1BCxB9YgOoQAzTnFpghwTSxa9nVGbMpFx0fwx5Dz0VTOfdsMN/MaoeVwl 0VMw== X-Gm-Message-State: AOAM533Il6szSkwKaK28nF/6nzdUFHFlGLle8PNA2TCPebo8Dmdnf7VQ kjYMt/OdJQ+guhpxyVMD5f6/9Iox X-Google-Smtp-Source: ABdhPJzFafaNQ41yCFyxQA/rwquFqdCkd4pMvKRLyI913DYVPfDrrbb0pWOPw0ydfHMiyf8Eetx5Mg== X-Received: by 2002:a17:906:d143:: with SMTP id br3mr10741245ejb.268.1595030811628; Fri, 17 Jul 2020 17:06:51 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id ay27sm9660534edb.81.2020.07.17.17.06.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2020 17:06:50 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Jul 2020 02:06:26 +0200 Message-Id: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 01/11] avformat/webmdashenc: Fix segfault when no filename is given when live 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 checking a bit earlier. Signed-off-by: Andreas Rheinhardt --- libavformat/webmdashenc.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libavformat/webmdashenc.c b/libavformat/webmdashenc.c index eb286cab99..3eefd6df8b 100644 --- a/libavformat/webmdashenc.c +++ b/libavformat/webmdashenc.c @@ -171,8 +171,7 @@ static int write_representation(AVFormatContext *s, AVStream *stream, char *id, AVDictionaryEntry *filename = av_dict_get(stream->metadata, FILENAME, NULL, 0); AVDictionaryEntry *bandwidth = av_dict_get(stream->metadata, BANDWIDTH, NULL, 0); const char *bandwidth_str; - if ((w->is_live && (!filename)) || - (!w->is_live && (!irange || !cues_start || !cues_end || !filename || !bandwidth))) { + if (!w->is_live && (!irange || !cues_start || !cues_end || !filename || !bandwidth)) { return AVERROR_INVALIDDATA; } avio_printf(s->pb, "streams[as->streams[0]]->metadata, FILENAME, NULL, 0); char *initialization_pattern = NULL; char *media_pattern = NULL; - int ret = parse_filename(filename->value, NULL, &initialization_pattern, + int ret; + if (!filename) + return AVERROR(EINVAL); + ret = parse_filename(filename->value, NULL, &initialization_pattern, &media_pattern); if (ret) return ret; avio_printf(s->pb, "\n", From patchwork Sat Jul 18 00:19: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: 21155 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 188A5446CD2 for ; Sat, 18 Jul 2020 03:26:33 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E698368B6FC; Sat, 18 Jul 2020 03:26:32 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f193.google.com (mail-lj1-f193.google.com [209.85.208.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2602168B675 for ; Sat, 18 Jul 2020 03:26:26 +0300 (EEST) Received: by mail-lj1-f193.google.com with SMTP id h19so14611431ljg.13 for ; Fri, 17 Jul 2020 17:26:26 -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=FM8sAdH7fXpcOLEMD1CnoXqWbBMzKEiL9qGnYSXKoww=; b=lLIV6/bM34RZokBlsC1gvI548vTSOmVc/dHLy82JhrSYteJl4K4GNPU4FUBwED8xek C2iavq7ys/n/38Xo/qwWciDVDkOEzxNoznxn4/Pieg3Igj/hvVfKMNnaxSOmP3yY3LTh 9MHBlVunGcWRdu7rpracgssSVj8N935IdwjVOYq9BpfvRqXrpTMTeaViviBizf+ufcTq HkJJpsQg7UTdf04YONs1g3Ig1j4boDfX+KhmdGtaE5zlvMaOW93+eQJyv5fLOBqp31eC pecgmX7gGoYLJ1/ywyzHcg2G0VKHrldFj/OpC5ElatbyUkFpluyjedvcNYlHPK7mk3Df WUZw== 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=FM8sAdH7fXpcOLEMD1CnoXqWbBMzKEiL9qGnYSXKoww=; b=KQm/8HQSqXQlptJGQZ1jA/WRlaY73yyEKkzccLlId3qGkpvFexbv+Tln30yj45n0VU tlCYjPYfTaStvF09DnlrfRCaPjnBFUQkSLmDJ43+fqeGG6xT2ijYQSJ7KCC3HwdX+0pR z5LvoGPivEUpqj5/k+W1S+1FsM5vwwJKttSueoifvlyOwXSWaEOsJrzuEzg6VM8mH8Ra 0S2pwEP0p4jRSlfIjFmFFd689fMYkRONZwR7RbgZPqzorQIJAZUno1wDj82MZ0lLFoL0 cZIGuQ7E0roQzueCWoazjvgXTP5FOXAxj5iz9qdnqhWAarCKLE0nYs9O5s56/6fOObEW 8yJw== X-Gm-Message-State: AOAM5330jN+tR/NX2jWDZVZQJsTOgrYF2naXBKV/iLTsIrDoy5ZALWzu Hu+Pvk9t0xJglcgNexJKSPYYOfhx X-Google-Smtp-Source: ABdhPJzZAKgaIN1tCEVlWaaM0Iswx37+V6u4LGc+HzDUTKfFF5q4Ub3DDmW7KgEIsH4gxm7cIHzvjg== X-Received: by 2002:a05:6402:787:: with SMTP id d7mr11406835edy.46.1595031575831; Fri, 17 Jul 2020 17:19:35 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id y7sm9299001ejd.73.2020.07.17.17.19.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2020 17:19:35 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Jul 2020 02:19:19 +0200 Message-Id: <20200718001928.10603-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> References: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 02/11] avformat/webmdashenc: Avoid allocations, fix memleak 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 using the WebM DASH Manifest muxer, every stream of each adaptation set has to contain a metadata entry containing the filename of the source file. In case of live stream manifests, said filename has to conform to a pattern of _.. These pieces are used to create the other strings that are actually output. Up until now, these other strings would be allocated, used once and then freed directly after usage. This commit changes this: The function that allocated and assembled these strings now returns pointers to the '_' and '.' delimiters and so that the caller can easily pick substrings from it without needing to copy the string. Avoiding allocations also fixes a memleak: One of the allocated strings would leak upon a subsequent allocation failure. Signed-off-by: Andreas Rheinhardt --- libavformat/webmdashenc.c | 94 ++++++++++++--------------------------- 1 file changed, 28 insertions(+), 66 deletions(-) diff --git a/libavformat/webmdashenc.c b/libavformat/webmdashenc.c index 3eefd6df8b..a9edcf73b8 100644 --- a/libavformat/webmdashenc.c +++ b/libavformat/webmdashenc.c @@ -260,65 +260,24 @@ static void free_adaptation_sets(AVFormatContext *s) { } /* - * Parses a live header filename and computes the representation id, - * initialization pattern and the media pattern. Pass NULL if you don't want to - * compute any of those 3. Returns 0 on success and non-zero on failure. + * Parses a live header filename and returns the position of the '_' and '.' + * delimiting and . * * Name of the header file should conform to the following pattern: * _.hdr where can be * anything. The chunks should be named according to the following pattern: * __.chk */ -static int parse_filename(char *filename, char **representation_id, - char **initialization_pattern, char **media_pattern) { - char *underscore_pos = NULL; - char *period_pos = NULL; - char *filename_str = av_strdup(filename); - int ret = 0; - - if (!filename_str) { - ret = AVERROR(ENOMEM); - goto end; - } - underscore_pos = strrchr(filename_str, '_'); - if (!underscore_pos) { - ret = AVERROR_INVALIDDATA; - goto end; - } - period_pos = strchr(++underscore_pos, '.'); - if (!period_pos) { - ret = AVERROR_INVALIDDATA; - goto end; - } - *(underscore_pos - 1) = 0; - if (representation_id) { - *representation_id = av_malloc(period_pos - underscore_pos + 1); - if (!(*representation_id)) { - ret = AVERROR(ENOMEM); - goto end; - } - av_strlcpy(*representation_id, underscore_pos, period_pos - underscore_pos + 1); - } - if (initialization_pattern) { - *initialization_pattern = av_asprintf("%s_$RepresentationID$.hdr", - filename_str); - if (!(*initialization_pattern)) { - ret = AVERROR(ENOMEM); - goto end; - } - } - if (media_pattern) { - *media_pattern = av_asprintf("%s_$RepresentationID$_$Number$.chk", - filename_str); - if (!(*media_pattern)) { - ret = AVERROR(ENOMEM); - goto end; - } - } - -end: - av_freep(&filename_str); - return ret; +static int split_filename(char *filename, char **underscore_pos, + char **period_pos) +{ + *underscore_pos = strrchr(filename, '_'); + if (!*underscore_pos) + return AVERROR(EINVAL); + *period_pos = strchr(*underscore_pos, '.'); + if (!*period_pos) + return AVERROR(EINVAL); + return 0; } /* @@ -377,46 +336,49 @@ static int write_adaptation_set(AVFormatContext *s, int as_index) if (w->is_live) { AVDictionaryEntry *filename = av_dict_get(s->streams[as->streams[0]]->metadata, FILENAME, NULL, 0); - char *initialization_pattern = NULL; - char *media_pattern = NULL; + char *underscore_pos, *period_pos; int ret; if (!filename) return AVERROR(EINVAL); - ret = parse_filename(filename->value, NULL, &initialization_pattern, - &media_pattern); + ret = split_filename(filename->value, &underscore_pos, &period_pos); if (ret) return ret; + *underscore_pos = '\0'; avio_printf(s->pb, "\n", par->codec_type == AVMEDIA_TYPE_VIDEO ? "video" : "audio"); avio_printf(s->pb, "pb, " timescale=\"1000\""); avio_printf(s->pb, " duration=\"%d\"", w->chunk_duration); - avio_printf(s->pb, " media=\"%s\"", media_pattern); + avio_printf(s->pb, " media=\"%s_$RepresentationID$_$Number$.chk\"", + filename->value); avio_printf(s->pb, " startNumber=\"%d\"", w->chunk_start_index); - avio_printf(s->pb, " initialization=\"%s\"", initialization_pattern); + avio_printf(s->pb, " initialization=\"%s_$RepresentationID$.hdr\"", + filename->value); avio_printf(s->pb, "/>\n"); - av_free(initialization_pattern); - av_free(media_pattern); + *underscore_pos = '_'; } for (i = 0; i < as->nb_streams; i++) { - char *representation_id = NULL; + char buf[25], *representation_id = buf, *underscore_pos, *period_pos; int ret; if (w->is_live) { AVDictionaryEntry *filename = av_dict_get(s->streams[as->streams[i]]->metadata, FILENAME, NULL, 0); if (!filename) return AVERROR(EINVAL); - if (ret = parse_filename(filename->value, &representation_id, NULL, NULL)) + ret = split_filename(filename->value, &underscore_pos, &period_pos); + if (ret < 0) return ret; + representation_id = underscore_pos + 1; + *period_pos = '\0'; } else { - representation_id = av_asprintf("%d", w->representation_id++); - if (!representation_id) return AVERROR(ENOMEM); + snprintf(buf, sizeof(buf), "%d", w->representation_id++); } ret = write_representation(s, s->streams[as->streams[i]], representation_id, !width_in_as, !height_in_as, !sample_rate_in_as); - av_free(representation_id); if (ret) return ret; + if (w->is_live) + *period_pos = '.'; } avio_printf(s->pb, "\n"); return 0; From patchwork Sat Jul 18 00:19: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: 21151 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 53625449F78 for ; Sat, 18 Jul 2020 03:19:56 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2AB0B68B6BB; Sat, 18 Jul 2020 03:19:56 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f66.google.com (mail-ej1-f66.google.com [209.85.218.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C561B68B5BA for ; Sat, 18 Jul 2020 03:19:49 +0300 (EEST) Received: by mail-ej1-f66.google.com with SMTP id a1so12665924ejg.12 for ; Fri, 17 Jul 2020 17:19:49 -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=YeEvKagSajrJ00bPYynjqKB0SxdZkeYxHmWeISUVAPU=; b=Z9a8B16c1PwLR5q3frdPTmhqNKAv0xQGIuUODYK/saDrr2IK0Rs57bbC3rAp1L52OW b0Z/acwxxrTwdZKjayWmx/z88/EoxUOqiAqx+u+rOrBpluh9nREJP7HWaY2jomftTSii Qk3sk0K/a9AHIwCtQxef83MxE7I89SkfY+R6Md4cugafanc2fv2rDSUtTbfvLxLgsUqo 5p1cg7ptoqCvcYotN9V7LcaM/ERt1HP0J1g2ZbcaJUD0Wbmv70QInze3LR59scNoKw6Z Bdx7lsEbwnAIwRSZhVR3FhmTYpM78tCOCCIetr7V3pJuOjqWsO63Dcm5m3IBL7Prw2Gx wCAg== 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=YeEvKagSajrJ00bPYynjqKB0SxdZkeYxHmWeISUVAPU=; b=bgTQaTFafIsNQdtCzlD1df/RMaIftyUY92Zo/YXwhRf3URAw7nmmqxdsMeg1+Z+PgT g7xl5cULnUgN/HVlEDBeIfXOlWzj3S3gsYzRIsQtX0/TPpwqlX0QwEI2abH/2k1N/soT H5J4P4yYoPPCeS9ODZp+tyqG7CWKchSZYYcxC4UigHnxzQ1g0ZgnwMpKSEPBYLg9yQXT msyfTe1e9HfcMHf9d0DKNJxx4YJG34H/8LYAMARai1+rG/lMzLJDozF/yJ3iLHiP8P6A uZ/6mE5zoxDZow499V5DpvBsFPoSghXZlA2X3NJ0D9pbFwLx69Xw5TmnQlOj/xe8O1gW 1sTQ== X-Gm-Message-State: AOAM532Ue+XJK+CnZ3OF4mwW/mT5qyAyiVBt5F0M+Cbl0j09vbIczt+x A+Fvw/TbJNoArTetP+ng6eGHM4fc X-Google-Smtp-Source: ABdhPJxr00u7IgC8h8aPXRv1dMHTItakvw0+KT1KB7sQzvSkNPpTVoaFfYDSjdk80HTrcJBq7atETw== X-Received: by 2002:a17:906:af6d:: with SMTP id os13mr10631557ejb.57.1595031588754; Fri, 17 Jul 2020 17:19:48 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id y7sm9299001ejd.73.2020.07.17.17.19.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2020 17:19:48 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Jul 2020 02:19:20 +0200 Message-Id: <20200718001928.10603-2-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> References: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 03/11] avformat/webmdashenc: Only check for existence of metadata if it is used 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" Also return proper error codes when it is absent: AVERROR(EINVAL) instead of AVERROR_INVALIDDATA. Signed-off-by: Andreas Rheinhardt --- libavformat/webmdashenc.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/libavformat/webmdashenc.c b/libavformat/webmdashenc.c index a9edcf73b8..4d25d79846 100644 --- a/libavformat/webmdashenc.c +++ b/libavformat/webmdashenc.c @@ -165,21 +165,16 @@ static int write_representation(AVFormatContext *s, AVStream *stream, char *id, int output_width, int output_height, int output_sample_rate) { WebMDashMuxContext *w = s->priv_data; - AVDictionaryEntry *irange = av_dict_get(stream->metadata, INITIALIZATION_RANGE, NULL, 0); - AVDictionaryEntry *cues_start = av_dict_get(stream->metadata, CUES_START, NULL, 0); - AVDictionaryEntry *cues_end = av_dict_get(stream->metadata, CUES_END, NULL, 0); - AVDictionaryEntry *filename = av_dict_get(stream->metadata, FILENAME, NULL, 0); AVDictionaryEntry *bandwidth = av_dict_get(stream->metadata, BANDWIDTH, NULL, 0); const char *bandwidth_str; - if (!w->is_live && (!irange || !cues_start || !cues_end || !filename || !bandwidth)) { - return AVERROR_INVALIDDATA; - } avio_printf(s->pb, "is_live && !bandwidth) { + if (bandwidth) { + bandwidth_str = bandwidth->value; + } else if (w->is_live) { + // if bandwidth for live was not provided, use a default bandwidth_str = (stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) ? "128000" : "1000000"; } else { - bandwidth_str = bandwidth->value; + return AVERROR(EINVAL); } avio_printf(s->pb, " bandwidth=\"%s\"", bandwidth_str); if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && output_width) @@ -198,6 +193,13 @@ static int write_representation(AVFormatContext *s, AVStream *stream, char *id, avio_printf(s->pb, " startsWithSAP=\"1\""); avio_printf(s->pb, ">"); } else { + AVDictionaryEntry *irange = av_dict_get(stream->metadata, INITIALIZATION_RANGE, NULL, 0); + AVDictionaryEntry *cues_start = av_dict_get(stream->metadata, CUES_START, NULL, 0); + AVDictionaryEntry *cues_end = av_dict_get(stream->metadata, CUES_END, NULL, 0); + AVDictionaryEntry *filename = av_dict_get(stream->metadata, FILENAME, NULL, 0); + if (!irange || !cues_start || !cues_end || !filename) + return AVERROR(EINVAL); + avio_printf(s->pb, ">\n"); avio_printf(s->pb, "%s\n", filename->value); avio_printf(s->pb, " X-Patchwork-Id: 21152 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 60A58449F78 for ; Sat, 18 Jul 2020 03:19:58 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 43B3D68B6C6; Sat, 18 Jul 2020 03:19:58 +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 CF98D68B69D for ; Sat, 18 Jul 2020 03:19:50 +0300 (EEST) Received: by mail-ej1-f68.google.com with SMTP id o18so12675797eje.7 for ; Fri, 17 Jul 2020 17:19:50 -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=DA2qZGrh4AY3BXVlCKaJCp/OaEOE3ix9Uah5GV9CFEc=; b=seXWn0o2NMNFOth9qH5pZi8chvo1//Wg+r/7kKWc+/EUMtj5DfiyDtYckODo7doVNU fbwGHaELHL5qiVD6BYOyCyVWtzMQUwSV46QwsUCL/KsAgQyqy76k1PkyJ+LQhDyxTAAV KzplLs0CRbo6VQt+KfbLnHDF0yhzs9aYI1G6Cqw/fF6wk2TjuGU3sb35/X58ddChgIJn U0SGJmEGNjVwJYLGZe8TmNpqLPqhjbHffOkudcn4JHnIN8gjwhaZwkg6/PSx3njexidZ ZNVt4QN2EN2OY72/l+vXc40wHO70gZLKxdcEkIiteNPjivZVs8iAfGsojR7S7jlz2F3r NJSw== 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=DA2qZGrh4AY3BXVlCKaJCp/OaEOE3ix9Uah5GV9CFEc=; b=ubsCC7psGHZZBNq7Ts5TylTDJ5LGZqoXdc0thcd0ZWDrCm6nQTdx4+lidkH6vhmpn8 6KeEQXVx9w1PuYZP/smVIpxM5OYnacngntrTtv00jYA1+MwtTXubQfa9QN5IDGWFXkya g+2Mn5AjXC/vdVnY5/6JEYFpS2HlhEkcynWzli1sxR5I6pFOFKXrxn38/jQyADHGvbtq b3Xltvr+IRhh4sBFLDD0xcEynanYHlqCZMwUFPd6fW9nfJ/VnnUGHtOFEyn8Blura+ZV 40WItfEnZtriwXLRrjjwPJtazkTOxuHGtSPtLJ5qfV5RKwg7GpwiG3fdUEkpaPWgDaMg CVkw== X-Gm-Message-State: AOAM532XZgltgGF0fBIBE9shAg4FHVfJresJYg4bZ2g9hRpIKSdusxyr aBMpcvhwo4sNyMNYEIaMbC/igSZl X-Google-Smtp-Source: ABdhPJwIzzWwiFFFYnGVesEufOOVRqITBw1xNtQ+su9ZKgExCWDhtF6m68CA/tFTBiOPPu5u0tevvQ== X-Received: by 2002:a17:906:dce:: with SMTP id p14mr10676016eji.442.1595031589658; Fri, 17 Jul 2020 17:19:49 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id y7sm9299001ejd.73.2020.07.17.17.19.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2020 17:19:49 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Jul 2020 02:19:21 +0200 Message-Id: <20200718001928.10603-3-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> References: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 04/11] avformat/webmdashenc: Cosmetics 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" Mostly using intermediate pointers for accesses (i.e. storing s->pb in a variable pb and then using pb for writing instead of s->pb) to improve readability. Furthermore, the opening brace '{' of a function has been moved into a line of its own in instances where it wasn't before. Signed-off-by: Andreas Rheinhardt --- libavformat/webmdashenc.c | 177 +++++++++++++++++++++----------------- 1 file changed, 96 insertions(+), 81 deletions(-) diff --git a/libavformat/webmdashenc.c b/libavformat/webmdashenc.c index 4d25d79846..04f8cbe39d 100644 --- a/libavformat/webmdashenc.c +++ b/libavformat/webmdashenc.c @@ -79,19 +79,20 @@ static double get_duration(AVFormatContext *s) static int write_header(AVFormatContext *s) { WebMDashMuxContext *w = s->priv_data; + AVIOContext *pb = s->pb; double min_buffer_time = 1.0; - avio_printf(s->pb, "\n"); - avio_printf(s->pb, "pb, " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"); - avio_printf(s->pb, " xmlns=\"urn:mpeg:DASH:schema:MPD:2011\"\n"); - avio_printf(s->pb, " xsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011\"\n"); - avio_printf(s->pb, " type=\"%s\"\n", w->is_live ? "dynamic" : "static"); + avio_printf(pb, "\n"); + avio_printf(pb, "is_live ? "dynamic" : "static"); if (!w->is_live) { - avio_printf(s->pb, " mediaPresentationDuration=\"PT%gS\"\n", + avio_printf(pb, " mediaPresentationDuration=\"PT%gS\"\n", get_duration(s)); } - avio_printf(s->pb, " minBufferTime=\"PT%gS\"\n", min_buffer_time); - avio_printf(s->pb, " profiles=\"%s\"%s", + avio_printf(pb, " minBufferTime=\"PT%gS\"\n", min_buffer_time); + avio_printf(pb, " profiles=\"%s\"%s", w->is_live ? "urn:mpeg:dash:profile:isoff-live:2011" : "urn:webm:dash:profile:webm-on-demand:2012", w->is_live ? "\n" : ">\n"); if (w->is_live) { @@ -105,14 +106,14 @@ static int write_header(AVFormatContext *s) if (s->flags & AVFMT_FLAG_BITEXACT) { av_strlcpy(gmt_iso, "", 1); } - avio_printf(s->pb, " availabilityStartTime=\"%s\"\n", gmt_iso); - avio_printf(s->pb, " timeShiftBufferDepth=\"PT%gS\"\n", w->time_shift_buffer_depth); - avio_printf(s->pb, " minimumUpdatePeriod=\"PT%dS\"", w->minimum_update_period); - avio_printf(s->pb, ">\n"); + avio_printf(pb, " availabilityStartTime=\"%s\"\n", gmt_iso); + avio_printf(pb, " timeShiftBufferDepth=\"PT%gS\"\n", w->time_shift_buffer_depth); + avio_printf(pb, " minimumUpdatePeriod=\"PT%dS\"", w->minimum_update_period); + avio_printf(pb, ">\n"); if (w->utc_timing_url) { - avio_printf(s->pb, "pb, " schemeIdUri=\"urn:mpeg:dash:utc:http-iso:2014\"\n"); - avio_printf(s->pb, " value=\"%s\"/>\n", w->utc_timing_url); + avio_printf(pb, "\n", w->utc_timing_url); } } return 0; @@ -123,7 +124,8 @@ static void write_footer(AVFormatContext *s) avio_printf(s->pb, "\n"); } -static int subsegment_alignment(AVFormatContext *s, AdaptationSet *as) { +static int subsegment_alignment(AVFormatContext *s, const AdaptationSet *as) +{ int i; AVDictionaryEntry *gold = av_dict_get(s->streams[as->streams[0]]->metadata, CUE_TIMESTAMPS, NULL, 0); @@ -136,16 +138,19 @@ static int subsegment_alignment(AVFormatContext *s, AdaptationSet *as) { return 1; } -static int bitstream_switching(AVFormatContext *s, AdaptationSet *as) { +static int bitstream_switching(AVFormatContext *s, const AdaptationSet *as) +{ int i; - AVDictionaryEntry *gold_track_num = av_dict_get(s->streams[as->streams[0]]->metadata, + const AVStream *gold_st = s->streams[as->streams[0]]; + AVDictionaryEntry *gold_track_num = av_dict_get(gold_st->metadata, TRACK_NUMBER, NULL, 0); - AVCodecParameters *gold_par = s->streams[as->streams[0]]->codecpar; + AVCodecParameters *gold_par = gold_st->codecpar; if (!gold_track_num) return 0; for (i = 1; i < as->nb_streams; i++) { - AVDictionaryEntry *track_num = av_dict_get(s->streams[as->streams[i]]->metadata, + const AVStream *st = s->streams[as->streams[i]]; + AVDictionaryEntry *track_num = av_dict_get(st->metadata, TRACK_NUMBER, NULL, 0); - AVCodecParameters *par = s->streams[as->streams[i]]->codecpar; + AVCodecParameters *par = st->codecpar; if (!track_num || strncmp(gold_track_num->value, track_num->value, strlen(gold_track_num->value)) || gold_par->codec_id != par->codec_id || @@ -161,61 +166,65 @@ static int bitstream_switching(AVFormatContext *s, AdaptationSet *as) { * Writes a Representation within an Adaptation Set. Returns 0 on success and * < 0 on failure. */ -static int write_representation(AVFormatContext *s, AVStream *stream, char *id, +static int write_representation(AVFormatContext *s, AVStream *st, char *id, int output_width, int output_height, - int output_sample_rate) { + int output_sample_rate) +{ WebMDashMuxContext *w = s->priv_data; - AVDictionaryEntry *bandwidth = av_dict_get(stream->metadata, BANDWIDTH, NULL, 0); + AVIOContext *pb = s->pb; + const AVCodecParameters *par = st->codecpar; + AVDictionaryEntry *bandwidth = av_dict_get(st->metadata, BANDWIDTH, NULL, 0); const char *bandwidth_str; - avio_printf(s->pb, "value; } else if (w->is_live) { // if bandwidth for live was not provided, use a default - bandwidth_str = (stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) ? "128000" : "1000000"; + bandwidth_str = (par->codec_type == AVMEDIA_TYPE_AUDIO) ? "128000" : "1000000"; } else { return AVERROR(EINVAL); } - avio_printf(s->pb, " bandwidth=\"%s\"", bandwidth_str); - if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && output_width) - avio_printf(s->pb, " width=\"%d\"", stream->codecpar->width); - if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && output_height) - avio_printf(s->pb, " height=\"%d\"", stream->codecpar->height); - if (stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && output_sample_rate) - avio_printf(s->pb, " audioSamplingRate=\"%d\"", stream->codecpar->sample_rate); + avio_printf(pb, " bandwidth=\"%s\"", bandwidth_str); + if (par->codec_type == AVMEDIA_TYPE_VIDEO && output_width) + avio_printf(pb, " width=\"%d\"", par->width); + if (par->codec_type == AVMEDIA_TYPE_VIDEO && output_height) + avio_printf(pb, " height=\"%d\"", par->height); + if (par->codec_type == AVMEDIA_TYPE_AUDIO && output_sample_rate) + avio_printf(pb, " audioSamplingRate=\"%d\"", par->sample_rate); if (w->is_live) { // For live streams, Codec and Mime Type always go in the Representation tag. - avio_printf(s->pb, " codecs=\"%s\"", get_codec_name(stream->codecpar->codec_id)); - avio_printf(s->pb, " mimeType=\"%s/webm\"", - stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ? "video" : "audio"); + avio_printf(pb, " codecs=\"%s\"", get_codec_name(par->codec_id)); + avio_printf(pb, " mimeType=\"%s/webm\"", + par->codec_type == AVMEDIA_TYPE_VIDEO ? "video" : "audio"); // For live streams, subsegments always start with key frames. So this // is always 1. - avio_printf(s->pb, " startsWithSAP=\"1\""); - avio_printf(s->pb, ">"); + avio_printf(pb, " startsWithSAP=\"1\""); + avio_printf(pb, ">"); } else { - AVDictionaryEntry *irange = av_dict_get(stream->metadata, INITIALIZATION_RANGE, NULL, 0); - AVDictionaryEntry *cues_start = av_dict_get(stream->metadata, CUES_START, NULL, 0); - AVDictionaryEntry *cues_end = av_dict_get(stream->metadata, CUES_END, NULL, 0); - AVDictionaryEntry *filename = av_dict_get(stream->metadata, FILENAME, NULL, 0); + AVDictionaryEntry *irange = av_dict_get(st->metadata, INITIALIZATION_RANGE, NULL, 0); + AVDictionaryEntry *cues_start = av_dict_get(st->metadata, CUES_START, NULL, 0); + AVDictionaryEntry *cues_end = av_dict_get(st->metadata, CUES_END, NULL, 0); + AVDictionaryEntry *filename = av_dict_get(st->metadata, FILENAME, NULL, 0); if (!irange || !cues_start || !cues_end || !filename) return AVERROR(EINVAL); - avio_printf(s->pb, ">\n"); - avio_printf(s->pb, "%s\n", filename->value); - avio_printf(s->pb, "pb, " indexRange=\"%s-%s\">\n", cues_start->value, cues_end->value); - avio_printf(s->pb, "pb, " range=\"0-%s\" />\n", irange->value); - avio_printf(s->pb, "\n"); + avio_printf(pb, ">\n"); + avio_printf(pb, "%s\n", filename->value); + avio_printf(pb, "\n", cues_start->value, cues_end->value); + avio_printf(pb, "\n", irange->value); + avio_printf(pb, "\n"); } - avio_printf(s->pb, "\n"); + avio_printf(pb, "\n"); return 0; } /* * Checks if width of all streams are the same. Returns 1 if true, 0 otherwise. */ -static int check_matching_width(AVFormatContext *s, AdaptationSet *as) { +static int check_matching_width(AVFormatContext *s, const AdaptationSet *as) +{ int first_width, i; if (as->nb_streams < 2) return 1; first_width = s->streams[as->streams[0]]->codecpar->width; @@ -228,7 +237,8 @@ static int check_matching_width(AVFormatContext *s, AdaptationSet *as) { /* * Checks if height of all streams are the same. Returns 1 if true, 0 otherwise. */ -static int check_matching_height(AVFormatContext *s, AdaptationSet *as) { +static int check_matching_height(AVFormatContext *s, const AdaptationSet *as) +{ int first_height, i; if (as->nb_streams < 2) return 1; first_height = s->streams[as->streams[0]]->codecpar->height; @@ -241,7 +251,8 @@ static int check_matching_height(AVFormatContext *s, AdaptationSet *as) { /* * Checks if sample rate of all streams are the same. Returns 1 if true, 0 otherwise. */ -static int check_matching_sample_rate(AVFormatContext *s, AdaptationSet *as) { +static int check_matching_sample_rate(AVFormatContext *s, const AdaptationSet *as) +{ int first_sample_rate, i; if (as->nb_streams < 2) return 1; first_sample_rate = s->streams[as->streams[0]]->codecpar->sample_rate; @@ -251,7 +262,8 @@ static int check_matching_sample_rate(AVFormatContext *s, AdaptationSet *as) { return 1; } -static void free_adaptation_sets(AVFormatContext *s) { +static void free_adaptation_sets(AVFormatContext *s) +{ WebMDashMuxContext *w = s->priv_data; int i; for (i = 0; i < w->nb_as; i++) { @@ -289,8 +301,10 @@ static int write_adaptation_set(AVFormatContext *s, int as_index) { WebMDashMuxContext *w = s->priv_data; AdaptationSet *as = &w->as[as_index]; - AVCodecParameters *par = s->streams[as->streams[0]]->codecpar; + const AVStream *st = s->streams[as->streams[0]]; + AVCodecParameters *par = st->codecpar; AVDictionaryEntry *lang; + AVIOContext *pb = s->pb; int i; static const char boolean[2][6] = { "false", "true" }; int subsegmentStartsWithSAP = 1; @@ -301,30 +315,31 @@ static int write_adaptation_set(AVFormatContext *s, int as_index) // in the Representation tag. int width_in_as = 1, height_in_as = 1, sample_rate_in_as = 1; if (par->codec_type == AVMEDIA_TYPE_VIDEO) { - width_in_as = !w->is_live && check_matching_width(s, as); + width_in_as = !w->is_live && check_matching_width (s, as); height_in_as = !w->is_live && check_matching_height(s, as); } else { sample_rate_in_as = !w->is_live && check_matching_sample_rate(s, as); } - avio_printf(s->pb, "id); - avio_printf(s->pb, " mimeType=\"%s/webm\"", + avio_printf(pb, "id); + avio_printf(pb, " mimeType=\"%s/webm\"", par->codec_type == AVMEDIA_TYPE_VIDEO ? "video" : "audio"); - avio_printf(s->pb, " codecs=\"%s\"", get_codec_name(par->codec_id)); + avio_printf(pb, " codecs=\"%s\"", get_codec_name(par->codec_id)); - lang = av_dict_get(s->streams[as->streams[0]]->metadata, "language", NULL, 0); - if (lang) avio_printf(s->pb, " lang=\"%s\"", lang->value); + lang = av_dict_get(st->metadata, "language", NULL, 0); + if (lang) + avio_printf(pb, " lang=\"%s\"", lang->value); if (par->codec_type == AVMEDIA_TYPE_VIDEO && width_in_as) - avio_printf(s->pb, " width=\"%d\"", par->width); + avio_printf(pb, " width=\"%d\"", par->width); if (par->codec_type == AVMEDIA_TYPE_VIDEO && height_in_as) - avio_printf(s->pb, " height=\"%d\"", par->height); + avio_printf(pb, " height=\"%d\"", par->height); if (par->codec_type == AVMEDIA_TYPE_AUDIO && sample_rate_in_as) - avio_printf(s->pb, " audioSamplingRate=\"%d\"", par->sample_rate); + avio_printf(pb, " audioSamplingRate=\"%d\"", par->sample_rate); - avio_printf(s->pb, " bitstreamSwitching=\"%s\"", + avio_printf(pb, " bitstreamSwitching=\"%s\"", boolean[bitstream_switching(s, as)]); - avio_printf(s->pb, " subsegmentAlignment=\"%s\"", + avio_printf(pb, " subsegmentAlignment=\"%s\"", boolean[w->is_live || subsegment_alignment(s, as)]); for (i = 0; i < as->nb_streams; i++) { @@ -332,12 +347,12 @@ static int write_adaptation_set(AVFormatContext *s, int as_index) CLUSTER_KEYFRAME, NULL, 0); if (!w->is_live && (!kf || !strncmp(kf->value, "0", 1))) subsegmentStartsWithSAP = 0; } - avio_printf(s->pb, " subsegmentStartsWithSAP=\"%d\"", subsegmentStartsWithSAP); - avio_printf(s->pb, ">\n"); + avio_printf(pb, " subsegmentStartsWithSAP=\"%d\"", subsegmentStartsWithSAP); + avio_printf(pb, ">\n"); if (w->is_live) { AVDictionaryEntry *filename = - av_dict_get(s->streams[as->streams[0]]->metadata, FILENAME, NULL, 0); + av_dict_get(st->metadata, FILENAME, NULL, 0); char *underscore_pos, *period_pos; int ret; if (!filename) @@ -345,26 +360,27 @@ static int write_adaptation_set(AVFormatContext *s, int as_index) ret = split_filename(filename->value, &underscore_pos, &period_pos); if (ret) return ret; *underscore_pos = '\0'; - avio_printf(s->pb, "\n", + avio_printf(pb, "\n", par->codec_type == AVMEDIA_TYPE_VIDEO ? "video" : "audio"); - avio_printf(s->pb, "pb, " timescale=\"1000\""); - avio_printf(s->pb, " duration=\"%d\"", w->chunk_duration); - avio_printf(s->pb, " media=\"%s_$RepresentationID$_$Number$.chk\"", + avio_printf(pb, "chunk_duration); + avio_printf(pb, " media=\"%s_$RepresentationID$_$Number$.chk\"", filename->value); - avio_printf(s->pb, " startNumber=\"%d\"", w->chunk_start_index); - avio_printf(s->pb, " initialization=\"%s_$RepresentationID$.hdr\"", + avio_printf(pb, " startNumber=\"%d\"", w->chunk_start_index); + avio_printf(pb, " initialization=\"%s_$RepresentationID$.hdr\"", filename->value); - avio_printf(s->pb, "/>\n"); + avio_printf(pb, "/>\n"); *underscore_pos = '_'; } for (i = 0; i < as->nb_streams; i++) { char buf[25], *representation_id = buf, *underscore_pos, *period_pos; + AVStream *st = s->streams[as->streams[i]]; int ret; if (w->is_live) { AVDictionaryEntry *filename = - av_dict_get(s->streams[as->streams[i]]->metadata, FILENAME, NULL, 0); + av_dict_get(st->metadata, FILENAME, NULL, 0); if (!filename) return AVERROR(EINVAL); ret = split_filename(filename->value, &underscore_pos, &period_pos); @@ -375,8 +391,7 @@ static int write_adaptation_set(AVFormatContext *s, int as_index) } else { snprintf(buf, sizeof(buf), "%d", w->representation_id++); } - ret = write_representation(s, s->streams[as->streams[i]], - representation_id, !width_in_as, + ret = write_representation(s, st, representation_id, !width_in_as, !height_in_as, !sample_rate_in_as); if (ret) return ret; if (w->is_live) From patchwork Sat Jul 18 00:19: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: 21153 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 83A1B449F78 for ; Sat, 18 Jul 2020 03:19:59 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6AA9F68B6D7; Sat, 18 Jul 2020 03:19:59 +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 E9AC268B6BA for ; Sat, 18 Jul 2020 03:19:51 +0300 (EEST) Received: by mail-ej1-f68.google.com with SMTP id dp18so12649967ejc.8 for ; Fri, 17 Jul 2020 17:19:51 -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=yfk2oyT5QzgbDxoL49v5Zltf5yN5S6qLoUYInKYN17k=; b=bLGTgzBXF+k2Ei6HzJzMVibPYRbmfulFzekvsp67gZG+Gl0QN62DLMgALdAbO1ZFX+ CkD5/Q/AN3GmT//mFX4xTeCgK7HXBMdp/Qy1IQ86rMu/MITlQ00ljeGjHkNX6hgZCwqk Oamo0iRMS5/uwVGu2OZp3VuVQcgvMSHGFtXP4Fetwlr+I13XHx60iWRObtTo4XifAteh l79FUeDXRebBmXpQOQaXmeuK1+PBeMWEteQhUxfpQRuid4WrF7aOOKn2mLdiLb8BY/VC pFgSlBKsyvS3gDCEgEXCQp6F1Uvo6mksw3mzMJJV0DTekrINYmsWbASgt8x1g8IED7Ry J53w== 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=yfk2oyT5QzgbDxoL49v5Zltf5yN5S6qLoUYInKYN17k=; b=lHzuOvbGL460N8g0NZcU0SBpQ90FR6T5i1QLekxCl9tXzXV6grcg4sXumLWMHevE9n 61BYAbSCAmLt0vUPC9+3EmkBHmZfpBCo+HhXEDgsEw8Rhg+B46GMY2JI5T0b2tOeM2y9 j//Ju4szg9k4S0tTuyZ3VNN4sFULOakdNRsIP6sD7ALFsZPAAUAyA6OgbU9K03WQkVDf pm6nyuSvTOQo2LKCeLwD+ihV3O5Gm5+aq+KygnUC83sBc+rIxkSk6NhqEwjv2g+hUL1u dqSIDhWTI2v1GHfFp7Dun8xLbReBDVmPiPUF7lcB4+fG0aBEWSHMa//2wRO5f+6pkukC Tm6w== X-Gm-Message-State: AOAM530eaGgsRzxDudIDaU1rGV5ise5StPHBMpI8HtKzomOc+88DxbDl V/cPGKVeiJgZRgOdAxkJXhJdbGTW X-Google-Smtp-Source: ABdhPJzIDIpQBpkGETwEBHDyCxIIUg36EJ62/uGVJzqv7N1W5ZvLnnaee9XJ/6QdAkzbfJWnqzl/ZQ== X-Received: by 2002:a17:906:cecf:: with SMTP id si15mr10823695ejb.508.1595031591053; Fri, 17 Jul 2020 17:19:51 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id y7sm9299001ejd.73.2020.07.17.17.19.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2020 17:19:50 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Jul 2020 02:19:22 +0200 Message-Id: <20200718001928.10603-4-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> References: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 05/11] avformat/daudenc: Turn write_header function into init function 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" daud_write_header() doesn't write anything. Signed-off-by: Andreas Rheinhardt --- libavformat/daudenc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavformat/daudenc.c b/libavformat/daudenc.c index 15a5afdfc9..0d8d830a67 100644 --- a/libavformat/daudenc.c +++ b/libavformat/daudenc.c @@ -21,7 +21,7 @@ #include "avformat.h" -static int daud_write_header(struct AVFormatContext *s) +static int daud_init(struct AVFormatContext *s) { AVCodecParameters *par = s->streams[0]->codecpar; if (par->channels!=6 || par->sample_rate!=96000) @@ -48,7 +48,7 @@ AVOutputFormat ff_daud_muxer = { .extensions = "302", .audio_codec = AV_CODEC_ID_PCM_S24DAUD, .video_codec = AV_CODEC_ID_NONE, - .write_header = daud_write_header, + .init = daud_init, .write_packet = daud_write_packet, .flags = AVFMT_NOTIMESTAMPS, }; From patchwork Sat Jul 18 00:19:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21154 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 3FEF3449F78 for ; Sat, 18 Jul 2020 03:20:01 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2B04868B6DF; Sat, 18 Jul 2020 03:20:01 +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 41B4168B6C0 for ; Sat, 18 Jul 2020 03:19:53 +0300 (EEST) Received: by mail-ej1-f68.google.com with SMTP id dp18so12650001ejc.8 for ; Fri, 17 Jul 2020 17:19:53 -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=e/PiQFA2jKGopHsCohVb0H2pmLpA+io8R0G9IPCx6CM=; b=Cqb1ceP8wgtwcNMGkfHelvEnbQ6oJ11yT5R1N//i7fBwBbrbHCW8e6rF2B/lSEPA0j vpdbPKS20wMM1SSZKMxNgkVL6M/coxtUO5iOpmorbFRMT90oEa7xv73WX+MsIHIZuCIl +7JdLN47cvGqOuN+lzfYvgsxNVT+iITQPbWUWbJibege6Cy6FxAo1b8jlWXk9MAAWhiH KPeYuvn75gdvLx90OUNqqEm9Sm0h/JolNy0XBPV90bkfPU0QhbaEO4Qh5SP0AAGtQMct hPGarwIvQ9FHiJYGuccEjEZ5tbdsMUgrAaniPxeI4UsFg8aKO0dbav+nybIoEmvd0WpD oZGw== 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=e/PiQFA2jKGopHsCohVb0H2pmLpA+io8R0G9IPCx6CM=; b=FVEvbkqaOM5gMg4smp0IXk9sR+mPbHEFF6RJxUmfYdSdQPUmhLZx8obl/0Wh6AacE1 C+gOOqyATsrbaSPwonrsAgU9G/8bgHkpMenZj0BA2WAKHLuxYhWJDT/t7fyKEfunTIbr 1htNIOsFZ+Qt5FemLwQM9xbDqVsNlxVgbZaqjzS5GGKK7cOE0RkPXXHSg5jOpXE4puKO Drb1+pUNoHz6G7JMuVQ1H6/WYuvKIglKhMBnpw69PJtysZN31xV5NPsAcVLmFSgr7CLE b4JxZ7GlSViXCPqzFU8xGeJOda62f7Ysf6m0jJetltWWSHbYidAYY/rj8RjZyLHMXIWX +ACA== X-Gm-Message-State: AOAM5300WOnFK7HPbxxlGts8Z/zvk74vPgCsUoXmyxR9i3gF3CFx2rNm Z1EnxisdjRuHYWcZsZPR2dVY8nyL X-Google-Smtp-Source: ABdhPJwTlUMDtrqJn0jj9vmCOSraotA37hwZst+qnzK/5cfF3SQo1PlyuJqaawO1AYnv8ZmI8+5l+g== X-Received: by 2002:a17:906:6a4f:: with SMTP id n15mr10798824ejs.378.1595031592477; Fri, 17 Jul 2020 17:19:52 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id y7sm9299001ejd.73.2020.07.17.17.19.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2020 17:19:51 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Jul 2020 02:19:23 +0200 Message-Id: <20200718001928.10603-5-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> References: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 06/11] avformat/daudenc: Return proper error codes instead if -1 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/daudenc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavformat/daudenc.c b/libavformat/daudenc.c index 0d8d830a67..b489659a80 100644 --- a/libavformat/daudenc.c +++ b/libavformat/daudenc.c @@ -25,7 +25,7 @@ static int daud_init(struct AVFormatContext *s) { AVCodecParameters *par = s->streams[0]->codecpar; if (par->channels!=6 || par->sample_rate!=96000) - return -1; + return AVERROR(EINVAL); return 0; } @@ -34,7 +34,7 @@ static int daud_write_packet(struct AVFormatContext *s, AVPacket *pkt) if (pkt->size > 65535) { av_log(s, AV_LOG_ERROR, "Packet size too large for s302m. (%d > 65535)\n", pkt->size); - return -1; + return AVERROR_INVALIDDATA; } avio_wb16(s->pb, pkt->size); avio_wb16(s->pb, 0x8010); // unknown From patchwork Sat Jul 18 00:19:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21156 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:80ca:0:0:0:0:0 with SMTP id c10csp42785ybm; Fri, 17 Jul 2020 17:20:37 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwagbrVaZTS9UBwWvJrMaTrOcpiiwBX0Rfi1NgH5djs1KNNNMc4CwhYHo6vQZiqPJRN1L81 X-Received: by 2002:a1c:a7ca:: with SMTP id q193mr11651706wme.69.1595031637579; Fri, 17 Jul 2020 17:20:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595031637; cv=none; d=google.com; s=arc-20160816; b=MBBtPxeNZ88tBeySyWstzJXkjHV7nfS0SploXoKNjtU80HBgfGc8MghmyqSfsdl0wM iuc2EVLrumgLXR5KyvNv5mHfuJrsxKH8l9XoajSRQIvx5kmuNdct9Qo2QQ2sFoFaKsW5 9Z0EecNpLmrwAEOgYH80yckQzlLZfZeNZlfMmp/RW69rtOfRiuVxiib8Q2gJgDK8sFf1 RJ1RHh7/Jxr3hcemZ5dIASDVGd0n03S5NZh6L39POdrkjQz3iDIj/CqLz2OWZQuaeYeo vgXqXtSjdkrlx5nT+3+k45iYWFRBl36BYSBa73s+/SZj7F/zvCW9iCCvF5dn251pu3ek e5iQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=EJsfPtcaEBpcIl2MWkL+H2NYDkBNGoRvayTw7VKht/w=; b=pKBh/UOfKr2Rm4a8dQt+RrFVVJdfHkkozQdZDeJQfPBX3brZXyAhqxQSykZO0i4wJV 2lsFWRR51EWdsaotXtKoLKAIaFNyTJDgMlJnR+qtgVrLkMBzWaSCS9TzhHAA0MupcBH+ G5eLZr4P6PGKTwC7GnC1aL5NxfjBwk/1WusC5IzF/ViNSGtbuBS2yh2xtuE/yRYz87NV 04H7t9v+FhOFyt3sXSeY7qV2xLYzgYPveJ3iLVDsQWdtNS2OHLEFOXq6QUYgiq8c0imJ JXdfpmRdLD1kpJcr7nsuYCLt0/Y+FZuSew5qRR57y8VL4eCto4AUbbos8eA06SdnTsj/ Onag== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=FMLALX7p; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id i10si8241224wrn.95.2020.07.17.17.20.37; Fri, 17 Jul 2020 17:20:37 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=FMLALX7p; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 42FB868B6F4; Sat, 18 Jul 2020 03:20:02 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f68.google.com (mail-ed1-f68.google.com [209.85.208.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6CFF968B6DB for ; Sat, 18 Jul 2020 03:19:54 +0300 (EEST) Received: by mail-ed1-f68.google.com with SMTP id by13so9003808edb.11 for ; Fri, 17 Jul 2020 17:19:54 -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=8cPnYDRJFmnC3JaBWjGdQkJbG6EoFV9dMaD0bowqW9U=; b=FMLALX7pTNcywFJ1gy87qpV1guVZ/HTi4XguzifPI46k+yeET9NCFy3NIIB6LgFY69 E+eHJO/ctsiiUn4tz7vKtexYDa3LZFXBexZnThqNjzqYINGiYc7VPbAAEGbrjg99/wAS 6wO+2O7/9Ub8+QDjx6uU1GYtf2UlPRCrrLw+HPmxOce/FQ8fthBgbRDoNEAfidleixkc xtBpjM80JVZXPA5oDqtw/P6pna/i3db/SeNaeqKDmwVXb6I7Ux5q3XryKFFeZ9RbGHXx dA9wp29osuPkFnGabWaOA3xJRBap05Z+FdFaYqWIizjtJJiaYGarPZ/Pu/OT0xn/wYJy n3HQ== 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=8cPnYDRJFmnC3JaBWjGdQkJbG6EoFV9dMaD0bowqW9U=; b=YKcAnw/J9/R/BYmgSL/ROagCGzSVUaxoQ/5vIl/XoIO15ACdOupRUeOLlDKHJ/Mj/V a2/HG0WgYWdOzisvJkoGtN0+uXbcMIJeLKTvUk5+7b/t89lXsnatgAyHl5AAsebGazsW F3Q3JBsW0z0aLOGbaTD6Jra7dcVycCdDSE4+rdjYCug9tMR3nA3oppsNgt5amIaHcrEI fwWNwS+LdJ6ygmJfTY0kdR9tAfo0OODhHfMuCn3c5yFhZDVkfH4JluxTkjLWIrR9YUIU 0KyBMDx7eKE+IEyENzhLMNlJb+a/veorRePsi0hxhj9N2s/gCGhlj1z0tuGEG4rp8Q1a b25Q== X-Gm-Message-State: AOAM5310DPNCtI2jyRR1xp2r12ydJP1Ii3hm/sW2GZgF+mrCo+YhpTsl HzkHAi75YqL1mlkHAcoWNopZqsg3 X-Received: by 2002:a05:6402:377:: with SMTP id s23mr11981527edw.200.1595031593552; Fri, 17 Jul 2020 17:19:53 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id y7sm9299001ejd.73.2020.07.17.17.19.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2020 17:19:53 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Jul 2020 02:19:24 +0200 Message-Id: <20200718001928.10603-6-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> References: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 07/11] avformat/segafilm: Reorder elements of struct to make it smaller 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" X-TUID: lX9uPsGzE0ky Content-Length: 1030 Signed-off-by: Andreas Rheinhardt --- libavformat/segafilm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/segafilm.c b/libavformat/segafilm.c index 777606bcb6..4d14b81d16 100644 --- a/libavformat/segafilm.c +++ b/libavformat/segafilm.c @@ -40,8 +40,8 @@ typedef struct film_sample { int stream; - int64_t sample_offset; unsigned int sample_size; + int64_t sample_offset; int64_t pts; int keyframe; } film_sample; From patchwork Sat Jul 18 00:19:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21158 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:80ca:0:0:0:0:0 with SMTP id c10csp42857ybm; Fri, 17 Jul 2020 17:20:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzfCBlKtxZmr4upBr0Uro39jdpVl0l9Z9EeH2wPKxx4R0rhD4Qm0jsBTqbBXScSkdBm3I42 X-Received: by 2002:a05:600c:2c0d:: with SMTP id q13mr11239204wmg.81.1595031650116; Fri, 17 Jul 2020 17:20:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595031650; cv=none; d=google.com; s=arc-20160816; b=sN0yMRWykvc/ntdwfjTmkVcsRr2wQVu+22ovjsWNAmEX9icUEy/eW2TFSYNfkw6fqE fBfpXTiXUmHNfeerJepC7fVcAx+ein+m6vlygZ7mddZ8wnEk9GosjLqlyL2PuRN8/Qzc uNaR+XZiZMjukwvt3j0Wf0mNixXmYC95wQi5eZ3JTrtYLqsRGMQGX/on2sQuoAf01CWz P0CnA2gYxdGqTcIL8NS/UPD7f7wYw2Hbm7osmn3A1q5n0zCHIEDURa9HW6WmJexgEI5C qQjTo+02r98FYllgRK7SKJWPqPkD2WZtfYTnPQfwwfeVDWAyeJYmfmSzHQZGRDGeUZdT nTUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=md6MpMjO4BmSaSXnovcH85YzcW3fd6o0BLCa7qITvOw=; b=cDDWT14fwN1FH/+EDfktGwtiFT/vAdKVddWV5d8Q6QesZoAb7NlFlhp12/SnhhQLkR NCMORqryWojWibwcJhZw/VTn2ZIEE2NwA09TZa2h89Eta4TRW9HmzX8wsYu5LZCqaMkU +5Db+JqUxU4iDpVFQpaKU1S/1Zq2iSsk+6m6QJ/vCvzLyEhy3GFdNOyLlpw4yrfoXzof ax8qGSkrT8OkvYINzQZ6bC8IBH44qEkVabgBFfz0GPp1Zf3WYOCs2VuM3VbbzOtaV9V5 WRP4XXEQp8qr2BrAx/1sI4qLHeqLPPkRbiZvXF2mkk6lJx1fW4s0E9sq8jftVSGtGtSF 0slA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=twfSwcO0; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id v5si7646492wrm.21.2020.07.17.17.20.49; Fri, 17 Jul 2020 17:20:50 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=twfSwcO0; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8014F68B70E; Sat, 18 Jul 2020 03:20:03 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f65.google.com (mail-ej1-f65.google.com [209.85.218.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 549B668B6D1 for ; Sat, 18 Jul 2020 03:19:55 +0300 (EEST) Received: by mail-ej1-f65.google.com with SMTP id rk21so12708067ejb.2 for ; Fri, 17 Jul 2020 17:19:55 -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=x6G+eascmTi6hU2nT8O/OzWlE2ynpEVroLdsh0Vo3O8=; b=twfSwcO0sKiDb5OUPP9ImDaE1awoBZ+e7xPj4bejoUl4ZmOFxaes/fbe3Ai2ONEnia rflJLTNKd/rAhwITAupd3Jk3XOa9MUlzjKSK0D6WH3JJikWHj9/cAh48Xx+LK7HvuRoe ZutdmIR9ZxaduGspGRY0DlRiJNv9iQk4qMWQAy8fQxr7lJWw8ltxX0NZbn8o1r2T4Urf tdkphENv7Zf0Lpp+Nn491rGDAVlL/dHm5NxALWc8Voq7l9FWS1zu+QRUGpTCUM9tgqQT KUo1hmx4K6EzMhT5VDBwL/zK2JLMjE59Df5CVtl22d4geix92j2z21oWOWRlM7V0tRB+ WICQ== 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=x6G+eascmTi6hU2nT8O/OzWlE2ynpEVroLdsh0Vo3O8=; b=pUG/6nUECfDD1o0UtrD3X+nIno44LSxogLpZuua7uJrWbDfM4vopE4t7jULbh0aaZz 4nhzHDXGUvSyIBSx78MHkYaRQk7PtQCBe7IxuY2E+wdi5HKGWVOTzG9Q7Sgjml911BQS 5cBR7/+eLYHu3CjBLfBkRMiL1y1s6vYIahedESSSdU/VhLofXB0zvEMxNPSddDNjmuen kYb1eHXvHBmDzruEXJpKlzyM3kSg0UEod6rzbfduhkFIh6NEpCRKVW9a1NpWGM4wMLde yiUR1h5y7StqiKwHTWTGQbusjI7HqrfY/S6a1wH8gieBf1mEXeIN7oe6k9L6pNXHrpJj Vd2w== X-Gm-Message-State: AOAM531xGWODW84puVwTvw3xzDcu4mAkuUXFuEeuaIeCEEBQHLenW6Gi XcXQICeQxsMpDTIIFdAnJvxETQdr X-Received: by 2002:a17:906:899:: with SMTP id n25mr10378982eje.298.1595031594473; Fri, 17 Jul 2020 17:19:54 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id y7sm9299001ejd.73.2020.07.17.17.19.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2020 17:19:53 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Jul 2020 02:19:25 +0200 Message-Id: <20200718001928.10603-7-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> References: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 08/11] avformat/segafilmenc: Remove write-only variable 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" X-TUID: byzLdU3UYGJi Content-Length: 1463 Signed-off-by: Andreas Rheinhardt --- libavformat/segafilmenc.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/libavformat/segafilmenc.c b/libavformat/segafilmenc.c index 93c482ef7d..e144da4e68 100644 --- a/libavformat/segafilmenc.c +++ b/libavformat/segafilmenc.c @@ -47,7 +47,6 @@ typedef struct FILMPacket { typedef struct FILMOutputContext { int audio_index; int video_index; - int64_t stab_pos; FILMPacket *start; FILMPacket *last; int64_t packet_count; @@ -158,7 +157,6 @@ static int film_init(AVFormatContext *format_context) FILMOutputContext *film = format_context->priv_data; film->audio_index = -1; film->video_index = -1; - film->stab_pos = 0; film->packet_count = 0; film->start = NULL; film->last = NULL; From patchwork Sat Jul 18 00:19:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21157 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:80ca:0:0:0:0:0 with SMTP id c10csp42897ybm; Fri, 17 Jul 2020 17:20:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyMYJtH9lLeilj/wYWKV2+axgnSD+PuIJcDNEHKduq/ZeD4S6D/A2+OUko8MQALtZ7a1KHL X-Received: by 2002:adf:a4cf:: with SMTP id h15mr13586100wrb.229.1595031656110; Fri, 17 Jul 2020 17:20:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595031656; cv=none; d=google.com; s=arc-20160816; b=k8kTXiXATQs9bz6fkfvmblCXRnxVDmVgDhVOXnlBO5qOz1Y+b//+kXDaHCmWWBXSJL LSQGKyhHZoPFaz6Yy3UZg4A2DYuV3bSOtmYB5X9dOQxYNhKtp+idHJRsfeesDCkptIWD 3mpDYLJ8iW7c3bUBppr6QGt647ksxBNxpoYU5FFDtwO7XBsA2Fzq26YuORql90r+psOH 2I9RcDXlIeNGpG3gZfJ4tRBMcf4UzaI4yxLIk0+TnXE19Qjxzaqz2hYGpXzLQMcWMUSJ sto1gnpNMV8vm/6t1NjdUl5C8R5wyScQ71014rk2zk6u5SQff0S45UASWiBVo2o9LKgJ GoqA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=wOJIEo+WFvhXKFUHJ+dcN97Uk/wc50OvnJQC5sLa0rA=; b=NZsWEw/zfQoZi3dX8s8wbBuX3qXtBpm04WiRxV6pPsdKRx4RnYbKE5hKmT74D6QE2V VjvzeMS8UmdWQmcBAeeX6i3UHkNM9T0dbA8vn8eCLgwjKk31dQTj5Yxh1MKaViu6bB3b Ai8bLYdvaNtlupal9Gj44yRhomaWS8JvMdT/fBErSnGOR3m1N8PwJzojEHjAv58e7Jyt gtYMXcfxJJPVvde/9bMubcE8crQ5jtoMwkxNetWFTF0MEGfoLfGj8OCSpZ9XV46OmrUm Z+BNG6HexiPVDg7UhJMaecS4L/1o5uI+7IVQCYMDWJu+NNeNhz8OAA781mqj08s4k7cn WRdg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=I+l+Fvv7; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y9si8347609wrq.522.2020.07.17.17.20.55; Fri, 17 Jul 2020 17:20:56 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=I+l+Fvv7; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E572168B6F5; Sat, 18 Jul 2020 03:20:03 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f66.google.com (mail-ed1-f66.google.com [209.85.208.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8D75368B6E2 for ; Sat, 18 Jul 2020 03:19:56 +0300 (EEST) Received: by mail-ed1-f66.google.com with SMTP id e22so9018193edq.8 for ; Fri, 17 Jul 2020 17:19:56 -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=nRmGZmMkIz0o63GIXDhAmkatk1X1CvFw00VN5S1BVKw=; b=I+l+Fvv7jdBPhCzK2yg74y9OAfpApuVBYMFQ7Xx6im5LUuir3v/0/x9uzhGFl6d4w5 4EeCdSqg25YMXS+ejKO+Q6bIdeBwXEbn6BH9zvFbeGaYj9CsvGGpIEkguTTv1UK0NPuV QMWDPBnQyMhWUHghgcGzaMr8MguvnvD5A8LXwawa3pn2uDiM5u01M5/WX+mXx2CVwB/L z8n/jMcfXgNBtTm5ZWK91kEbzKf2tKlTcMwVDU+glR0wWPBwzMcSho/muA2tNkKmu7Mm v/mWQjEsOT1kKTpZPUbl1rFWmvDpw/h6OxYGMvQd10Wd30JWAtVpU7yhb2GjJ9FGnh1r nGXA== 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=nRmGZmMkIz0o63GIXDhAmkatk1X1CvFw00VN5S1BVKw=; b=kVVEu7u2xBR4klEet3hE/ij/ff+1PPtwxKY5Nj5vOhRA5SgeHZZz4W0iPRZSk+ZhtJ IDjeQATJBvOdvtFVZ4y1Ql/Wt9AZp6DvZNPu/mVUseGlXER2cB3hwNuRgZcEjeFBsBDb 8qnST2qiIzFt053K3HTbhRPMdBe2g6Nh+GqzmHzcEneBlV+lKtz2xZE5fe/9dHBXqrjU sXzT9esW3r8/f+v6TgHdvyYvum7BsDaj41nZ4pZEdGL8B8ZQBEdcrWIE8zT13cnqVD70 e+DVOFoJB2noF2NJcPc/aDbor9M8XPKw3HfLn2qzqpi6n6171Z9GZiGlP1Sg3ezVQ/tD orZw== X-Gm-Message-State: AOAM5317QA3CAFCEWG4CsRftQcC0HAOJMIG91CXtpjaXn3PGh/s3lhhb emHMoqoUIFexvFTqVXq1JiQmbb5Y X-Received: by 2002:a05:6402:1c86:: with SMTP id cy6mr11553158edb.30.1595031595630; Fri, 17 Jul 2020 17:19:55 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id y7sm9299001ejd.73.2020.07.17.17.19.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2020 17:19:55 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Jul 2020 02:19:26 +0200 Message-Id: <20200718001928.10603-8-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> References: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 09/11] avformat/segafilmenc: Simplify writing two bytes 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" X-TUID: HdyCv0sZhhmD Content-Length: 2043 Use avio_wb16() instead of avio_write() to write two zero bytes. Signed-off-by: Andreas Rheinhardt --- libavformat/segafilmenc.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libavformat/segafilmenc.c b/libavformat/segafilmenc.c index e144da4e68..d935caf00d 100644 --- a/libavformat/segafilmenc.c +++ b/libavformat/segafilmenc.c @@ -119,7 +119,6 @@ static int film_write_packet(AVFormatContext *format_context, AVPacket *pkt) if (encoded_buf_size != pkt->size && (pkt->size % encoded_buf_size) != 0) { avio_write(pb, pkt->data, pkt->size); } else { - uint8_t padding[2] = {0, 0}; /* In Sega Cinepak, the reported size in the Cinepak header is * 8 bytes too short. However, the size in the STAB section of the header * is correct, taking into account the extra two bytes. */ @@ -127,7 +126,7 @@ static int film_write_packet(AVFormatContext *format_context, AVPacket *pkt) metadata->size += 2; avio_write(pb, pkt->data, 10); - avio_write(pb, padding, 2); + avio_wb16(pb, 0); avio_write(pb, &pkt->data[10], pkt->size - 10); } } else { From patchwork Sat Jul 18 00:19:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21160 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:80ca:0:0:0:0:0 with SMTP id c10csp42995ybm; Fri, 17 Jul 2020 17:21:09 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxLum+TVLNuji6LhXVhKgX35TMjo7X208tjcTUzLTd8aaJEpzjfo7V+iU13Y5w0GCLG62Ml X-Received: by 2002:a1c:4185:: with SMTP id o127mr11413153wma.8.1595031668967; Fri, 17 Jul 2020 17:21:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595031668; cv=none; d=google.com; s=arc-20160816; b=U+mq8HUU5NwkuBXEbcpUZLnlr4k1470JzN78H8YBSTCmjCIUcMaLJfsFPAkuxfpqRF uE2c52BPtf3UD0w/47wF3XCSC30i1tKhAD09y/NayC5odQAcEy6rYPTBy0QnA/bDoZU2 IEevMd77xtA8MEN4vQ57UPbIqbd5IQOL6C+nbDjtpxM0wbbRKzPxmJhu5HVc5SnIE9Sw SJAyH/YDcDIO+4xDsc/uqgrP2g1owLPOkNCi0lOmqnZMbZZfo24MXe7JUNGAkOaahy65 xBxE5jy5frQii5AM7gpUfbAfBbBQ6VK26r0mvUGiTFiLpLnXfjVD7tWHK8KUMam7OSdV FgeQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=zvJiCZhQTB2Y5+ds3IXydonOEGuLzsQkdlTv4GQhSQk=; b=gAfoqBQGockN3g7JTddJ1AxcE+392PwZLyJ1OcwQXH0EYRpI4JV0AvySUu6ZQVeDeT FeMiVyCYlDprIUYBU5gfIo0Y1NtzFRcscTmPPV5LMt6JvNTmBnmM5ekD2j6b4hW8gMdd cQDW23rbS3B3yfByTb3I5CV8ZtHSBVX9qrjHI9Nf8x028aIzuP/Z/1OhsESyh6FoLNGe tUXKuu0iK3syLKWiQ5vDF8Rf/XhlT++TcfFcw2EBPxDupEOnh9nlDgmysvBBB+46i/CA sq3is0t27L+Hv117ZBwG6QPihP7C4nNqd3V8Zd8OtAVHJ6tYj6T4WaBDTsIatg1ErX5Q MxOw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=FK8bqkIO; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id h9si9204455wml.155.2020.07.17.17.21.08; Fri, 17 Jul 2020 17:21:08 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=FK8bqkIO; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2102968B6C2; Sat, 18 Jul 2020 03:20:05 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f47.google.com (mail-ed1-f47.google.com [209.85.208.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8791568B6F5 for ; Sat, 18 Jul 2020 03:19:57 +0300 (EEST) Received: by mail-ed1-f47.google.com with SMTP id a8so9043837edy.1 for ; Fri, 17 Jul 2020 17:19:57 -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=KdP52qx6A0bQYd8MLhyn9wvXr4GdWijiH/qDXEmDQpk=; b=FK8bqkIONO0K7dp5wtadiKfW3FpB/gzEznowVc/7FGH4Kig3q51GpKx0GgsT9Q/rym InbuzMpyYtA7Cs1igHew0KGpAdc0GqtqlybdAOFbXPEhFXITdjyOYm1qf8AiWJtwMy+S RgASTcnc3YfPQDTDEu6DKeKFqU9u44Afhwq7DdPHICUFhq+qjFH1BXLIrPHNEQnGtYTO hcEv3mTqkDx3/92Rd2LZmL/N1WqbFtyzuFbyrvNSeovaEJDNkYO7Rwh7bxKGzxeWO9nm +xBfnn1Z5TiKUE5AguYyfHyyeuURoSg9Uobuc+USRgA1euzItxy6hgUIdy8F/rg6k9FJ BTpQ== 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=KdP52qx6A0bQYd8MLhyn9wvXr4GdWijiH/qDXEmDQpk=; b=gucenLJy+h3VoumXo4Y2kPPCAaqxCR31SjRVrHV+gofD4ip2zb5LxpAL5ArzrDSS9e 30J1qQAFkhhTqv7ILpXK70NhE4GZKhLYMLVKTo9ukScVu8kKSxsdFDe9lasdBZPyV2TE wi5xI8RiWKGJ2eIr7m4d1HQwne7hwfTTZfCWYle0a747NsNSr38cOLtuDFe26FyHQ31E DzLnESULF19hyYAAg3Pii8IcwxbcPntp1BgTto4jhf0jVc8qoWC1bjE/X22g6nr006T+ FPWW2kqJSFxvbnH7GXpbLWACgdi4nCI+R6YKFZcZUTONDKOwrC6w6meJDku+J0U3mLIk EC3g== X-Gm-Message-State: AOAM531RkPMlI7Af/ISUy3KOisJbzUM2AvJ0RKlax4xp6TtCcw0YnJZp s9UaoEfBiI6Eqtt8IBiwVsyhtinr X-Received: by 2002:a50:f392:: with SMTP id g18mr11476688edm.151.1595031596590; Fri, 17 Jul 2020 17:19:56 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id y7sm9299001ejd.73.2020.07.17.17.19.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2020 17:19:56 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Jul 2020 02:19:27 +0200 Message-Id: <20200718001928.10603-9-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> References: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 10/11] avformat/segafilmenc: Don't store packet info in linked list 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" X-TUID: KIibsHB6jiUX Content-Length: 11810 Up until now, the Sega FILM muxer would store some information about each packet in a linked list. When writing the trailer, the information in said linked list would be used to write a table in the file header. Each entry in said table is 16 bytes long, but each entry of the linked list is 32 bytes long (assuming 64 bit pointer and no padding). Therefore it makes sense to remove the linked list and write the array entries directly into a dynamic buffer while writing the packet (this is possible because the table entries don't depend on any information not available when writing the packet (the offset is not relative to the beginning of the file, but to the end of the table). This also simplifies writing the array at the end (there is no need to traverse a linked list). Signed-off-by: Andreas Rheinhardt --- libavformat/segafilmenc.c | 129 ++++++++++++-------------------------- 1 file changed, 40 insertions(+), 89 deletions(-) diff --git a/libavformat/segafilmenc.c b/libavformat/segafilmenc.c index d935caf00d..11ed279a05 100644 --- a/libavformat/segafilmenc.c +++ b/libavformat/segafilmenc.c @@ -34,81 +34,21 @@ #include "internal.h" #include "avio_internal.h" -typedef struct FILMPacket { - int audio; - int keyframe; - int32_t pts; - int32_t duration; - int32_t size; - int32_t index; - struct FILMPacket *next; -} FILMPacket; - typedef struct FILMOutputContext { + AVIOContext *header; + unsigned index; int audio_index; int video_index; - FILMPacket *start; - FILMPacket *last; - int64_t packet_count; } FILMOutputContext; -static int film_write_packet_to_header(AVFormatContext *format_context, FILMPacket *pkt) -{ - AVIOContext *pb = format_context->pb; - /* The bits in these two 32-bit integers contain info about the contents of this sample */ - int32_t info1 = 0; - int32_t info2 = 0; - - if (pkt->audio) { - /* Always the same, carries no more information than "this is audio" */ - info1 = 0xFFFFFFFF; - info2 = 1; - } else { - info1 = pkt->pts; - info2 = pkt->duration; - /* The top bit being set indicates a key frame */ - if (!pkt->keyframe) - info1 |= 1U << 31; - } - - /* Write the 16-byte sample info packet to the STAB chunk in the header */ - avio_wb32(pb, pkt->index); - avio_wb32(pb, pkt->size); - avio_wb32(pb, info1); - avio_wb32(pb, info2); - - return 0; -} - static int film_write_packet(AVFormatContext *format_context, AVPacket *pkt) { - FILMPacket *metadata; AVIOContext *pb = format_context->pb; FILMOutputContext *film = format_context->priv_data; - int encoded_buf_size = 0; + int encoded_buf_size, size = pkt->size; + uint32_t info1, info2; enum AVCodecID codec_id; - /* Track the metadata used to write the header and add it to the linked list */ - metadata = av_mallocz(sizeof(FILMPacket)); - if (!metadata) - return AVERROR(ENOMEM); - metadata->audio = pkt->stream_index == film->audio_index; - metadata->keyframe = pkt->flags & AV_PKT_FLAG_KEY; - metadata->pts = pkt->pts; - metadata->duration = pkt->duration; - metadata->size = pkt->size; - if (film->last == NULL) { - metadata->index = 0; - } else { - metadata->index = film->last->index + film->last->size; - film->last->next = metadata; - } - metadata->next = NULL; - if (film->start == NULL) - film->start = metadata; - film->packet_count++; - film->last = metadata; - codec_id = format_context->streams[pkt->stream_index]->codecpar->codec_id; /* Sega Cinepak has an extra two-byte header; write dummy data there, @@ -123,7 +63,7 @@ static int film_write_packet(AVFormatContext *format_context, AVPacket *pkt) * 8 bytes too short. However, the size in the STAB section of the header * is correct, taking into account the extra two bytes. */ AV_WB24(&pkt->data[1], pkt->size - 8 + 2); - metadata->size += 2; + size += 2; avio_write(pb, pkt->data, 10); avio_wb16(pb, 0); @@ -134,7 +74,27 @@ static int film_write_packet(AVFormatContext *format_context, AVPacket *pkt) avio_write(pb, pkt->data, pkt->size); } - return 0; + /* Add the 16-byte sample info entry to the dynamic buffer + * for the STAB chunk in the header */ + pb = film->header; + avio_wb32(pb, film->index); + film->index += size; + avio_wb32(pb, size); + if (film->audio_index == pkt->stream_index) { + /* Always the same, carries no more information than "this is audio" */ + info1 = 0xFFFFFFFF; + info2 = 1; + } else { + info1 = pkt->pts; + info2 = pkt->duration; + /* The top bit being set indicates a key frame */ + if (!(pkt->flags & AV_PKT_FLAG_KEY)) + info1 |= 1U << 31; + } + avio_wb32(pb, info1); + avio_wb32(pb, info2); + + return pb->error; } static int get_audio_codec_id(enum AVCodecID codec_id) @@ -154,11 +114,10 @@ static int get_audio_codec_id(enum AVCodecID codec_id) static int film_init(AVFormatContext *format_context) { FILMOutputContext *film = format_context->priv_data; + int ret; + film->audio_index = -1; film->video_index = -1; - film->packet_count = 0; - film->start = NULL; - film->last = NULL; for (int i = 0; i < format_context->nb_streams; i++) { AVStream *st = format_context->streams[i]; @@ -199,6 +158,8 @@ static int film_init(AVFormatContext *format_context) av_log(format_context, AV_LOG_ERROR, "No video stream present.\n"); return AVERROR(EINVAL); } + if ((ret = avio_open_dyn_buf(&film->header)) < 0) + return ret; return 0; } @@ -263,15 +224,17 @@ static int shift_data(AVFormatContext *format_context, int64_t shift_size) static int film_write_header(AVFormatContext *format_context) { int ret = 0; - int64_t sample_table_size, stabsize, headersize; + unsigned sample_table_size, stabsize, headersize, packet_count; AVIOContext *pb = format_context->pb; FILMOutputContext *film = format_context->priv_data; - FILMPacket *prev, *packet; AVStream *video = NULL; + uint8_t *sample_table; /* Calculate how much we need to reserve for the header; * this is the amount the rest of the data will be shifted up by. */ - sample_table_size = film->packet_count * 16; + sample_table_size = avio_get_dyn_buf(film->header, &sample_table); + packet_count = sample_table_size / 16; + sample_table_size = packet_count * 16; stabsize = 16 + sample_table_size; headersize = 16 + /* FILM header base */ 32 + /* FDSC chunk */ @@ -335,7 +298,7 @@ static int film_write_header(AVFormatContext *format_context) /* Finally, write the STAB (sample table) chunk */ ffio_wfourcc(pb, "STAB"); - avio_wb32(pb, 16 + (film->packet_count * 16)); + avio_wb32(pb, stabsize); /* Framerate base frequency. Here we're assuming that the frame rate is even. * In real world Sega FILM files, there are usually a couple of approaches: * a) framerate base frequency is the same as the framerate, and ticks @@ -347,17 +310,10 @@ static int film_write_header(AVFormatContext *format_context) * are incremented by 25 for an evenly spaced framerate of 24fps. */ avio_wb32(pb, av_q2d(av_inv_q(video->time_base))); - avio_wb32(pb, film->packet_count); + avio_wb32(pb, packet_count); /* Finally, write out each packet's data to the header */ - packet = film->start; - while (packet != NULL) { - film_write_packet_to_header(format_context, packet); - prev = packet; - packet = packet->next; - av_freep(&prev); - } - film->start = film->last = NULL; + avio_write(pb, sample_table, sample_table_size); return 0; } @@ -365,13 +321,8 @@ static int film_write_header(AVFormatContext *format_context) static void film_deinit(AVFormatContext *format_context) { FILMOutputContext *film = format_context->priv_data; - FILMPacket *packet = film->start; - while (packet != NULL) { - FILMPacket *next = packet->next; - av_free(packet); - packet = next; - } - film->start = film->last = NULL; + + ffio_free_dyn_buf(&film->header); } AVOutputFormat ff_segafilm_muxer = { From patchwork Sat Jul 18 00:19:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 21161 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:80ca:0:0:0:0:0 with SMTP id c10csp43035ybm; Fri, 17 Jul 2020 17:21:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJztmy9zd7UKQxMZjar4Qx8/CaIBgMTVmUf4tB8VLD62wrPrqLN9ANbVRdSDhfg4K+jNQI+E X-Received: by 2002:adf:f60c:: with SMTP id t12mr13555154wrp.198.1595031675559; Fri, 17 Jul 2020 17:21:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595031675; cv=none; d=google.com; s=arc-20160816; b=HPQQjr6h75J4uEqjefhBBKRBq2AqTDFL3jhMeJU8zm3jMwnKLgbxLM9MjBwzhHhtBN lTlRVy2u9pi8q/NlHPD+kW5UEsZZYgRoS9edwAJoZrOLPkc2ugCv/SzS++FxQZLPM2eo MpHAsDcUjvy354su7JsSNQH2AHulKu5kY+muAnY2qG/mc7pMd8aohfqxOkOVB9UDZHXm HsL4YpSE48ofq9FOf6lWLm3+S9NhEAYKTpNMEuWkRk60qgQ1JMa9h1djBlc2Cj8hKxyj GO9Rb3ghp6UnZcSeW6ZLrQuroy4kA+rVkFUN7PMzvQ7niuMM0/IcCZREACb6r3Lk+gl4 ADug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=w0Nt5UYdFzJqo/vR7PhvYVgYVhOKkCVt9wliE8nQGSg=; b=pdFtnCiQdUS4ihR5VAueQeG0kbTFYhUf1Y6ZWavzvqn7acGz/VFE4I6OvSaNYmTBuh KNNZoqklSbkBO8fPjwgQ9ZxPUr4Uc74PjCWdHO7EvzFj1Ro1rXxtjnj4Qy4F1bQrCCAF u1IHoa+Tb4QrxFLLPCsFyo/SAuumXHMcnTJ27MEHo+WOg65qYBcKzLCqKOnW2TEmgOog FksYDxRrSq5YL68gIxIHpKJs/RdgPAVy6kV3gjpqYahOzCBF4KnU4zj023Y69TwxE4c4 5uQVaK795tvr+PmCx5PlDdWFhzVhhsoMa9zOZ4Puwtw3n2gGbiaHOxvxSTezT0DaNfM3 /ZQg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=eISCVCn1; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id q19si7852459wmj.3.2020.07.17.17.21.15; Fri, 17 Jul 2020 17:21:15 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=eISCVCn1; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9B5D668B713; Sat, 18 Jul 2020 03:20:07 +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 DB35968B711 for ; Sat, 18 Jul 2020 03:19:58 +0300 (EEST) Received: by mail-ej1-f68.google.com with SMTP id rk21so12708135ejb.2 for ; Fri, 17 Jul 2020 17:19:58 -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=PuEivWQ6PbT4mMghnpL52GNPgQOQwk9i6NrIsmWHdcs=; b=eISCVCn1ohQf57qjQ1Gkq8vBmrEjyJQeW1mymVaykCVsFATBvvPz1DbZBkRUKlNv3G zI342E2cMln1imP6dFCWgWzEc0OGLHpNYcqwmfisYWJXSG+Cq77DYFrq9wJjnv1NR5Rw l+5q21Fcofa9VnVzhuVCxnbionfGMxyOAquvZw6rksVedeOoaUOLMd33txs6BAweLicj 6rbqhiJP52z9z3reh2hihX8ZYeNHQbWZNjq8fHlJzJKbAZ4sE6bs+lKmWGv7puHSJNRs 9ZBjO2D3iKDUHOBj52BGX7gp6WaU5UQHLGwuBytYzVznkbxOuvdyQS1QsCuFwRo/jdS8 K28g== 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=PuEivWQ6PbT4mMghnpL52GNPgQOQwk9i6NrIsmWHdcs=; b=lISieWftNlkArS4avBCv7pYt2mTBL4Jyy9o6pYjDb2B0uBVgZ7uHpWgj41cFdwf4/F Kuubk1dA9HzpazsoqDLavC+UANGLo4G37FHCvxdRnvMR2lebIRnpD1y8Y7KPjQ0ebQUk H4FtJI7dYVCG7k3ES0bVUgiuzg+Ea9bp0IX50Q/MzFcQRt+IbY3s47KBSkflkT+RELFz VkAJvO2vo3fRy4OMm/NS2eD405WQdSwgvIlKUdnZF3dm/Xp/m34nRFQBakx5DrtLgm78 Qeh0uO7wTRJIzlkijLSIM2H2F7WfdlRXixDApg4/+GaY77lNa9Hlh30W/NE5dvQoWaYv Gytw== X-Gm-Message-State: AOAM5337Ig5zeoPfbM5BHAXLVgaW8Kh4eCuKvmE7tejw74l9H7ctAQbe bIf6FiTWloSd1gpbsmxbtzzEuzAs X-Received: by 2002:a17:906:cc0e:: with SMTP id ml14mr10808535ejb.432.1595031597679; Fri, 17 Jul 2020 17:19:57 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc10296.dynamic.kabel-deutschland.de. [188.193.2.150]) by smtp.gmail.com with ESMTPSA id y7sm9299001ejd.73.2020.07.17.17.19.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2020 17:19:56 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Jul 2020 02:19:28 +0200 Message-Id: <20200718001928.10603-10-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> References: <20200718000636.2167-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 11/11] avformat/segafilmenc: Avoid seek when writing header 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" X-TUID: VJQZ2gPEiKon Content-Length: 13609 Up until now, the Sega FILM muxer would first write all the packet data, then shift the data (in the muxer's write_trailer function) by the amount necessary to write the header at the front (which entails a seek to the front), then seek back to the beginning and actually write the header. This commit changes this: The dynamic buffer that is used to write the sample table (containing information about each sample in the file) is now used to write the complete header. This is possible because the size of everything in the header except the sample table is known in advance. Said buffer can then be used as one of the two temporary buffers used for shifting which also reduces the amount one has to allocate for this. Thereby the header will be written when shifting, so that the second seek to the beginning is unnecessary. Signed-off-by: Andreas Rheinhardt --- libavformat/segafilmenc.c | 116 ++++++++++++++++++-------------------- 1 file changed, 56 insertions(+), 60 deletions(-) diff --git a/libavformat/segafilmenc.c b/libavformat/segafilmenc.c index 11ed279a05..42249d4eff 100644 --- a/libavformat/segafilmenc.c +++ b/libavformat/segafilmenc.c @@ -29,7 +29,9 @@ * http://wiki.multimedia.cx/index.php?title=Sega_FILM */ +#include "libavutil/avassert.h" #include "libavutil/intreadwrite.h" +#include "libavcodec/bytestream.h" #include "avformat.h" #include "internal.h" #include "avio_internal.h" @@ -160,11 +162,13 @@ static int film_init(AVFormatContext *format_context) } if ((ret = avio_open_dyn_buf(&film->header)) < 0) return ret; + ffio_fill(film->header, 0, 16 + 32 + 16); return 0; } -static int shift_data(AVFormatContext *format_context, int64_t shift_size) +static int write_header(AVFormatContext *format_context, uint8_t *header, + unsigned header_size) { int ret = 0; int64_t pos, pos_end; @@ -173,11 +177,12 @@ static int shift_data(AVFormatContext *format_context, int64_t shift_size) int read_size[2]; AVIOContext *read_pb; - buf = av_malloc(shift_size * 2); + buf = av_malloc(header_size); if (!buf) return AVERROR(ENOMEM); read_buf[0] = buf; - read_buf[1] = buf + shift_size; + read_buf[1] = header; + read_size[1] = header_size; /* Write the header at the beginning of the file, shifting all content as necessary; * based on the approach used by MOV faststart. */ @@ -190,25 +195,20 @@ static int shift_data(AVFormatContext *format_context, int64_t shift_size) return ret; } - /* mark the end of the shift to up to the last data we wrote, and get ready - * for writing */ - pos_end = avio_tell(format_context->pb); - avio_seek(format_context->pb, shift_size, SEEK_SET); + /* Mark the end of the shift to up to the last data we are going to write, + * and get ready for writing */ + pos_end = avio_tell(format_context->pb) + header_size; + pos = avio_seek(format_context->pb, 0, SEEK_SET); /* start reading at where the new header will be placed */ avio_seek(read_pb, 0, SEEK_SET); - pos = avio_tell(read_pb); -#define READ_BLOCK do { \ - read_size[read_buf_id] = avio_read(read_pb, read_buf[read_buf_id], shift_size); \ - read_buf_id ^= 1; \ -} while (0) - - /* shift data by chunk of at most shift_size */ - READ_BLOCK; + /* shift data by chunk of at most header_size */ do { int n; - READ_BLOCK; + read_size[read_buf_id] = avio_read(read_pb, read_buf[read_buf_id], + header_size); + read_buf_id ^= 1; n = read_size[read_buf_id]; if (n <= 0) break; @@ -224,81 +224,75 @@ static int shift_data(AVFormatContext *format_context, int64_t shift_size) static int film_write_header(AVFormatContext *format_context) { int ret = 0; - unsigned sample_table_size, stabsize, headersize, packet_count; - AVIOContext *pb = format_context->pb; + unsigned stabsize, headersize, packet_count; FILMOutputContext *film = format_context->priv_data; AVStream *video = NULL; - uint8_t *sample_table; + uint8_t *header, *ptr; /* Calculate how much we need to reserve for the header; * this is the amount the rest of the data will be shifted up by. */ - sample_table_size = avio_get_dyn_buf(film->header, &sample_table); - packet_count = sample_table_size / 16; - sample_table_size = packet_count * 16; - stabsize = 16 + sample_table_size; + headersize = avio_get_dyn_buf(film->header, &header); + if (headersize < 64) { + av_assert1(film->header->error < 0); + return film->header->error; + } + packet_count = (headersize - 64) / 16; + stabsize = 16 + 16 * packet_count; headersize = 16 + /* FILM header base */ 32 + /* FDSC chunk */ stabsize; - ret = shift_data(format_context, headersize); - if (ret < 0) - return ret; - /* Seek back to the beginning to start writing the header now */ - avio_seek(pb, 0, SEEK_SET); - - /* First, write the FILM header; this is very simple */ - - ffio_wfourcc(pb, "FILM"); - avio_wb32(pb, 48 + stabsize); + /* Write the header at the position in the buffer reserved for it. + * First, write the FILM header; this is very simple */ + ptr = header; + bytestream_put_be32(&ptr, MKBETAG('F', 'I', 'L', 'M')); + bytestream_put_be32(&ptr, headersize); /* This seems to be okay to hardcode, since this muxer targets 1.09 features; * videos produced by this muxer are readable by 1.08 and lower players. */ - ffio_wfourcc(pb, "1.09"); - /* I have no idea what this field does, might be reserved */ - avio_wb32(pb, 0); + bytestream_put_be32(&ptr, MKBETAG('1', '.', '0', '9')); + /* I have no idea what the next four bytes do, might be reserved */ + ptr += 4; /* Next write the FDSC (file description) chunk */ - ffio_wfourcc(pb, "FDSC"); - avio_wb32(pb, 0x20); /* Size of FDSC chunk */ + bytestream_put_be32(&ptr, MKBETAG('F', 'D', 'S', 'C')); + bytestream_put_be32(&ptr, 0x20); /* Size of FDSC chunk */ video = format_context->streams[film->video_index]; /* The only two supported codecs; raw video is rare */ switch (video->codecpar->codec_id) { case AV_CODEC_ID_CINEPAK: - ffio_wfourcc(pb, "cvid"); + bytestream_put_be32(&ptr, MKBETAG('c', 'v', 'i', 'd')); break; case AV_CODEC_ID_RAWVIDEO: - ffio_wfourcc(pb, "raw "); + bytestream_put_be32(&ptr, MKBETAG('r', 'a', 'w', ' ')); break; } - avio_wb32(pb, video->codecpar->height); - avio_wb32(pb, video->codecpar->width); - avio_w8(pb, 24); /* Bits per pixel - observed to always be 24 */ + bytestream_put_be32(&ptr, video->codecpar->height); + bytestream_put_be32(&ptr, video->codecpar->width); + bytestream_put_byte(&ptr, 24); /* Bits per pixel - observed to always be 24 */ if (film->audio_index > -1) { AVStream *audio = format_context->streams[film->audio_index]; int audio_codec = get_audio_codec_id(audio->codecpar->codec_id); - avio_w8(pb, audio->codecpar->channels); /* Audio channels */ - avio_w8(pb, audio->codecpar->bits_per_coded_sample); /* Audio bit depth */ - avio_w8(pb, audio_codec); /* Compression - 0 is PCM, 2 is ADX */ - avio_wb16(pb, audio->codecpar->sample_rate); /* Audio sampling rate */ + bytestream_put_byte(&ptr, audio->codecpar->channels); /* Audio channels */ + bytestream_put_byte(&ptr, audio->codecpar->bits_per_coded_sample); /* Audio bit depth */ + bytestream_put_byte(&ptr, audio_codec); /* Compression - 0 is PCM, 2 is ADX */ + bytestream_put_be16(&ptr, audio->codecpar->sample_rate); /* Audio sampling rate */ } else { - /* Set all these fields to 0 if there's no audio */ - avio_w8(pb, 0); - avio_w8(pb, 0); - avio_w8(pb, 0); - avio_wb16(pb, 0); + /* If there is no audio, all the audio fields should be set to zero. + * ffio_fill() already did this for us. */ + ptr += 1 + 1 + 1 + 2; } /* I have no idea what this pair of fields does either, might be reserved */ - avio_wb32(pb, 0); - avio_wb16(pb, 0); + ptr += 4 + 2; /* Finally, write the STAB (sample table) chunk */ - ffio_wfourcc(pb, "STAB"); - avio_wb32(pb, stabsize); + bytestream_put_be32(&ptr, MKBETAG('S', 'T', 'A', 'B')); + bytestream_put_be32(&ptr, stabsize); /* Framerate base frequency. Here we're assuming that the frame rate is even. * In real world Sega FILM files, there are usually a couple of approaches: * a) framerate base frequency is the same as the framerate, and ticks @@ -308,12 +302,14 @@ static int film_write_header(AVFormatContext *format_context) * The latter occurs even in cases where the frame rate is even; for example, in * Lunar: Silver Star Story, the base frequency is 600 and each frame, the ticks * are incremented by 25 for an evenly spaced framerate of 24fps. */ - avio_wb32(pb, av_q2d(av_inv_q(video->time_base))); + bytestream_put_be32(&ptr, av_q2d(av_inv_q(video->time_base))); - avio_wb32(pb, packet_count); + bytestream_put_be32(&ptr, packet_count); - /* Finally, write out each packet's data to the header */ - avio_write(pb, sample_table, sample_table_size); + /* Finally, shift the data and write out the header. */ + ret = write_header(format_context, header, headersize); + if (ret < 0) + return ret; return 0; }