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);