diff --git a/dom/media/webm/WebMDemuxer.cpp b/dom/media/webm/WebMDemuxer.cpp index 5c52624070f9..1ed58c55255a 100644 --- a/dom/media/webm/WebMDemuxer.cpp +++ b/dom/media/webm/WebMDemuxer.cpp @@ -820,19 +820,31 @@ nsresult WebMDemuxer::GetNextPacket(TrackInfo::TrackType aType, sample->mDuration = TimeUnit::Invalid(); } else { TimeUnit padding = TimeUnit::FromNanoseconds(discardPadding); - size_t samples = opus_packet_get_nb_samples( + const int samples = opus_packet_get_nb_samples( sample->Data(), AssertedCast(sample->Size()), AssertedCast(mInfo.mAudio.mRate)); - TimeUnit packetDuration = TimeUnit(samples, mInfo.mAudio.mRate); - if (padding > packetDuration || mProcessedDiscardPadding) { + if (samples <= 0) { WEBM_DEBUG( - "Padding frames larger than packet size, flagging the packet for " - "error (padding: %s, duration: %s, already processed: %s)", - padding.ToString().get(), packetDuration.ToString().get(), - mProcessedDiscardPadding ? "true" : "false"); + "Invalid number of samples, flagging packet for error (padding: " + "%s, samples: %d, already processed: %s, error: %s)", + padding.ToString().get(), samples, + mProcessedDiscardPadding ? "true" : "false", + (samples == OPUS_BAD_ARG) ? "OPUS_BAD_ARG" + : (samples == OPUS_INVALID_PACKET) ? "OPUS_INVALID_PACKET" + : "Undefined Error"); sample->mDuration = TimeUnit::Invalid(); } else { - sample->mDuration = packetDuration - padding; + TimeUnit packetDuration = TimeUnit(samples, mInfo.mAudio.mRate); + if (padding > packetDuration || mProcessedDiscardPadding) { + WEBM_DEBUG( + "Padding frames larger than packet size, flagging packet for " + "error (padding: %s, duration: %s, already processed: %s)", + padding.ToString().get(), packetDuration.ToString().get(), + mProcessedDiscardPadding ? "true" : "false"); + sample->mDuration = TimeUnit::Invalid(); + } else { + sample->mDuration = packetDuration - padding; + } } } mProcessedDiscardPadding = true;