Mercurial > mplayer.hg
comparison libmpdemux/demux_mpg.c @ 15670:081bee8052cf
moved mpeg-ps/es probing code to demux_mpg.c
author | nicodvb |
---|---|
date | Mon, 06 Jun 2005 21:30:53 +0000 |
parents | 39eb8a327ea9 |
children | 488f31bd127e |
comparison
equal
deleted
inserted
replaced
15669:d283a96c0ecb | 15670:081bee8052cf |
---|---|
385 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"DEMUX_MPG: Skipping %d data bytes from packet %04X\n",len,id); | 385 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"DEMUX_MPG: Skipping %d data bytes from packet %04X\n",len,id); |
386 if(len<=2356) stream_skip(demux->stream,len); | 386 if(len<=2356) stream_skip(demux->stream,len); |
387 return 0; | 387 return 0; |
388 } | 388 } |
389 | 389 |
390 int num_elementary_packets100=0; | 390 static int num_elementary_packets100=0; |
391 int num_elementary_packets101=0; | 391 static int num_elementary_packets101=0; |
392 int num_elementary_packets12x=0; | 392 static int num_elementary_packets12x=0; |
393 int num_elementary_packets1B6=0; | 393 static int num_elementary_packets1B6=0; |
394 int num_elementary_packetsPES=0; | 394 static int num_elementary_packetsPES=0; |
395 int num_h264_slice=0; //combined slice | 395 static int num_h264_slice=0; //combined slice |
396 int num_h264_dpa=0; //DPA Slice | 396 static int num_h264_dpa=0; //DPA Slice |
397 int num_h264_dpb=0; //DPB Slice | 397 static int num_h264_dpb=0; //DPB Slice |
398 int num_h264_dpc=0; //DPC Slice | 398 static int num_h264_dpc=0; //DPC Slice |
399 int num_h264_idr=0; //IDR Slice | 399 static int num_h264_idr=0; //IDR Slice |
400 int num_h264_sps=0; | 400 static int num_h264_sps=0; |
401 int num_h264_pps=0; | 401 static int num_h264_pps=0; |
402 | 402 |
403 int num_mp3audio_packets=0; | 403 static int num_mp3audio_packets=0; |
404 | |
405 int demux_mpg_probe(demuxer_t *demuxer) { | |
406 int pes=1; | |
407 int tmp; | |
408 off_t tmppos; | |
409 int file_format = DEMUXER_TYPE_UNKNOWN; | |
410 | |
411 tmppos=stream_tell(demuxer->stream); | |
412 tmp=stream_read_dword(demuxer->stream); | |
413 if(tmp==0x1E0 || tmp==0x1C0) { | |
414 tmp=stream_read_word(demuxer->stream); | |
415 if(tmp>1 && tmp<=2048) pes=0; // demuxer->synced=3; // PES... | |
416 } | |
417 stream_seek(demuxer->stream,tmppos); | |
418 | |
419 num_elementary_packets100=0; | |
420 num_elementary_packets101=0; | |
421 num_elementary_packets1B6=0; | |
422 num_elementary_packets12x=0; | |
423 num_elementary_packetsPES=0; | |
424 num_h264_slice=0; //combined slice | |
425 num_h264_dpa=0; //DPA Slice | |
426 num_h264_dpb=0; //DPB Slice | |
427 num_h264_dpc=0; //DPC Slice | |
428 num_h264_idr=0; //IDR Slice | |
429 num_h264_sps=0; | |
430 num_h264_pps=0; | |
431 num_mp3audio_packets=0; | |
432 | |
433 if(demux_mpg_open(demuxer)) | |
434 file_format=DEMUXER_TYPE_MPEG_PS; | |
435 else { | |
436 mp_msg(MSGT_DEMUX,MSGL_V,"MPEG packet stats: p100: %d p101: %d p1B6: %d p12x: %d sli: %d a: %d b: %d c: %d idr: %d sps: %d pps: %d PES: %d MP3: %d, synced: %d\n", | |
437 num_elementary_packets100,num_elementary_packets101, | |
438 num_elementary_packets1B6,num_elementary_packets12x, | |
439 num_h264_slice, num_h264_dpa, | |
440 num_h264_dpb, num_h264_dpc=0, | |
441 num_h264_idr, num_h264_sps=0, | |
442 num_h264_pps, | |
443 num_elementary_packetsPES,num_mp3audio_packets, demuxer->synced); | |
444 | |
445 //MPEG packet stats: p100: 458 p101: 458 PES: 0 MP3: 1103 (.m2v) | |
446 if(num_mp3audio_packets>50 && num_mp3audio_packets>2*num_elementary_packets100 | |
447 && abs(num_elementary_packets100-num_elementary_packets101)>2) | |
448 return file_format; | |
449 | |
450 // some hack to get meaningfull error messages to our unhappy users: | |
451 if(num_elementary_packets100>=2 && num_elementary_packets101>=2 && | |
452 abs(num_elementary_packets101+8-num_elementary_packets100)<16) { | |
453 if(num_elementary_packetsPES>=4 && num_elementary_packetsPES>=num_elementary_packets100-4) { | |
454 return file_format; | |
455 } | |
456 file_format=DEMUXER_TYPE_MPEG_ES; // <-- hack is here :) | |
457 } else | |
458 #if 1 | |
459 // fuzzy mpeg4-es detection. do NOT enable without heavy testing of mpeg formats detection! | |
460 if(num_elementary_packets1B6>3 && num_elementary_packets12x>=1 && | |
461 num_elementary_packetsPES==0 && num_elementary_packets100<=num_elementary_packets12x && | |
462 demuxer->synced<2) { | |
463 file_format=DEMUXER_TYPE_MPEG4_ES; | |
464 } else | |
465 #endif | |
466 #if 1 | |
467 // fuzzy h264-es detection. do NOT enable without heavy testing of mpeg formats detection! | |
468 if((num_h264_slice>3 || (num_h264_dpa>3 && num_h264_dpb>3 && num_h264_dpc>3)) && | |
469 /* FIXME num_h264_sps>=1 && */ num_h264_pps>=1 && num_h264_idr>=1 && | |
470 num_elementary_packets1B6==0 && num_elementary_packetsPES==0 && | |
471 demuxer->synced<2) { | |
472 file_format=DEMUXER_TYPE_H264_ES; | |
473 } else | |
474 #endif | |
475 { | |
476 if(demuxer->synced==2) | |
477 mp_msg(MSGT_DEMUXER,MSGL_ERR,"MPEG: " MSGTR_MissingVideoStreamBug); | |
478 else | |
479 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_NotSystemStream); | |
480 } | |
481 } | |
482 return file_format; | |
483 } | |
404 | 484 |
405 int demux_mpg_es_fill_buffer(demuxer_t *demux){ | 485 int demux_mpg_es_fill_buffer(demuxer_t *demux){ |
406 // Elementary video stream | 486 // Elementary video stream |
407 if(demux->stream->eof) return 0; | 487 if(demux->stream->eof) return 0; |
408 demux->filepos=stream_tell(demux->stream); | 488 demux->filepos=stream_tell(demux->stream); |