From patchwork Fri Feb 2 20:59:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: rshaffer@tunein.com X-Patchwork-Id: 7493 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.150.1 with SMTP id c1csp851839jai; Fri, 2 Feb 2018 12:59:59 -0800 (PST) X-Google-Smtp-Source: AH8x224OrtbcwEyyLeeVQrA4NPfLezxz881zApzfaUYSUnTNyamR6AyWjenZx2fa5xO3XvSRiL/h X-Received: by 10.223.142.164 with SMTP id q33mr26496664wrb.267.1517605199567; Fri, 02 Feb 2018 12:59:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517605199; cv=none; d=google.com; s=arc-20160816; b=KXH8LmN5jsuKzhAgLfmW+uK+n0a5krzQW+1tF9/kATSMURpATsaMTr3mtuGtYXVM7c GmO9lmDpu02I2ugwbuAXgVCyPeDw67upFUSScILNEVrjSpVfWBtdv8eHGHLVckAJc/5q aJnPqLoUfwrbEc1JLC3IvOME6jIR4ezXsjVIph4/4EmM+pYrn7bZkWZKM+jzI3wM4G21 1NJuh4CWclpMVq6dVVZ3/t/ALD0Gy3cH9Raa5c9liEhiMw4w9PZtmFOKKhjrt0ACm2Xa E4X9aMdSCXua5jCq6oKdMEpyK9TphrfwHRSb5mEKHCjLJP7bqHHT3GBop85SwsWcKgcY 5DTg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=aJc9wsy0Yo/z61HK3x2exkOU7jGGMKoqp77NMtUQY/0=; b=I1MpsXQ79HpooRJJb3WsHTnEhD8zWjW2+bFszbDyURhp1ZxoU5ElcF8WJBKWMkbPVs E97rwHZCR6v4BvdCT+N2guJQhdk2NMtvPvB21NpcDMdCVdTdsHpRObxclOqsIGg+eoq/ nIZbvu1yUw4oFa770Luku4bujPcrzgybfacPBYRxGDaVPDHtUqjbvAZNbp8E3kACnvW8 v6F5Q3qE84WVR35nIRZhcxkh/RVuNTeXLetTmlySc9HpR5X+m2ghpTxWxQtvJMgYFTHd rejwxGTvJJSdbX351yMokNK5vS34vswTWAr0KjG3A2iPjRY8Rd/aavn0HJ4g+QhttR2K m8VA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@tunein-com.20150623.gappssmtp.com header.s=20150623 header.b=qLkRZmrT; 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 t135si1718300wmt.257.2018.02.02.12.59.58; Fri, 02 Feb 2018 12:59:59 -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; dkim=neutral (body hash did not verify) header.i=@tunein-com.20150623.gappssmtp.com header.s=20150623 header.b=qLkRZmrT; 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 D953168834A; Fri, 2 Feb 2018 22:59:50 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg0-f45.google.com (mail-pg0-f45.google.com [74.125.83.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6483E68077F for ; Fri, 2 Feb 2018 22:59:44 +0200 (EET) Received: by mail-pg0-f45.google.com with SMTP id o1so385015pgn.4 for ; Fri, 02 Feb 2018 12:59:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tunein-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=mplXhBrTSvOfFbCDFB8Cfe+Hzk0tIP5bW6ClqzrWbw4=; b=qLkRZmrT9sS23VYO2PsHqEpnvWuj6PmHnj+w07O3SYN2Efl4+14XvW9ot51utvY0W5 V5jeuNQob14uGICFt2eksOJ2bUUCfQAQx1luwo6fueP7BBhnpn4K/lmwdNaGhDrkx4lX jk485PqfSdfmPQLLk7ty1nXBaDixdvT4+AhB1qCLKD8E/lYlHqhU1A4GDDuWTCF2LFk3 NwB2gc8sSuTujAn1zrvpdQvvZS11kUEkm7e43lBcVsTxeDeFcfoeVSDxu292dH/QWYqK O9DH5+GHt2rkz7ddpowbluBTb9SlQvFm2l6P0u6+u6AjvDF6pLmJocQdtl/Ow7xYAC9j /YYA== 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; bh=mplXhBrTSvOfFbCDFB8Cfe+Hzk0tIP5bW6ClqzrWbw4=; b=XPl94b72B7JiwgJ80a1MjUG4LAq4P0pQ+Zjxd7E0HMPNRx7VVBJWqkB3pGOv7rDUR0 mkV3O5vPDpS4ahIZEDIi7kcie5mL/zc+tBzSVa0X0iNL0i5RQYxGl3tY3vB4bRj7bFVb 0tRP1T8x7C+QlCJTm/LjHHvzBcx+1D5L7Yp9YSTTs/b5ZAEPo3hgRFnEdmQKInUDym2e lsEuaPu+GZ01UvKlJWkynKI8Ym/8uD0cZLi+o4TT7oDPyHgOsZMAdW2wCJJDFBsKAe1V HddFM3RmzjKDG/NFAGDUTJZoDzjL7cuLTg9Up1hXbNx73e7HrEPWGyKSbZoMUmkmVbFi G2vA== X-Gm-Message-State: AKwxytfsgo0J1vfS4NuCOkMoE/MpRMDSaYvtHCrsRZAztYYl60FdbzrZ d7P3lNY0e/erWje2JinzVLGJt3s6pws= X-Received: by 10.101.90.138 with SMTP id c10mr30882200pgt.6.1517605188621; Fri, 02 Feb 2018 12:59:48 -0800 (PST) Received: from 000984.tunein.corp ([199.87.87.163]) by smtp.gmail.com with ESMTPSA id d4sm4080469pgc.58.2018.02.02.12.59.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 02 Feb 2018 12:59:47 -0800 (PST) From: rshaffer@tunein.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 2 Feb 2018 12:59:45 -0800 Message-Id: <20180202205945.71872-1-rshaffer@tunein.com> X-Mailer: git-send-email 2.14.3 (Apple Git-98) Subject: [FFmpeg-devel] [PATCH] libavformat/hls: Support metadata updates from subdemuxers 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: Richard Shaffer MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Richard Shaffer If a subdemuxer has the updated metadata event flag set, the metadata is copied to the corresponding stream. The flag is cleared on the subdemuxer and the appropriate event flag is set on the stream. --- This is iteration #2. In this version, we don't try to copy metadata from subdemuxer streams, only from the AVFormatContext. The case where metadata is updated on a sub-demuxer stream would have probably never happened. The above change made the code that was previously in the update_metadata_from_subdemuxer function a little simpler. That function was also kind of ugly, because in one case it read and set flags, and in another it didn't. It seemed simpler just to move the respective updates into read_header and read_packet, respectively, so that's what I did. -Richard libavformat/hls.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/libavformat/hls.c b/libavformat/hls.c index 9bd54c84cc..c578bf86e3 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -1062,6 +1062,7 @@ static void handle_id3(AVIOContext *pb, struct playlist *pls) /* demuxer not yet opened, defer picture attachment */ pls->id3_deferred_extra = extra_meta; + ff_id3v2_parse_priv_dict(&metadata, &extra_meta); av_dict_copy(&pls->ctx->metadata, metadata, 0); pls->id3_initial = metadata; @@ -1960,6 +1961,7 @@ static int hls_read_header(AVFormatContext *s) if (pls->id3_deferred_extra && pls->ctx->nb_streams == 1) { ff_id3v2_parse_apic(pls->ctx, &pls->id3_deferred_extra); avformat_queue_attached_pictures(pls->ctx); + ff_id3v2_parse_priv(pls->ctx, &pls->id3_deferred_extra); ff_id3v2_free_extra_meta(&pls->id3_deferred_extra); pls->id3_deferred_extra = NULL; } @@ -1986,6 +1988,13 @@ static int hls_read_header(AVFormatContext *s) if (ret < 0) goto fail; + /* + * Copy any metadata from playlist to main streams, but do not set + * event flags. + */ + if (pls->n_main_streams) + av_dict_copy(&pls->main_streams[0]->metadata, pls->ctx->metadata, 0); + add_metadata_from_renditions(s, pls, AVMEDIA_TYPE_AUDIO); add_metadata_from_renditions(s, pls, AVMEDIA_TYPE_VIDEO); add_metadata_from_renditions(s, pls, AVMEDIA_TYPE_SUBTITLE); @@ -2170,6 +2179,17 @@ static int hls_read_packet(AVFormatContext *s, AVPacket *pkt) return ret; } + // If sub-demuxer reports updated metadata, copy it to the first stream + // and set its AVSTREAM_EVENT_FLAG_METADATA_UPDATED flag. + if (pls->ctx->event_flags & AVFMT_EVENT_FLAG_METADATA_UPDATED) { + if (pls->n_main_streams) { + st = pls->main_streams[0]; + av_dict_copy(&st->metadata, pls->ctx->metadata, 0); + st->event_flags |= AVSTREAM_EVENT_FLAG_METADATA_UPDATED; + } + pls->ctx->event_flags &= ~AVFMT_EVENT_FLAG_METADATA_UPDATED; + } + /* check if noheader flag has been cleared by the subdemuxer */ if (pls->has_noheader_flag && !(pls->ctx->ctx_flags & AVFMTCTX_NOHEADER)) { pls->has_noheader_flag = 0;