mirror of https://github.com/mpv-player/mpv
mpeg PES steram support (only 1E0 & 1C0 packets, no 1BA/1BB headers)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@1339 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
7acec28b2d
commit
0c1bac17b9
19
demux_mpg.c
19
demux_mpg.c
|
@ -237,6 +237,7 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){
|
||||||
int num_elementary_packets100=0;
|
int num_elementary_packets100=0;
|
||||||
int num_elementary_packets101=0;
|
int num_elementary_packets101=0;
|
||||||
int num_elementary_packets1B6=0;
|
int num_elementary_packets1B6=0;
|
||||||
|
int num_elementary_packetsPES=0;
|
||||||
|
|
||||||
int demux_mpg_es_fill_buffer(demuxer_t *demux){
|
int demux_mpg_es_fill_buffer(demuxer_t *demux){
|
||||||
// Elementary video stream
|
// Elementary video stream
|
||||||
|
@ -278,6 +279,14 @@ do{
|
||||||
if(verbose>=4) printf("*** head=0x%X\n",head);
|
if(verbose>=4) printf("*** head=0x%X\n",head);
|
||||||
if(demux->synced==0){
|
if(demux->synced==0){
|
||||||
if(head==0x1BA) demux->synced=1;
|
if(head==0x1BA) demux->synced=1;
|
||||||
|
#if 0
|
||||||
|
else if(head>=0x1C0 && head<=0x1EF){
|
||||||
|
demux->synced=2;
|
||||||
|
if(verbose) printf("Mpeg PES stream synced at 0x%X (%d)!\n",demux->filepos,demux->filepos);
|
||||||
|
num_elementary_packets100=0; // requires for re-sync!
|
||||||
|
num_elementary_packets101=0; // requires for re-sync!
|
||||||
|
}
|
||||||
|
#endif
|
||||||
} else
|
} else
|
||||||
if(demux->synced==1){
|
if(demux->synced==1){
|
||||||
if(head==0x1BB || head==0x1BD || (head>=0x1C0 && head<=0x1EF)){
|
if(head==0x1BB || head==0x1BD || (head>=0x1C0 && head<=0x1EF)){
|
||||||
|
@ -300,12 +309,16 @@ do{
|
||||||
if(head==0x100) ++num_elementary_packets100; else
|
if(head==0x100) ++num_elementary_packets100; else
|
||||||
if(head==0x101) ++num_elementary_packets101;
|
if(head==0x101) ++num_elementary_packets101;
|
||||||
if(verbose>=3) printf("Opps... elementary video packet found: %03X\n",head);
|
if(verbose>=3) printf("Opps... elementary video packet found: %03X\n",head);
|
||||||
|
} else
|
||||||
|
if(head>=0x1C0 && head<0x1F0){
|
||||||
|
++num_elementary_packetsPES;
|
||||||
|
if(verbose>=3) printf("Opps... PES packet found: %03X\n",head);
|
||||||
} else
|
} else
|
||||||
if(head==0x1B6) ++num_elementary_packets1B6;
|
if(head==0x1B6) ++num_elementary_packets1B6;
|
||||||
#if 1
|
#if 1
|
||||||
if(num_elementary_packets100>50 && num_elementary_packets101>50
|
if( ( (num_elementary_packets100>50 && num_elementary_packets101>50) ||
|
||||||
&& skipped>4000000){
|
(num_elementary_packetsPES>50) ) && skipped>4000000){
|
||||||
if(verbose) printf("sync_mpeg_ps: seems to be ES stream...\n");
|
if(verbose) printf("sync_mpeg_ps: seems to be ES/PES stream...\n");
|
||||||
demux->stream->eof=1;
|
demux->stream->eof=1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
14
mplayer.c
14
mplayer.c
|
@ -187,6 +187,7 @@ int read_asf_header(demuxer_t *demuxer);
|
||||||
|
|
||||||
extern int num_elementary_packets100; // for MPEG-ES fileformat detection
|
extern int num_elementary_packets100; // for MPEG-ES fileformat detection
|
||||||
extern int num_elementary_packets101;
|
extern int num_elementary_packets101;
|
||||||
|
extern int num_elementary_packetsPES;
|
||||||
|
|
||||||
extern picture_t *picture; // exported from libmpeg2/decode.c
|
extern picture_t *picture; // exported from libmpeg2/decode.c
|
||||||
|
|
||||||
|
@ -707,16 +708,25 @@ if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_ASF){
|
||||||
}
|
}
|
||||||
//=============== Try to open as MPEG-PS file: =================
|
//=============== Try to open as MPEG-PS file: =================
|
||||||
if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_MPEG_PS){
|
if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_MPEG_PS){
|
||||||
|
int pes=1;
|
||||||
|
while(pes>=0){
|
||||||
stream_reset(stream);
|
stream_reset(stream);
|
||||||
demuxer=new_demuxer(stream,DEMUXER_TYPE_MPEG_PS,audio_id,video_id,dvdsub_id);
|
demuxer=new_demuxer(stream,DEMUXER_TYPE_MPEG_PS,audio_id,video_id,dvdsub_id);
|
||||||
stream_seek(demuxer->stream,seek_to_byte);
|
stream_seek(demuxer->stream,seek_to_byte);
|
||||||
|
if(!pes) demuxer->synced=1; // hack!
|
||||||
if(ds_fill_buffer(demuxer->video)){
|
if(ds_fill_buffer(demuxer->video)){
|
||||||
printf("Detected MPEG-PS file format!\n");
|
if(!pes)
|
||||||
|
printf("Detected MPEG-PES file format!\n");
|
||||||
|
else
|
||||||
|
printf("Detected MPEG-PS file format!\n");
|
||||||
file_format=DEMUXER_TYPE_MPEG_PS;
|
file_format=DEMUXER_TYPE_MPEG_PS;
|
||||||
} else {
|
} else {
|
||||||
// some hack to get meaningfull error messages to our unhappy users:
|
// some hack to get meaningfull error messages to our unhappy users:
|
||||||
if(num_elementary_packets100>=2 && num_elementary_packets101>=2 &&
|
if(num_elementary_packets100>=2 && num_elementary_packets101>=2 &&
|
||||||
abs(num_elementary_packets101-num_elementary_packets100)<8){
|
abs(num_elementary_packets101-num_elementary_packets100)<8){
|
||||||
|
if(num_elementary_packetsPES>=4 && num_elementary_packetsPES>=num_elementary_packets100-4){
|
||||||
|
--pes;continue; // tricky...
|
||||||
|
}
|
||||||
file_format=DEMUXER_TYPE_MPEG_ES; // <-- hack is here :)
|
file_format=DEMUXER_TYPE_MPEG_ES; // <-- hack is here :)
|
||||||
} else {
|
} else {
|
||||||
if(demuxer->synced==2)
|
if(demuxer->synced==2)
|
||||||
|
@ -725,6 +735,8 @@ if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_MPEG_PS){
|
||||||
printf("Not MPEG System Stream format... (maybe Transport Stream?)\n");
|
printf("Not MPEG System Stream format... (maybe Transport Stream?)\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//=============== Try to open as MPEG-ES file: =================
|
//=============== Try to open as MPEG-ES file: =================
|
||||||
if(file_format==DEMUXER_TYPE_MPEG_ES){ // little hack, see above!
|
if(file_format==DEMUXER_TYPE_MPEG_ES){ // little hack, see above!
|
||||||
|
|
Loading…
Reference in New Issue