Split WebMPacketQueue from WebMReader

Also, use nsRefPtr instead of already_AddRefed.
This commit is contained in:
trav90
2017-07-16 03:19:09 -05:00
committed by Roy Tam
parent dcb42ce11b
commit cdffe84c63
5 changed files with 47 additions and 46 deletions
+1 -1
View File
@@ -189,7 +189,7 @@ IntelWebMVideoDecoder::Demux(nsRefPtr<VP8Sample>& aSample, bool* aEOS)
nsRefPtr<NesteggPacketHolder> 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();
+31
View File
@@ -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<NesteggPacketHolder> PopFront() {
nsRefPtr<NesteggPacketHolder> result = mQueue.front();
mQueue.pop_front();
return result;
}
void Reset() {
while (!mQueue.empty()) {
mQueue.pop_front();
}
}
private:
std::deque<nsRefPtr<NesteggPacketHolder>> mQueue;
};
} // namespace mozilla
#endif
+1 -1
View File
@@ -131,7 +131,7 @@ SoftwareWebMVideoDecoder::DecodeVideoFrame(bool &aKeyframeSkip,
nsRefPtr<NesteggPacketHolder> 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();
+10 -10
View File
@@ -543,7 +543,7 @@ bool WebMReader::DecodeAudioPacket(NesteggPacketHolder* aHolder)
return true;
}
already_AddRefed<NesteggPacketHolder> WebMReader::NextPacket(TrackType aTrackType)
nsRefPtr<NesteggPacketHolder> 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<NesteggPacketHolder> 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<NesteggPacketHolder>
nsRefPtr<NesteggPacketHolder>
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<NesteggPacketHolder> aItem)
void WebMReader::PushVideoPacket(NesteggPacketHolder* aItem)
{
mVideoPackets.PushFront(Move(aItem));
mVideoPackets.PushFront(aItem);
}
nsRefPtr<MediaDecoderReader::SeekPromise>
+4 -34
View File
@@ -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<NesteggPacketHolder> aItem) {
mQueue.push_back(Move(aItem));
}
void PushFront(already_AddRefed<NesteggPacketHolder> aItem) {
mQueue.push_front(Move(aItem));
}
already_AddRefed<NesteggPacketHolder> PopFront() {
nsRefPtr<NesteggPacketHolder> result = mQueue.front().forget();
mQueue.pop_front();
return result.forget();
}
void Reset() {
while (!mQueue.empty()) {
mQueue.pop_front();
}
}
private:
std::deque<nsRefPtr<NesteggPacketHolder>> 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<NesteggPacketHolder> NextPacket(TrackType aTrackType);
nsRefPtr<NesteggPacketHolder> NextPacket(TrackType aTrackType);
// Pushes a packet to the front of the video packet queue.
virtual void PushVideoPacket(already_AddRefed<NesteggPacketHolder> 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<NesteggPacketHolder> DemuxPacket();
nsRefPtr<NesteggPacketHolder> DemuxPacket();
// libnestegg context for webm container. Access on state machine thread
// or decoder thread only.