mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-16 13:56:29 +00:00
Bug 1243611 - When EOS, call vpx_codec_encode correctly. r=rillian
MozReview-Commit-ID: IzrDAOD11r9 --HG-- extra : rebase_source : 31fd4b8f4e6b24b63864e93f6484a87f325f3f34
This commit is contained in:
parent
67c2983eed
commit
c258d7a911
@ -169,7 +169,7 @@ VP8TrackEncoder::GetMetadata()
|
||||
return meta.forget();
|
||||
}
|
||||
|
||||
nsresult
|
||||
bool
|
||||
VP8TrackEncoder::GetEncodedPartitions(EncodedFrameContainer& aData)
|
||||
{
|
||||
vpx_codec_iter_t iter = nullptr;
|
||||
@ -197,21 +197,18 @@ VP8TrackEncoder::GetEncodedPartitions(EncodedFrameContainer& aData)
|
||||
}
|
||||
}
|
||||
|
||||
if (!frameData.IsEmpty() &&
|
||||
(pkt->data.frame.pts == mEncodedTimestamp)) {
|
||||
if (!frameData.IsEmpty()) {
|
||||
// Copy the encoded data to aData.
|
||||
EncodedFrame* videoData = new EncodedFrame();
|
||||
videoData->SetFrameType(frameType);
|
||||
// Convert the timestamp and duration to Usecs.
|
||||
CheckedInt64 timestamp = FramesToUsecs(mEncodedTimestamp, mTrackRate);
|
||||
CheckedInt64 timestamp = FramesToUsecs(pkt->data.frame.pts, mTrackRate);
|
||||
if (timestamp.isValid()) {
|
||||
videoData->SetTimeStamp(
|
||||
(uint64_t)FramesToUsecs(mEncodedTimestamp, mTrackRate).value());
|
||||
videoData->SetTimeStamp((uint64_t)timestamp.value());
|
||||
}
|
||||
CheckedInt64 duration = FramesToUsecs(pkt->data.frame.duration, mTrackRate);
|
||||
if (duration.isValid()) {
|
||||
videoData->SetDuration(
|
||||
(uint64_t)FramesToUsecs(pkt->data.frame.duration, mTrackRate).value());
|
||||
videoData->SetDuration((uint64_t)duration.value());
|
||||
}
|
||||
videoData->SwapInFrameData(frameData);
|
||||
VP8LOG("GetEncodedPartitions TimeStamp %lld Duration %lld\n",
|
||||
@ -220,7 +217,7 @@ VP8TrackEncoder::GetEncodedPartitions(EncodedFrameContainer& aData)
|
||||
aData.AppendEncodedFrame(videoData);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
return !!pkt;
|
||||
}
|
||||
|
||||
static bool isYUV420(const PlanarYCbCrImage::Data *aData)
|
||||
@ -365,7 +362,7 @@ nsresult VP8TrackEncoder::PrepareRawFrame(VideoChunk &aChunk)
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
VP8LOG("Converted an %s frame to I420\n");
|
||||
VP8LOG("Converted an %s frame to I420\n", yuvFormat.c_str());
|
||||
} else {
|
||||
// Not YCbCr at all. Try to get access to the raw data and convert.
|
||||
|
||||
@ -631,11 +628,15 @@ VP8TrackEncoder::GetEncodedTrack(EncodedFrameContainer& aData)
|
||||
if (EOS) {
|
||||
VP8LOG("mEndOfStream is true\n");
|
||||
mEncodingComplete = true;
|
||||
if (vpx_codec_encode(mVPXContext, nullptr, mEncodedTimestamp,
|
||||
mEncodedFrameDuration, 0, VPX_DL_REALTIME)) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
GetEncodedPartitions(aData);
|
||||
// Bug 1243611, keep calling vpx_codec_encode and vpx_codec_get_cx_data
|
||||
// until vpx_codec_get_cx_data return null.
|
||||
|
||||
do {
|
||||
if (vpx_codec_encode(mVPXContext, nullptr, mEncodedTimestamp,
|
||||
mEncodedFrameDuration, 0, VPX_DL_REALTIME)) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
} while(GetEncodedPartitions(aData));
|
||||
}
|
||||
|
||||
return NS_OK ;
|
||||
|
@ -54,7 +54,9 @@ private:
|
||||
StreamTime aProcessedDuration);
|
||||
|
||||
// Get the encoded data from encoder to aData.
|
||||
nsresult GetEncodedPartitions(EncodedFrameContainer& aData);
|
||||
// Return value: false if the vpx_codec_get_cx_data returns null
|
||||
// for EOS detection.
|
||||
bool GetEncodedPartitions(EncodedFrameContainer& aData);
|
||||
|
||||
// Prepare the input data to the mVPXImageWrapper for encoding.
|
||||
nsresult PrepareRawFrame(VideoChunk &aChunk);
|
||||
|
Loading…
x
Reference in New Issue
Block a user