From patchwork Fri May 18 03:49:42 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: 9008 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp4829905jad; Thu, 17 May 2018 20:56:18 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrk/tHMn8wrRBQCBPNbTJB0WHuhnKLRzw9YlOIaZesVneVLLuv2VpNOzMUkuxV5XVFd9RAV X-Received: by 2002:a1c:b646:: with SMTP id g67-v6mr3557206wmf.88.1526615778059; Thu, 17 May 2018 20:56:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526615778; cv=none; d=google.com; s=arc-20160816; b=z3OnSqCk//R7L4RdJ0kLmmbq6aex8InNRmExdyIIgraRZ16rl2cusAvUbXeEtyfG7M RHK+sa7VQ8yEQbs+t30TYSG+Vvox96nLF8ga9XdA+18ujuwqHYlMn0sYu2k0TsJLspz3 v5WN5H0L2Oq+nR0ekJvSpWE6iunLa6Iv6vUSKouLgQHzBadkFJM/pbI03/l/0ddV19X+ Vs3XF4VtqrxOHHDJGkgcYvw01qw21giGPMGVbW9AuOPijl/+5EYwjum3fKht36qhgP5X caJ9tmL86o46b5wRE9vrrNb7OdJ7qlzZFZWM6iN3VpYdWx3N2BMK3pljtum/paJmcR2D HqCA== 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=+23+arWcoes3tj6mNGRNQi2tZXz4Oqboz5JZHf25AJs=; b=h3M/Kgil8YQsjwJDIRgkjLJW1AeNHAfHGsU2Xink74QmO20+wqMBFnkuF0HEYEOIGU xy2oSf8a5u9EB6Z8zyjipVLpRWDems5FkGhQVTAixXBM7Aso0wr5EDL1rQdj7jY6CeBx N350E1SwncUG6FQ48HbZAx/dxF6mD0bi7tNRoCcOX0t75I+ahPJJlJvBwN9FsFc+QRZ8 uyWR9tPeqLPIWN5ryy1IG+oBkhW26ThveRT4vERQawtM44sjOgMMZnKf/CAHY5PPZ2fM ZYyh8OPazorQUk/FhH423pcEZXMFlGh4ZWUG9ppS1FmikTOKvv1tnuPRbN5JykyG7XYN JoNw== 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=EoiJQcN4; 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 b50-v6si3427161wrb.350.2018.05.17.20.56.16; Thu, 17 May 2018 20:56:17 -0700 (PDT) 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=EoiJQcN4; 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 EC0A068A228; Fri, 18 May 2018 06:55:35 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi0-f68.google.com (mail-oi0-f68.google.com [209.85.218.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B9F7F689B7C for ; Fri, 18 May 2018 06:55:28 +0300 (EEST) Received: by mail-oi0-f68.google.com with SMTP id e80-v6so5950473oig.11 for ; Thu, 17 May 2018 20:56:08 -0700 (PDT) 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=SWzTO/K3wElma2ybqqUsFjdYrml6oGPsglXrjFKSDGM=; b=EoiJQcN4PiGE38v/0u+x0nprZSZHyX7uVzZ5w8PAWZxg7lg2D5RQVqk4+SjtOvA1sF 66LPAHlhasUfs7oAgSolSgXf2VCjGh/3XKu25keaiAGxUc57YxtZHW8C91DgguA3pBz3 S2pm9krhR0nQ7W97jSmAsS8sLRMziVT0f+4N5O3PPTQlD359fHwDJcQR4MUUgnlSQg2X XxvWZ1YLH3pYqpjPghzVp6aXTBOYJuvABxlrppFLi0Xt33ZYkgQjESHFp4hdcNMKiqpk B5VKNim6PZsxQyLhGVv0K24pZIAbdSdfdofQUsK/I3BM1awZVXK4yiwY7QizkCKvMPzY 0XCA== 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=SWzTO/K3wElma2ybqqUsFjdYrml6oGPsglXrjFKSDGM=; b=oyX7QGul2BWnEPRwudhxKapr0ECpmtpWeuZnZzJ7tpjPGm5hFHh/hRknPYGXgbbjBU QhEJTahQhHfOsxKotjEhFY4G3nMuQewsMCp3+01cS5uwDSjPxw7qW9YOjB4FBYA+b4AT O7H6SjlR9A1/AJGJm9WY7gT0+A0JAEVvOemJYwtgfx768gflLO+918HBexY+uJUiTGHg +qlJAT78UY5n+N1VlePpU3QgfBv2Hzq/BWNypLH/JGcmBfaFtgwKiL7daimAIvi3mfdj tpqBQZp8X9AaJ7CGgUXnbe7OCLFpmAtKIjy4O9JAkxG0uCGsK8Bhhlj/3cGMIQvUu9IO ctdQ== X-Gm-Message-State: ALKqPwdvVoXrJ+K7agWFHmiMc/46JcqBiUw/ApTjSVF4RxEwlKcPCgoN 5365C/h4HcpWDYw1v8Cj5QagIihD X-Received: by 2002:aca:e18b:: with SMTP id y133-v6mr4543162oig.120.1526615386754; Thu, 17 May 2018 20:49:46 -0700 (PDT) Received: from 000984.attlocal.net (104-58-207-63.lightspeed.sntcca.sbcglobal.net. [104.58.207.63]) by smtp.gmail.com with ESMTPSA id u104-v6sm3539032ota.16.2018.05.17.20.49.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 17 May 2018 20:49:45 -0700 (PDT) From: rshaffer@tunein.com To: ffmpeg-devel@ffmpeg.org Date: Thu, 17 May 2018 20:49:42 -0700 Message-Id: <20180518034942.6480-1-rshaffer@tunein.com> X-Mailer: git-send-email 2.15.1 (Apple Git-101) Subject: [FFmpeg-devel] [PATCH] avformat/hls: Properly expose intercepted ID3 tags to the API. 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 The HLS demuxer will process any ID3 tags at the beginning of a segment in order to obtain timestamp data. However, when this data was parsed on a second or subsequent segment, the updated metadata would be discarded. This change preserves the data and also sets the AVSTREAM_EVENT_FLAG_METADATA_UPDATED event flag when appropriate. --- libavformat/hls.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/libavformat/hls.c b/libavformat/hls.c index 3d4f7f2647..3e2edb3484 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -982,18 +982,8 @@ static void parse_id3(AVFormatContext *s, AVIOContext *pb, } /* Check if the ID3 metadata contents have changed */ -static int id3_has_changed_values(struct playlist *pls, AVDictionary *metadata, - ID3v2ExtraMetaAPIC *apic) +static int id3_has_changed_values(struct playlist *pls, ID3v2ExtraMetaAPIC *apic) { - AVDictionaryEntry *entry = NULL; - AVDictionaryEntry *oldentry; - /* check that no keys have changed values */ - while ((entry = av_dict_get(metadata, "", entry, AV_DICT_IGNORE_SUFFIX))) { - oldentry = av_dict_get(pls->id3_initial, entry->key, NULL, AV_DICT_MATCH_CASE); - if (!oldentry || strcmp(oldentry->value, entry->value) != 0) - return 1; - } - /* check if apic appeared */ if (apic && (pls->ctx->nb_streams != 2 || !pls->ctx->streams[1]->attached_pic.data)) return 1; @@ -1019,6 +1009,15 @@ static void handle_id3(AVIOContext *pb, struct playlist *pls) int64_t timestamp = AV_NOPTS_VALUE; parse_id3(pls->ctx, pb, &metadata, ×tamp, &apic, &extra_meta); + ff_id3v2_parse_priv_dict(&metadata, &extra_meta); + av_dict_copy(&pls->ctx->metadata, metadata, 0); + /* + * If we've handled any ID3 metadata here, it's not going to be seen by the + * sub-demuxer. In the case that we got here because of an IO call during + * hls_read_header, this will be cleared. Otherwise, it provides the + * necessary hint to hls_read_packet that there is new metadata. + */ + pls->ctx->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED; if (timestamp != AV_NOPTS_VALUE) { pls->id3_mpegts_timestamp = timestamp; @@ -1037,12 +1036,10 @@ 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; } else { - if (!pls->id3_changed && id3_has_changed_values(pls, metadata, apic)) { + if (!pls->id3_changed && id3_has_changed_values(pls, apic)) { avpriv_report_missing_feature(pls->ctx, "Changing ID3 metadata in HLS audio elementary stream"); pls->id3_changed = 1; } @@ -1939,8 +1936,15 @@ static int hls_read_header(AVFormatContext *s) * Copy any metadata from playlist to main streams, but do not set * event flags. */ - if (pls->n_main_streams) + if (pls->n_main_streams) { av_dict_copy(&pls->main_streams[0]->metadata, pls->ctx->metadata, 0); + /* + * If we've intercepted metadata, we will have set this event flag. + * Clear it to avoid confusion, since otherwise we will flag it as + * new metadata on the next call to hls_read_packet. + */ + pls->ctx->event_flags = ~AVFMT_EVENT_FLAG_METADATA_UPDATED; + } add_metadata_from_renditions(s, pls, AVMEDIA_TYPE_AUDIO); add_metadata_from_renditions(s, pls, AVMEDIA_TYPE_VIDEO);