Skip to content

Commit eea7805

Browse files
committed
requesthandler: Add input deinterlace mode/field order requests
Adds the following requests: - `GetInputDeinterlaceMode` - `SetInputDeinterlaceMode` - `GetInputDeinterlaceFieldOrder` - `SetInputDeinterlaceFieldOrder` Inputs only support deinterlacing if they are async. Closes #1192
1 parent 13ee2bf commit eea7805

File tree

3 files changed

+165
-0
lines changed

3 files changed

+165
-0
lines changed

src/requesthandler/RequestHandler.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ const std::unordered_map<std::string, RequestMethodHandler> RequestHandler::_han
9696
{"SetInputAudioMonitorType", &RequestHandler::SetInputAudioMonitorType},
9797
{"GetInputAudioTracks", &RequestHandler::GetInputAudioTracks},
9898
{"SetInputAudioTracks", &RequestHandler::SetInputAudioTracks},
99+
{"GetInputDeinterlaceMode", &RequestHandler::GetInputDeinterlaceMode},
100+
{"SetInputDeinterlaceMode", &RequestHandler::SetInputDeinterlaceMode},
101+
{"GetInputDeinterlaceFieldOrder", &RequestHandler::GetInputDeinterlaceFieldOrder},
102+
{"SetInputDeinterlaceFieldOrder", &RequestHandler::SetInputDeinterlaceFieldOrder},
99103
{"GetInputPropertiesListPropertyItems", &RequestHandler::GetInputPropertiesListPropertyItems},
100104
{"PressInputPropertiesButton", &RequestHandler::PressInputPropertiesButton},
101105

src/requesthandler/RequestHandler.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ class RequestHandler {
115115
RequestResult SetInputAudioMonitorType(const Request &);
116116
RequestResult GetInputAudioTracks(const Request &);
117117
RequestResult SetInputAudioTracks(const Request &);
118+
RequestResult GetInputDeinterlaceMode(const Request &);
119+
RequestResult SetInputDeinterlaceMode(const Request &);
120+
RequestResult GetInputDeinterlaceFieldOrder(const Request &);
121+
RequestResult SetInputDeinterlaceFieldOrder(const Request &);
118122
RequestResult GetInputPropertiesListPropertyItems(const Request &);
119123
RequestResult PressInputPropertiesButton(const Request &);
120124

src/requesthandler/RequestHandler_Inputs.cpp

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -866,6 +866,163 @@ RequestResult RequestHandler::SetInputAudioTracks(const Request &request)
866866
return RequestResult::Success();
867867
}
868868

869+
/**
870+
* Gets the deinterlace mode of an input.
871+
*
872+
* Deinterlace Modes:
873+
*
874+
* - `OBS_DEINTERLACE_MODE_DISABLE`
875+
* - `OBS_DEINTERLACE_MODE_DISCARD`
876+
* - `OBS_DEINTERLACE_MODE_RETRO`
877+
* - `OBS_DEINTERLACE_MODE_BLEND`
878+
* - `OBS_DEINTERLACE_MODE_BLEND_2X`
879+
* - `OBS_DEINTERLACE_MODE_LINEAR`
880+
* - `OBS_DEINTERLACE_MODE_LINEAR_2X`
881+
* - `OBS_DEINTERLACE_MODE_YADIF`
882+
* - `OBS_DEINTERLACE_MODE_YADIF_2X`
883+
*
884+
* Note: Deinterlacing functionality is restricted to async inputs only.
885+
*
886+
* @requestField ?inputName | String | Name of the input
887+
* @requestField ?inputUuid | String | UUID of the input
888+
*
889+
* @responseField inputDeinterlaceMode | String | Deinterlace mode of the input
890+
*
891+
* @requestType GetInputDeinterlaceMode
892+
* @complexity 2
893+
* @rpcVersion -1
894+
* @initialVersion 5.6.0
895+
* @api requests
896+
* @category inputs
897+
*/
898+
RequestResult RequestHandler::GetInputDeinterlaceMode(const Request &request)
899+
{
900+
RequestStatus::RequestStatus statusCode;
901+
std::string comment;
902+
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
903+
if (!input)
904+
return RequestResult::Error(statusCode, comment);
905+
906+
if (!(obs_source_get_output_flags(input) & OBS_SOURCE_ASYNC))
907+
return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input is not async.");
908+
909+
json responseData;
910+
responseData["inputDeinterlaceMode"] = obs_source_get_deinterlace_mode(input);
911+
912+
return RequestResult::Success(responseData);
913+
}
914+
915+
/**
916+
* Sets the deinterlace mode of an input.
917+
*
918+
* Note: Deinterlacing functionality is restricted to async inputs only.
919+
*
920+
* @requestField ?inputName | String | Name of the input
921+
* @requestField ?inputUuid | String | UUID of the input
922+
* @requestField inputDeinterlaceMode | String | Deinterlace mode for the input
923+
*
924+
* @requestType SetInputDeinterlaceMode
925+
* @complexity 2
926+
* @rpcVersion -1
927+
* @initialVersion 5.6.0
928+
* @api requests
929+
* @category inputs
930+
*/
931+
RequestResult RequestHandler::SetInputDeinterlaceMode(const Request &request)
932+
{
933+
RequestStatus::RequestStatus statusCode;
934+
std::string comment;
935+
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
936+
if (!input || !request.ValidateString("inputDeinterlaceMode", statusCode, comment))
937+
return RequestResult::Error(statusCode, comment);
938+
939+
if (!(obs_source_get_output_flags(input) & OBS_SOURCE_ASYNC))
940+
return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input is not async.");
941+
942+
enum obs_deinterlace_mode deinterlaceMode = request.RequestData["inputDeinterlaceMode"];
943+
if (deinterlaceMode == OBS_DEINTERLACE_MODE_DISABLE && request.RequestData["inputDeinterlaceMode"] != "OBS_DEINTERLACE_MODE_DISABLE")
944+
return RequestResult::Error(RequestStatus::InvalidRequestField, "The field inputDeinterlaceMode has an invalid value.");
945+
946+
obs_source_set_deinterlace_mode(input, deinterlaceMode);
947+
948+
return RequestResult::Success();
949+
}
950+
951+
/**
952+
* Gets the deinterlace field order of an input.
953+
*
954+
* Deinterlace Field Orders:
955+
*
956+
* - `OBS_DEINTERLACE_FIELD_ORDER_TOP`
957+
* - `OBS_DEINTERLACE_FIELD_ORDER_BOTTOM`
958+
*
959+
* Note: Deinterlacing functionality is restricted to async inputs only.
960+
*
961+
* @requestField ?inputName | String | Name of the input
962+
* @requestField ?inputUuid | String | UUID of the input
963+
*
964+
* @responseField inputDeinterlaceFieldOrder | String | Deinterlace field order of the input
965+
*
966+
* @requestType GetInputDeinterlaceFieldOrder
967+
* @complexity 2
968+
* @rpcVersion -1
969+
* @initialVersion 5.6.0
970+
* @api requests
971+
* @category inputs
972+
*/
973+
RequestResult RequestHandler::GetInputDeinterlaceFieldOrder(const Request &request)
974+
{
975+
RequestStatus::RequestStatus statusCode;
976+
std::string comment;
977+
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
978+
if (!input)
979+
return RequestResult::Error(statusCode, comment);
980+
981+
if (!(obs_source_get_output_flags(input) & OBS_SOURCE_ASYNC))
982+
return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input is not async.");
983+
984+
json responseData;
985+
responseData["inputDeinterlaceFieldOrder"] = obs_source_get_deinterlace_field_order(input);
986+
987+
return RequestResult::Success(responseData);
988+
}
989+
990+
/**
991+
* Sets the deinterlace field order of an input.
992+
*
993+
* Note: Deinterlacing functionality is restricted to async inputs only.
994+
*
995+
* @requestField ?inputName | String | Name of the input
996+
* @requestField ?inputUuid | String | UUID of the input
997+
* @requestField inputDeinterlaceFieldOrder | String | Deinterlace field order for the input
998+
*
999+
* @requestType SetInputDeinterlaceFieldOrder
1000+
* @complexity 2
1001+
* @rpcVersion -1
1002+
* @initialVersion 5.6.0
1003+
* @api requests
1004+
* @category inputs
1005+
*/
1006+
RequestResult RequestHandler::SetInputDeinterlaceFieldOrder(const Request &request)
1007+
{
1008+
RequestStatus::RequestStatus statusCode;
1009+
std::string comment;
1010+
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
1011+
if (!input || !request.ValidateString("inputDeinterlaceFieldOrder", statusCode, comment))
1012+
return RequestResult::Error(statusCode, comment);
1013+
1014+
if (!(obs_source_get_output_flags(input) & OBS_SOURCE_ASYNC))
1015+
return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input is not async.");
1016+
1017+
enum obs_deinterlace_field_order deinterlaceFieldOrder = request.RequestData["inputDeinterlaceFieldOrder"];
1018+
if (deinterlaceFieldOrder == OBS_DEINTERLACE_FIELD_ORDER_TOP && request.RequestData["inputDeinterlaceFieldOrder"] != "OBS_DEINTERLACE_FIELD_ORDER_TOP")
1019+
return RequestResult::Error(RequestStatus::InvalidRequestField, "The field inputDeinterlaceFieldOrder has an invalid value.");
1020+
1021+
obs_source_set_deinterlace_field_order(input, deinterlaceFieldOrder);
1022+
1023+
return RequestResult::Success();
1024+
}
1025+
8691026
/**
8701027
* Gets the items of a list property from an input's properties.
8711028
*

0 commit comments

Comments
 (0)