From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 3B6E94F9D1 for ; Tue, 24 Jun 2025 06:23:21 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 5B91868C69F; Tue, 24 Jun 2025 09:23:16 +0300 (EEST) Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id E19BC68B483 for ; Tue, 24 Jun 2025 09:23:09 +0300 (EEST) Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-235ea292956so52847775ad.1 for ; Mon, 23 Jun 2025 23:23:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1750746188; x=1751350988; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=To7CPHbz8sfkDhgi/ZKz9J2pf7LW+1MsDPQsaOnPw/g=; b=kc3OS5cW1xZzW39jmptsWwYI2JLUze8eXdYt+qgdISaKceYdK1h6yC0LDAsf8QUuOn fh0/aFQQ6O6sskwWsj9KxWyen+4hKIPwMGKhhgmhbReVnpZ1Au02GC8I2kCds8ZmdzeS s7tYPxk8QinMXCwO02W4Rq2L8L6Ry1QRzKt0E+jSxyg4I3dpqEA9ttam2U8zg49a2wMZ sZcZnT4ha0cKIPn8zQvzARe2fXOhw3/p9sDHlwNtGa9FXiT90v/CZ9uZxGEdbFqbJ8gM hnZT3HCUhnEceSN4UdAlnNDX9aikRRDZPWrcze0LkEfgdapqcqFnxwSZ5WJ93u3Qe6Dd AWXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750746188; x=1751350988; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=To7CPHbz8sfkDhgi/ZKz9J2pf7LW+1MsDPQsaOnPw/g=; b=OcZ07cGp+UrAy/MlI3hF2/a9epH4eTGCqJWID1aqjkigkfqjslcW5U3DMi8eipj0o0 XSkLJcDOgnTZpdFVZCgixmUew/BYvJ+OQkrtrcB3WTSuoSZIJIMI3ZLcqq/FU5Zwbetb kcfxpOG0tgSCyTkLlV8GsKdwAxaU79e5T0C6DRbSp5sF9EAR/Be1hH+GebpQfR9zq3pI D3U2IS96JOjKfmVbYi5z2KnyscxyEIqrr5r3yghVZCE2eLDun4iclWV6RPlyJHSdaHf1 qExRntOnu7jIovPaX39Eb1J114/pgkJMoqzJm9pduAoPn4CvcDdxYE4+T2pQBbwgbOv1 ZwXg== X-Gm-Message-State: AOJu0YzE+SeP5//QbXwClGqlVHSihlZuqKsZix1bXdCWTyVYn+lxZkHd 8wRDs2KwOEaaLmUE1C5c9sWEJmf2m0KljBc9krgoPLNvjy+P7xzSYDIVjF6EWaqi X-Gm-Gg: ASbGncvrQbg9c8EKuGmP07jfDaP6VtXN0me3sgANqIpDkl2x2umx2C5FCYpVT23keq5 OzT2jCx4bpCGnCIWd4eqSDNabirYW7zoHxRosGHJ+npVSORTyNUV3lP4cqoT44NTu9bvSiVR6ac +UQaTcOp3THv84a0h81lSJlSmQSkJ2BgYvsCmo3QSXAw5Q1vnA05rEPsrT4h/YlBfgdnxRcOYVS SRmM1PupNQhTeZyI97tAd6MuyHTZ4jXpJz+tL9SRZVWcvOEf7D1krscLIlOMA5Q3xFgP8nLj+VL EGqhr6uErcQ6UQuggD+Oa3aJrYm4vgM0jcJWYZNigweG0FVaRK9xQ5CfyUxeBihWXeJiKKb1Aix g0OhqeBP2Oc3QuqxXtjplK7Z2zGCd4Q== X-Google-Smtp-Source: AGHT+IEmz3eJ3lGk8HAELnhReHQfyeunFPovbjnfJbpuOYoMkviXHj+3f1EtDXsVncaHm/tCPxsa4Q== X-Received: by 2002:a17:903:1111:b0:235:880:cf70 with SMTP id d9443c01a7336-237d97f8c47mr201966765ad.14.1750746187643; Mon, 23 Jun 2025 23:23:07 -0700 (PDT) Received: from localhost.localdomain (c-24-21-21-91.hsd1.wa.comcast.net. [24.21.21.91]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-237d86cf609sm100787425ad.203.2025.06.23.23.23.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Jun 2025 23:23:07 -0700 (PDT) From: Pavel Roslyy To: ffmpeg-devel@ffmpeg.org Date: Mon, 23 Jun 2025 23:19:29 -0700 Message-ID: <20250624061959.23577-1-roslypav@gmail.com> X-Mailer: git-send-email 2.49.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] libavformat/usmdec: add support for HCA stream decryption 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: Pavel Roslyy Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: --- libavformat/usmdec.c | 53 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/libavformat/usmdec.c b/libavformat/usmdec.c index fd28e935ce..c5f2e208df 100644 --- a/libavformat/usmdec.c +++ b/libavformat/usmdec.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/opt.h" #include "libavutil/intfloat.h" #include "libavutil/intreadwrite.h" #include "libavutil/mem.h" @@ -47,10 +48,14 @@ typedef struct USMChannel { } USMChannel; typedef struct USMDemuxContext { + const AVClass *class; USMChannel ch[4][256]; int nb_channels[4]; uint8_t *header; unsigned header_size; + int64_t hca_keyl; + int64_t hca_keyh; + int hca_subkey; } USMDemuxContext; static int usm_probe(const AVProbeData *p) @@ -314,6 +319,7 @@ static int64_t parse_chunk(AVFormatContext *s, AVIOContext *pb, par->sample_rate = ch->rate.num; par->ch_layout.nb_channels = ch->nb_channels; st->duration = ch->duration; + get_extradata = 1; break; } @@ -323,7 +329,6 @@ static int64_t parse_chunk(AVFormatContext *s, AVIOContext *pb, avpriv_set_pts_info(st, 64, ch->rate.den, ch->rate.num); ffstream(st)->need_parsing = AVSTREAM_PARSE_TIMESTAMPS; - get_extradata = ch->codec_id == AV_CODEC_ID_ADPCM_ADX; ch->extradata_pos = avio_tell(pb); } @@ -333,10 +338,29 @@ static int64_t parse_chunk(AVFormatContext *s, AVIOContext *pb, pkt_size = chunk_size - (ret - chunk_start) - padding_size; if (get_extradata) { - if ((ret = ff_get_extradata(s, st->codecpar, pb, pkt_size)) < 0) + AVCodecParameters *par; + par = st->codecpar; + + // HCA decoder expects last 10 bytes to contain decryption keys + int key_buf = ch->codec_id == AV_CODEC_ID_HCA ? 10 : 0; + ret = ff_alloc_extradata(par, pkt_size + key_buf); + if (ret < 0) return ret; + + ret = avio_read(pb, par->extradata, pkt_size); + if (ret < pkt_size) { + av_freep(&par->extradata); + par->extradata_size = 0; + return AVERROR(EIO); + } + + if (ch->codec_id == AV_CODEC_ID_HCA) { + AV_WB32(par->extradata + par->extradata_size - 10, usm->hca_keyh); + AV_WB32(par->extradata + par->extradata_size - 6, usm->hca_keyl); + AV_WB16(par->extradata + par->extradata_size - 2, usm->hca_subkey); + } } else { - if (ret == ch->extradata_pos && ch->codec_id == AV_CODEC_ID_ADPCM_ADX) { + if (ret == ch->extradata_pos && ch->type == AVMEDIA_TYPE_AUDIO) { avio_skip(pb, pkt_size); ret = 0; } else { @@ -416,10 +440,33 @@ static int usm_read_close(AVFormatContext *s) return 0; } +#define OFFSET(x) offsetof(USMDemuxContext, x) +#define FLAGS AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM +static const AVOption usm_options[] = { + { "hca_lowkey", + "Low key used for handling CRI HCA streams", OFFSET(hca_keyl), + AV_OPT_TYPE_INT64, {.i64=0}, .min = 0, .max = UINT32_MAX, .flags = FLAGS, }, + { "hca_highkey", + "High key used for handling CRI HCA streams", OFFSET(hca_keyh), + AV_OPT_TYPE_INT64, {.i64=0}, .min = 0, .max = UINT32_MAX, .flags = FLAGS, }, + { "hca_subkey", + "Subkey used for handling CRI HCA streams", OFFSET(hca_subkey), + AV_OPT_TYPE_INT, {.i64=0}, .min = 0, .max = UINT16_MAX, .flags = FLAGS }, + { NULL }, +}; + +static const AVClass usm_class = { + .class_name = "usm", + .item_name = av_default_item_name, + .option = usm_options, + .version = LIBAVUTIL_VERSION_INT, +}; + const FFInputFormat ff_usm_demuxer = { .p.name = "usm", .p.long_name = NULL_IF_CONFIG_SMALL("CRI USM"), .p.extensions = "usm", + .p.priv_class = &usm_class, .p.flags = AVFMT_GENERIC_INDEX | AVFMT_NO_BYTE_SEEK | AVFMT_NOBINSEARCH, .priv_data_size = sizeof(USMDemuxContext), .read_probe = usm_probe, -- 2.49.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".