From patchwork Fri Sep 27 14:37:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthieu Bouron X-Patchwork-Id: 15328 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 F0E9A44877C for ; Fri, 27 Sep 2019 17:44:05 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D1DC9689B13; Fri, 27 Sep 2019 17:44:05 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1A4C46881EE for ; Fri, 27 Sep 2019 17:43:59 +0300 (EEST) Received: by mail-wr1-f50.google.com with SMTP id a11so3162661wrx.1 for ; Fri, 27 Sep 2019 07:43:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=MybAgXlP/n30nTAGmmvzSP/QRilzsiOWxNYtZzgmlZ8=; b=pLjJeXLHdsjxJHRY49Y6Xek4X8frOLIJyu528Z1yHcvuDc84bQ82+VAJPLxAsyl+Fm L4E9Yw1QSIWwl1T/rm0WYJ7399wzf3LnuWuBguEDyNQ5ZSVxTeY3sMx0m+HUu12uUWRA qhF3+7FaOKjki7V444o8MMUQCZCknbBg/R7GKOijAwWh8T501JlsZL0uYflpc8VJ1FdB CCrWnIprQ+SLjTYkgmlGbkYt15mnrxZDhQtruRrXC9qkbQ036prx08MiolPUYC+GFhL1 ixPWO1GMlypEI5yEnkzvGfCkQAo7iHkI4WGke6+L/iXTZ4eCnO0Bu7UPflDTNHc2rr3Q b5Tw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=MybAgXlP/n30nTAGmmvzSP/QRilzsiOWxNYtZzgmlZ8=; b=bW4wxA0PBDmbc6x/KekswXE9P/QDkoaX0qCs998+teEQJDjRijaPSBjRQjFKjOpiCR p62h2F6Rt1BbqGa2mpTbHsmzUszf5kBZJ5oaOE2N59ui9hRMF6P7bzSUr48fCrGhW3wu xJ/FFU9VQ9KN53x1i0FDOt6uV99R0HePMkMTX5xgm1QBghGYWLgQd+woyiZm9IumGta2 Blfih9Jyvxu/W48zzhKxQ/o99PRglyke9ZiFGzQ8Fxnn1Sj2seEGh1DVBRNT4t4XSLo6 X9wQ91JVJXzyr11nEG6JyFTDVV/zXMZKQfQOpLPpo9P/9YOdLrqDkKbf/P87UVyLY54f BzSA== X-Gm-Message-State: APjAAAXz5HO7aF0YWQGN7bV3oKYspYOFFST2ef1ls27mIbjJqbxgutaf pydAw0SLFsRHC3rivvZPdLCOocMm X-Google-Smtp-Source: APXvYqwSOVAbPtneqD06dU/+A+XsppAGrkR3ZQQVpaN0VmhtWyQQIQOxT5umTu+ckZJuyfHImcW9yA== X-Received: by 2002:adf:f1d1:: with SMTP id z17mr3164860wro.330.1569595064395; Fri, 27 Sep 2019 07:37:44 -0700 (PDT) Received: from boken.gopro.lcl (73.136-14-84.ripe.coltfrance.com. [84.14.136.73]) by smtp.gmail.com with ESMTPSA id r18sm5827521wme.48.2019.09.27.07.37.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Sep 2019 07:37:43 -0700 (PDT) From: Matthieu Bouron To: ffmpeg-devel@ffmpeg.org Date: Fri, 27 Sep 2019 16:37:31 +0200 Message-Id: <20190927143732.455148-1-matthieu.bouron@gmail.com> X-Mailer: git-send-email 2.23.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] avformat/mov: parse sdtp atom and set the pkt disposable flag accordingly 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: Matthieu Bouron Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Allows the creation of the sdtp atom while remuxing MP4 to MP4. This atom is required by Apple devices (iPhone, Apple TV) in order to accept 2160p medias. --- libavformat/isom.h | 2 ++ libavformat/mov.c | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/libavformat/isom.h b/libavformat/isom.h index 69452cae8e..4943b80ccf 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -163,6 +163,8 @@ typedef struct MOVStreamContext { int64_t *chunk_offsets; unsigned int stts_count; MOVStts *stts_data; + unsigned int sdtp_count; + uint8_t *sdtp_data; unsigned int ctts_count; unsigned int ctts_allocated_size; MOVStts *ctts_data; diff --git a/libavformat/mov.c b/libavformat/mov.c index 8e916a28c6..7dfa07b45e 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -2959,6 +2959,40 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom) return 0; } +static int mov_read_sdtp(MOVContext *c, AVIOContext *pb, MOVAtom atom) +{ + AVStream *st; + MOVStreamContext *sc; + int64_t i, entries; + + if (c->fc->nb_streams < 1) + return 0; + st = c->fc->streams[c->fc->nb_streams-1]; + sc = st->priv_data; + + avio_r8(pb); /* version */ + avio_rb24(pb); /* flags */ + entries = atom.size - 4; + + av_log(c->fc, AV_LOG_TRACE, "track[%u].sdtp.entries = %" PRId64 "\n", + c->fc->nb_streams - 1, entries); + + if (sc->sdtp_data) + av_log(c->fc, AV_LOG_WARNING, "Duplicated SDTP atom\n"); + av_freep(&sc->sdtp_data); + sc->sdtp_count = 0; + + sc->sdtp_data = av_mallocz(entries); + if (!sc->sdtp_data) + return AVERROR(ENOMEM); + + for (i = 0; i < entries && !pb->eof_reached; i++) + sc->sdtp_data[i] = avio_r8(pb); + sc->sdtp_count = i; + + return 0; +} + static void mov_update_dts_shift(MOVStreamContext *sc, int duration) { if (duration < 0) { @@ -6767,6 +6801,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('s','t','s','z'), mov_read_stsz }, /* sample size */ { MKTAG('s','t','t','s'), mov_read_stts }, { MKTAG('s','t','z','2'), mov_read_stsz }, /* compact sample size */ +{ MKTAG('s','d','t','p'), mov_read_sdtp }, /* independant and disposable samples */ { MKTAG('t','k','h','d'), mov_read_tkhd }, /* track header */ { MKTAG('t','f','d','t'), mov_read_tfdt }, { MKTAG('t','f','h','d'), mov_read_tfhd }, /* track fragment header */ @@ -7231,6 +7266,7 @@ static int mov_read_close(AVFormatContext *s) av_freep(&sc->sample_sizes); av_freep(&sc->keyframes); av_freep(&sc->stts_data); + av_freep(&sc->sdtp_data); av_freep(&sc->stps_data); av_freep(&sc->elst_data); av_freep(&sc->rap_group); @@ -7820,6 +7856,11 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt) } if (st->discard == AVDISCARD_ALL) goto retry; + if (sc->sdtp_data && sc->current_sample <= sc->sdtp_count) { + uint8_t sample_flags = sc->sdtp_data[sc->current_sample - 1]; + uint8_t sample_is_depended_on = (sample_flags >> 2) & 0x3; + pkt->flags |= sample_is_depended_on == MOV_SAMPLE_DEPENDENCY_NO ? AV_PKT_FLAG_DISPOSABLE : 0; + } pkt->flags |= sample->flags & AVINDEX_KEYFRAME ? AV_PKT_FLAG_KEY : 0; pkt->pos = sample->pos;