📄 mkv_play.c.svn-base
字号:
volatile struct mkv_play_struct *p = *((void **) input); p->current_audio_buffer_number = 0; int wait; int first = 1; SceInt32 volume = 0; while (p->return_request == 0) { volatile struct mkv_decode_buffer_struct *current_buffer = &p->decoder.output_audio_frame_buffers[p->current_audio_buffer_number]; wait = mkv_wait(p, p->semaphore_can_get_audio, "mkv_output_thread: sceKernelWaitSema failed on semaphore_can_get_audio"); if ( wait == -1) { break; } else if ( wait == 1 ) { if ( volume < PSP_AUDIO_VOLUME_MAX ) { volume += PSP_AUDIO_VOLUME_MAX/5; if ( volume >= PSP_AUDIO_VOLUME_MAX ) volume = PSP_AUDIO_VOLUME_MAX; } p->current_timestamp = current_buffer->timestamp; sceAudioOutputBlocking(0, volume, current_buffer->data); p->current_audio_buffer_number = (p->current_audio_buffer_number + 1) % p->decoder.number_of_frame_buffers; if (first == 1) { first = 0; } else { if (sceKernelSignalSema(p->semaphore_can_put_audio, 1) < 0) { p->return_result = "mkv_output_thread: sceKernelSignalSema failed on semaphore_can_put_audio"; p->return_request = 1; break; } } } else { sceKernelDelayThread(1); } while (p->return_request == 0 && p->paused == 1) { sceKernelDelayThread(100000); } } return(0);}void mkv_play_do_seek(volatile struct mkv_play_struct *p) { p->last_keyframe_pos = p->current_timestamp; if (p->resume_pos>0) { int pos = p->resume_pos; p->resume_pos = 0; mkv_decode_seek((struct mkv_decode_struct *) &p->decoder, pos); return; } if (p->seek > 0) { int seek_timestamp = p->current_timestamp + p->decoder.reader.file.seek_duration; if (p->seek == 2) { seek_timestamp += p->decoder.reader.file.seek_duration; } mkv_decode_seek((struct mkv_decode_struct *) &p->decoder, seek_timestamp); return; } if (p->seek < 0) { int seek_timestamp = p->current_timestamp - p->decoder.reader.file.seek_duration; if (p->seek == -2) { seek_timestamp -= p->decoder.reader.file.seek_duration; } if ( seek_timestamp < 0 ) seek_timestamp = 0; int i; for(i = 0; i < p->decoder.number_of_frame_buffers; i++) p->decoder.output_video_frame_buffers[i].timestamp = -p->decoder.video_frame_duration; mkv_decode_seek((struct mkv_decode_struct *) &p->decoder, seek_timestamp); return; } return; }void mkv_play_reset(volatile struct mkv_play_struct *p) { int i; for(i = 0; i < p->decoder.number_of_frame_buffers; i++) p->decoder.output_video_frame_buffers[i].timestamp = -p->decoder.video_frame_duration; mkv_decode_reset((struct mkv_decode_struct *) &p->decoder);}char *mkv_play_start(volatile struct mkv_play_struct *p) { sceKernelStartThread(p->output_thread, 4, &p); sceKernelStartThread(p->show_thread, 4, &p); int cached_video_frame = 0; sceCtrlSetSamplingCycle(0); sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG); SceCtrlData previous_controller; sceCtrlPeekBufferPositive(&previous_controller, 1); while (p->return_request == 0 && !mkv_decode_is_eof((struct mkv_decode_struct *) &p->decoder)) { mkv_input(p, &previous_controller); int wait; char* result; wait = mkv_wait(p, p->semaphore_can_put_audio, "mkv_play_start: sceKernelWaitSema failed on semaphore_can_put_audio"); if ( wait == -1) { break; } else if ( wait == 1) { result = mkv_decode_get_audio((struct mkv_decode_struct *) &p->decoder, p->audio_stream, p->audio_channel, 1, p->volume_boost); if (result != 0) { p->return_result = result; p->return_request = 1; break; } if (sceKernelSignalSema(p->semaphore_can_get_audio, 1) < 0) { p->return_result = "mkv_play_start: sceKernelSignalSema failed on semaphore_can_get_audio"; p->return_request = 1; break; } } wait = mkv_wait(p, p->semaphore_can_put_video, "mkv_play_start: sceKernelWaitSema failed on semaphore_can_put_video"); if ( wait == -1) { break; } else if ( wait == 1) { if ( cached_video_frame > 0 ) { result = mkv_decode_get_cached_video((struct mkv_decode_struct *) &p->decoder, cached_video_frame, p->audio_stream, p->volume_boost, p->aspect_ratio, p->zoom, p->luminosity_boost, p->show_interface, p->subtitle, p->subtitle_format, p->loop); if (result != 0) { p->return_result = result; p->return_request = 1; break; } cached_video_frame--; if (sceKernelSignalSema(p->semaphore_can_get_video, 1) < 0) { p->return_result = "mkv_play_start: sceKernelSignalSema failed on semaphore_can_get_video"; p->return_request = 1; break; } } else { result = mkv_decode_get_video((struct mkv_decode_struct *) &p->decoder, p->audio_stream, p->volume_boost, p->aspect_ratio, p->zoom, p->luminosity_boost, p->show_interface, p->subtitle, p->subtitle_format, p->loop, &cached_video_frame); if (result != 0) { p->return_result = result; p->return_request = 1; break; } if ( cached_video_frame >= 0 ) { if (sceKernelSignalSema(p->semaphore_can_get_video, 1) < 0) { p->return_result = "mkv_play_start: sceKernelSignalSema failed on semaphore_can_get_video"; p->return_request = 1; break; } } else { if (sceKernelSignalSema(p->semaphore_can_put_video, 1) < 0) { p->return_result = "mkv_play_start: sceKernelSignalSema failed on semaphore_can_put_video1"; p->return_request = 1; break; } } } } if ( p->decoder.reader.file.audio_double_sample == 0 ) { wait = mkv_wait(p, p->semaphore_can_put_audio, "mkv_play_start: sceKernelWaitSema failed on semaphore_can_put_audio"); if ( wait == -1) { break; } else if ( wait == 1) { result = mkv_decode_get_audio((struct mkv_decode_struct *) &p->decoder, p->audio_stream, p->audio_channel, 1, p->volume_boost); if (result != 0) { p->return_result = result; p->return_request = 1; break; } if (sceKernelSignalSema(p->semaphore_can_get_audio, 1) < 0) { p->return_result = "mkv_play_start: sceKernelSignalSema failed on semaphore_can_get_audio"; p->return_request = 1; break; } } } mkv_play_do_seek(p); if ((p->loop == 1) && (mkv_decode_is_eof((struct mkv_decode_struct *) &p->decoder))) { cached_video_frame = 0; mkv_play_reset(p); } sceKernelDelayThread(10); } if (mkv_decode_is_eof((struct mkv_decode_struct *) &p->decoder)) { 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 *mkv_play_open(struct mkv_play_struct *p, struct movie_file_struct *movie, int usePos, int pspType, int tvAspectRatio, int tvWidth, int tvHeight, int videoMode) { mkv_play_safe_constructor(p); p->subtitle = 0; p->subtitle_count = 0; char *result = mkv_decode_open(&p->decoder, movie->movie_file, pspType, tvAspectRatio, tvWidth, tvHeight, videoMode); if (result != 0) { mkv_play_close(p, 0, pspType); return(result); } if (subtitle_parse_search( movie, p->decoder.reader.file.video_rate, p->decoder.reader.file.video_scale, &p->subtitle_count)==0) p->subtitle = 1; if ( cooleyesAudioSetFrequency(sceKernelDevkitVersion(), p->decoder.reader.file.audio_rate) != 0) { mkv_play_close(p, 0, pspType); return("mkv_play_open: sceAudioSetFrequency failed"); } p->audio_reserved = sceAudioChReserve(0, p->decoder.reader.file.audio_resample_scale, PSP_AUDIO_FORMAT_STEREO); if (p->audio_reserved < 0) { mkv_play_close(p, 0, pspType); return("mkv_play_open: sceAudioChReserve failed"); } p->semaphore_can_get_video = sceKernelCreateSema("can_get_video", 0, 0, p->decoder.number_of_frame_buffers, 0); if (p->semaphore_can_get_video < 0) { mkv_play_close(p, 0, pspType); return("mkv_play_open: sceKernelCreateSema failed on semaphore_can_get_video"); } p->semaphore_can_put_video = sceKernelCreateSema("can_put_video", 0, p->decoder.number_of_frame_buffers, p->decoder.number_of_frame_buffers, 0); if (p->semaphore_can_put_video < 0) { mkv_play_close(p, 0, pspType); return("mkv_play_open: sceKernelCreateSema failed on semaphore_can_put_video"); } p->semaphore_can_get_audio = sceKernelCreateSema("can_get_audio", 0, 0, p->decoder.number_of_frame_buffers, 0); if (p->semaphore_can_get_audio < 0) { mkv_play_close(p, 0, pspType); return("mkv_play_open: sceKernelCreateSema failed on semaphore_can_get_audio"); } p->semaphore_can_put_audio = sceKernelCreateSema("can_put_audio", 0, p->decoder.number_of_frame_buffers, p->decoder.number_of_frame_buffers, 0); if (p->semaphore_can_put_audio < 0) { mkv_play_close(p, 0, pspType); return("mkv_play_open: sceKernelCreateSema failed on semaphore_can_put_audio"); } //p->output_thread = sceKernelCreateThread("output", mkv_output_thread, 0x8, 0x10000, 0, 0); p->output_thread = sceKernelCreateThread("output", mkv_output_thread, 0x3D, 0x10000, PSP_THREAD_ATTR_USER, 0); if (p->output_thread < 0) { mkv_play_close(p, 0, pspType); return("mkv_play_open: sceKernelCreateThread failed on output_thread"); } //p->show_thread = sceKernelCreateThread("show", mkv_show_thread, 0x8, 0x10000, 0, 0); p->show_thread = sceKernelCreateThread("show", mkv_show_thread, 0x3F, 0x10000, PSP_THREAD_ATTR_USER, 0); if (p->show_thread < 0) { mkv_play_close(p, 0, pspType); return("mkv_play_open: sceKernelCreateThread failed on show_thread"); } p->return_request = 0; p->return_result = 0; p->paused = 0; p->seek = 0; p->current_timestamp = 0; p->audio_stream = 0; p->audio_channel = 0; 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) mkv_stat_load( p ); return(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -