diff --git a/dom/media/webm/IntelWebMVideoDecoder.cpp b/dom/media/webm/IntelWebMVideoDecoder.cpp index 89535e05be..56944c174a 100644 --- a/dom/media/webm/IntelWebMVideoDecoder.cpp +++ b/dom/media/webm/IntelWebMVideoDecoder.cpp @@ -189,7 +189,7 @@ IntelWebMVideoDecoder::Demux(nsRefPtr& aSample, bool* aEOS) nsRefPtr next_holder(mReader->NextPacket(WebMReader::VIDEO)); if (next_holder) { next_tstamp = holder->Timestamp(); - mReader->PushVideoPacket(next_holder.forget()); + mReader->PushVideoPacket(next_holder); } else { next_tstamp = tstamp; next_tstamp += tstamp - mReader->GetLastVideoFrameTime(); diff --git a/dom/media/webm/NesteggPacketHolder.h b/dom/media/webm/NesteggPacketHolder.h index e3efa24d66..6439ebd98d 100644 --- a/dom/media/webm/NesteggPacketHolder.h +++ b/dom/media/webm/NesteggPacketHolder.h @@ -74,6 +74,37 @@ private: NesteggPacketHolder& operator= (NesteggPacketHolder const& aOther); }; +// Queue for holding nestegg packets. +class WebMPacketQueue { + public: + int32_t GetSize() { + return mQueue.size(); + } + + void Push(NesteggPacketHolder* aItem) { + mQueue.push_back(aItem); + } + + void PushFront(NesteggPacketHolder* aItem) { + mQueue.push_front(Move(aItem)); + } + + nsRefPtr PopFront() { + nsRefPtr result = mQueue.front(); + mQueue.pop_front(); + return result; + } + + void Reset() { + while (!mQueue.empty()) { + mQueue.pop_front(); + } + } + +private: + std::deque> mQueue; +}; + } // namespace mozilla #endif diff --git a/dom/media/webm/SoftwareWebMVideoDecoder.cpp b/dom/media/webm/SoftwareWebMVideoDecoder.cpp index 1ac618119a..7541412a94 100644 --- a/dom/media/webm/SoftwareWebMVideoDecoder.cpp +++ b/dom/media/webm/SoftwareWebMVideoDecoder.cpp @@ -131,7 +131,7 @@ SoftwareWebMVideoDecoder::DecodeVideoFrame(bool &aKeyframeSkip, nsRefPtr next_holder(mReader->NextPacket(WebMReader::VIDEO)); if (next_holder) { next_tstamp = next_holder->Timestamp(); - mReader->PushVideoPacket(next_holder.forget()); + mReader->PushVideoPacket(next_holder); } else { next_tstamp = tstamp; next_tstamp += tstamp - mReader->GetLastVideoFrameTime(); diff --git a/dom/media/webm/WebMReader.cpp b/dom/media/webm/WebMReader.cpp index 5e2948c34f..68a6ab43ed 100644 --- a/dom/media/webm/WebMReader.cpp +++ b/dom/media/webm/WebMReader.cpp @@ -543,7 +543,7 @@ bool WebMReader::DecodeAudioPacket(NesteggPacketHolder* aHolder) return true; } -already_AddRefed WebMReader::NextPacket(TrackType aTrackType) +nsRefPtr WebMReader::NextPacket(TrackType aTrackType) { // The packet queue that packets will be pushed on if they // are not the type we are interested in. @@ -580,18 +580,18 @@ already_AddRefed WebMReader::NextPacket(TrackType aTrackTyp if (hasOtherType && otherTrack == holder->Track()) { // Save the packet for when we want these packets - otherPackets.Push(holder.forget()); + otherPackets.Push(holder); continue; } // The packet is for the track we want to play if (hasType && ourTrack == holder->Track()) { - return holder.forget(); + return holder; } } while (true); } -already_AddRefed +nsRefPtr WebMReader::DemuxPacket() { nestegg_packet* packet; @@ -635,7 +635,7 @@ WebMReader::DemuxPacket() return nullptr; } - return holder.forget(); + return holder; } bool WebMReader::DecodeAudioData() @@ -661,10 +661,10 @@ bool WebMReader::FilterPacketByTime(int64_t aEndTime, WebMPacketQueue& aOutput) } int64_t tstamp = holder->Timestamp(); if (tstamp >= aEndTime) { - PushVideoPacket(holder.forget()); + PushVideoPacket(holder); return true; } else { - aOutput.PushFront(holder.forget()); + aOutput.PushFront(holder); } } @@ -697,7 +697,7 @@ int64_t WebMReader::GetNextKeyframeTime(int64_t aTimeThreshold) keyframeTime = holder->Timestamp(); } - skipPacketQueue.PushFront(holder.forget()); + skipPacketQueue.PushFront(holder); } uint32_t size = skipPacketQueue.GetSize(); @@ -722,9 +722,9 @@ bool WebMReader::DecodeVideoFrame(bool &aKeyframeSkip, int64_t aTimeThreshold) return mVideoDecoder->DecodeVideoFrame(aKeyframeSkip, aTimeThreshold); } -void WebMReader::PushVideoPacket(already_AddRefed aItem) +void WebMReader::PushVideoPacket(NesteggPacketHolder* aItem) { - mVideoPackets.PushFront(Move(aItem)); + mVideoPackets.PushFront(aItem); } nsRefPtr diff --git a/dom/media/webm/WebMReader.h b/dom/media/webm/WebMReader.h index b29379369b..71a8c89b3d 100644 --- a/dom/media/webm/WebMReader.h +++ b/dom/media/webm/WebMReader.h @@ -24,37 +24,7 @@ static const unsigned NS_PER_USEC = 1000; static const double NS_PER_S = 1e9; class WebMBufferedState; - -// Queue for holding nestegg packets. -class WebMPacketQueue { - public: - int32_t GetSize() { - return mQueue.size(); - } - - void Push(already_AddRefed aItem) { - mQueue.push_back(Move(aItem)); - } - - void PushFront(already_AddRefed aItem) { - mQueue.push_front(Move(aItem)); - } - - already_AddRefed PopFront() { - nsRefPtr result = mQueue.front().forget(); - mQueue.pop_front(); - return result.forget(); - } - - void Reset() { - while (!mQueue.empty()) { - mQueue.pop_front(); - } - } - -private: - std::deque> mQueue; -}; +class WebMPacketQueue; class WebMReader; @@ -137,10 +107,10 @@ public: // Read a packet from the nestegg file. Returns nullptr if all packets for // the particular track have been read. Pass VIDEO or AUDIO to indicate the // type of the packet we want to read. - already_AddRefed NextPacket(TrackType aTrackType); + nsRefPtr NextPacket(TrackType aTrackType); // Pushes a packet to the front of the video packet queue. - virtual void PushVideoPacket(already_AddRefed aItem); + virtual void PushVideoPacket(NesteggPacketHolder* aItem); int GetVideoCodec(); nsIntRect GetPicture(); @@ -180,7 +150,7 @@ private: // Internal method that demuxes the next packet from the stream. The caller // is responsible for making sure it doesn't get lost. - already_AddRefed DemuxPacket(); + nsRefPtr DemuxPacket(); // libnestegg context for webm container. Access on state machine thread // or decoder thread only.