From patchwork Mon Mar 29 08:42:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 26633 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 B7D4C44AD8A for ; Mon, 29 Mar 2021 11:42:30 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 78727680A2D; Mon, 29 Mar 2021 11:42:30 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR03-DB5-obe.outbound.protection.outlook.com (mail-oln040092071087.outbound.protection.outlook.com [40.92.71.87]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8E460680282 for ; Mon, 29 Mar 2021 11:42:27 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=oI5tJdt50toTukH9Samt78CSaflmNsgmULsUYfkBl02/RznoqSJx+4cZbqUF/fACwEDFX6AaoxtIQ5jEi6jmJmyN3htyGVCpbAdwdujbH8ULgffDy+w7oM98v3V+ep21QGJYp6/sBfJS0XRYfRul7dQcnMpAq3743UGDr+dQFUiVlKcIPEYIFMWaqJRfdJIy5d1d7ZLlP2ulY33FoqKUdHVbbqOzghknjtvWlwmCj9hMNhUIF2ZsdNvBgoyuqYaOmjAR2G4+eBk9K9tgPDJQ53QlqA445t5mlrm+frpE506aWRb9JivULQxl6YV8PxB5rLdbaWnyDiymbzm8CkVRBw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=DnYhgJoNQY0luybZnLN9hPnoZ96Nf1zJrha5/CZC0FA=; b=Ijnzno4PT4WlH4pGpVzrVoas7lyIjvW6bekc4NwivTQRN5eW71yop8wVUyhd0Gzg3EQB0IlUI8zAx26yqxhizz7bZHFqGgsRcMPsDeZA38STcMwY9affgcX5OX6iQOcv6USzoMOO19goom2x6Hr0eT8F3VcSyle0+7etxQ8/l+LDegnlYr2naRC7cag4uy2RQMzdaBdXQFdLXnYmYWO4t23G4vxdZ3pYhALZQy+sHhUsRiU25MsyPOttLDo22JR7h+wjAiepeuYRGmTbPBrILNJxXEISxoFvOtowEOd4DoQKHcnlCsPd9PnG//8WRW/9MSeCqLDeyxDbnyJ8FyWoEQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=DnYhgJoNQY0luybZnLN9hPnoZ96Nf1zJrha5/CZC0FA=; b=mnnTrcNPTMU5sjAHlRLP6IZ9Ag2Ntth8SaMNtKFZqdpi7P4nv1MrPm3gn0Cvdzps+1y5Pulwm9MLWQhYBFZf9oW2hDCkaPs0CXXXDUwm8/7v6w0Bt734t8SQe0aVvGChH1Ui9F1q+Hif75WVpa37Nw4cIBLmIluAF0KK+N2cnEejsEBdhAz01EBXiv0Z+TQsy/avkhNBGZoP5rhfEDD8iYNUKy2GNdTJ/yiIez/+FvOx2dqVPR49Uml/6y9WJ/m83rPu0vr55G9yuTwJGV7b9lWktNceWHO+0vmbdnZD6rIrq1E9d74tl2mE9Rv77Sv1J7tV58NJFdANiK/nJEe8pQ== Received: from VE1EUR03FT009.eop-EUR03.prod.protection.outlook.com (2a01:111:e400:7e09::4a) by VE1EUR03HT054.eop-EUR03.prod.protection.outlook.com (2a01:111:e400:7e09::461) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3977.29; Mon, 29 Mar 2021 08:42:25 +0000 Received: from HE1PR0301MB2154.eurprd03.prod.outlook.com (2a01:111:e400:7e09::49) by VE1EUR03FT009.mail.protection.outlook.com (2a01:111:e400:7e09::92) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3977.25 via Frontend Transport; Mon, 29 Mar 2021 08:42:25 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:58E96555FA7FA3CC0C7F46B8ADD15EC11AC114E17838B38BAAE5989D37470440; UpperCasedChecksum:288B09DA668AB495CD6AB5A547EC9AFD3995B05FEDCEB31DD7449DB315D4BBFD; SizeAsReceived:7408; Count:46 Received: from HE1PR0301MB2154.eurprd03.prod.outlook.com ([fe80::8128:5de5:4e94:9a21]) by HE1PR0301MB2154.eurprd03.prod.outlook.com ([fe80::8128:5de5:4e94:9a21%3]) with mapi id 15.20.3977.033; Mon, 29 Mar 2021 08:42:25 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 29 Mar 2021 10:42:00 +0200 Message-ID: X-Mailer: git-send-email 2.27.0 X-TMN: [QjnqCcW82TDzuzkQkVVXSsPBeGq+U6zJ] X-ClientProxiedBy: AM4PR0302CA0023.eurprd03.prod.outlook.com (2603:10a6:205:2::36) To HE1PR0301MB2154.eurprd03.prod.outlook.com (2603:10a6:3:2a::22) X-Microsoft-Original-Message-ID: <20210329084203.402250-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from sblaptop.fritz.box (188.192.137.96) by AM4PR0302CA0023.eurprd03.prod.outlook.com (2603:10a6:205:2::36) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3977.25 via Frontend Transport; Mon, 29 Mar 2021 08:42:25 +0000 X-MS-PublicTrafficType: Email X-IncomingHeaderCount: 46 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-Correlation-Id: 08181d0b-e8a0-4d78-db06-08d8f28e93eb X-MS-Exchange-SLBlob-MailProps: 7MJMDUNTCtyG7JLNmMoDcXgSrFf0WyM42Qv9vboBcPG4FLzemNFklXW9wWrmbuyTrxd4wZqU1qW30ozO6n4wFrd6vU7OTAUKmbTLiyVJATV9lRn9kwe6b0pGdazWxhK/4PPQWPh4ynB9GZ5BjM0N5osXw6YkRehSt28ZweKV5wXQcuv2WP8ZQ+0IX2TvBySUM0FMN+1ak9lOkhv/xIJkGGFLHgkIRq6CpMKEShZKsjBk2MF9kxC4Xlni4DUu9PJs9brGE09MppPpdtPIrCBzGAgFjyaaILX1o+2OqZnA5Yd3BrqR+rKABxtg4iFuAVzmUF2XRzps2d2lA3R6Xry9FLp06RmtDkjw2R48yHJ+mb7iSPIAI4f30jaD6EPyGkptDvlM3jrnAiNaXc31mS2pe0S8Iv4Er2Tqwb3wFeH5yzBhMZzpNk5HQmIY0AOAnPXfIjkzI5chQOEpzYUFgPPoZn3kpRUycb8e3Yq9ZgxxF9EG576hn+m33SMCdC6n9NVcW6KTbumz0YrnjxYmQsu9S2zGEe6BVjblWMcy24GT+MrN4NFf6IvH7dKiVqojbd7rg+6TzGLof/fepL6BzWQO3SJAzR0vBcc9T/yhq3D4g7j9BMAexyfFHqLUk6o2/w5VyjC3GVd2zdXJ8QUw0s08g0RDaFIaFNZUow3WYJZBT5VWiJDlm2mJQnQBvnZchLH7TVXF8uiy6+CdxATkxHLUlRQGOlIDmiwGN5lquQgBUFvwr+OVbwQYtA== X-MS-TrafficTypeDiagnostic: VE1EUR03HT054: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: WI8RNPJvZc/cB8y03//rs/h/q0lzgetLHQ0rxdhKwkjutTtx+8Xr4WzEUAoprhCJ4KytVrXds20uhlN6o3cUXpcoggQDO/LJMaqAWC6XLzTtQiYgZR7Ls5tYaZqPnsqMyNP54JGf/iF4U+D4bigsm/0HPduDyd8uZzdTOoE8FDlITyCjPER2Qps6/i6swNuvXOHKLNgNu+ajbX3JVz/+8qAbwwWmMbigC6BSTVBr9QDQTvUTJTE7dpigZ3I1yClxjW8A7Zt+B5bry71/vqAwSzw4ZL+0q+QV64yteGfgWA7N82p7xYRMZypqcpxw6oDMRIUGFN//2i8EFm8hhuISDFw7i0miTphzYtx9e9GB+B0JWnSgD8vqxYcYd5CWx/LZyKhftU+mBxlg0xIy7ktBoA== X-MS-Exchange-AntiSpam-MessageData: UzqlPeUDTETVyH0qzPJU+FVaK4O0kvZYxq0XAzp6192iFxbW72h1akoUcogH+ywc52IG3JPmfq7JXKYQdXpCTgxJ8tQlmMRXJ3Fi23P9p7VT2aqE5fjKEXdzvRN5E3tZT3hPm9WaO+iQeIfd6N2SZQ== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 08181d0b-e8a0-4d78-db06-08d8f28e93eb X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Mar 2021 08:42:25.8438 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-AuthSource: VE1EUR03FT009.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1EUR03HT054 Subject: [FFmpeg-devel] [PATCH 1/4] avformat: Add and use helper function to add attachment streams 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" All instances of adding attached pictures to a stream or adding a stream and an attached packet to said stream have several things in common like setting the index and flags of the packet, setting the stream disposition etc. This commit therefore factors this out. Signed-off-by: Andreas Rheinhardt --- I always pondered factoring this out; James' proposal made me do it. libavformat/apetag.c | 10 +--------- libavformat/flac_picture.c | 17 ++++------------- libavformat/id3v2.c | 21 ++++++--------------- libavformat/internal.h | 13 +++++++++++++ libavformat/matroskadec.c | 15 +++------------ libavformat/mov.c | 25 +++++++------------------ libavformat/utils.c | 30 ++++++++++++++++++++++++++++++ libavformat/wtvdec.c | 12 ++---------- 8 files changed, 66 insertions(+), 77 deletions(-) diff --git a/libavformat/apetag.c b/libavformat/apetag.c index 23ee6b516d..6f82fbe202 100644 --- a/libavformat/apetag.c +++ b/libavformat/apetag.c @@ -79,20 +79,12 @@ static int ape_tag_read_field(AVFormatContext *s) av_dict_set(&st->metadata, key, filename, 0); if ((id = ff_guess_image2_codec(filename)) != AV_CODEC_ID_NONE) { - int ret; - - ret = av_get_packet(s->pb, &st->attached_pic, size); + int ret = ff_add_attached_pic(s, st, s->pb, NULL, size); if (ret < 0) { av_log(s, AV_LOG_ERROR, "Error reading cover art.\n"); return ret; } - - st->disposition |= AV_DISPOSITION_ATTACHED_PIC; - st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; st->codecpar->codec_id = id; - - st->attached_pic.stream_index = st->index; - st->attached_pic.flags |= AV_PKT_FLAG_KEY; } else { if ((ret = ff_get_extradata(s, st->codecpar, s->pb, size)) < 0) return ret; diff --git a/libavformat/flac_picture.c b/libavformat/flac_picture.c index f15cfa877a..96e14f76c9 100644 --- a/libavformat/flac_picture.c +++ b/libavformat/flac_picture.c @@ -160,20 +160,11 @@ int ff_flac_parse_picture(AVFormatContext *s, uint8_t *buf, int buf_size, int tr if (AV_RB64(data->data) == PNGSIG) id = AV_CODEC_ID_PNG; - st = avformat_new_stream(s, NULL); - if (!st) { - RETURN_ERROR(AVERROR(ENOMEM)); - } - - av_packet_unref(&st->attached_pic); - st->attached_pic.buf = data; - st->attached_pic.data = data->data; - st->attached_pic.size = len; - st->attached_pic.stream_index = st->index; - st->attached_pic.flags |= AV_PKT_FLAG_KEY; + ret = ff_add_attached_pic(s, NULL, NULL, &data, 0); + if (ret < 0) + RETURN_ERROR(ret); - st->disposition |= AV_DISPOSITION_ATTACHED_PIC; - st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; + st = s->streams[s->nb_streams - 1]; st->codecpar->codec_id = id; st->codecpar->width = width; st->codecpar->height = height; diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c index f33b7ba93a..863709abbf 100644 --- a/libavformat/id3v2.c +++ b/libavformat/id3v2.c @@ -1142,34 +1142,25 @@ int ff_id3v2_parse_apic(AVFormatContext *s, ID3v2ExtraMeta *extra_meta) for (cur = extra_meta; cur; cur = cur->next) { ID3v2ExtraMetaAPIC *apic; AVStream *st; + int ret; if (strcmp(cur->tag, "APIC")) continue; apic = &cur->data.apic; - if (!(st = avformat_new_stream(s, NULL))) - return AVERROR(ENOMEM); - - st->disposition |= AV_DISPOSITION_ATTACHED_PIC; - st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; + ret = ff_add_attached_pic(s, NULL, NULL, &apic->buf, 0); + if (ret < 0) + return ret; + st = s->streams[s->nb_streams - 1]; st->codecpar->codec_id = apic->id; - if (AV_RB64(apic->buf->data) == PNGSIG) + if (AV_RB64(st->attached_pic.data) == PNGSIG) st->codecpar->codec_id = AV_CODEC_ID_PNG; if (apic->description[0]) av_dict_set(&st->metadata, "title", apic->description, 0); av_dict_set(&st->metadata, "comment", apic->type, 0); - - av_packet_unref(&st->attached_pic); - st->attached_pic.buf = apic->buf; - st->attached_pic.data = apic->buf->data; - st->attached_pic.size = apic->buf->size - AV_INPUT_BUFFER_PADDING_SIZE; - st->attached_pic.stream_index = st->index; - st->attached_pic.flags |= AV_PKT_FLAG_KEY; - - apic->buf = NULL; } return 0; diff --git a/libavformat/internal.h b/libavformat/internal.h index 8631694d00..b3c5d8a1d5 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -669,6 +669,19 @@ int ff_framehash_write_header(AVFormatContext *s); */ int ff_read_packet(AVFormatContext *s, AVPacket *pkt); +/** + * Add an attached pic to an AVStream. + * + * @param st if set, the stream to add the attached pic to; + * if unset, a new stream will be added to s. + * @param pb AVIOContext to read data from if buf is unset. + * @param buf if set, it contains the data and size information to be used + * for the attached pic; if unset, data is read from pb. + * @param size the size of the data to read if buf is unset. + */ +int ff_add_attached_pic(AVFormatContext *s, AVStream *st, AVIOContext *pb, + AVBufferRef **buf, int size); + /** * Interleave an AVPacket per dts so it can be muxed. * diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 1dc188c946..e8c76f9cfb 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -3007,18 +3007,9 @@ static int matroska_read_header(AVFormatContext *s) attachments[j].stream = st; if (st->codecpar->codec_id != AV_CODEC_ID_NONE) { - AVPacket *pkt = &st->attached_pic; - - st->disposition |= AV_DISPOSITION_ATTACHED_PIC; - st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; - - av_packet_unref(pkt); - pkt->buf = attachments[j].bin.buf; - attachments[j].bin.buf = NULL; - pkt->data = attachments[j].bin.data; - pkt->size = attachments[j].bin.size; - pkt->stream_index = st->index; - pkt->flags |= AV_PKT_FLAG_KEY; + res = ff_add_attached_pic(s, st, NULL, &attachments[j].bin.buf, 0); + if (res < 0) + goto fail; } else { st->codecpar->codec_type = AVMEDIA_TYPE_ATTACHMENT; if (ff_alloc_extradata(st->codecpar, attachments[j].bin.size)) diff --git a/libavformat/mov.c b/libavformat/mov.c index cb818ebe0e..097aa2bfb2 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -196,17 +196,16 @@ static int mov_read_covr(MOVContext *c, AVIOContext *pb, int type, int len) return 0; } - st = avformat_new_stream(c->fc, NULL); - if (!st) - return AVERROR(ENOMEM); sc = av_mallocz(sizeof(*sc)); if (!sc) return AVERROR(ENOMEM); - st->priv_data = sc; - - ret = av_get_packet(pb, &st->attached_pic, len); - if (ret < 0) + ret = ff_add_attached_pic(c->fc, NULL, pb, NULL, len); + if (ret < 0) { + av_free(sc); return ret; + } + st = c->fc->streams[c->fc->nb_streams - 1]; + st->priv_data = sc; if (st->attached_pic.size >= 8 && id != AV_CODEC_ID_BMP) { if (AV_RB64(st->attached_pic.data) == 0x89504e470d0a1a0a) { @@ -215,13 +214,6 @@ static int mov_read_covr(MOVContext *c, AVIOContext *pb, int type, int len) id = AV_CODEC_ID_MJPEG; } } - - st->disposition |= AV_DISPOSITION_ATTACHED_PIC; - - st->attached_pic.stream_index = st->index; - st->attached_pic.flags |= AV_PKT_FLAG_KEY; - - st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; st->codecpar->codec_id = id; return 0; @@ -7229,11 +7221,8 @@ static void mov_read_chapters(AVFormatContext *s) goto finish; } - if (av_get_packet(sc->pb, &st->attached_pic, sample->size) < 0) + if (ff_add_attached_pic(s, st, sc->pb, NULL, sample->size) < 0) goto finish; - - st->attached_pic.stream_index = st->index; - st->attached_pic.flags |= AV_PKT_FLAG_KEY; } } else { st->codecpar->codec_type = AVMEDIA_TYPE_DATA; diff --git a/libavformat/utils.c b/libavformat/utils.c index 88f6f18f1f..2bd7dd8ec7 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -474,6 +474,36 @@ int avformat_queue_attached_pictures(AVFormatContext *s) return 0; } +int ff_add_attached_pic(AVFormatContext *s, AVStream *st, AVIOContext *pb, + AVBufferRef **buf, int size) +{ + AVPacket *pkt; + int ret; + + if (!st && !(st = avformat_new_stream(s, NULL))) + return AVERROR(ENOMEM); + pkt = &st->attached_pic; + if (buf) { + av_assert1(*buf); + av_packet_unref(pkt); + pkt->buf = *buf; + pkt->data = (*buf)->data; + pkt->size = (*buf)->size - AV_INPUT_BUFFER_PADDING_SIZE; + *buf = NULL; + } else { + ret = av_get_packet(pb, pkt, size); + if (ret < 0) + return ret; + } + st->disposition |= AV_DISPOSITION_ATTACHED_PIC; + st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; + + pkt->stream_index = st->index; + pkt->flags |= AV_PKT_FLAG_KEY; + + return 0; +} + static int update_stream_avctx(AVFormatContext *s) { int i, ret; diff --git a/libavformat/wtvdec.c b/libavformat/wtvdec.c index 7def9d2348..e67e03a033 100644 --- a/libavformat/wtvdec.c +++ b/libavformat/wtvdec.c @@ -434,7 +434,6 @@ static void get_attachment(AVFormatContext *s, AVIOContext *pb, int length) char description[1024]; unsigned int filesize; AVStream *st; - int ret; int64_t pos = avio_tell(pb); avio_get_str16le(pb, INT_MAX, mime, sizeof(mime)); @@ -447,19 +446,12 @@ static void get_attachment(AVFormatContext *s, AVIOContext *pb, int length) if (!filesize) goto done; - st = avformat_new_stream(s, NULL); - if (!st) + if (ff_add_attached_pic(s, NULL, pb, NULL, filesize) < 0) goto done; + st = s->streams[s->nb_streams - 1]; av_dict_set(&st->metadata, "title", description, 0); - st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; st->codecpar->codec_id = AV_CODEC_ID_MJPEG; st->id = -1; - ret = av_get_packet(pb, &st->attached_pic, filesize); - if (ret < 0) - goto done; - st->attached_pic.stream_index = st->index; - st->attached_pic.flags |= AV_PKT_FLAG_KEY; - st->disposition |= AV_DISPOSITION_ATTACHED_PIC; done: avio_seek(pb, pos + length, SEEK_SET); }