@@ -10,14 +10,15 @@ BEGIN_MESSAGE_MAP(PushExternalVideoYUV, CDialogEx)
1010 ON_MESSAGE(WM_MSGID(EID_USER_OFFLINE), &PushExternalVideoYUV::OnEIDUserOffline)
1111 ON_MESSAGE(WM_MSGID(EID_REMOTE_VIDEO_STATE_CHANGED), &PushExternalVideoYUV::OnEIDRemoteVideoStateChanged)
1212 ON_BN_CLICKED(IDC_BUTTON_JOINCHANNEL, &PushExternalVideoYUV::OnClickedButtonJoinchannel)
13+ ON_BN_CLICKED(IDC_CHECK_HDR, &PushExternalVideoYUV::OnBnClickedCheckHdr)
1314END_MESSAGE_MAP()
1415
1516IMPLEMENT_DYNAMIC(PushExternalVideoYUV, CDialogEx)
1617
1718PushExternalVideoYUV::PushExternalVideoYUV(CWnd* pParent /* =nullptr*/ )
1819 : CDialogEx(PushExternalVideoYUV::IDD, pParent)
1920{
20-
21+
2122}
2223
2324PushExternalVideoYUV::~PushExternalVideoYUV ()
@@ -33,6 +34,7 @@ void PushExternalVideoYUV::DoDataExchange(CDataExchange* pDX)
3334 DDX_Control (pDX, IDC_EDIT_CHANNELNAME, m_edtChannel);
3435 DDX_Control (pDX, IDC_BUTTON_JOINCHANNEL, m_btnJoinChannel);
3536 DDX_Control (pDX, IDC_LIST_INFO_BROADCASTING, m_lstInfo);
37+ DDX_Control (pDX, IDC_CHECK_HDR, mCbHdr );
3638}
3739
3840// set control text from config.
@@ -81,12 +83,12 @@ bool PushExternalVideoYUV::InitAgora()
8183 m_lstInfo.InsertString (m_lstInfo.GetCount (), _T (" setClientRole broadcaster" ));
8284 m_rtcEngine->enableVideo ();
8385
84-
86+
8587 // query interface agora::AGORA_IID_MEDIA_ENGINE in the engine.
8688 m_mediaEngine.queryInterface (m_rtcEngine, agora::rtc::AGORA_IID_MEDIA_ENGINE);
8789 if (m_mediaEngine.get () == NULL )
8890 return FALSE ;
89-
91+
9092 ret = m_mediaEngine->setExternalVideoSource (true , false );
9193 m_lstInfo.InsertString (m_lstInfo.GetCount (), _T (" setExternalVideoSource enable=true, useTexture=false" ));
9294
@@ -107,7 +109,28 @@ bool PushExternalVideoYUV::InitAgora()
107109 m_videoFrame.cropTop = 0 ;
108110 m_videoFrame.format = agora::media::base::VIDEO_PIXEL_I420;
109111 m_videoFrame.type = agora::media::base::ExternalVideoFrame::VIDEO_BUFFER_TYPE::VIDEO_BUFFER_RAW_DATA;
110- m_imgBuffer = new BYTE[YUVReader::VIDEO_FRAME_SIZE]{0 };
112+ m_imgBuffer = new BYTE[YUVReader::VIDEO_FRAME_SIZE]{ 0 };
113+
114+ m_imgBuffer16 = new uint16_t [WIDHT_HDR * HEIGHT_HDR * 1.5 ]{ 0 };
115+ CString videoUrl = GetExePath () + _T (" \\ hdr_1280_720.yuv" );
116+ std::string tmp = cs2utf8 (videoUrl);
117+ std::ifstream file (tmp, std::ios::binary);
118+ if (!file) {
119+ AfxMessageBox (_T (" open hdr file failed" ));
120+ }
121+ file.seekg (0 , std::ios::end);
122+ std::streamsize fileSize = file.tellg ();
123+ file.seekg (0 , std::ios::beg);
124+ if (fileSize % sizeof (uint16_t ) != 0 ) {
125+ AfxMessageBox (_T (" hdr file format is wrong" ));
126+ }
127+ std::vector<char > fileBuffer (fileSize);
128+ if (!file.read (fileBuffer.data (), fileSize)) {
129+ AfxMessageBox (_T (" read hdr file failed" ));
130+ }
131+ file.close ();
132+ uint16_t * uint16Buffer = reinterpret_cast <uint16_t *>(fileBuffer.data ());
133+ memcpy_s (m_imgBuffer16, fileSize, uint16Buffer, fileSize);
111134
112135 m_rtcEngine->startPreview (VIDEO_SOURCE_CUSTOM);
113136 return true ;
@@ -121,10 +144,13 @@ void PushExternalVideoYUV::UnInitAgora()
121144 if (m_rtcEngine) {
122145 yuvReader.stop ();
123146 if (m_imgBuffer) {
124- delete m_imgBuffer;
147+ delete[] m_imgBuffer;
125148 m_imgBuffer = nullptr ;
126149 }
127-
150+ if (m_imgBuffer16) {
151+ delete[] m_imgBuffer16;
152+ m_imgBuffer16 = nullptr ;
153+ }
128154
129155 if (m_joinChannel)
130156 m_joinChannel = !m_rtcEngine->leaveChannel ();
@@ -153,7 +179,7 @@ void PushExternalVideoYUV::UnInitAgora()
153179BOOL PushExternalVideoYUV::OnInitDialog ()
154180{
155181 CDialogEx::OnInitDialog ();
156-
182+
157183 RECT rcArea;
158184 m_staVideoArea.GetClientRect (&rcArea);
159185
@@ -180,6 +206,8 @@ void PushExternalVideoYUV::ResumeStatus()
180206 m_remoteVideoWnd.SetUID (0 );
181207 m_localVideoWnd.Reset ();
182208 m_localVideoWnd.SetUID (0 );
209+ mCbHdr .SetCheck (FALSE );
210+ isUseHdr = false ;
183211}
184212
185213
@@ -259,9 +287,33 @@ void PushExternalVideoYUV::OnClickedButtonJoinchannel()
259287}
260288
261289void PushExternalVideoYUV::OnYUVRead (int width, int height, unsigned char * buffer, int size) {
262- memcpy_s (m_imgBuffer, size, buffer, size);
263- m_videoFrame.buffer = m_imgBuffer;
264- m_videoFrame.timestamp = m_rtcEngine->getCurrentMonotonicTimeInMs ();
290+ agora::media::base::ColorSpace colorSpace;
291+ if (isUseHdr)
292+ {
293+ m_videoFrame.buffer = m_imgBuffer16;
294+ colorSpace.range = agora::media::base::ColorSpace::RangeID::RANGEID_FULL;
295+ colorSpace.transfer = agora::media::base::ColorSpace::TransferID::TRANSFERID_ARIB_STD_B67;
296+ colorSpace.matrix = agora::media::base::ColorSpace::MatrixID::MATRIXID_BT2020_NCL;
297+ colorSpace.primaries = agora::media::base::ColorSpace::PrimaryID::PRIMARYID_BT2020;
298+ m_videoFrame.stride = WIDHT_HDR;
299+ m_videoFrame.height = HEIGHT_HDR;
300+ m_videoFrame.timestamp = m_rtcEngine->getCurrentMonotonicTimeInMs ();
301+ m_videoFrame.format = agora::media::base::VIDEO_PIXEL_I010;
302+ }
303+ else
304+ {
305+ memcpy_s (m_imgBuffer, size, buffer, size);
306+ colorSpace.range = agora::media::base::ColorSpace::RangeID::RANGEID_FULL;
307+ colorSpace.transfer = agora::media::base::ColorSpace::TransferID::TRANSFERID_BT709;
308+ colorSpace.matrix = agora::media::base::ColorSpace::MatrixID::MATRIXID_BT709;
309+ colorSpace.primaries = agora::media::base::ColorSpace::PrimaryID::PRIMARYID_BT709;
310+ m_videoFrame.stride = width;
311+ m_videoFrame.height = height;
312+ m_videoFrame.buffer = m_imgBuffer;
313+ m_videoFrame.timestamp = m_rtcEngine->getCurrentMonotonicTimeInMs ();
314+ m_videoFrame.format = agora::media::base::VIDEO_PIXEL_I420;
315+ }
316+
265317 if (m_joinChannel && m_mediaEngine.get () != nullptr ) {
266318 m_mediaEngine->pushVideoFrame (&m_videoFrame);
267319 }
@@ -385,7 +437,7 @@ LRESULT PushExternalVideoYUV::OnEIDRemoteVideoStateChanged(WPARAM wParam, LPARAM
385437 is called without a user ID specified. The server will automatically assign one
386438parameters:
387439 channel:channel name.
388- uid: user ID¡£ If the UID is specified in the joinChannel, that ID is returned here;
440+ uid: user ID�� If the UID is specified in the joinChannel, that ID is returned here;
389441 Otherwise, use the ID automatically assigned by the Agora server.
390442 elapsed: The Time from the joinChannel until this event occurred (ms).
391443*/
@@ -407,7 +459,7 @@ void PushExternalVideoYUVEventHandler::onJoinChannelSuccess(const char* channel,
407459parameters:
408460 uid: remote user/anchor ID for newly added channel.
409461 elapsed: The joinChannel is called from the local user to the delay triggered
410- by the callback£¨ ms).
462+ by the callback�� ms).
411463*/
412464void PushExternalVideoYUVEventHandler::onUserJoined (uid_t uid, int elapsed)
413465{
@@ -477,3 +529,20 @@ void PushExternalVideoYUVEventHandler::onRemoteVideoStateChanged(uid_t uid, REMO
477529 ::PostMessage (m_hMsgHanlder, WM_MSGID(EID_REMOTE_VIDEO_STATE_CHANGED), (WPARAM)stateChanged, 0);
478530 }
479531}
532+
533+
534+ void PushExternalVideoYUV::OnBnClickedCheckHdr ()
535+ {
536+ agora::rtc::HDR_CAPABILITY capability = agora::rtc::HDR_CAPABILITY::HDR_CAPABILITY_SUPPORTED;
537+
538+ int flag = m_rtcEngine->queryHDRCapability (VIDEO_MODULE_CAPTURER, capability);
539+
540+ if (flag == 0 ) {
541+ isUseHdr = !isUseHdr;
542+ }
543+ else {
544+ isUseHdr = false ;
545+ mCbHdr .SetCheck (FALSE );
546+ }
547+
548+ }
0 commit comments