From patchwork Fri Jul 21 08:30:19 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?Q2zDqW1lbnQgQsWTc2No?= X-Patchwork-Id: 4409 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.1.76 with SMTP id 73csp613008vsb; Fri, 21 Jul 2017 01:30:31 -0700 (PDT) X-Received: by 10.223.169.2 with SMTP id u2mr4910962wrc.288.1500625831779; Fri, 21 Jul 2017 01:30:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1500625831; cv=none; d=google.com; s=arc-20160816; b=0/c3dyzI05gSrWyPtzhhtMS/On/bRpW+RBQLNodlo+V6NnEEUmNPSRqgDMod6DYhPF 8IgwSPedjBEhnzQYoAzVp81LaFt4rNo4SyHisrAp+fZN/UtKhLnrMMSroF658t9HdGmV SqIR7hWIXXqyBdQoHX9/Zi0z5NzlfOxACCuDldX1JB+uY4i8pSjEAUklYJtW7HTv6Eo9 MzmwDaN3B2yM/+TVO5R5Kk1CMr7Q0uLA/0+cXu+t4A4uofHqUQpRmkNUjlEqw+FhrAOG G3rW72uX+LM+zyin//qpChF4GF3zqPa+QkqtZjWFfpBqpvA7tZzXu1S+F9GJM1H+ekdV a6gQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :domainkey-signature:dkim-signature:delivered-to :arc-authentication-results; bh=irwG7RIz4m+ifa1XKM0Vfb9pzPKohdYT0g0Aa5aIMBU=; b=yKYmUAf+1Cl6lmJpr2ktNRPoPftaVSWYVTd4/t3rIgb25wggahu4x+ttTFqV7it9N5 s1ybZE+JDTZ2YdA2BfOsXsT54Gu43eM61x9Cge7RBw2lnHZhoD122kSAqKhd8Xmb+Kuq HCbcQ3xhwUazI8Bk8IyZGrQvtNQ2iZ5h2QGxS9QCD0bawq8LyxXeGvSdRy7SJdW9ESAy YS/g4eo9AzNR0JWte1Qm8p7SRWuCH92ICvrcL/pg7eyl7M3STkemajWTHxJuyOqiowvf gutqK+FD8qtPuop7gBblmPfmPGW1fT1oVMuejWmaeMboBJUzru3vZ5uw4rsq1Wf3ofkX oFXg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@pkh.me header.b=D+H62Qow; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a193si645093wmd.151.2017.07.21.01.30.31; Fri, 21 Jul 2017 01:30:31 -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=@pkh.me header.b=D+H62Qow; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B787B689B0B; Fri, 21 Jul 2017 11:30:19 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from golem.pkh.me (LStLambert-657-1-117-164.w92-154.abo.wanadoo.fr [92.154.28.164]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7EA0A689950 for ; Fri, 21 Jul 2017 11:30:13 +0300 (EEST) Received: from golem.pkh.me (localhost.localdomain [127.0.0.1]) by golem.pkh.me (OpenSMTPD) with ESMTP id e9c6af31; Fri, 21 Jul 2017 08:30:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=pkh.me; h=from:to:cc :subject:date:message-id:mime-version:content-type :content-transfer-encoding; s=selector1; bh=Ayq0yn0S5PsadAtrV4P8 /6U0I2E=; b=D+H62Qow+jFlVfTuUoWovga58XzgSotABqUlJ+d6GPA0dJCu4QM8 8D/XOAXr9nz1qqhy688lSAZYVbd9Sb/74L5Q5wMpDdwXV7pREdm7fc4b9KCl6KQi ObFJHvDCUMDqG/rrW2gOFFJ6yX8WIR6zGfup956bcs1T46VmheZC5X8r5nyYTyGG cOKXMb2n4JbnTOvMBKiai2cot9iCM79LfFJ9OvWy4T8N9owPGpmwBEzuZRBNyZjY rRerC6vW94omYk4aavh6U4qf3D/A1nkyeGEZK5kKqiEE4G3D3aNPTE/jXoLSDr2O 07Sq8ZZa0zQs7NZmZaa9bniTBrVR38QVkQ== DomainKey-Signature: a=rsa-sha1; c=nofws; d=pkh.me; h=from:to:cc:subject :date:message-id:mime-version:content-type :content-transfer-encoding; q=dns; s=selector1; b=N7gAI5znF03EoQ x9Qi84Aq62ciEmqaGT/u6YyvqymIQOCaduFtaF1epniQzAMHXmiUbQRVGw7iGnTi rD6Cwb9sv+m3YojM8aT65QfQpvznU2I12j8GaTc066+N2f+syU0bT4/t/GN0bbBT xV6wekPg/j/gxhzcc62ZeGVSwTxtFTWzO6s6kr1+8Jo6pOuLSkn+BntLon879aOW 8NMdoKz+8e/qHuh9cHgr3LtOLL1rIcbAxZwdikHptEYkRXQNBZy0vo3xRFPxXgYD 2bC4FwH0fwpaDJeqA9Zp/uEKAiVoyu/BxNLjxcP4pifKkM5eV8mkt2R3aqv7qPyF xV9+qXPA== Received: from localhost (golem.pkh.me [local]) by golem.pkh.me (OpenSMTPD) with ESMTPA id d8fd2fe8; Fri, 21 Jul 2017 08:30:20 +0000 (UTC) From: =?UTF-8?q?Cl=C3=A9ment=20B=C5=93sch?= To: ffmpeg-devel@ffmpeg.org Date: Fri, 21 Jul 2017 10:30:19 +0200 Message-Id: <20170721083019.3174-1-u@pkh.me> X-Mailer: git-send-email 2.13.3 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] movenc: support GPMF track (gpmd) remuxing 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?Cl=C3=A9ment=20B=C5=93sch?= Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Clément Bœsch See https://github.com/gopro/gpmf-parser for more information on the data stream itself. --- libavformat/movenc.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 3989ac167e..0e5b45d150 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -2060,6 +2060,18 @@ static int mov_write_tmcd_tag(AVIOContext *pb, MOVTrack *track) return update_size(pb, pos); } +static int mov_write_gpmd_tag(AVIOContext *pb, const MOVTrack *track) +{ + int64_t pos = avio_tell(pb); + avio_wb32(pb, 0); /* size */ + ffio_wfourcc(pb, "gpmd"); + avio_wb32(pb, 0); /* Reserved */ + avio_wb16(pb, 0); /* Reserved */ + avio_wb16(pb, 1); /* Data-reference index */ + avio_wb32(pb, 0); /* Reserved */ + return update_size(pb, pos); +} + static int mov_write_stsd_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track) { int64_t pos = avio_tell(pb); @@ -2077,6 +2089,8 @@ static int mov_write_stsd_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext mov_write_rtp_tag(pb, track); else if (track->par->codec_tag == MKTAG('t','m','c','d')) mov_write_tmcd_tag(pb, track); + else if (track->par->codec_tag == MKTAG('g','p','m','d')) + mov_write_gpmd_tag(pb, track); return update_size(pb, pos); } @@ -2377,6 +2391,12 @@ static int mov_write_gmhd_tag(AVIOContext *pb, MOVTrack *track) ffio_wfourcc(pb, "tmcd"); mov_write_tcmi_tag(pb, track); update_size(pb, tmcd_pos); + } else if (track->par->codec_tag == MKTAG('g','p','m','d')) { + int64_t gpmd_pos = avio_tell(pb); + avio_wb32(pb, 0); /* size */ + ffio_wfourcc(pb, "gpmd"); + avio_wb32(pb, 0); /* version */ + update_size(pb, gpmd_pos); } return update_size(pb, pos); } @@ -2443,6 +2463,9 @@ static int mov_write_hdlr_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *tra } else if (track->par->codec_tag == MKTAG('t','m','c','d')) { hdlr_type = "tmcd"; descr = "TimeCodeHandler"; + } else if (track->par->codec_tag == MKTAG('g','p','m','d')) { + hdlr_type = "meta"; + descr = "GoPro MET"; // GoPro Metadata } else { av_log(s, AV_LOG_WARNING, "Unknown hldr_type for %s, writing dummy values\n", @@ -2514,6 +2537,8 @@ static int mov_write_minf_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext mov_write_nmhd_tag(pb); else mov_write_gmhd_tag(pb, track); + } else if (track->tag == MKTAG('g','p','m','d')) { + mov_write_gmhd_tag(pb, track); } if (track->mode == MODE_MOV) /* FIXME: Why do it for MODE_MOV only ? */ mov_write_hdlr_tag(s, pb, NULL);