From patchwork Sat Jul 29 17:49:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marton Balint X-Patchwork-Id: 43021 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:7927:b0:130:ccc6:6c4b with SMTP id b39csp1456422pzg; Sat, 29 Jul 2023 10:49:31 -0700 (PDT) X-Google-Smtp-Source: APBJJlFk+N558stCYjWchGybHHmG5sJ8X9yhfxusdJpBvGt8vxW+H/bWHgFByerrJjGGlrRFzkc/ X-Received: by 2002:a17:906:20d9:b0:978:8e8c:1bcb with SMTP id c25-20020a17090620d900b009788e8c1bcbmr2387556ejc.43.1690652971324; Sat, 29 Jul 2023 10:49:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690652971; cv=none; d=google.com; s=arc-20160816; b=zzdxZXZcyXPwtIl++zsHKGoYz7LooMi6T2rXRKOEV9JHukNgD3WgSVsjajMC3w8QDa FDL7OKGlOJj42W1bxKxDhMT/fl0y7JcdVcDmRh+0whqMCWFweMXQ/8OpUtZgxR70nNJM DeQ24NpEh6jWQZn1Cfu6t9zg1IVPn8MWUKBXWjmCYx08TQCoN565/pu6hX11Jd7aMVVC +svbdNMoPo97bGA8yA9wnEl77OwYaiAidsUoj0TmKr3M4jr5GrOje0oM3AT+uCDgPuAi +W994DJxyYmUMMm7o5JICmD7AAUR2raeIh9neAELugpXSWexs3QpHkElia2w5Pz1wVZL C6yA== 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:mime-version:references:in-reply-to :message-id:date:to:from:delivered-to; bh=SQdL5flib6QWLnC5EB/ArKVpnYyOziSbDTr3D1Dc71g=; fh=fMjmfVbdHm+M/+18QsbBd9XwekW2z8GZAuS0XfnYyyA=; b=CU1L39U/CMJ6zXIjUM6Uj83UOBQJlYgJIMnjhvVz9dQhQw7WoebP6HoB2efP6ghwOW B1aOJ1PgHiVE8yAe4u5D93NmvL+KQ+ceGVBJpLNYtPTnbpqUt7cb8TrQViIfxYAsuKFy EO2rmoszdGoKbTMBCwp7DqmUiwOlNPVNsSwHI0l58XVPglJx0TeUzUZ+WRCZMpbVkuJw N852aJG+UyF84IHiQ5c1PrhPYhj7DcWVuY55lvA9RHOxfPqWXYFq5Yst6Zaudua3YbOz d29XbYPFKh/wr047EPUuY4PZUwmB+bbnWWpTAx7kDT9gF9BLSeMumkOHh+5Do/JG9G5B t/DQ== 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 u21-20020a1709060b1500b00993cdec0182si4392110ejg.143.2023.07.29.10.49.30; Sat, 29 Jul 2023 10:49:31 -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 9D37E68C650; Sat, 29 Jul 2023 20:49:26 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from iq.passwd.hu (iq.passwd.hu [217.27.212.140]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 330D168C58E for ; Sat, 29 Jul 2023 20:49:20 +0300 (EEST) Received: from localhost (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 8ED8CE91DE; Sat, 29 Jul 2023 19:46:26 +0200 (CEST) X-Virus-Scanned: amavisd-new at passwd.hu Received: from iq.passwd.hu ([127.0.0.1]) by localhost (iq.passwd.hu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id EEB1G5iXmIa9; Sat, 29 Jul 2023 19:46:24 +0200 (CEST) Received: from bluegene.passwd.hu (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id E7B6AE8C4D; Sat, 29 Jul 2023 19:46:23 +0200 (CEST) From: Marton Balint To: ffmpeg-devel@ffmpeg.org Date: Sat, 29 Jul 2023 19:49:00 +0200 Message-Id: <20230729174900.25789-1-cus@passwd.hu> X-Mailer: git-send-email 2.35.3 In-Reply-To: References: MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avformat/flvdec: handle exheader fourcc correctly in metadata 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: Marton Balint Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: QS/2xfOJEwmi In metadata fourcc is carried in the AMF number, not as binary. Partially based on a patch by Steven Liu. Signed-off-by: Marton Balint --- libavformat/flvdec.c | 76 +++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 46 deletions(-) diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index 3fe21622f7..b904029ba5 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -304,30 +304,18 @@ static void flv_set_audio_codec(AVFormatContext *s, AVStream *astream, } } -static int flv_same_video_codec(AVFormatContext *s, AVCodecParameters *vpar, int flags) +static int flv_same_video_codec(AVFormatContext *s, AVCodecParameters *vpar, uint32_t flv_codecid) { - 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; - 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; - } - } - switch (flv_codecid) { + 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; + case MKBETAG('v', 'p', '0', '9'): + return vpar->codec_id == AV_CODEC_ID_VP9; case FLV_CODECID_H263: return vpar->codec_id == AV_CODEC_ID_FLV1; case FLV_CODECID_SCREEN: @@ -346,36 +334,26 @@ static int flv_same_video_codec(AVFormatContext *s, AVCodecParameters *vpar, int } static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream, - int flv_codecid, int read) + uint32_t 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; - case MKBETAG('a', 'v', '0', '1'): - 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; - } - } - switch (flv_codecid) { + + switch(flv_codecid) { + case MKBETAG('h', 'v', 'c', '1'): + par->codec_id = AV_CODEC_ID_HEVC; + vstreami->need_parsing = AVSTREAM_PARSE_HEADERS; + break; + case MKBETAG('a', 'v', '0', '1'): + par->codec_id = AV_CODEC_ID_AV1; + vstreami->need_parsing = AVSTREAM_PARSE_HEADERS; + break; + case MKBETAG('v', 'p', '0', '9'): + par->codec_id = AV_CODEC_ID_VP9; + vstreami->need_parsing = AVSTREAM_PARSE_HEADERS; + break; case FLV_CODECID_H263: par->codec_id = AV_CODEC_ID_FLV1; break; @@ -1065,6 +1043,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) AVStream *st = NULL; int last = -1; int orig_size; + uint32_t video_codec_id = 0; retry: /* pkt size is repeated at end. skip it */ @@ -1111,12 +1090,17 @@ retry: } else if (type == FLV_TAG_TYPE_VIDEO) { stream_type = FLV_STREAM_TYPE_VIDEO; flags = avio_r8(s->pb); + video_codec_id = flags & FLV_VIDEO_CODECID_MASK; /* * 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 (flv->exheader) { + video_codec_id = avio_rb32(s->pb); + size -= 4; + } if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_VIDEO_INFO_CMD) goto skip; } else if (type == FLV_TAG_TYPE_META) { @@ -1174,7 +1158,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(s, st->codecpar, flags))) + (s->video_codec_id || flv_same_video_codec(s, st->codecpar, video_codec_id))) break; } else if (stream_type == FLV_STREAM_TYPE_SUBTITLE) { if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) @@ -1275,7 +1259,7 @@ retry_duration: avcodec_parameters_free(&par); } } else if (stream_type == FLV_STREAM_TYPE_VIDEO) { - int ret = flv_set_video_codec(s, st, flags, 1); + int ret = flv_set_video_codec(s, st, video_codec_id, 1); if (ret < 0) return ret; size -= ret;