diff --git a/webrtc/modules/audio_coding/neteq/comfort_noise.cc b/webrtc/modules/audio_coding/neteq/comfort_noise.cc
index 54b0a28..da9683b 100644
--- a/webrtc/modules/audio_coding/neteq/comfort_noise.cc
+++ b/webrtc/modules/audio_coding/neteq/comfort_noise.cc
@@ -12,6 +12,7 @@
 
 #include <assert.h>
 
+#include "webrtc/base/logging.h"
 #include "webrtc/modules/audio_coding/codecs/audio_decoder.h"
 #include "webrtc/modules/audio_coding/codecs/cng/include/webrtc_cng.h"
 #include "webrtc/modules/audio_coding/neteq/decoder_database.h"
@@ -44,6 +45,7 @@
   delete packet;
   if (ret < 0) {
     internal_error_code_ = WebRtcCng_GetErrorCodeDec(cng_inst);
+    LOG(LS_ERROR) << "WebRtcCng_UpdateSid produced " << internal_error_code_;
     return kInternalError;
   }
   return kOK;
@@ -56,6 +58,7 @@
          fs_hz_ == 48000);
   // Not adapted for multi-channel yet.
   if (output->Channels() != 1) {
+    LOG(LS_ERROR) << "No multi-channel support";
     return kMultiChannelNotSupported;
   }
 
@@ -70,6 +73,7 @@
   // Get the decoder from the database.
   AudioDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder();
   if (!cng_decoder) {
+    LOG(LS_ERROR) << "Unknwown payload type";
     return kUnknownPayloadType;
   }
   CNG_dec_inst* cng_inst = cng_decoder->CngDecoderInstance();
@@ -81,6 +85,7 @@
     // Error returned.
     output->Zeros(requested_length);
     internal_error_code_ = WebRtcCng_GetErrorCodeDec(cng_inst);
+    LOG(LS_ERROR) << "WebRtcCng_Generate produced " << internal_error_code_;
     return kInternalError;
   }
 
diff --git a/webrtc/modules/audio_coding/neteq/decoder_database.cc b/webrtc/modules/audio_coding/neteq/decoder_database.cc
index b9097b0..18eee06 100644
--- a/webrtc/modules/audio_coding/neteq/decoder_database.cc
+++ b/webrtc/modules/audio_coding/neteq/decoder_database.cc
@@ -13,6 +13,7 @@
 #include <assert.h>
 #include <utility>  // pair
 
+#include "webrtc/base/logging.h"
 #include "webrtc/modules/audio_coding/codecs/audio_decoder.h"
 
 namespace webrtc {
@@ -249,6 +250,8 @@
   for (it = packet_list.begin(); it != packet_list.end(); ++it) {
     if (decoders_.find((*it)->header.payloadType) == decoders_.end()) {
       // Payload type is not found.
+      LOG(LS_WARNING) << "CheckPayloadTypes: unknown RTP payload type "
+                      << static_cast<int>((*it)->header.payloadType);
       return kDecoderNotFound;
     }
   }
diff --git a/webrtc/modules/audio_coding/neteq/dtmf_buffer.cc b/webrtc/modules/audio_coding/neteq/dtmf_buffer.cc
index 24aa9fe..b3c02e0 100644
--- a/webrtc/modules/audio_coding/neteq/dtmf_buffer.cc
+++ b/webrtc/modules/audio_coding/neteq/dtmf_buffer.cc
@@ -13,6 +13,9 @@
 #include <assert.h>
 #include <algorithm>  // max
 
+#include "webrtc/base/checks.h"
+#include "webrtc/base/logging.h"
+
 // Modify the code to obtain backwards bit-exactness. Once bit-exactness is no
 // longer required, this #define should be removed (and the code that it
 // enables).
@@ -67,10 +70,10 @@
                            const uint8_t* payload,
                            size_t payload_length_bytes,
                            DtmfEvent* event) {
-  if (!payload || !event) {
-    return kInvalidPointer;
-  }
+  CHECK(payload);
+  CHECK(event);
   if (payload_length_bytes < 4) {
+    LOG(LS_WARNING) << "ParseEvent payload too short";
     return kPayloadTooShort;
   }
 
@@ -98,6 +101,7 @@
   if (event.event_no < 0 || event.event_no > 15 ||
       event.volume < 0 || event.volume > 36 ||
       event.duration <= 0 || event.duration > 65535) {
+    LOG(LS_WARNING) << "InsertEvent invalid parameters";
     return kInvalidEventParameters;
   }
   DtmfList::iterator it = buffer_.begin();
diff --git a/webrtc/modules/audio_coding/neteq/dtmf_buffer_unittest.cc b/webrtc/modules/audio_coding/neteq/dtmf_buffer_unittest.cc
index 4824b2b..dad4e76 100644
--- a/webrtc/modules/audio_coding/neteq/dtmf_buffer_unittest.cc
+++ b/webrtc/modules/audio_coding/neteq/dtmf_buffer_unittest.cc
@@ -77,12 +77,6 @@
   EXPECT_EQ(timestamp, event.timestamp);
   EXPECT_EQ(volume, event.volume);
 
-  EXPECT_EQ(DtmfBuffer::kInvalidPointer,
-            DtmfBuffer::ParseEvent(timestamp, NULL, 4, &event));
-
-  EXPECT_EQ(DtmfBuffer::kInvalidPointer,
-            DtmfBuffer::ParseEvent(timestamp, payload_ptr, 4, NULL));
-
   EXPECT_EQ(DtmfBuffer::kPayloadTooShort,
             DtmfBuffer::ParseEvent(timestamp, payload_ptr, 3, &event));
 }
diff --git a/webrtc/modules/audio_coding/neteq/neteq_impl.cc b/webrtc/modules/audio_coding/neteq/neteq_impl.cc
index 6598a79..3b81999 100644
--- a/webrtc/modules/audio_coding/neteq/neteq_impl.cc
+++ b/webrtc/modules/audio_coding/neteq/neteq_impl.cc
@@ -15,6 +15,7 @@
 
 #include <algorithm>
 
+#include "webrtc/base/logging.h"
 #include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
 #include "webrtc/modules/audio_coding/codecs/audio_decoder.h"
 #include "webrtc/modules/audio_coding/neteq/accelerate.h"
@@ -40,7 +41,6 @@
 #include "webrtc/modules/audio_coding/neteq/timestamp_scaler.h"
 #include "webrtc/modules/interface/module_common_types.h"
 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
-#include "webrtc/system_wrappers/interface/logging.h"
 
 // Modify the code to obtain backwards bit-exactness. Once bit-exactness is no
 // longer required, this #define should be removed (and the code that it
@@ -102,7 +102,6 @@
         "Changing to 8000 Hz.";
     fs = 8000;
   }
-  LOG(LS_VERBOSE) << "Create NetEqImpl object with fs = " << fs << ".";
   fs_hz_ = fs;
   fs_mult_ = fs / 8000;
   output_size_samples_ = kOutputSizeMs * 8 * fs_mult_;
@@ -113,9 +112,7 @@
   }
 }
 
-NetEqImpl::~NetEqImpl() {
-  LOG(LS_INFO) << "Deleting NetEqImpl object.";
-}
+NetEqImpl::~NetEqImpl() = default;
 
 int NetEqImpl::InsertPacket(const WebRtcRTPHeader& rtp_header,
                             const uint8_t* payload,
@@ -130,7 +127,6 @@
   int error = InsertPacketInternal(rtp_header, payload, length_bytes,
                                    receive_timestamp, false);
   if (error != 0) {
-    LOG_FERR1(LS_WARNING, InsertPacketInternal, error);
     error_code_ = error;
     return kFail;
   }
@@ -151,7 +147,6 @@
       rtp_header, kSyncPayload, sizeof(kSyncPayload), receive_timestamp, true);
 
   if (error != 0) {
-    LOG_FERR1(LS_WARNING, InsertPacketInternal, error);
     error_code_ = error;
     return kFail;
   }
@@ -168,7 +163,6 @@
   LOG(LS_VERBOSE) << "Produced " << *samples_per_channel <<
       " samples/channel for " << *num_channels << " channel(s)";
   if (error != 0) {
-    LOG_FERR1(LS_WARNING, GetAudioInternal, error);
     error_code_ = error;
     return kFail;
   }
@@ -181,11 +175,10 @@
 int NetEqImpl::RegisterPayloadType(enum NetEqDecoder codec,
                                    uint8_t rtp_payload_type) {
   CriticalSectionScoped lock(crit_sect_.get());
-  LOG_API2(static_cast<int>(rtp_payload_type), codec);
+  LOG(LS_VERBOSE) << "RegisterPayloadType "
+                  << static_cast<int>(rtp_payload_type) << " " << codec;
   int ret = decoder_database_->RegisterPayload(rtp_payload_type, codec);
   if (ret != DecoderDatabase::kOK) {
-    LOG_FERR2(LS_WARNING, RegisterPayload, static_cast<int>(rtp_payload_type),
-              codec);
     switch (ret) {
       case DecoderDatabase::kInvalidRtpPayloadType:
         error_code_ = kInvalidRtpPayloadType;
@@ -209,7 +202,8 @@
                                        uint8_t rtp_payload_type,
                                        int sample_rate_hz) {
   CriticalSectionScoped lock(crit_sect_.get());
-  LOG_API2(static_cast<int>(rtp_payload_type), codec);
+  LOG(LS_VERBOSE) << "RegisterExternalDecoder "
+                  << static_cast<int>(rtp_payload_type) << " " << codec;
   if (!decoder) {
     LOG(LS_ERROR) << "Cannot register external decoder with NULL pointer";
     assert(false);
@@ -218,8 +212,6 @@
   int ret = decoder_database_->InsertExternal(rtp_payload_type, codec,
                                               sample_rate_hz, decoder);
   if (ret != DecoderDatabase::kOK) {
-    LOG_FERR2(LS_WARNING, InsertExternal, static_cast<int>(rtp_payload_type),
-              codec);
     switch (ret) {
       case DecoderDatabase::kInvalidRtpPayloadType:
         error_code_ = kInvalidRtpPayloadType;
@@ -246,7 +238,6 @@
 
 int NetEqImpl::RemovePayloadType(uint8_t rtp_payload_type) {
   CriticalSectionScoped lock(crit_sect_.get());
-  LOG_API1(static_cast<int>(rtp_payload_type));
   int ret = decoder_database_->Remove(rtp_payload_type);
   if (ret == DecoderDatabase::kOK) {
     return kOK;
@@ -255,7 +246,6 @@
   } else {
     error_code_ = kOtherError;
   }
-  LOG_FERR1(LS_WARNING, Remove, static_cast<int>(rtp_payload_type));
   return kFail;
 }
 
@@ -389,7 +379,7 @@
 
 void NetEqImpl::FlushBuffers() {
   CriticalSectionScoped lock(crit_sect_.get());
-  LOG_API0();
+  LOG(LS_VERBOSE) << "FlushBuffers";
   packet_buffer_->Flush();
   assert(sync_buffer_.get());
   assert(expand_.get());
@@ -517,7 +507,6 @@
   if (decoder_database_->IsRed(main_header.payloadType)) {
     assert(!is_sync_packet);  // We had a sanity check for this.
     if (payload_splitter_->SplitRed(&packet_list) != PayloadSplitter::kOK) {
-      LOG_FERR1(LS_WARNING, SplitRed, packet_list.size());
       PacketBuffer::DeleteAllPackets(&packet_list);
       return kRedundancySplitError;
     }
@@ -532,7 +521,6 @@
   // Check payload types.
   if (decoder_database_->CheckPayloadTypes(packet_list) ==
       DecoderDatabase::kDecoderNotFound) {
-    LOG_FERR1(LS_WARNING, CheckPayloadTypes, packet_list.size());
     PacketBuffer::DeleteAllPackets(&packet_list);
     return kUnknownRtpPayloadType;
   }
@@ -556,13 +544,10 @@
           current_packet->payload_length,
           &event);
       if (ret != DtmfBuffer::kOK) {
-        LOG_FERR2(LS_WARNING, ParseEvent, ret,
-                  current_packet->payload_length);
         PacketBuffer::DeleteAllPackets(&packet_list);
         return kDtmfParsingError;
       }
       if (dtmf_buffer_->InsertEvent(event) != DtmfBuffer::kOK) {
-        LOG_FERR0(LS_WARNING, InsertEvent);
         PacketBuffer::DeleteAllPackets(&packet_list);
         return kDtmfInsertError;
       }
@@ -578,7 +563,6 @@
   // Check for FEC in packets, and separate payloads into several packets.
   int ret = payload_splitter_->SplitFec(&packet_list, decoder_database_.get());
   if (ret != PayloadSplitter::kOK) {
-    LOG_FERR1(LS_WARNING, SplitFec, packet_list.size());
     PacketBuffer::DeleteAllPackets(&packet_list);
     switch (ret) {
       case PayloadSplitter::kUnknownPayloadType:
@@ -593,7 +577,6 @@
   // sync-packets.
   ret = payload_splitter_->SplitAudio(&packet_list, *decoder_database_);
   if (ret != PayloadSplitter::kOK) {
-    LOG_FERR1(LS_WARNING, SplitAudio, packet_list.size());
     PacketBuffer::DeleteAllPackets(&packet_list);
     switch (ret) {
       case PayloadSplitter::kUnknownPayloadType:
@@ -630,9 +613,7 @@
     // Reset DSP timestamp etc. if packet buffer flushed.
     new_codec_ = true;
     update_sample_rate_and_channels = true;
-    LOG_F(LS_WARNING) << "Packet buffer flushed";
   } else if (ret != PacketBuffer::kOK) {
-    LOG_FERR1(LS_WARNING, InsertPacketList, packet_list.size());
     PacketBuffer::DeleteAllPackets(&packet_list);
     return kOtherError;
   }
@@ -716,7 +697,6 @@
   int return_value = GetDecision(&operation, &packet_list, &dtmf_event,
                                  &play_dtmf);
   if (return_value != 0) {
-    LOG_FERR1(LS_WARNING, GetDecision, return_value);
     assert(false);
     last_mode_ = kModeError;
     return return_value;
@@ -807,7 +787,7 @@
       break;
     }
     case kUndefined: {
-      LOG_F(LS_ERROR) << "Invalid operation kUndefined.";
+      LOG(LS_ERROR) << "Invalid operation kUndefined.";
       assert(false);  // This should not happen.
       last_mode_ = kModeError;
       return kInvalidOperation;
@@ -834,15 +814,17 @@
     num_output_samples_per_channel = static_cast<int>(
         max_length / sync_buffer_->Channels());
   }
-  int samples_from_sync = static_cast<int>(
-      sync_buffer_->GetNextAudioInterleaved(num_output_samples_per_channel,
-                                            output));
+  const int samples_from_sync =
+      static_cast<int>(sync_buffer_->GetNextAudioInterleaved(
+          num_output_samples_per_channel, output));
   *num_channels = static_cast<int>(sync_buffer_->Channels());
   LOG(LS_VERBOSE) << "Sync buffer (" << *num_channels << " channel(s)):" <<
       " insert " << algorithm_buffer_->Size() << " samples, extract " <<
       samples_from_sync << " samples";
   if (samples_from_sync != output_size_samples_) {
-    LOG_F(LS_ERROR) << "samples_from_sync != output_size_samples_";
+    LOG(LS_ERROR) << "samples_from_sync (" << samples_from_sync
+                  << ") != output_size_samples_ (" << output_size_samples_
+                  << ")";
     // TODO(minyue): treatment of under-run, filling zeros
     memset(output, 0, num_output_samples * sizeof(int16_t));
     *samples_per_channel = output_size_samples_;
@@ -983,7 +965,7 @@
     } else {
       assert(header);
       if (!header) {
-        LOG_F(LS_ERROR) << "Packet missing where it shouldn't.";
+        LOG(LS_ERROR) << "Packet missing where it shouldn't.";
         return -1;
       }
       timestamp_ = header->timestamp;
@@ -1129,7 +1111,6 @@
 
     extracted_samples = ExtractPackets(required_samples, packet_list);
     if (extracted_samples < 0) {
-      LOG_F(LS_WARNING) << "Failed to extract packets from buffer.";
       return kPacketBufferCorruption;
     }
   }
@@ -1165,7 +1146,8 @@
       decoder = decoder_database_->GetDecoder(payload_type);
       assert(decoder);
       if (!decoder) {
-        LOG_FERR1(LS_WARNING, GetDecoder, static_cast<int>(payload_type));
+        LOG(LS_WARNING) << "Unknown payload type "
+                        << static_cast<int>(payload_type);
         PacketBuffer::DeleteAllPackets(packet_list);
         return kDecoderNotFound;
       }
@@ -1177,7 +1159,8 @@
             ->GetDecoderInfo(payload_type);
         assert(decoder_info);
         if (!decoder_info) {
-          LOG_FERR1(LS_WARNING, GetDecoderInfo, static_cast<int>(payload_type));
+          LOG(LS_WARNING) << "Unknown payload type "
+                          << static_cast<int>(payload_type);
           PacketBuffer::DeleteAllPackets(packet_list);
           return kDecoderNotFound;
         }
@@ -1239,11 +1222,12 @@
       // Got some error code from the decoder.
       decoder_error_code_ = error_code;
       return_value = kDecoderErrorCode;
+      LOG(LS_WARNING) << "Decoder returned error code: " << error_code;
     } else {
       // Decoder does not implement error codes. Return generic error.
       return_value = kOtherDecoderError;
+      LOG(LS_WARNING) << "Decoder error (no error code)";
     }
-    LOG_FERR2(LS_WARNING, DecodeLoop, error_code, packet_list->size());
     *operation = kExpand;  // Do expansion to get data instead.
   }
   if (*speech_type != AudioDecoder::kComfortNoise) {
@@ -1329,14 +1313,14 @@
                       << decoder_frame_length_ << " samples per channel)";
     } else if (decode_length < 0) {
       // Error.
-      LOG_FERR2(LS_WARNING, Decode, decode_length, payload_length);
+      LOG(LS_WARNING) << "Decode " << decode_length << " " << payload_length;
       *decoded_length = -1;
       PacketBuffer::DeleteAllPackets(packet_list);
       break;
     }
     if (*decoded_length > static_cast<int>(decoded_buffer_length_)) {
       // Guard against overflow.
-      LOG_F(LS_WARNING) << "Decoded too much.";
+      LOG(LS_WARNING) << "Decoded too much.";
       PacketBuffer::DeleteAllPackets(packet_list);
       return kDecodedTooMuch;
     }
@@ -1614,7 +1598,6 @@
     // UpdateParameters() deletes |packet|.
     if (comfort_noise_->UpdateParameters(packet) ==
         ComfortNoise::kInternalError) {
-      LOG_FERR0(LS_WARNING, UpdateParameters);
       algorithm_buffer_->Zeros(output_size_samples_);
       return -comfort_noise_->internal_error_code();
     }
@@ -1627,11 +1610,9 @@
     dtmf_tone_generator_->Reset();
   }
   if (cn_return == ComfortNoise::kInternalError) {
-    LOG_FERR1(LS_WARNING, comfort_noise_->Generate, cn_return);
     decoder_error_code_ = comfort_noise_->internal_error_code();
     return kComfortNoiseErrorCode;
   } else if (cn_return == ComfortNoise::kUnknownPayloadType) {
-    LOG_FERR1(LS_WARNING, comfort_noise_->Generate, cn_return);
     return kUnknownRtpPayloadType;
   }
   return 0;
@@ -1800,6 +1781,7 @@
   const RTPHeader* header = packet_buffer_->NextRtpHeader();
   assert(header);
   if (!header) {
+    LOG(LS_ERROR) << "Packet buffer unexpectedly empty.";
     return -1;
   }
   uint32_t first_timestamp = header->timestamp;
@@ -1813,8 +1795,7 @@
     // |header| may be invalid after the |packet_buffer_| operation.
     header = NULL;
     if (!packet) {
-      LOG_FERR1(LS_ERROR, GetNextPacket, discard_count) <<
-          "Should always be able to extract a packet here";
+      LOG(LS_ERROR) << "Should always be able to extract a packet here";
       assert(false);  // Should always be able to extract a packet here.
       return -1;
     }
@@ -1850,9 +1831,8 @@
         }
       }
     } else {
-      LOG_FERR1(LS_WARNING, GetDecoder,
-                static_cast<int>(packet->header.payloadType))
-          << "Could not find a decoder for a packet about to be extracted.";
+      LOG(LS_WARNING) << "Unknown payload type "
+                      << static_cast<int>(packet->header.payloadType);
       assert(false);
     }
     if (packet_duration <= 0) {
@@ -1899,7 +1879,7 @@
 }
 
 void NetEqImpl::SetSampleRateAndChannels(int fs_hz, size_t channels) {
-  LOG_API2(fs_hz, channels);
+  LOG(LS_VERBOSE) << "SetSampleRateAndChannels " << fs_hz << " " << channels;
   // TODO(hlundin): Change to an enumerator and skip assert.
   assert(fs_hz == 8000 || fs_hz == 16000 || fs_hz ==  32000 || fs_hz == 48000);
   assert(channels > 0);
diff --git a/webrtc/modules/audio_coding/neteq/packet_buffer.cc b/webrtc/modules/audio_coding/neteq/packet_buffer.cc
index 07fa339..431e0f1 100644
--- a/webrtc/modules/audio_coding/neteq/packet_buffer.cc
+++ b/webrtc/modules/audio_coding/neteq/packet_buffer.cc
@@ -16,6 +16,7 @@
 
 #include <algorithm>  // find_if()
 
+#include "webrtc/base/logging.h"
 #include "webrtc/modules/audio_coding/codecs/audio_decoder.h"
 #include "webrtc/modules/audio_coding/neteq/decoder_database.h"
 
@@ -58,6 +59,7 @@
     if (packet) {
       delete packet;
     }
+    LOG(LS_WARNING) << "InsertPacket invalid packet";
     return kInvalidPacket;
   }
 
@@ -66,6 +68,7 @@
   if (buffer_.size() >= max_number_of_packets_) {
     // Buffer is full. Flush it.
     Flush();
+    LOG(LS_WARNING) << "Packet buffer flushed";
     return_val = kFlushed;
   }
 
diff --git a/webrtc/modules/audio_coding/neteq/payload_splitter.cc b/webrtc/modules/audio_coding/neteq/payload_splitter.cc
index c19375b..2172eee 100644
--- a/webrtc/modules/audio_coding/neteq/payload_splitter.cc
+++ b/webrtc/modules/audio_coding/neteq/payload_splitter.cc
@@ -12,6 +12,7 @@
 
 #include <assert.h>
 
+#include "webrtc/base/logging.h"
 #include "webrtc/modules/audio_coding/neteq/decoder_database.h"
 
 namespace webrtc {
@@ -88,6 +89,7 @@
         // The block lengths in the RED headers do not match the overall packet
         // length. Something is corrupt. Discard this and the remaining
         // payloads from this packet.
+        LOG(LS_WARNING) << "SplitRed length mismatch";
         while (new_it != new_packets.end()) {
           // Payload should not have been allocated yet.
           assert(!(*new_it)->payload);
@@ -130,6 +132,7 @@
     const DecoderDatabase::DecoderInfo* info =
         decoder_database->GetDecoderInfo(payload_type);
     if (!info) {
+      LOG(LS_WARNING) << "SplitFec unknown payload type";
       return kUnknownPayloadType;
     }
     // No splitting for a sync-packet.
@@ -171,6 +174,7 @@
         break;
       }
       default: {
+        LOG(LS_WARNING) << "SplitFec wrong payload type";
         return kFecSplitError;
       }
     }
@@ -222,6 +226,7 @@
     const DecoderDatabase::DecoderInfo* info =
         decoder_database.GetDecoderInfo(packet->header.payloadType);
     if (!info) {
+      LOG(LS_WARNING) << "SplitAudio unknown payload type";
       return kUnknownPayloadType;
     }
     // No splitting for a sync-packet.
@@ -297,6 +302,7 @@
         size_t bytes_per_frame;
         int timestamps_per_frame;
         if (packet->payload_length >= 950) {
+          LOG(LS_WARNING) << "SplitAudio too large iLBC payload";
           return kTooLargePayload;
         }
         if (packet->payload_length % 38 == 0) {
@@ -308,6 +314,7 @@
           bytes_per_frame = 50;
           timestamps_per_frame = 240;
         } else {
+          LOG(LS_WARNING) << "SplitAudio invalid iLBC payload";
           return kFrameSplitError;
         }
         int ret = SplitByFrames(packet, bytes_per_frame, timestamps_per_frame,
@@ -402,6 +409,7 @@
                                    uint32_t timestamps_per_frame,
                                    PacketList* new_packets) {
   if (packet->payload_length % bytes_per_frame != 0) {
+    LOG(LS_WARNING) << "SplitByFrames length mismatch";
     return kFrameSplitError;
   }
 
