void ipu_disp_loop_thread(void *arg) { struct decode *dec = (struct decode *)arg; DecHandle handle = dec->handle; struct vpu_display *disp = dec->disp; int index = -1, disp_clr_index, tmp_idx[3] = {0,0,0}, err, mode; pthread_attr_t attr; ipu_running = 1; pthread_attr_init(&attr); pthread_attr_setschedpolicy(&attr, SCHED_RR); while(1) { disp_clr_index = index; index = dequeue_buf(&(disp->ipu_q)); if (index < 0) { wait_queue(); ipu_waiting = 0; index = dequeue_buf(&(disp->ipu_q)); if (index < 0) { info_msg("thread is going to finish\n"); break; } } if (disp->ncount == 0) { disp->input.user_def_paddr[0] = disp->ipu_bufs[index].ipu_paddr; /* For video de-interlace, Low/Medium motion */ tmp_idx[0] = index; } else if ((disp->deinterlaced == 1) && (disp->input.motion_sel != HIGH_MOTION) && (disp->ncount == 1)) { disp->input.user_def_paddr[1] = disp->ipu_bufs[index].ipu_paddr; /* For video de-interlace, Low/Medium motion */ tmp_idx[1] = index; } else if ((disp->ncount == 1) || ((disp->deinterlaced == 1) && (disp->input.motion_sel != HIGH_MOTION) && (disp->ncount == 2))) { disp->input.user_def_paddr[disp->ncount] = disp->ipu_bufs[index].ipu_paddr; mode = (disp->deinterlaced == 1) ? (OP_STREAM_MODE | TASK_VDI_VF_MODE) : (OP_STREAM_MODE | TASK_PP_MODE); err = mxc_ipu_lib_task_init(&(disp->input), NULL, &(disp->output), mode, &(disp->ipu_handle)); if (err < 0) { err_msg("mxc_ipu_lib_task_init failed, err %d\n", err); quitflag = 1; return; } /* it only enable ipu task and finish first frame */ err = mxc_ipu_lib_task_buf_update(&(disp->ipu_handle), 0, 0, 0, NULL, NULL); if (err < 0) { err_msg("mxc_ipu_lib_task_buf_update failed, err %d\n", err); quitflag = 1; break; } /* For video de-interlace, Low/Medium motion */ tmp_idx[2] = index; if ((disp->deinterlaced == 1) && (disp->input.motion_sel != HIGH_MOTION)) disp_clr_index = tmp_idx[0]; } else { err = mxc_ipu_lib_task_buf_update(&(disp->ipu_handle), disp->ipu_bufs[index].ipu_paddr, 0, 0, NULL, NULL); if (err < 0) { err_msg("mxc_ipu_lib_task_buf_update failed, err %d\n", err); quitflag = 1; break; } /* For video de-interlace, Low/Medium motion */ if ((disp->deinterlaced == 1) && (disp->input.motion_sel != HIGH_MOTION)) { tmp_idx[0] = tmp_idx[1]; tmp_idx[1] = tmp_idx[2]; tmp_idx[2] = index; disp_clr_index = tmp_idx[0]; } } if ((dec->cmdl->format != STD_MJPG) && (disp_clr_index >= 0) && (!disp->stopping) && !((disp->deinterlaced == 1) && (disp->input.motion_sel != HIGH_MOTION) && (disp->ncount < 2))) { err = vpu_DecClrDispFlag(handle, disp_clr_index); if (err) { err_msg("vpu_DecClrDispFlag failed Error code %d\n", err); quitflag = 1; break; } } disp->ncount++; } mxc_ipu_lib_task_uninit(&(disp->ipu_handle)); pthread_attr_destroy(&attr); info_msg("Disp loop thread exit\n"); ipu_running = 0; return; }
/* command_line_exec(cmdlist) * * Execute the command list. * * Execute each individual command with 'command_exec'. * String commands together depending on the 'cmdlist->controlop' operators. * Returns the exit status of the entire command list, which equals the * exit status of the last completed command. * * The operators have the following behavior: * * CMD_END, CMD_SEMICOLON * Wait for command to exit. Proceed to next command * regardless of status. * CMD_AND Wait for command to exit. Proceed to next command * only if this command exited with status 0. Otherwise * exit the whole command line. * CMD_OR Wait for command to exit. Proceed to next command * only if this command exited with status != 0. * Otherwise exit the whole command line. * CMD_BACKGROUND, CMD_PIPE * Do not wait for this command to exit. Pretend it * had status 0, for the purpose of returning a value * from command_line_exec. */ int command_line_exec(command_t *cmdlist) { int cmd_status = 0; // status of last command executed int pipefd = STDIN_FILENO; // read end of last pipe while (cmdlist) { int wp_status; // Hint: use for waitpid's status argument! // Read the manual page for waitpid() to // see how to get the command's exit // status (cmd_status) from this value. // EXERCISE: Fill out this function! // If an error occurs in command_exec, feel free to abort(). if (cmdlist->argv[0] != NULL && strcmp(cmdlist->argv[0], "makeq") == 0) { MKQ = makeq_alloc(); if (cmdlist->argv[1] != NULL) { MKQ->name = strdup(cmdlist->argv[1]); } else { goto error; } if (cmdlist->argv[2] != NULL) { MKQ->max_jobs = atoi(cmdlist->argv[2]); } else { goto error; } if (cmdlist->argv[3] != NULL) goto error; } else if (cmdlist->argv[0] != NULL && strcmp(cmdlist->argv[0], "waitq") == 0) { //printf("we are here\n"); if (cmdlist->argv[1] != NULL && MKQ != NULL && strcmp(cmdlist->argv[1], MKQ->name) == 0) wait_queue(); else fprintf(stderr, "Could not find makeq with that name\n"); } else { pid_t id = command_exec(cmdlist, &pipefd); if (id <= 0) abort(); switch(cmdlist->controlop) { case CMD_END: case CMD_SEMICOLON: if (cmdlist->argv[0] == NULL || strcmp(cmdlist->argv[0], "q") != 0) { waitpid(id, &wp_status, 0); cmd_status = WEXITSTATUS(wp_status); } break; case CMD_AND: waitpid(id, &wp_status, 0); if (WEXITSTATUS(wp_status) != 0) { cmd_status = WEXITSTATUS(wp_status); goto done; } break; case CMD_OR: waitpid(id, &wp_status, 0); if (WEXITSTATUS(wp_status) == 0) { cmd_status = 0; // EXIT_SUCCESS goto done; } break; case CMD_BACKGROUND: case CMD_PIPE: cmd_status = 0; break; } } cmdlist = cmdlist->next; } done: return cmd_status; error: //makeq_free(MKQ); return 1; }
void ipu_disp_loop_thread(void *arg) { struct DecodingInstance *dec = (struct DecodingInstance *)arg; struct vpu_display *disp = dec->disp; int index = -1, disp_clr_index, tmp_idx[3] = {0,0,0}, err, mode; pthread_attr_t attr; ipu_running = 1; pthread_attr_init(&attr); pthread_attr_setschedpolicy(&attr, SCHED_RR); while(1) { disp_clr_index = index; index = dequeue_buf(&(disp->ipu_q)); if (index < 0) { wait_queue(); ipu_waiting = 0; index = dequeue_buf(&(disp->ipu_q)); if (index < 0) { fputs("thread is going to finish\n", stderr); break; } } if (disp->ncount == 0) { disp->input.user_def_paddr[0] = disp->ipu_bufs[index].ipu_paddr; /* For video de-interlace, Low/Medium motion */ tmp_idx[0] = index; }else if ((disp->ncount == 1)) { disp->input.user_def_paddr[disp->ncount] = disp->ipu_bufs[index].ipu_paddr; mode = (OP_STREAM_MODE | TASK_PP_MODE); err = mxc_ipu_lib_task_init(&(disp->input), NULL, &(disp->output), mode, &(disp->ipu_handle)); if (err < 0) { fprintf(stderr, "mxc_ipu_lib_task_init failed, err %d\n", err); quitflag = 1; return; } /* it only enable ipu task and finish first frame */ err = mxc_ipu_lib_task_buf_update(&(disp->ipu_handle), 0, 0, 0, NULL, NULL); if (err < 0) { fprintf(stderr, "mxc_ipu_lib_task_buf_update failed, err %d\n", err); quitflag = 1; break; } } else { err = mxc_ipu_lib_task_buf_update(&(disp->ipu_handle), disp->ipu_bufs[index].ipu_paddr, 0, 0, NULL, NULL); if (err < 0) { fprintf(stderr, "mxc_ipu_lib_task_buf_update failed, err %d\n", err); quitflag = 1; break; } } disp->ncount++; } mxc_ipu_lib_task_uninit(&(disp->ipu_handle)); pthread_attr_destroy(&attr); fputs("Disp loop thread exit\n", stderr); ipu_running = 0; return; }