Implement RtpParameters.transaction_id for PC RtpSenderInterface

The transaction_id field should be refreshed for every getParameters()
call and checked at each setParameters() call.
This also checks that getParameters() was ever called to return a proper
error code.

Bug: webrtc:7580
Change-Id: I6c6fe289542e486fc422cdc61577982b0529d4c1
Reviewed-on: https://webrtc-review.googlesource.com/70820
Commit-Queue: Florent Castelli <orphis@webrtc.org>
Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org>
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23120}
diff --git a/sdk/android/api/org/webrtc/RtpParameters.java b/sdk/android/api/org/webrtc/RtpParameters.java
index 634f3b3..f2227ae 100644
--- a/sdk/android/api/org/webrtc/RtpParameters.java
+++ b/sdk/android/api/org/webrtc/RtpParameters.java
@@ -109,21 +109,24 @@
     }
   }
 
+  public final String transactionId;
+
   public final List<Encoding> encodings;
   // Codec parameters can't currently be changed between getParameters and
   // setParameters. Though in the future it will be possible to reorder them or
   // remove them.
   public final List<Codec> codecs;
 
-  public RtpParameters() {
-    this.encodings = new ArrayList<>();
-    this.codecs = new ArrayList<>();
+  @CalledByNative
+  RtpParameters(String transactionId, List<Encoding> encodings, List<Codec> codecs) {
+    this.transactionId = transactionId;
+    this.encodings = encodings;
+    this.codecs = codecs;
   }
 
   @CalledByNative
-  RtpParameters(List<Encoding> encodings, List<Codec> codecs) {
-    this.encodings = encodings;
-    this.codecs = codecs;
+  String getTransactionId() {
+    return transactionId;
   }
 
   @CalledByNative
diff --git a/sdk/android/src/jni/pc/rtpparameters.cc b/sdk/android/src/jni/pc/rtpparameters.cc
index 6a312b4..a990934 100644
--- a/sdk/android/src/jni/pc/rtpparameters.cc
+++ b/sdk/android/src/jni/pc/rtpparameters.cc
@@ -59,6 +59,10 @@
                                         const JavaRef<jobject>& j_parameters) {
   RtpParameters parameters;
 
+  ScopedJavaLocalRef<jstring> j_transaction_id =
+      Java_RtpParameters_getTransactionId(jni, j_parameters);
+  parameters.transaction_id = JavaToNativeString(jni, j_transaction_id);
+
   // Convert encodings.
   ScopedJavaLocalRef<jobject> j_encodings =
       Java_RtpParameters_getEncodings(jni, j_parameters);
@@ -90,7 +94,7 @@
     JNIEnv* env,
     const RtpParameters& parameters) {
   return Java_RtpParameters_Constructor(
-      env,
+      env, NativeToJavaString(env, parameters.transaction_id),
       NativeToJavaList(env, parameters.encodings,
                        &NativeToJavaRtpEncodingParameter),
       NativeToJavaList(env, parameters.codecs, &NativeToJavaRtpCodecParameter));
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpParameters.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCRtpParameters.mm
index 5e79106..d18eba6 100644
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpParameters.mm
+++ b/sdk/objc/Framework/Classes/PeerConnection/RTCRtpParameters.mm
@@ -10,11 +10,13 @@
 
 #import "RTCRtpParameters+Private.h"
 
+#import "NSString+StdString.h"
 #import "RTCRtpCodecParameters+Private.h"
 #import "RTCRtpEncodingParameters+Private.h"
 
 @implementation RTCRtpParameters
 
+@synthesize transactionId = _transactionId;
 @synthesize encodings = _encodings;
 @synthesize codecs = _codecs;
 
@@ -25,6 +27,7 @@
 - (instancetype)initWithNativeParameters:
     (const webrtc::RtpParameters &)nativeParameters {
   if (self = [self init]) {
+    _transactionId = [NSString stringForStdString:nativeParameters.transaction_id];
     NSMutableArray *encodings = [[NSMutableArray alloc] init];
     for (const auto &encoding : nativeParameters.encodings) {
       [encodings addObject:[[RTCRtpEncodingParameters alloc]
@@ -43,7 +46,8 @@
 }
 
 - (webrtc::RtpParameters)nativeParameters {
-    webrtc::RtpParameters parameters;
+  webrtc::RtpParameters parameters;
+  parameters.transaction_id = [NSString stdStringForString:_transactionId];
   for (RTCRtpEncodingParameters *encoding in _encodings) {
     parameters.encodings.push_back(encoding.nativeParameters);
   }
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCRtpParameters.h b/sdk/objc/Framework/Headers/WebRTC/RTCRtpParameters.h
index bdebf84..b6e1f01 100644
--- a/sdk/objc/Framework/Headers/WebRTC/RTCRtpParameters.h
+++ b/sdk/objc/Framework/Headers/WebRTC/RTCRtpParameters.h
@@ -19,6 +19,9 @@
 RTC_EXPORT
 @interface RTCRtpParameters : NSObject
 
+/** A unique identifier for the last set of parameters applied. */
+@property(nonatomic, copy) NSString *transactionId;
+
 /** The currently active encodings in the order of preference. */
 @property(nonatomic, copy) NSArray<RTCRtpEncodingParameters *> *encodings;