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

📄 pmp_play.c.svn-base

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