mirror of
https://github.com/mpv-player/mpv
synced 2025-01-09 01:36:25 +01:00
dvd sub support reading
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@553 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
ff0df4b392
commit
2634fd42b2
@ -60,8 +60,10 @@ struct config conf[]={
|
||||
{"noalsa", &alsa, CONF_TYPE_FLAG, 0, 1, 0},
|
||||
{"ni", &force_ni, CONF_TYPE_FLAG, 0, 0, 1},
|
||||
{"noni", &force_ni, CONF_TYPE_FLAG, 0, 1, 0},
|
||||
|
||||
{"aid", &audio_id, CONF_TYPE_INT, CONF_RANGE, 0, 256},
|
||||
{"vid", &video_id, CONF_TYPE_INT, CONF_RANGE, 0, 256},
|
||||
{"sid", &dvdsub_id, CONF_TYPE_INT, CONF_RANGE, 0, 32},
|
||||
|
||||
{"dumpfile", &stream_dump_name, CONF_TYPE_STRING, 0, 0, 0},
|
||||
{"dumpaudio", &stream_dump_type, CONF_TYPE_FLAG, 0, 0, 1},
|
||||
@ -78,7 +80,7 @@ struct config conf[]={
|
||||
{"pp", &divx_quality, CONF_TYPE_INT, CONF_RANGE, 0, 63},
|
||||
{"br", &encode_bitrate, CONF_TYPE_INT, CONF_RANGE, 10000, 10000000},
|
||||
#ifdef HAVE_PNG
|
||||
{"z", &z_compression, CONF_TYPE_INT, CONF_RANGE, 0, 9},
|
||||
{"z", &z_compression, CONF_TYPE_INT, CONF_RANGE, 0, 10},
|
||||
#endif
|
||||
|
||||
{"x", &screen_size_x, CONF_TYPE_INT, CONF_RANGE, 1, 4096},
|
||||
|
47
demux_mpg.c
47
demux_mpg.c
@ -3,6 +3,10 @@
|
||||
//#define MAX_PS_PACKETSIZE 2048
|
||||
#define MAX_PS_PACKETSIZE (224*1024)
|
||||
|
||||
static void parse_dvdsub(unsigned char *buf,int len){
|
||||
printf("\rDVDsub packet: %d \n",len);
|
||||
}
|
||||
|
||||
static int mpeg_pts_error=0;
|
||||
|
||||
static unsigned int read_mpeg_timestamp(stream_t *s,int c){
|
||||
@ -112,11 +116,36 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){
|
||||
|
||||
//============== DVD Audio sub-stream ======================
|
||||
if(id==0x1BD){
|
||||
int aid=128+(stream_read_char(demux->stream)&0x7F);--len;
|
||||
int aid=stream_read_char(demux->stream);--len;
|
||||
if(len<3) return -1; // invalid audio packet
|
||||
|
||||
// AID:
|
||||
// 0x20..0x3F subtitle
|
||||
// 0x80..0x9F AC3 audio
|
||||
// 0xA0..0xBF PCM audio
|
||||
|
||||
if((aid & 0xE0) == 0x20){
|
||||
// subtitle:
|
||||
aid&=0x1F;
|
||||
|
||||
if(!avi_header.a_streams[aid]) new_sh_audio(aid);
|
||||
if(demux->audio->id==-1) demux->audio->id=aid;
|
||||
if(!avi_header.s_streams[aid]){
|
||||
printf("==> Found subtitle: %d\n",aid);
|
||||
avi_header.s_streams[aid]=1;
|
||||
// new_sh_audio(aid);
|
||||
}
|
||||
|
||||
//if(demux->audio->id==-1) demux->audio->id=aid; // autodetect :)
|
||||
if(demux->sub->id==aid){
|
||||
ds=demux->sub;
|
||||
}
|
||||
|
||||
} else if((aid & 0xC0) == 0x80) {
|
||||
|
||||
// aid=128+(aid&0x7F);
|
||||
// aid=0x80..0xBF
|
||||
|
||||
if(!avi_header.a_streams[aid]) new_sh_audio(aid);
|
||||
if(demux->audio->id==-1) demux->audio->id=aid;
|
||||
|
||||
if(demux->audio->id==aid){
|
||||
// int type;
|
||||
@ -130,7 +159,7 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){
|
||||
len-=3;
|
||||
if(ds->type==-1){
|
||||
// autodetect type
|
||||
ds->type=((aid&0x70)==0x20)?2:3;
|
||||
ds->type=((aid&0xE0)==0xA0)?2:3;
|
||||
}
|
||||
if(ds->type==2 && len>=2){
|
||||
// read PCM header
|
||||
@ -144,8 +173,11 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){
|
||||
}
|
||||
if(!len) printf("End of packet while searching for PCM header\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
} // if(demux->audio->id==aid)
|
||||
|
||||
} else printf("Unknown 0x1BD substream: 0x%02X \n",aid);
|
||||
|
||||
} //if(id==0x1BD)
|
||||
|
||||
} else {
|
||||
if(c!=0x0f){
|
||||
@ -194,6 +226,7 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){
|
||||
}
|
||||
#endif
|
||||
ds_read_packet(ds,demux->stream,len,pts/90000.0f,0);
|
||||
if(ds==demux->sub) parse_dvdsub(ds->last->buffer,ds->last->len);
|
||||
return 1;
|
||||
}
|
||||
if(verbose>=2) printf("DEMUX_MPG: Skipping %d data bytes from packet %04X\n",len,id);
|
||||
@ -256,12 +289,14 @@ do{
|
||||
} // else
|
||||
if(demux->synced==2){
|
||||
ret=demux_mpg_read_packet(demux,head);
|
||||
/*
|
||||
if(!ret)
|
||||
if(--max_packs==0){
|
||||
demux->stream->eof=1;
|
||||
printf("demux: file doesn't contain the selected audio or video stream\n");
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
} else {
|
||||
if(head>=0x100 && head<0x1B0){
|
||||
if(head==0x100)
|
||||
|
@ -94,15 +94,17 @@ typedef struct demuxer_st {
|
||||
// int time_src;// time source (pts/file/bps)
|
||||
demux_stream_t *audio;
|
||||
demux_stream_t *video;
|
||||
demux_stream_t *sub;
|
||||
} demuxer_t;
|
||||
|
||||
demuxer_t* new_demuxer(stream_t *stream,int type,int a_id,int v_id){
|
||||
demuxer_t* new_demuxer(stream_t *stream,int type,int a_id,int v_id,int s_id){
|
||||
demuxer_t *d=malloc(sizeof(demuxer_t));
|
||||
d->stream=stream;
|
||||
d->synced=0;
|
||||
d->filepos=0;
|
||||
d->audio=new_demuxer_stream(d,a_id);
|
||||
d->video=new_demuxer_stream(d,v_id);
|
||||
d->sub=new_demuxer_stream(d,s_id);
|
||||
d->type=type;
|
||||
return d;
|
||||
}
|
||||
|
12
mplayer.c
12
mplayer.c
@ -251,6 +251,7 @@ typedef struct {
|
||||
// streams:
|
||||
sh_audio_t* a_streams[256];
|
||||
sh_video_t* v_streams[256];
|
||||
char s_streams[32]; // dvd subtitles
|
||||
// video:
|
||||
unsigned int bitrate;
|
||||
} avi_header_t;
|
||||
@ -462,6 +463,7 @@ int alsa=0;
|
||||
int audio_buffer_size=-1;
|
||||
int audio_id=-1;
|
||||
int video_id=-1;
|
||||
int dvdsub_id=-1;
|
||||
float default_max_pts_correction=0.01f;
|
||||
int delay_corrected=1;
|
||||
float force_fps=0;
|
||||
@ -497,7 +499,7 @@ char *sub_name=NULL;
|
||||
float sub_delay=0;
|
||||
float sub_fps=0;
|
||||
int sub_auto = 1;
|
||||
char stream_dump_name=NULL;
|
||||
char *stream_dump_name=NULL;
|
||||
int stream_dump_type=0;
|
||||
//int user_bpp=0;
|
||||
|
||||
@ -638,7 +640,7 @@ if(!has_audio) audio_id=-2; // do NOT read audio packets...
|
||||
|
||||
//=============== Try to open as AVI file: =================
|
||||
stream_reset(stream);
|
||||
demuxer=new_demuxer(stream,DEMUXER_TYPE_AVI,audio_id,video_id);
|
||||
demuxer=new_demuxer(stream,DEMUXER_TYPE_AVI,audio_id,video_id,dvdsub_id);
|
||||
stream_seek(demuxer->stream,seek_to_byte);
|
||||
{ //---- RIFF header:
|
||||
int id=stream_read_dword_le(demuxer->stream); // "RIFF"
|
||||
@ -654,7 +656,7 @@ stream_seek(demuxer->stream,seek_to_byte);
|
||||
//=============== Try to open as ASF file: =================
|
||||
if(file_format==DEMUXER_TYPE_UNKNOWN){
|
||||
stream_reset(stream);
|
||||
demuxer=new_demuxer(stream,DEMUXER_TYPE_ASF,audio_id,video_id);
|
||||
demuxer=new_demuxer(stream,DEMUXER_TYPE_ASF,audio_id,video_id,dvdsub_id);
|
||||
stream_seek(demuxer->stream,seek_to_byte);
|
||||
if(asf_check_header()){
|
||||
printf("Detected ASF file format!\n");
|
||||
@ -664,7 +666,7 @@ if(file_format==DEMUXER_TYPE_UNKNOWN){
|
||||
//=============== Try to open as MPEG-PS file: =================
|
||||
if(file_format==DEMUXER_TYPE_UNKNOWN){
|
||||
stream_reset(stream);
|
||||
demuxer=new_demuxer(stream,DEMUXER_TYPE_MPEG_PS,audio_id,video_id);
|
||||
demuxer=new_demuxer(stream,DEMUXER_TYPE_MPEG_PS,audio_id,video_id,dvdsub_id);
|
||||
stream_seek(demuxer->stream,seek_to_byte);
|
||||
if(audio_format) demuxer->audio->type=audio_format; // override audio format
|
||||
if(ds_fill_buffer(demuxer->video)){
|
||||
@ -688,7 +690,7 @@ if(file_format==DEMUXER_TYPE_UNKNOWN){
|
||||
//=============== Try to open as MPEG-ES file: =================
|
||||
if(file_format==DEMUXER_TYPE_MPEG_ES){ // little hack, see above!
|
||||
stream_reset(stream);
|
||||
demuxer=new_demuxer(stream,DEMUXER_TYPE_MPEG_ES,audio_id,video_id);
|
||||
demuxer=new_demuxer(stream,DEMUXER_TYPE_MPEG_ES,audio_id,video_id,dvdsub_id);
|
||||
stream_seek(demuxer->stream,seek_to_byte);
|
||||
if(!ds_fill_buffer(demuxer->video)){
|
||||
printf("Invalid MPEG-ES stream??? contact the author, it may be a bug :(\n");
|
||||
|
Loading…
Reference in New Issue
Block a user