void mm_app_release_ppinput(void *data, void *user_data) { int i = 0; mm_camera_super_buf_t *recvd_frame = ( mm_camera_super_buf_t * ) data; mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data; for ( i = 0 ; i < recvd_frame->num_bufs ; i++) { if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->cam->camera_handle, recvd_frame->ch_id, recvd_frame->bufs[i])) { CDBG_ERROR("%s: Failed in Qbuf\n", __func__); } mm_app_cache_ops((mm_camera_app_meminfo_t *) recvd_frame->bufs[i]->mem_info, ION_IOC_INV_CACHES); } }
/* This callback is received once the complete JPEG encoding is done */ static void jpeg_encode_cb(jpeg_job_status_t status, uint32_t client_hdl, uint32_t jobId, mm_jpeg_output_t *p_buf, void *userData) { uint32_t i = 0; mm_camera_test_obj_t *pme = NULL; LOGD(" BEGIN\n"); pme = (mm_camera_test_obj_t *)userData; if (pme->jpeg_hdl != client_hdl || jobId != pme->current_job_id || !pme->current_job_frames) { LOGE(" NULL current job frames or not matching job ID (%d, %d)", jobId, pme->current_job_id); return; } /* dump jpeg img */ LOGE(" job %d, status=%d", jobId, status); if (status == JPEG_JOB_STATUS_DONE && p_buf != NULL) { mm_app_dump_jpeg_frame(p_buf->buf_vaddr, p_buf->buf_filled_len, "jpeg", "jpg", jobId); } /* buf done current encoding frames */ pme->current_job_id = 0; for (i = 0; i < pme->current_job_frames->num_bufs; i++) { if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->current_job_frames->camera_handle, pme->current_job_frames->ch_id, pme->current_job_frames->bufs[i])) { LOGE(" Failed in Qbuf\n"); } mm_app_cache_ops((mm_camera_app_meminfo_t *) pme->current_job_frames->bufs[i]->mem_info, ION_IOC_INV_CACHES); } mm_app_deallocate_ion_memory(&pme->jpeg_buf); free(pme->current_job_frames); pme->current_job_frames = NULL; /* signal snapshot is done */ mm_camera_app_done(); }
static void mm_app_rdi_notify_cb(mm_camera_super_buf_t *bufs, void *user_data) { char file_name[64]; mm_camera_buf_def_t *frame = bufs->bufs[0]; mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data; CDBG("%s: BEGIN - length=%d, frame idx = %d stream_id=%d\n", __func__, frame->frame_len, frame->frame_idx, frame->stream_id); snprintf(file_name, sizeof(file_name), "RDI_dump_%d", pme->cam->camera_handle); mm_app_rdi_dump_frame(frame, file_name, "raw", frame->frame_idx); if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, bufs->ch_id, frame)) { CDBG_ERROR("%s: Failed in RDI Qbuf\n", __func__); } mm_app_cache_ops((mm_camera_app_meminfo_t *)frame->mem_info, ION_IOC_INV_CACHES); CDBG("%s: END\n", __func__); }
static void mm_app_metadata_notify_cb(mm_camera_super_buf_t *bufs, void *user_data) { int i = 0; mm_camera_channel_t *channel = NULL; mm_camera_stream_t *p_stream = NULL; mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data; mm_camera_buf_def_t *frame = bufs->bufs[0]; metadata_buffer_t *pMetadata; cam_auto_focus_data_t *focus_data; if (NULL == bufs || NULL == user_data) { CDBG_ERROR("%s: bufs or user_data are not valid ", __func__); return; } /* find channel */ for (i = 0; i < MM_CHANNEL_TYPE_MAX; i++) { if (pme->channels[i].ch_id == bufs->ch_id) { channel = &pme->channels[i]; break; } } /* find preview stream */ for (i = 0; i < channel->num_streams; i++) { if (channel->streams[i].s_config.stream_info->stream_type == CAM_STREAM_TYPE_METADATA) { p_stream = &channel->streams[i]; break; } } /* find preview frame */ for (i = 0; i < bufs->num_bufs; i++) { if (bufs->bufs[i]->stream_id == p_stream->s_id) { frame = bufs->bufs[i]; break; } } if (NULL == p_stream) { CDBG_ERROR("%s: cannot find metadata stream", __func__); return; } if (pme->metadata == NULL) { /* The app will free the meta data, we don't need to bother here */ pme->metadata = malloc(sizeof(metadata_buffer_t)); if (NULL == pme->metadata) { CDBG_ERROR("%s: Canot allocate metadata memory\n", __func__); return; } } memcpy(pme->metadata, frame->buffer, sizeof(metadata_buffer_t)); pMetadata = (metadata_buffer_t *)frame->buffer; if (IS_META_AVAILABLE(CAM_INTF_META_AUTOFOCUS_DATA, pMetadata)) { focus_data = (cam_auto_focus_data_t *) POINTER_OF_META(CAM_INTF_META_AUTOFOCUS_DATA, pMetadata); if (focus_data->focus_state == CAM_AF_FOCUSED || focus_data->focus_state == CAM_AF_NOT_FOCUSED) { CDBG_ERROR("%s: AutoFocus Done Call Back Received\n",__func__); mm_camera_app_done(); } else if (focus_data->focus_state == CAM_AF_NOT_FOCUSED) { CDBG_ERROR("%s: AutoFocus failed\n",__func__); mm_camera_app_done(); } } if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, bufs->ch_id, frame)) { CDBG_ERROR("%s: Failed in Preview Qbuf\n", __func__); } mm_app_cache_ops((mm_camera_app_meminfo_t *)frame->mem_info, ION_IOC_INV_CACHES); }
static void mm_app_zsl_notify_cb(mm_camera_super_buf_t *bufs, void *user_data) { int rc = 0; int i = 0; mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data; mm_camera_channel_t *channel = NULL; mm_camera_stream_t *p_stream = NULL; mm_camera_stream_t *m_stream = NULL; mm_camera_stream_t *md_stream = NULL; mm_camera_buf_def_t *p_frame = NULL; mm_camera_buf_def_t *m_frame = NULL; mm_camera_buf_def_t *md_frame = NULL; CDBG("%s: BEGIN\n", __func__); if (NULL == bufs || NULL == user_data) { CDBG_ERROR("%s: bufs or user_data are not valid ", __func__); return; } /* find channel */ for (i = 0; i < MM_CHANNEL_TYPE_MAX; i++) { if (pme->channels[i].ch_id == bufs->ch_id) { channel = &pme->channels[i]; break; } } if (NULL == channel) { CDBG_ERROR("%s: Wrong channel id (%d)", __func__, bufs->ch_id); return; } /* find preview stream */ for (i = 0; i < channel->num_streams; i++) { if (channel->streams[i].s_config.stream_info->stream_type == CAM_STREAM_TYPE_PREVIEW) { p_stream = &channel->streams[i]; break; } } if (NULL == p_stream) { CDBG_ERROR("%s: cannot find preview stream", __func__); return; } /* find snapshot stream */ for (i = 0; i < channel->num_streams; i++) { if (channel->streams[i].s_config.stream_info->stream_type == CAM_STREAM_TYPE_SNAPSHOT) { m_stream = &channel->streams[i]; break; } } if (NULL == m_stream) { CDBG_ERROR("%s: cannot find snapshot stream", __func__); return; } /* find metadata stream */ for (i = 0; i < channel->num_streams; i++) { if (channel->streams[i].s_config.stream_info->stream_type == CAM_STREAM_TYPE_METADATA) { md_stream = &channel->streams[i]; break; } } if (NULL == md_stream) { CDBG_ERROR("%s: cannot find metadata stream", __func__); } /* find preview frame */ for (i = 0; i < bufs->num_bufs; i++) { if (bufs->bufs[i]->stream_id == p_stream->s_id) { p_frame = bufs->bufs[i]; break; } } if(md_stream) { /* find metadata frame */ for (i = 0; i < bufs->num_bufs; i++) { if (bufs->bufs[i]->stream_id == md_stream->s_id) { md_frame = bufs->bufs[i]; break; } } if (!pme->metadata) { /* App will free the metadata */ pme->metadata = malloc(sizeof(metadata_buffer_t)); } memcpy(pme->metadata , md_frame->buffer, sizeof(metadata_buffer_t)); } /* find snapshot frame */ for (i = 0; i < bufs->num_bufs; i++) { if (bufs->bufs[i]->stream_id == m_stream->s_id) { m_frame = bufs->bufs[i]; break; } } if (!m_frame || !p_frame) { CDBG_ERROR("%s: cannot find preview/snapshot frame", __func__); return; } CDBG("%s: ZSL CB with fb_fd = %d, m_frame = 0x%x, p_frame = 0x%x \n", __func__, pme->fb_fd, (uint32_t )m_frame, (uint32_t )p_frame); if ( 0 < pme->fb_fd ) { mm_app_overlay_display(pme, p_frame->fd); }/* else { mm_app_dump_frame(p_frame, "zsl_preview", "yuv", p_frame->frame_idx); mm_app_dump_frame(m_frame, "zsl_main", "yuv", m_frame->frame_idx); }*/ if ( pme->enable_reproc && ( NULL != pme->reproc_stream ) ) { rc = mm_app_do_reprocess(pme, m_frame, md_frame->buf_idx, bufs, md_stream); if (MM_CAMERA_OK != rc ) { CDBG_ERROR("%s: reprocess failed rc = %d", __func__, rc); } return; } if ( pme->encodeJpeg ) { pme->jpeg_buf.buf.buffer = (uint8_t *)malloc(m_frame->frame_len); if ( NULL == pme->jpeg_buf.buf.buffer ) { CDBG_ERROR("%s: error allocating jpeg output buffer", __func__); goto exit; } pme->jpeg_buf.buf.frame_len = m_frame->frame_len; /* create a new jpeg encoding session */ rc = createEncodingSession(pme, m_stream, m_frame); if (0 != rc) { CDBG_ERROR("%s: error creating jpeg session", __func__); free(pme->jpeg_buf.buf.buffer); goto exit; } /* start jpeg encoding job */ rc = encodeData(pme, bufs, m_stream); pme->encodeJpeg = 0; } else { if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, bufs->ch_id, m_frame)) { CDBG_ERROR("%s: Failed in main Qbuf\n", __func__); } mm_app_cache_ops((mm_camera_app_meminfo_t *)m_frame->mem_info, ION_IOC_INV_CACHES); } exit: if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, bufs->ch_id, p_frame)) { CDBG_ERROR("%s: Failed in preview Qbuf\n", __func__); } mm_app_cache_ops((mm_camera_app_meminfo_t *)p_frame->mem_info, ION_IOC_INV_CACHES); if(md_frame) { if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, bufs->ch_id, md_frame)) { CDBG_ERROR("%s: Failed in metadata Qbuf\n", __func__); } mm_app_cache_ops((mm_camera_app_meminfo_t *)md_frame->mem_info, ION_IOC_INV_CACHES); } CDBG("%s: END\n", __func__); }
static void mm_app_preview_notify_cb(mm_camera_super_buf_t *bufs, void *user_data) { int i = 0; mm_camera_channel_t *channel = NULL; mm_camera_stream_t *p_stream = NULL; mm_camera_buf_def_t *frame = bufs->bufs[0]; mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data; CDBG_ERROR("%s: BEGIN - length=%d, frame idx = %d\n", __func__, frame->frame_len, frame->frame_idx); if (NULL == bufs || NULL == user_data) { CDBG_ERROR("%s: bufs or user_data are not valid ", __func__); return; } /* find channel */ for (i = 0; i < MM_CHANNEL_TYPE_MAX; i++) { if (pme->channels[i].ch_id == bufs->ch_id) { channel = &pme->channels[i]; break; } } /* find preview stream */ for (i = 0; i < channel->num_streams; i++) { if (channel->streams[i].s_config.stream_info->stream_type == CAM_STREAM_TYPE_PREVIEW) { p_stream = &channel->streams[i]; break; } } /* find preview frame */ for (i = 0; i < bufs->num_bufs; i++) { if (bufs->bufs[i]->stream_id == p_stream->s_id) { frame = bufs->bufs[i]; break; } } if (NULL == p_stream) { CDBG_ERROR("%s: cannot find preview stream", __func__); return; } if ( 0 < pme->fb_fd ) { mm_app_overlay_display(pme, frame->fd); } #ifdef DUMP_PRV_IN_FILE { char file_name[64]; snprintf(file_name, sizeof(file_name), "P_C%d", pme->cam->camera_handle); mm_app_dump_frame(frame, file_name, "yuv", frame->frame_idx); } #endif if (pme->user_preview_cb) { CDBG_ERROR("[DBG] %s, user defined own preview cb. calling it...", __func__); pme->user_preview_cb(frame); } if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, bufs->ch_id, frame)) { CDBG_ERROR("%s: Failed in Preview Qbuf\n", __func__); } mm_app_cache_ops((mm_camera_app_meminfo_t *)frame->mem_info, ION_IOC_INV_CACHES); CDBG("%s: END\n", __func__); }
static void mm_app_reprocess_notify_cb(mm_camera_super_buf_t *bufs, void *user_data) { mm_camera_buf_def_t *frame = bufs->bufs[0]; mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data; mm_camera_channel_t *channel = NULL; mm_camera_stream_t *m_stream = NULL; mm_camera_buf_def_t *m_frame = NULL; mm_camera_super_buf_t *src_frame; int i = 0; int rc = 0; CDBG_ERROR("%s: BEGIN - length=%d, frame idx = %d\n", __func__, frame->frame_len, frame->frame_idx); /* find channel */ for (i = 0; i < MM_CHANNEL_TYPE_MAX; i++) { if (pme->channels[i].ch_id == bufs->ch_id) { channel = &pme->channels[i]; break; } } if (NULL == channel) { CDBG_ERROR("%s: Wrong channel id (%d)", __func__, bufs->ch_id); return; } // We have only one stream and buffer // in the reprocess channel. m_stream = &channel->streams[0]; m_frame = bufs->bufs[0]; if ( pme->encodeJpeg ) { pme->jpeg_buf.buf.buffer = (uint8_t *)malloc(m_frame->frame_len); if ( NULL == pme->jpeg_buf.buf.buffer ) { CDBG_ERROR("%s: error allocating jpeg output buffer", __func__); goto exit; } pme->jpeg_buf.buf.frame_len = m_frame->frame_len; /* create a new jpeg encoding session */ rc = createEncodingSession(pme, m_stream, m_frame); if (0 != rc) { CDBG_ERROR("%s: error creating jpeg session", __func__); free(pme->jpeg_buf.buf.buffer); goto exit; } /* start jpeg encoding job */ CDBG_ERROR("Encoding reprocessed frame!!"); rc = encodeData(pme, bufs, m_stream); pme->encodeJpeg = 0; } else { if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, bufs->ch_id, frame)) { CDBG_ERROR("%s: Failed in Reprocess Qbuf\n", __func__); } mm_app_cache_ops((mm_camera_app_meminfo_t *)frame->mem_info, ION_IOC_INV_CACHES); } exit: // Release source frame src_frame = ( mm_camera_super_buf_t * ) mm_qcamera_queue_dequeue(&pme->pp_frames, 1); if ( NULL != src_frame ) { mm_app_release_ppinput((void *) src_frame, (void *) pme); } CDBG_ERROR("%s: END\n", __func__); }
static void mm_app_snapshot_notify_cb(mm_camera_super_buf_t *bufs, void *user_data) { int rc = 0; uint32_t i = 0; mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data; mm_camera_channel_t *channel = NULL; mm_camera_stream_t *p_stream = NULL; mm_camera_stream_t *m_stream = NULL; mm_camera_buf_def_t *p_frame = NULL; mm_camera_buf_def_t *m_frame = NULL; /* find channel */ for (i = 0; i < MM_CHANNEL_TYPE_MAX; i++) { if (pme->channels[i].ch_id == bufs->ch_id) { channel = &pme->channels[i]; break; } } if (NULL == channel) { LOGE(" Wrong channel id (%d)", bufs->ch_id); rc = -1; goto error; } /* find snapshot stream */ for (i = 0; i < channel->num_streams; i++) { if (channel->streams[i].s_config.stream_info->stream_type == CAM_STREAM_TYPE_SNAPSHOT) { m_stream = &channel->streams[i]; break; } } if (NULL == m_stream) { LOGE(" cannot find snapshot stream"); rc = -1; goto error; } /* find snapshot frame */ for (i = 0; i < bufs->num_bufs; i++) { if (bufs->bufs[i]->stream_id == m_stream->s_id) { m_frame = bufs->bufs[i]; break; } } if (NULL == m_frame) { LOGE(" main frame is NULL"); rc = -1; goto error; } mm_app_dump_frame(m_frame, "main", "yuv", m_frame->frame_idx); /* find postview stream */ for (i = 0; i < channel->num_streams; i++) { if (channel->streams[i].s_config.stream_info->stream_type == CAM_STREAM_TYPE_POSTVIEW) { p_stream = &channel->streams[i]; break; } } if (NULL != p_stream) { /* find preview frame */ for (i = 0; i < bufs->num_bufs; i++) { if (bufs->bufs[i]->stream_id == p_stream->s_id) { p_frame = bufs->bufs[i]; break; } } if (NULL != p_frame) { mm_app_dump_frame(p_frame, "postview", "yuv", p_frame->frame_idx); } } mm_app_cache_ops((mm_camera_app_meminfo_t *)m_frame->mem_info, ION_IOC_CLEAN_INV_CACHES); pme->jpeg_buf.mem_info.size = m_frame->frame_len; mm_app_allocate_ion_memory(&pme->jpeg_buf, (0x1 << CAMERA_ION_FALLBACK_HEAP_ID)); /* create a new jpeg encoding session */ rc = createEncodingSession(pme, m_stream, m_frame); if (0 != rc) { LOGE(" error creating jpeg session"); mm_app_deallocate_ion_memory(&pme->jpeg_buf); goto error; } /* start jpeg encoding job */ rc = encodeData(pme, bufs, m_stream); if (0 != rc) { LOGE(" error creating jpeg session"); mm_app_deallocate_ion_memory(&pme->jpeg_buf); goto error; } error: /* buf done rcvd frames in error case */ if ( 0 != rc ) { for (i=0; i<bufs->num_bufs; i++) { if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, bufs->ch_id, bufs->bufs[i])) { LOGE(" Failed in Qbuf\n"); } mm_app_cache_ops((mm_camera_app_meminfo_t *)bufs->bufs[i]->mem_info, ION_IOC_INV_CACHES); } } LOGD(" END\n"); }
/** mm_app_snapshot_metadata_notify_cb * @bufs: Pointer to super buffer * @user_data: Pointer to user data * * **/ __unused static void mm_app_snapshot_metadata_notify_cb(mm_camera_super_buf_t *bufs, void *user_data) { uint32_t i = 0; mm_camera_channel_t *channel = NULL; mm_camera_stream_t *p_stream = NULL; mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data; mm_camera_buf_def_t *frame; metadata_buffer_t *pMetadata; if (NULL == bufs || NULL == user_data) { LOGE(" bufs or user_data are not valid "); return; } frame = bufs->bufs[0]; /* find channel */ for (i = 0; i < MM_CHANNEL_TYPE_MAX; i++) { if (pme->channels[i].ch_id == bufs->ch_id) { channel = &pme->channels[i]; break; } } if (NULL == channel) { LOGE(" Channel object is null"); return; } /* find meta stream */ for (i = 0; i < channel->num_streams; i++) { if (channel->streams[i].s_config.stream_info->stream_type == CAM_STREAM_TYPE_METADATA) { p_stream = &channel->streams[i]; break; } } if (NULL == p_stream) { LOGE(" cannot find metadata stream"); return; } /* find meta frame */ for (i = 0; i < bufs->num_bufs; i++) { if (bufs->bufs[i]->stream_id == p_stream->s_id) { frame = bufs->bufs[i]; break; } } if (!pme->metadata) { /* The app will free the metadata, we don't need to bother here */ pme->metadata = malloc(sizeof(metadata_buffer_t)); if (NULL == pme->metadata) { LOGE(" malloc failed"); return; } } memcpy(pme->metadata , frame->buffer, sizeof(metadata_buffer_t)); pMetadata = (metadata_buffer_t *)frame->buffer; IF_META_AVAILABLE(cam_auto_focus_data_t, focus_data, CAM_INTF_META_AUTOFOCUS_DATA, pMetadata) { if (focus_data->focus_state == CAM_AF_STATE_FOCUSED_LOCKED) { LOGE(" AutoFocus Done Call Back Received\n"); mm_camera_app_done(); } else if (focus_data->focus_state == CAM_AF_STATE_NOT_FOCUSED_LOCKED) { LOGE(" AutoFocus failed\n"); mm_camera_app_done(); } } if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, bufs->ch_id, frame)) { LOGE(" Failed in Preview Qbuf\n"); } mm_app_cache_ops((mm_camera_app_meminfo_t *)frame->mem_info, ION_IOC_INV_CACHES); }
static void mm_app_zsl_notify_cb(mm_camera_super_buf_t *bufs, void *user_data) { int i = 0; mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data; mm_camera_channel_t *channel = NULL; mm_camera_stream_t *p_stream = NULL; mm_camera_stream_t *m_stream = NULL; mm_camera_buf_def_t *p_frame = NULL; mm_camera_buf_def_t *m_frame = NULL; CDBG("%s: BEGIN\n", __func__); /* find channel */ for (i = 0; i < MM_CHANNEL_TYPE_MAX; i++) { if (pme->channels[i].ch_id == bufs->ch_id) { channel = &pme->channels[i]; break; } } if (NULL == channel) { CDBG_ERROR("%s: Wrong channel id (%d)", __func__, bufs->ch_id); return; } /* find preview stream */ for (i = 0; i < channel->num_streams; i++) { if (channel->streams[i].s_config.stream_info->stream_type == CAM_STREAM_TYPE_PREVIEW) { p_stream = &channel->streams[i]; break; } } if (NULL == p_stream) { CDBG_ERROR("%s: cannot find preview stream", __func__); return; } /* find snapshot stream */ for (i = 0; i < channel->num_streams; i++) { if (channel->streams[i].s_config.stream_info->stream_type == CAM_STREAM_TYPE_SNAPSHOT) { m_stream = &channel->streams[i]; break; } } if (NULL == m_stream) { CDBG_ERROR("%s: cannot find snapshot stream", __func__); return; } /* find preview frame */ for (i = 0; i < bufs->num_bufs; i++) { if (bufs->bufs[i]->stream_id == p_stream->s_id) { p_frame = bufs->bufs[i]; break; } } /* find snapshot frame */ for (i = 0; i < bufs->num_bufs; i++) { if (bufs->bufs[i]->stream_id == m_stream->s_id) { m_frame = bufs->bufs[i]; break; } } if (!m_frame || !p_frame) { CDBG_ERROR("%s: cannot find preview/snapshot frame", __func__); return; } mm_app_dump_frame(p_frame, "zsl_preview", "yuv", p_frame->frame_idx); mm_app_dump_frame(m_frame, "zsl_main", "yuv", m_frame->frame_idx); if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, bufs->ch_id, p_frame)) { CDBG_ERROR("%s: Failed in preview Qbuf\n", __func__); } mm_app_cache_ops((mm_camera_app_meminfo_t *)p_frame->mem_info, ION_IOC_INV_CACHES); if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, bufs->ch_id, m_frame)) { CDBG_ERROR("%s: Failed in main Qbuf\n", __func__); } mm_app_cache_ops((mm_camera_app_meminfo_t *)m_frame->mem_info, ION_IOC_INV_CACHES); CDBG("%s: END\n", __func__); }
static void mm_app_snapshot_notify_cb(mm_camera_super_buf_t *bufs, void *user_data) { int rc = 0; int i = 0; mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data; mm_camera_channel_t *channel = NULL; mm_camera_stream_t *p_stream = NULL; mm_camera_stream_t *m_stream = NULL; mm_camera_buf_def_t *p_frame = NULL; mm_camera_buf_def_t *m_frame = NULL; CDBG("%s: BEGIN\n", __func__); /* find channel */ for (i = 0; i < MM_CHANNEL_TYPE_MAX; i++) { if (pme->channels[i].ch_id == bufs->ch_id) { channel = &pme->channels[i]; break; } } if (NULL == channel) { CDBG_ERROR("%s: Wrong channel id (%d)", __func__, bufs->ch_id); rc = -1; goto error; } /* find snapshot stream */ for (i = 0; i < channel->num_streams; i++) { if (channel->streams[i].s_config.stream_info->stream_type == CAM_STREAM_TYPE_SNAPSHOT) { m_stream = &channel->streams[i]; break; } } if (NULL == m_stream) { CDBG_ERROR("%s: cannot find snapshot stream", __func__); rc = -1; goto error; } /* find snapshot frame */ for (i = 0; i < bufs->num_bufs; i++) { if (bufs->bufs[i]->stream_id == m_stream->s_id) { m_frame = bufs->bufs[i]; break; } } if (NULL == m_frame) { CDBG_ERROR("%s: main frame is NULL", __func__); rc = -1; goto error; } mm_app_dump_frame(m_frame, "main", "yuv", m_frame->frame_idx); /* find postview stream */ for (i = 0; i < channel->num_streams; i++) { if (channel->streams[i].s_config.stream_info->stream_type == CAM_STREAM_TYPE_POSTVIEW) { p_stream = &channel->streams[i]; break; } } if (NULL != p_stream) { /* find preview frame */ for (i = 0; i < bufs->num_bufs; i++) { if (bufs->bufs[i]->stream_id == p_stream->s_id) { p_frame = bufs->bufs[i]; break; } } if (NULL != p_frame) { mm_app_dump_frame(p_frame, "postview", "yuv", p_frame->frame_idx); } } mm_app_cache_ops((mm_camera_app_meminfo_t *)m_frame->mem_info, ION_IOC_CLEAN_INV_CACHES); pme->jpeg_buf.buf.buffer = (uint8_t *)malloc(m_frame->frame_len); if ( NULL == pme->jpeg_buf.buf.buffer ) { CDBG_ERROR("%s: error allocating jpeg output buffer", __func__); goto error; } pme->jpeg_buf.buf.frame_len = m_frame->frame_len; /* create a new jpeg encoding session */ rc = createEncodingSession(pme, m_stream, m_frame); if (0 != rc) { CDBG_ERROR("%s: error creating jpeg session", __func__); free(pme->jpeg_buf.buf.buffer); goto error; } /* start jpeg encoding job */ rc = encodeData(pme, bufs, m_stream); if (0 != rc) { CDBG_ERROR("%s: error creating jpeg session", __func__); free(pme->jpeg_buf.buf.buffer); goto error; } error: /* buf done rcvd frames in error case */ if ( 0 != rc ) { for (i=0; i<bufs->num_bufs; i++) { if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, bufs->ch_id, bufs->bufs[i])) { CDBG_ERROR("%s: Failed in Qbuf\n", __func__); } mm_app_cache_ops((mm_camera_app_meminfo_t *)bufs->bufs[i]->mem_info, ION_IOC_INV_CACHES); } } CDBG("%s: END\n", __func__); }
/** mm_app_snapshot_metadata_notify_cb * @bufs: Pointer to super buffer * @user_data: Pointer to user data * * **/ static void mm_app_snapshot_metadata_notify_cb(mm_camera_super_buf_t *bufs, void *user_data) { int i = 0; mm_camera_channel_t *channel = NULL; mm_camera_stream_t *p_stream = NULL; mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data; mm_camera_buf_def_t *frame = bufs->bufs[0]; cam_metadata_info_t *pMetadata; cam_auto_focus_data_t *focus_data; /* find channel */ for (i = 0; i < MM_CHANNEL_TYPE_MAX; i++) { if (pme->channels[i].ch_id == bufs->ch_id) { channel = &pme->channels[i]; break; } } if (NULL == channel) { CDBG_ERROR("%s: Wrong channel id", __func__); return; } /* find preview stream */ for (i = 0; i < channel->num_streams; i++) { if (channel->streams[i].s_config.stream_info->stream_type == CAM_STREAM_TYPE_METADATA) { p_stream = &channel->streams[i]; break; } } if (NULL == p_stream) { CDBG_ERROR("%s: Wrong preview stream", __func__); return; } /* find preview frame */ for (i = 0; i < bufs->num_bufs; i++) { if (bufs->bufs[i]->stream_id == p_stream->s_id) { frame = bufs->bufs[i]; break; } } if (NULL == p_stream) { CDBG_ERROR("%s: cannot find metadata stream", __func__); return; } if (!pme->metadata) { /* The app will free the metadata, we don't need to bother here */ pme->metadata = malloc(sizeof(cam_metadata_info_t)); } /* find meta data frame */ mm_camera_buf_def_t *meta_frame = NULL; for (i = 0; i < bufs->num_bufs; i++) { if (bufs->bufs[i]->stream_type == CAM_STREAM_TYPE_METADATA) { meta_frame = bufs->bufs[i]; break; } } /* fill in meta data frame ptr */ if (meta_frame != NULL) { pme->metadata = (cam_metadata_info_t *)meta_frame->buffer; } pMetadata = (cam_metadata_info_t *)frame->buffer; if (pMetadata->is_focus_valid) { focus_data = (cam_auto_focus_data_t *)&(pMetadata->focus_data); if (focus_data->focus_state == CAM_AF_FOCUSED) { CDBG_ERROR("%s: AutoFocus Done Call Back Received\n",__func__); mm_camera_app_done(); } } if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, bufs->ch_id, frame)) { CDBG_ERROR("%s: Failed in Preview Qbuf\n", __func__); } mm_app_cache_ops((mm_camera_app_meminfo_t *)frame->mem_info, ION_IOC_INV_CACHES); }