diff --git a/talk/app/webrtc/webrtcsdp.cc b/talk/app/webrtc/webrtcsdp.cc
index de45c09..d34ce3e 100644
--- a/talk/app/webrtc/webrtcsdp.cc
+++ b/talk/app/webrtc/webrtcsdp.cc
@@ -2436,10 +2436,9 @@
   AddOrReplaceCodec<T, U>(content_desc, new_codec);
 }
 
-bool PopWildcardCodec(std::vector<cricket::VideoCodec>* codecs,
-                      cricket::VideoCodec* wildcard_codec) {
-  for (std::vector<cricket::VideoCodec>::iterator iter = codecs->begin();
-       iter != codecs->end(); ++iter) {
+template <class T>
+bool PopWildcardCodec(std::vector<T>* codecs, T* wildcard_codec) {
+  for (auto iter = codecs->begin(); iter != codecs->end(); ++iter) {
     if (iter->id == kWildcardPayloadType) {
       *wildcard_codec = *iter;
       codecs->erase(iter);
@@ -2449,18 +2448,17 @@
   return false;
 }
 
-void UpdateFromWildcardVideoCodecs(VideoContentDescription* video_desc) {
-  std::vector<cricket::VideoCodec> codecs = video_desc->codecs();
-  cricket::VideoCodec wildcard_codec;
+template<class T>
+void UpdateFromWildcardCodecs(cricket::MediaContentDescriptionImpl<T>* desc) {
+  auto codecs = desc->codecs();
+  T wildcard_codec;
   if (!PopWildcardCodec(&codecs, &wildcard_codec)) {
     return;
   }
-  for (std::vector<cricket::VideoCodec>::iterator iter = codecs.begin();
-       iter != codecs.end(); ++iter) {
-    cricket::VideoCodec& codec = *iter;
+  for (auto& codec : codecs) {
     AddFeedbackParameters(wildcard_codec.feedback_params, &codec);
   }
-  video_desc->set_codecs(codecs);
+  desc->set_codecs(codecs);
 }
 
 void AddAudioAttribute(const std::string& name, const std::string& value,
@@ -2704,6 +2702,8 @@
   if (media_type == cricket::MEDIA_TYPE_AUDIO) {
     AudioContentDescription* audio_desc =
         static_cast<AudioContentDescription*>(media_desc);
+    UpdateFromWildcardCodecs(audio_desc);
+
     // Verify audio codec ensures that no audio codec has been populated with
     // only fmtp.
     if (!VerifyAudioCodecs(audio_desc)) {
@@ -2714,14 +2714,14 @@
   }
 
   if (media_type == cricket::MEDIA_TYPE_VIDEO) {
-      VideoContentDescription* video_desc =
-          static_cast<VideoContentDescription*>(media_desc);
-      UpdateFromWildcardVideoCodecs(video_desc);
-      // Verify video codec ensures that no video codec has been populated with
-      // only rtcp-fb.
-      if (!VerifyVideoCodecs(video_desc)) {
-        return ParseFailed("Failed to parse video codecs correctly.", error);
-      }
+    VideoContentDescription* video_desc =
+        static_cast<VideoContentDescription*>(media_desc);
+    UpdateFromWildcardCodecs(video_desc);
+    // Verify video codec ensures that no video codec has been populated with
+    // only rtcp-fb.
+    if (!VerifyVideoCodecs(video_desc)) {
+      return ParseFailed("Failed to parse video codecs correctly.", error);
+    }
   }
 
   // RFC 5245
diff --git a/talk/app/webrtc/webrtcsdp_unittest.cc b/talk/app/webrtc/webrtcsdp_unittest.cc
index 0778491..a80f401 100644
--- a/talk/app/webrtc/webrtcsdp_unittest.cc
+++ b/talk/app/webrtc/webrtcsdp_unittest.cc
@@ -1255,7 +1255,7 @@
 
   void TestDeserializeRtcpFb(JsepSessionDescription* jdesc_output,
                              bool use_wildcard) {
-    std::string sdp =
+    std::string sdp_session_and_audio =
         "v=0\r\n"
         "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
         "s=-\r\n"
@@ -1265,17 +1265,19 @@
         // description.
         "a=msid-semantic: WMS\r\n"
         "m=audio 9 RTP/SAVPF 111\r\n"
-        "a=rtpmap:111 opus/48000/2\r\n"
-        "a=rtcp-fb:111 nack\r\n"
+        "a=rtpmap:111 opus/48000/2\r\n";
+    std::string sdp_video =
         "m=video 3457 RTP/SAVPF 101\r\n"
         "a=rtpmap:101 VP8/90000\r\n"
         "a=rtcp-fb:101 nack\r\n"
         "a=rtcp-fb:101 nack pli\r\n"
-        "a=rtcp-fb:101 goog-remb\r\n"
-        "a=rtcp-fb:101 ccm fir\r\n";
+        "a=rtcp-fb:101 goog-remb\r\n";
     std::ostringstream os;
+    os << sdp_session_and_audio;
+    os << "a=rtcp-fb:" << (use_wildcard ? "*" : "111") <<  " nack\r\n";
+    os << sdp_video;
     os << "a=rtcp-fb:" << (use_wildcard ? "*" : "101") <<  " ccm fir\r\n";
-    sdp += os.str();
+    std::string sdp = os.str();
     // Deserialize
     SdpParseError error;
     EXPECT_TRUE(webrtc::SdpDeserialize(sdp, jdesc_output, &error));
