From patchwork Sun Jul 25 13:04:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiaolei Yu X-Patchwork-Id: 29049 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp2986795ios; Sun, 25 Jul 2021 06:35:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwBSj267Dsa+TctzHPjWhVqCBBTg9Ui/YPbP03W7jiDfc3coBl76Ib1qVSCfCkRLe8jCGU6 X-Received: by 2002:aa7:d998:: with SMTP id u24mr7207375eds.64.1627220140997; Sun, 25 Jul 2021 06:35:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627220140; cv=none; d=google.com; s=arc-20160816; b=EjkVk5c7vrY7ZjZC289nWAGtCX02ZWoOmRIQKrubJt5C7prJETMH7Ec8XBZM2F2Vi1 LsaxbTYiN7yEIPqi852schIRd9sZfeA9pHZo/YG9TLn8Q1epDPaWw1o6hhPCXlSIxWG0 RrFAVHR9Xr5SaXwzDhF5CeKmX/o0TNU71I0RIhXEo8iBKIkcdy8BzQ1XI0oZR9APRHXE 41oOGWYk2ZPBRUdGBlf+XIIs1gL7+RiTmZ1EzcxTLWh0KNk9wkBsnU2VMh5Ed+RQscwy wtKwK0y1TYtfmIa7MbGcKRlnA0fffh2FJFJbHPBRFhdmWYu1Oh0XAtng98KHVc08scKK konA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:content-language:mime-version:user-agent:date :message-id:to:from:dkim-signature:delivered-to; bh=eYeSSfTvLc7vq6IOWLlfvO63oE9wY9JpEjxCkdrvs/s=; b=NjbGLJVIxmTj+DSdOB/ZsbRsy66k9WK5wyF+XvOirbxWF0sungZaGB0VwAS4gYG6h1 vtGVGOtq0kcm+IUEx5OV7KM4X/wyHmz31PLwkXnqZfHqWISjB8TmABUmx6gThMApgh08 pkKBMSaUVy8+UN4PBqRQBcnQdq741ToagZtYSCTtmwI2uWPXb3YjxJCV4w4bn75KQe12 cD3pqsM8ntOnI9ejjRK1G8lr/AaSCVNv321RweE6Tht92XBghF/MpZccp72pdAwwQbcz m6NIwSEInMDqnixKm15SgyHtV0f1Z1wZ8FK/th22YQ1Zq6yqgZyB61ylKAnOnOC8IN/D WMoQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="LRk/T7ME"; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ji4si28951898ejc.469.2021.07.25.06.35.40; Sun, 25 Jul 2021 06:35:40 -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=@gmail.com header.s=20161025 header.b="LRk/T7ME"; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B5D9968A457; Sun, 25 Jul 2021 16:35:36 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CC04C689C38 for ; Sun, 25 Jul 2021 16:35:29 +0300 (EEST) Received: by mail-pl1-f172.google.com with SMTP id d1so1236269pll.1 for ; Sun, 25 Jul 2021 06:35:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:subject:to:message-id:date:user-agent:mime-version :content-language:content-transfer-encoding; bh=6ZiK3VmFqo40shMrDaN+z8RlGSILktrWqjXjYL6TsKI=; b=LRk/T7MEKe9YEq+VJjJ1hVb3HPvJ2F0zlGBKc9WniSBIBvt6UDTnHQyzzzxpKnV1Oz fX8sevZ1jaAQ11cpf90iDGkxJ77gfNHaUS1eoKajwh0ImQYB8faoyGvjgBTk5jgr6ZIn ilEKEvXvK03LoxfqADKuIWxkKwBDwrGZfcxtbU9fEbCoVomvnRg6yIldJA7sIEETio3+ vx+Xx7KdU7C3F5YJNMgtlrqnrv9LTW/Vnyib4VMrGEOvf0Ec30s9l/7TIVdmOSWhlq/i /OMGGAPAND/TMrCqVVwux7iceUD6vsXzGohLmA+bxZg/ekgfBEnhMpbkDeljYsikn9T1 xs8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:message-id:date:user-agent :mime-version:content-language:content-transfer-encoding; bh=6ZiK3VmFqo40shMrDaN+z8RlGSILktrWqjXjYL6TsKI=; b=FdGh4p8X52YkhqN8ld9OWoVcTa5+iLQgnQfXAYQXZ1SlTZjRjOJ5w3Jx/lgyRUf+tu v+a/ymBf37D9gLMSuaZmHnoI8OOY0tp2ZizOsTD+o5XLUFqnPPV+32xJ1qe2WW7Ag9zj 12Lj1p4kX8Ye3aSHv8ljyg93JreCHSK/ZrZJsfFX2DfIW4fCSK8wpqFvNaQ7qF+hFweQ ON+kiK2Yj+Til6acpjvbSNggtRjlpM4yxWLqjUKarrdJ7NYnCA6hvMBf3+nv5+jRqp1T WbR7+5odoJf5S467ggpQbAnrd1ZYpubogwxiQl3Gf1AAaq3RfLFCD4MSSoQ1+dGKsZeo +dWA== X-Gm-Message-State: AOAM53291plyLAw9Z9KDDbgUplOy9xjmtT3m/MOdKUzud5FM5qf9uSwJ KFmQwjeRv+14IGfSyugvh25VnKbiam+eBh+a X-Received: by 2002:a65:45c7:: with SMTP id m7mr13738585pgr.282.1627218253913; Sun, 25 Jul 2021 06:04:13 -0700 (PDT) Received: from [10.1.2.131] (ec2-34-214-110-43.us-west-2.compute.amazonaws.com. [34.214.110.43]) by smtp.gmail.com with ESMTPSA id 20sm22428031pfh.15.2021.07.25.06.04.12 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 25 Jul 2021 06:04:13 -0700 (PDT) From: Xiaolei Yu To: ffmpeg-devel@ffmpeg.org Message-ID: <640f127c-ff4b-c1f9-82b6-063c6e731ba2@gmail.com> Date: Sun, 25 Jul 2021 21:04:10 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.12.0 MIME-Version: 1.0 Content-Language: en-US Subject: [FFmpeg-devel] [PATCH] libavformat/flvdec: add HEVC demuxing support X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 12hoIsYeNuvH Explicitly supply an HEVC codec id to enable this feature. --- libavformat/flv.h | 1 + libavformat/flvdec.c | 21 ++++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/libavformat/flv.h b/libavformat/flv.h index 3571b90279..7cb1b72b4c 100644 --- a/libavformat/flv.h +++ b/libavformat/flv.h @@ -42,6 +42,7 @@ #define FLV_AUDIO_CODECID_MASK 0xf0 #define FLV_VIDEO_CODECID_MASK 0x0f +#define FLV_VIDEO_CODECID_MAX 0x0f #define FLV_VIDEO_FRAMETYPE_MASK 0xf0 #define AMF_END_OF_OBJECT 0x09 diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index b4a419177a..e44aa693b7 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -74,6 +74,7 @@ typedef struct FLVContext { int64_t *keyframe_times; int64_t *keyframe_filepositions; int missing_streams; + int hevc_codec_id; AVRational framerate; int64_t last_ts; int64_t time_offset; @@ -301,7 +302,7 @@ static void flv_set_audio_codec(AVFormatContext *s, AVStream *astream, } } -static int flv_same_video_codec(AVCodecParameters *vpar, int flags) +static int flv_same_video_codec(FLVContext *flv, AVCodecParameters *vpar, int flags) { int flv_codecid = flags & FLV_VIDEO_CODECID_MASK; @@ -322,6 +323,8 @@ static int flv_same_video_codec(AVCodecParameters *vpar, int flags) case FLV_CODECID_H264: return vpar->codec_id == AV_CODEC_ID_H264; default: + if (flv->hevc_codec_id && flv_codecid == flv->hevc_codec_id) + return vpar->codec_id == AV_CODEC_ID_HEVC; return vpar->codec_tag == flv_codecid; } } @@ -329,6 +332,7 @@ static int flv_same_video_codec(AVCodecParameters *vpar, int flags) static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream, int flv_codecid, int read) { + FLVContext *flv = s->priv_data; int ret = 0; AVCodecParameters *par = vstream->codecpar; enum AVCodecID old_codec_id = vstream->codecpar->codec_id; @@ -371,6 +375,12 @@ static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream, ret = 3; break; default: + if (flv->hevc_codec_id && flv_codecid == flv->hevc_codec_id) { + par->codec_id = AV_CODEC_ID_HEVC; + vstream->internal->need_parsing = AVSTREAM_PARSE_HEADERS; + ret = 3; // not 4, reading packet type will consume one byte + break; + } avpriv_request_sample(s, "Video codec (%x)", flv_codecid); par->codec_tag = flv_codecid; } @@ -1126,7 +1136,7 @@ skip: break; } else if (stream_type == FLV_STREAM_TYPE_VIDEO) { if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && - (s->video_codec_id || flv_same_video_codec(st->codecpar, flags))) + (s->video_codec_id || flv_same_video_codec(flv, st->codecpar, flags))) break; } else if (stream_type == FLV_STREAM_TYPE_SUBTITLE) { if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) @@ -1241,6 +1251,7 @@ retry_duration: if (st->codecpar->codec_id == AV_CODEC_ID_AAC || st->codecpar->codec_id == AV_CODEC_ID_H264 || + st->codecpar->codec_id == AV_CODEC_ID_HEVC || st->codecpar->codec_id == AV_CODEC_ID_MPEG4) { int type = avio_r8(s->pb); size--; @@ -1250,7 +1261,9 @@ retry_duration: goto leave; } - if (st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_MPEG4) { + if (st->codecpar->codec_id == AV_CODEC_ID_H264 || + st->codecpar->codec_id == AV_CODEC_ID_HEVC || + st->codecpar->codec_id == AV_CODEC_ID_MPEG4) { // sign extension int32_t cts = (avio_rb24(s->pb) + 0xff800000) ^ 0xff800000; pts = av_sat_add64(dts, cts); @@ -1266,6 +1279,7 @@ retry_duration: } } if (type == 0 && (!st->codecpar->extradata || st->codecpar->codec_id == AV_CODEC_ID_AAC || + st->codecpar->codec_id == AV_CODEC_ID_HEVC || st->codecpar->codec_id == AV_CODEC_ID_H264)) { AVDictionaryEntry *t; @@ -1361,6 +1375,7 @@ static const AVOption options[] = { { "flv_metadata", "Allocate streams according to the onMetaData array", OFFSET(trust_metadata), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD }, { "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 }, + { "flv_hevc_codec_id", "Assign HEVC stream codec ID", OFFSET(hevc_codec_id), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, FLV_VIDEO_CODECID_MAX, VD }, { "missing_streams", "", OFFSET(missing_streams), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 0xFF, VD | AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY }, { NULL } };