Skip to content
This repository was archived by the owner on Apr 16, 2026. It is now read-only.

Commit cf2ea26

Browse files
Adds a helper function to clear the OSD items.
This fixes a bug already present in master that causes errors when restarting the OSD because there may be OSD items that were not built if they are disabled and try to clean them.
1 parent 5649e60 commit cf2ea26

2 files changed

Lines changed: 23 additions & 67 deletions

File tree

src/OSD.cpp

Lines changed: 22 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -814,88 +814,43 @@ int OSD::start()
814814
return ret;
815815
}
816816

817-
int OSD::exit()
817+
void OSD::cleanup_item(OSDItem *osdItem)
818818
{
819819
int ret;
820820

821-
ret = IMP_OSD_Stop(osdGrp);
822-
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_Stop(" << osdGrp << ")");
823-
824-
if (osdPrivBack.imp_rgn)
825-
{
826-
ret = IMP_OSD_ShowRgn(osdPrivBack.imp_rgn, osdGrp, 0);
827-
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_ShowRgn(osdPrivBack.imp_rgn, " << osdGrp << ", 0)");
828-
}
829-
830-
if (osdPrivText.imp_rgn)
831-
{
832-
ret = IMP_OSD_ShowRgn(osdPrivText.imp_rgn, osdGrp, 0);
833-
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_ShowRgn(osdPrivText.imp_rgn, " << osdGrp << ", 0)");
834-
}
835-
836-
ret = IMP_OSD_ShowRgn(osdTime.imp_rgn, osdGrp, 0);
837-
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_ShowRgn(osdTime.imp_rgn, " << osdGrp << ", 0)");
838-
839-
ret = IMP_OSD_ShowRgn(osdUser.imp_rgn, osdGrp, 0);
840-
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_ShowRgn(osdUser.imp_rgn, " << osdGrp << ", 0)");
841-
842-
ret = IMP_OSD_ShowRgn(osdUptm.imp_rgn, osdGrp, 0);
843-
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_ShowRgn(osdUptm.imp_rgn, " << osdGrp << ", 0)");
844-
845-
ret = IMP_OSD_ShowRgn(osdLogo.imp_rgn, osdGrp, 0);
846-
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_ShowRgn(osdLogo.imp_rgn, " << osdGrp << ", 0)");
847-
848-
if (osdPrivBack.imp_rgn)
849-
{
850-
ret = IMP_OSD_UnRegisterRgn(osdPrivBack.imp_rgn, osdGrp);
851-
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_UnRegisterRgn(osdPrivBack.imp_rgn, " << osdGrp << ")");
852-
}
853-
854-
if (osdPrivText.imp_rgn)
855-
{
856-
ret = IMP_OSD_UnRegisterRgn(osdPrivText.imp_rgn, osdGrp);
857-
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_UnRegisterRgn(osdPrivText.imp_rgn, " << osdGrp << ")");
858-
}
821+
if (osdItem->imp_rgn == 0)
822+
return;
859823

860-
ret = IMP_OSD_UnRegisterRgn(osdTime.imp_rgn, osdGrp);
861-
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_UnRegisterRgn(osdTime.imp_rgn, " << osdGrp << ")");
824+
ret = IMP_OSD_ShowRgn(osdItem->imp_rgn, osdGrp, 0);
825+
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_ShowRgn(" << osdItem->imp_rgn << ", " << osdGrp << ", 0)");
862826

863-
ret = IMP_OSD_UnRegisterRgn(osdUser.imp_rgn, osdGrp);
864-
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_UnRegisterRgn(osdUser.imp_rgn, " << osdGrp << ")");
827+
ret = IMP_OSD_UnRegisterRgn(osdItem->imp_rgn, osdGrp);
828+
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_UnRegisterRgn(" << osdItem->imp_rgn << ", " << osdGrp << ")");
865829

866-
ret = IMP_OSD_UnRegisterRgn(osdUptm.imp_rgn, osdGrp);
867-
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_UnRegisterRgn(osdUptm.imp_rgn, " << osdGrp << ")");
830+
IMP_OSD_DestroyRgn(osdItem->imp_rgn);
868831

869-
ret = IMP_OSD_UnRegisterRgn(osdLogo.imp_rgn, osdGrp);
870-
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_UnRegisterRgn(osdUptm.imp_rgn, " << osdGrp << ")");
832+
free(osdItem->data);
833+
}
871834

872-
if (osdPrivBack.imp_rgn)
873-
{
874-
IMP_OSD_DestroyRgn(osdPrivBack.imp_rgn);
875-
}
835+
int OSD::exit()
836+
{
837+
int ret;
876838

877-
if (osdPrivText.imp_rgn)
878-
{
879-
IMP_OSD_DestroyRgn(osdPrivText.imp_rgn);
880-
}
839+
ret = IMP_OSD_Stop(osdGrp);
840+
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_Stop(" << osdGrp << ")");
881841

882-
IMP_OSD_DestroyRgn(osdTime.imp_rgn);
883-
IMP_OSD_DestroyRgn(osdUser.imp_rgn);
884-
IMP_OSD_DestroyRgn(osdUptm.imp_rgn);
885-
IMP_OSD_DestroyRgn(osdLogo.imp_rgn);
842+
cleanup_item(&osdPrivBack);
843+
cleanup_item(&osdPrivText);
844+
cleanup_item(&osdTime);
845+
cleanup_item(&osdUser);
846+
cleanup_item(&osdUptm);
847+
cleanup_item(&osdLogo);
886848

887849
ret = IMP_OSD_DestroyGroup(osdGrp);
888850
LOG_DEBUG_OR_ERROR(ret, "IMP_OSD_DestroyGroup(" << osdGrp << ")");
889851

890-
// cleanup osd image data
891-
free(osdPrivBack.data);
892-
free(osdPrivText.data);
893-
free(osdTime.data);
894-
free(osdUser.data);
895-
free(osdUptm.data);
896-
free(osdLogo.data);
897-
898852
sft_freefont(sft->font);
853+
899854
return 0;
900855
}
901856

src/OSD.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ class OSD
8585

8686
void set_text(OSDItem *osdItem, IMPOSDRgnAttr *rgnAttr, const char *text, int posX, int posY, int angle);
8787
std::string getConfigPath(const char *itemName);
88+
void cleanup_item(OSDItem *osdItem);
8889

8990
IMPEncoderCHNAttr channelAttributes;
9091

0 commit comments

Comments
 (0)