@@ -545,6 +545,71 @@ void OSD::init()
545545 LOG_DEBUG (" libschrift init failed." );
546546 }
547547
548+ if (cfg->general .privacy_mode )
549+ {
550+ /* OSD Privacy Background */
551+ osdPrivBack.data = nullptr ;
552+ osdPrivBack.imp_rgn = IMP_OSD_CreateRgn (nullptr );
553+ IMP_OSD_RegisterRgn (osdPrivBack.imp_rgn , osdGrp, nullptr );
554+ osd.regions .priv_back = osdPrivBack.imp_rgn ;
555+
556+ memset (&osdPrivBack.rgnAttr , 0 , sizeof (IMPOSDRgnAttr));
557+
558+ osdPrivBack.rgnAttr .type = OSD_REG_COVER;
559+ osdPrivBack.rgnAttr .fmt = PIX_FMT_BGRA;
560+ osdPrivBack.rgnAttr .rect .p0 .x = 0 ;
561+ osdPrivBack.rgnAttr .rect .p0 .y = 0 ;
562+ osdPrivBack.rgnAttr .rect .p1 .x = stream_width - 1 ;
563+ osdPrivBack.rgnAttr .rect .p1 .y = stream_height - 1 ;
564+ osdPrivBack.rgnAttr .data .coverData .color = 0xff000000 ;
565+
566+ IMP_OSD_SetRgnAttr (osdPrivBack.imp_rgn , &osdPrivBack.rgnAttr );
567+
568+ IMPOSDGrpRgnAttr grpRgnAttrBack;
569+
570+ memset (&grpRgnAttrBack, 0 , sizeof (IMPOSDGrpRgnAttr));
571+ grpRgnAttrBack.show = 1 ;
572+ grpRgnAttrBack.layer = 1 ;
573+ grpRgnAttrBack.gAlphaEn = 0 ;
574+ grpRgnAttrBack.fgAlhpa = 0 ;
575+ IMP_OSD_SetGrpRgnAttr (osdPrivBack.imp_rgn , osdGrp, &grpRgnAttrBack);
576+
577+ /* OSD Privacy Message */
578+ int posPrivacyTextX = round (stream_width / 2 );
579+ int posPrivacyTextY = round (stream_height / 2 );
580+
581+ osdPrivText.data = nullptr ;
582+ osdPrivText.imp_rgn = IMP_OSD_CreateRgn (nullptr );
583+ IMP_OSD_RegisterRgn (osdPrivText.imp_rgn , osdGrp, nullptr );
584+ osd.regions .priv_text = osdPrivText.imp_rgn ;
585+
586+ memset (&osdPrivText.rgnAttr , 0 , sizeof (IMPOSDRgnAttr));
587+ osdPrivText.rgnAttr .type = OSD_REG_PIC;
588+ osdPrivText.rgnAttr .fmt = PIX_FMT_BGRA;
589+
590+ std::string privacy_text = osd.privacy_format ;
591+ if (strstr (osd.privacy_format , " %hostname" ) != nullptr )
592+ {
593+ replace (privacy_text, " %hostname" , hostname);
594+ }
595+
596+ set_text (&osdPrivText, &osdPrivText.rgnAttr , privacy_text.c_str (),
597+ posPrivacyTextX, posPrivacyTextY, 0 );
598+
599+ privacy_text.clear ();
600+
601+ IMP_OSD_SetRgnAttr (osdPrivText.imp_rgn , &osdPrivText.rgnAttr );
602+
603+ IMPOSDGrpRgnAttr grpRgnAttrText;
604+ memset (&grpRgnAttrText, 0 , sizeof (IMPOSDGrpRgnAttr));
605+ grpRgnAttrText.show = 1 ;
606+ grpRgnAttrText.layer = 2 ;
607+ grpRgnAttrText.gAlphaEn = 1 ;
608+ grpRgnAttrText.fgAlhpa = osd.user_text_transparency ;
609+ IMP_OSD_SetGrpRgnAttr (osdPrivText.imp_rgn , osdGrp, &grpRgnAttrText);
610+ }
611+
612+
548613 if (osd.time_enabled )
549614 {
550615 /* OSD Time */
@@ -573,7 +638,7 @@ void OSD::init()
573638 IMPOSDGrpRgnAttr grpRgnAttr;
574639 memset (&grpRgnAttr, 0 , sizeof (IMPOSDGrpRgnAttr));
575640 grpRgnAttr.show = 1 ;
576- grpRgnAttr.layer = 1 ;
641+ grpRgnAttr.layer = 3 ;
577642 grpRgnAttr.gAlphaEn = 0 ;
578643 grpRgnAttr.fgAlhpa = osd.time_transparency ;
579644 IMP_OSD_SetGrpRgnAttr (osdTime.imp_rgn , osdGrp, &grpRgnAttr);
@@ -611,7 +676,7 @@ void OSD::init()
611676 IMPOSDGrpRgnAttr grpRgnAttr;
612677 memset (&grpRgnAttr, 0 , sizeof (IMPOSDGrpRgnAttr));
613678 grpRgnAttr.show = 1 ;
614- grpRgnAttr.layer = 2 ;
679+ grpRgnAttr.layer = 4 ;
615680 grpRgnAttr.gAlphaEn = 1 ;
616681 grpRgnAttr.fgAlhpa = osd.user_text_transparency ;
617682 IMP_OSD_SetGrpRgnAttr (osdUser.imp_rgn , osdGrp, &grpRgnAttr);
@@ -646,7 +711,7 @@ void OSD::init()
646711 IMPOSDGrpRgnAttr grpRgnAttr;
647712 memset (&grpRgnAttr, 0 , sizeof (IMPOSDGrpRgnAttr));
648713 grpRgnAttr.show = 1 ;
649- grpRgnAttr.layer = 3 ;
714+ grpRgnAttr.layer = 5 ;
650715 grpRgnAttr.gAlphaEn = 1 ;
651716 grpRgnAttr.fgAlhpa = osd.uptime_transparency ;
652717 IMP_OSD_SetGrpRgnAttr (osdUptm.imp_rgn , osdGrp, &grpRgnAttr);
@@ -708,7 +773,7 @@ void OSD::init()
708773 IMPOSDGrpRgnAttr grpRgnAttr;
709774 memset (&grpRgnAttr, 0 , sizeof (IMPOSDGrpRgnAttr));
710775 grpRgnAttr.show = 1 ;
711- grpRgnAttr.layer = 4 ;
776+ grpRgnAttr.layer = 6 ;
712777 grpRgnAttr.gAlphaEn = 1 ;
713778 grpRgnAttr.fgAlhpa = osd.logo_transparency ;
714779 IMP_OSD_SetGrpRgnAttr (osdLogo.imp_rgn , osdGrp, &grpRgnAttr);
@@ -742,6 +807,12 @@ int OSD::exit()
742807 ret = IMP_OSD_Stop (osdGrp);
743808 LOG_DEBUG_OR_ERROR (ret, " IMP_OSD_Stop(" << osdGrp << " )" );
744809
810+ ret = IMP_OSD_ShowRgn (osdPrivBack.imp_rgn , osdGrp, 0 );
811+ LOG_DEBUG_OR_ERROR (ret, " IMP_OSD_ShowRgn(osdPrivBack.imp_rgn, " << osdGrp << " , 0)" );
812+
813+ ret = IMP_OSD_ShowRgn (osdPrivText.imp_rgn , osdGrp, 0 );
814+ LOG_DEBUG_OR_ERROR (ret, " IMP_OSD_ShowRgn(osdPrivText.imp_rgn, " << osdGrp << " , 0)" );
815+
745816 ret = IMP_OSD_ShowRgn (osdTime.imp_rgn , osdGrp, 0 );
746817 LOG_DEBUG_OR_ERROR (ret, " IMP_OSD_ShowRgn(osdTime.imp_rgn, " << osdGrp << " , 0)" );
747818
@@ -766,6 +837,8 @@ int OSD::exit()
766837 ret = IMP_OSD_UnRegisterRgn (osdLogo.imp_rgn , osdGrp);
767838 LOG_DEBUG_OR_ERROR (ret, " IMP_OSD_UnRegisterRgn(osdUptm.imp_rgn, " << osdGrp << " )" );
768839
840+ IMP_OSD_DestroyRgn (osdPrivBack.imp_rgn );
841+ IMP_OSD_DestroyRgn (osdPrivText.imp_rgn );
769842 IMP_OSD_DestroyRgn (osdTime.imp_rgn );
770843 IMP_OSD_DestroyRgn (osdUser.imp_rgn );
771844 IMP_OSD_DestroyRgn (osdUptm.imp_rgn );
@@ -775,6 +848,8 @@ int OSD::exit()
775848 LOG_DEBUG_OR_ERROR (ret, " IMP_OSD_DestroyGroup(" << osdGrp << " )" );
776849
777850 // cleanup osd image data
851+ free (osdPrivBack.data );
852+ free (osdPrivText.data );
778853 free (osdTime.data );
779854 free (osdUser.data );
780855 free (osdUptm.data );
0 commit comments