Add Result FrameDecryptorInterface::Decrypt

This change adds FrameDecryptorInterface::Result to the FrameDecryptorInterface
API. Result contains a Status and bytes_written. This removes requiring out
parameters from the API and provides a simpler status return code for the
function. This is in response to comments suggested here:
https://webrtc-review.googlesource.com/c/src/+/131358

int FrameDecryptorInterface::Decrypt() will be removed in a follow up CL.

Bug: webrtc:10512
Change-Id: I47f19f154d1d8430acd6e4a6f433ab24c455fd51
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/131362
Commit-Queue: Benjamin Wright <benwright@webrtc.org>
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27470}
diff --git a/api/crypto/frame_decryptor_interface.h b/api/crypto/frame_decryptor_interface.h
index 400e056..84fc615 100644
--- a/api/crypto/frame_decryptor_interface.h
+++ b/api/crypto/frame_decryptor_interface.h
@@ -30,6 +30,18 @@
 // Note: This interface is not ready for production use.
 class FrameDecryptorInterface : public rtc::RefCountInterface {
  public:
+  // The Status enum represents all possible states that can be
+  // returned when attempting to decrypt a frame. kRecoverable indicates that
+  // there was an error with the given frame and so it should not be passed to
+  // the decoder, however it hints that the receive stream is still decryptable
+  // which is important for determining when to send key frame requests.
+  enum class Status { kOk, kRecoverable, kFailedToDecrypt };
+
+  struct Result {
+    Status status;
+    size_t bytes_written;
+  };
+
   ~FrameDecryptorInterface() override {}
 
   // Attempts to decrypt the encrypted frame. You may assume the frame size will
@@ -40,12 +52,36 @@
   // bytes you wrote to in the frame buffer. 0 must be returned if successful
   // all other numbers can be selected by the implementer to represent error
   // codes.
+  // TODO(bugs.webrtc.org/10512) - Remove this after implementation rewrite.
   virtual int Decrypt(cricket::MediaType media_type,
                       const std::vector<uint32_t>& csrcs,
                       rtc::ArrayView<const uint8_t> additional_data,
                       rtc::ArrayView<const uint8_t> encrypted_frame,
                       rtc::ArrayView<uint8_t> frame,
-                      size_t* bytes_written) = 0;
+                      size_t* bytes_written) {
+    bytes_written = 0;
+    return 1;
+  }
+
+  // TODO(bugs.webrtc.org/10512) - Remove the other decrypt function and turn
+  // this to a pure virtual.
+  virtual Result Decrypt(cricket::MediaType media_type,
+                         const std::vector<uint32_t>& csrcs,
+                         rtc::ArrayView<const uint8_t> additional_data,
+                         rtc::ArrayView<const uint8_t> encrypted_frame,
+                         rtc::ArrayView<uint8_t> frame) {
+    size_t bytes_written = 0;
+    const int status = Decrypt(media_type, csrcs, additional_data,
+                               encrypted_frame, frame, &bytes_written);
+    Result decryption_result;
+    decryption_result.bytes_written = bytes_written;
+    if (status == 0) {
+      decryption_result.status = Status::kOk;
+    } else {
+      decryption_result.status = Status::kFailedToDecrypt;
+    }
+    return decryption_result;
+  }
 
   // Returns the total required length in bytes for the output of the
   // decryption. This can be larger than the actual number of bytes you need but