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

📄 mpeg3video.c

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 C
📖 第 1 页 / 共 2 页
字号:
	pthread_mutex_destroy(&(video->slice_lock));
#else
	SDL_DestroyMutex(video->test_lock);
	SDL_DestroyMutex(video->slice_lock);
#endif
	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]));

	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)
{
	if(video->decoder_initted)
	{
		mpeg3video_deletedecoder(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 + -