From patchwork Mon Sep 19 13:25:34 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: 630 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.134 with SMTP id o128csp1000756vsd; Mon, 19 Sep 2016 06:28:02 -0700 (PDT) X-Received: by 10.194.206.68 with SMTP id lm4mr25267898wjc.106.1474291682013; Mon, 19 Sep 2016 06:28:02 -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 131si19758621wmv.51.2016.09.19.06.28.01; Mon, 19 Sep 2016 06:28:01 -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 4BC8168A05C; Mon, 19 Sep 2016 16:26:06 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01on0105.outbound.protection.outlook.com [104.47.1.105]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 71126689FA6 for ; Mon, 19 Sep 2016 16:25:55 +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=Ft+PVtNiv9u4oPDMI9NyyTdjLWeGjIPVwEYENz+VBCg=; b=ji1NR/1v0j35SxOKvegnH8O7itqOf5fn5IXV7sFct4uyqDpTgKaHNkds69pfyCNdztDe4JlOoGWGGiXsk21U8QbWzFZ5TIpCDSmnqYhvB4/U0sPed4BGuxjhYLPEYEicTw5xayFH8GR1FABQS2RJTykQ7zAzHj1djfUSZQxxpQ8= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=erkki.seppala.ext@nokia.com; Received: from erkkise-laptop.vincit.intranet (131.228.2.24) by VI1PR0701MB2543.eurprd07.prod.outlook.com (10.168.139.144) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.629.8; Mon, 19 Sep 2016 13:26:09 +0000 Received: by erkkise-laptop.vincit.intranet (Postfix, from userid 1000) id CAD9C4F0F51; Mon, 19 Sep 2016 16:25:48 +0300 (EEST) From: =?UTF-8?q?Erkki=20Sepp=C3=A4l=C3=A4?= To: Date: Mon, 19 Sep 2016 16:25:34 +0300 Message-ID: <1474291548-17810-12-git-send-email-erkki.seppala.ext@nokia.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1474291548-17810-1-git-send-email-erkki.seppala.ext@nokia.com> References: <1471943019-14136-1-git-send-email-erkki.seppala.ext@nokia.com> <1474291548-17810-1-git-send-email-erkki.seppala.ext@nokia.com> MIME-Version: 1.0 X-Originating-IP: [131.228.2.24] X-ClientProxiedBy: BN6PR08CA0065.namprd08.prod.outlook.com (10.172.144.27) To VI1PR0701MB2543.eurprd07.prod.outlook.com (10.168.139.144) X-MS-Office365-Filtering-Correlation-Id: 98023951-b3e6-469e-b96b-08d3e09084c3 X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB2543; 2:lGTIhAhHWKvZnDZzYjsq3BrlUasJRABHNrunjSIfQPJJjFra6ASesmbGDyWQ9sQqAYQhHY0E6kIfh1pRanqY375cmrGqhW6OsjJbsR93ygTuatVUF4fJwurBeAyug+980iY0iKzTypBM4Zq2p1dfmPCIAJzMhzkAhgZVHTW7ekjPr2O3XopJg0XmaVXwWvZs; 3:M5sOHZrjUzj04aoICIzTjkAxNBLJWdKfbxvCBwMdwq6My1urfyrnZsvyDhWjAnbjxt+yZ2CqWKfID5RT5EnQF1Paa04LwCW5kUt17aeSWU4QDnz79y69RgVuGOBH6Kir; 25:zzG6g/J0Gl1ePbCbDKkZtYc4A7rzFxovV/+3Eg09b/YEe6rPu1ejYlxK02j4Fz2FeadMMnoU1NeRSh4ViRyzuEjUJuYFin45uOpfnRFVSoWbRnJFGmpF6tnKJBkedd6CaConfBuIbtqPo3/BUW4iUtpTnwJ9+tIyeqC4Vwz5xv9UmUxzVpRJM5Q+ZKKDHVF7tsg3SGT8NEaLlToRXKzh5FHyAnw4S/nzsjLigrWMQ5ZRU5IwyWDmhLzpdiAMMWIcr5PnMHRkScHAVHKzI+F2LEvIvVFENp1a5B3DIbeOoRyoNiKKltDMunJrsFcXZtlB1cYUpuYEzTOpmv9IQ67/n3vm7JkYu1UPdpjinZSAp63alWzXrsiaxL08HLcWXDNcYybNVJCMCt4bUviJLkB19qsxQHHd4Xy6LTZm2HmVIj4= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0701MB2543; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB2543; 31:2aO/GZD1Z3pZ4BJ6gy3v8IJNg0PGEalonI8YdijKYqupkIueEUETTUJvO/XckzsFlpuOLq7lunFKVciB+TqR/eiinJzo1Vil7qk5qYEWRdvqsWINCg+8vJ+d8ePGv6BvAEI2lOtrI4AzNd+c4QwSbIS0LuJi4pWOBOd5wkiuBtHs8GWfpw0TOsQkbVbeGamSMs1MEdgkSFq9onKR1dHgiAFDId5cidUYDPRO0fCf5o0=; 20:Ys5Q/BPOsgDSfPyFhkIMYPTt0z1pE14GATVAe0Fs5hflnqdrRx0ehQZBlLUMm7Zbp1/FlbwVfzK74gTpww3naheenG76EVHBV+CS10Jn48N9WukbRg6JixHpN3JW2Ti9w61BfdYJ2W1uAN5WCkItagkO9vluYkR9PHAUMetSte0eAoVh41HPAJghxBTz6MoHi+KhPvcphw/5w5hhALq5RsYXawj5EPzaZL7hlxytRobYjpzFb/b3yMBB9iL6py0UscwiToTTKcNCZ53kfPXqi4OPuR2QFpkB6x+nXlXyK0AQjUUkOl+PbYNT85/2kpc62P4TYogvI52nBN9QtoDGR8nEaTLbM9KGNntqlpoc7Whjtydbn4mc/fPqnPRbwfOHCNrglz5xIfqGh/e9U8kWBl7wQ61PdLmoXgDk5LTDH0SGrTF0BhgfMf49WdPw6s7RxZ9N8Fdzc++kFPKDzCEfP1jDoYFJjp1VFslZQTNg71U3tztr8wetHUWhst/4sr4l X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(82608151540597)(17755550239193); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6055026); SRVR:VI1PR0701MB2543; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0701MB2543; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB2543; 4:v6L2KwNl2Vi6xruEPvD/+D1THb5cOQw9We8CI482C4ju9dmAGuxLD3S9Ybxvv4e5/V1FzyVySc37LkvCCZWea+iRQXEOZaK9zj7IvMefH1nkVqziua0QebDlb3esCQ+/EQz36y0vP1h7d7Ipqx0xKeYLbAoyiFD6S6n1Uul3l2dLO3L8co0PuaWmOzMWNB7CoE68z0V/XZLrWs+Ho/8uL9xEQ8wLumWQcr+x99kQbzLALFmprErRBkY1B+6gtmndeNS4jwgl2WABc45rk1cXhEr19I7vvJu1UILETSjANcmzYHD45Su7HXYpy0dTTcpdHUHEQvOWvUFCQ0wjjYgD6ycxt6HERt+AzgSaQ4b+exw75ncK8hT3EbestsY50EEfcyxW0AkzFo2ukgPpfKKgUlpDv+lbGqsqXH92UTGPepkJqHfLTKuF/jIlhzFjlaXkOwYaSUduB+zitR5CBY0+la4aKwDzFzToHXqfsJFHwx0= X-Forefront-PRVS: 0070A8666B X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(7916002)(189002)(199003)(66066001)(4001430100002)(36756003)(2950100001)(81156014)(81166006)(101416001)(23676002)(2906002)(50466002)(5660300001)(7736002)(97736004)(33646002)(19580405001)(2870700001)(4326007)(110136003)(122856001)(50986999)(8676002)(47776003)(76176999)(7846002)(19580395003)(305945005)(68736007)(45336002)(3846002)(50226002)(52956003)(92566002)(90966002)(6116002)(105586002)(106356001)(586003)(107886002)(2351001)(86362001)(42186005)(46386002)(450100001)(229853001)(5820100001)(189998001)(2004002); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0701MB2543; H:erkkise-laptop.vincit.intranet; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: nokia.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtWSTFQUjA3MDFNQjI1NDM7MjM6SGhuSDh6MExsQnB0aldGQ1p3WHhnSWxX?= =?utf-8?B?NFFGTjkvanh5K0dUdG84NVFNMEhDYVhwb0x1UG9BVzJjMyttdWlFd2lSN2ZW?= =?utf-8?B?bmQ1TjRvQ2tjYlRnTlJCZ1JYb3ppQUNkU3F5UlpLcWhBWUpUSndMZUtSR0Y1?= =?utf-8?B?Q1V0VUVGeEZ5RzZERGJmVmRONWNXT2Vrc3BoaG03Z0NkRzJzakU4WkNrdkJ0?= =?utf-8?B?dkw5UGd2SGozNUprWm9DdS9za0NIaHM3SGpWR2wrZjVLZjQvUnBrL1ROSkY2?= =?utf-8?B?aUJxMXYxQW9EekFtMGFBa2lkbkxmc0c4YjZMOUx5ODc0dW1SQ3oyTHV2ejVM?= =?utf-8?B?M250SnNGZEZGdTBNVHQrMjFTSGxGay9aOFlVRkRiMUZTdXJTRTlVUXRFNVJ5?= =?utf-8?B?b0xFOXpYOVgvd3ZybWZ1QmNIc3E4T2tOVHVBK0pVZ2xZUUhzR3laV0w4cnFs?= =?utf-8?B?d2JoMjlMdE8vbldtQmFsZ280MXljbDM1U202M2RRZ0JOQW1paFk4NVBtSVNW?= =?utf-8?B?UGc5clltVm4yck15dG9oM0ptMTdrMEEzVUN0N1FqUWpVWHh6djZTSlM5VEYw?= =?utf-8?B?eG1mRDBBVld2bEpaWTVqdjQvYnovSmtZSHpTMlhLSzBVc09QL005R3pLVWN5?= =?utf-8?B?NVIrY1RhOXBRWHNzNU5POE9HaTBiSk0ycFZjbHRaZmhXbEU0WXNicERIeEpj?= =?utf-8?B?UVNGWXZoOEVUK3grWnNXejlSOThCa2krWEVWS1JRZ3JGUnUwL0w1UGlOajdz?= =?utf-8?B?SlJNWkF0Undkc1FiYVN2dVhEMFhvaGZMcUFuandvOTdFRnp1TXY1dng3NDlL?= =?utf-8?B?ZXFoL3VicU1GbURKNEtWUWF2aXNVYlVuMkg1TEFjenRTaHZXY1grd1AwbnNk?= =?utf-8?B?MnJZZ2hSUzJHYndmWXZBVHF0S0pJTUMrSm9zRGxPelkrTTdFRVRGQkU2SGJK?= =?utf-8?B?cW5IR2ZjZzg5NDZpMnRPZ1p2NnZ2bnRHSzJrdEVoOGFNQmN4dXZvZkZVYmMx?= =?utf-8?B?QmVRWW50SGgzbkVNS3FBRjFvMUNQTnQ0b0JLY1Z5OTl1ZzdKUUhPcFN3S2x0?= =?utf-8?B?aUd4S09oRGF6cGpjaVYvRXF3WnhlVTQzQVpLUlRyZGNyUEFTTm9DdlB0QUZz?= =?utf-8?B?NEp6Mm1SYU15cWJPVS9mNW1yd2tlckpwMEJJWFVGaDJRVElnUU9TUGVIVXhv?= =?utf-8?B?NEFWZXZxSjRkMnYvL1h2Vzl6MVY3QnFkUTFueVF4S0FTaGUyTW5vS2xOYnll?= =?utf-8?B?UERMS0VGdTVSTWtjMXhlb3g4UzB1QldqZEJMVm5HcTlJZnRHSkszd2srZ1pY?= =?utf-8?B?d3J1OCs4Mk9iU2RvN3RjUVhyL1R2Z291KzJKcDFPQmM5YitjaWdOU04zVDlI?= =?utf-8?B?R085V2JFM2IwNlhrU0lISkFoclNIMDRzOG1XZ2U5OGVOcGZKRS9MOU1VNFpC?= =?utf-8?B?OGxQcm1DNjRmTHZxZTlOblBUZ0pJL1lzeGxlbVdTTHF3cEZtckxwb0FiYlI2?= =?utf-8?B?V3Rkb1VhZ3ZRL1A1UjgxclNoSTVNVFZPUWRWai82QURJSHJOR2EwQ0VYbDJl?= =?utf-8?B?REV4elR0enJlRDFsUXYvRFMwY2k4L0dkYkJMeW9jS0lsTTRlWlcxRVRFN1ZZ?= =?utf-8?B?dVY3K1Z3Q29TWFRIUHVwSWdidXRYZU1WQlB0alhCY1NqaDEvRmZRcFp5QS9F?= =?utf-8?B?aDJxaytiV3BDUUVXWDVLdHlGYjg2cUhIbnZFRDFUb1ZnbkxLRGVMTlNGZWU4?= =?utf-8?B?b1RqWWdHcWhrS1EzYVB6b09BPT0=?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0701MB2543; 6:CWRleiLUulIAESc75HIoHSSDZLfZCConCs0XzK49iqXrnPnPxQbU9jucbGHMj1jzj93w9vBHEYiqydndvgEMiiPaUvAJHT+9Yt4CDeT7rhoaLbz5nDyi3j6A/dXNPagBS+iecjKmyQQs4jAfRhFbgfyIWaSZ3EG8f6adSp5xxxjzUPlvVTk65mqaP6MFZEb+xn5A6BrQWQuWuEbkQ17wxcArPh3N4zwqAyS4TL0bnV7p2n0jOXknPl3W1zdV/3Sw9J48ApHIyZlSQkBkuHYaHMDyJy+vJSV8jq9UBMagb8cLtrLpEXuazvvoMLCHN++EePIYwhhVD2+ckfEM+pWqAw==; 5:2s7ZcEvFYiAhS0yITBfwIaRUtLPtv6Ofuy4h3st0PJBM4t1GFmymakw/EpPKBePEb5LbZfnhWCntk6SoCIKHk5KCieYh83sAtioVBCdXsEaH7+YQ/unGuEnpaZX/mTReSpFGNhUdaH7gP3Mhx67uGg==; 24:2sWA1xRGTZ38CMUoKCAuk7A3G/hWEgh+cytJfoelsMoVTQgxB5iNhoKNcwazLEcc+JfnqBrkArzEB7M09kiVRIqJR/7VKpuw8BCEMd94KZA=; 7:GYnI0Dpe6QdtULouxTNM9IEfWfoKOo2xPQWK3wq1c4GtB0q5Pw9OtpGZeiamXl6H0ay+EhpKKOTztY/s048gSDERjBzTDlwWxGQF7aRXxbGmoHAx6+5XTNsgnzsC2CSQrpUvDqotC5SBon9XF1vxo4b+Ny4ImCbwp/WAED2O532w9x9UnWlV8tFf/rGrimBNKFX1QkK4D8kjtPZ8l005bFlVdDZY7L3K9T2MwAnAOEj80ZIjVpkSzuX7O/Z4rP1rEqlYWucOCI4dkeifEQSWMC33FVze6L2cZu5p7ZhZlTRlYVZyIMYhX0ZMvIDt7pnN SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: nokia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Sep 2016 13:26:09.4492 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0701MB2543 Subject: [FFmpeg-devel] [PATCH v3 11/25] avformat/movenc: add the urim sample descriptor 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: =?UTF-8?q?Erkki=20Sepp=C3=A4l=C3=A4?= , OZOPlayer Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" This also adds libavformat/movmeta that contains the meta data information. Actually the sample configuration data is performed with side packet data AV_PKT_DATA_TIMED_METADATA_INFO where the value is stored inside AVTimedMetadataInfo. Signed-off-by: Erkki Seppälä Signed-off-by: OZOPlayer --- libavcodec/avcodec.h | 16 ++++++++++ libavformat/isom.c | 1 + libavformat/movenc.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++--- libavformat/movenc.h | 1 + libavformat/movmeta.h | 46 ++++++++++++++++++++++++++++ 5 files changed, 143 insertions(+), 4 deletions(-) create mode 100644 libavformat/movmeta.h diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 4219a9f..0079d22 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1350,6 +1350,16 @@ typedef struct AVCPBProperties { * @{ */ +typedef struct AVTimedMetadataInfo { + char meta_tag[4]; /**< 4cc describing this metadata box type */ + int meta_length; /**< length of data for the metadata type information */ + + char conf_tag[4]; /**< configurationg box type 4cc, ie. 'conf' */ + int conf_length; /**< length of the data for the configuration box */ + + /** followed by meta_length bytes of meta data followed by conf_length bytes of conf data */ +} AVTimedMetadataInfo; + typedef struct AVTrackReferences { int next_tref_ofs; /**< offset in bytes to the next AVTrackReferences or 0 if this is the last one*/ char tag[4]; /**< 4cc used for describing this */ @@ -1546,6 +1556,12 @@ enum AVPacketSideDataType { AV_PKT_DATA_TRACK_REFERENCES, /** + * Configured the timed metadata parameters, such as the uri and + * meta data configuration. The value is of type AVTimedMetadataInfo. + */ + AV_PKT_DATA_TIMED_METADATA_INFO, + + /** * Assign alternate groups for tracks. An example of alternate * groups would be audio tracks (or video tracks) that are * alternative to each other. Each alternative track shares the diff --git a/libavformat/isom.c b/libavformat/isom.c index 1a90d00..473700f 100644 --- a/libavformat/isom.c +++ b/libavformat/isom.c @@ -357,6 +357,7 @@ const AVCodecTag ff_codec_movsubtitle_tags[] = { const AVCodecTag ff_codec_metadata_tags[] = { { AV_CODEC_ID_META, MKTAG('m', 'e', 't', 'a') }, + { AV_CODEC_ID_META, MKTAG('u', 'r', 'i', 'm') }, { AV_CODEC_ID_NONE, 0 }, }; diff --git a/libavformat/movenc.c b/libavformat/movenc.c index a6f234e..84a6940 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -1552,6 +1552,69 @@ static int mov_write_fiel_tag(AVIOContext *pb, MOVTrack *track, int field_order) return 10; } +static int mov_write_urim_uri_box(AVIOContext *pb, const char *uri, int length) +{ + int64_t pos = avio_tell(pb); + avio_wb32(pb, 0); /* size */ + ffio_wfourcc(pb, "uri "); + avio_w8(pb, 0); /* version */ + avio_wb24(pb, 0); /* flags */ + + avio_write(pb, uri, length); /* uri */ + avio_w8(pb, 0); /* null-terminated */ + + return update_size(pb, pos); +} + +static int mov_write_conf_box(AVIOContext *pb, const uint8_t *data, int length, char* tag) +{ + int64_t pos = avio_tell(pb); + avio_wb32(pb, 0); /* size */ + ffio_wfourcc(pb, tag); + + avio_w8(pb, 0); /* version */ + avio_wb24(pb, 0); /* flags */ + + avio_write(pb, data, length); /* data */ + + return update_size(pb, pos); +} + +static int mov_write_meta_codec(AVIOContext *pb, MOVTrack *track) +{ + int64_t pos = avio_tell(pb); + + char *data; + char *tag; + + AVTimedMetadataInfo *meta = + (void*) av_stream_get_side_data(track->st, AV_PKT_DATA_TIMED_METADATA_INFO, + NULL); + + av_assert0(meta); + + avio_wb32(pb, 0); /* size */ + ffio_wfourcc(pb, meta->meta_tag); + + avio_wb32(pb, 0); /* Reserved */ + avio_wb16(pb, 0); /* Reserved */ + avio_wb16(pb, 1); /* Data-reference index */ + + data = (char*) (meta + 1); + tag = meta->meta_tag; + if (tag[0] == 'u' && tag[1] == 'r' && tag[2] == 'i' && tag[3] == 'm') { + mov_write_urim_uri_box(pb, data, meta->meta_length); + data += meta->meta_length; + } + + if (meta->conf_length) { + mov_write_conf_box(pb, data, meta->conf_length, meta->conf_tag); + data += meta->conf_length; + } + + return update_size(pb, pos); +} + static int mov_write_subtitle_tag(AVIOContext *pb, MOVTrack *track) { int64_t pos = avio_tell(pb); @@ -1951,6 +2014,18 @@ static int mov_write_tmcd_tag(AVIOContext *pb, MOVTrack *track) return update_size(pb, pos); } +static int mov_write_data_tag(AVIOContext *pb, MOVTrack *track) +{ + if (track->par->codec_id == AV_CODEC_ID_META) + return mov_write_meta_codec(pb, track); + else if (track->par->codec_tag == MKTAG('t','m','c','d')) + return mov_write_tmcd_tag(pb, track); + else if (track->par->codec_tag == MKTAG('r','t','p',' ')) + return mov_write_rtp_tag(pb, track); + else + return 0; +} + static int mov_write_stsd_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track) { int64_t pos = avio_tell(pb); @@ -1962,12 +2037,10 @@ static int mov_write_stsd_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext mov_write_video_tag(pb, mov, track); else if (track->par->codec_type == AVMEDIA_TYPE_AUDIO) mov_write_audio_tag(s, pb, mov, track); + else if (track->par->codec_type == AVMEDIA_TYPE_DATA) + mov_write_data_tag(pb, track); else if (track->par->codec_type == AVMEDIA_TYPE_SUBTITLE) mov_write_subtitle_tag(pb, track); - else if (track->par->codec_tag == MKTAG('r','t','p',' ')) - mov_write_rtp_tag(pb, track); - else if (track->par->codec_tag == MKTAG('t','m','c','d')) - mov_write_tmcd_tag(pb, track); return update_size(pb, pos); } @@ -2323,6 +2396,8 @@ static int mov_write_minf_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext else mov_write_gmhd_tag(pb, track); } + else if (track->par->codec_type == AVMEDIA_TYPE_DATA) + mov_write_nmhd_tag(pb); if (track->mode == MODE_MOV) /* FIXME: Why do it for MODE_MOV only ? */ mov_write_hdlr_tag(s, pb, NULL); mov_write_dinf_tag(pb); diff --git a/libavformat/movenc.h b/libavformat/movenc.h index 700d8d5..0fdc70f 100644 --- a/libavformat/movenc.h +++ b/libavformat/movenc.h @@ -27,6 +27,7 @@ #include "avformat.h" #include "movenccenc.h" #include "movtref.h" +#include "movmeta.h" #define MOV_FRAG_INFO_ALLOC_INCREMENT 64 #define MOV_INDEX_CLUSTER_SIZE 1024 diff --git a/libavformat/movmeta.h b/libavformat/movmeta.h new file mode 100644 index 0000000..e57b381 --- /dev/null +++ b/libavformat/movmeta.h @@ -0,0 +1,46 @@ +/* + * MOV, 3GP, MP4 muxer + * 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 + */ + +#ifndef AVFORMAT_MOVMETA_H +#define AVFORMAT_MOVMETA_H + +#include "avformat.h" + +typedef enum MOVMetaType { + MOV_META_NONE, + MOV_META_URIM +} MOVMetaType; + +typedef struct MOVConfMeta { + uint32_t tag; + int length; + void *data; +} MOVConfMeta; + +typedef struct MOVMeta { + uint32_t tag; + int length; + void *data; + + MOVConfMeta conf; +} MOVMeta; + +#endif /* AVFORMAT_MOVMETA_H */