From patchwork Thu Oct 25 12:59:17 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Storsj=C3=B6?= X-Patchwork-Id: 10783 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 9760644BE2D for ; Thu, 25 Oct 2018 15:59:26 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 10EE768A688; Thu, 25 Oct 2018 15:58:58 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f169.google.com (mail-lj1-f169.google.com [209.85.208.169]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2F76468091C for ; Thu, 25 Oct 2018 15:58:50 +0300 (EEST) Received: by mail-lj1-f169.google.com with SMTP id t22-v6so8109958lji.7 for ; Thu, 25 Oct 2018 05:59:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=martin-st.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=fXyHgROjPMgAO+f2U5oz5yEbwuhiuWJ+w55KWA9GOic=; b=hNWY8QQPAHH8FzOaH+2dUArxcHE7QFxjZRp74ePexF2XKJ/WPuPqh2LQOUPpPrWJ0c Dg3uJj7PBXrtwp2c9CSQ29cQaEycF5cgxua2AsiPocd/Mmx51ihQM3F3OExFtFDEmDWN 36wFKiPmp5ugYjCw0+qYcmUfld6Fhr9TqOcUHfip4B3SWrKf8VtZD40J90SxphgcFfOK 8gRI7SnNzNvyRNDeVPEkXFi8ZKT9amnYDU6IuJphEQnhkHtfFrW3SGdhMbvK8hx8vqG6 iLY9QVKXiZfVRRwqJHQI2rCK487elH/y/4ohi56NdXPm7EjYnQmloqMcHwkjEZ0POaK2 l20w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=fXyHgROjPMgAO+f2U5oz5yEbwuhiuWJ+w55KWA9GOic=; b=bLQxpIM1+p6Oiyva0NAryUOQ6u3gscf1NRmVulRVmq9uxHYYVJz9pCsnV1/E/dHkr1 6B0lyjzjDOhdiq/xD8wEg40a57IfWnjP3onGBIOqo6Vz4VTOBnGuz50P5YT+UGdLQXwV JCUKfW98zywEJzqOzovYuTstwjB27uYQziyl5+3YHgJxqAhdtt0Xyvs8vOwgtYEW9LYH 0KC9mf/up9jGE2eAs2IerSLMN6ogrB9NbQPonM56CaPkNq/YgC/TXAeueKbJDsiZ3GFR X2MShsRAZgIcrzjwilfobxiQEcsyfLeKgq5xESHv2OL7mRx6+o4IX1u4M5tmWHciq2U6 UugQ== X-Gm-Message-State: AGRZ1gJneXFpvfUBqCi84vvSZ9aicg9hfIFFWkRYTT+DcAlJE03YsNnf oG6Wrf5tNnNypHSFGEm1auTs43o6FqQMtg== X-Google-Smtp-Source: AJdET5emKykERZTYi3opd8uvIG9WuV3Cvo6qcgLu2OnHdTeA7TlpuJnpXQORBHHDogut7fCayO/66A== X-Received: by 2002:a2e:92ca:: with SMTP id k10-v6mr1189733ljh.103.1540472358529; Thu, 25 Oct 2018 05:59:18 -0700 (PDT) Received: from localhost (dsl-tkubng21-58c01c-243.dhcp.inet.fi. [88.192.28.243]) by smtp.gmail.com with ESMTPSA id o72sm1265154lfg.33.2018.10.25.05.59.18 for (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 25 Oct 2018 05:59:18 -0700 (PDT) From: =?UTF-8?q?Martin=20Storsj=C3=B6?= To: ffmpeg-devel@ffmpeg.org Date: Thu, 25 Oct 2018 15:59:17 +0300 Message-Id: <20181025125917.31923-2-martin@martin.st> X-Mailer: git-send-email 2.17.1 (Apple Git-112) In-Reply-To: <20181025125917.31923-1-martin@martin.st> References: <20181025125917.31923-1-martin@martin.st> Subject: [FFmpeg-devel] [PATCH 2/2] flvdec: Add an option for exporting unknown metadata packets as opaque data 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavformat/flv.h | 1 + libavformat/flvdec.c | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/libavformat/flv.h b/libavformat/flv.h index 3aabb3adc9..3571b90279 100644 --- a/libavformat/flv.h +++ b/libavformat/flv.h @@ -66,6 +66,7 @@ enum { FLV_STREAM_TYPE_VIDEO, FLV_STREAM_TYPE_AUDIO, FLV_STREAM_TYPE_SUBTITLE, + FLV_STREAM_TYPE_DATA, FLV_STREAM_TYPE_NB, }; diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index ffc975f15d..b4e4ff3907 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -72,6 +72,8 @@ typedef struct FLVContext { int64_t *keyframe_filepositions; int missing_streams; AVRational framerate; + + int export_opaque_meta; } FLVContext; static int probe(AVProbeData *p, int live) @@ -143,7 +145,9 @@ static AVStream *create_stream(AVFormatContext *s, int codec_type) st->codecpar->codec_type = codec_type; if (s->nb_streams>=3 ||( s->nb_streams==2 && s->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE - && s->streams[1]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE)) + && s->streams[1]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE + && s->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_DATA + && s->streams[1]->codecpar->codec_type != AVMEDIA_TYPE_DATA)) s->ctx_flags &= ~AVFMTCTX_NOHEADER; if (codec_type == AVMEDIA_TYPE_AUDIO) { st->codecpar->bit_rate = flv->audio_bit_rate; @@ -1001,7 +1005,7 @@ retry: int type; meta_pos = avio_tell(s->pb); type = flv_read_metabody(s, next); - if (type == 0 && dts == 0 || type < 0 || type == TYPE_UNKNOWN) { + if (type == 0 && dts == 0 || type < 0 || (type == TYPE_UNKNOWN && !flv->export_opaque_meta)) { if (type < 0 && flv->validate_count && flv->validate_index[0].pos > next && flv->validate_index[0].pos - 4 < next @@ -1015,6 +1019,8 @@ retry: return flv_data_packet(s, pkt, dts, next); } else if (type == TYPE_ONCAPTION) { return flv_data_packet(s, pkt, dts, next); + } else if (type == TYPE_UNKNOWN) { + stream_type = FLV_STREAM_TYPE_DATA; } avio_seek(s->pb, meta_pos, SEEK_SET); } @@ -1054,10 +1060,13 @@ skip: } else if (stream_type == FLV_STREAM_TYPE_SUBTITLE) { if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) break; + } else if (stream_type == FLV_STREAM_TYPE_DATA) { + if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA) + break; } } if (i == s->nb_streams) { - static const enum AVMediaType stream_types[] = {AVMEDIA_TYPE_VIDEO, AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_SUBTITLE}; + static const enum AVMediaType stream_types[] = {AVMEDIA_TYPE_VIDEO, AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_SUBTITLE, AVMEDIA_TYPE_DATA}; st = create_stream(s, stream_types[stream_type]); if (!st) return AVERROR(ENOMEM); @@ -1153,6 +1162,8 @@ retry_duration: size -= ret; } else if (stream_type == FLV_STREAM_TYPE_SUBTITLE) { st->codecpar->codec_id = AV_CODEC_ID_TEXT; + } else if (stream_type == FLV_STREAM_TYPE_DATA) { + st->codecpar->codec_id = AV_CODEC_ID_NONE; // Opaque AMF data } if (st->codecpar->codec_id == AV_CODEC_ID_AAC || @@ -1253,7 +1264,8 @@ retry_duration: if ( stream_type == FLV_STREAM_TYPE_AUDIO || ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY) || - stream_type == FLV_STREAM_TYPE_SUBTITLE) + stream_type == FLV_STREAM_TYPE_SUBTITLE || + stream_type == FLV_STREAM_TYPE_DATA) pkt->flags |= AV_PKT_FLAG_KEY; leave: @@ -1290,6 +1302,7 @@ static const AVOption options[] = { { "flv_full_metadata", "Dump full metadata of the onMetadata", OFFSET(dump_full_metadata), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD }, { "flv_ignore_prevtag", "Ignore the Size of previous tag", OFFSET(trust_datasize), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD }, { "missing_streams", "", OFFSET(missing_streams), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 0xFF, VD | AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY }, + { "export_opaque_meta", "", OFFSET(export_opaque_meta), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD }, { NULL } };