From patchwork Fri Jun 2 07:31:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Liu X-Patchwork-Id: 41942 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c51c:b0:10c:5e6f:955f with SMTP id gm28csp1036754pzb; Fri, 2 Jun 2023 00:31:40 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4eSD0eIYs8o2amFP7NWPLMZ+f4q+IOGk42wCZ/Y3BMYNgRTBK5xzJ2/xchgbVKGitWP00C X-Received: by 2002:a17:907:724d:b0:953:517a:8f1a with SMTP id ds13-20020a170907724d00b00953517a8f1amr12312898ejc.58.1685691099877; Fri, 02 Jun 2023 00:31:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685691099; cv=none; d=google.com; s=arc-20160816; b=VLRJetcTs6Naj0wL1uFjEnuYjaalNx52Zb4+lPIGpuSH+yVUvXDCL0VkHO4tvCoWJD y/3GdTY8yrTjzZDkXI3pVAqGqO27lTlI6JiMOKWUgh88CSyBdpBkkW3MPV/3/SCMElwb V7ZvGRtKUd11I++IV+5AwmVhG369JvgWvCrANZVJYKhHTa6oAJMF+F2GGPjLTfN7Z3GY s9DnJLDlM5dRWCgGMhxSLzk6rFSNiXD+YOGY2jz4MNKZayHx/3EUEH6YhZ7ePYk72Sx8 o0PRleO4d4dUNlamrBVs0P9lkqXnd6HIMUwpRVNsyQ1/O4wEUvSsrhlLaq8+g50iHtpn XyLQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:feedback-id:mime-version:references :in-reply-to:message-id:date:to:from:delivered-to; bh=iARNZymhvRJIF1CIfuLUEYpqo4B2S6MC74LIsxi5ztI=; b=Sn4raUztFV/pgpgYMtRv2pPN9stJAazziWFepPy9uJMiCH0tXjGRaxPJ7NKB9WWmUV Y9J9pFsSuEys0kYoP30uxpHv+DBeugrdOYQizRPusie5El0NiGv2D1eVPfuIc1hIPCS9 TyVPZZjOJplIKevoCZuXT0t0NqSPM9Na1GOt0OU/mn/+765MsANEbYWZVi8jPGqykN8C +e1Z/M9fUyzGPZRtc32oFvVoCsPg5qmOk5ETbK/7bwbDYr7x1o780McDsLPTvfwsW4DN W6PLI2hEa9c4v+r7yYefhCKVCanp4OM9YdigGdyiWP6O/lglMnsVDowfIiBq3M9n5D+W MBJA== ARC-Authentication-Results: i=1; mx.google.com; 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 z25-20020a170906715900b0096630a5c7f5si480099ejj.207.2023.06.02.00.31.39; Fri, 02 Jun 2023 00:31:39 -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; 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 C07D168C2D8; Fri, 2 Jun 2023 10:31:35 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from bg2.exmail.qq.com (bg2.exmail.qq.com [114.132.123.192]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2340668C2A1 for ; Fri, 2 Jun 2023 10:31:32 +0300 (EEST) X-QQ-mid: bizesmtp83t1685691078tf3n8oys Received: from localhost ( [103.102.203.204]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 02 Jun 2023 15:31:17 +0800 (CST) X-QQ-SSF: 01100000000000Z0Z000000A0000000 X-QQ-FEAT: 6ArnuSDJ+imDn5HEsek9OcCkSHNYQ2F3ojZEVUmRGEY9X40h+wDnaCoVE2zYP k6LYq+ob8mG/XHrmjdx8M6+A2AZwbR2Wrn3xBuec9SOYukyscXTuYqtsA2ekC96BwU+0jtC R57kQoiX40wHtVBiN9PfFrePXdDUomwrY04BpQuOX2qVAWd3x2Nj2eOtc2uWiqaJl/PtAfj GpJZ/vAkKgvgWh3WTtuqeP6fQ56aD6IXepslLE9D6DvNtvCSqURG0I7Zrskdj21WERXeiMt j0whFjVqnHbhN5UQtIF+8fn+4WZaxUABFkEHXkbr+80fOCLe9A8rjVBQREQWlt4ROMAuPL9 j5vR0r3jXrmr2i+ypkwNANOMnieJD+Bu2EWKdl0inXukYn4BelSzNUqx3SBDA== X-QQ-GoodBg: 0 X-BIZMAIL-ID: 15895606984365629665 From: Steven Liu To: ffmpeg-devel@ffmpeg.org Date: Fri, 2 Jun 2023 15:31:04 +0800 Message-Id: <20230602073109.14086-2-lq@chinaffmpeg.org> X-Mailer: git-send-email 2.40.0 In-Reply-To: <20230602073109.14086-1-lq@chinaffmpeg.org> References: <20230602073109.14086-1-lq@chinaffmpeg.org> MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:chinaffmpeg.org:qybglogicsvrsz:qybglogicsvrsz3a-3 Subject: [FFmpeg-devel] [PATCH v11 1/6] avformat/flvenc: support mux hevc in enhanced flv 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 Cc: Steven Liu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 9vfjddTkdAM9 Signed-off-by: Steven Liu --- libavformat/Makefile | 2 +- libavformat/flv.h | 15 +++++++++++++++ libavformat/flvenc.c | 41 +++++++++++++++++++++++++++++++---------- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/libavformat/Makefile b/libavformat/Makefile index f8ad7c6a11..1ef3d15467 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -214,7 +214,7 @@ OBJS-$(CONFIG_FLAC_MUXER) += flacenc.o flacenc_header.o \ OBJS-$(CONFIG_FLIC_DEMUXER) += flic.o OBJS-$(CONFIG_FLV_DEMUXER) += flvdec.o OBJS-$(CONFIG_LIVE_FLV_DEMUXER) += flvdec.o -OBJS-$(CONFIG_FLV_MUXER) += flvenc.o avc.o +OBJS-$(CONFIG_FLV_MUXER) += flvenc.o avc.o hevc.o OBJS-$(CONFIG_FOURXM_DEMUXER) += 4xm.o OBJS-$(CONFIG_FRAMECRC_MUXER) += framecrcenc.o framehash.o OBJS-$(CONFIG_FRAMEHASH_MUXER) += hashenc.o framehash.o diff --git a/libavformat/flv.h b/libavformat/flv.h index 3571b90279..91e0a4140c 100644 --- a/libavformat/flv.h +++ b/libavformat/flv.h @@ -35,6 +35,12 @@ #define FLV_VIDEO_FRAMETYPE_OFFSET 4 +/* Extended VideoTagHeader + * defined in reference link: + * https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf + * */ +#define FLV_IS_EX_HEADER 0x80 + /* bitmasks to isolate specific values */ #define FLV_AUDIO_CHANNEL_MASK 0x01 #define FLV_AUDIO_SAMPLESIZE_MASK 0x02 @@ -112,6 +118,15 @@ enum { FLV_CODECID_MPEG4 = 9, }; +enum { + PacketTypeSequenceStart = 0, + PacketTypeCodedFrames = 1, + PacketTypeSequenceEnd = 2, + PacketTypeCodedFramesX = 3, + PacketTypeMetadata = 4, + PacketTypeMPEG2TSSequenceStart = 5, +}; + enum { FLV_FRAME_KEY = 1 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< key frame (for AVC, a seekable frame) FLV_FRAME_INTER = 2 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< inter frame (for AVC, a non-seekable frame) diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c index 721f062811..aed0946a2e 100644 --- a/libavformat/flvenc.c +++ b/libavformat/flvenc.c @@ -28,6 +28,7 @@ #include "libavcodec/mpeg4audio.h" #include "avio.h" #include "avc.h" +#include "hevc.h" #include "avformat.h" #include "flv.h" #include "internal.h" @@ -46,6 +47,7 @@ static const AVCodecTag flv_video_codec_ids[] = { { AV_CODEC_ID_VP6, FLV_CODECID_VP6 }, { AV_CODEC_ID_VP6A, FLV_CODECID_VP6A }, { AV_CODEC_ID_H264, FLV_CODECID_H264 }, + { AV_CODEC_ID_HEVC, MKBETAG('h', 'v', 'c', '1') }, { AV_CODEC_ID_NONE, 0 } }; @@ -489,7 +491,7 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i FLVContext *flv = s->priv_data; if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264 - || par->codec_id == AV_CODEC_ID_MPEG4) { + || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { int64_t pos; avio_w8(pb, par->codec_type == AVMEDIA_TYPE_VIDEO ? @@ -532,10 +534,19 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i } avio_write(pb, par->extradata, par->extradata_size); } else { - avio_w8(pb, par->codec_tag | FLV_FRAME_KEY); // flags - avio_w8(pb, 0); // AVC sequence header - avio_wb24(pb, 0); // composition time - ff_isom_write_avcc(pb, par->extradata, par->extradata_size); + if (par->codec_id == AV_CODEC_ID_HEVC) { + avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeSequenceStart | FLV_FRAME_KEY); // ExVideoTagHeader mode with PacketTypeSequenceStart + avio_write(pb, "hvc1", 4); + } else { + avio_w8(pb, par->codec_tag | FLV_FRAME_KEY); // flags + avio_w8(pb, 0); // AVC sequence header + avio_wb24(pb, 0); // composition time + } + + if (par->codec_id == AV_CODEC_ID_HEVC) + ff_isom_write_hvcc(pb, par->extradata, par->extradata_size, 0); + else + ff_isom_write_avcc(pb, par->extradata, par->extradata_size); } data_size = avio_tell(pb) - pos; avio_seek(pb, -data_size - 10, SEEK_CUR); @@ -821,6 +832,7 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) unsigned ts; int size = pkt->size; uint8_t *data = NULL; + uint8_t frametype = pkt->flags & AV_PKT_FLAG_KEY ? FLV_FRAME_KEY : FLV_FRAME_INTER; int flags = -1, flags_size, ret = 0; int64_t cur_offset = avio_tell(pb); @@ -832,13 +844,13 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) if (par->codec_id == AV_CODEC_ID_VP6F || par->codec_id == AV_CODEC_ID_VP6A || par->codec_id == AV_CODEC_ID_VP6 || par->codec_id == AV_CODEC_ID_AAC) flags_size = 2; - else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4) + else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) flags_size = 5; else flags_size = 1; if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264 - || par->codec_id == AV_CODEC_ID_MPEG4) { + || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { size_t side_size; uint8_t *side = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size); if (side && side_size > 0 && (side_size != par->extradata_size || memcmp(side, par->extradata, side_size))) { @@ -858,7 +870,7 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) "Packets are not in the proper order with respect to DTS\n"); return AVERROR(EINVAL); } - if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4) { + if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { if (pkt->pts == AV_NOPTS_VALUE) { av_log(s, AV_LOG_ERROR, "Packet is missing PTS\n"); return AVERROR(EINVAL); @@ -881,7 +893,7 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) flags = ff_codec_get_tag(flv_video_codec_ids, par->codec_id); - flags |= pkt->flags & AV_PKT_FLAG_KEY ? FLV_FRAME_KEY : FLV_FRAME_INTER; + flags |= frametype; break; case AVMEDIA_TYPE_AUDIO: flags = get_audio_flags(s, par); @@ -903,6 +915,10 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) if (par->extradata_size > 0 && *(uint8_t*)par->extradata != 1) if ((ret = ff_avc_parse_nal_units_buf(pkt->data, &data, &size)) < 0) return ret; + } else if (par->codec_id == AV_CODEC_ID_HEVC) { + if (par->extradata_size > 0 && *(uint8_t*)par->extradata != 1) + if ((ret = ff_hevc_annexb2mp4_buf(pkt->data, &data, &size, 0, NULL)) < 0) + return ret; } else if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) { if (!s->streams[pkt->stream_index]->nb_frames) { @@ -964,7 +980,12 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) avio_wb32(pb, data_size + 11); } else { av_assert1(flags>=0); - avio_w8(pb,flags); + if (par->codec_id == AV_CODEC_ID_HEVC) { + avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeCodedFramesX | frametype); // ExVideoTagHeader mode with PacketTypeCodedFramesX + avio_write(pb, "hvc1", 4); + } else { + avio_w8(pb, flags); + } if (par->codec_id == AV_CODEC_ID_VP6) avio_w8(pb,0); if (par->codec_id == AV_CODEC_ID_VP6F || par->codec_id == AV_CODEC_ID_VP6A) { From patchwork Fri Jun 2 07:31:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Liu X-Patchwork-Id: 41944 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c51c:b0:10c:5e6f:955f with SMTP id gm28csp1036996pzb; Fri, 2 Jun 2023 00:32:08 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6pFkbC9RYoMX8t1IuRRTvij1fm4+k/Go0hf9HC717WXfFZ12k74NMsMVSbCiHDNgPRyXVu X-Received: by 2002:a17:907:6eac:b0:974:6026:a316 with SMTP id sh44-20020a1709076eac00b009746026a316mr1219895ejc.19.1685691128681; Fri, 02 Jun 2023 00:32:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685691128; cv=none; d=google.com; s=arc-20160816; b=XghDsPmGCB/RhWaAQgwtsMX4pTB31mZznMMwP+RIUStJeGh/sIZ65rrmm+KX5xnWxj DJfYwZFpw1uHt4plPyXZQjMyLq91DdSfdnArZ0QnKkWp6u24ft9UQdX8Saff5B7Znxqe bkeTv1X5NJi0m712yKwbqSmMkYGRza74Rv30L9OEnJJaMGsI+9/80HxpRMIwkpegh3P/ y/KmiiodiOEYdyb3w2Z0A2WusAP7mjiiOlFgELX/gc9rvIR9AqrP/lwRF34VUprNmgtg 4pavQgr3aQW0exDBb2r1yQLqVzukUm+SnlAOus/ocBllRcrjKSfvcZUDcIXzQraMB4VH SvgQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:feedback-id:mime-version:references :in-reply-to:message-id:date:to:from:delivered-to; bh=ygUb60Tr5LbPnhiS1As+hL+qX45KII+ocpY9X3Jq4TI=; b=L4b28Cx2u4/cccz62dRFTTGkYdEYgX1AOSGv9k5ivnaBF7fgmW4nGkNTC3OPZGiYXL xdhqa00JhUjkJjQoZRtUB2z5f8871jV2TNKdpGtU2Xt7Uj8SD4eRM/9MLvOvXzRd0gFH yBuMW7QWvrAV7lIBakmQKnhg7d3y7ISMliEJj+neHbRfGH0HqzKYbwf7pO70bswSl86b 1SWF2yzCkN9l8YeR1XD6NfGlfNSgPAx3Z9u5MWvFR3VeZ+x+0lqszqmuq40PQU17S+tV /Oo9wt71icEIgg/CKjlTbcxy4wGhNYsMX0oB3mlrh/kXgySedqxmaQyMUxTHTictNzdI viLg== ARC-Authentication-Results: i=1; mx.google.com; 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 p16-20020a17090653d000b0096f643f4c21si415713ejo.615.2023.06.02.00.32.08; Fri, 02 Jun 2023 00:32:08 -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; 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 1190968C307; Fri, 2 Jun 2023 10:31:39 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from bg2.exmail.qq.com (bg2.exmail.qq.com [114.132.63.24]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9699F68C2DF for ; Fri, 2 Jun 2023 10:31:36 +0300 (EEST) X-QQ-mid: bizesmtp70t1685691083tlmqdgy7 Received: from localhost ( [103.102.203.204]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 02 Jun 2023 15:31:22 +0800 (CST) X-QQ-SSF: 01100000000000Z0Z000000A0000000 X-QQ-FEAT: NEQNbzYfqF6fLPZy6mMNMY0sA64u6/mww9JarZ/2u65nkIbcqiV0WVRCZO5q7 6wUCvznZeyBvmDhnXpVq/nBJVKH8D0SI1TYsg8jotueIDZTNedYVVjTVbCQ3OrA8KDeI6pA wxKY9CMdaVKlekjNt9dwsaDYkqoLFIQUmWrsuWjvUfZk/KxDlaKT7VI4AMNP8w4QI1k+R0d LJL1VN5MbrXqEE1UeRIfJWMzuqRUotSM+dTbv4ybc0zYIBHtCQTHQHCrl0Ew3Z24QStJMGC aajqFf9aXxQfDgxqGC0OGbi6bFWk+LYYbDFa2cNQOsfij5cbu0klmVi63NqJfJYpWY7nUWE RfeK6XPr1MUFDq6Y30+vM2JFvEdOS8WRfNJcrusxre+dS7BO9yP+B8Jboua2Q== X-QQ-GoodBg: 0 X-BIZMAIL-ID: 17500562472029918716 From: Steven Liu To: ffmpeg-devel@ffmpeg.org Date: Fri, 2 Jun 2023 15:31:05 +0800 Message-Id: <20230602073109.14086-3-lq@chinaffmpeg.org> X-Mailer: git-send-email 2.40.0 In-Reply-To: <20230602073109.14086-1-lq@chinaffmpeg.org> References: <20230602073109.14086-1-lq@chinaffmpeg.org> MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:chinaffmpeg.org:qybglogicsvrsz:qybglogicsvrsz3a-3 Subject: [FFmpeg-devel] [PATCH v11 2/6] avformat/flvdec: support demux hevc in enhanced flv 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 Cc: Steven Liu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: aVtcKf8Pd8GI Signed-off-by: Steven Liu --- libavformat/flvdec.c | 58 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index d83edff727..c8e6cadf1c 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -79,6 +79,8 @@ typedef struct FLVContext { int64_t last_ts; int64_t time_offset; int64_t time_pos; + + uint8_t exheader; } FLVContext; /* AMF date type */ @@ -302,13 +304,25 @@ 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(AVFormatContext *s, AVCodecParameters *vpar, int flags) { int flv_codecid = flags & FLV_VIDEO_CODECID_MASK; + FLVContext *flv = s->priv_data; if (!vpar->codec_id && !vpar->codec_tag) return 1; + if (flv->exheader) { + uint8_t *codec_id_str = (uint8_t *)s->pb->buf_ptr; + uint32_t codec_id = codec_id_str[3] | codec_id_str[2] << 8 | codec_id_str[1] << 16 | codec_id_str[0] << 24; + switch(codec_id) { + case MKBETAG('h', 'v', 'c', '1'): + return vpar->codec_id == AV_CODEC_ID_HEVC; + default: + break; + } + } + switch (flv_codecid) { case FLV_CODECID_H263: return vpar->codec_id == AV_CODEC_ID_FLV1; @@ -331,9 +345,24 @@ static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream, int flv_codecid, int read) { FFStream *const vstreami = ffstream(vstream); + FLVContext *flv = s->priv_data; int ret = 0; AVCodecParameters *par = vstream->codecpar; enum AVCodecID old_codec_id = vstream->codecpar->codec_id; + flv_codecid &= FLV_VIDEO_CODECID_MASK; + + if (flv->exheader) { + uint32_t codec_id = avio_rb32(s->pb); + + switch(codec_id) { + case MKBETAG('h', 'v', 'c', '1'): + par->codec_id = AV_CODEC_ID_HEVC; + vstreami->need_parsing = AVSTREAM_PARSE_HEADERS; + return 4; + default: + break; + } + } switch (flv_codecid) { case FLV_CODECID_H263: par->codec_id = AV_CODEC_ID_FLV1; @@ -796,6 +825,7 @@ static int flv_read_header(AVFormatContext *s) s->start_time = 0; flv->sum_flv_tag_size = 0; flv->last_keyframe_stream_index = -1; + flv->exheader = 0; return 0; } @@ -1071,6 +1101,11 @@ retry: } else if (type == FLV_TAG_TYPE_VIDEO) { stream_type = FLV_STREAM_TYPE_VIDEO; flags = avio_r8(s->pb); + /* + * Reference Enhancing FLV 2023-03-v1.0.0-B.8 + * https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf + * */ + flv->exheader = (flags >> 7) & 1; size--; if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_VIDEO_INFO_CMD) goto skip; @@ -1129,7 +1164,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(s, st->codecpar, flags))) break; } else if (stream_type == FLV_STREAM_TYPE_SUBTITLE) { if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) @@ -1230,7 +1265,7 @@ retry_duration: avcodec_parameters_free(&par); } } else if (stream_type == FLV_STREAM_TYPE_VIDEO) { - int ret = flv_set_video_codec(s, st, flags & FLV_VIDEO_CODECID_MASK, 1); + int ret = flv_set_video_codec(s, st, flags, 1); if (ret < 0) return ret; size -= ret; @@ -1242,16 +1277,23 @@ 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_MPEG4) { - int type = avio_r8(s->pb); - size--; + st->codecpar->codec_id == AV_CODEC_ID_MPEG4 || + st->codecpar->codec_id == AV_CODEC_ID_HEVC) { + int type = 0; + if (flv->exheader && stream_type == FLV_STREAM_TYPE_VIDEO) { + type = flags & 0x0F; + } else { + type = avio_r8(s->pb); + size--; + } if (size < 0) { ret = AVERROR_INVALIDDATA; 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_MPEG4 || + (st->codecpar->codec_id == AV_CODEC_ID_HEVC && type == PacketTypeCodedFrames)) { // sign extension int32_t cts = (avio_rb24(s->pb) + 0xff800000) ^ 0xff800000; pts = av_sat_add64(dts, cts); @@ -1267,7 +1309,7 @@ retry_duration: } } if (type == 0 && (!st->codecpar->extradata || st->codecpar->codec_id == AV_CODEC_ID_AAC || - st->codecpar->codec_id == AV_CODEC_ID_H264)) { + st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_HEVC)) { AVDictionaryEntry *t; if (st->codecpar->extradata) { From patchwork Fri Jun 2 07:31:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Liu X-Patchwork-Id: 41943 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c51c:b0:10c:5e6f:955f with SMTP id gm28csp1036927pzb; Fri, 2 Jun 2023 00:32:00 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6ci8xYlK3Pmvz8icVkKOYfJx1h1wyvFELDGazyjIGh68IT8JNo+Y/kOhMt7rD2TMpPCN4W X-Received: by 2002:a2e:9650:0:b0:2b1:b334:bfa6 with SMTP id z16-20020a2e9650000000b002b1b334bfa6mr102302ljh.12.1685691119738; Fri, 02 Jun 2023 00:31:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685691119; cv=none; d=google.com; s=arc-20160816; b=r3Z+B11slfBzwOhOBj29IQAdxWcYtMYaxEHnZGmNMUU+z3h/wf4cVaQRr8rUZ/Ta1X rQ6sNCWHjO8Byhx/Pmi91IJm5+3qCxDY469+cqpx1cmlJNXRcsN/hObwza62d+SVJdXD 8j5RL779QRG71wNXcfIGiw0GbxUhFFfXmpVi/cW+Wcfhz4mcFJTbDpXirIqpS4NogD+B 3nQKp3HU15Pb9W2Sv5ZJgU18qCDNtV9L2STdC78mLTf7kK7rcUDL/n/XINQDTiEtNcFY SNEm6MsD2cZNqLbsC+mw3hfcFdUJXl3dIe1xah7Qb45oqNW9dvV6vNP+PyNQiFXhiz+r N27Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:feedback-id:mime-version:references :in-reply-to:message-id:date:to:from:delivered-to; bh=2iseqt7F4lbUbZsgw2ftJCKhxAXBjh0pv8WUV+cHWjU=; b=bbzIewGY7aTLLhd9N5+daEFy/K+BgC9vX10qUtbHOgu1QMjKQp1fwy0rLvqO84MVKm 3GX2hSphIqbBCEbTcutR6CWG8K7LTcNy43EQbkcl80b/ACyQrWfdRhhcJS+W1hGzS6GD Y24zLPvNpzr4Hxl9T9W43J//9V/n+sEVD0ANaPx2bbPrib/f/+2219hjntmus3P2daXs 2CCJDThlJTcr8s03W0IpuKeY+Z6qKLjiNnD6LrxjkRH496/Onynbcd1uwhVE9nOLfaRq 1OBexSs/KBmnppDcpo71ERsknulSocqIvmyQToBuGKUrFRNEkzvJH573EyEuXtmF2DVA ao9A== ARC-Authentication-Results: i=1; mx.google.com; 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 m17-20020a056402051100b00514b1b04bf1si457709edv.318.2023.06.02.00.31.59; Fri, 02 Jun 2023 00:31:59 -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; 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 0ED4568C2FD; Fri, 2 Jun 2023 10:31:38 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from bg4.exmail.qq.com (bg4.exmail.qq.com [43.155.65.254]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7319568C2ED for ; Fri, 2 Jun 2023 10:31:35 +0300 (EEST) X-QQ-mid: bizesmtp85t1685691090ts4lhxno Received: from localhost ( [103.102.203.204]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 02 Jun 2023 15:31:29 +0800 (CST) X-QQ-SSF: 01100000000000Z0Z000000A0000000 X-QQ-FEAT: YHTLUubWl25B3R+B/4bxKjn7B6IEP8R2acUCNSAyhc1A5CQE9Y1EljYgDIIig WmKn7hfyvwIx0CLgABLnsolWoszWD9S0yQe0jl5hHdX8/9BGxDw3OQ5rxjiiR2c1hvuzsZ4 /NK/NiaWEHtzSknf14iz8ygJks/EQ2dGM2TQrtL08dBDTDQ+OjO7v20DvJUaptA62YXIvkY yooAYXSgtFEtojqOmWm+rn4swGSKX3HouleRqVNicDh7iawn2osORhqqS/f1qTZ1n3U3Mr/ jHEVfCmv1TqPRV9CZq3B/48/0lOTrBCGVaWXgzmyWqTAx/mHZgBng4H5iKiFcC2ycuy3LbW N5IxFOHyzVeOV1n8nYbNdo069Ktc6NA6ujmUCfz34RanubYDTBfgPawMiH6+w== X-QQ-GoodBg: 0 X-BIZMAIL-ID: 1363907650760225954 From: Steven Liu To: ffmpeg-devel@ffmpeg.org Date: Fri, 2 Jun 2023 15:31:06 +0800 Message-Id: <20230602073109.14086-4-lq@chinaffmpeg.org> X-Mailer: git-send-email 2.40.0 In-Reply-To: <20230602073109.14086-1-lq@chinaffmpeg.org> References: <20230602073109.14086-1-lq@chinaffmpeg.org> MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:chinaffmpeg.org:qybglogicsvrsz:qybglogicsvrsz3a-3 Subject: [FFmpeg-devel] [PATCH v11 3/6] avformat/flvenc: support mux av1 in enhanced flv 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 Cc: Steven Liu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: IxCVefNAze2l Signed-off-by: Steven Liu --- libavformat/Makefile | 2 +- libavformat/flvenc.c | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/libavformat/Makefile b/libavformat/Makefile index 1ef3d15467..c868e1626c 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -214,7 +214,7 @@ OBJS-$(CONFIG_FLAC_MUXER) += flacenc.o flacenc_header.o \ OBJS-$(CONFIG_FLIC_DEMUXER) += flic.o OBJS-$(CONFIG_FLV_DEMUXER) += flvdec.o OBJS-$(CONFIG_LIVE_FLV_DEMUXER) += flvdec.o -OBJS-$(CONFIG_FLV_MUXER) += flvenc.o avc.o hevc.o +OBJS-$(CONFIG_FLV_MUXER) += flvenc.o avc.o hevc.o av1.o OBJS-$(CONFIG_FOURXM_DEMUXER) += 4xm.o OBJS-$(CONFIG_FRAMECRC_MUXER) += framecrcenc.o framehash.o OBJS-$(CONFIG_FRAMEHASH_MUXER) += hashenc.o framehash.o diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c index aed0946a2e..99fa1bd723 100644 --- a/libavformat/flvenc.c +++ b/libavformat/flvenc.c @@ -28,6 +28,7 @@ #include "libavcodec/mpeg4audio.h" #include "avio.h" #include "avc.h" +#include "av1.h" #include "hevc.h" #include "avformat.h" #include "flv.h" @@ -48,6 +49,7 @@ static const AVCodecTag flv_video_codec_ids[] = { { AV_CODEC_ID_VP6A, FLV_CODECID_VP6A }, { AV_CODEC_ID_H264, FLV_CODECID_H264 }, { AV_CODEC_ID_HEVC, MKBETAG('h', 'v', 'c', '1') }, + { AV_CODEC_ID_AV1, MKBETAG('a', 'v', '0', '1') }, { AV_CODEC_ID_NONE, 0 } }; @@ -491,7 +493,8 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i FLVContext *flv = s->priv_data; if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264 - || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { + || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC + || par->codec_id == AV_CODEC_ID_AV1) { int64_t pos; avio_w8(pb, par->codec_type == AVMEDIA_TYPE_VIDEO ? @@ -537,6 +540,9 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i if (par->codec_id == AV_CODEC_ID_HEVC) { avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeSequenceStart | FLV_FRAME_KEY); // ExVideoTagHeader mode with PacketTypeSequenceStart avio_write(pb, "hvc1", 4); + } else if (par->codec_id == AV_CODEC_ID_AV1) { + avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeSequenceStart | FLV_FRAME_KEY); + avio_write(pb, "av01", 4); } else { avio_w8(pb, par->codec_tag | FLV_FRAME_KEY); // flags avio_w8(pb, 0); // AVC sequence header @@ -545,6 +551,8 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i if (par->codec_id == AV_CODEC_ID_HEVC) ff_isom_write_hvcc(pb, par->extradata, par->extradata_size, 0); + else if (par->codec_id == AV_CODEC_ID_AV1) + ff_isom_write_av1c(pb, par->extradata, par->extradata_size, 1); else ff_isom_write_avcc(pb, par->extradata, par->extradata_size); } @@ -844,13 +852,15 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) if (par->codec_id == AV_CODEC_ID_VP6F || par->codec_id == AV_CODEC_ID_VP6A || par->codec_id == AV_CODEC_ID_VP6 || par->codec_id == AV_CODEC_ID_AAC) flags_size = 2; - else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) + else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || + par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_AV1) flags_size = 5; else flags_size = 1; if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264 - || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { + || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC + || par->codec_id == AV_CODEC_ID_AV1) { size_t side_size; uint8_t *side = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size); if (side && side_size > 0 && (side_size != par->extradata_size || memcmp(side, par->extradata, side_size))) { @@ -870,7 +880,8 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) "Packets are not in the proper order with respect to DTS\n"); return AVERROR(EINVAL); } - if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { + if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || + par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_AV1) { if (pkt->pts == AV_NOPTS_VALUE) { av_log(s, AV_LOG_ERROR, "Packet is missing PTS\n"); return AVERROR(EINVAL); @@ -983,6 +994,9 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) if (par->codec_id == AV_CODEC_ID_HEVC) { avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeCodedFramesX | frametype); // ExVideoTagHeader mode with PacketTypeCodedFramesX avio_write(pb, "hvc1", 4); + } else if (par->codec_id == AV_CODEC_ID_AV1) { + avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeCodedFrames | frametype); + avio_write(pb, "av01", 4); } else { avio_w8(pb, flags); } From patchwork Fri Jun 2 07:31:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Liu X-Patchwork-Id: 41945 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c51c:b0:10c:5e6f:955f with SMTP id gm28csp1037076pzb; Fri, 2 Jun 2023 00:32:17 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5mfHWEZlCB9uLyfBhVVs6nh42I2Z9PeCYVQFdIZJB6yMy3xE7s39KpGkCP+PDNUV7qc5pu X-Received: by 2002:a05:6402:1513:b0:50b:fb29:1d8f with SMTP id f19-20020a056402151300b0050bfb291d8fmr1407894edw.0.1685691137585; Fri, 02 Jun 2023 00:32:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685691137; cv=none; d=google.com; s=arc-20160816; b=eH7X3MYAZaGs0qfAy/ilHj768tSdxARelE1h6H779uVmvfU/x04Kvmj/76Fa6Tmcog vzV7FIz7fCAhaAI+hv6IqoNawXH2eLvyJ6gaYJFbWAWLu0Hb1R6Icd6Wri4sx9YzewOf xQbzPQqb0tMeOHr26bxs3Qo+5hYy6/A89VyQ0EwcrLUopcLNOOhqi2+cpb9yD5/itSiL Ui4uO/pWiVrYcaMvkAZGQplf+3iRnXWPTy29D/3rdxc/+u6wgq7a6+LBoj4mUXxpJzZR d6AsH+H/BUsHrqm8m/6t/M7TIPxC4U2FaYg2SuqhAmNFtW4n69kV6vcKOH3sXkt7ZvMA Mixg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:feedback-id:mime-version:references :in-reply-to:message-id:date:to:from:delivered-to; bh=J5hIt8/6l7983HWQOAGA1qy6mjWmMWu6DJ2RZRfJeuQ=; b=UOT8EvukgegGXDPHgjiaXIZBtH9IZtD/x6+Wkk4BNpKyG5h1k0R2XAAxVXEsCRKwmZ 2zCecH+p+/uW2EY58d+EbnxBEmjzDxRDsseaY84WqM60XTjJ5/9mOLMPnQVw877rbMeA pGbWKLW3ayhTht7uSIFOCKMzc9jyd2NOfrwSfSxb5GfggZM0o1rwQZYpsKi/dh4Db8fq oYiVmRTUUKcdfq0yIqbRXwm7jgctWWeLou3WX7C01BGCn7ImBGPM8YblO9+omUyrELns bgBN9JQVLElnqUsmw+eBfUH90Q148HIlayIibbfC0olZE/yGJtHpnukr7OWUSQDkIpxz +gMg== ARC-Authentication-Results: i=1; mx.google.com; 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 s11-20020a056402164b00b005148f905f6dsi433324edx.564.2023.06.02.00.32.17; Fri, 02 Jun 2023 00:32: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; 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 13FA868C30E; Fri, 2 Jun 2023 10:31:42 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from bg4.exmail.qq.com (bg4.exmail.qq.com [43.154.54.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6E21568C300 for ; Fri, 2 Jun 2023 10:31:40 +0300 (EEST) X-QQ-mid: bizesmtp62t1685691095t0qjz4km Received: from localhost ( [103.102.203.204]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 02 Jun 2023 15:31:34 +0800 (CST) X-QQ-SSF: 01100000000000Z0Z000000A0000000 X-QQ-FEAT: RiweTmIJF2y37gZyCrFo/xKLlElkDhYStzx1tXs13VtDXpg1vtofeP6I1hrV0 Dp6lgEUGbFOxPZG2AGP6miY2CPDiiKgkucsEx4I3/Tq4ujcUpsNoBi+iczYFzJAy/WXyD9U GBPFKCRF/iiHm/7lK3D7XkUk5gpdZLiUXYdkyWCHCiJADRfIUTIjX8PKLfD+BsTSQXKg5QF qIrA9aX/whaJdUx+pc54Ai0fQrxbrNQNG1hkPQ23vHo64S/VsKexfRcFEaIWAmHI1IYgsyw hv1GICzwubaHDBf/bHz44lxdfKT+mcqn4jTufvQDUVFc6Y1BfrAR5FnExiOhZTst71vmzD+ NvJTYHok8qwlLqZ2VwhJfp02GOSL9vO7vjR71zWPiVg8lPN4Sc= X-QQ-GoodBg: 0 X-BIZMAIL-ID: 6060675510155652480 From: Steven Liu To: ffmpeg-devel@ffmpeg.org Date: Fri, 2 Jun 2023 15:31:07 +0800 Message-Id: <20230602073109.14086-5-lq@chinaffmpeg.org> X-Mailer: git-send-email 2.40.0 In-Reply-To: <20230602073109.14086-1-lq@chinaffmpeg.org> References: <20230602073109.14086-1-lq@chinaffmpeg.org> MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:chinaffmpeg.org:qybglogicsvrsz:qybglogicsvrsz3a-3 Subject: [FFmpeg-devel] [PATCH v11 4/6] avformat/flvdec: support demux av1 in enhanced flv 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 Cc: Steven Liu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 4Dt+v+kVUImK Signed-off-by: Steven Liu --- libavformat/flvdec.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index c8e6cadf1c..a0362ff11c 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -318,6 +318,8 @@ static int flv_same_video_codec(AVFormatContext *s, AVCodecParameters *vpar, int switch(codec_id) { case MKBETAG('h', 'v', 'c', '1'): return vpar->codec_id == AV_CODEC_ID_HEVC; + case MKBETAG('a', 'v', '0', '1'): + return vpar->codec_id == AV_CODEC_ID_AV1; default: break; } @@ -359,6 +361,10 @@ static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream, par->codec_id = AV_CODEC_ID_HEVC; vstreami->need_parsing = AVSTREAM_PARSE_HEADERS; return 4; + case MKBETAG('a', 'v', '0', '1'): + par->codec_id = AV_CODEC_ID_AV1; + vstreami->need_parsing = AVSTREAM_PARSE_HEADERS; + return 4; default: break; } @@ -1278,7 +1284,8 @@ 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_MPEG4 || - st->codecpar->codec_id == AV_CODEC_ID_HEVC) { + st->codecpar->codec_id == AV_CODEC_ID_HEVC || + st->codecpar->codec_id == AV_CODEC_ID_AV1) { int type = 0; if (flv->exheader && stream_type == FLV_STREAM_TYPE_VIDEO) { type = flags & 0x0F; @@ -1309,7 +1316,8 @@ retry_duration: } } if (type == 0 && (!st->codecpar->extradata || 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_H264 || st->codecpar->codec_id == AV_CODEC_ID_HEVC || + st->codecpar->codec_id == AV_CODEC_ID_AV1)) { AVDictionaryEntry *t; if (st->codecpar->extradata) { From patchwork Fri Jun 2 07:31:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Liu X-Patchwork-Id: 41946 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c51c:b0:10c:5e6f:955f with SMTP id gm28csp1037163pzb; Fri, 2 Jun 2023 00:32:26 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6+jha4qXKt6xiymTjmSm/2bjFrnf0qC54Z6qVzQDkrF+Dxy/u9mQpMYUgSMeFWYw5M8IRS X-Received: by 2002:a17:907:9484:b0:96a:6c64:8066 with SMTP id dm4-20020a170907948400b0096a6c648066mr11996947ejc.4.1685691146399; Fri, 02 Jun 2023 00:32:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685691146; cv=none; d=google.com; s=arc-20160816; b=J3r0NhiH8E/FqV+n/Cbf8X6C8WKBzku07HBBNYJ4uzyaLA0eOGcuhvdXPy2/jcbxU9 wQDJ8yDMfWXNWXI/D42f4xeaHBwx7P+AVPMgsv7+7EzRPE/QcBZhKWpn8K3PGQgMBIWi O5oZNihCXdkcX7bA3zHs7jO2hVsVxGwrQ9WFz8XHwS3AakXKiAqZW6FFDJxQ2qCnEIbe jixqbozuSflJKlnjPWMAyek3pRtZ4TZBuIGU8lsNVcOiHLRYiSnJFuOEc2P+9Gl1ZDeX QDhgPE3N9Xt6PvhHm/4Bnj4XcoQ2A6sapEmvXrcXYX1yYfXFlC4sXnRkYAJWMQLdjz+B 53Jw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:feedback-id:mime-version:references :in-reply-to:message-id:date:to:from:delivered-to; bh=QDRiGXPvjcHszOeuBZdLHNISlpD/iQ86IiKlC71+80I=; b=TABx1A3v/252zrVa1G5zRN9lPAIYrHbV4BupUTRY+Xs/wAo7L+NPFSvwhJmK39k3M5 RQ+Sad2LzI11E4I5TZI4I8jy8/Kd3DhoN4buZKy2v7LgrVrAPRR7saP+bW/3krW68dgo BE8iV6RtAtRetDmUlRg02w2eTJ7cByiNpgCE80TfqPrK/ooD62ZwyEGmnZcFXs9I/M+h QHRTvePKju5sT+dY2V3oKuO9TVnKMoEeR455DF2xx6Y9najWb7buqabLUzaZZaTzwnn/ VXcoqIqEZGBD8b9DXUvkx/FLJlwTFbWMGefAmZEXYWbRAOtNg1fDpGH+MGAgBgz6uUPD /GGA== ARC-Authentication-Results: i=1; mx.google.com; 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 z3-20020a170906434300b0094fa7459f42si445928ejm.546.2023.06.02.00.32.26; Fri, 02 Jun 2023 00:32:26 -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; 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 1974B68C316; Fri, 2 Jun 2023 10:31:48 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from bg4.exmail.qq.com (bg4.exmail.qq.com [43.155.65.254]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 04AE068C30A for ; Fri, 2 Jun 2023 10:31:45 +0300 (EEST) X-QQ-mid: bizesmtp73t1685691101t0n7pbls Received: from localhost ( [103.102.203.204]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 02 Jun 2023 15:31:39 +0800 (CST) X-QQ-SSF: 01100000000000Z0Z000000A0000000 X-QQ-FEAT: XBN7tc9DADI6Y4bp1K1Rho6iblQThNTmaNuF264bj+7JrYl674b75rcYDbUSH bjQGDut2xOLVBO4EBr9lg5MK011SxUp+lieB+XkJh65BeWw41PsS7dhebnGsZH91mZ3h6DC jxawnLMy2TKG8dwqO2lGm+QQKHbaxeT4wmgV20EcPQ+Dfz+7zYLZtjKNXTZeCBKFDi9xgZw jev9Ayvt0V/SkOjnmSr5IY3rK7I1F/pQrKS2Ss4cXgMNfRY1eQBfsyGbJxG7fIIWrBfknvK SYPI5w+4aJDK17gEcRQ1Yv+5qsF5+lvwEP0Y7kv5xp0lksx8cfwAw+iSUEs9KNAxO+Pfr/c 9g7YI+BV98PvKaEx5FAm29E7P2Bj8HPGcCw1pp9V5y2UMY+54GleUHrZ5bxQg== X-QQ-GoodBg: 0 X-BIZMAIL-ID: 11275186921913634226 From: Steven Liu To: ffmpeg-devel@ffmpeg.org Date: Fri, 2 Jun 2023 15:31:08 +0800 Message-Id: <20230602073109.14086-6-lq@chinaffmpeg.org> X-Mailer: git-send-email 2.40.0 In-Reply-To: <20230602073109.14086-1-lq@chinaffmpeg.org> References: <20230602073109.14086-1-lq@chinaffmpeg.org> MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:chinaffmpeg.org:qybglogicsvrsz:qybglogicsvrsz3a-3 Subject: [FFmpeg-devel] [PATCH v11 5/6] avformat/flvenc: support mux vp9 in enhanced flv 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 Cc: Steven Liu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: vQhywiDxqEAz Signed-off-by: Steven Liu --- libavformat/Makefile | 2 +- libavformat/flvenc.c | 22 ++++++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/libavformat/Makefile b/libavformat/Makefile index c868e1626c..16cfe107ea 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -214,7 +214,7 @@ OBJS-$(CONFIG_FLAC_MUXER) += flacenc.o flacenc_header.o \ OBJS-$(CONFIG_FLIC_DEMUXER) += flic.o OBJS-$(CONFIG_FLV_DEMUXER) += flvdec.o OBJS-$(CONFIG_LIVE_FLV_DEMUXER) += flvdec.o -OBJS-$(CONFIG_FLV_MUXER) += flvenc.o avc.o hevc.o av1.o +OBJS-$(CONFIG_FLV_MUXER) += flvenc.o avc.o hevc.o av1.o vpcc.o OBJS-$(CONFIG_FOURXM_DEMUXER) += 4xm.o OBJS-$(CONFIG_FRAMECRC_MUXER) += framecrcenc.o framehash.o OBJS-$(CONFIG_FRAMEHASH_MUXER) += hashenc.o framehash.o diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c index 99fa1bd723..335d900415 100644 --- a/libavformat/flvenc.c +++ b/libavformat/flvenc.c @@ -29,6 +29,7 @@ #include "avio.h" #include "avc.h" #include "av1.h" +#include "vpcc.h" #include "hevc.h" #include "avformat.h" #include "flv.h" @@ -50,6 +51,7 @@ static const AVCodecTag flv_video_codec_ids[] = { { AV_CODEC_ID_H264, FLV_CODECID_H264 }, { AV_CODEC_ID_HEVC, MKBETAG('h', 'v', 'c', '1') }, { AV_CODEC_ID_AV1, MKBETAG('a', 'v', '0', '1') }, + { AV_CODEC_ID_VP9, MKBETAG('v', 'p', '0', '9') }, { AV_CODEC_ID_NONE, 0 } }; @@ -494,7 +496,7 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC - || par->codec_id == AV_CODEC_ID_AV1) { + || par->codec_id == AV_CODEC_ID_AV1 || par->codec_id == AV_CODEC_ID_VP9) { int64_t pos; avio_w8(pb, par->codec_type == AVMEDIA_TYPE_VIDEO ? @@ -540,9 +542,9 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i if (par->codec_id == AV_CODEC_ID_HEVC) { avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeSequenceStart | FLV_FRAME_KEY); // ExVideoTagHeader mode with PacketTypeSequenceStart avio_write(pb, "hvc1", 4); - } else if (par->codec_id == AV_CODEC_ID_AV1) { + } else if (par->codec_id == AV_CODEC_ID_AV1 || par->codec_id == AV_CODEC_ID_VP9) { avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeSequenceStart | FLV_FRAME_KEY); - avio_write(pb, "av01", 4); + avio_write(pb, par->codec_id == AV_CODEC_ID_AV1 ? "av01" : "vp09", 4); } else { avio_w8(pb, par->codec_tag | FLV_FRAME_KEY); // flags avio_w8(pb, 0); // AVC sequence header @@ -553,6 +555,8 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i ff_isom_write_hvcc(pb, par->extradata, par->extradata_size, 0); else if (par->codec_id == AV_CODEC_ID_AV1) ff_isom_write_av1c(pb, par->extradata, par->extradata_size, 1); + else if (par->codec_id == AV_CODEC_ID_VP9) + ff_isom_write_vpcc(s, pb, par->extradata, par->extradata_size, par); else ff_isom_write_avcc(pb, par->extradata, par->extradata_size); } @@ -853,14 +857,15 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) par->codec_id == AV_CODEC_ID_VP6 || par->codec_id == AV_CODEC_ID_AAC) flags_size = 2; else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || - par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_AV1) + par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_AV1 || + par->codec_id == AV_CODEC_ID_VP9) flags_size = 5; else flags_size = 1; if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC - || par->codec_id == AV_CODEC_ID_AV1) { + || par->codec_id == AV_CODEC_ID_AV1 || par->codec_id == AV_CODEC_ID_VP9) { size_t side_size; uint8_t *side = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size); if (side && side_size > 0 && (side_size != par->extradata_size || memcmp(side, par->extradata, side_size))) { @@ -881,7 +886,8 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) return AVERROR(EINVAL); } if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || - par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_AV1) { + par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_AV1 || + par->codec_id == AV_CODEC_ID_VP9) { if (pkt->pts == AV_NOPTS_VALUE) { av_log(s, AV_LOG_ERROR, "Packet is missing PTS\n"); return AVERROR(EINVAL); @@ -994,9 +1000,9 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) if (par->codec_id == AV_CODEC_ID_HEVC) { avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeCodedFramesX | frametype); // ExVideoTagHeader mode with PacketTypeCodedFramesX avio_write(pb, "hvc1", 4); - } else if (par->codec_id == AV_CODEC_ID_AV1) { + } else if (par->codec_id == AV_CODEC_ID_AV1 || par->codec_id == AV_CODEC_ID_VP9) { avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeCodedFrames | frametype); - avio_write(pb, "av01", 4); + avio_write(pb, par->codec_id == AV_CODEC_ID_AV1 ? "av01" : "vp09", 4); } else { avio_w8(pb, flags); } From patchwork Fri Jun 2 07:31:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Liu X-Patchwork-Id: 41947 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c51c:b0:10c:5e6f:955f with SMTP id gm28csp1037221pzb; Fri, 2 Jun 2023 00:32:35 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6vcp0ImuMY8qXl5XGUY3zGlPCzIdeoVLWriwY6HyKVe6BaNsa36Votq45JA1PXoDfKSlju X-Received: by 2002:a05:651c:101:b0:2ad:8380:770d with SMTP id a1-20020a05651c010100b002ad8380770dmr1068142ljb.21.1685691154988; Fri, 02 Jun 2023 00:32:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685691154; cv=none; d=google.com; s=arc-20160816; b=mMf5hf1PsdsDw2iU+XkHRfRots3T8LelVEQo4TemXbghpsf9zTDhyNMSYHw5ZRlmwG Ff6TePeKTaxQDSvhE37BVgHmCmIiNZDpQMflQGq18jdm0ZVY246SZ0gtogb/gNj1L9FJ dSrgzwPHEACHawbI786JO7sc2e9WUsFzExUYkDcH9+maxdh+VaqOlBnW/0rZmahdp9jg DIrfVS20mAIZtLYPdxLmSOOXcsoj4wrMJOqek4V/Fe4mW9iiN602WBjZ+GCf0Au5JAkc IgdfPtAxDaoNGTVkJPeEQfFTjtFESQ920BrNpYyAksb53VV4qLSbJ1hIfThI2h/AwYEx DJWA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:feedback-id:mime-version:references :in-reply-to:message-id:date:to:from:delivered-to; bh=JCKfqtynP85UyN4OG5PQuC2GOM45EC75rPa/TN9Pkis=; b=ckCN3j6Sf91IRAkaDdn1TtroZLQIvIR2Fg7RKaE23kUn73iTxw8s2le3vveT0YG2JK Qjm/0OvYUnHxFmzIxEAzWraWFXk1PNZxr89KB3omc6K+kkToDe5WAxUTsldDnK+hEzR9 JJ0PkMIJwzCQvXS8sqwFzxrjnNYyE8Xx5LOZVhPkkyHuel1rWumkZhrzOMlBSjfzQ9hz TCkWwCLyLPIzSeSQnix0NY1mybU3iGQtKdgCzq0pXr1ZxZHv6b2tgH6WCjvyfrAjKKyF k4lsnyRepI7rfWwOXqiKq7DpYsNfUnMOWAXKusUak6vZs2vQjl83Uw9uVB964aAPJPqT 0+sg== ARC-Authentication-Results: i=1; mx.google.com; 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 h13-20020aa7c60d000000b0050bc45d5813si424305edq.237.2023.06.02.00.32.34; Fri, 02 Jun 2023 00:32:34 -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; 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 21C6A68C2E2; Fri, 2 Jun 2023 10:31:53 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from bg4.exmail.qq.com (bg4.exmail.qq.com [43.155.65.254]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 36F6768C2DA for ; Fri, 2 Jun 2023 10:31:50 +0300 (EEST) X-QQ-mid: bizesmtp76t1685691106tn8f4l2w Received: from localhost ( [103.102.203.204]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 02 Jun 2023 15:31:45 +0800 (CST) X-QQ-SSF: 01100000000000Z0Z000000A0000000 X-QQ-FEAT: 4lisvO5/zj9hdnVJeNqvypPoR39Rraih2Z0eQ7+iHOIJjZZDFY/07p4aeNAb/ 1N5qgfZRpO9MiTwfBbNHHOioIST0LjDfwbQ2Ln/Z5JMKfgQDdKwIZRBRyHzeX601PHpJnW2 Ds6ePRjulL+cJr4YBTzMrkSgpnpd4BPOugBFZBHqXHq1IO3PUGD7IS+dGSmVZzs6ZqwVo2S 5XxvLPnvTgy6EFjD8z1V0QUBfQwcTlgBbgKaiCEABMPuAkeJ1tEK94ThTOwdZ0kQd6XS7oK q2l1/kekNl1VuqhVqeHSwMlaBdvGVz8IpG2TiPJpZLGSmRj1OQXQCZvCt4S4VQ+IhnpqFeG NGCbjPm8+Pp/OxsxxgZUBwFGzMITGbtihCqatAHmWl9/8t4eQo= X-QQ-GoodBg: 0 X-BIZMAIL-ID: 12211815477442076290 From: Steven Liu To: ffmpeg-devel@ffmpeg.org Date: Fri, 2 Jun 2023 15:31:09 +0800 Message-Id: <20230602073109.14086-7-lq@chinaffmpeg.org> X-Mailer: git-send-email 2.40.0 In-Reply-To: <20230602073109.14086-1-lq@chinaffmpeg.org> References: <20230602073109.14086-1-lq@chinaffmpeg.org> MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:chinaffmpeg.org:qybglogicsvrsz:qybglogicsvrsz3a-3 Subject: [FFmpeg-devel] [PATCH v11 6/6] avformat/flvdec: support demux vp9 in enhanced flv 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 Cc: Steven Liu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: LWTavEz+AZz8 Signed-off-by: Steven Liu --- libavformat/flvdec.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index a0362ff11c..a6a94a4021 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -320,6 +320,8 @@ static int flv_same_video_codec(AVFormatContext *s, AVCodecParameters *vpar, int return vpar->codec_id == AV_CODEC_ID_HEVC; case MKBETAG('a', 'v', '0', '1'): return vpar->codec_id == AV_CODEC_ID_AV1; + case MKBETAG('v', 'p', '0', '9'): + return vpar->codec_id == AV_CODEC_ID_VP9; default: break; } @@ -365,6 +367,10 @@ static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream, par->codec_id = AV_CODEC_ID_AV1; vstreami->need_parsing = AVSTREAM_PARSE_HEADERS; return 4; + case MKBETAG('v', 'p', '0', '9'): + par->codec_id = AV_CODEC_ID_VP9; + vstreami->need_parsing = AVSTREAM_PARSE_HEADERS; + return 4; default: break; } @@ -1285,7 +1291,8 @@ retry_duration: st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_MPEG4 || st->codecpar->codec_id == AV_CODEC_ID_HEVC || - st->codecpar->codec_id == AV_CODEC_ID_AV1) { + st->codecpar->codec_id == AV_CODEC_ID_AV1 || + st->codecpar->codec_id == AV_CODEC_ID_VP9) { int type = 0; if (flv->exheader && stream_type == FLV_STREAM_TYPE_VIDEO) { type = flags & 0x0F; @@ -1317,7 +1324,7 @@ retry_duration: } if (type == 0 && (!st->codecpar->extradata || 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_AV1)) { + st->codecpar->codec_id == AV_CODEC_ID_AV1 || st->codecpar->codec_id == AV_CODEC_ID_VP9)) { AVDictionaryEntry *t; if (st->codecpar->extradata) {