Bug 1168674: [ogg] P4. Skip over header packets when seeking close to the start. r?brion draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Thu, 21 Jul 2016 17:56:01 +1000
changeset 394186 75407ad4cef7690a74f32d0fcbafc939025a86bb
parent 394185 0e172cc45989221dc6e0cf100d49f68cef1830a1
child 394187 d27d05ef4dafc31091c66de34461cf8cf05900ac
push id24516
push userbmo:jyavenard@mozilla.com
push dateFri, 29 Jul 2016 07:36:49 +0000
reviewersbrion
bugs1168674
milestone50.0a1
Bug 1168674: [ogg] P4. Skip over header packets when seeking close to the start. r?brion MozReview-Commit-ID: F0Ezo0yfOyo
dom/media/ogg/OggDemuxer.cpp
--- a/dom/media/ogg/OggDemuxer.cpp
+++ b/dom/media/ogg/OggDemuxer.cpp
@@ -857,21 +857,33 @@ OggDemuxer::GetCrypto()
 {
   return nullptr;
 }
 
 RefPtr<MediaRawData>
 OggDemuxer::GetNextPacket(TrackInfo::TrackType aType)
 {
   OggCodecState* state = GetTrackCodecState(aType);
-  DemuxUntilPacketAvailable(state);
+  ogg_packet* packet = nullptr;
+
+  do {
+    if (packet) {
+      OggCodecState::ReleasePacket(state->PacketOut());
+    }
+    DemuxUntilPacketAvailable(state);
+
+    packet = state->PacketPeek();
+  } while (packet && state->IsHeader(packet));
+
+  if (!packet) {
+    return nullptr;
+  }
 
   // Check the eos state in case we need to look for chained streams.
-  ogg_packet* packet = state->PacketPeek();
-  bool eos = packet && packet->e_o_s;
+  bool eos = packet->e_o_s;
 
   RefPtr<MediaRawData> data = state->PacketOutAsMediaRawData();;
 
   if (eos) {
     // We've encountered an end of bitstream packet; check for a chained
     // bitstream following this one.
     ReadOggChain();
   }