📄 mpeg3video.c
字号:
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 + -