📄 pmp_play.c.svn-base
字号:
} } *previous_controller = controller; }static int pmp_output_thread(SceSize input_length, void *input) { volatile struct pmp_play_struct *p = *((void **) input); sceCtrlSetSamplingCycle(0); sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG); SceCtrlData previous_controller; sceCtrlPeekBufferPositive(&previous_controller, 1); unsigned int first_video_frame = 1; unsigned int current_buffer_number = 0; while (p->return_request == 0) { volatile struct pmp_decode_buffer_struct *current_buffer = &p->decoder.output_frame_buffers[current_buffer_number]; if (pmp_wait(p, p->semaphore_can_get, "pmp_output_thread: sceKernelWaitSema failed on semaphore_can_get") == 0) { break; } if (sceKernelSignalSema(p->semaphore_can_show, 1) < 0) { p->return_result = "pmp_output_thread: sceKernelSignalSema failed on semaphore_can_show"; p->return_request = 1; break; } if (p->seek == 0) { current_buffer->first_delay -= 500; sceKernelDelayThread(current_buffer->first_delay < 1 ? 1 : current_buffer->first_delay); sceAudioOutputBlocking(0, PSP_AUDIO_VOLUME_MAX, current_buffer->audio_frame); } pmp_input(p, &previous_controller); if (p->seek == 0) { int i = 1; for (; i < current_buffer->number_of_audio_frames; i++) { sceAudioOutputBlocking(0, PSP_AUDIO_VOLUME_MAX, current_buffer->audio_frame + p->decoder.audio_frame_size * i); } current_buffer->last_delay -= 500; sceKernelDelayThread(current_buffer->last_delay < 1 ? 1 : current_buffer->last_delay); } current_buffer_number = (current_buffer_number + 1) % p->decoder.number_of_frame_buffers; if (pmp_wait(p, p->semaphore_show_done, "pmp_output_thread: sceKernelWaitSema failed on semaphore_show_done") == 0) { break; } if (first_video_frame == 1) { first_video_frame = 0; } else { if (sceKernelSignalSema(p->semaphore_can_put, 1) < 0) { p->return_result = "pmp_output_thread: sceKernelSignalSema failed on semaphore_can_put"; p->return_request = 1; break; } } while (p->return_request == 0 && p->paused == 1) { sceKernelDelayThread(100000); pmp_input(p, &previous_controller); } } return(0); }static int pmp_next_video_frame(volatile struct pmp_play_struct *p, int current_video_frame) { // save last keyframe pos if (p->decoder.reader.file.packet_index[current_video_frame] & 1) p->last_keyframe_pos = current_video_frame; if (p->resume_pos>0) { int pos = p->resume_pos; p->resume_pos = 0; return(pos); } if (p->seek > 0) { int number_of_skips = 0; if (p->seek == 2) { number_of_skips = 20; } int new_video_frame = current_video_frame + 1; while (new_video_frame < p->decoder.reader.file.header.video.number_of_frames) { if (p->decoder.reader.file.packet_index[new_video_frame] & 1) { if (number_of_skips == 0) { return(new_video_frame); } else { number_of_skips--; } } new_video_frame++; } return(p->decoder.reader.file.header.video.number_of_frames); } if (p->seek < 0) { int number_of_skips = 0; if (p->seek == -2) { number_of_skips = 20; } int new_video_frame = current_video_frame - 1; while (new_video_frame > 0) { if (p->decoder.reader.file.packet_index[new_video_frame] & 1) { if (number_of_skips == 0) { return(new_video_frame); } else { number_of_skips--; } } new_video_frame--; } return(0); } return(current_video_frame + 1); }char *pmp_play_start(volatile struct pmp_play_struct *p) { sceKernelStartThread(p->output_thread, 4, &p); sceKernelStartThread(p->show_thread, 4, &p); int current_video_frame = 0; while (p->return_request == 0 && current_video_frame != p->decoder.reader.file.header.video.number_of_frames) { if (pmp_wait(p, p->semaphore_can_put, "pmp_play_start: sceKernelWaitSema failed on semaphore_can_put") == 0) { break; } //modify by cooleyes 2007/02/01 char *result = pmp_decode_get((struct pmp_decode_struct *) &p->decoder, current_video_frame, p->audio_stream, p->audio_channel, 1, p->volume_boost, p->aspect_ratio, p->zoom, p->luminosity_boost, p->show_interface, p->subtitle, p->subtitle_format, p->loop); //char *result = pmp_decode_get((struct pmp_decode_struct *) &p->decoder, current_video_frame, p->audio_stream, 1, p->volume_boost, p->aspect_ratio, p->zoom, p->luminosity_boost, p->show_interface, p->subtitle, p->subtitle_format, p->loop); //modify end if (result != 0) { p->return_result = result; p->return_request = 1; break; } if (sceKernelSignalSema(p->semaphore_can_get, 1) < 0) { p->return_result = "pmp_play_start: sceKernelSignalSema failed on semaphore_can_get"; p->return_request = 1; break; } current_video_frame = pmp_next_video_frame(p, current_video_frame); if ((p->loop == 1) && (current_video_frame == p->decoder.reader.file.header.video.number_of_frames)) { current_video_frame = 0; } } //*/ 2006.08.28 cooleyes if (current_video_frame == p->decoder.reader.file.header.video.number_of_frames) { p->last_keyframe_pos = 0; } //*/ sceKernelDelayThread(1000000); p->return_request = 1; sceKernelWaitThreadEnd(p->output_thread, 0); sceKernelWaitThreadEnd(p->show_thread, 0); return(p->return_result); }char *pmp_play_open(struct pmp_play_struct *p, struct movie_file_struct *movie, int usePos, int pspType, int tvAspectRatio, int tvWidth, int tvHeight, int videoMode) { pmp_play_safe_constructor(p); p->subtitle = 0; p->subtitle_count = 0; char *result = pmp_decode_open(&p->decoder, movie->movie_file, pspType, tvAspectRatio, tvWidth, tvHeight, videoMode); if (result != 0) { pmp_play_close(p, 0, pspType); return(result); } if (subtitle_parse_search( movie, p->decoder.reader.file.header.video.rate, p->decoder.reader.file.header.video.scale, &p->subtitle_count)==0) p->subtitle = 1; if ( cooleyesAudioSetFrequency(sceKernelDevkitVersion(), p->decoder.reader.file.header.audio.rate) != 0) { pmp_play_close(p, 0, pspType); return("pmp_play_open: sceAudioSetFrequency failed"); } p->audio_reserved = sceAudioChReserve(0, p->decoder.reader.file.header.audio.scale, PSP_AUDIO_FORMAT_STEREO); if (p->audio_reserved < 0) { pmp_play_close(p, 0, pspType); return("pmp_play_open: sceAudioChReserve failed"); } p->semaphore_can_get = sceKernelCreateSema("can_get", 0, 0, p->decoder.number_of_frame_buffers, 0); if (p->semaphore_can_get < 0) { pmp_play_close(p, 0, pspType); return("pmp_play_open: sceKernelCreateSema failed on semaphore_can_get"); } p->semaphore_can_put = sceKernelCreateSema("can_put", 0, p->decoder.number_of_frame_buffers, p->decoder.number_of_frame_buffers, 0); if (p->semaphore_can_put < 0) { pmp_play_close(p, 0, pspType); return("pmp_play_open: sceKernelCreateSema failed on semaphore_can_put"); } p->semaphore_can_show = sceKernelCreateSema("can_show", 0, 0, 1, 0); if (p->semaphore_can_show < 0) { pmp_play_close(p, 0, pspType); return("pmp_play_open: sceKernelCreateSema failed on semaphore_can_show"); } p->semaphore_show_done = sceKernelCreateSema("show_done", 0, 0, 1, 0); if (p->semaphore_show_done < 0) { pmp_play_close(p, 0, pspType); return("pmp_play_open: sceKernelCreateSema failed on semaphore_show_done"); } p->output_thread = sceKernelCreateThread("output", pmp_output_thread, 0x8, 0x10000, 0, 0); if (p->output_thread < 0) { pmp_play_close(p, 0, pspType); return("pmp_play_open: sceKernelCreateThread failed on output_thread"); } p->show_thread = sceKernelCreateThread("show", pmp_show_thread, 0x8, 0x10000, 0, 0); if (p->show_thread < 0) { pmp_play_close(p, 0, pspType); return("pmp_play_open: sceKernelCreateThread failed on show_thread"); } p->return_request = 0; p->return_result = 0; p->paused = 0; p->seek = 0; p->audio_stream = 0; //add by cooleyes 2007/02/01 p->audio_channel = 0; //add end p->volume_boost = 3; p->aspect_ratio = 0; p->zoom = 100; p->luminosity_boost = 0; p->show_interface = 0; p->loop = 0; p->resume_pos = 0; p->last_keyframe_pos= 0; p->subtitle_format = (((gufont_haveflags&GU_FONT_HAS_UNICODE_CHARMAP))?1:0); p->subtitle_fontcolor = 0; p->subtitle_bordercolor = 0; memcpy(p->hash, movie->movie_hash, 16); if (usePos) pmp_stat_load( p ); return(0); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -