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