From patchwork Thu Oct 17 18:59:13 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 15826 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 0DAE544A238 for ; Thu, 17 Oct 2019 22:00:22 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DEA5E68AB12; Thu, 17 Oct 2019 22:00:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f193.google.com (mail-qt1-f193.google.com [209.85.160.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CA78268AB37 for ; Thu, 17 Oct 2019 22:00:11 +0300 (EEST) Received: by mail-qt1-f193.google.com with SMTP id 3so5220654qta.1 for ; Thu, 17 Oct 2019 12:00:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=Pht3OKZqE72ZJx8NGTfzu9wqnimqMnJIYJ1QsHTiXTE=; b=aKFLbCxju43Bgl9mf7e6cI5kuSi6wXFtvpbgCnTGJ0XZ9dsrlzOuwGKBEB9g9HwsP9 eZNtsN99tKpEbtonPnKvGbtNrMSoWTwkZvQ9kOPNA/v4kqdJ77KF3LkIABRJvUErc3D5 WonWooZpcE/4aK8IHTQap8vb2XlRuWHiUjtlCGTioT0M2ZY6lXfGPWQMQr5zahfQYFZ8 3YC0KHxtcid4CgSbal0H/d067UOSRLXmn0t5igL75Dhbc/j6ChV17DDjj6h3CKHSQnon bZxyBcIAK6kUEPYLPr6kbZofzT0tEsJRl2neubfiEQwuDo7XgxsdmA7TWYfDTXBQtkPA 0pPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Pht3OKZqE72ZJx8NGTfzu9wqnimqMnJIYJ1QsHTiXTE=; b=ABMZTIPfy/5h6dRprIm6GMulWEh3kQnSHRy1eZNi7fUTiKWLnXjTfum18IsldI4tje Y1hJllPbgSl1vUqZ3pDs18gi9pxSgarPCJ2/4PnoCdnpLcWxjt99wKqYn2rkx/1rKy+i 6BwFltdQtFY02mFqy88t/qxy6l9vU0fC5rxBwWR6luuZjfW08XF33EmavYAj7CE2+uVm MZPwBJ+XUyE+TxjMYZx/md/3FkG2QSV+A6MvFRKAFbp2kBDzwzDcn1Yvq+Iqt9O9BL1K jfdjj4vdTLSjHVgeHpvyI/S3kVP5tRps8NyNOBqDorTtGc1UQCoYMGe2quRwtAJOIQAH nLTQ== X-Gm-Message-State: APjAAAUjn30iemq8SkyqdIAFZrnGEmr5nujmb8PupNF7ZjVK8UhHhPqE 617yHpOHo8oUfx39+k348RuL2pMt X-Google-Smtp-Source: APXvYqyb+48zWnY4eXxfsSNipRqtZeV19nuvzD6NMYJR8p7uACd3M0zIwV0F4IAsgw+GigJhYMKhnA== X-Received: by 2002:a0c:eda9:: with SMTP id h9mr5507028qvr.125.1571338810234; Thu, 17 Oct 2019 12:00:10 -0700 (PDT) Received: from localhost.localdomain ([191.83.221.234]) by smtp.gmail.com with ESMTPSA id v141sm798933qka.59.2019.10.17.12.00.09 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Oct 2019 12:00:09 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 17 Oct 2019 15:59:13 -0300 Message-Id: <20191017185916.2957-9-jamrial@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191017185916.2957-1-jamrial@gmail.com> References: <20191017185916.2957-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 08/11] avformat/movenc: use AVProducerReferenceTime side data to write the prft atom 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" If not available, set flags to 24 (bits corresponding to values 8 and 16 set), to signal the wallclock value is read at the time of writing the atom. Signed-off-by: James Almer --- libavformat/movenc.c | 18 ++++++++++++++++-- libavformat/movenc.h | 1 + 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index ec9890a7cd..16849f5f9d 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -4608,6 +4608,7 @@ static int mov_write_prft_tag(AVIOContext *pb, MOVMuxContext *mov, int tracks) { int64_t pos = avio_tell(pb), pts_us, ntp_ts; MOVTrack *first_track; + int flags = 24; /* PRFT should be associated with at most one track. So, choosing only the * first track. */ @@ -4626,7 +4627,11 @@ static int mov_write_prft_tag(AVIOContext *pb, MOVMuxContext *mov, int tracks) } if (mov->write_prft == MOV_PRFT_SRC_WALLCLOCK) { - ntp_ts = ff_get_formatted_ntp_time(ff_ntp_time(av_gettime())); + if (first_track->cluster[0].prft.wallclock) { + ntp_ts = ff_get_formatted_ntp_time(ff_ntp_time(first_track->cluster[0].prft.wallclock)); + flags = first_track->cluster[0].prft.flags; + } else + ntp_ts = ff_get_formatted_ntp_time(ff_ntp_time(av_gettime())); } else if (mov->write_prft == MOV_PRFT_SRC_PTS) { pts_us = av_rescale_q(first_track->cluster[0].pts, first_track->st->time_base, AV_TIME_BASE_Q); @@ -4640,7 +4645,7 @@ static int mov_write_prft_tag(AVIOContext *pb, MOVMuxContext *mov, int tracks) avio_wb32(pb, 0); // Size place holder ffio_wfourcc(pb, "prft"); // Type avio_w8(pb, 1); // Version - avio_wb24(pb, 0); // Flags + avio_wb24(pb, flags); // Flags avio_wb32(pb, first_track->track_id); // reference track ID avio_wb64(pb, ntp_ts); // NTP time stamp avio_wb64(pb, first_track->cluster[0].pts); //media time @@ -5314,8 +5319,10 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) AVIOContext *pb = s->pb; MOVTrack *trk = &mov->tracks[pkt->stream_index]; AVCodecParameters *par = trk->par; + AVProducerReferenceTime *prft; unsigned int samples_in_chunk = 0; int size = pkt->size, ret = 0; + int prft_size; uint8_t *reformatted_data = NULL; ret = check_pkt(s, pkt); @@ -5587,6 +5594,13 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) trk->cluster[trk->entry].flags |= MOV_DISPOSABLE_SAMPLE; trk->has_disposable++; } + + prft = (AVProducerReferenceTime *)av_packet_get_side_data(pkt, AV_PKT_DATA_PRFT, &prft_size); + if (prft && prft_size == sizeof(AVProducerReferenceTime)) + memcpy(&trk->cluster[trk->entry].prft, prft, prft_size); + else + memset(&trk->cluster[trk->entry].prft, 0, prft_size); + trk->entry++; trk->sample_count += samples_in_chunk; mov->mdat_size += size; diff --git a/libavformat/movenc.h b/libavformat/movenc.h index 68d6f23a5a..a3c6467c67 100644 --- a/libavformat/movenc.h +++ b/libavformat/movenc.h @@ -56,6 +56,7 @@ typedef struct MOVIentry { #define MOV_PARTIAL_SYNC_SAMPLE 0x0002 #define MOV_DISPOSABLE_SAMPLE 0x0004 uint32_t flags; + AVProducerReferenceTime prft; } MOVIentry; typedef struct HintSample {