Bug 1413076 - return other kind of error in addition to OOM. r?jya draft
authorAlfredo.Yang <ayang@mozilla.com>
Tue, 31 Oct 2017 10:13:51 +0800
changeset 689123 964319843b721d4cb9dcafb73b9edc8f6b5a3254
parent 689081 083a9c84fbd09a6ff9bfecabbf773650842fe1c0
child 738225 46e9ec49ed326db028301b9a154620d97b9ff3e8
push id86918
push userbmo:ayang@mozilla.com
push dateTue, 31 Oct 2017 02:59:54 +0000
reviewersjya
bugs1413076
milestone58.0a1
Bug 1413076 - return other kind of error in addition to OOM. r?jya MozReview-Commit-ID: CpRF1Kr5Z2c
dom/media/platforms/wrappers/H264Converter.cpp
media/libstagefright/binding/AnnexB.cpp
--- a/dom/media/platforms/wrappers/H264Converter.cpp
+++ b/dom/media/platforms/wrappers/H264Converter.cpp
@@ -115,21 +115,22 @@ H264Converter::Decode(MediaRawData* aSam
   if (NS_FAILED(rv)) {
     return DecodePromise::CreateAndReject(rv, __func__);
   }
 
   if (mNeedKeyframe && !aSample->mKeyframe) {
     return DecodePromise::CreateAndResolve(DecodedData(), __func__);
   }
 
-  if (!*mNeedAVCC &&
-      mp4_demuxer::AnnexB::ConvertSampleToAnnexB(aSample, mNeedKeyframe).isErr()) {
+  auto res = !*mNeedAVCC
+             ? mp4_demuxer::AnnexB::ConvertSampleToAnnexB(aSample, mNeedKeyframe)
+             : Ok();
+  if (res.isErr()) {
     return DecodePromise::CreateAndReject(
-      MediaResult(NS_ERROR_OUT_OF_MEMORY,
-                  RESULT_DETAIL("ConvertSampleToAnnexB")),
+      MediaResult(res.unwrapErr(), RESULT_DETAIL("ConvertSampleToAnnexB")),
       __func__);
   }
 
   mNeedKeyframe = false;
 
   aSample->mExtraData = mCurrentConfig.mExtraData;
 
   return mDecoder->Decode(aSample);
@@ -369,21 +370,23 @@ void
 H264Converter::DecodeFirstSample(MediaRawData* aSample)
 {
   if (mNeedKeyframe && !aSample->mKeyframe) {
     mDecodePromise.Resolve(mPendingFrames, __func__);
     mPendingFrames.Clear();
     return;
   }
 
-  if (!*mNeedAVCC &&
-      mp4_demuxer::AnnexB::ConvertSampleToAnnexB(aSample, mNeedKeyframe).isErr()) {
-    mDecodePromise.Reject(MediaResult(NS_ERROR_OUT_OF_MEMORY,
-                                      RESULT_DETAIL("ConvertSampleToAnnexB")),
-                          __func__);
+  auto res = !*mNeedAVCC
+             ? mp4_demuxer::AnnexB::ConvertSampleToAnnexB(aSample, mNeedKeyframe)
+             : Ok();
+  if (res.isErr()) {
+    mDecodePromise.Reject(
+      MediaResult(res.unwrapErr(), RESULT_DETAIL("ConvertSampleToAnnexB")),
+      __func__);
     return;
   }
 
   mNeedKeyframe = false;
 
   RefPtr<H264Converter> self = this;
   mDecoder->Decode(aSample)
     ->Then(AbstractThread::GetCurrent()->AsTaskQueue(), __func__,
--- a/media/libstagefright/binding/AnnexB.cpp
+++ b/media/libstagefright/binding/AnnexB.cpp
@@ -42,38 +42,38 @@ AnnexB::ConvertSampleToAnnexB(mozilla::M
   ByteWriter writer(tmp);
 
   while (reader.Remaining() >= 4) {
     uint32_t nalLen;
     MOZ_TRY_VAR(nalLen, reader.ReadU32());
     const uint8_t* p = reader.Read(nalLen);
 
     if (!writer.Write(kAnnexBDelimiter, ArrayLength(kAnnexBDelimiter))) {
-      return Err(NS_ERROR_FAILURE);
+      return Err(NS_ERROR_OUT_OF_MEMORY);
     }
     if (!p) {
       break;
     }
     if (!writer.Write(p, nalLen)) {
-      return Err(NS_ERROR_FAILURE);
+      return Err(NS_ERROR_OUT_OF_MEMORY);
     }
   }
 
   nsAutoPtr<MediaRawDataWriter> samplewriter(aSample->CreateWriter());
 
   if (!samplewriter->Replace(tmp.Elements(), tmp.Length())) {
-    return Err(NS_ERROR_FAILURE);
+    return Err(NS_ERROR_OUT_OF_MEMORY);
   }
 
   // Prepend the Annex B NAL with SPS and PPS tables to keyframes.
   if (aAddSPS && aSample->mKeyframe) {
     RefPtr<MediaByteBuffer> annexB =
       ConvertExtraDataToAnnexB(aSample->mExtraData);
     if (!samplewriter->Prepend(annexB->Elements(), annexB->Length())) {
-      return Err(NS_ERROR_FAILURE);
+      return Err(NS_ERROR_OUT_OF_MEMORY);
     }
 
     // Prepending the NAL with SPS/PPS will mess up the encryption subsample
     // offsets. So we need to account for the extra bytes by increasing
     // the length of the first clear data subsample. Otherwise decryption
     // will fail.
     if (aSample->mCrypto.mValid) {
       MOZ_ASSERT(samplewriter->mCrypto.mPlainSizes.Length() > 0);
@@ -217,27 +217,27 @@ ParseNALUnits(ByteWriter& aBw, BufferRea
   if (rv.isOk()) {
     size_t startOffset = aBr.Offset();
     while (FindStartCode(aBr, startSize).isOk()) {
       size_t offset = aBr.Offset();
       size_t sizeNAL = offset - startOffset - startSize;
       aBr.Seek(startOffset);
       if (!aBw.WriteU32(sizeNAL)
           || !aBw.Write(aBr.Read(sizeNAL), sizeNAL)) {
-        return Err(NS_ERROR_FAILURE);
+        return Err(NS_ERROR_OUT_OF_MEMORY);
       }
       aBr.Read(startSize);
       startOffset = offset;
     }
   }
   size_t sizeNAL = aBr.Remaining();
   if (sizeNAL) {
     if (!aBw.WriteU32(sizeNAL)
         || !aBw.Write(aBr.Read(sizeNAL), sizeNAL)) {
-      return Err(NS_ERROR_FAILURE);
+      return Err(NS_ERROR_OUT_OF_MEMORY);
     }
   }
   return Ok();
 }
 
 bool
 AnnexB::ConvertSampleToAVCC(mozilla::MediaRawData* aSample)
 {
@@ -300,22 +300,22 @@ AnnexB::ConvertSampleTo4BytesAVCC(mozill
       case 4: MOZ_TRY_VAR(nalLen, reader.ReadU32()); break;
     }
     const uint8_t* p = reader.Read(nalLen);
     if (!p) {
       return Ok();
     }
     if (!writer.WriteU32(nalLen)
         || !writer.Write(p, nalLen)) {
-      return Err(NS_ERROR_FAILURE);
+      return Err(NS_ERROR_OUT_OF_MEMORY);
     }
   }
   nsAutoPtr<MediaRawDataWriter> samplewriter(aSample->CreateWriter());
   if (!samplewriter->Replace(dest.Elements(), dest.Length())) {
-    return Err(NS_ERROR_FAILURE);
+    return Err(NS_ERROR_OUT_OF_MEMORY);
   }
   return Ok();
 }
 
 bool
 AnnexB::IsAVCC(const mozilla::MediaRawData* aSample)
 {
   return aSample->Size() >= 3 && aSample->mExtraData &&