Example #1
0
/**
 * 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)));
}
Example #2
0
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(&param->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(&param->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(&param->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(&param->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(&param->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;
}