From patchwork Mon Mar 4 13:51:55 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Diego Felix de Souza via ffmpeg-devel X-Patchwork-Id: 46776 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:a919:b0:19e:cdac:8cce with SMTP id cd25csp2813825pzb; Mon, 4 Mar 2024 05:52:19 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCV8aA9hRtNuJDBbGA52CUbjVaAN4c2i7ex/fABYU1Hdi2Otncmj9GMpqSDySlxoCKwzw1P0H714mGiXuBk1p/w5GXXxxBo5daInQg== X-Google-Smtp-Source: AGHT+IHsm0PoRA8azqizlJUdirTnhC1pUk2W9DMHBGR5jebuaycnApXA6F4U2reSw/SU1Rs54NPh X-Received: by 2002:ac2:5e67:0:b0:513:df6:dcd3 with SMTP id a7-20020ac25e67000000b005130df6dcd3mr5907813lfr.48.1709560339179; Mon, 04 Mar 2024 05:52:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1709560339; cv=none; d=google.com; s=arc-20160816; b=RsQFdIqYlsLKvm3YKCd228iVaf0K/RjY65BtsWrra1e8MhNxYq5IpyxC9t3RmOYQuN pJGcmAUqtD/Ds1CLrmRc37dctUt2z2VT02eQm1QodKQIOE7xBi30CXOwAlH+ZPtuxQ4Y YUj5PoBypxM7iqQniZI5fsNbgbRQvd8Rtdjf6T06wN/iW+W15NNu4GPo2hl3ivpEAta2 0hwolvc0av0fSe4POkV7GX/ry1dIGt5F6mx+NPcxYHdW7lY3TEHPIdhZZskqTOOLsh0l vPOYkJsTpNF6fP+nj/cHxbq7evKkAOWwK32hv+V4BNgElbaDV9VuKUP5cSuwAFccAS8S HUKg== 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:from :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:date:to:message-id :delivered-to; bh=xI2x0o4gpdP1qxiCaPvQ9UE9chICWW4cgIBLCJNiISw=; fh=frUT2hx60kzuIVmkNUv7bM3Y/kw3lxlKoLH+4fdDqZk=; b=WT/x1kNkq9v8/6ITkDFcw2sVMt8UYggw3Ztj/1kax6+zCFeEXov278rZiaVcId14aS 7rgdNujexjLs8qOilFi26j6cpVJO/zKP2k2jXDmroix/vhQL4uVcsOtD09rVLFKIe+2j R1Nd2LpIzbhYXFd6ZZjclaaSgiTqMWxeXBP68vL27o46EaJl1nesfp5K5oD/Zozqw6AY lebtl8GHr3bm3S6SskLdd56OTThzRMuqPCrZWd331ps2k/y0YJo/GD+lSIEd4JlZTlZM G4xDFYkITYR+hrR4FF1tmtZWOlbKb4xvIOSONtMrkEUR0Gn97kMPd8QyEOCZXm+rFfVZ e0fA==; dara=google.com 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 e25-20020a1709062c1900b00a4452b31420si3656548ejh.246.2024.03.04.05.52.18; Mon, 04 Mar 2024 05:52:19 -0800 (PST) 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 2ABFB68D3FE; Mon, 4 Mar 2024 15:52:15 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out162-62-57-49.mail.qq.com (out162-62-57-49.mail.qq.com [162.62.57.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 820E368D39C for ; Mon, 4 Mar 2024 15:52:06 +0200 (EET) Received: from localhost.localdomain ([163.125.127.26]) by newxmesmtplogicsvrszb9-1.qq.com (NewEsmtp) with SMTP id CF983423; Mon, 04 Mar 2024 21:51:57 +0800 X-QQ-mid: xmsmtpt1709560317taq4gyq8m Message-ID: X-QQ-XMAILINFO: OKkKo7I1HxIen5U4aI8W85EeMLy3dZDOQfgy+jXC/E/WVaGw73j+Tlu8qSEfiZ S/Zy3itz6BEXjD6KDYNCXBANQW/uppuSyF4walud5h/hcJDtskPOlh7DC+8pZ0KYkjOw2BRTvBM2 nXkofmpuMzhgEN4IpTsr0F8+7NKmGCPDo4vVax2POauNHsVvBhm6NgqwLp2zenPjgmwtO4eEWMvp h/vW7fChlbLZjIVXgwALwadldB3ZE5qbaA3P4tmtkaZj59eBsfel/P6ZJitw7gmiVJoQWKUQJM27 7s2k9KeoNRc7aIJY7rUESp1RPKTbZlwjYc9hipVf6z/Tx3Sg1taO0CRcqD7FHpDqKXbC8W+gdRLb 1VCFMdOa6e7eeF/ds2LKDr79RtIYlj2sVhlI6Q1pe6aOQnE4Unpwzxkw9aS/mkfRI2/wmBSaxCHT o43J3Vil11uM6aymuHScOy38kqZI9WuvIXusyaIyNAD+jDmTK3a42jDvnpa39VfSh3W04SXwlMH/ lLKZT+GTP0liGoU1h/MZzeGzKEmIhof7GEty1uPZmDtpGAkVJgELk84tQmSd5ZpIVQ4ynC9rOnvU oErD1H5BPOtxbCcKkQcvy6XVzgTLUrQYWuQRc1pMWRgpkV7TU83trFbMp/8HJj6CSs0UNu0XuWMv MKY57zf7PYza2k5IHkGtn7yZ2UzFZ31FqehTuc2rEc/gNqmS6EcE0Vj5TCthpaRCzmeQKVkPX0kl tUcOjc+0lxP1JAtgI5nH0ETPJqiT/Ltfwc2askE7ehFUeQLjag8vAdOapDtopIhs3ZIVoy/gzenB VmeFirfEEHqOyWwALSV7mWKnILG4Cx0dUs/GoZIULTvtnAggKMRw2sS1yi+UBSmxrXrkTY79sZ1f mDIdktAOxmZZ6tFtAzBvWa/5Gjfq7FdOeCfGeforzVWLEgMmL0E59fYgWcwG4fPlTiFJW71vv75l Gdzvf14g7dsu7Vqw/vyZZ8MQQzE34A X-QQ-XMRINFO: OD9hHCdaPRBwq3WW+NvGbIU= To: ffmpeg-devel@ffmpeg.org Date: Mon, 4 Mar 2024 21:51:55 +0800 X-OQ-MSGID: <20240304135155.1283-1-411294962@qq.com> X-Mailer: git-send-email 2.44.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 1/3] avformat/flvdec: support enhanced flv PacketTypeMetadata 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: , X-Patchwork-Original-From: zhupengfei via ffmpeg-devel From: Diego Felix de Souza via ffmpeg-devel Reply-To: FFmpeg development discussions and patches Cc: 411294962@qq.com Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: x93TQuOJof+X From: Zhu Pengfei <411294962@qq.com> Signed-off-by: Zhu Pengfei <411294962@qq.com> --- libavformat/flvdec.c | 177 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 176 insertions(+), 1 deletion(-) diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index e25b5bd163..2a0aec7291 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -33,6 +33,7 @@ #include "libavutil/internal.h" #include "libavutil/intfloat.h" #include "libavutil/intreadwrite.h" +#include "libavutil/mastering_display_metadata.h" #include "libavutil/mathematics.h" #include "avformat.h" #include "demux.h" @@ -45,6 +46,28 @@ #define MAX_DEPTH 16 ///< arbitrary limit to prevent unbounded recursion +typedef struct FLVMasteringMeta { + double r_x; + double r_y; + double g_x; + double g_y; + double b_x; + double b_y; + double white_x; + double white_y; + double max_luminance; + double min_luminance; +} FLVMasteringMeta; + +typedef struct FLVMetaVideoColor { + uint64_t matrix_coefficients; + uint64_t transfer_characteristics; + uint64_t primaries; + uint64_t max_cll; + uint64_t max_fall; + FLVMasteringMeta mastering_meta; +} FLVMetaVideoColor; + typedef struct FLVContext { const AVClass *class; ///< Class for private options. int trust_metadata; ///< configure streams according onMetaData @@ -80,6 +103,8 @@ typedef struct FLVContext { int64_t time_offset; int64_t time_pos; + FLVMetaVideoColor *metaVideoColor; + int meta_color_info_flag; } FLVContext; /* AMF date type */ @@ -524,6 +549,7 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream, FLVContext *flv = s->priv_data; AVIOContext *ioc; AMFDataType amf_type; + FLVMetaVideoColor *meta_video_color = flv->metaVideoColor; char str_val[1024]; double num_val; amf_date date; @@ -672,6 +698,43 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream, } } + if (meta_video_color) { + if (amf_type == AMF_DATA_TYPE_NUMBER || + amf_type == AMF_DATA_TYPE_BOOL) { + if (!strcmp(key, "colorPrimaries")) { + meta_video_color->primaries = num_val; + } else if (!strcmp(key, "transferCharacteristics")) { + meta_video_color->transfer_characteristics = num_val; + } else if (!strcmp(key, "matrixCoefficients")) { + meta_video_color->matrix_coefficients = num_val; + } else if (!strcmp(key, "maxFall")) { + meta_video_color->max_fall = num_val; + } else if (!strcmp(key, "maxCLL")) { + meta_video_color->max_cll = num_val; + } else if (!strcmp(key, "redX")) { + meta_video_color->mastering_meta.r_x = num_val; + } else if (!strcmp(key, "redY")) { + meta_video_color->mastering_meta.r_y = num_val; + } else if (!strcmp(key, "greenX")) { + meta_video_color->mastering_meta.g_x = num_val; + } else if (!strcmp(key, "greenY")) { + meta_video_color->mastering_meta.g_y = num_val; + } else if (!strcmp(key, "blueX")) { + meta_video_color->mastering_meta.b_x = num_val; + } else if (!strcmp(key, "blueY")) { + meta_video_color->mastering_meta.b_y = num_val; + } else if (!strcmp(key, "whitePointX")) { + meta_video_color->mastering_meta.white_x = num_val; + } else if (!strcmp(key, "whitePointY")) { + meta_video_color->mastering_meta.white_y = num_val; + } else if (!strcmp(key, "maxLuminance")) { + meta_video_color->mastering_meta.max_luminance = num_val; + } else if (!strcmp(key, "minLuminance")) { + meta_video_color->mastering_meta.min_luminance = num_val; + } + } + } + if (amf_type == AMF_DATA_TYPE_OBJECT && s->nb_streams == 1 && ((!apar && !strcmp(key, "audiocodecid")) || (!vpar && !strcmp(key, "videocodecid")))) @@ -824,6 +887,7 @@ static int flv_read_close(AVFormatContext *s) av_freep(&flv->new_extradata[i]); av_freep(&flv->keyframe_times); av_freep(&flv->keyframe_filepositions); + av_freep(&flv->metaVideoColor); return 0; } @@ -1028,6 +1092,103 @@ static int resync(AVFormatContext *s) return AVERROR_EOF; } +static int flv_parse_video_color_info(AVFormatContext *s, AVStream *st, int64_t next_pos) +{ + FLVContext *flv = s->priv_data; + AMFDataType type; + AVIOContext *ioc; + char buffer[32]; + ioc = s->pb; + + // first object needs to be "colorInfo" string + type = avio_r8(ioc); + if (type != AMF_DATA_TYPE_STRING || + amf_get_string(ioc, buffer, sizeof(buffer)) < 0) + return TYPE_UNKNOWN; + + if (strcmp(buffer, "colorInfo")) { + av_log(s, AV_LOG_DEBUG, "Unknown type %s\n", buffer); + return TYPE_UNKNOWN; + } + + if (!(flv->metaVideoColor = av_mallocz(sizeof(FLVMetaVideoColor)))) { + return AVERROR(ENOMEM); + } + flv->meta_color_info_flag = 1; + amf_parse_object(s, NULL, NULL, buffer, next_pos, 0); // parse metadata + return 0; +} + +static int flv_update_video_color_info(AVFormatContext *s, AVStream *st) +{ + FLVContext *flv = s->priv_data; + const FLVMetaVideoColor* meta_video_color = flv->metaVideoColor; + const FLVMasteringMeta *mastering_meta = &meta_video_color->mastering_meta; + + int has_mastering_primaries, has_mastering_luminance; + // Mastering primaries are CIE 1931 coords, and must be > 0. + has_mastering_primaries = + mastering_meta->r_x > 0 && mastering_meta->r_y > 0 && + mastering_meta->g_x > 0 && mastering_meta->g_y > 0 && + mastering_meta->b_x > 0 && mastering_meta->b_y > 0 && + mastering_meta->white_x > 0 && mastering_meta->white_y > 0; + has_mastering_luminance = mastering_meta->max_luminance > 0 && mastering_meta->min_luminance > 0; + + if (meta_video_color->matrix_coefficients != AVCOL_SPC_RESERVED) + st->codecpar->color_space = meta_video_color->matrix_coefficients; + if (meta_video_color->primaries != AVCOL_PRI_RESERVED && + meta_video_color->primaries != AVCOL_PRI_RESERVED0) + st->codecpar->color_primaries = meta_video_color->primaries; + if (meta_video_color->transfer_characteristics != AVCOL_TRC_RESERVED && + meta_video_color->transfer_characteristics != AVCOL_TRC_RESERVED0) + st->codecpar->color_trc = meta_video_color->transfer_characteristics; + + if (meta_video_color->max_cll && meta_video_color->max_fall) { + size_t size = 0; + AVContentLightMetadata *metadata = av_content_light_metadata_alloc(&size); + if (!metadata) + return AVERROR(ENOMEM); + if (!av_packet_side_data_add(&st->codecpar->coded_side_data, &st->codecpar->nb_coded_side_data, + AV_PKT_DATA_CONTENT_LIGHT_LEVEL, metadata, size, 0)) { + av_freep(&metadata); + return AVERROR(ENOMEM); + } + metadata->MaxCLL = meta_video_color->max_cll; + metadata->MaxFALL = meta_video_color->max_fall; + } + + if (has_mastering_primaries || has_mastering_luminance) { + AVMasteringDisplayMetadata *metadata; + AVPacketSideData *sd = av_packet_side_data_new(&st->codecpar->coded_side_data, + &st->codecpar->nb_coded_side_data, + AV_PKT_DATA_MASTERING_DISPLAY_METADATA, + sizeof(AVMasteringDisplayMetadata), 0); + if (!sd) + return AVERROR(ENOMEM); + metadata = (AVMasteringDisplayMetadata*)sd->data; + memset(metadata, 0, sizeof(AVMasteringDisplayMetadata)); + // hdrCll + if (has_mastering_luminance) { + metadata->max_luminance = av_d2q(mastering_meta->max_luminance, INT_MAX); + metadata->min_luminance = av_d2q(mastering_meta->min_luminance, INT_MAX); + metadata->has_luminance = 1; + } + // hdrMdcv + if (has_mastering_primaries) { + metadata->display_primaries[0][0] = av_d2q(mastering_meta->r_x, INT_MAX); + metadata->display_primaries[0][1] = av_d2q(mastering_meta->r_y, INT_MAX); + metadata->display_primaries[1][0] = av_d2q(mastering_meta->g_x, INT_MAX); + metadata->display_primaries[1][1] = av_d2q(mastering_meta->g_y, INT_MAX); + metadata->display_primaries[2][0] = av_d2q(mastering_meta->b_x, INT_MAX); + metadata->display_primaries[2][1] = av_d2q(mastering_meta->b_y, INT_MAX); + metadata->white_point[0] = av_d2q(mastering_meta->white_x, INT_MAX); + metadata->white_point[1] = av_d2q(mastering_meta->white_y, INT_MAX); + metadata->has_primaries = 1; + } + } + return 0; +} + static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) { FLVContext *flv = s->priv_data; @@ -1100,8 +1261,17 @@ retry: video_codec_id = avio_rb32(s->pb); size -= 4; } - if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_VIDEO_INFO_CMD) + + if (enhanced_flv && stream_type == FLV_STREAM_TYPE_VIDEO && (flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_VIDEO_INFO_CMD) { + int pkt_type = flags & 0x0F; + if (pkt_type == PacketTypeMetadata) { + int ret = flv_parse_video_color_info(s, st, next); + av_log(s, AV_LOG_DEBUG, "enhanced flv parse metadata ret %d and skip\n", ret); + } + goto skip; + } else if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_VIDEO_INFO_CMD) { goto skip; + } } else if (type == FLV_TAG_TYPE_META) { stream_type=FLV_STREAM_TYPE_SUBTITLE; if (size > 13 + 1 + 4) { // Header-type metadata stuff @@ -1287,6 +1457,11 @@ retry_duration: goto leave; } + if (enhanced_flv && stream_type == FLV_STREAM_TYPE_VIDEO && flv->meta_color_info_flag) { + flv_update_video_color_info(s, st); // update av packet side data + flv->meta_color_info_flag = 0; + } + 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 From patchwork Mon Mar 4 13:52:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Diego Felix de Souza via ffmpeg-devel X-Patchwork-Id: 46777 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:a919:b0:19e:cdac:8cce with SMTP id cd25csp2813936pzb; Mon, 4 Mar 2024 05:52:30 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCXQnPfAQd6BD/Mi6+tO3lXGwyAWINNNgc1PUQy9GR5c9bUVYAj+I2EptSNQv/zF8ebZCAfCYKi2QnoysMy+QHU6cFsh6xqHNfyC2g== X-Google-Smtp-Source: AGHT+IGe5l1IT/msHoc8nt9AId7PtKHirNY3SHo01mvg95bk/VMkxcd4dmSw/sXbZGtZRVc/c7zX X-Received: by 2002:a17:906:4c54:b0:a45:6d7d:a21 with SMTP id d20-20020a1709064c5400b00a456d7d0a21mr1101528ejw.9.1709560349811; Mon, 04 Mar 2024 05:52:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1709560349; cv=none; d=google.com; s=arc-20160816; b=seVLyzyBWkl2FIuqg4x7D0IhsT9/vzXrRfFXTOjvehnNfOcDZMfdAX/kUozzAwHtUa /5ycPjwImcVUnJq5vfLkt8KKCEYDraI+7zhSetgIJOzJZm9hsIEG4d/f1iIwbA0qjuvl 2YxzSfpQjLP5TsahQrv+yBiCprPr8edWf0e3y+2r/dligrgWfLP/aqxdZkxSSRJAIVAv UJVPVLTlZLe/aiPmJhVCLN5ea1EDvP40MjC2wldeRxPLArak/RegTWhhgx9dKjLGDuvQ 6c8P6GmzSRbZYLSgizMm3uSM7K35MkyYRrzXYAnmbXIk9+qXmaKbXYBIYLkLIxh2404g SMgQ== 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:from :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:date:to:message-id :delivered-to; bh=LqXX4TBd/RDjotf9yeRvK5gbhdsRJnlyJas/X3D/mUA=; fh=frUT2hx60kzuIVmkNUv7bM3Y/kw3lxlKoLH+4fdDqZk=; b=bshjPvIvqaVGjAzQ/HpPTrnWClru5sZdc3UpPyPA7AKQKAJF1dC09MF02bY4e8pS8R 71Bc1HmVSt3wQpgezlVxodfYJX5mBEIszrNuq9YrbPeG1Lbiv1oP3nkag08eDJCRaIWo ZmK5lYulDmXXRXJZLHz6CmbLNta9mYDnTFK5DGGc8Wsd6ZZPZCqn7HuY0Y7/paJop0qv PM9d57Mu2P3W0advVrZGqKnKlyjdK4dZRRSWFQJpYTxpxtTsUe4fKiXTKZ3/0LtQbmTs JwYcNwxMf4IPIRfNBJY1CPb3Wf0uUo9zU5l17csx4jqX/ItfnBiTbeRpkgc7ULuxhzCg 1zgA==; dara=google.com 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 gs36-20020a1709072d2400b00a44a48327bfsi2773678ejc.182.2024.03.04.05.52.28; Mon, 04 Mar 2024 05:52:29 -0800 (PST) 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 4E27068D45C; Mon, 4 Mar 2024 15:52:24 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out162-62-57-252.mail.qq.com (out162-62-57-252.mail.qq.com [162.62.57.252]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 326DF68D3C0 for ; Mon, 4 Mar 2024 15:52:15 +0200 (EET) Received: from localhost.localdomain ([163.125.127.26]) by newxmesmtplogicsvrszc5-1.qq.com (NewEsmtp) with SMTP id D058000E; Mon, 04 Mar 2024 21:52:05 +0800 X-QQ-mid: xmsmtpt1709560325tcvnl6veh Message-ID: X-QQ-XMAILINFO: OOPJ7pYMv25tlcWpFY31R5qp9IUQM4GtDlTv2k4579OiTJyL0jDMKt4OGck+Fi ymdZYIzqPQtOJ+CdyKNnIKjPb0W3P/ed3siRmpO4IQj4ntCnfmoirdro6fUhALeQBryacNo0xkgO ZS+7vGdoK3KS2Q7yU3CtH8mXMY/6bIssPvJEUVab4c7n/x35fY1JGXoBsnTIs8d/kBCPn0iMIO9H InOchXzB1ypPtmh+VZ36/B66Kk4Wmv6V/5lIqmqEmW0VL1/UjFm4IbSeQTouW4jkLb3a4UeNOXdE zxFZQqA65DySdS3dhYBB+Qw2hOQszHIvCOimHWQj1FmvAw4FoiAfBkUMn3fFbm2Zm4E0O4yvb1a8 Fc3QgULr2vG7Zb337uXT/BIH/uY7sf8iEz4F/A807JNQMPrfQK9eBEwDJMTC4i7XCwlq2B2QUtvn hWaIwggVBZJ8D8jXKLnokLiwpPOZHfbQXBjP8ugnP/9RW29PoPfL+001LR8WuW1vKfpd8oVt7NqA YnO+13SMFV3tsKuXWE6c9dxpHP74DS+7ZRjOA5fGfdH4mZ7uyReEmBOQWb2SPVlnIsjdDRyh8Tin u88Rb/Hl196+m7XNuJNQ69JZ77XBJeWB7YDYgsYPUJHNtQTGN8GAUFeDSheQpWmv9GTbR91vkijv 1npnWnF4riXUtqa5mpuvHCStYXQR6LlqHSzWHa0QYRKAkQaq3a21NQ3NgEaRw9Sw82O3atNkERV9 Oprs3AO04j0TLXa7cOdz7I16MHqvfOtNOywCCB/li92wZoeGncySXA7B5Lbf49gVejWPW6Wh3Ezc Ck//OyvrQTunvIdzQOm8LIzpun/9ggNe+2Eggd5hdHokl3XzvA5s9D++gOVhOkj36LHxenVcCVAz OtQ31VOMgbTEQQQ3qjuViYrtrZ7aVPogo03e0khvwQ2uoRH5JT4Ay+1BeQQ3XXmFa1apebS6yFSy qLxLqhPMU2Afyr9Iu6hgvGsiyhGaQf3rTZRJNlrM8= X-QQ-XMRINFO: OD9hHCdaPRBwq3WW+NvGbIU= To: ffmpeg-devel@ffmpeg.org Date: Mon, 4 Mar 2024 21:52:04 +0800 X-OQ-MSGID: <20240304135204.1304-1-411294962@qq.com> X-Mailer: git-send-email 2.44.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 2/3] avformat/flvenc: support enhanced flv PacketTypeMetadata 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: , X-Patchwork-Original-From: zhupengfei via ffmpeg-devel From: Diego Felix de Souza via ffmpeg-devel Reply-To: FFmpeg development discussions and patches Cc: 411294962@qq.com Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 1BczZkTgA+rF From: Zhu Pengfei <411294962@qq.com> Signed-off-by: Zhu Pengfei <411294962@qq.com> --- libavformat/flvenc.c | 139 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c index f6d10f331c..261e5d800c 100644 --- a/libavformat/flvenc.c +++ b/libavformat/flvenc.c @@ -23,6 +23,7 @@ #include "libavutil/dict.h" #include "libavutil/intfloat.h" #include "libavutil/avassert.h" +#include "libavutil/mastering_display_metadata.h" #include "libavutil/mathematics.h" #include "libavcodec/codec_desc.h" #include "libavcodec/mpeg4audio.h" @@ -124,6 +125,7 @@ typedef struct FLVContext { int flags; int64_t last_ts[FLV_STREAM_TYPE_NB]; + int metadata_pkt_written; } FLVContext; static int get_audio_flags(AVFormatContext *s, AVCodecParameters *par) @@ -478,6 +480,142 @@ static void write_metadata(AVFormatContext *s, unsigned int ts) avio_wb32(pb, flv->metadata_totalsize + 11); } +static void flv_write_metadata_packet(AVFormatContext *s, AVCodecParameters *par, unsigned int ts) +{ + AVIOContext *pb = s->pb; + FLVContext *flv = s->priv_data; + AVContentLightMetadata *lightMetadata = NULL; + AVMasteringDisplayMetadata *displayMetadata = NULL; + int64_t metadata_size_pos = 0; + int64_t total_size = 0; + const AVPacketSideData *side_data = NULL; + + if (flv->metadata_pkt_written) return; + if (par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_AV1 || + par->codec_id == AV_CODEC_ID_VP9) { + int flags_size = 5; + side_data = av_packet_side_data_get(par->coded_side_data, par->nb_coded_side_data, + AV_PKT_DATA_CONTENT_LIGHT_LEVEL); + if (side_data) + lightMetadata = (AVContentLightMetadata *)side_data->data; + + side_data = av_packet_side_data_get(par->coded_side_data, par->nb_coded_side_data, + AV_PKT_DATA_MASTERING_DISPLAY_METADATA); + if (side_data) + displayMetadata = (AVMasteringDisplayMetadata *)side_data->data; + + /* + * Reference Enhancing FLV + * https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp.pdf + * */ + avio_w8(pb, FLV_TAG_TYPE_VIDEO); //write video tag type + metadata_size_pos = avio_tell(pb); + avio_wb24(pb, 0 + flags_size); + put_timestamp(pb, ts); //ts = pkt->dts, gen + avio_wb24(pb, flv->reserved); + + if (par->codec_id == AV_CODEC_ID_HEVC) { + avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeMetadata| FLV_FRAME_VIDEO_INFO_CMD); // ExVideoTagHeader mode with PacketTypeMetadata + avio_write(pb, "hvc1", 4); + } else if (par->codec_id == AV_CODEC_ID_AV1 || par->codec_id == AV_CODEC_ID_VP9) { + avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeMetadata| FLV_FRAME_VIDEO_INFO_CMD); + avio_write(pb, par->codec_id == AV_CODEC_ID_AV1 ? "av01" : "vp09", 4); + } + + avio_w8(pb, AMF_DATA_TYPE_STRING); + put_amf_string(pb, "colorInfo"); + + avio_w8(pb, AMF_DATA_TYPE_OBJECT); + + put_amf_string(pb, "colorConfig"); // colorConfig + + avio_w8(pb, AMF_DATA_TYPE_OBJECT); + + if (par->color_trc != AVCOL_TRC_UNSPECIFIED && + par->color_trc < AVCOL_TRC_NB) { + put_amf_string(pb, "transferCharacteristics"); // color_trc + put_amf_double(pb, par->color_trc); + } + + if (par->color_space != AVCOL_SPC_UNSPECIFIED && + par->color_space < AVCOL_SPC_NB) { + put_amf_string(pb, "matrixCoefficients"); // colorspace + put_amf_double(pb, par->color_space); + } + + if (par->color_primaries != AVCOL_PRI_UNSPECIFIED && + par->color_primaries < AVCOL_PRI_NB) { + put_amf_string(pb, "colorPrimaries"); // color_primaries + put_amf_double(pb, par->color_primaries); + } + + put_amf_string(pb, ""); + avio_w8(pb, AMF_END_OF_OBJECT); + + if (lightMetadata) { + put_amf_string(pb, "hdrCll"); + avio_w8(pb, AMF_DATA_TYPE_OBJECT); + + put_amf_string(pb, "maxFall"); + put_amf_double(pb, lightMetadata->MaxFALL); + + put_amf_string(pb, "maxCLL"); + put_amf_double(pb, lightMetadata->MaxCLL); + + put_amf_string(pb, ""); + avio_w8(pb, AMF_END_OF_OBJECT); + } + + if (displayMetadata && (displayMetadata->has_primaries || displayMetadata->has_luminance)) { + put_amf_string(pb, "hdrMdcv"); + avio_w8(pb, AMF_DATA_TYPE_OBJECT); + if (displayMetadata->has_primaries) { + put_amf_string(pb, "redX"); + put_amf_double(pb, av_q2d(displayMetadata->display_primaries[0][0])); + + put_amf_string(pb, "redY"); + put_amf_double(pb, av_q2d(displayMetadata->display_primaries[0][1])); + + put_amf_string(pb, "greenX"); + put_amf_double(pb, av_q2d(displayMetadata->display_primaries[1][0])); + + put_amf_string(pb, "greenY"); + put_amf_double(pb, av_q2d(displayMetadata->display_primaries[1][1])); + + put_amf_string(pb, "blueX"); + put_amf_double(pb, av_q2d(displayMetadata->display_primaries[2][0])); + + put_amf_string(pb, "blueY"); + put_amf_double(pb, av_q2d(displayMetadata->display_primaries[2][1])); + + put_amf_string(pb, "whitePointX"); + put_amf_double(pb, av_q2d(displayMetadata->white_point[0])); + + put_amf_string(pb, "whitePointY"); + put_amf_double(pb, av_q2d(displayMetadata->white_point[1])); + } + if (displayMetadata->has_luminance) { + put_amf_string(pb, "maxLuminance"); + put_amf_double(pb, av_q2d(displayMetadata->max_luminance)); + + put_amf_string(pb, "minLuminance"); + put_amf_double(pb, av_q2d(displayMetadata->min_luminance)); + } + put_amf_string(pb, ""); + avio_w8(pb, AMF_END_OF_OBJECT); + } + put_amf_string(pb, ""); + avio_w8(pb, AMF_END_OF_OBJECT); + + total_size = avio_tell(pb) - metadata_size_pos - 10; + avio_seek(pb, metadata_size_pos, SEEK_SET); + avio_wb24(pb, total_size); + avio_skip(pb, total_size + 10 - 3); + avio_wb32(pb, total_size + 11); // previous tag size + flv->metadata_pkt_written = 1; + } +} + static int unsupported_codec(AVFormatContext *s, const char* type, int codec_id) { @@ -878,6 +1016,7 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) memcpy(par->extradata, side, side_size); flv_write_codec_header(s, par, pkt->dts); } + flv_write_metadata_packet(s, par, pkt->dts); } if (flv->delay == AV_NOPTS_VALUE) From patchwork Mon Mar 4 13:52:11 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Diego Felix de Souza via ffmpeg-devel X-Patchwork-Id: 46778 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:a919:b0:19e:cdac:8cce with SMTP id cd25csp2814034pzb; Mon, 4 Mar 2024 05:52:39 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCUuOUl40OD8o2/ojuawm2bCWwyif6AKFxfwhOK30dOgECL1zHu+MlzwV9KBwDeSCzuyZqKqO7Ut2Z9DMTxmJXfTq+Aw2FOGEJzvTw== X-Google-Smtp-Source: AGHT+IESNT5n1vQI4576F9WvzC09+uj6sS40dty9kPNZQyGpy2TE1Pml2IGXqyq7CzyQKkj0XrWo X-Received: by 2002:a17:907:d411:b0:a44:9c31:51be with SMTP id vi17-20020a170907d41100b00a449c3151bemr4944436ejc.6.1709560359536; Mon, 04 Mar 2024 05:52:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1709560359; cv=none; d=google.com; s=arc-20160816; b=BrVe3eTjfoddr6BgejvfkxNCw9yly5iua/6z6ujSKUztUGgG5C99tk06jK4FtF52Nz 0kiMzNFIrWn511PjNFZhXiCp5c4QWnCKMsX4fHyYo2u40Qg7TkBDyUgDxLAlS7pKbfMv QPZ1Bu91RURS0REh86N1fTXNhIbU8v2pW4adK8Xn03/C7hmHFFINNb0fH/m+u/qqhwEX zOnnK4FDfj4Mdb9Wru203QyiGhiYkEIvWZxBfRojmbNC+xEgsCyVyVgi+1erJhBNtJ50 eXOGs9kEL9Dkb5RxHmT2zAVpCgx7ZAs+X8+ASkI9yLvWU8bWYbMeEak5rfSCxaR7Ep6j tWNA== 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:from :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:date:to:message-id :delivered-to; bh=Sff/7PwE2zstc9wS4LoFSq2fcwXwkyXhqFYRClcR6kw=; fh=frUT2hx60kzuIVmkNUv7bM3Y/kw3lxlKoLH+4fdDqZk=; b=WouScJ0ayMT4xCMa+rBsi74y/RQzQygK5prsIPESlLO0mO+wMP3YNgkiXWWo/MnGut DIZaOR+smHT7lS+jBnFu+xZ0Cb9cyTqDFx2ceg9vwuVgYSh63D8YtCNPf+xnIBbo+FCG X+dq5rFraKjdgLjcKPhqZ6V1lP9mXtXcrdXHUR2eKDo9TsmO5OdnJVno+KFVgjQcfor/ r8l7FT9SO+vBcTDSHmVOGEJMQUlY+Y3hgARj0j9eucmW9DowFjhMOE3nca9kixFI+7Ja Lutu/jdHVl26uW2FZjfRqiOJExEqnHpUZxxnUr7TzYW5c0u0iIQJdKt3GDBQViWQGgTP DlqA==; dara=google.com 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 hd36-20020a17090796a400b00a4462daceabsi3480767ejc.749.2024.03.04.05.52.39; Mon, 04 Mar 2024 05:52:39 -0800 (PST) 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 481D868D462; Mon, 4 Mar 2024 15:52:25 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out162-62-58-211.mail.qq.com (out162-62-58-211.mail.qq.com [162.62.58.211]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 608EA68D421 for ; Mon, 4 Mar 2024 15:52:16 +0200 (EET) Received: from localhost.localdomain ([163.125.127.26]) by newxmesmtplogicsvrszc5-0.qq.com (NewEsmtp) with SMTP id D0C97EF4; Mon, 04 Mar 2024 21:52:12 +0800 X-QQ-mid: xmsmtpt1709560332tx02hbx8w Message-ID: X-QQ-XMAILINFO: NkHKfw09D6j8gUHbbnEzrOGAicVyj7Gof0MSwZ0u8RDohHuJQSBN8070yF6lfj lULQnDkZ4HmOoNEBckzuP8+HM71yl4TbHNyRxJ1kF+T5sk5eEijpFVb0+KJILpMkH0Tg2o5E71Ow aSLQGtKbjikExAWBdfpNFgzQH2AfsviBxffP01Is55uCY8KMeyAdemUZ2j+XLtyaVL7tYIG+aYNq /O7Cxr+ToskGARuCz63PGLnBGnSki5rbqcb0dBW8qy7uQWH24Fx1/INzwXV1wbJqENA6wAeXBQwZ fvl7yWu/VXG9Pred0+kzJaBQhoRwMLP9n4IVzbqOpnIQ+gupYyIaxYmmf7QLeqcgAs6gDv8D5OUy sc3VA2XAupd5yNAdTve69SmDQid7kxw9nITDBZl7zPJ+J5mwAxy5ZrM2jSMiQfqNuN1PpDy3SwrM qWnCr0dSGFjw+UycT1bTHFl0ZIPwcRSerx4Ml+2uLQCpTy700qin1s9ebboJVYJN/o7LuP+rpAXb eOiDy4W1CtrmaQeG4unPVfs9KhfvK7BtZlbkN8mdplPMw/CmDyYlMwbCt7UbmCnBtGhcCsbA1362 DQmXhDbnn0fPtwAqyZQDk8ZlqhOEvFy61+WHL0SNaXDpOhfmZHUmGQbbr47OTNK+vUEwcnllQQpi fK0KiiEmF1f5B2gXVtcvzOMYOgM8UiM6lZnKU8OB+PJZfCeZXrVbSXmYsiyCOxBXSGyUZDBlC29I 3DXlul3LfZEj9SkIhI1gDcNIwT4GkShDujQf6rJwQvf0GO8W/+ThWckylzBnisRgLhTJf12s2Yj9 dPBOQ5LiRrJoEFGzd7RHZB0jStuWSoGitjSqj0nIYkXBpT/kj2jPVKYRyczH1ciw7yRWqy++aesn cR9r5mz71gX8RVcvNczNCPTi9d02qjmjiDun+eQmWuXPIZJydQGAsaoKtjtMeUFBvmlYDA/eNxP1 5Q60xQTYqmxP1/Z2UsGu1nN1L5oZ1y X-QQ-XMRINFO: Nq+8W0+stu50PRdwbJxPCL0= To: ffmpeg-devel@ffmpeg.org Date: Mon, 4 Mar 2024 21:52:11 +0800 X-OQ-MSGID: <20240304135211.1322-1-411294962@qq.com> X-Mailer: git-send-email 2.44.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 3/3] fate/flvenc: support enhanced flv PacketTypeMetadata 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: , X-Patchwork-Original-From: zhupengfei via ffmpeg-devel From: Diego Felix de Souza via ffmpeg-devel Reply-To: FFmpeg development discussions and patches Cc: 411294962@qq.com Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: a7qlZv9EnspE From: Zhu Pengfei <411294962@qq.com> Signed-off-by: Zhu Pengfei <411294962@qq.com> --- tests/fate/lavf-container.mak | 2 ++ tests/ref/fate/enhanced-flv-hevc | 4 ++-- tests/ref/fate/enhanced-flv-vp9 | 4 ++-- tests/ref/lavf-fate/hevc.flv | 3 +++ 4 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 tests/ref/lavf-fate/hevc.flv diff --git a/tests/fate/lavf-container.mak b/tests/fate/lavf-container.mak index fa7ecd2cb5..efef00d5b3 100644 --- a/tests/fate/lavf-container.mak +++ b/tests/fate/lavf-container.mak @@ -80,6 +80,7 @@ FATE_LAVF_CONTAINER_FATE-$(call ALLYES, MOV_DEMUXER LATM_MUXER) + FATE_LAVF_CONTAINER_FATE-$(call ALLYES, MP3_DEMUXER MP3_MUXER) += mp3 FATE_LAVF_CONTAINER_FATE-$(call ALLYES, MOV_DEMUXER MOV_MUXER) += qtrle_mace6.mov FATE_LAVF_CONTAINER_FATE-$(call ALLYES, AVI_DEMUXER AVI_MUXER) += cram.avi +FATE_LAVF_CONTAINER_FATE-$(call ALLYES, AVI_DEMUXER FLV_MUXER) += hevc.flv FATE_LAVF_CONTAINER_FATE = $(FATE_LAVF_CONTAINER_FATE-yes:%=fate-lavf-fate-%) @@ -96,6 +97,7 @@ fate-lavf-fate-latm: CMD = lavf_container_fate "aac/al04_44.mp4" "" "-acodec cop fate-lavf-fate-mp3: CMD = lavf_container_fate "mp3-conformance/he_32khz.bit" "" "-acodec copy" fate-lavf-fate-qtrle_mace6.mov: CMD = lavf_container_fate "qtrle/Animation-16Greys.mov" "-idct auto" fate-lavf-fate-cram.avi: CMD = lavf_container_fate "cram/toon.avi" "-idct auto" +fate-lavf-fate-hevc.flv: CMD = lavf_container_fate "mkv/hdr10tags-both.mkv" "" "-c:v copy" FATE_SAMPLES_FFMPEG += $(FATE_LAVF_CONTAINER_FATE) fate-lavf-fate fate-lavf: $(FATE_LAVF_CONTAINER_FATE) diff --git a/tests/ref/fate/enhanced-flv-hevc b/tests/ref/fate/enhanced-flv-hevc index 90b81fcc0f..f011d38a30 100644 --- a/tests/ref/fate/enhanced-flv-hevc +++ b/tests/ref/fate/enhanced-flv-hevc @@ -1,5 +1,5 @@ -25fb1fcdcfde498ab86a3387f1a7f833 *tests/data/fate/enhanced-flv-hevc.flv -3602897 tests/data/fate/enhanced-flv-hevc.flv +0da54607064548fa1aae5695751f189c *tests/data/fate/enhanced-flv-hevc.flv +3603038 tests/data/fate/enhanced-flv-hevc.flv #extradata 0: 551, 0xa18acf66 #extradata 1: 2, 0x00340022 #tb 0: 1/1000 diff --git a/tests/ref/fate/enhanced-flv-vp9 b/tests/ref/fate/enhanced-flv-vp9 index c9bcaa8029..1c70b52e6a 100644 --- a/tests/ref/fate/enhanced-flv-vp9 +++ b/tests/ref/fate/enhanced-flv-vp9 @@ -1,5 +1,5 @@ -f5cd49123111202ff220850e60f17ac4 *tests/data/fate/enhanced-flv-vp9.flv -9388 tests/data/fate/enhanced-flv-vp9.flv +7dae331e8e7a73e2e2288a31fe51104c *tests/data/fate/enhanced-flv-vp9.flv +9441 tests/data/fate/enhanced-flv-vp9.flv #extradata 0: 12, 0x03bc009d #tb 0: 1/1000 #media_type 0: video diff --git a/tests/ref/lavf-fate/hevc.flv b/tests/ref/lavf-fate/hevc.flv new file mode 100644 index 0000000000..5f47c352fd --- /dev/null +++ b/tests/ref/lavf-fate/hevc.flv @@ -0,0 +1,3 @@ +eca3b99e846e509c6957260b1ce4d82d *tests/data/lavf-fate/lavf.hevc.flv +11784 tests/data/lavf-fate/lavf.hevc.flv +tests/data/lavf-fate/lavf.hevc.flv CRC=0xd29da885