From patchwork Sun Nov 19 20:46:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Stebbins X-Patchwork-Id: 6203 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp3147962jah; Sun, 19 Nov 2017 12:47:07 -0800 (PST) X-Google-Smtp-Source: AGs4zMaS3KswqsIsHnZpd3qD4ovuGDXWO9DCGlN0eguMFRKqmULHGaO5DTuIu6Bcxc5rCsdKYy41 X-Received: by 10.28.6.2 with SMTP id 2mr8159162wmg.37.1511124427691; Sun, 19 Nov 2017 12:47:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511124427; cv=none; d=google.com; s=arc-20160816; b=Gx/Hyj5Gp0H8ntQF7vNmYL8hhHAUAJtoQNEutBESJhVAje9r9UNsQDpECscsJUv8NZ pWlOygahsJEFANjiE0PL8fNNGPAXFu8DD20/PiT9/4AKhQRhwu5D3S/YuFSgU5VhJZBV J3455QsyfWuiuJ7788n++0RNci/f+0e0i2LLbJKz2Eem2J2e3JxrmF/g+3eQWw/6Fda4 K3nmlegJomXQUQ+p+l0ePKvoQLmVt4/3+bafhhMVXiTmfHuMrHgn5yRim+ZWUCeIgTcg wk7l+CdE8P90Hze1EFW1qoi3ulAvxpC+fw+djtDRU18hVZlpckDO7+1xA0nGjjSMAoV3 u3HQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to:arc-authentication-results; bh=pmMlIOMzf+idkIobZeB7BgCP/GRLQGJNHki4WmG0bHE=; b=s1CNilRPBAipI2WdWW1hs+iBhTSy4LMI9WNwU6fEvePyZho1oapry7L8gTtiPvxSPC oYYUX2Jlof0CgN9RsH699ZUdKtuJYGNwMbe+h/v+WRlV1Nhc0sj0S23UZi/9NmNszUsz ojK5O35qPJS7BOjyBVfDIU3o9owqDF/SoKZ7Ve0DI9YsvB2BalSSrePL66hU8IbBUX4x YE0oKY2Glf35Ja+iPKDk1qDUU9Hw41lR6iR9Sb8T5ia9NFKFw1FeDMmQgkr4r7bylpP4 LZeziSiEf9nv6lVI51lR+3K25ZZ4flZWTPCwDN6lzE2qzT5TH5F96KAs26/P5PO+85D7 Zpmg== ARC-Authentication-Results: i=1; mx.google.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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id f63si3484055wmd.213.2017.11.19.12.47.07; Sun, 19 Nov 2017 12:47:07 -0800 (PST) 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; 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 1A4076899E9; Sun, 19 Nov 2017 22:46:46 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.jetheaddev.com (mail.jetheaddev.com [70.164.99.34]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 052A2680C1F for ; Sun, 19 Nov 2017 22:46:40 +0200 (EET) Received: from dionysus.jetheaddev.com (10.13.12.63) by cas.jetheaddev.com (192.168.13.27) with Microsoft SMTP Server (TLS) id 14.3.351.0; Sun, 19 Nov 2017 12:46:54 -0800 Received: from dionysus.jetheaddev.com (localhost [127.0.0.1]) by dionysus.jetheaddev.com (8.15.2/8.14.7) with ESMTP id vAJKksM8004676 for ; Sun, 19 Nov 2017 12:46:54 -0800 Received: (from jstebbins@localhost) by dionysus.jetheaddev.com (8.15.2/8.15.2/Submit) id vAJKksHC004675 for ffmpeg-devel@ffmpeg.org; Sun, 19 Nov 2017 12:46:54 -0800 From: John Stebbins To: Date: Sun, 19 Nov 2017 12:46:30 -0800 Message-ID: <20171119204635.4593-2-jstebbins@jetheaddev.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20171119204635.4593-1-jstebbins@jetheaddev.com> References: <20171119204635.4593-1-jstebbins@jetheaddev.com> MIME-Version: 1.0 X-Originating-IP: [10.13.12.63] Subject: [FFmpeg-devel] [PATCH 1/6] lavf/movenc: add sdtp (sample dependency) box 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" The sdtp is required by the AppleTV 4K in order to play 2160p60 video. --- libavcodec/avcodec.h | 6 ++++++ libavformat/isom.h | 5 +++++ libavformat/movenc.c | 30 ++++++++++++++++++++++++++++++ libavformat/movenc.h | 2 ++ 4 files changed, 43 insertions(+) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 442b558d4b..4f4bebc586 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1443,6 +1443,12 @@ typedef struct AVPacket { * outside the packet may be followed. */ #define AV_PKT_FLAG_TRUSTED 0x0008 +/** + * Flag is used to indicate packets that contain frames that can + * be discarded by the decoder. I.e. Non-reference frames. + */ +#define AV_PKT_FLAG_DISPOSABLE 0x0010 + enum AVSideDataParamChangeFlags { AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT = 0x0001, diff --git a/libavformat/isom.h b/libavformat/isom.h index ff08f5d090..65676fb0f5 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -318,6 +318,11 @@ void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id); #define MOV_TKHD_FLAG_IN_PREVIEW 0x0004 #define MOV_TKHD_FLAG_IN_POSTER 0x0008 +#define MOV_SAMPLE_DEPENDENCY_UNKNOWN 0x0 +#define MOV_SAMPLE_DEPENDENCY_YES 0x1 +#define MOV_SAMPLE_DEPENDENCY_NO 0x2 + + #define TAG_IS_AVCI(tag) \ ((tag) == MKTAG('a', 'i', '5', 'p') || \ (tag) == MKTAG('a', 'i', '5', 'q') || \ diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 01ae467fa1..c9ff65d43d 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -252,6 +252,30 @@ static int mov_write_stss_tag(AVIOContext *pb, MOVTrack *track, uint32_t flag) return update_size(pb, pos); } +/* Sample dependency atom */ +static int mov_write_sdtp_tag(AVIOContext *pb, MOVTrack *track) +{ + int i; + uint8_t leading, dependent, reference, redundancy; + int64_t pos = avio_tell(pb); + avio_wb32(pb, 0); // size + ffio_wfourcc(pb, "sdtp"); + avio_wb32(pb, 0); // version & flags + for (i = 0; i < track->entry; i++) { + dependent = MOV_SAMPLE_DEPENDENCY_YES; + leading = reference = redundancy = MOV_SAMPLE_DEPENDENCY_UNKNOWN; + if (track->cluster[i].flags & MOV_DISPOSABLE_SAMPLE) { + reference = MOV_SAMPLE_DEPENDENCY_NO; + } + if (track->cluster[i].flags & MOV_SYNC_SAMPLE) { + dependent = MOV_SAMPLE_DEPENDENCY_NO; + } + avio_w8(pb, (leading << 6) | (dependent << 4) | + (reference << 2) | redundancy); + } + return update_size(pb, pos); +} + static int mov_write_amr_tag(AVIOContext *pb, MOVTrack *track) { avio_wb32(pb, 0x11); /* size */ @@ -2320,6 +2344,8 @@ static int mov_write_stbl_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext track->par->codec_tag == MKTAG('r','t','p',' ')) && track->has_keyframes && track->has_keyframes < track->entry) mov_write_stss_tag(pb, track, MOV_SYNC_SAMPLE); + if (track->par->codec_type == AVMEDIA_TYPE_VIDEO && track->has_disposable) + mov_write_sdtp_tag(pb, track); if (track->mode == MODE_MOV && track->flags & MOV_TRACK_STPS) mov_write_stss_tag(pb, track, MOV_PARTIAL_SYNC_SAMPLE); if (track->par->codec_type == AVMEDIA_TYPE_VIDEO && @@ -5283,6 +5309,10 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) if (trk->cluster[trk->entry].flags & MOV_SYNC_SAMPLE) trk->has_keyframes++; } + if (pkt->flags & AV_PKT_FLAG_DISPOSABLE) { + trk->cluster[trk->entry].flags |= MOV_DISPOSABLE_SAMPLE; + trk->has_disposable++; + } trk->entry++; trk->sample_count += samples_in_chunk; mov->mdat_size += size; diff --git a/libavformat/movenc.h b/libavformat/movenc.h index cc2a155d79..c4e966b7fb 100644 --- a/libavformat/movenc.h +++ b/libavformat/movenc.h @@ -53,6 +53,7 @@ typedef struct MOVIentry { int cts; #define MOV_SYNC_SAMPLE 0x0001 #define MOV_PARTIAL_SYNC_SAMPLE 0x0002 +#define MOV_DISPOSABLE_SAMPLE 0x0004 uint32_t flags; } MOVIentry; @@ -89,6 +90,7 @@ typedef struct MOVTrack { long sample_size; long chunkCount; int has_keyframes; + int has_disposable; #define MOV_TRACK_CTTS 0x0001 #define MOV_TRACK_STPS 0x0002 #define MOV_TRACK_ENABLED 0x0004