From patchwork Sun Aug 11 12:47:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Moritz Barsnick X-Patchwork-Id: 14404 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 F36AC4483B9 for ; Sun, 11 Aug 2019 15:48:35 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DC0F568ABBE; Sun, 11 Aug 2019 15:48:35 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 61CE768AB8D for ; Sun, 11 Aug 2019 15:48:29 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1565527708; bh=5q1DI6hjVO5xcZ/U2okKS6YAOdfge1ZO4I1dzV3N2kg=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=iLZoof6AxLu4+JSr3q7H9TsgifUxqjRRaEc2xOMfApR1cXEjD470SFGNyg4ak/7yY GxXMrvYyB44mX26aEqaz94DUvkPZA6pFpbE/P6I89iOIPQa6r8d67yNV8w5bAyVARW kPuffPL8J/dfO+uPXg/65UL8M4CTiHxnuaC7ZMfw= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from paradise.fritz.box ([89.182.225.44]) by mail.gmx.com (mrgmx003 [212.227.17.190]) with ESMTPSA (Nemesis) id 0M4002-1iF98Y2A6s-00ra0Q; Sun, 11 Aug 2019 14:48:28 +0200 From: Moritz Barsnick To: FFmpeg development discussions and patches Date: Sun, 11 Aug 2019 14:47:53 +0200 Message-Id: <26f78761602ecfc977b70a736a2426ab95082e13.1565527501.git.barsnick@gmx.net> X-Mailer: git-send-email 2.20.1 In-Reply-To: References: MIME-Version: 1.0 X-Provags-ID: V03:K1:+9dJ1dF0tf7j+l4rq3n8pwLwMeZTIHMVXBBcSzcg+u1yO+ti9+8 tgR2HUBeonTadsKWeZhSTYYxBy3vjh+qBK5qh8AnnCZAOX72iVQhEk3OKZR0GghAe3FDx3P 4bbgJi1KbgN40IQ+j7iFk7abv0nx22p0agNn8EwUGFUx2BnbCnMcXOX26q3XItlYis2s7b1 yvxFAayV90IF9DOVxRCIg== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:DwGaSbNKAwk=:ER0Z9xuJp0uNPUOXHLWA2U FTN0NFYSThORcQ9Fh5wd+eKfYoXCWvAZe/U8LFtgXym3GKRjZBUlrfQXkwkuS0VJWBw963mmU p+DhPIlb3mBQBTtaj47fVlSCM+ApdRJFsl6jhABjeAQMX0BLzup7MhNQZlf4DKM1aJzkKniTa izEQSWm2HHwKRrVX1zct6Rh4vnVuoCkd6Su4y8XaMXV+QDP/oFryd6zEuInVaMtrNblZRtNjv vtwZRRIxGIH/SXuFYsvyiKAZsJgn5V9q8B/wpu4giOM5lZvRFF6BdvSvVX1r8Obrqj+Nir8I6 53ur9rDDq1ngCRpT6mPOJZz/CT7w+9tXiooEAq944o44OW2r0bflPdbAgpjTnCCnfJs56xO7D HhwmjS4BTFDVQx8o7w1rkJ2IK/TZ7pnfoiNr+J2NWYc5wx/Yy6LZ4VF+3T39GPbk/JjrmUX6e 3ube5VlLTcQmGC19hzE6NlsHj7Ahz6GOpPS+EdZ5hhsA6fdpIGKZhNI7fYp9F2tCdfSkPt6gu Gex9KZeJZoTNVGjqiacpIvc7yDhKs2YljqOHPUIYWuBGo32KmgobFZQcUs5mTHmEP//YeI0N/ WJrDUPiEmndBDN+mir0PLB+B9njTqweCnvNEw47FpGNWAZ32QcKKgiW9FB9j1DgmNJX3KOwXt dq2edK9avxyyfca5gXeYe9suBCVmV9FqF8tmREzjXWoroSHEV3sUa7RUuVapBB87ul9GMfAUa AqZX2mqRwbGaYhtQv/xUonb+hyp9tbjN7pUD/8Ql/uDqJzbWdEqoMzGr6jCxyshJe0gmL4OBw 5j7TQg8+kyhEb/Svxkfmx0eHQCK7uZIFmEFCxGCbFoHDlQouzxQUDyzNkZ7FReqIPZjOX+s1B +suCBp850qDF7mkGuK66zHQEDvSDV6DGfVMhOUjWtM6Gu2cOQLtndMOZCDEkmEMKPv99yRxvC sojPRS7fsoecg0ynxkXl78MqHP8u6LkctlBRz0JfUV14w3fWHzpey9PlkBHC+jTWghGsS7/yZ VUHdf+hH95rPB0EYB4ZRodRHISIv/DPqNTTARIN5dg+1aRikRV9/j9bMmxg6DXk+nK3DJyD3H fcGD8LjovtsJCydCS/HcuJiEdahnwQCaieteQQXjkgF1qZsyed06ufVZg== Subject: [FFmpeg-devel] [PATCH 1/4] avformat/hashenc: use an array of hashes 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: Moritz Barsnick Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Only the first one used currently. Signed-off-by: Moritz Barsnick --- libavformat/hashenc.c | 58 +++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 22 deletions(-) -- 2.20.1 diff --git a/libavformat/hashenc.c b/libavformat/hashenc.c index 06fc085d18..7f83df5cca 100644 --- a/libavformat/hashenc.c +++ b/libavformat/hashenc.c @@ -29,7 +29,7 @@ struct HashContext { const AVClass *avclass; - struct AVHashContext *hash; + struct AVHashContext **hashes; char *hash_name; int format_version; }; @@ -55,18 +55,24 @@ static const AVOption md5_options[] = { #if CONFIG_HASH_MUXER || CONFIG_MD5_MUXER static int hash_write_header(struct AVFormatContext *s) { + int res; struct HashContext *c = s->priv_data; - int res = av_hash_alloc(&c->hash, c->hash_name); - if (res < 0) + c->hashes = av_malloc_array(1, sizeof(c->hashes)); + if (!c->hashes) + return AVERROR(ENOMEM); + res = av_hash_alloc(&c->hashes[0], c->hash_name); + if (res < 0) { + av_freep(&c->hashes); return res; - av_hash_init(c->hash); + } + av_hash_init(c->hashes[0]); return 0; } static int hash_write_packet(struct AVFormatContext *s, AVPacket *pkt) { struct HashContext *c = s->priv_data; - av_hash_update(c->hash, pkt->data, pkt->size); + av_hash_update(c->hashes[0], pkt->data, pkt->size); return 0; } @@ -74,14 +80,15 @@ static int hash_write_trailer(struct AVFormatContext *s) { struct HashContext *c = s->priv_data; char buf[AV_HASH_MAX_SIZE*2+128]; - snprintf(buf, sizeof(buf) - 200, "%s=", av_hash_get_name(c->hash)); + snprintf(buf, sizeof(buf) - 200, "%s=", av_hash_get_name(c->hashes[0])); - av_hash_final_hex(c->hash, buf + strlen(buf), sizeof(buf) - strlen(buf)); + av_hash_final_hex(c->hashes[0], buf + strlen(buf), sizeof(buf) - strlen(buf)); av_strlcatf(buf, sizeof(buf), "\n"); avio_write(s->pb, buf, strlen(buf)); avio_flush(s->pb); - av_hash_freep(&c->hash); + av_hash_freep(&c->hashes[0]); + av_freep(&c->hashes); return 0; } #endif @@ -145,9 +152,9 @@ static void framehash_print_extradata(struct AVFormatContext *s) char buf[AV_HASH_MAX_SIZE*2+1]; avio_printf(s->pb, "#extradata %d, %31d, ", i, par->extradata_size); - av_hash_init(c->hash); - av_hash_update(c->hash, par->extradata, par->extradata_size); - av_hash_final_hex(c->hash, buf, sizeof(buf)); + av_hash_init(c->hashes[0]); + av_hash_update(c->hashes[0], par->extradata, par->extradata_size); + av_hash_final_hex(c->hashes[0], buf, sizeof(buf)); avio_write(s->pb, buf, strlen(buf)); avio_printf(s->pb, "\n"); } @@ -156,13 +163,19 @@ static void framehash_print_extradata(struct AVFormatContext *s) static int framehash_write_header(struct AVFormatContext *s) { + int res; struct HashContext *c = s->priv_data; - int res = av_hash_alloc(&c->hash, c->hash_name); - if (res < 0) + c->hashes = av_malloc_array(1, sizeof(c->hashes)); + if (!c->hashes) + return AVERROR(ENOMEM); + res = av_hash_alloc(&c->hashes[0], c->hash_name); + if (res < 0) { + av_freep(&c->hashes); return res; + } avio_printf(s->pb, "#format: frame checksums\n"); avio_printf(s->pb, "#version: %d\n", c->format_version); - avio_printf(s->pb, "#hash: %s\n", av_hash_get_name(c->hash)); + avio_printf(s->pb, "#hash: %s\n", av_hash_get_name(c->hashes[0])); framehash_print_extradata(s); ff_framehash_write_header(s); avio_printf(s->pb, "#stream#, dts, pts, duration, size, hash\n"); @@ -174,30 +187,30 @@ static int framehash_write_packet(struct AVFormatContext *s, AVPacket *pkt) struct HashContext *c = s->priv_data; char buf[AV_HASH_MAX_SIZE*2+128]; int len; - av_hash_init(c->hash); - av_hash_update(c->hash, pkt->data, pkt->size); + av_hash_init(c->hashes[0]); + av_hash_update(c->hashes[0], pkt->data, pkt->size); snprintf(buf, sizeof(buf) - (AV_HASH_MAX_SIZE * 2 + 1), "%d, %10"PRId64", %10"PRId64", %8"PRId64", %8d, ", pkt->stream_index, pkt->dts, pkt->pts, pkt->duration, pkt->size); len = strlen(buf); - av_hash_final_hex(c->hash, buf + len, sizeof(buf) - len); + av_hash_final_hex(c->hashes[0], buf + len, sizeof(buf) - len); avio_write(s->pb, buf, strlen(buf)); if (c->format_version > 1 && pkt->side_data_elems) { int i, j; avio_printf(s->pb, ", S=%d", pkt->side_data_elems); for (i = 0; i < pkt->side_data_elems; i++) { - av_hash_init(c->hash); + av_hash_init(c->hashes[0]); if (HAVE_BIGENDIAN && pkt->side_data[i].type == AV_PKT_DATA_PALETTE) { for (j = 0; j < pkt->side_data[i].size; j += sizeof(uint32_t)) { uint32_t data = AV_RL32(pkt->side_data[i].data + j); - av_hash_update(c->hash, (uint8_t *)&data, sizeof(uint32_t)); + av_hash_update(c->hashes[0], (uint8_t *)&data, sizeof(uint32_t)); } } else - av_hash_update(c->hash, pkt->side_data[i].data, pkt->side_data[i].size); + av_hash_update(c->hashes[0], pkt->side_data[i].data, pkt->side_data[i].size); snprintf(buf, sizeof(buf) - (AV_HASH_MAX_SIZE * 2 + 1), ", %8d, ", pkt->side_data[i].size); len = strlen(buf); - av_hash_final_hex(c->hash, buf + len, sizeof(buf) - len); + av_hash_final_hex(c->hashes[0], buf + len, sizeof(buf) - len); avio_write(s->pb, buf, strlen(buf)); } } @@ -210,7 +223,8 @@ static int framehash_write_packet(struct AVFormatContext *s, AVPacket *pkt) static int framehash_write_trailer(struct AVFormatContext *s) { struct HashContext *c = s->priv_data; - av_hash_freep(&c->hash); + av_hash_freep(&c->hashes[0]); + av_freep(&c->hashes); return 0; } #endif