portizb / ExoPlayer

An extensible media player for Android
Apache License 2.0
13 stars 5 forks source link

RtpExtractorInput.peek() may crash if RtpExtractorInput.readFromDataSource() return negative length #4

Open cdongieux opened 3 years ago

cdongieux commented 3 years ago

I'm subscribed to a French Internet provider which provides some IPTV streams in RTSP, something like this: rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=201&flavour=hd

I noticed sometimes playback failed with this stacktrace:

com.google.android.exoplayer2.demo E/LoadTask: Unexpected exception loading stream
    java.lang.ArrayIndexOutOfBoundsException: src.length=65507 srcPos=0 dst.length=76 dstPos=0 length=-3
        at java.lang.System.arraycopy(Native Method)
        at com.google.android.exoplayer2.source.rtp.extractor.RtpExtractorInput.peek(RtpExtractorInput.java:110)
        at com.google.android.exoplayer2.source.rtp.RtpPacket.sniffHeader(RtpPacket.java:308)
        at com.google.android.exoplayer2.source.rtp.extractor.RtpMp2tExtractor.read(RtpMp2tExtractor.java:69)
        at com.google.android.exoplayer2.source.rtsp.RtspSampleStreamWrapper$MediaStreamLoadable.readInternal(RtspSampleStreamWrapper.java:904)
        at com.google.android.exoplayer2.source.rtsp.RtspSampleStreamWrapper$UdpMediaStreamLoadable.loadMedia(RtspSampleStreamWrapper.java:1012)
        at com.google.android.exoplayer2.source.rtsp.RtspSampleStreamWrapper$MediaStreamLoadable.load(RtspSampleStreamWrapper.java:784)
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:415)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)

It turns out that in RtpExtractorInput.readFromDataSource() the dataSource.read() call might return -3.