Unwrap picture ids in the RtpFrameReferencerFinder.

First CL to avoid working with wrapping picture ids. After the references of
a frame has been determined they are then unwrapped.

BUG=webrtc:7874

Review-Url: https://codereview.webrtc.org/2985283002
Cr-Commit-Position: refs/heads/master@{#19663}
diff --git a/webrtc/modules/video_coding/rtp_frame_reference_finder.cc b/webrtc/modules/video_coding/rtp_frame_reference_finder.cc
index 52947cb..e167e15 100644
--- a/webrtc/modules/video_coding/rtp_frame_reference_finder.cc
+++ b/webrtc/modules/video_coding/rtp_frame_reference_finder.cc
@@ -176,7 +176,7 @@
     if (last_unwrap_ == -1)
       last_unwrap_ = picture_id;
 
-    frame->picture_id = UnwrapPictureId(picture_id % kPicIdLength);
+    frame->picture_id = unwrapper_.Unwrap(picture_id);
     frame->num_references = frame->frame_type() == kVideoFrameKey ? 0 : 1;
     frame->references[0] = frame->picture_id - 1;
     return kHandOff;
@@ -228,22 +228,25 @@
   // picture id according to some incrementing counter.
   frame->picture_id = frame->last_seq_num();
   frame->num_references = frame->frame_type() == kVideoFrameDelta;
-  frame->references[0] = last_picture_id_gop;
-  if (AheadOf(frame->picture_id, last_picture_id_gop)) {
+  frame->references[0] = generic_unwrapper_.Unwrap(last_picture_id_gop);
+  if (AheadOf<uint16_t>(frame->picture_id, last_picture_id_gop)) {
     seq_num_it->second.first = frame->picture_id;
     seq_num_it->second.second = frame->picture_id;
   }
 
   last_picture_id_ = frame->picture_id;
   UpdateLastPictureIdWithPadding(frame->picture_id);
+  frame->picture_id = generic_unwrapper_.Unwrap(frame->picture_id);
   return kHandOff;
 }
 
 RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp8(
     RtpFrameObject* frame) {
   rtc::Optional<RTPVideoTypeHeader> rtp_codec_header = frame->GetCodecHeader();
-  if (!rtp_codec_header)
+  if (!rtp_codec_header) {
+    LOG(LS_WARNING) << "Failed to get codec header from frame, dropping frame.";
     return kDrop;
+  }
 
   const RTPVideoHeaderVP8& codec_header = rtp_codec_header->VP8;
 
@@ -285,7 +288,7 @@
   if (frame->frame_type() == kVideoFrameKey) {
     frame->num_references = 0;
     layer_info_[codec_header.tl0PicIdx].fill(-1);
-    UpdateLayerInfoVp8(frame, codec_header);
+    UpdateLayerInfoVp8(frame);
     return kHandOff;
   }
 
@@ -307,7 +310,7 @@
             .first;
     frame->num_references = 1;
     frame->references[0] = layer_info_it->second[0];
-    UpdateLayerInfoVp8(frame, codec_header);
+    UpdateLayerInfoVp8(frame);
     return kHandOff;
   }
 
@@ -316,7 +319,7 @@
     frame->num_references = 1;
     frame->references[0] = layer_info_it->second[0];
 
-    UpdateLayerInfoVp8(frame, codec_header);
+    UpdateLayerInfoVp8(frame);
     return kHandOff;
   }
 
@@ -359,13 +362,14 @@
     frame->references[layer] = layer_info_it->second[layer];
   }
 
-  UpdateLayerInfoVp8(frame, codec_header);
+  UpdateLayerInfoVp8(frame);
   return kHandOff;
 }
 
-void RtpFrameReferenceFinder::UpdateLayerInfoVp8(
-    RtpFrameObject* frame,
-    const RTPVideoHeaderVP8& codec_header) {
+void RtpFrameReferenceFinder::UpdateLayerInfoVp8(RtpFrameObject* frame) {
+  rtc::Optional<RTPVideoTypeHeader> rtp_codec_header = frame->GetCodecHeader();
+  RTC_DCHECK(rtp_codec_header);
+  const RTPVideoHeaderVP8& codec_header = rtp_codec_header->VP8;
   uint8_t tl0_pic_idx = codec_header.tl0PicIdx;
   uint8_t temporal_index = codec_header.temporalIdx;
   auto layer_info_it = layer_info_.find(tl0_pic_idx);
@@ -392,8 +396,10 @@
 RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp9(
     RtpFrameObject* frame) {
   rtc::Optional<RTPVideoTypeHeader> rtp_codec_header = frame->GetCodecHeader();
-  if (!rtp_codec_header)
+  if (!rtp_codec_header) {
+    LOG(LS_WARNING) << "Failed to get codec header from frame, dropping frame.";
     return kDrop;
+  }
 
   const RTPVideoHeaderVP9& codec_header = rtp_codec_header->VP9;
 
@@ -585,22 +591,8 @@
 
 void RtpFrameReferenceFinder::UnwrapPictureIds(RtpFrameObject* frame) {
   for (size_t i = 0; i < frame->num_references; ++i)
-    frame->references[i] = UnwrapPictureId(frame->references[i]);
-  frame->picture_id = UnwrapPictureId(frame->picture_id);
-}
-
-uint16_t RtpFrameReferenceFinder::UnwrapPictureId(uint16_t picture_id) {
-  RTC_DCHECK_NE(-1, last_unwrap_);
-
-  uint16_t unwrap_truncated = last_unwrap_ % kPicIdLength;
-  uint16_t diff = MinDiff<uint16_t, kPicIdLength>(unwrap_truncated, picture_id);
-
-  if (AheadOf<uint16_t, kPicIdLength>(picture_id, unwrap_truncated))
-    last_unwrap_ = Add<1 << 16>(last_unwrap_, diff);
-  else
-    last_unwrap_ = Subtract<1 << 16>(last_unwrap_, diff);
-
-  return last_unwrap_;
+    frame->references[i] = unwrapper_.Unwrap(frame->references[i]);
+  frame->picture_id = unwrapper_.Unwrap(frame->picture_id);
 }
 
 }  // namespace video_coding