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

📄 mpeg3video.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	//pthread_mutex_destroy(&(video->slice_lock));#else	SDL_DestroyMutex(video->test_lock);#endif	SDL_DestroyMutex(video->slice_lock);	SDL_DestroySemaphore(video->slice_complete_sem);	if(video->x_table)	{		free(video->x_table);		free(video->y_table);	}	if(video->total_slice_decoders)	{		for(i = 0; i < video->total_slice_decoders; i++)			mpeg3_delete_slice_decoder(&(video->slice_decoders[i]));	}	for(i = 0; i < video->slice_buffers_initialized; i++)		mpeg3_delete_slice_buffer(&(video->slice_buffers[i]));	if(video->decoder_initted)	{		mpeg3video_deletedecoder(video);	}	free(video);	return 0;}int mpeg3video_read_frame_backend(mpeg3video_t *video, int skip_bframes){	int result = 0;	if(mpeg3bits_eof(video->vstream)) result = 1;	if(!result) result = mpeg3video_get_header(video, 0);//printf("frame type %d\n", video->pict_type);/* skip_bframes is the number of bframes we can skip successfully. *//* This is in case a skipped B-frame is repeated and the second repeat happens *//* to be a B frame we need. */	video->skip_bframes = skip_bframes;	if(!result)		result = mpeg3video_getpicture(video, video->framenum);#ifdef HAVE_MMX	if(video->have_mmx)		__asm__ __volatile__ ("emms");#endif	if(!result)	{		video->last_number = video->framenum;		video->framenum++;	}	return result;}int* mpeg3video_get_scaletable(int input_w, int output_w){	int *result = malloc(sizeof(int) * output_w);	float i;	float scale = (float)input_w / output_w;	for(i = 0; i < output_w; i++)	{		result[(int)i] = (int)(scale * i);	}	return result;}/* Get the first I frame. */int mpeg3video_get_firstframe(mpeg3video_t *video,			      unsigned char *input, 			      long size){	int result = 0;	video->repeat_count = video->current_repeat = 0;	return mpeg3video_process_frame(video, input, size);}int mpeg3video_process_frame(mpeg3video_t *video,			     unsigned char *input, 			     long size){	mpeg3bits_use_ptr_len(video->vstream, input, size);	return mpeg3video_read_frame_backend(video, 0);}static long gop_to_frame(mpeg3video_t *video, mpeg3_timecode_t *gop_timecode){	int hour, minute, second, frame, fps;	long result;// Mirror of what mpeg2enc does	fps = (int)(video->frame_rate + 0.5);	hour = gop_timecode->hour;	minute = gop_timecode->minute;	second = gop_timecode->second;	frame = gop_timecode->frame;		result = (long)hour * 60 * 60 * fps + 		minute * 60 * fps + 		second * fps +		frame;		return result;}/* ======================================================================= *//*                                    ENTRY POINTS *//* ======================================================================= */mpeg3video_t* mpeg3video_new(int is_video_stream,			     int cpus){	mpeg3video_t *video;	int result = 0;	video = mpeg3video_allocate_struct();	video->cpus = cpus;	return video;}int mpeg3video_delete(mpeg3video_t *video){	mpeg3video_delete_struct(video);	return 0;}int mpeg3video_set_cpus(mpeg3video_t *video, int cpus){	return 0;}int mpeg3video_set_mmx(mpeg3video_t *video, int use_mmx){	video->have_mmx = use_mmx;	mpeg3video_init_scantables(video);	return 0;}int mpeg3video_read_frame(mpeg3video_t *video, 			  unsigned char *input,			  long input_size,			  unsigned char **output_rows,			  int in_x, 			  int in_y, 			  int in_w, 			  int in_h, 			  int out_w, 			  int out_h, 			  int color_model){	int result = 0;	mpeg3bits_use_ptr_len(video->vstream, input, input_size); 	video->want_yvu = 0;	video->output_rows = output_rows;	video->color_model = color_model;//printf("mpeg3video_read_frame 1\n");/* Get scaling tables */	if(video->out_w != out_w || video->out_h != out_h ||		video->in_w != in_w || video->in_h != in_h ||		video->in_x != in_x || video->in_y != in_y)	{		if(video->x_table)		{			free(video->x_table);			free(video->y_table);			video->x_table = 0;			video->y_table = 0;		}	}	video->out_w = out_w;	video->out_h = out_h;	video->in_w = in_w;	video->in_h = in_h;	video->in_x = in_x;	video->in_y = in_y;	if(!video->x_table)	{		video->x_table = mpeg3video_get_scaletable(video->in_w, video->out_w);		video->y_table = mpeg3video_get_scaletable(video->in_h, video->out_h);	}//printf("mpeg3video_read_frame 4\n");	if(!result) result = mpeg3video_read_frame_backend(video, 0);//printf("mpeg3video_read_frame 5\n");	if(video->output_src) mpeg3video_present_frame(video);//printf("mpeg3video_read_frame 6\n");	return result;}int mpeg3video_read_yuvframe(mpeg3video_t *video, 			     unsigned char *input,			     long input_size,			     char *y_output,			     char *u_output,			     char *v_output,			     int in_x,			     int in_y,			     int in_w,			     int in_h){	int result = 0;	mpeg3bits_use_ptr_len(video->vstream, input, input_size); 	video->want_yvu = 1;	video->y_output = y_output;	video->u_output = u_output;	video->v_output = v_output;	video->in_x = in_x;	video->in_y = in_y;	video->in_w = in_w;	video->in_h = in_h;	if(!result) result = mpeg3video_read_frame_backend(video, 0);	if(video->output_src) mpeg3video_present_frame(video);	video->want_yvu = 0;	video->percentage_seek = -1;	return result;}int mpeg3video_read_yuvframe_ptr(mpeg3video_t *video, 				 unsigned char *input,				 long input_size,				 char **y_output,				 char **u_output,				 char **v_output){	int result = 0;	mpeg3bits_use_ptr_len(video->vstream, input, input_size); 	video->want_yvu = 1;	if(!result) result = mpeg3video_read_frame_backend(video, 0);	if (video->output_src) {	*y_output = video->output_src[0];	*u_output = video->output_src[1];	*v_output = video->output_src[2];	}	video->want_yvu = 0;	video->percentage_seek = -1;	return result;}int mpeg3video_colormodel(mpeg3video_t *video){	switch(video->chroma_format)	{		case CHROMA422:			return MPEG3_YUV422P;			break;		case CHROMA420:			return MPEG3_YUV420P;			break;	}	return MPEG3_YUV420P;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -