From patchwork Thu May 5 10:20:30 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 35597 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:a885:b0:7f:4be2:bd17 with SMTP id ca5csp974593pzb; Thu, 5 May 2022 03:21:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwe8zYCvQPpxwW3hREv5ja+ju5qTAuDpIcqG2KwI1WkV1qfKlGlpd27CYR9utSuMHOOm/i5 X-Received: by 2002:a05:6402:2793:b0:428:1303:1b43 with SMTP id b19-20020a056402279300b0042813031b43mr8482250ede.226.1651746060537; Thu, 05 May 2022 03:21:00 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id dk14-20020a0564021d8e00b00427d0b09929si1393341edb.443.2022.05.05.03.20.59; Thu, 05 May 2022 03:21:00 -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=@outlook.com header.s=selector1 header.b=GlwRa9gs; arc=fail (body hash mismatch); 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=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F09B568B3AE; Thu, 5 May 2022 13:20:55 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR02-VE1-obe.outbound.protection.outlook.com (mail-oln040092069022.outbound.protection.outlook.com [40.92.69.22]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CE2E668A6B0 for ; Thu, 5 May 2022 13:20:48 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=M4zn+n27UevX72oDfxZSxj92a7PJ3FYmw9nVvZSyzkUOFv+PDZFJ48ey0XElJOla/jN3W7XUAmjZ4f70qFdk/4PkTV6GbcpswRUAYumd1h55XHMXIbCfPdfUsRJjc5YNUovFX1XpqHtP4J36v3LwN9yFNv3xdWiaWgPBI1x5ExK0gSLmvELIVv5Ejqpx9ExrjrJG5xF5ZX6fSHSmQUo7thzdi3hNvXcGFJQp7GSWVrgAJ4yNR6WRr/K0ZR+gLR++2CQv0yQ6iSH8IMG5riyBXJxZEFOataV5zVAOjtHZU/v9HksF48UZNl2GIyc0FMaPQspW3IWn/qxqvl2Zgs9yLA== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=MPDnOKkdVgetCkMYYDpsT1dPqWdKGkhlAyEq6KcV5WE=; b=oH16rfxvy2CgymY+++DthzRjBSkWNtJl1z0z16qeyRjb8jHJaoJUjEo57LepOxha+vQnlxzqVdkvltvPOBxR0cVRoNIBEaOAHOQhP46WajiC0wa97b8rMMCyZ+50OXUJQ1EmggFJ7lvQeqlOEMtrQxAhMeLbvn6YRxLrHoItlYRCSoGpCSx+EZuXXfYzcey39Px8ZJLL0s6x4cqZr0jS/9QXYgcZNDJMdEHYyPqehiC/pQgffDOVxkhYWFHCXpdWwvHLq5Sj2qcIzSo8aHAxApNAClkUUaxHYEAPyr1HY3W8MXinFf8Ta3vFWHvJvVYjsPkKf/bkGI81jQ8VXDxrUw== 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=MPDnOKkdVgetCkMYYDpsT1dPqWdKGkhlAyEq6KcV5WE=; b=GlwRa9gsYr8gXF3fkz/39/rLrXiDASmfLwRzn2kDmtofdrl8M5FlXZPE98w4AWDMCZrNXLB8tjg8dd7xR9qdBXVmN++fJ3zFfPFigcTfYVQ6vAjKlUjAQ9VDqK1unFLb0w7oXqRRfvJr834d/wd2x1B2z2zc/dgwOrMgptG2fhphgc/HXjW1/TQ7x2YYh6jCagdO1KoX3BUyczgL3U2Ce+oxL7CAZSJVZgBnl6oO+oN/9occJvkaWnRZvptOjVlbokAX3ZcmCF8iMX0G+knmrpKZssJMsfWlx0OqOSiXQVkvFDb/L2Czj6pVzlKD2QYdjz/TZrSGsRKUD43fe70VSw== Received: from AS8PR01MB7944.eurprd01.prod.exchangelabs.com (2603:10a6:20b:373::5) by AM8PR01MB7897.eurprd01.prod.exchangelabs.com (2603:10a6:20b:3d8::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5206.24; Thu, 5 May 2022 10:20:47 +0000 Received: from AS8PR01MB7944.eurprd01.prod.exchangelabs.com ([fe80::1854:2c30:7ba1:c431]) by AS8PR01MB7944.eurprd01.prod.exchangelabs.com ([fe80::1854:2c30:7ba1:c431%6]) with mapi id 15.20.5206.024; Thu, 5 May 2022 10:20:45 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 5 May 2022 12:20:30 +0200 Message-ID: X-Mailer: git-send-email 2.32.0 X-TMN: [kfeFcsrQwATXu/1+3hYiZJVJ5SrSayi4] X-ClientProxiedBy: ZR0P278CA0049.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:1d::18) To AS8PR01MB7944.eurprd01.prod.exchangelabs.com (2603:10a6:20b:373::5) X-Microsoft-Original-Message-ID: <20220505102032.3924749-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 96ca4750-aeeb-4b68-b5ef-08da2e80e955 X-MS-Exchange-SLBlob-MailProps: CaK+F7me6Cl3MOXgrK6r/gaKOjVsZQHVTwOKnrWqbjigkLOpCPtAW2IK+yq2/8ddhyruicPrs/mXFs9kn/yEX+WvFzOV0fSXPEp1XVtxSwCCwaCSwPCzq1qfWGFDOYqHUE5So8o0Kru6lnV+rL9p4VPTKHcsp/JBI5UOsQm2nvAOvwe7EyzA+I89aNNtORUteFcRiJyYaii4SxQa2OkvA3U7FsWjckNIYUpyyzQOAYX0iI70akIxdbUCsKRKs0PB7CuNMoGEW6rspnledFwgJ3/YdQFwe82UXeym++M58xcacmlRCz+kDJQ7BGo6FjONLAbk5OyDuUKToizQc+/QVadeP4xPOIFr2ZobQ+Sm+0mEP+FpnVgMeMTPaNDWLcZosmoRvLx45ybckeRyK9OBZIO/69bNX6ebkxryGld+3vVBvSCcj4Gekn7JvdShzED4H1eBKPTFlge+9f4VnMDiC5cc2PR9zLPdRJJAQ+++c6u7G6oXW6vA7Ftsabekj3KyRcl7C0qvuJmu5UiaHsQwWCkW7OthhhNrSO8uX5p76XN+aG+glc72p8Y5aoMng7wOvYmU3sTb63+YHZ1ip4eurRKgDeOpWrSFgVxJCYFU4S73jYmabOzPtMBhmzHoR9uQJ0ZEfRll+HX5gZMzrwAzX7Xvjceyr8ItMvkjryE0OFOoUeajhVdyzYDfk2lKUR0DAPV/7SK76Vqbd9qC7bnERoVCblWuP2J68sKFIBzxUpo9MVWX02fEhA== X-MS-TrafficTypeDiagnostic: AM8PR01MB7897:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: I0IN1urGAbMOtJbBs44QUcDrGWi5h0SrajrXmm9W+mLh1P9V8vud5geJ9cWgOGBr62hM2rknHmtUHiI0DxcLMiktXqE1FnubNsMucE4UGJqQRIVRzDXH84UaNh39ZMpt8UvOOrQnhd3YJWADwygjKI7m51KwJsOe0LsFvLQovswTcadAmK9/cdxFKh/pFwr4PuZdbQPvqaLVuaZBialouXx4RpOlYV42AKsfE3LUcn3jl0roT5U21PlU1LmmNZjRmSVbzz/qd9ibhgsN7FgbHrtPYK2ApR42IZuD/0RVelPKxcaTogBq7z4q8C8U09RdPscqVGaG4EoKRzk+vMr2iCo2QaALdBTdigoeBMuD2FWiwcUf2AOMEVb2eWN6sXhRzb0B2kGiGfpQBzrzdgrjP/An1vGz/1I8m9l1EMUumpmd0V4LRjnCXvV1qGzbb1oqJ+Z6h1+nPOsxRRF9drVPei9qe6XH/BIv/khtjepVPrreh4NydISE75nOFOu9G5sQTja1n3m5OJsDP9JJSeSBOL7KCUZqJxjQAPa4bddSUPSdfDd1xl64CmQ1YyyH41WYlLgB+0J2wS5AEyJdfzys28HOgNyGcnIbTLJNkL834XU/rdvz6QwhPdnTBybV2iFzKYHSYyT8Zb46zhPw7z8ZsA== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: g2FBi+my3uM+TX93LFKNzfTo31BOzGXkt43cAnl2/JRYulVUXLnZg/GN8c0KsXeGQTREmNhimosOb4BqrB56FNXON21gpAPY5KL2iRkbMTEAUqeevB0pJMve+AqlbrhRfMmI+raeIV010EbugDiXkH/QNUGFlPRpS2tq1sIJlz1+YgVDhhfsd4adQqGYZS7RxmWtlenK/mPap7CrNdVISjwHdIXOMWToQyz1WTtuq9qqky9zo8PFeiANsAjsqxt/fjfpkY706bfoGq2d6SsrGSskqz3kfHTu7HePU9e9Gn04wRz0xLl4/cBiCkA6agphwzEFXYu2UsiizihAdHhU2jb7WGncSBIWpAOg0NeoapIbodG0En4+DN8Lr9sRBdf7cWIEoHInL5dcOXTbF+kSljS5iDKFfUp59pobyP+kQrwIS05oRsHtUujCZ8IFTGD8csla+8SS/K/O1+bBRmu4QzZpejWduwlS7VXTRfHVq5fvGZV8m1s97NtsJsr52xR2qHAx2VQMfpozXU3byjtWwc7kub0i4isMmfceciWkopQbR1fX6hWk9y4sxFtg7PnYNaOY2gzJB8ht16B0692i56GiL2IjFIGjYQ9URmCsbX8VhEDDxKZx+RHZw4CO3eazN4QOA+L+kC56FELUBlUeToK3BF1KW3bxIzT6oGLuL0RtL9TjAmtNBd800Du72OQhWK5B96X0a8ep0NweUl8yfiE0wDqv6zX8ZgtG8fEnF/kJ04peDHurxPv13QQ3o1BN0kadRotjBxzTqvZSO55QLuZo2jAtZQw0oofwJ7LdXOHGTMTpPTFgGJuZhR9VcPA/3oOdDgdIsxKXeFNiOmxXBY3THfa7YFZJoDt+S9lKM/z8aLc1FWOl4jW6SumnlHOAatpn1sPURfi9gAJGiqGltVoXRoxT8FuIyE6jFeGArgjWrn5U3IVnGtMEZ1fl7MD0XO8wcwjT+btf4BOgYP5+gPQM6vVtpthH25OJCSV4XUdbMHN/H/rqDvEXBJm5poGG4AZn6zKDu3D+m8TiyeQYp7SgC8/0kr4OQZP9hgKs5Aq52cNnhxeqnFSW4qYRHK8lO5KLnBS8fV16izGO2Xf/D1Hhs57qYR+g9dBkXB8oD4n14RlQGOQQxGprebbuGNsk8CPB19BQx8ZYmlXjBxH765FIE+S7ReOhV1zTyeXhZo/v3gg/a6ous7S+iXEjawYkAGOPrOynUiYJQ1xVLAlcrpV3Yj6wZlppUdQbaaH/LWRamTxkyc7llnZLqdGyHKqiggAT5Xov3bjSrX5Z9vyvHqo3Bdd6xviFU9atInUxnl5+50YnEOa6Xt1GUbN5syxksEX7iCnWQWmHhXB8z5Cdmsrjh8OxP5uXdmPchvNUrhAork/1P7tauRjP14lrupr4FY7bcBgkIu4Q22iBEH8ZSDhe7U2Vk+mpHkqxMNlg96H3kSWlCx1TPVg4gr5pn+pd0jDNxDNFhXf4JpJfDp2YuA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 96ca4750-aeeb-4b68-b5ef-08da2e80e955 X-MS-Exchange-CrossTenant-AuthSource: AS8PR01MB7944.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 May 2022 10:20:45.2547 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8PR01MB7897 Subject: [FFmpeg-devel] [PATCH 1/3] lavc/pgs_frame_merge_bsf: add bsf to merge PGS segments X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: John Stebbins , Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: A3MZKtwDdomh From: John Stebbins Required to remux m2ts to mkv Minor changes and porting to FFBitStreamFilter done by the committer. Signed-off-by: Andreas Rheinhardt --- Changelog | 1 + doc/bitstream_filters.texi | 8 ++ libavcodec/Makefile | 1 + libavcodec/bitstream_filters.c | 1 + libavcodec/pgs_frame_merge_bsf.c | 191 +++++++++++++++++++++++++++++++ libavcodec/version.h | 2 +- 6 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 libavcodec/pgs_frame_merge_bsf.c diff --git a/Changelog b/Changelog index 4d467eb741..1bae64075e 100644 --- a/Changelog +++ b/Changelog @@ -14,6 +14,7 @@ version 5.1: - colormap video filter - colorchart video source filter - blurdetect filter +- PGS subtitle frame merge bitstream filter version 5.0: diff --git a/doc/bitstream_filters.texi b/doc/bitstream_filters.texi index fc2c71fc12..50c95f035d 100644 --- a/doc/bitstream_filters.texi +++ b/doc/bitstream_filters.texi @@ -695,6 +695,14 @@ for NTSC frame rate using the @option{frame_rate} option. ffmpeg -f lavfi -i sine=r=48000:d=1 -c pcm_s16le -bsf pcm_rechunk=r=30000/1001 -f framecrc - @end example +@section pgs_frame_merge + +Merge a sequence of PGS Subtitle segments ending with an "end of display set" +segment into a single packet. + +This is required by some containers that support PGS subtitles +(muxer @code{matroska}). + @section prores_metadata Modify color property metadata embedded in prores stream. diff --git a/libavcodec/Makefile b/libavcodec/Makefile index cfaa6f196a..3c0ff2dc58 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -1195,6 +1195,7 @@ OBJS-$(CONFIG_NOISE_BSF) += noise_bsf.o OBJS-$(CONFIG_NULL_BSF) += null_bsf.o OBJS-$(CONFIG_OPUS_METADATA_BSF) += opus_metadata_bsf.o OBJS-$(CONFIG_PCM_RECHUNK_BSF) += pcm_rechunk_bsf.o +OBJS-$(CONFIG_PGS_FRAME_MERGE_BSF) += pgs_frame_merge_bsf.o OBJS-$(CONFIG_PRORES_METADATA_BSF) += prores_metadata_bsf.o OBJS-$(CONFIG_REMOVE_EXTRADATA_BSF) += remove_extradata_bsf.o av1_parse.o OBJS-$(CONFIG_SETTS_BSF) += setts_bsf.o diff --git a/libavcodec/bitstream_filters.c b/libavcodec/bitstream_filters.c index f117bc0e17..444423ae93 100644 --- a/libavcodec/bitstream_filters.c +++ b/libavcodec/bitstream_filters.c @@ -52,6 +52,7 @@ extern const FFBitStreamFilter ff_noise_bsf; extern const FFBitStreamFilter ff_null_bsf; extern const FFBitStreamFilter ff_opus_metadata_bsf; extern const FFBitStreamFilter ff_pcm_rechunk_bsf; +extern const FFBitStreamFilter ff_pgs_frame_merge_bsf; extern const FFBitStreamFilter ff_prores_metadata_bsf; extern const FFBitStreamFilter ff_remove_extradata_bsf; extern const FFBitStreamFilter ff_setts_bsf; diff --git a/libavcodec/pgs_frame_merge_bsf.c b/libavcodec/pgs_frame_merge_bsf.c new file mode 100644 index 0000000000..bcd8945335 --- /dev/null +++ b/libavcodec/pgs_frame_merge_bsf.c @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2020 John Stebbins + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * This bitstream filter merges PGS subtitle packets containing incomplete + * set of segments into a single packet + * + * Packets already containing a complete set of segments will be passed through + * unchanged. + */ + +#include "libavutil/attributes.h" +#include "libavutil/intreadwrite.h" +#include "libavutil/log.h" +#include "bsf.h" +#include "bsf_internal.h" + +enum PGSSegmentType { + PALETTE_SEGMENT = 0x14, + OBJECT_SEGMENT = 0x15, + PRESENTATION_SEGMENT = 0x16, + WINDOW_SEGMENT = 0x17, + END_DISPLAY_SET_SEGMENT = 0x80, +}; + +typedef struct PGSMergeContext { + AVPacket *buffer_pkt, *in; + int presentation_found; + int pkt_flags; +} PGSMergeContext; + +static av_cold void frame_merge_flush(AVBSFContext *bsf) +{ + PGSMergeContext *ctx = bsf->priv_data; + + ctx->presentation_found = ctx->pkt_flags = 0; + av_packet_unref(ctx->in); + av_packet_unref(ctx->buffer_pkt); +} + +static int frame_merge_output(PGSMergeContext *ctx, AVPacket *dst, AVPacket *src) +{ + if (!ctx->presentation_found) + ctx->pkt_flags |= AV_PKT_FLAG_CORRUPT; + ctx->presentation_found = 0; + src->flags |= ctx->pkt_flags; + ctx->pkt_flags = 0; + av_packet_move_ref(dst, src); + return 0; +} + +static int frame_merge_filter(AVBSFContext *bsf, AVPacket *out) +{ + PGSMergeContext *ctx = bsf->priv_data; + AVPacket *in = ctx->in, *pkt = ctx->buffer_pkt; + int ret, size, pos, display = 0, presentation = 0; + unsigned int i; + + if (!in->data) { + ret = ff_bsf_get_packet_ref(bsf, in); + if (ret == AVERROR_EOF && pkt->data) { + // Output remaining data + ctx->pkt_flags |= AV_PKT_FLAG_CORRUPT; + return frame_merge_output(ctx, out, pkt); + } + if (ret < 0) + return ret; + } + if (!in->size) { + av_packet_unref(in); + return AVERROR(EAGAIN); + } + in->flags &= ~AV_PKT_FLAG_KEY; // Will be detected in the stream + + // Validate packet data and find display_end segment + size = in->size; + i = 0; + while (i + 3 <= in->size) { + uint8_t segment_type = in->data[i]; + int segment_len = AV_RB16(in->data + i + 1) + 3; + + if (i + segment_len > in->size) + break; // Invalid, segments can't span packets + if (segment_type == PRESENTATION_SEGMENT && ctx->presentation_found) + break; // Invalid, there can be only one + if (segment_type == PRESENTATION_SEGMENT) { + uint8_t state; + if (segment_len < 11) + break; // Invalid presentation segment length + ctx->presentation_found = presentation = 1; + state = in->data[i + 10] & 0xc0; + if (state) + ctx->pkt_flags |= AV_PKT_FLAG_KEY; + else + ctx->pkt_flags &= ~AV_PKT_FLAG_KEY; + } + i += segment_len; + if (segment_type == END_DISPLAY_SET_SEGMENT) { + size = i; + display = 1; + break; + } + } + if (display && pkt->size == 0 && size == in->size) // passthrough + return frame_merge_output(ctx, out, in); + if (!display && i != in->size) { + av_log(bsf, AV_LOG_WARNING, "Failed to parse PGS segments.\n"); + // force output what we have + size = in->size; + display = 1; + ctx->pkt_flags |= AV_PKT_FLAG_CORRUPT; + } + + if (presentation) { + ret = av_packet_copy_props(pkt, in); + if (ret < 0) + goto fail; + } + pos = pkt->size; + ret = av_grow_packet(pkt, size); + if (ret < 0) + goto fail; + memcpy(pkt->data + pos, in->data, size); + + if (size == in->size) + av_packet_unref(in); + else { + in->data += size; + in->size -= size; + } + + if (display) + return frame_merge_output(ctx, out, pkt); + return AVERROR(EAGAIN); + +fail: + frame_merge_flush(bsf); + return ret; +} + +static av_cold int frame_merge_init(AVBSFContext *bsf) +{ + PGSMergeContext *ctx = bsf->priv_data; + + ctx->in = av_packet_alloc(); + ctx->buffer_pkt = av_packet_alloc(); + if (!ctx->in || !ctx->buffer_pkt) + return AVERROR(ENOMEM); + + return 0; +} + +static av_cold void frame_merge_close(AVBSFContext *bsf) +{ + PGSMergeContext *ctx = bsf->priv_data; + + av_packet_free(&ctx->in); + av_packet_free(&ctx->buffer_pkt); +} + +static const enum AVCodecID frame_merge_codec_ids[] = { + AV_CODEC_ID_HDMV_PGS_SUBTITLE, AV_CODEC_ID_NONE, +}; + +const FFBitStreamFilter ff_pgs_frame_merge_bsf = { + .p.name = "pgs_frame_merge", + .p.codec_ids = frame_merge_codec_ids, + .priv_data_size = sizeof(PGSMergeContext), + .init = frame_merge_init, + .flush = frame_merge_flush, + .close = frame_merge_close, + .filter = frame_merge_filter, +}; diff --git a/libavcodec/version.h b/libavcodec/version.h index 735c8b813c..87b7284a95 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,7 +29,7 @@ #include "version_major.h" -#define LIBAVCODEC_VERSION_MINOR 27 +#define LIBAVCODEC_VERSION_MINOR 28 #define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \