//======================================================================================= // video decode status //======================================================================================= VIDEO_CODEC_STATUS video_decode_status(void) { if(vid_dec_get_status() & C_VIDEO_DECODE_ERR) { return VIDEO_CODEC_PASER_HEADER_FAIL; } else if(vid_dec_get_status() & C_VIDEO_DECODE_PAUSE) { return VIDEO_CODEC_PROCESS_PAUSE; } else if(vid_dec_get_status() & C_VIDEO_DECODE_PLAY) { return VIDEO_CODEC_PROCESSING; } else if(vid_dec_get_status() & C_VIDEO_DECODE_PARSER) { return VIDEO_CODEC_PROCESSING; } else if(vid_dec_get_status() & C_VIDEO_DECODE_PARSER_NTH) { return VIDEO_CODEC_PROCESSING; } else { return VIDEO_CODEC_PROCESS_END; } }
static void vid_dec_input_frame_done(struct video_client_ctx *client_ctx, u32 event, u32 status, struct vcd_frame_data_type *vcd_frame_data) { struct vid_dec_msg *vdec_msg; if (!client_ctx || !vcd_frame_data) { ERR("vid_dec_input_frame_done() NULL pointer \n"); return; } vdec_msg = kzalloc(sizeof(struct vid_dec_msg), GFP_KERNEL); if (!vdec_msg) { ERR("vid_dec_input_frame_done(): cannot allocate vid_dec_msg " " buffer\n"); return; } vdec_msg->vdec_msg_info.status_code = vid_dec_get_status(status); if (event == VCD_EVT_RESP_INPUT_DONE) { vdec_msg->vdec_msg_info.msgcode = VDEC_MSG_RESP_INPUT_BUFFER_DONE; DBG("Send INPUT_DON message to client = %p\n", client_ctx); } else if (event == VCD_EVT_RESP_INPUT_FLUSHED) { vdec_msg->vdec_msg_info.msgcode = VDEC_MSG_RESP_INPUT_FLUSHED; DBG("Send INPUT_FLUSHED message to client = %p\n", client_ctx); } else { ERR("vid_dec_input_frame_done(): invalid event type\n"); return; } vdec_msg->vdec_msg_info.msgdata.input_frame_clientdata = (void *)vcd_frame_data->n_frm_clnt_data; vdec_msg->vdec_msg_info.msgdatasize = sizeof(void *); mutex_lock(&client_ctx->msg_queue_lock); list_add_tail(&vdec_msg->list, &client_ctx->msg_queue); mutex_unlock(&client_ctx->msg_queue_lock); wake_up(&client_ctx->msg_wait); }
static void vid_dec_lean_event(struct video_client_ctx *client_ctx, u32 event, u32 status) { struct vid_dec_msg *vdec_msg; if (!client_ctx) { ERR("%s(): !client_ctx pointer \n", __func__); return; } vdec_msg = kzalloc(sizeof(struct vid_dec_msg), GFP_KERNEL); if (!vdec_msg) { ERR("%s(): cannot allocate vid_dec_msg buffer\n", __func__); return; } vdec_msg->vdec_msg_info.status_code = vid_dec_get_status(status); switch (event) { case VCD_EVT_IND_RECONFIG: INFO("\n msm_vidc_dec: Sending VDEC_MSG_EVT_CONFIG_CHANGED" " to client"); vdec_msg->vdec_msg_info.msgcode = VDEC_MSG_EVT_CONFIG_CHANGED; break; case VCD_EVT_IND_RESOURCES_LOST: INFO("\n msm_vidc_dec: Sending VDEC_EVT_RESOURCES_LOST" " to client"); vdec_msg->vdec_msg_info.msgcode = VDEC_EVT_RESOURCES_LOST; break; case VCD_EVT_RESP_FLUSH_INPUT_DONE: INFO("\n msm_vidc_dec: Sending VDEC_MSG_RESP_FLUSH_INPUT_DONE" " to client"); vdec_msg->vdec_msg_info.msgcode = VDEC_MSG_RESP_FLUSH_INPUT_DONE; break; case VCD_EVT_RESP_FLUSH_OUTPUT_DONE: INFO("\n msm_vidc_dec: Sending VDEC_MSG_RESP_FLUSH_OUTPUT_DONE" " to client"); vdec_msg->vdec_msg_info.msgcode = VDEC_MSG_RESP_FLUSH_OUTPUT_DONE; break; case VCD_EVT_IND_HWERRFATAL: INFO("\n msm_vidc_dec: Sending VDEC_MSG_EVT_HW_ERROR" " to client"); vdec_msg->vdec_msg_info.msgcode = VDEC_MSG_EVT_HW_ERROR; break; case VCD_EVT_RESP_START: INFO("\n msm_vidc_dec: Sending VDEC_MSG_RESP_START_DONE" " to client"); vdec_msg->vdec_msg_info.msgcode = VDEC_MSG_RESP_START_DONE; break; case VCD_EVT_RESP_STOP: INFO("\n msm_vidc_dec: Sending VDEC_MSG_RESP_STOP_DONE" " to client"); vdec_msg->vdec_msg_info.msgcode = VDEC_MSG_RESP_STOP_DONE; break; case VCD_EVT_RESP_PAUSE: INFO("\n msm_vidc_dec: Sending VDEC_MSG_RESP_PAUSE_DONE" " to client"); vdec_msg->vdec_msg_info.msgcode = VDEC_MSG_RESP_PAUSE_DONE; break; default: ERR("%s() : unknown event type \n", __func__); break; } vdec_msg->vdec_msg_info.msgdatasize = 0; mutex_lock(&client_ctx->msg_queue_lock); list_add_tail(&vdec_msg->list, &client_ctx->msg_queue); mutex_unlock(&client_ctx->msg_queue_lock); wake_up(&client_ctx->msg_wait); }
static void vid_dec_output_frame_done(struct video_client_ctx *client_ctx, u32 event, u32 status, struct vcd_frame_data_type *vcd_frame_data) { struct vid_dec_msg *vdec_msg; unsigned long kernel_vaddr, phy_addr, user_vaddr; int pmem_fd; struct file *file; s32 buffer_index = -1; if (!client_ctx || !vcd_frame_data) { ERR("vid_dec_input_frame_done() NULL pointer \n"); return; } vdec_msg = kzalloc(sizeof(struct vid_dec_msg), GFP_KERNEL); if (!vdec_msg) { ERR("vid_dec_input_frame_done(): cannot allocate vid_dec_msg " " buffer\n"); return; } vdec_msg->vdec_msg_info.status_code = vid_dec_get_status(status); if (event == VCD_EVT_RESP_OUTPUT_DONE) vdec_msg->vdec_msg_info.msgcode = VDEC_MSG_RESP_OUTPUT_BUFFER_DONE; else if (event == VCD_EVT_RESP_OUTPUT_FLUSHED) vdec_msg->vdec_msg_info.msgcode = VDEC_MSG_RESP_OUTPUT_FLUSHED; else { ERR("QVD: vid_dec_output_frame_done invalid cmd type \n"); return; } kernel_vaddr = (unsigned long)vcd_frame_data->p_virtual; if (vid_c_lookup_addr_table(client_ctx, BUFFER_TYPE_OUTPUT, FALSE, &user_vaddr, &kernel_vaddr, &phy_addr, &pmem_fd, &file, &buffer_index)) { /* Buffer address in user space */ vdec_msg->vdec_msg_info.msgdata.output_frame.bufferaddr = (u8 *) user_vaddr; /* Buffer address in user space */ vdec_msg->vdec_msg_info.msgdata.output_frame.phy_addr = vcd_frame_data->p_physical; /* Data length */ vdec_msg->vdec_msg_info.msgdata.output_frame.len = vcd_frame_data->n_data_len; vdec_msg->vdec_msg_info.msgdata.output_frame.flags = vcd_frame_data->n_flags; /* Timestamp pass-through from input frame */ vdec_msg->vdec_msg_info.msgdata.output_frame.time_stamp = vcd_frame_data->time_stamp; /* Output frame client data */ vdec_msg->vdec_msg_info.msgdata.output_frame.client_data = (void *)vcd_frame_data->n_frm_clnt_data; /* Associated input frame client data */ vdec_msg->vdec_msg_info.msgdata.output_frame. input_frame_clientdata = (void *)vcd_frame_data->n_ip_frm_tag; /* Decoded picture width and height */ vdec_msg->vdec_msg_info.msgdata.output_frame.framesize. n_bottom = vcd_frame_data->dec_op_prop.disp_frm.n_bottom; vdec_msg->vdec_msg_info.msgdata.output_frame.framesize.n_left = vcd_frame_data->dec_op_prop.disp_frm.n_left; vdec_msg->vdec_msg_info.msgdata.output_frame.framesize.n_right = vcd_frame_data->dec_op_prop.disp_frm.n_right; vdec_msg->vdec_msg_info.msgdata.output_frame.framesize.n_top = vcd_frame_data->dec_op_prop.disp_frm.n_top; vdec_msg->vdec_msg_info.msgdatasize = sizeof(struct vdec_output_frameinfo); } else { ERR("vid_dec_output_frame_done UVA can not be found\n"); vdec_msg->vdec_msg_info.status_code = VDEC_S_EFATAL; } mutex_lock(&client_ctx->msg_queue_lock); list_add_tail(&vdec_msg->list, &client_ctx->msg_queue); mutex_unlock(&client_ctx->msg_queue_lock); wake_up(&client_ctx->msg_wait); }