From patchwork Sat Dec 21 18:02:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 16910 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 8048C44958D for ; Sat, 21 Dec 2019 20:03:45 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6A4DD68A9D9; Sat, 21 Dec 2019 20:03:45 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f194.google.com (mail-pg1-f194.google.com [209.85.215.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7B2A268A9B5 for ; Sat, 21 Dec 2019 20:03:37 +0200 (EET) Received: by mail-pg1-f194.google.com with SMTP id b9so6619097pgk.12 for ; Sat, 21 Dec 2019 10:03:37 -0800 (PST) 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=VCkVR+RGlp1d1Oo0z4wPUNi2wiMtQWAlqiCstgvJNxo=; b=N/dERXvslGO+01zZxkM9wrxFht+46dhA8mhBqcbNv3LDXAZ9qSabsBtOYa8oT8p1Ev HuOtFMtvwfnBadVr6u5IjV4hD9GTpDByhG4q+Ah9hYBd8euUXhaQZ1gfTQxcfKZrSuOb hp024mcsN6jBnq9X3KHGX6fAS0rcbXbXe3/iIHDk36BW3NygaJLPAA8p1CkHFcxAXnvd rlkBke0S7QB7TnvovpBVBj4HVugMXukAmur66RukzAHY0VbaGhxgxNjWtKjDmqH0u6FK ZVGw4E0slRJeqspgR094LjEQsDIflYv0AtylOvMcaZgxN3HlrKGa3rm23k7SaiwEKu15 rSBQ== 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=VCkVR+RGlp1d1Oo0z4wPUNi2wiMtQWAlqiCstgvJNxo=; b=kNTc09z/LRxA3GZj4+UBtnY7PwbyJh+b6hoOn8/FTjNjWVuDwwev9OmG5uJ1ADnh8T omDXOw9YeB1bxpk63FqXlQeAR6CHJaC0JnjYf1YtleRolXad5N5/FoQI+3+t+eO149g8 U8bG/4zXuIRaFHg/S0VELI0YKunfgPyAi9s0oBePD1QR5mZztAYQi5KKDWcchKCo77+h LPeRQxwqPlwsBzPFLeAWsiyvPjh6vtEdNVyHMJN4OcVVk8Xl9yMvmRteED/+Syyim6EY BhslSfi6TNQc4dko6Uh+nCplH8Zla15upe98KRZ2rdMY/zWG1MLTK/+zNIy3y1B59AKA +oBg== X-Gm-Message-State: APjAAAVlQ6Sew7m27rSfunFfMlS6Gtcy/mKdP/AVpN/YkQnlv24xA8LP f+Va+Ch2zqU61EZHsAfdtw+YFrrU X-Google-Smtp-Source: APXvYqwMmXkISbiYtv53vEvqPaUjTsYBBMYKAcSwc4NJL6maHoBEs85vKlBDnecfbrO0rDBY7wt2Dw== X-Received: by 2002:a62:4e11:: with SMTP id c17mr594672pfb.203.1576951415930; Sat, 21 Dec 2019 10:03:35 -0800 (PST) Received: from localhost.localdomain ([191.83.216.116]) by smtp.gmail.com with ESMTPSA id s196sm18223564pfs.136.2019.12.21.10.03.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Dec 2019 10:03:35 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sat, 21 Dec 2019 15:02:44 -0300 Message-Id: <20191221180252.6091-7-jamrial@gmail.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20191221180252.6091-1-jamrial@gmail.com> References: <20191221180252.6091-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 07/15] 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 4 and 5), 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 4a47df52b5..5d3399071e 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -4609,6 +4609,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. */ @@ -4627,7 +4628,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); @@ -4641,7 +4646,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 @@ -5335,8 +5340,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); @@ -5608,6 +5615,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, sizeof(AVProducerReferenceTime)); + 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 {