25 #include "Capabilities.h"
31 #define MAX_RESOLUTION_LENGTH 30
41 }
catch(
const std::exception& e)
43 RDK_LOG(RDK_LOG_WARN,LOG_TR69HOSTIF,
"[%s] Caught exception \" %s\"\n", __FUNCTION__, e.what());
58 hostIf_STBServiceCapabilities::hostIf_STBServiceCapabilities()
64 int ret = NOT_HANDLED;
65 stMsgData->
faultCode = fcAttemptToSetaNonWritableParameter;
71 int ret = NOT_HANDLED;
72 const char *path = NULL, *paramName = NULL, *attr = NULL;
75 int str_len = strlen(CAPABILITIES_OBJ);
78 RDK_LOG(RDK_LOG_TRACE1,LOG_TR69HOSTIF,
"[%s:%s]Entering... \n", __FILE__, __FUNCTION__);
81 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"[%s:%s:%d]Failed : Parameter is NULL, %s \n", __FILE__, __FUNCTION__, __LINE__, path);
82 stMsgData->
faultCode = fcInvalidParameterName;
86 if((strncasecmp(path, CAPABILITIES_OBJ, str_len) != 0)) {
87 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"[%s:%s:%d]Failed : Mismatch parameter path : %s \n", __FILE__, __FUNCTION__, __LINE__, path);
88 stMsgData->
faultCode = fcInvalidParameterName;
93 const char *tmp_ptr = strchr(path+str_len-1,
'.');
95 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"[%s:%s] Parameter is NULL \n", __FILE__, __FUNCTION__);
96 stMsgData->
faultCode = fcInvalidParameterName;
102 if (strcasecmp(paramName, VIDEO_STANDARDS_STRING) == 0)
104 ret = getVideoStandards(stMsgData);
106 else if(strcasecmp(paramName, PROFILE_NUM_ENTRIES_STRING) == 0)
108 ret = getNumHEVCProfileEntries(stMsgData);
110 else if(matchComponent(stMsgData->
paramName, HEVC_PROFILE_OBJ, &attr, index))
113 ret = getHEVCProfileDetails(stMsgData, attr, index);
115 else if(strcasecmp(stMsgData->
paramName, HDMI_RESOLUTIONS_STRING) == 0)
117 ret = getSupportedResolutions(stMsgData);
121 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"[%s:%s] Parameter \'%s\' is Not Supported \n", __FILE__, __FUNCTION__, paramName);
122 stMsgData->
faultCode = fcInvalidParameterName;
126 catch (
const std::exception& e )
128 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"[%s:%s] Exception caught %s \n", __FILE__, __FUNCTION__, e.what());
132 RDK_LOG(RDK_LOG_TRACE1,LOG_TR69HOSTIF,
"[%s:%s]Exiting... \n", __FILE__, __FUNCTION__);
136 int hostIf_STBServiceCapabilities::getVideoStandards(
HOSTIF_MsgData_t *stMsgData)
138 int bytes_written = 0;
141 unsigned int supported_standards = decoder.getSupportedVideoCodingFormats();
142 if(0 != (supported_standards & dsVIDEO_CODEC_MPEGHPART2))
144 bytes_written += snprintf(&(stMsgData->
paramValue[bytes_written]), (TR69HOSTIFMGR_MAX_PARAM_LEN - bytes_written),
"%s,",
"MPEGH-Part2 ([ISO/IEC23008-1]])");
146 if(0 != (supported_standards & dsVIDEO_CODEC_MPEG2))
148 bytes_written += snprintf(&(stMsgData->
paramValue[bytes_written]), (TR69HOSTIFMGR_MAX_PARAM_LEN - bytes_written),
"%s,",
"MPEG2-Part2 ([ISO/IEC13818-1])");
150 if(0 != (supported_standards & dsVIDEO_CODEC_MPEG4PART10))
152 bytes_written += snprintf(&(stMsgData->
paramValue[bytes_written]), (TR69HOSTIFMGR_MAX_PARAM_LEN - bytes_written),
"%s,",
"MPEG4-Part10 ([ISO/IEC14496-10])");
154 stMsgData->
paramValue[bytes_written -1] =
'\0';
155 RDK_LOG(RDK_LOG_DEBUG,LOG_TR69HOSTIF,
"[%s] : Value: %s \n",__FUNCTION__, stMsgData->
paramValue);
156 stMsgData->
paramtype = hostIf_StringType;
159 catch (
const std::exception e) {
160 RDK_LOG(RDK_LOG_WARN,LOG_TR69HOSTIF,
"[%s] Exception\n",__FUNCTION__);
168 int hostIf_STBServiceCapabilities::getNumHEVCProfileEntries(
HOSTIF_MsgData_t *stMsgData)
174 if(0 == info.num_entries)
176 RDK_LOG(RDK_LOG_ERROR, LOG_TR69HOSTIF,
"[%s] Zero profile entries reported.\n",__FUNCTION__);
181 RDK_LOG(RDK_LOG_DEBUG,LOG_TR69HOSTIF,
"[%s] : Value: %s \n",__FUNCTION__, stMsgData->
paramValue);
182 stMsgData->
paramtype = hostIf_UnsignedIntType;
183 stMsgData->
paramLen =
sizeof(
unsigned int);
185 catch (
const std::exception e) {
186 RDK_LOG(RDK_LOG_WARN,LOG_TR69HOSTIF,
"[%s] Exception\n",__FUNCTION__);
194 static const char * convertHEVCProfileNameToString(dsVideoCodecHevcProfiles_t profile)
198 case dsVIDEO_CODEC_HEVC_PROFILE_MAIN:
200 case dsVIDEO_CODEC_HEVC_PROFILE_MAIN10:
202 case dsVIDEO_CODEC_HEVC_PROFILE_MAINSTILLPICTURE:
203 return "MAIN STILL PICTURE";
205 RDK_LOG(RDK_LOG_ERROR, LOG_TR69HOSTIF,
"[%s] Unknown profile 0x%x!\n",__FUNCTION__, (
unsigned int)profile);
212 unsigned int kbit_rate = 0;
213 if((dsVIDEO_CODEC_HEVC_PROFILE_MAIN10 == entry.profile) && (5.1f == entry.level))
219 RDK_LOG(RDK_LOG_ERROR, LOG_TR69HOSTIF,
"[%s] Unknown profile (0x%x) and level (%g) combination!\n",__FUNCTION__, entry.profile, entry.level);
224 static const char* getTR181ResolutionString(std::string &resolution)
226 if(
"720p" == resolution)
227 return "1280x720p/59.94Hz";
228 else if(
"1080i" == resolution)
229 return "1920x1080i/59.94Hz";
230 else if((
"1080p60" == resolution) || (
"1080p" == resolution))
231 return "1920x1080p/59.94Hz";
232 else if(
"2160p30" == resolution)
233 return "3840x2160p/30Hz";
234 else if(
"2160p60" == resolution)
235 return "3840x2160p/59.94Hz";
236 else if(
"480i" == resolution)
237 return "720x480i/59.94Hz";
238 else if(
"480p" == resolution)
239 return "720x480p/59.94Hz";
240 else if((
"576p50" == resolution) || (
"576p" == resolution))
241 return "720x576p/50Hz";
242 else if(
"720p50" == resolution)
243 return "1280x720p/50Hz";
244 else if(
"1080p30" == resolution)
245 return "1920x1080p/30Hz";
246 else if((
"1080i50" == resolution) || (
"1080i25" == resolution))
247 return "1920x1080i/50Hz";
248 else if(
"1080p24" == resolution)
249 return "1920x1080p/24Hz";
250 else if(
"1080p50" == resolution)
251 return "1920x1080p/50Hz";
252 else if(
"2160p50" == resolution)
253 return "3840x2160p/50Hz";
254 else if (
"1080p25" == resolution)
255 return "1920x1080p/25Hz";
258 RDK_LOG(RDK_LOG_ERROR, LOG_TR69HOSTIF,
"%s: Unhandled resolution: %s. Cannot translate!\n", __FUNCTION__, resolution.c_str());
263 int hostIf_STBServiceCapabilities::getHEVCProfileDetails(
HOSTIF_MsgData_t * stMsgData,
const char* attr,
unsigned int index)
266 int bytes_written = 0;
271 if((0 == info.num_entries) || (index > info.num_entries))
273 RDK_LOG(RDK_LOG_ERROR, LOG_TR69HOSTIF,
"[%s] Could not find profiles matching index %d.\n",__FUNCTION__, index);
274 stMsgData->
faultCode = ((0 == info.num_entries) ? fcInternalError : fcInvalidParameterName );
278 if(strcasecmp(attr, PROFILE_NAME_STRING) == 0)
280 bytes_written = snprintf(stMsgData->
paramValue, TR69HOSTIFMGR_MAX_PARAM_LEN,
"%s", convertHEVCProfileNameToString(info.entries[index - 1].profile));
282 stMsgData->
paramtype = hostIf_StringType;
283 stMsgData->
paramLen = bytes_written;
285 else if(strcasecmp(attr, PROFILE_LEVEL_STRING) == 0)
287 bytes_written = snprintf(stMsgData->
paramValue, TR69HOSTIFMGR_MAX_PARAM_LEN,
"L%g", info.entries[index - 1].level);
289 stMsgData->
paramtype = hostIf_StringType;
290 stMsgData->
paramLen = bytes_written;
292 else if(strcasecmp(attr, PROFILE_MAX_DECODE_CAPABILITY_STRING) == 0)
295 stMsgData->
paramtype = hostIf_UnsignedIntType;
296 stMsgData->
paramLen =
sizeof(
unsigned int);
300 RDK_LOG(RDK_LOG_ERROR,LOG_TR69HOSTIF,
"[%s:%s] Parameter \'%s\' is Not Supported \n", __FILE__, __FUNCTION__, attr);
301 stMsgData->
faultCode = fcInvalidParameterName;
307 RDK_LOG(RDK_LOG_WARN,LOG_TR69HOSTIF,
"[%s] Exception\n",__FUNCTION__);
316 int hostIf_STBServiceCapabilities::getSupportedResolutions(
HOSTIF_MsgData_t *stMsgData)
318 size_t iElementInList = 0;
319 size_t iResolutionsListSize = 0;
320 char aiResolution[MAX_RESOLUTION_LENGTH] = {
'\0'};
323 std::list <std::string> supported_resolutions;
325 decoder.getSettopSupportedResolutions(supported_resolutions);
326 iResolutionsListSize = supported_resolutions.size();
328 RDK_LOG(RDK_LOG_DEBUG,LOG_TR69HOSTIF,
"[%s] : List Size: %d \n",__FUNCTION__, iResolutionsListSize);
329 memset(stMsgData->
paramValue, 0, TR69HOSTIFMGR_MAX_PARAM_LEN);
331 std::list<std::string>::iterator entry;
332 for(entry = supported_resolutions.begin(); entry != supported_resolutions.end(); entry++)
335 snprintf(aiResolution, MAX_RESOLUTION_LENGTH,
"%s", getTR181ResolutionString(*entry));
336 strncat(stMsgData->
paramValue, aiResolution, TR69HOSTIFMGR_MAX_PARAM_LEN-strlen(stMsgData->
paramValue)-1);
337 if(iElementInList < iResolutionsListSize)
338 strncat(stMsgData->
paramValue,
",", TR69HOSTIFMGR_MAX_PARAM_LEN-strlen(stMsgData->
paramValue)-1);
339 RDK_LOG(RDK_LOG_DEBUG,LOG_TR69HOSTIF,
"[%s] : resolution: %s\n",__FUNCTION__, (*entry).c_str());
341 stMsgData->
paramtype = hostIf_StringType;
343 RDK_LOG(RDK_LOG_DEBUG,LOG_TR69HOSTIF,
"[%s] : Value: %s \n",__FUNCTION__, stMsgData->
paramValue);
346 RDK_LOG(RDK_LOG_WARN,LOG_TR69HOSTIF,
"[%s] Exception\n",__FUNCTION__);