tsdemux: doesn't handle streams without PCR
Submitted by dka..@..il.com
Link to original bug (#752843)
Description
Hi,
I'm trying to make GoPro 4 live preview (mpegts stream) to work with GStreamer and faced with an issue, that tsdemux doesn't push packet further, because it expects PTS/DTS timestamps. On iOS.
The problem is, GoPro 4 doesn't set those in PES header. I'm not quite sure why or whether it is correct behaviour for mpeg ts stream broadcaster. But the thing is, I was able to play this stream with ffplay. I dind't go further in comparing ffmpeg mpegts demux with tsdemux. Maybe there's some well know limitation in GStreamer.
I would really appriciate any help on this. I'll attach everything I have:
- gopro.pcap - mpegts UDP steam from GoPro Hero 4 Silver
- gopro_stream_conf - mpegst stream config (from ffprobe)
https://www.dropbox.com/s/vjrsiapwq4goyqk/gopro_stream_conf?dl=0 - gopro_gst_log - filtered debug log for tsdemux and mpegtsbase
https://www.dropbox.com/s/4e9r5hiziim4sb5/gopro_gst_log?dl=0
As for Pipeline, it doesn't really matter, I was testing the simpliest:
udpsrc port=8554 buffer-size=5000 ! tsdemux name=demux demux.video_1011 ! queue ! decodebin ! autovideosink demux.video_0200 ! fakesink demux.audio_1100 ! fakesink
How to simulate GoPro mpegts:
- Install http://tcpreplay.synfin.net/
- Download gopro.pcap
- Get sMAC of source (machine which is going to stream) and destination dMAC (who's going to receive stream). For test purpose it is going to be the same machine (loopback test):
tcprewrite --enet-smac=e4:ce:8f:3c:63:b2 --enet-dmac=e4:ce:8f:3c:63:b2 --infile=gopro.pcap --outfile=output.pcap
--enet-smac our sMAC
--enet-dmac our dMAC
- Generate cache:
tcpprep --auto=bridge --pcap=output.pcap --cachefile=input.cache
- Replays IPs. Again we need sIP (machine which is going to stream) and dIP who's going to receive stream. For test purpose it is going to be the same machine (loopback test):
tcprewrite --endpoints=192.168.14.137:192.168.14.137 --cachefile=input.cache --infile=output.pcap --outfile=output2.pcap --skipbroadcast
formats for IPs: sIP:dIP
-
Now we have output2.pcap which is ready to playback
-
sudo tcpreplay --intf1=en1 output2.pcap
en1 - network interface -
Finaly. You could verify the stream with: ffplay udp://:8554