From patchwork Wed Aug 31 11:35:46 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: erkki.seppala.ext@nokia.com X-Patchwork-Id: 352 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.134 with SMTP id o128csp327537vsd; Wed, 31 Aug 2016 04:36:16 -0700 (PDT) X-Received: by 10.194.172.229 with SMTP id bf5mr74241wjc.37.1472643376880; Wed, 31 Aug 2016 04:36:16 -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 a7si43533120wjk.240.2016.08.31.04.36.14; Wed, 31 Aug 2016 04:36:16 -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=@nokia.onmicrosoft.com; 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 dis=NONE) header.from=nokia.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B4263689A58; Wed, 31 Aug 2016 14:36:05 +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-eopbgr20093.outbound.protection.outlook.com [40.107.2.93]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5FDBE680D10 for ; Wed, 31 Aug 2016 14:35:59 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nokia.onmicrosoft.com; s=selector1-nokia-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=++AG6opWW4DYd9oZL91jfpshwJsE275VMZNCQfsQewk=; b=a1nGW8d/+PnH5cEQRc/+6xItmwp2hRvgGEIJpUj1eu/hcLsUfxE9Irt/e+OksG52E0Z8nMPiHQ12sSgJcAo9TT5di9lhyRzxFzfbfWxFua6keR6YPZtqSDs9otLoTIb7DrlSXP6SI0xuEs60z/ia06K2dLwS+6Qou+PtDS4Stc8= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=erkki.seppala.ext@nokia.com; Received: from erkkise-laptop.vincit.intranet (131.228.2.27) by VI1PR0701MB2544.eurprd07.prod.outlook.com (10.168.139.145) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.609.9; Wed, 31 Aug 2016 11:36:03 +0000 Received: by erkkise-laptop.vincit.intranet (Postfix, from userid 1000) id C44A04CB944; Wed, 31 Aug 2016 14:36:01 +0300 (EEST) From: =?UTF-8?q?Erkki=20Sepp=C3=A4l=C3=A4?= To: Date: Wed, 31 Aug 2016 14:35:46 +0300 Message-ID: <1472643361-10118-4-git-send-email-erkki.seppala.ext@nokia.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1472643361-10118-1-git-send-email-erkki.seppala.ext@nokia.com> References: <1471943019-14136-1-git-send-email-erkki.seppala.ext@nokia.com> MIME-Version: 1.0 X-Originating-IP: [131.228.2.27] X-ClientProxiedBy: AM3PR03CA043.eurprd03.prod.outlook.com (10.141.191.171) To VI1PR0701MB2544.eurprd07.prod.outlook.com (10.168.139.145) X-MS-Office365-Filtering-Correlation-Id: d341f08c-7fc8-4dbf-e7d2-08d3d192fd86 X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB2544; 2:8JFSseS9D96iR7qjT+WhPUPutB/hChBMe8ix89UYmFnJOrh2ylKRpzUEv7cxgKSx8t/06ka3dLR9TZBqno6SvFXLbSZMuZHX90w9dE2dbrQlczJLKXvIg0QuRjfEvvGJ5X+oHFqnvvYZfPxH/Jxgv15m0TzP/5oEUS08080qgj7ePys5lfip0SwJGnX3X55M; 3:0mTV5pM2qjIBHEZXfQkEOT0V1yV/q+v99LIstxuHv/srGeiT/fGCz1k05juRP3DSpaTWPtcHArnPan2+jCP62J8TVpwzbrlDrP5eRD36NP+xAURg9eeRR7I1QSZ5pXYg X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0701MB2544; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB2544; 25:br0MJVg6ZzpTWXb0lrZJs5u6k0p4dwEX0Mn8PoY7fIscktwqPanl1JcN2J36p/hUJJG38O8zIBkR2akTH78qNNWpKcEf0lYQOcsFY1BI2UTv6x+rNvPUwww1kb08mQ928iUbX2xBRajl9aw7Ewvq1sXtiXI3oXf/LNLxFQmc7UCYmgrlHS/CyJcWOoEWzh2MjiWjB67NSXzVFnOHRuyU8SCUGByBc4p0F7081Uo/wdCNg898+mOg4qIumCWq1RuzCLx1e5l2l8k8lG/YEF5/R86alv+9yHIzaA7SzvrqSEbma5iwuHgEjPdj0yXlMZdyIChrs4Nr+y03tzR9EWTT9wEdJNWmFJhFy4pc6DDMJjfsSMwm884uE//d09NdH8kllLXhXeMqxTqYUjb4IVidXccrIhSfj51Qbekky5TXB7DE2wTwUeDVC/Cp52eI+r2rAa2pNBVbC0qM7uXvPF8ozOLQBkH3aRtTjuTvGsfvQoUZg/v26mfsEcQQyVjNFBR4C9xIG1gnp9owUpYroN/bI/Hz2hjXWXqflWz4ATLEhnTEDlXFP/vBxW+aRuHX+PjFulr7EizMDk8CzSZvArU126ZSJn5nS/sq0EEWkDCw6Gqg32DVsatZjsSSiUSAA6+b6gUjigLMvKi/h4Wv0ibzeCfjwxDlbmBFoBj0xHSMCt4j/JyIC/ODYX0W936+T/sOWFTwKfUyNtpRUboBnSX9NQ==; 31:KKE7F6Q6HeJhHL8oaetKNPX0+gimIyylCQ4Dwo9VMQMXmu+KBPg1dp4bj4U8dZi3EL+0sr7pMDes9Udp5CxLz78IJNhxFEGCw1gWCkB2m6Fw6cxxzDAEH0pUQnrq05GAqZspbGlZzpvOC+a4B4/Ar2jPoeWY7cZlFHRr4luDW7GPa6Fye0oQNNOXsYxfuZ83D8PFNUznp6qdY3WOc7RLiIKiWnoxramPigtKuOOJefI= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB2544; 20:15ccwdOpI/9kF19Lv8dgDS1C+rpSHjNa7kiWZrMcF9Kpk96fy38Ot1b+lh7Q7/A6oNTpAdSKImshHHED7UF+SwpaPh2fbKFdAdXV0QBSUgpckRd43t2Tus+N3oCI7Ni5m2alyS+fOlR2G61MhZBQ5tRtey8vbWeCuFHoisumZB7b/48FanBDpoC1m+dJ3IQ3rbRgWS62AuHWgN7Cd8V+tvL220ZV4VUpy54Eym7hy4Gb6eeCHzaEOsbF8ryJmzCkBUYncxhsPLcgp68IVFDjmNPI2CSvdaiXUbXBaNgRCHUSlLeWIMR4ztXDzbgNq6H901/fPyr95lABVWjoKmIaNSdGsPWb8QObH0KfOQjVpYW0Lf+WUMYu1JKEbXn4t0JFJzWY7f617VpM98Bv4zWkpdMBElKX4T8IAhWxtS85gQNDCiVmCdEUlydewBFbhXL4Sb0q+cDEQGHa+3FcZXWzvhOz4+PCT7+3jKJDythZ05QPtIwZTBZxWMGJlvdarbbe X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(82608151540597); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6055026); SRVR:VI1PR0701MB2544; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0701MB2544; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB2544; 4:twC5tV5D3yllBSx/8P3/zclaEB0KKcFJCwp+98Ysm8n2qwj5AnLeZ8HosC9Rz3Zlvey7ySikp3C/rSC++dLAuqk+GW6WYGLvyTTcUBAQPXfFV98O6NFCV6xOp7oGYPiASlqN7dF1fd3eCaTT0Wmt4HT6zLVT73tvg/X0WK+6/geBVn3X3djN15ORfiv5XVxzdT9sW+g7hUOhiSDh3+sYTQYiLml6ZCazJZMc1yAtET6DoANpLBxToHdAEDbajr22RgJRIQCy8CjTn3TUtooUp/XMDKIQIiT6uKzEgqGz223S6hqx5i0or855GKfGfU0F5IZ3mLItzloR3Li/D/xgLDaAatLxlE2gSzZNS1uqqc6o34E6uYfYCCEht8+zCDR72G7YdMkjXGOEDKVqXNZkoZKfYomR7S0r/jaMh3gA/MD9nkZU5CfFGIptb6dNgaURp2TuKsftc7/CvcoIxqctNA== X-Forefront-PRVS: 00514A2FE6 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(7916002)(199003)(189002)(229853001)(2351001)(5820100001)(50986999)(76176999)(4001430100002)(33646002)(97736004)(110136002)(42186005)(189998001)(50466002)(101416001)(2950100001)(36756003)(107886002)(52956003)(68736007)(90966002)(92566002)(86362001)(81166006)(81156014)(305945005)(46386002)(23676002)(7846002)(19580395003)(19580405001)(8676002)(586003)(7736002)(45336002)(6116002)(66066001)(47776003)(3846002)(122856001)(4326007)(2906002)(105586002)(2870700001)(50226002)(106356001)(5660300001)(2004002); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0701MB2544; H:erkkise-laptop.vincit.intranet; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: nokia.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtWSTFQUjA3MDFNQjI1NDQ7MjM6U21JdnJCREE0QTV0eDJYTFc3VkFYemFm?= =?utf-8?B?RkNZS0hkd25QSFdiN0xDU3oyb1ZtK0tNdzIzdlR6dXFuT2FNbU9CQllNR2ZO?= =?utf-8?B?S3ZaU2pIbFR4Wm1rTE90SEdSUXBFbzFGNDhCU0YzaFdzZHRjQjZJalc1MEVj?= =?utf-8?B?OHowK3hHM29GRzhlTTF2dnpGRWU1UTFPMVhJUUd2VEsxR2MxRnF0d1BuN0pI?= =?utf-8?B?TTF2UjhQTGJtN0xsaTk4RnJuam5SWFU3dDZBMXFyVlNWTVJiVWxKTWtlYWhj?= =?utf-8?B?bGxIVmgxeU5Sdkl4QUlNNHVaUWJrVlJsYUdxN3JuWDdLU1lQcVRFQVJ1RU0w?= =?utf-8?B?ZTBQdHVFWnpKNUttb1V3WHpFYmtOTEVDZWtGdUQ4YzlKcmV6RlpzcFdudVgy?= =?utf-8?B?d0ZVcmExUk5Ma253MjVwSGNDYjZpcTJCSXl3VVFDYmNUUkpqL2FSU2Z3Skl3?= =?utf-8?B?eFRRblVYK0xsem04c1EwUE54d3doYnJKWVRiTXdYd2hXRjVhUkxJNlNSaGtr?= =?utf-8?B?UlorZUNVT2o0NjZ1UkQ0eUJDRktKM1ZWeDgxUUxOK1p3QWtHQ3FTcTYrYkNE?= =?utf-8?B?UndNSlg0Z3NUTi83Qmd1Y3A1WDU2MEhiSHBZTVA3ZVU3U0kwQzJqSnEvTFJl?= =?utf-8?B?cVBxbUdXZ2gxUXd1WE9zOXJRNzI0REtUTFY0d1ZpYzc1cXVEb29JWUZrazU4?= =?utf-8?B?RFJOVzhrV2pwemJOWVFxY2MzZnZ6MzV6RW93Sy9MRmZvZVdBOExsL2pBc1Bh?= =?utf-8?B?a1BjYjZQa014QVgvVU9Zd1l5STcvMFhCYS9kTWlwL2pab2MxK2Y2OUR1dG9R?= =?utf-8?B?VC9zUVU1VFg2MDRtdTcyNjNKN0ZwUDVFeWNncXk0c1lmUjc2eEhKWXNqaVd3?= =?utf-8?B?ZGE3SXd6ekk0SXVWd1BDditQclJkOHNXbTRQSDAvSWNyM2xXcmFQVVJFOGU5?= =?utf-8?B?Z2tjWFRJRkpZZWlVQkdhQm9ZdFB3bzA4ZkQzUXFoQTRnUTYyVFhLeEYyajNZ?= =?utf-8?B?U0srUFJVWVdZYzRhQ0ZSRk1YWmVidDVXanVRQ1c0emVsaTdZcnBaTFFtOUpo?= =?utf-8?B?Sy9mcFo0M0NaeXBEcGJIZWtyUWk2UHhaQ2psL01VQzArMzFPcndnMmlyM0tS?= =?utf-8?B?cVRndjB4YVM1UmFISlBxZ0hkM3F5TkFMNmVsUmVuMzdFakRselB3bFpQbkJr?= =?utf-8?B?blExeFJTdHRzcVdqNTRVSjJMbVVwZFFmYm16d00yRUxKZmhKQU4xcURyTWFD?= =?utf-8?B?OWxFWVpDdUZJU3l4Q2MwYURBRGNuMkRwV2dHYW1pMWdmZGlKd2JLL29RQy9B?= =?utf-8?B?RWpXVFB4bXM0bDZBT3Nja0dveE1iMk9qWUp2UUcrK2cxazMwTndBQ1c2NjQ2?= =?utf-8?B?U082K21MQTh1Y0QvZ3RoUGNPak5DZmlLNmlpejJwTlRrZ2pqaVd2Nks1V3M3?= =?utf-8?B?azgxTjRwV1p6ZndjL2NvS29KZjIxeURwdmJOcHhBa3BobzZIeTN1RnEwWlJs?= =?utf-8?B?QnAxeEwzZmZZZjk0L1o2b2VDV2xEQzI3Nzh3TXBJVC9MU3dvdHFQRHhLSnJF?= =?utf-8?B?QmhPdDFRRlNENCtNNy9ad2pKR1RnWXlPZFpqa2pwVWE4YStFcmgxeFdWdndC?= =?utf-8?B?Z2d2ajRLRHBDV0VQSDlad1VhaXVrOWJ2S3BIVW1KbHA0Y0Z3ZGt4RmlpVGVv?= =?utf-8?Q?VYQnS8gHHQkP6TI8Fhy0+PStsjLmbQxTB3GsCAFQi?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB2544; 6:Pza1DYDkksf3NG8chOBvShJxwUSBsWZtRgIfksSwYHNonnCj/KKKp/Vpca77aMVEdqj3q8Ggm2Yo3KRaVA4ZUuBW75oavnb20uMs5o6GDuv2ujRoDmVCtU1/0mdgru515HPeE/BPCyTNcdB4kqZ6N+z2SZgLuW4a+ifFmh4g02FRc8tr2GPdYQ3duiGYUt7HjVdoZjS8IbwxzaG4lcXsh4yS6fH2u/YDSB1aPcLPmV6jqRsoJiiANia6vyhT3mdhhSMLs2aO0tTFbXEVh7wOeeRqsWddERmE3e31P4MDDLmz189NGQqb5DwXeS+ZoisU/OB2264XbNEM3mWxjeTB4g==; 5:+vV2SLKkF+NLYC3vx2tk6ifd53AyC2oRkNPv+5Yfj7RuZdWVjXH1SVJkxGgucT3+gV8RFVHuxeJ+B2Bsns3DQevBq5x4nMat4YNcO+YYVhSL5ddojCI6rXUC7Qx9MtZAH3QulKDtXwbprFt2uyExhA==; 24:xY99QlqpvAgDWyH0sHv96OdwxfHFogvn2/2ca/FPGXFwIvPsw76yXkVli/iF/U2Pst8t8rqR+Z1wtqL2CKCu40KXNhl7X6cmFqrL9NUIJzk=; 7:ZYNprhYPRTh6JbMdzrcWSK7d8yR/XP0LocYueujaXP5XeSAEKcYvxHCGgQdvaYqD82OEgvztjxFcMsMpH6s3Ye32lrPXiYl85k8ltcubfcv34g4up69Ari00OHcjYv7Trv7STjXVeGQkpZEnoS5H+Wz7PDISPj1+QisQNa3ofTBw2k9UeU19uEdy+xOisfjZw1NayH6IbCW4qudn4FsJXHH7RWrlr13malyvysqASm5Vg0W5xHMTrd+RhRgTOVMB SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: nokia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Aug 2016 11:36:03.7717 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0701MB2544 Subject: [FFmpeg-devel] [PATCH v2 03/18] avcodec/metaenc: added an encoder/decoder for timed metadata 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: Michael Niedermayer , =?UTF-8?q?Erkki=20Sepp=C3=A4l=C3=A4?= , Paul B Mahol , Nicolas George , OZOPlayer Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" It has the codec id AV_CODEC_ID_META and type of AVMEDIA_TYPE_DATA. This codec basically passes the data forward and is used for referring timed meta data tracks by a codec. It is useful for dealing with the metadata in a similar way as other kinds of codecs. Signed-off-by: Erkki Seppälä Signed-off-by: OZOPlayer --- configure | 4 +-- libavcodec/Makefile | 2 +- libavcodec/allcodecs.c | 3 ++ libavcodec/avcodec.h | 2 +- libavcodec/codec_desc.c | 8 +++++ libavcodec/metacodec.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 libavcodec/metacodec.c diff --git a/configure b/configure index 9b92426..ded5452 100755 --- a/configure +++ b/configure @@ -2848,11 +2848,11 @@ matroska_demuxer_select="iso_media riffdec" matroska_demuxer_suggest="bzlib lzo zlib" matroska_muxer_select="iso_media riffenc" mmf_muxer_select="riffenc" -mov_demuxer_select="iso_media riffdec" +mov_demuxer_select="iso_media riffdec meta_decoder" mov_demuxer_suggest="zlib" mov_muxer_select="iso_media riffenc rtpenc_chain" mp3_demuxer_select="mpegaudio_parser" -mp4_muxer_select="mov_muxer" +mp4_muxer_select="mov_muxer meta_encoder" mpegts_demuxer_select="iso_media" mpegts_muxer_select="adts_muxer latm_muxer" mpegtsraw_demuxer_select="mpegts_demuxer" diff --git a/libavcodec/Makefile b/libavcodec/Makefile index a6e79ce..98a7a8d 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -799,7 +799,7 @@ OBJS-$(CONFIG_VP9_DXVA2_HWACCEL) += dxva2_vp9.o OBJS-$(CONFIG_VP9_VAAPI_HWACCEL) += vaapi_vp9.o # libavformat dependencies -OBJS-$(CONFIG_ISO_MEDIA) += mpeg4audio.o mpegaudiodata.o +OBJS-$(CONFIG_ISO_MEDIA) += mpeg4audio.o mpegaudiodata.o metacodec.o OBJS-$(CONFIG_ADTS_MUXER) += mpeg4audio.o OBJS-$(CONFIG_CAF_DEMUXER) += ac3tab.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 4c6b94e..30d0243 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -687,4 +687,7 @@ void avcodec_register_all(void) REGISTER_PARSER(VP3, vp3); REGISTER_PARSER(VP8, vp8); REGISTER_PARSER(VP9, vp9); + + /* data, meta data */ + REGISTER_ENCDEC(META, meta); } diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 6ac6646..0d0447e6 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -639,7 +639,7 @@ enum AVCodecID { AV_CODEC_ID_DVD_NAV, AV_CODEC_ID_TIMED_ID3, AV_CODEC_ID_BIN_DATA, - + AV_CODEC_ID_META, AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c index 24948ca..e85b51d 100644 --- a/libavcodec/codec_desc.c +++ b/libavcodec/codec_desc.c @@ -2965,6 +2965,14 @@ static const AVCodecDescriptor codec_descriptors[] = { .mime_types= MT("application/octet-stream"), }, + { + .id = AV_CODEC_ID_META, + .type = AVMEDIA_TYPE_DATA, + .name = "meta_data", + .long_name = NULL_IF_CONFIG_SMALL("binary data"), + .mime_types= MT("application/octet-stream"), + }, + /* deprecated codec ids */ }; diff --git a/libavcodec/metacodec.c b/libavcodec/metacodec.c new file mode 100644 index 0000000..bd8013c --- /dev/null +++ b/libavcodec/metacodec.c @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2015 Erkki Seppälä + * + * 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 + */ + +#include "libavutil/intreadwrite.h" +#include "internal.h" +#include "libavutil/opt.h" +#include "libavformat/avio.h" + +static int meta_encode(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, + int *got_packet_ptr) +{ + *got_packet_ptr = 0; + + av_packet_unref(avpkt); + if (frame->buf) { + avpkt->buf = av_buffer_ref(frame->buf[0]); + if (!avpkt->buf) + return AVERROR(ENOMEM); + avpkt->data = frame->data[0]; + } else { + avpkt->buf = av_buffer_alloc(frame->nb_samples); + if (!avpkt->buf) + return AVERROR(ENOMEM); + avpkt->data = avpkt->buf; + memcpy(avpkt->data, frame->data[0], frame->nb_samples); + } + avpkt->size = frame->nb_samples; + avpkt->pts = frame->pts; + avpkt->dts = frame->pts; + *got_packet_ptr = 1; + + return 0; +} + +static int meta_decode(AVCodecContext *avctx, void *data, int *got_packet_ptr, AVPacket *avpkt) +{ + AVFrame *metadata = data; + + *got_packet_ptr = 0; + + av_frame_unref(metadata); + if (avpkt->buf) { + metadata->buf[0] = av_buffer_ref(avpkt->buf); + if (!metadata->buf[0]) + return AVERROR(ENOMEM); + metadata->buf[0]->size = avpkt->size; + } else { + metadata->buf[0] = av_buffer_alloc(avpkt->size); + if (!metadata->buf[0]) + return AVERROR(ENOMEM); + metadata->data[0] = metadata->buf[0]->data; + memcpy(metadata->data[0], avpkt->data, avpkt->size); + } + + metadata->nb_samples = avpkt->size; + metadata->pts = avpkt->pts; + metadata->pkt_pts = avpkt->pts; + metadata->pkt_dts = avpkt->dts; + *got_packet_ptr = 1; + + return 0; +} + +AVCodec ff_meta_encoder = { + .name = "meta", + .long_name = NULL_IF_CONFIG_SMALL("Metadata Encoder"), + .type = AVMEDIA_TYPE_DATA, + .id = AV_CODEC_ID_META, + .encode2 = meta_encode, +}; + +AVCodec ff_meta_decoder = { + .name = "meta", + .long_name = NULL_IF_CONFIG_SMALL("Metadata Decoder"), + .type = AVMEDIA_TYPE_DATA, + .id = AV_CODEC_ID_META, + .decode = meta_decode, +};