int32_t mm_jpeg_queue_init(mm_jpeg_queue_t* queue)
{
    pthread_mutex_init(&queue->lock, NULL);
    cam_list_init(&queue->head.list);
    queue->size = 0;
    return 0;
}
/*===========================================================================
 * FUNCTION   : QCameraQueue
 *
 * DESCRIPTION: constructor of QCameraQueue
 *
 * PARAMETERS :
 *   @data_rel_fn : function ptr to release node data internal resource
 *   @user_data   : user data ptr
 *
 * RETURN     : None
 *==========================================================================*/
QCameraQueue::QCameraQueue(release_data_fn data_rel_fn, void *user_data)
{
    pthread_mutex_init(&m_lock, NULL);
    cam_list_init(&m_head.list);
    m_size = 0;
    m_dataFn = data_rel_fn;
    m_userData = user_data;
}
/*===========================================================================
 * FUNCTION   : QCameraQueue
 *
 * DESCRIPTION: default constructor of QCameraQueue
 *
 * PARAMETERS : None
 *
 * RETURN     : None
 *==========================================================================*/
QCameraQueue::QCameraQueue()
{
    pthread_mutex_init(&m_lock, NULL);
    cam_list_init(&m_head.list);
    m_size = 0;
    m_dataFn = NULL;
    m_userData = NULL;
}
示例#4
0
/*===========================================================================
 * FUNCTION    - init_c2d_buffer -
 *
 * DESCRIPTION:  allocate and register C2D buffer with kernel.
 *==========================================================================*/
static int init_c2d_buffer(config_ctrl_t *ctrl, struct msm_pmem_info *info,
  stereo_frame_t* pStereoFrame, int bufPath)
{
  static int prevBufPath = -1;
  uint32_t frame_w = 0, frame_h = 0;
  uint32_t stride = 0;
  uint8_t pad_2K_bool = (ctrl->vfeCtrl.vfeMode == VFE_MODE_SNAPSHOT) ?
    FALSE : TRUE;

  if (prevBufPath == bufPath) {
    CDBG("%s: No need to create new C2D buffer\n", __func__);
    return TRUE;
  } else if (prevBufPath != -1) {
    CDBG("%s: Create new C2D buffer for bufPath = %d\n", __func__, bufPath);
    if (!release_c2d_buffer(ctrl, info))
      CDBG_HIGH("%s: release_c2d_buffer failed\n", __func__);
  }

  if (pStereoFrame->non_zoom_upscale) {
    frame_w = pStereoFrame->right_pack_dim.orig_w;
    frame_h = pStereoFrame->right_pack_dim.orig_h;
  } else {
    frame_w = pStereoFrame->right_pack_dim.modified_w;
    frame_h = pStereoFrame->right_pack_dim.modified_h;
  }

  info->vaddr = (void *)do_mmap(PAD_2_2K(frame_w * frame_h, pad_2K_bool) * 3/2,
    &(info->fd));

  if (!info->vaddr) {
    CDBG_ERROR("%s: mmap failed\n", __func__);
    return FALSE;
  }

  info->type = MSM_PMEM_C2D;
  info->y_off = 0;
  info->offset = 0;
  info->active = 0;
  info->cbcr_off = PAD_2_2K(frame_w * frame_h, pad_2K_bool);
  info->len = PAD_2_2K(frame_w * frame_h, pad_2K_bool);

  if (ioctl(ctrl->camfd, MSM_CAM_IOCTL_REGISTER_PMEM, info) < 0) {
    CDBG_ERROR("%s: ioctl MSM_CAM_IOCTL_REGISTER_PMEM is failed..\n", __func__);
    return FALSE;
  }

  if (!init_kgsl()) {
    CDBG_ERROR("%s: init_kgsl failed\n", __func__);
    return FALSE;
  }

  stride = frame_w;

  c2d_obj.dst_addr.vAddr0 = (uint32_t)info->vaddr;
  c2d_obj.dst_addr.gAddr0 = get_gpu_addr(info->fd,
    PAD_2_2K(frame_w * frame_h, pad_2K_bool) * 3/2, info->offset,
    (uint32_t)info->vaddr);

  c2d_obj.dst_addr.vAddr1 = c2d_obj.dst_addr.vAddr0 +
    PAD_2_2K(frame_w * frame_h, pad_2K_bool);
  c2d_obj.dst_addr.gAddr1 = c2d_obj.dst_addr.gAddr0 +
    PAD_2_2K(frame_w * frame_h, pad_2K_bool);

  cam_list_init(&(g_list.list));
  add_gpu_addr_item(info->fd, c2d_obj.dst_addr.vAddr0, c2d_obj.dst_addr.gAddr0,
    c2d_obj.dst_addr.gAddr0);

  create_default_C2D_surface(&(c2d_obj.srcSurfaceDef), &(c2d_obj.src_id),
    C2D_SOURCE);

  create_default_C2D_surface(&(c2d_obj.dstSurfaceDef), &(c2d_obj.dst_id),
    C2D_TARGET);

  /* C2D destination surface values will not change. */
  update_C2D_surface(&(c2d_obj.dstSurfaceDef), frame_w, frame_h, c2d_obj.dst_id,
    &(c2d_obj.dst_addr), stride, C2D_TARGET, c2d_format);

  prevBufPath = bufPath;

  return TRUE;
} /* init_c2d_buffer */