//////////////////////////////////////////////////////////// /// Show the initial video //////////////////////////////////////////////////////////// void IntroShow() { struct Video VideoIntro; VideoLoad(&VideoIntro, INTRO_VIDEO_THEME); SoundBufferPlay(INTRO_SOUND_THEME, false, 0, 0, 0); while (VideoIntro.Loaded && !VideoIntro.Finished) { // Render it VideoRender(&VideoIntro, false, 0, 0, WindowWidth, WindowHeight); // Display on window handle WindowDisplay(); // Process input events WindowProcessEvents(); } // Stop music SoundBufferStop(); // Delete the video VideoDelete(&VideoIntro); }
void CMultimediaRender::Render(CSampleData* data, bool bAudioDisabled) { m_lock.Lock(); data->AddRef(); bool bNeedConvert = false; if (m_bInteraction && data->cx < data->cy && data->colorType == ColorType_I420 && !data->bAudio) { bNeedConvert = true; if (Width != data->cx || Height != data->cy) { if (LpConverData) delete[] LpConverData; LpConverData = new unsigned char[data->cx * data->cy * 3 / 2]; //先置成黑色 memset(LpConverData, 0x00, data->cx * data->cy); memset(LpConverData + data->cx * data->cy, 0x80, data->cx * data->cy / 2); if (LpTemData) delete[] LpTemData; LpTemData = new unsigned char[data->cx * data->cx * data->cx / data->cy * 3 / 2]; Width = data->cx; Height = data->cy; } CopyDataI420(LpConverData, data->lpData, data->cx, data->cy, data->cy, data->cx, data->cx * data->cx / data->cy, LpTemData); } int DesWidth, DesHeight; SDIMutex.Lock(); BlackMagic* blackMagic = BlackMagic::Instance(); for (auto& id : SIDIDs) { if (id.enable && blackMagic->AllEnable()) { // GetDisPlayMode((SDIOUT_DISPLAYMODE)id.displayMode, DesWidth, DesHeight); // bool bConvert = false; // // if (LpConverData && bNeedConvert) // { // if (DesWidth != data->cy || DesHeight != data->cx) // { // bConvert = true; // } // } // else if (!data->bAudio) // { // if (DesWidth != data->cx || DesHeight != data->cy) // { // bConvert = true; // } // } // // if (!bConvert) { if (id.colorFormat != (SDIOUT_COLORFORMAT)data->colorType && (!data->bAudio)) { blackMagic->SDI_StopOut(id.id); blackMagic->SDI_StartOut(id.id, (SDIOUT_DISPLAYMODE)id.displayMode, (SDIOUT_COLORFORMAT)data->colorType, 0); id.colorFormat = (SDIOUT_COLORFORMAT)data->colorType; } } // else if (SDID3DResize) // { // // if (id.colorFormat != ColorFormat_RGBA32REVERSE && (!data->bAudio)) // { // blackMagic->SDI_StopOut(id.id); // blackMagic->SDI_StartOut(id.id, (SDIOUT_DISPLAYMODE)id.displayMode, ColorFormat_RGBA32REVERSE, 0); // id.colorFormat = ColorFormat_RGBA32REVERSE; // } // } if (LpConverData && bNeedConvert) { // if (bConvert && SDID3DResize) //进来一定不是音频 // { // m_previewlock.Lock(); // unsigned char *ResizeBuf = SDID3DResize->Resize(LpConverData, data->cy, data->cx, (TColorType)data->colorType, DesWidth, DesHeight, data->bFieldSignal); // if (ResizeBuf) // { // blackMagic->SDI_RenderDevice(id, ResizeBuf, DesWidth, DesHeight, ColorFormat_RGBA32REVERSE, data->bAudio, data->pAudioFormat, DesWidth * DesHeight * 4, false); // SDID3DResize->UnMap(); // } // m_previewlock.UnLock(); // // } // else { blackMagic->SDI_RenderDevice(id, LpConverData, data->cy, data->cx, (SDIOUT_COLORFORMAT)data->colorType, data->bAudio, data->pAudioFormat, data->dataLength, false); } } else { // if (bConvert && SDID3DResize) // { // //进来一定不是音频 // m_previewlock.Lock(); // unsigned char *ResizeBuf = SDID3DResize->Resize(data->lpData, data->cx, data->cy, (TColorType)data->colorType, DesWidth, DesHeight, data->bFieldSignal); // //QWORD Start = GetQPCMS(); // if (ResizeBuf) // { // blackMagic->SDI_RenderDevice(id, ResizeBuf, DesWidth, DesHeight, ColorFormat_RGBA32REVERSE, data->bAudio, data->pAudioFormat, DesWidth * DesHeight * 4, false); // SDID3DResize->UnMap(); // } // m_previewlock.UnLock(); // } // else { blackMagic->SDI_RenderDevice(id, data->lpData, data->cx, data->cy, (SDIOUT_COLORFORMAT)data->colorType, data->bAudio, data->pAudioFormat, data->dataLength, false); } } } } SDIMutex.UnLock(); if (data->bAudio) { WAVEFORMATEX* pAudioFormat = (WAVEFORMATEX*)(data->pAudioFormat); if (AudioOut == NULL || WaveFormat.nChannels != pAudioFormat->nChannels || WaveFormat.nSamplesPerSec != pAudioFormat->nSamplesPerSec || WaveFormat.wBitsPerSample != pAudioFormat->wBitsPerSample) { SetAudioRender(pAudioFormat->nChannels, pAudioFormat->nSamplesPerSec, pAudioFormat->wBitsPerSample); WaveFormat = *pAudioFormat; Log::writeMessage(LOG_RTSPSERV, 1, "WaveFormat 成功!"); } AudioRender(data->lpData, data->dataLength); } else { if (bAudioDisabled) AudioDestroy(); if (LpConverData && bNeedConvert) { VideoRender(LpConverData, data->cy, data->cx, data->colorType); } else { VideoRender(data->lpData, data->cx, data->cy, data->colorType); } } data->Release(); m_lock.UnLock(); }