/** * Convert arg string to microseconds for shutter speed * @param str Incoming string (int or fraction) to match * @return microseconds value for shutter speed */ int shutter_speed_from_string(const char *str) { MMAL_STATUS_T ret; MMAL_RATIONAL_T ss; if (strchr(str,'/') == NULL) // arg is microseconds (no /) return atoi(str); ret = mmal_parse_rational(&ss, str); if (ret != MMAL_SUCCESS) return -1; return mmal_rational_to_fixed_16_16(mmal_rational_multiply(ss,mmal_rational_from_fixed_16_16(1000000))); }
OMX_ERRORTYPE mmalomx_parameter_get(MMALOMX_COMPONENT_T *component, OMX_INDEXTYPE nParamIndex, OMX_PTR pParam) { MMALOMX_PORT_T *port = NULL; switch(nParamIndex) { /* All OMX_IndexParamVideo parameters are only partially implemented * and we try and use sensible hard-coded values for the rest. */ case OMX_IndexParamVideoAvc: { OMX_VIDEO_PARAM_AVCTYPE *param = (OMX_VIDEO_PARAM_AVCTYPE *)pParam; uint32_t profile, level, intraperiod; PARAM_GET_PORT(port, component, param->nPortIndex); if (param->nSize < sizeof(*param)) return OMX_ErrorBadParameter; memset(¶m->nSliceHeaderSpacing, 0, param->nSize - offsetof(OMX_VIDEO_PARAM_AVCTYPE, nSliceHeaderSpacing)); mmalomx_get_video_param(port, &profile, &level, &intraperiod); param->eProfile = (OMX_VIDEO_AVCPROFILETYPE)profile; param->eLevel = (OMX_VIDEO_AVCLEVELTYPE)level; param->nPFrames = intraperiod - 1; param->bUseHadamard = OMX_TRUE; param->nRefFrames = 1; param->nAllowedPictureTypes = OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; param->bFrameMBsOnly = OMX_TRUE; if (param->eProfile != OMX_VIDEO_AVCProfileBaseline) param->bEntropyCodingCABAC = OMX_TRUE; param->eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable; } return OMX_ErrorNone; case OMX_IndexParamVideoMpeg4: { OMX_VIDEO_PARAM_MPEG4TYPE *param = (OMX_VIDEO_PARAM_MPEG4TYPE *)pParam; uint32_t profile, level, intraperiod; PARAM_GET_PORT(port, component, param->nPortIndex); if (param->nSize < sizeof(*param)) return OMX_ErrorBadParameter; memset(¶m->nSliceHeaderSpacing, 0, param->nSize - offsetof(OMX_VIDEO_PARAM_MPEG4TYPE, nSliceHeaderSpacing)); mmalomx_get_video_param(port, &profile, &level, &intraperiod); param->eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)profile; param->eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)level; param->nPFrames = intraperiod - 1; param->bACPred = OMX_TRUE; param->nAllowedPictureTypes = OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; } return OMX_ErrorNone; case OMX_IndexParamVideoH263: { OMX_VIDEO_PARAM_H263TYPE *param = (OMX_VIDEO_PARAM_H263TYPE *)pParam; uint32_t profile, level, intraperiod; PARAM_GET_PORT(port, component, param->nPortIndex); if (param->nSize < sizeof(*param)) return OMX_ErrorBadParameter; memset(¶m->nPFrames, 0, param->nSize - offsetof(OMX_VIDEO_PARAM_H263TYPE, nPFrames)); mmalomx_get_video_param(port, &profile, &level, &intraperiod); param->eProfile = (OMX_VIDEO_H263PROFILETYPE)profile; param->eLevel = (OMX_VIDEO_H263LEVELTYPE)level; param->nPFrames = intraperiod - 1; param->nAllowedPictureTypes = OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; } return OMX_ErrorNone; case OMX_IndexParamVideoMpeg2: case OMX_IndexParamVideoWmv: case OMX_IndexParamVideoRv: { OMX_FORMAT_PARAM_TYPE *param = (OMX_FORMAT_PARAM_TYPE *)pParam; PARAM_GET_PORT(port, component, param->common.nPortIndex); OMX_U32 offset = offsetof(OMX_PARAM_U32TYPE, nU32); if (param->common.nSize > sizeof(port->format_param) || param->common.nSize < offset) return OMX_ErrorBadParameter; memcpy(¶m->common.nU32, &port->format_param.common.nU32, param->common.nSize - offset); return OMX_ErrorNone; } case OMX_IndexParamAudioPcm: case OMX_IndexParamAudioAac: case OMX_IndexParamAudioMp3: case OMX_IndexParamAudioDdp: { OMX_FORMAT_PARAM_TYPE *param = (OMX_FORMAT_PARAM_TYPE *)pParam; PARAM_GET_PORT(port, component, param->common.nPortIndex); OMX_U32 offset = offsetof(OMX_PARAM_U32TYPE, nU32); if (param->common.nSize > sizeof(port->format_param) || param->common.nSize < offset) return OMX_ErrorBadParameter; memcpy(¶m->common.nU32, &port->format_param.common.nU32, param->common.nSize - offset); mmalil_format_to_omx_audio_param(param, NULL, port->mmal->format); return OMX_ErrorNone; } case OMX_IndexParamBrcmPixelAspectRatio: { OMX_CONFIG_POINTTYPE *param = (OMX_CONFIG_POINTTYPE *)pParam; PARAM_GET_PORT(port, component, param->nPortIndex); param->nX = port->mmal->format->es->video.par.num; param->nY = port->mmal->format->es->video.par.den; return OMX_ErrorNone; } case OMX_IndexParamColorSpace: { OMX_PARAM_COLORSPACETYPE *param = (OMX_PARAM_COLORSPACETYPE *)pParam; PARAM_GET_PORT(port, component, param->nPortIndex); param->eColorSpace = mmalil_color_space_to_omx(port->mmal->format->es->video.color_space); return OMX_ErrorNone; } case OMX_IndexConfigCommonOutputCrop: { OMX_CONFIG_RECTTYPE *param = (OMX_CONFIG_RECTTYPE *)pParam; PARAM_GET_PORT(port, component, param->nPortIndex); param->nLeft = port->mmal->format->es->video.crop.x; param->nTop = port->mmal->format->es->video.crop.y; param->nWidth = port->mmal->format->es->video.width; if (port->mmal->format->es->video.crop.width) param->nWidth = port->mmal->format->es->video.crop.width; param->nHeight = port->mmal->format->es->video.height; if (port->mmal->format->es->video.crop.height) param->nHeight = port->mmal->format->es->video.crop.height; return OMX_ErrorNone; } case OMX_IndexConfigCommonScale: { OMX_CONFIG_SCALEFACTORTYPE *param = (OMX_CONFIG_SCALEFACTORTYPE *)pParam; PARAM_GET_PORT(port, component, param->nPortIndex); param->xWidth = param->xHeight = 1<<16; if (port->mmal->format->es->video.par.num && port->mmal->format->es->video.par.den) param->xWidth = mmal_rational_to_fixed_16_16(port->mmal->format->es->video.par); return OMX_ErrorNone; } default: return mmalomx_parameter_get_xlat(component, nParamIndex, pParam); } return OMX_ErrorNotImplemented; }