Index: webrtc/modules/video_coding/generic_encoder.cc |
diff --git a/webrtc/modules/video_coding/generic_encoder.cc b/webrtc/modules/video_coding/generic_encoder.cc |
index 2463cf5c7a53020ed701539e91ab2514d628d16a..b9381f542c135d434b74180ece706d8f387a79ee 100644 |
--- a/webrtc/modules/video_coding/generic_encoder.cc |
+++ b/webrtc/modules/video_coding/generic_encoder.cc |
@@ -91,8 +91,6 @@ void CopyCodecSpecific(const CodecSpecificInfo* info, RTPVideoHeader* rtp) { |
} |
} // namespace |
-// #define DEBUG_ENCODER_BIT_STREAM |
- |
VCMGenericEncoder::VCMGenericEncoder( |
VideoEncoder* encoder, |
VideoEncoderRateObserver* rate_observer, |
@@ -131,6 +129,7 @@ int32_t VCMGenericEncoder::InitEncode(const VideoCodec* settings, |
return -1; |
} |
encoder_->RegisterEncodeCompleteCallback(vcm_encoded_frame_callback_); |
+ vcm_encoded_frame_callback_->codec_type_ = settings->codecType; |
return 0; |
} |
@@ -234,22 +233,9 @@ VCMEncodedFrameCallback::VCMEncodedFrameCallback( |
_payloadType(0), |
_internalSource(false), |
_rotation(kVideoRotation_0), |
- post_encode_callback_(post_encode_callback) |
-#ifdef DEBUG_ENCODER_BIT_STREAM |
- , |
- _bitStreamAfterEncoder(NULL) |
-#endif |
-{ |
-#ifdef DEBUG_ENCODER_BIT_STREAM |
- _bitStreamAfterEncoder = fopen("encoderBitStream.bit", "wb"); |
-#endif |
-} |
+ post_encode_callback_(post_encode_callback) {} |
-VCMEncodedFrameCallback::~VCMEncodedFrameCallback() { |
-#ifdef DEBUG_ENCODER_BIT_STREAM |
- fclose(_bitStreamAfterEncoder); |
-#endif |
-} |
+VCMEncodedFrameCallback::~VCMEncodedFrameCallback() {} |
int32_t VCMEncodedFrameCallback::SetTransportCallback( |
VCMPacketizationCallback* transport) { |
@@ -269,12 +255,20 @@ int32_t VCMEncodedFrameCallback::Encoded( |
return VCM_UNINITIALIZED; |
} |
-#ifdef DEBUG_ENCODER_BIT_STREAM |
- if (_bitStreamAfterEncoder != NULL) { |
- fwrite(encoded_image._buffer, 1, encoded_image._length, |
- _bitStreamAfterEncoder); |
+ if (kEnableFrameRecording) { |
+ int layer = GetLayer(*codecSpecificInfo); |
+ if (file_writers_[layer] == nullptr) { |
+ uint64_t instance_id = reinterpret_cast<uint64_t>(this); |
+ std::ostringstream oss; |
+ oss << "bitstream_" << instance_id << "_" << layer << ".ivf"; |
+ file_writers_[layer] = |
+ IvfFileWriter::Open(oss.str().c_str(), codec_type_); |
+ } |
+ if (file_writers_[layer].get() != nullptr) { |
+ bool ok = file_writers_[layer]->WriteFrame(encoded_image); |
+ RTC_DCHECK(ok); |
+ } |
} |
-#endif |
RTPVideoHeader rtpVideoHeader; |
memset(&rtpVideoHeader, 0, sizeof(RTPVideoHeader)); |
@@ -309,4 +303,17 @@ void VCMEncodedFrameCallback::SignalLastEncoderImplementationUsed( |
send_callback_->OnEncoderImplementationName(implementation_name); |
} |
+int VCMEncodedFrameCallback::GetLayer(const CodecSpecificInfo& codec_specific) { |
+ switch (codec_type_) { |
+ case kVideoCodecVP8: |
+ return codec_specific.codecSpecific.VP8.simulcastIdx; |
+ case kVideoCodecVP9: |
+ case kVideoCodecH264: |
+ return 1; |
+ default: |
+ RTC_NOTREACHED(); |
+ return -1; |
+ } |
+} |
+ |
} // namespace webrtc |