⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mkv_play.c.svn-base

📁 psp播放器PPA源码,在MSYS/CYGWIN环境下编译(GNU-C)
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
	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 + -