From patchwork Fri Feb 2 02:44:34 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: 7481 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.156.27 with SMTP id q27csp319771jak; Thu, 1 Feb 2018 18:44:47 -0800 (PST) X-Google-Smtp-Source: AH8x224p0uD14ogbfBKQO+H/Y8pW3Cn8RKQJDFYQmjLp8YvyvdgWVFSTAVdvxyogqV7nNu9ENnIT X-Received: by 10.28.38.132 with SMTP id m126mr25982796wmm.141.1517539487486; Thu, 01 Feb 2018 18:44:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517539487; cv=none; d=google.com; s=arc-20160816; b=RmC9nshkKmBpfMLwr3GlYgkY0J507L7W+30MbUfRvnTo5r/uVPK+ofKUSx69ora9ao 9RDoqWp+iiru7MrHQw4AgcylweoINqAgEuWChflrbKvRb6GachooRL3sb2FlnfVWUh5q F/qHiu3+6pLUUcX9w9V2oboFVCaG0/RF6o/5tMRWZfekBGUcOEWKAfij0VI40PJ+4Krb gQR/In3JTkL33zosVuYCMHkWJz5aGZ+XSRaAa/m6vbUIQvTsMJ+xSQlUM4TTAs5XvQLf WNNQwZ9ZM2nglA4KrmSRbBP4Q/GuoC4XaZlLTMOUbQ2yebDJt/8epmAYFik4cT/XzNQe m1tw== 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=VgsNp6eYwPM8+1lEFtacceda1PwdVDuB5zZNRN4/4Cg=; b=zRAt7bokMf3z41ibFNpCBGGfqDMSQN8w1HwHzvFnVhZ44ydXFDAPz+VgvUuKkfMNCx Q+MRlLyCo0wYPY+VUUY8nBdyk4GAcjTsxCGDUAlhP1zTXkrawvQlj3JGbAUcXXD2j1IS JhT0K1XG2Wrn8QlqaonY1Fhk5mXHe08qyecrf4xGSjMoxG2gylVJenPVmWqwxgeO7kqx OVmZwEg89bPOgCBRUaZ8PvBur75LHwWFSE/7H8w2bF63tXw1CTfrZG416tzf+8Mw7esR WqOkn1x14mAb8rpkLhijdZX9f9k4BfejItryjSKk0Iqbg/NiHjMG7OS+hFvw97oRiODS DPRQ== 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=jI/Klrg3; 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 u6si850130wrb.281.2018.02.01.18.44.47; Thu, 01 Feb 2018 18:44:47 -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=jI/Klrg3; 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 3334668971A; Fri, 2 Feb 2018 04:44:40 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg0-f54.google.com (mail-pg0-f54.google.com [74.125.83.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 30CE66891DE for ; Fri, 2 Feb 2018 04:44:33 +0200 (EET) Received: by mail-pg0-f54.google.com with SMTP id 141so2766890pgd.8 for ; Thu, 01 Feb 2018 18:44:39 -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=aXQkUfmB5bBckvdmDIX7hOrszSj3c6LGtTPBo4v+ce8=; b=jI/Klrg3O1v23GObh1HlbbA7Ra3F9XUY/shmOeFQgX9yCvbkBZ4V5ge/lhzrGpB0hx G52S6p3zS5KMqMnE7sCOqq6XZrSI9sbyu7xtm0+HEjoOVJwfNl25HdPnsfHF7ds6Fg3y OEKd4Fnhw6riEYT52sIdUfQ7zmoFSicvkxrNy0U6FoxaKdH7LClCuyaKVo2uNKMd6ySG uqUq4cXhCiISdsNippVxfmhVHjeiOAUhdYuvZoRz4vk9v/BrhIjkoSiQpP4/QiRLK6cr E7Pq5tmsGGOKegEDIWPoG94yThtwKbaf3z/7wGaPvn+BkGqoBlqG8we/wD6/z/sVi9xi Og3g== 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=aXQkUfmB5bBckvdmDIX7hOrszSj3c6LGtTPBo4v+ce8=; b=gfNe2Aim0+p9funWQXQBuwFWKUym2B9l03eEYuzYxsmm8BT/R+F7KQqiWpoA29/TOU AwL6yPM3TSeiLAarfWvbAd1IV+9oJivvupFy5hSTSVEQRbSop4n96PRfiFDv7Hgv/G9V 8L5dQuFcq1zCOSlDXYuhP3R1ZMQc/4jjrkLAXnB1V3RTzOB387tLfGnkEZ4jxZNmKv6Y CATR/7QPuqapChSUFADYjgpd09tZcOY8QAysVGmj8LLd8HaZ/ph0yLriaoLBRA/EWfen UNwNOlIcOCoaupi4daRALPbeuDI+LfxiljUGEZOaV/2n3EYs3J6RhX92YRpN0wpNhudV Gs8A== X-Gm-Message-State: AKwxytdY1Fjn+QFYYXmZ0odiz4cLOxMHAI8GoPxW66xNmKWBLJmCD9dt OlX68A2Cii5t7sglcMUE8t1sHIkX4e8= X-Received: by 10.101.87.195 with SMTP id q3mr29972913pgr.428.1517539477352; Thu, 01 Feb 2018 18:44:37 -0800 (PST) Received: from 000984.tunein.corp ([199.87.87.163]) by smtp.gmail.com with ESMTPSA id e26sm1002963pfi.76.2018.02.01.18.44.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 01 Feb 2018 18:44:36 -0800 (PST) From: rshaffer@tunein.com To: ffmpeg-devel@ffmpeg.org Date: Thu, 1 Feb 2018 18:44:34 -0800 Message-Id: <20180202024434.68757-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 semi-related to a patch I recently sent to enable parsing ID3 tags from .aac files between ADTS headers. However, it may be generically useful for other segment formats that support metadata updates. -Richard libavformat/hls.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/libavformat/hls.c b/libavformat/hls.c index 9bd54c84cc..e48845de34 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; @@ -1589,6 +1590,34 @@ static void add_metadata_from_renditions(AVFormatContext *s, struct playlist *pl } } +/* update metadata on main streams, if necessary */ +static void update_metadata_from_subdemuxer(struct playlist *pls, int ignore_flags) { + int i; + + if (pls->n_main_streams) { + AVStream *st = pls->main_streams[0]; + if (ignore_flags) { + av_dict_copy(&st->metadata, pls->ctx->metadata, 0); + } else if (pls->ctx->event_flags & AVFMT_EVENT_FLAG_METADATA_UPDATED) { + av_dict_copy(&st->metadata, pls->ctx->metadata, 0); + pls->ctx->event_flags &= ~AVFMT_EVENT_FLAG_METADATA_UPDATED; + st->event_flags |= AVSTREAM_EVENT_FLAG_METADATA_UPDATED; + } + } + + for (i = 0; i < pls->ctx->nb_streams; i++) { + AVStream *ist = pls->ctx->streams[i]; + AVStream *st = pls->main_streams[i]; + if (ignore_flags) { + av_dict_copy(&st->metadata, ist->metadata, 0); + } else if (ist->event_flags & AVSTREAM_EVENT_FLAG_METADATA_UPDATED) { + av_dict_copy(&st->metadata, ist->metadata, 0); + ist->event_flags &= ~AVSTREAM_EVENT_FLAG_METADATA_UPDATED; + st->event_flags |= AVSTREAM_EVENT_FLAG_METADATA_UPDATED; + } + } +} + /* if timestamp was in valid range: returns 1 and sets seq_no * if not: returns 0 and sets seq_no to closest segment */ static int find_timestamp_in_playlist(HLSContext *c, struct playlist *pls, @@ -1960,6 +1989,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 +2016,12 @@ 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. + */ + update_metadata_from_subdemuxer(pls, 1); + 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 +2206,8 @@ static int hls_read_packet(AVFormatContext *s, AVPacket *pkt) return ret; } + update_metadata_from_subdemuxer(pls, 0); + /* 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;