summaryrefslogtreecommitdiffstats
path: root/mplayer.c
diff options
context:
space:
mode:
authoralbeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-05-17 23:47:27 +0000
committeralbeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-05-17 23:47:27 +0000
commit7562937d959ec617d4f78fd6d06aed7164b22255 (patch)
treecb02ee86d7cd802d4e20e0f077e07b57b9c188b0 /mplayer.c
parent517a1ee64f4c6caf9b542bdf18f2a95c5298a3e0 (diff)
downloadmpv-7562937d959ec617d4f78fd6d06aed7164b22255.tar.bz2
mpv-7562937d959ec617d4f78fd6d06aed7164b22255.tar.xz
Improvment for spu subtitles.
Removed the integreted spudec in vobsub. Various cleanup/bugfix in vobsub (no more auto palette when a true one is here) HW spu rendering moved in spudec because we first need to reassable the packet before sending them to the hw. Spudec is now created only if nedded. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@6111 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'mplayer.c')
-rw-r--r--mplayer.c95
1 files changed, 55 insertions, 40 deletions
diff --git a/mplayer.c b/mplayer.c
index 9b9c38afa2..e670d24e07 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -279,6 +279,7 @@ static unsigned int inited_flags=0;
#define INITED_SPUDEC 32
#define INITED_STREAM 64
#define INITED_INPUT 128
+#define INITED_VOBSUB 256
#define INITED_ALL 0xFFFF
void uninit_player(unsigned int mask){
@@ -310,6 +311,13 @@ void uninit_player(unsigned int mask){
getch2_disable();
}
+ if(mask&INITED_VOBSUB){
+ inited_flags&=~INITED_VOBSUB;
+ current_module="uninit_vobsub";
+ vobsub_close(vo_vobsub);
+ vo_vobsub=NULL;
+ }
+
if (mask&INITED_SPUDEC){
inited_flags&=~INITED_SPUDEC;
current_module="uninit_spudec";
@@ -854,7 +862,7 @@ if(!use_stdin && !slave_mode){
current_module="vobsub";
if (vobsub_name){
- vo_vobsub=vobsub_open(vobsub_name,1);
+ vo_vobsub=vobsub_open(vobsub_name,spudec_ifo,1,&vo_spudec);
if(vo_vobsub==NULL)
mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadSub,vobsub_name);
}else if(sub_auto && filename && (strlen(filename)>=5)){
@@ -862,7 +870,7 @@ if(!use_stdin && !slave_mode){
char *buf = malloc((strlen(filename)-3) * sizeof(char));
memset(buf,0,strlen(filename)-3); // make sure string is terminated
strncpy(buf, filename, strlen(filename)-4);
- vo_vobsub=vobsub_open(buf,0);
+ vo_vobsub=vobsub_open(buf,spudec_ifo,0,&vo_spudec);
free(buf);
}
if(vo_vobsub)
@@ -1149,12 +1157,12 @@ if(!sh_video && !sh_audio){
demux_info_print(demuxer);
//================== Read SUBTITLES (DVD & TEXT) ==========================
-if(sh_video){
+if(d_dvdsub->id >= 0 && vo_spudec==NULL && sh_video){
if (spudec_ifo) {
unsigned int palette[16], width, height;
current_module="spudec_init_vobsub";
- if (vobsub_parse_ifo(spudec_ifo, palette, &width, &height, 1) >= 0)
+ if (vobsub_parse_ifo(NULL,spudec_ifo, palette, &width, &height, 1) >= 0)
vo_spudec=spudec_new_scaled(palette, sh_video->disp_w, sh_video->disp_h);
}
@@ -1177,13 +1185,16 @@ if (vo_spudec==NULL && stream->type==STREAMTYPE_DVD) {
if (vo_spudec==NULL) {
current_module="spudec_init_normal";
vo_spudec=spudec_new_scaled(NULL, sh_video->disp_w, sh_video->disp_h);
- spudec_set_font_factor(font_factor);
+ spudec_set_font_factor(vo_spudec,font_factor);
}
if (vo_spudec!=NULL)
inited_flags|=INITED_SPUDEC;
+}
+
#ifdef USE_SUB
+if(sh_video) {
// after reading video params we should load subtitles because
// we know fps so now we can adjust subtitles time to ~6 seconds AST
// check .sub
@@ -1198,9 +1209,9 @@ if (vo_spudec!=NULL)
}
if(subtitles && stream_dump_type==3) list_sub_file(subtitles);
if(subtitles && stream_dump_type==4) dump_mpsub(subtitles, sh_video->fps);
-#endif
-
}
+#endif
+
//================== Init AUDIO (codec) ==========================
current_module="find_audio_codec";
@@ -1335,6 +1346,9 @@ current_module="init_vo_vaa";
}
}
+ if(vo_flags & 0x08 && vo_spudec)
+ spudec_set_hw_spu(vo_spudec,video_out);
+
//================== MAIN: ==========================
main:
if(!sh_video) osd_level = 0;
@@ -2896,43 +2910,44 @@ if(rel_seek_secs || abs_seek_pos){
}
#endif
-
- // VobSub subtitles
- if(vo_vobsub){
- current_module="vobsub";
- if(d_video->pts+sub_delay>=0)
- vobsub_process(vo_vobsub,d_video->pts+sub_delay);
-
- /* Don't know how to detect wether the sub has changed or not */
- vo_osd_changed(OSDTYPE_VOBSUB);
- current_module=NULL;
- }
-
// DVD sub:
- if(vo_flags & 0x08){
- static vo_mpegpes_t packet;
- static vo_mpegpes_t *pkg=&packet;
- packet.timestamp=sh_video->timer*90000.0;
- packet.id=0x20; /* Subpic */
- while((packet.size=ds_get_packet_sub(d_dvdsub,&packet.data))>0){
- mp_msg(MSGT_CPLAYER,MSGL_V,"\rDVD sub: len=%d v_pts=%5.3f s_pts=%5.3f \n",packet.size,d_video->pts,d_dvdsub->pts);
- if(vo_config_count) video_out->draw_frame(&pkg);
- }
- }else if(vo_spudec){
- unsigned char* packet=NULL;
- int len;
- current_module="spudec";
- while((len=ds_get_packet_sub(d_dvdsub,&packet))>0){
- mp_msg(MSGT_CPLAYER,MSGL_V,"\rDVD sub: len=%d v_pts=%5.3f s_pts=%5.3f \n",len,d_video->pts,d_dvdsub->pts);
- spudec_assemble(vo_spudec,packet,len,90000*d_dvdsub->pts);
+if(vo_config_count && vo_spudec) {
+ unsigned char* packet=NULL;
+ int len,timestamp;
+ // Get a sub packet from the dvd or a vobsub and make a timestamp relative to sh_video->timer
+ int get_sub_packet(void) {
+ // Vobsub
+ len = 0;
+ if(vo_vobsub) {
+ if(d_video->pts+sub_delay>=0) {
+ // The + next_frame_time is there because we'll display the sub at the next frame
+ len = vobsub_get_packet(vo_vobsub,d_video->pts+sub_delay+next_frame_time,(void**)&packet,&timestamp);
+ if(len > 0) {
+ timestamp -= (d_video->pts + sub_delay - sh_video->timer)*90000;
+ mp_dbg(MSGT_CPLAYER,MSGL_V,"\rVOB sub: len=%d v_pts=%5.3f v_timer=%5.3f sub=%5.3f ts=%d \n",len,d_video->pts,sh_video->timer,timestamp / 90000.0);
+ }
+ }
+ } else {
+ // DVD sub
+ len = ds_get_packet_sub(d_dvdsub,(unsigned char**)&packet);
+ if(len > 0) {
+ timestamp = 90000*(sh_video->timer + d_dvdsub->pts + sub_delay - d_video->pts);
+ mp_dbg(MSGT_CPLAYER,MSGL_V,"\rDVD sub: len=%d v_pts=%5.3f s_pts=%5.3f ts=%d \n",len,d_video->pts,d_dvdsub->pts,timestamp);
+ }
}
- spudec_heartbeat(vo_spudec,90000*d_video->pts);
-
- /* Don't know how to detect wether the sub has changed or not */
- vo_osd_changed(OSDTYPE_SPU);
- current_module=NULL;
+ return len;
+ }
+ current_module="spudec";
+ spudec_heartbeat(vo_spudec,90000*sh_video->timer);
+ while(get_sub_packet()>0 && packet){
+ spudec_assemble(vo_spudec,packet,len,timestamp);
}
+ /* Don't know how to detect wether the sub has changed or not */
+ vo_osd_changed(OSDTYPE_SPU);
+ current_module=NULL;
+}
+
} // while(!eof)
mp_msg(MSGT_GLOBAL,MSGL_V,"EOF code: %d \n",eof);