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 ?"
                    
                
                
            
        
浙公网安备 33010602011771号