C++远程监控系统接收端- RevPlayMDIChildWnd.cpp

该代码段是处理接收组播数据并进行DirectShow播放的函数。首先,它接收数据并将其存储到缓冲区,然后将数据拷贝到DirectShow可读取的内存区域。如果这是第一次接收数据,它会初始化图形设备接口并尝试根据接收到的数据大小渲染不同格式的文件。最后,它设置视频窗口属性并开始播放。在处理错误时,它会释放相关资源并显示错误消息。
摘要由CSDN通过智能技术生成

LRESULT CRevPlayWnd::OnRead(WPARAM wParam,LPARAM lParam)
{
    DWORD dwRet;
    REFTIME        fTime;
    REFERENCE_TIME    llClock;
    HRESULT hr;
    RECT rect;
    //接收组播数据,存放到缓冲区stWSABuf中
    RevLen=ReceiveData();
    //将缓冲区stWSABuf中的数据拷贝到存放接收的数据的数组pRevMem中,
    //以供DirectShow读取
    CopyMemory((PVOID)pRevMem[rIndex],(PVOID)stWSABuf.buf,RevLen);
    rIndex=(rIndex+1)%100;
    //将接收到的数据保存到文件中
    if(hmmioSave)
        mmioWrite(hmmioSave,stWSABuf.buf,RevLen);
    
    if(m_FirstRead)   
    {//如果是第一次接收到数据,启动DirectShow
        fTime = 0.0;
        dwRet = Parse ((PBYTE)stWSABuf.buf, stWSABuf.len, &llClock);
        fTime = llClock / 90000.0;
        if(dwRet == 0)
            return -1;
        
        if(InitGraph()==-1)
            return -1;
        
        if (abs (dwRet - 2048000) <= 16000) {
            RenderFrom ((PBYTE)achInBuf, "2mpal.dat");
        }
        
        if (abs (dwRet - 1152000) <= 16000) {
            RenderFrom ((PBYTE)achInBuf, "1mpal.dat");
        }
        
        if (abs (dwRet - 512000)  <= 16000) {
            RenderFrom ((PBYTE)achInBuf, "512pal.dat");
        }
        
        if (abs (dwRet - 256000)  <= 16000) {
            RenderFrom ((PBYTE)achInBuf, "256pal.dat");
        }
        
        Block = 0;
        
        //使用智能连接,将Source Filter的输出Pin连出去
        if (FAILED(hr = m_pigb -> Render(m_rdr -> GetPin(0))))
        {
            if (hr != VFW_S_AUDIO_NOT_RENDERED && hr != VFW_E_NO_AUDIO_HARDWARE )
            {
                MessageBox ("Render Error");
                WSAAsyncSelect(MultiSock,m_hWnd,WSA_READ,0);
                HELPER_RELEASE(m_pifg);
                HELPER_RELEASE(m_pigb);
                HELPER_RELEASE(m_pimc);
                HELPER_RELEASE(m_pivw);
                HELPER_RELEASE(m_ppos);
                return -1;
            }
        }
        
        m_RenderOk = true;
        //设置视频窗口属性
        m_pivw -> put_Owner((OAHWND)m_hWnd);
        m_pivw -> put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
        GetClientRect(&rect);
        m_pivw -> SetWindowPosition(rect.left, rect.top, rect.right, rect.bottom);
        //开始播放
        m_pimc -> Run();    
        m_ppos->put_CurrentPosition(fTime + 0.4);
        m_Stop = TRUE;
    }
    
    m_FirstRead=FALSE;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D20187

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值