gscoolink:hdcp相关

 1 前言

  gsv的sdk经常遇到各类hdcp导致的出图问题;这里一点那里一点测的怀疑人生,统一总结一下放这吧,不然又忘记了;

 

什么是hdcp呢?

  HDCP:high-bandwidth digital content protection 高带宽数字内容保护协议;

  在音视频数据开始传输之前,会先使用HDCP协议进行认证;然后通过HDCP协议获得的密钥对TMDS数据进行加密传输;

 

hdcp是怎么工作的呢?

  关于hdcp是怎么工作的,可以了解一下,对于业务代码的编程帮助不大;

  历史背景

    于2000年由好莱坞内容商和Intel公司共同开发的音视频数据保护协议,使用HDCP协议时要求收发设备的硬件都支持HDCP协议;

    一些设备为了支持HDCP协议,专门使用一个HDCP密钥芯片;另外一些设备将HDCP协议和密钥集成到芯片内部;

  密钥加密原理

    每个HDCP设备都有一组唯一的Secret Device Keys,由40组56bits的密码构成;

    每个HDCP设备还有一个唯一的Device Private Key,共56bits,作为HDCP设备内部的唯一标识;

    每个HDCP设备还有一个KSV key selection vector,共40bits,作为HDCP设备对外的SN号或ID;

    KSV 由Device Private Key和部分参数运算后生成 ,KSV 用于决定使用Secret Device Keys中的哪组密钥用于交换和认证;

  密钥加密流程

    HDCP设备在传输数据之前,主设备先发送一个AKSV和伪随机序列An,从设备回传BKSV和转发器位REPEAT-bit;

    主设备通过运算,判断从设备的密钥是否有效;如果有效那么计算出一个共享密钥用来加密数据内容;

    从设备接收到加密数据后,使用私钥和共享密值进行解密数据内容;

    数据传输过程中还会间断性确认,防止传输过程中偷换设备;

  授权费用

    HDCP协议诞生的初衷就是为了避免盗版造成的经济损失,那么对于使用HDMI和HDCP协议的授权费,资本们自然也没放过;

    对于使用HDMI的每种设备需要缴纳每年1.5万美元的授权费,对于使用HDCP的每种设备每年也需要缴纳1.5万美元的授权费用;

    silicon image对设备的兼容性测试还要额外收费数千美元,平摊下来每台设备的协议成本至少在20美元以上,可怕居然比高通还贵;

      像不像地主搞垄断;

 

ques:hdcp模式应该什么时候设置?

  如果要使用hdcp,需要把所有功能需求都设置好了之后,再设置hdcp;

  这个可能是2702的代码特有的bug;重新改了hdcp的透传模式,然后就导致arc功能不行了;不知道为啥;

下面报错为在ARC和加解嵌音频设置完之前设置了hdcp导致的报错,把hdcp放到arc和加解嵌之后即可;
[15:59:27.905]收←◆Port4:Read Edid Failure
Port4:Toggle Tx HPD...
Port4:Edid Checksum Fail, Abort
Port4:Set Tx HDCP Cipher Disable
Port4:Set TMDS to 0...
Port4:PlugTxReset
Port4:PlugTxHpdAntiDither
Port4:Toggle Tx HPD...
Port4:PlugTxEnableTxCore
Port4:PlugTxEdid
Port4:PlugTxEdidManage

 

ques:gsv的代码是否适合用rtos?

  关于gsv的代码,可能还真的不适合用rtos,这样代码跑的慢,有些代码就是需要多跑几遍去更新的;

 

ques:gsv的hdcp应该如何设置?

  gsv的内部集成了两个独立hdcp引擎,独立对rx和tx进行解密和加密;

  当rx设置为force1p4,而给rx的src又是2p2时,就会直接解密失败;tx设不设置都会不输出;

  gsv的hdcp代码有些会有bug,当tx为no hdcp的时候,还会读到hdcp,需要改代码,所以先要测下变量是否正常;

  当rx和tx的变量和实际给的hdcp相符之后,就可以根据hdcp要求设置hdcp了;

  他们的hdcp都习惯放到event的两个case中处理,不过我一直没这么搞也ok;

查看代码
//uapi_function_mapper.c
void KfunSimpleHdcpSync(pin AvPort *port)
{
    AvPort *CurrentPort = NULL;
    AvPort *PrevPort = NULL;

    port->content.hdcp->SinkTotal = 0;

    /* Summarize all the Sinks that support Hdcp */
    while(KfunFindVideoNextTxEnd(port, &PrevPort, &CurrentPort) == AvOk)
    {
        /* Check whether there are missing sinks or added sinks */
        if(CurrentPort->type == HdmiTx)
        {
            /* enable sink hdcp */
            if((port->content.rx->VideoEncrypted == 1) &&
               (*(port->content.is_PlugRxFsm)        == AvFsmPlugRxStable) &&
               (*(CurrentPort->content.is_PlugTxFsm) == AvFsmPlugTxStable) &&
               (CurrentPort->content.tx->InfoReady   >= TxHdcpManageThreshold))
            {
                //cae 这里加个if判断;源码这里没有if判断;会读不到no hdcp
				if((CurrentPort->content.hdcptx->HdcpSupport == 1) ||
				   (CurrentPort->content.hdcptx->Hdcp2p2SinkSupport == 1))
                AvUapiTxEncryptSink(CurrentPort);
            }
            /* disable sink hdcp */
            if(port->content.rx->VideoEncrypted == 0)
            {
                if(CurrentPort->content.tx->HdmiMode == 0)
                {
                    if(CurrentPort->content.video->Mute.BlkMute == 1)
                    {
                        CurrentPort->content.video->Mute.BlkMute = 0;
                        AvUapiTxSetBlackMute(CurrentPort);
                    }
                }
                else if(CurrentPort->content.hdcptx->HdcpEnabled == 1)
                {
                    AvUapiTxDecryptSink(CurrentPort);
                }
            }
        }

        PrevPort = CurrentPort;
        CurrentPort = NULL;
    }
}

 

ques:视频信号发生分析仪在一些分辨率的时候会显示"Timing"是为什么?

  因为src的分辨率sink不支持;比如780e给的信号是2560*1080,sink端的分析仪只能解码2048*1024,就会显示"Timing ?"

 

posted @ 2025-07-25 15:19  rls_v  阅读(28)  评论(1)    收藏  举报