mirror of
https://github.com/mpv-player/mpv
synced 2025-01-09 01:36:25 +01:00
simplified
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2572 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
717220bc55
commit
bac8e0b06c
155
mencoder.c
155
mencoder.c
@ -13,7 +13,6 @@
|
||||
|
||||
#include "stream.h"
|
||||
#include "demuxer.h"
|
||||
#include "parse_es.h"
|
||||
#include "stheader.h"
|
||||
|
||||
#include "aviwrite.h"
|
||||
@ -22,29 +21,7 @@
|
||||
|
||||
#include <encore2.h>
|
||||
|
||||
char *get_path(char *filename){
|
||||
char *homedir;
|
||||
char *buff;
|
||||
static char *config_dir = "/.mplayer";
|
||||
int len;
|
||||
|
||||
if ((homedir = getenv("HOME")) == NULL)
|
||||
return NULL;
|
||||
len = strlen(homedir) + strlen(config_dir) + 1;
|
||||
if (filename == NULL) {
|
||||
if ((buff = (char *) malloc(len)) == NULL)
|
||||
return NULL;
|
||||
sprintf(buff, "%s%s", homedir, config_dir);
|
||||
} else {
|
||||
len += strlen(filename) + 1;
|
||||
if ((buff = (char *) malloc(len)) == NULL)
|
||||
return NULL;
|
||||
sprintf(buff, "%s%s/%s", homedir, config_dir, filename);
|
||||
}
|
||||
return buff;
|
||||
}
|
||||
|
||||
#define ABS(x) (((x)>=0)?(x):(-(x)))
|
||||
#include "get_path.c"
|
||||
|
||||
//--------------------------
|
||||
|
||||
@ -58,9 +35,6 @@ extern int cache_fill_status;
|
||||
// AVI demuxer params:
|
||||
static float c_total=0;
|
||||
int delay_corrected=1;
|
||||
extern int index_mode; // -1=untouched 0=don't use index 1=use (geneate) index
|
||||
extern int force_ni;
|
||||
extern int pts_from_bps;
|
||||
|
||||
char *audio_codec=NULL; // override audio codec
|
||||
char *video_codec=NULL; // override video codec
|
||||
@ -80,22 +54,11 @@ static double audio_time_usage=0;
|
||||
static int total_time_usage_start=0;
|
||||
static int benchmark=0;
|
||||
|
||||
int divx_quality=0;
|
||||
int force_fps=0;
|
||||
|
||||
#include "libmpeg2/mpeg2.h"
|
||||
#include "libmpeg2/mpeg2_internal.h"
|
||||
|
||||
extern picture_t *picture; // exported from libmpeg2/decode.c
|
||||
|
||||
int frameratecode2framerate[16] = {
|
||||
0,
|
||||
// Official mpeg1/2 framerates:
|
||||
24000*10000/1001, 24*10000,25*10000, 30000*10000/1001, 30*10000,50*10000,60000*10000/1001, 60*10000,
|
||||
// libmpeg3's "Unofficial economy rates":
|
||||
1*10000,5*10000,10*10000,12*10000,15*10000,0,0
|
||||
};
|
||||
|
||||
static unsigned char* vo_image=NULL;
|
||||
static unsigned char* vo_image_ptr=NULL;
|
||||
static int vo_w,vo_h;
|
||||
@ -339,114 +302,28 @@ signal(SIGTERM,exit_sighandler); // kill
|
||||
|
||||
while(!eof){
|
||||
|
||||
float frame_time=1;
|
||||
float pts1=d_video->pts;
|
||||
float frame_time=0;
|
||||
int blit_frame=0;
|
||||
float a_pts=0;
|
||||
float v_pts=0;
|
||||
|
||||
// current_module="decode_video";
|
||||
//-------------------- Decode a frame: -----------------------
|
||||
{ unsigned char* start=NULL;
|
||||
int in_size;
|
||||
// get it!
|
||||
// current_module="video_read_frame";
|
||||
in_size=video_read_frame(sh_video,&frame_time,&start,force_fps);
|
||||
if(in_size<0){ eof=1; break; }
|
||||
if(in_size>max_framesize) max_framesize=in_size; // stats
|
||||
// decode:
|
||||
// current_module="decode_video";
|
||||
// printf("Decode! %p %d \n",start,in_size);
|
||||
blit_frame=decode_video(video_out,sh_video,start,in_size,drop_frame);
|
||||
}
|
||||
//------------------------ frame decoded. --------------------
|
||||
|
||||
//-------------------- Decode a frame: -----------------------
|
||||
|
||||
if(demuxer->file_format==DEMUXER_TYPE_MPEG_ES || demuxer->file_format==DEMUXER_TYPE_MPEG_PS){
|
||||
int in_frame=0;
|
||||
float newfps;
|
||||
//videobuf_len=0;
|
||||
while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){
|
||||
int i=sync_video_packet(d_video);
|
||||
void* buffer=&videobuffer[videobuf_len+4];
|
||||
if(in_frame){
|
||||
if(i<0x101 || i>=0x1B0){ // not slice code -> end of frame
|
||||
#if 1
|
||||
// send END OF FRAME code:
|
||||
videobuffer[videobuf_len+0]=0;
|
||||
videobuffer[videobuf_len+1]=0;
|
||||
videobuffer[videobuf_len+2]=1;
|
||||
videobuffer[videobuf_len+3]=0xFF;
|
||||
videobuf_len+=4;
|
||||
#endif
|
||||
if(!i) eof=2; // EOF
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
//if(i==0x100) in_frame=1; // picture startcode
|
||||
if(i>=0x101 && i<0x1B0) in_frame=1; // picture startcode
|
||||
else if(!i){ eof=3; break;} // EOF
|
||||
}
|
||||
if(!read_video_packet(d_video)){ eof=4; break;} // EOF
|
||||
//printf("read packet 0x%X, len=%d\n",i,videobuf_len);
|
||||
if(sh_video->codec->driver!=VFM_MPEG){
|
||||
// if not libmpeg2:
|
||||
switch(i){
|
||||
case 0x1B3: header_process_sequence_header (picture, buffer);break;
|
||||
case 0x1B5: header_process_extension (picture, buffer);break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//if(videobuf_len>max_framesize) max_framesize=videobuf_len; // debug
|
||||
//printf("--- SEND %d bytes\n",videobuf_len);
|
||||
|
||||
blit_frame=decode_video(&video_out,sh_video,videobuffer,videobuf_len,0);
|
||||
|
||||
// get mpeg fps:
|
||||
newfps=frameratecode2framerate[picture->frame_rate_code]*0.0001f;
|
||||
if(ABS(sh_video->fps-newfps)>0.01f) {
|
||||
mp_msg(MSGT_CPLAYER,MSGL_WARN,"Warning! FPS changed %5.3f -> %5.3f (%f) [%d] \n",sh_video->fps,newfps,sh_video->fps-newfps,picture->frame_rate_code);
|
||||
sh_video->fps=newfps;
|
||||
sh_video->frametime=10000.0f/(float)frameratecode2framerate[picture->frame_rate_code];
|
||||
}
|
||||
|
||||
// fix mpeg2 frametime:
|
||||
frame_time=(picture->display_time)*0.01f;
|
||||
picture->display_time=100;
|
||||
videobuf_len=0;
|
||||
|
||||
} else {
|
||||
// frame-based file formats: (AVI,ASF,MOV)
|
||||
unsigned char* start=NULL;
|
||||
int in_size=ds_get_packet(d_video,&start);
|
||||
if(in_size<0){ eof=5;break;}
|
||||
//if(in_size>max_framesize) max_framesize=in_size;
|
||||
if(mux_v->codec){
|
||||
// convert
|
||||
blit_frame=decode_video(&video_out,sh_video,start,in_size,0);
|
||||
} else {
|
||||
// copy
|
||||
mux_v->buffer=start;
|
||||
aviwrite_write_chunk(muxer,mux_v,muxer_f,in_size,(sh_video->ds->flags&1)?0x10:0);
|
||||
}
|
||||
}
|
||||
if(eof) break;
|
||||
|
||||
//------------------------ frame decoded. --------------------
|
||||
|
||||
// Increase video timers:
|
||||
sh_video->num_frames+=frame_time;
|
||||
++sh_video->num_frames_decoded;
|
||||
frame_time*=sh_video->frametime;
|
||||
if(demuxer->file_format==DEMUXER_TYPE_ASF && !force_fps){
|
||||
// .ASF files has no fixed FPS - just frame durations!
|
||||
float d=d_video->pts-pts1;
|
||||
if(d>=0 && d<5) frame_time=d;
|
||||
if(d>0){
|
||||
if(verbose)
|
||||
if((int)sh_video->fps==1000)
|
||||
mp_msg(MSGT_CPLAYER,MSGL_STATUS,"\rASF framerate: %d fps \n",(int)(1.0f/d));
|
||||
sh_video->frametime=d; // 1ms
|
||||
sh_video->fps=1.0f/d;
|
||||
}
|
||||
} else
|
||||
if(demuxer->file_format==DEMUXER_TYPE_MOV && !force_fps){
|
||||
// .MOV files has no fixed FPS - just frame durations!
|
||||
float d=d_video->pts-pts1;
|
||||
frame_time=d;
|
||||
}
|
||||
sh_video->timer+=frame_time;
|
||||
|
||||
if(demuxer->file_format==DEMUXER_TYPE_MPEG_PS) d_video->pts+=frame_time;
|
||||
|
||||
if(pts_from_bps){
|
||||
unsigned int samples=(sh_audio->audio.dwSampleSize)?
|
||||
((ds_tell(d_audio)-sh_audio->a_in_buffer_len)/sh_audio->audio.dwSampleSize) :
|
||||
|
Loading…
Reference in New Issue
Block a user