Updated FrameEncryptorInterface and FrameDecryptorInterface with status code.

This change allows an implementer to provide a custom error code to be returned
on failure with 0 being reserved for success. It also modifies the output size
APIs to be more specific and requests the number of bytes written to be returned
so we can determine how many bytes we need to send.

Bug: webrtc:9681
Change-Id: I13d34861bf851527fcbb350d0cfb480c0f95a6b3
Reviewed-on: https://webrtc-review.googlesource.com/98720
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Commit-Queue: Benjamin Wright <benwright@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24613}
diff --git a/api/crypto/framedecryptorinterface.h b/api/crypto/framedecryptorinterface.h
index a3ff19a..1c49b51 100644
--- a/api/crypto/framedecryptorinterface.h
+++ b/api/crypto/framedecryptorinterface.h
@@ -25,8 +25,7 @@
 // without it. You may assume that this interface will have the same lifetime
 // as the RTPReceiver it is attached to. It must only be attached to one
 // RTPReceiver.
-// Note:
-// This interface is not ready for production use.
+// Note: This interface is not ready for production use.
 class FrameDecryptorInterface : public rtc::RefCountInterface {
  public:
   ~FrameDecryptorInterface() override {}
@@ -35,16 +34,20 @@
   // be allocated to the size returned from GetOutputSize. You may assume that
   // the frames are in order if SRTP is enabled. The stream is not provided here
   // and it is up to the implementor to transport this information to the
-  // receiver if they care about it.
-  // TODO(benwright) integrate error codes
-  virtual bool Decrypt(cricket::MediaType media_type,
-                       rtc::ArrayView<const uint8_t> encrypted_frame,
-                       rtc::ArrayView<uint8_t> frame) = 0;
+  // receiver if they care about it. You must set bytes_written to how many
+  // 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.
+  virtual int Decrypt(cricket::MediaType media_type,
+                      rtc::ArrayView<const uint8_t> encrypted_frame,
+                      rtc::ArrayView<uint8_t> frame,
+                      size_t* bytes_written) = 0;
 
   // Returns the total required length in bytes for the output of the
-  // decryption.
-  virtual size_t GetOutputSize(cricket::MediaType media_type,
-                               size_t encrypted_frame_size) = 0;
+  // decryption. This can be larger than the actual number of bytes you need but
+  // must never be smaller as it informs the size of the frame buffer.
+  virtual size_t GetMaxPlaintextByteSize(cricket::MediaType media_type,
+                                         size_t encrypted_frame_size) = 0;
 };
 
 }  // namespace webrtc
diff --git a/api/crypto/frameencryptorinterface.h b/api/crypto/frameencryptorinterface.h
index 369d6b8..a99549c 100644
--- a/api/crypto/frameencryptorinterface.h
+++ b/api/crypto/frameencryptorinterface.h
@@ -24,25 +24,29 @@
 // addition to the standard SRTP mechanism and is not intended to be used
 // without it. Implementations of this interface will have the same lifetime as
 // the RTPSenders it is attached to.
-// This interface is not ready for production use.
+// Note: This interface is not ready for production use.
 class FrameEncryptorInterface : public rtc::RefCountInterface {
  public:
   ~FrameEncryptorInterface() override {}
 
   // Attempts to encrypt the provided frame. You may assume the encrypted_frame
-  // will match the size returned by GetOutputSize for a give frame. You may
-  // assume that the frames will arrive in order if SRTP is enabled. The ssrc
-  // will simply identify which stream the frame is travelling on.
-  // TODO(benwright) integrate error codes.
-  virtual bool Encrypt(cricket::MediaType media_type,
-                       uint32_t ssrc,
-                       rtc::ArrayView<const uint8_t> frame,
-                       rtc::ArrayView<uint8_t> encrypted_frame) = 0;
+  // will match the size returned by GetMaxCiphertextByteSize for a give frame.
+  // You may assume that the frames will arrive in order if SRTP is enabled.
+  // The ssrc will simply identify which stream the frame is travelling on. You
+  // must set bytes_written to the number of bytes you wrote in the
+  // encrypted_frame. 0 must be returned if successful all other numbers can be
+  // selected by the implementer to represent error codes.
+  virtual int Encrypt(cricket::MediaType media_type,
+                      uint32_t ssrc,
+                      rtc::ArrayView<const uint8_t> frame,
+                      rtc::ArrayView<uint8_t> encrypted_frame,
+                      size_t* bytes_written) = 0;
 
   // Returns the total required length in bytes for the output of the
-  // encryption.
-  virtual size_t GetOutputSize(cricket::MediaType media_type,
-                               size_t frame_size) = 0;
+  // encryption. This can be larger than the actual number of bytes you need but
+  // must never be smaller as it informs the size of the encrypted_frame buffer.
+  virtual size_t GetMaxCiphertextByteSize(cricket::MediaType media_type,
+                                          size_t frame_size) = 0;
 };
 
 }  // namespace webrtc