Get frame type, width and height from the generic descriptor.

Bug: webrtc:9361
Change-Id: I5558ba02f921880f9c4677b85830c7c18faffea4
Reviewed-on: https://webrtc-review.googlesource.com/c/106382
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Commit-Queue: Philip Eliasson <philipel@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25231}
diff --git a/call/rtp_payload_params.cc b/call/rtp_payload_params.cc
index ffbda1a..2a32eef 100644
--- a/call/rtp_payload_params.cc
+++ b/call/rtp_payload_params.cc
@@ -144,6 +144,8 @@
   rtp_video_header.rotation = image.rotation_;
   rtp_video_header.content_type = image.content_type_;
   rtp_video_header.playout_delay = image.playout_delay_;
+  rtp_video_header.width = image._encodedWidth;
+  rtp_video_header.height = image._encodedHeight;
 
   SetVideoTiming(image, &rtp_video_header.video_timing);
 
diff --git a/call/rtp_payload_params_unittest.cc b/call/rtp_payload_params_unittest.cc
index a3cb379..9a519ba 100644
--- a/call/rtp_payload_params_unittest.cc
+++ b/call/rtp_payload_params_unittest.cc
@@ -309,9 +309,13 @@
                        int64_t shared_frame_id,
                        FrameType frame_type,
                        LayerSync layer_sync,
-                       const std::set<int64_t>& expected_deps) {
+                       const std::set<int64_t>& expected_deps,
+                       uint16_t width = 0,
+                       uint16_t height = 0) {
     EncodedImage encoded_image;
     encoded_image._frameType = frame_type;
+    encoded_image._encodedWidth = width;
+    encoded_image._encodedHeight = height;
 
     CodecSpecificInfo codec_info{};
     codec_info.codecType = kVideoCodecVP8;
@@ -330,6 +334,9 @@
     std::set<int64_t> actual_deps(header.generic->dependencies.begin(),
                                   header.generic->dependencies.end());
     EXPECT_EQ(expected_deps, actual_deps);
+
+    EXPECT_EQ(header.width, width);
+    EXPECT_EQ(header.height, height);
   }
 
  protected:
@@ -339,13 +346,13 @@
 };
 
 TEST_F(RtpPayloadParamsVp8ToGenericTest, Keyframe) {
-  ConvertAndCheck(0, 0, kVideoFrameKey, kNoSync, {});
+  ConvertAndCheck(0, 0, kVideoFrameKey, kNoSync, {}, 480, 360);
   ConvertAndCheck(0, 1, kVideoFrameDelta, kNoSync, {0});
-  ConvertAndCheck(0, 2, kVideoFrameKey, kNoSync, {});
+  ConvertAndCheck(0, 2, kVideoFrameKey, kNoSync, {}, 480, 360);
 }
 
 TEST_F(RtpPayloadParamsVp8ToGenericTest, TooHighTemporalIndex) {
-  ConvertAndCheck(0, 0, kVideoFrameKey, kNoSync, {});
+  ConvertAndCheck(0, 0, kVideoFrameKey, kNoSync, {}, 480, 360);
 
   EncodedImage encoded_image;
   encoded_image._frameType = kVideoFrameDelta;
@@ -362,7 +369,7 @@
 
 TEST_F(RtpPayloadParamsVp8ToGenericTest, LayerSync) {
   // 02120212 pattern
-  ConvertAndCheck(0, 0, kVideoFrameKey, kNoSync, {});
+  ConvertAndCheck(0, 0, kVideoFrameKey, kNoSync, {}, 480, 360);
   ConvertAndCheck(2, 1, kVideoFrameDelta, kNoSync, {0});
   ConvertAndCheck(1, 2, kVideoFrameDelta, kNoSync, {0});
   ConvertAndCheck(2, 3, kVideoFrameDelta, kNoSync, {0, 1, 2});
@@ -375,7 +382,7 @@
 
 TEST_F(RtpPayloadParamsVp8ToGenericTest, FrameIdGaps) {
   // 0101 pattern
-  ConvertAndCheck(0, 0, kVideoFrameKey, kNoSync, {});
+  ConvertAndCheck(0, 0, kVideoFrameKey, kNoSync, {}, 480, 360);
   ConvertAndCheck(1, 1, kVideoFrameDelta, kNoSync, {0});
 
   ConvertAndCheck(0, 5, kVideoFrameDelta, kNoSync, {0});
diff --git a/modules/rtp_rtcp/source/rtp_sender_video.cc b/modules/rtp_rtcp/source/rtp_sender_video.cc
index cb0415c..b395a66 100644
--- a/modules/rtp_rtcp/source/rtp_sender_video.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_video.cc
@@ -91,6 +91,11 @@
       generic_descriptor.SetSpatialLayersBitmask(spatial_bimask);
 
       generic_descriptor.SetTemporalLayer(video_header.generic->temporal_index);
+
+      if (frame_type == kVideoFrameKey) {
+        generic_descriptor.SetResolution(video_header.width,
+                                         video_header.height);
+      }
     }
     packet->SetExtension<RtpGenericFrameDescriptorExtension>(
         generic_descriptor);
diff --git a/video/rtp_video_stream_receiver.cc b/video/rtp_video_stream_receiver.cc
index 64ec544..133c09f 100644
--- a/video/rtp_video_stream_receiver.cc
+++ b/video/rtp_video_stream_receiver.cc
@@ -486,6 +486,16 @@
         webrtc_rtp_header.header.markerBit ||
         (generic_descriptor_wire->LastSubFrameInFrame() &&
          generic_descriptor_wire->LastPacketInSubFrame());
+
+    if (generic_descriptor_wire->FirstPacketInSubFrame()) {
+      webrtc_rtp_header.frameType =
+          generic_descriptor_wire->FrameDependenciesDiffs().empty()
+              ? kVideoFrameKey
+              : kVideoFrameDelta;
+    }
+
+    webrtc_rtp_header.video_header().width = generic_descriptor_wire->Width();
+    webrtc_rtp_header.video_header().height = generic_descriptor_wire->Height();
   } else {
     generic_descriptor_wire.reset();
   }
diff --git a/video/rtp_video_stream_receiver_unittest.cc b/video/rtp_video_stream_receiver_unittest.cc
index ec2bf33..590d916 100644
--- a/video/rtp_video_stream_receiver_unittest.cc
+++ b/video/rtp_video_stream_receiver_unittest.cc
@@ -568,10 +568,8 @@
   first_packet_descriptor.SetFirstSubFrameInFrame(true);
   first_packet_descriptor.SetLastSubFrameInFrame(true);
   first_packet_descriptor.SetFrameId(100);
-  first_packet_descriptor.SetTemporalLayer(1);
   first_packet_descriptor.SetSpatialLayersBitmask(1 << kSpatialIndex);
-  first_packet_descriptor.AddFrameDependencyDiff(90);
-  first_packet_descriptor.AddFrameDependencyDiff(80);
+  first_packet_descriptor.SetResolution(480, 360);
   EXPECT_TRUE(first_packet.SetExtension<RtpGenericFrameDescriptorExtension>(
       first_packet_descriptor));
 
@@ -606,10 +604,10 @@
 
   EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame)
       .WillOnce(Invoke([kSpatialIndex](video_coding::EncodedFrame* frame) {
-        EXPECT_EQ(frame->num_references, 2U);
-        EXPECT_EQ(frame->references[0], frame->id.picture_id - 90);
-        EXPECT_EQ(frame->references[1], frame->id.picture_id - 80);
+        EXPECT_EQ(frame->num_references, 0U);
         EXPECT_EQ(frame->id.spatial_layer, kSpatialIndex);
+        EXPECT_EQ(frame->EncodedImage()._encodedWidth, 480u);
+        EXPECT_EQ(frame->EncodedImage()._encodedHeight, 360u);
       }));
 
   rtp_video_stream_receiver_->OnRtpPacket(second_packet);