/// Utility function to adjust option strings, used by ToNormalised()/ToCustomised(). bool AdjustOptions(void * parm, unsigned * parmLen, bool (PluginCodec_MediaFormat:: * adjuster)(OptionMap & original, OptionMap & changed)) { if (parmLen == NULL || parm == NULL || *parmLen != sizeof(char ***)) { PTRACE(1, "Plugin", "Invalid parameters to AdjustOptions."); return false; } OptionMap originalOptions; for (const char * const * option = *(const char * const * *)parm; *option != NULL; option += 2) originalOptions[option[0]] = option[1]; OptionMap changedOptions; if (!(this->*adjuster)(originalOptions, changedOptions)) { PTRACE(1, "Plugin", "Could not normalise/customise options."); return false; } char ** options = (char **)calloc(changedOptions.size()*2+1, sizeof(char *)); *(char ***)parm = options; if (options == NULL) { PTRACE(1, "Plugin", "Could not allocate new option lists."); return false; } for (OptionMap::iterator i = changedOptions.begin(); i != changedOptions.end(); ++i) { *options++ = strdup(i->first.c_str()); *options++ = strdup(i->second.c_str()); } return true; }