Index: third_party/openh264/testing/h264_codec_tester.cc |
diff --git a/third_party/openh264/testing/h264_codec_tester.cc b/third_party/openh264/testing/h264_codec_tester.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cdf9d8152cd1692e4055a9594cf6310d665e3cce |
--- /dev/null |
+++ b/third_party/openh264/testing/h264_codec_tester.cc |
@@ -0,0 +1,112 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "third_party/openh264/testing/h264_codec_tester.h" |
+ |
+using namespace webrtc; |
+ |
+namespace openh264 { |
+ |
+H264CodecTester::H264CodecTester() : last_encoded_image_(nullptr), |
+ last_decoded_image_(nullptr) { |
+} |
+ |
+H264CodecTester::~H264CodecTester() { |
+ encoder_.Release(); |
+ decoder_.Release(); |
+} |
+ |
+bool H264CodecTester::Init(unsigned short width, unsigned short height) { |
+ const int32_t number_of_cores = 1; |
+ const size_t max_payload_size = 0; |
+ |
+ // Codec settings... |
+ VideoCodec codec; |
+ memset(&codec, 0, sizeof(codec)); |
+ |
+ codec.codecType = kVideoCodecH264; |
+ strncpy(codec.plName, "H264", 5); |
+ codec.plType = 120; |
+ |
+ codec.width = width; |
+ codec.height = height; |
+ |
+ codec.minBitrate = 300; |
+ codec.maxBitrate = 600; |
+ codec.targetBitrate = 450; |
+ codec.startBitrate = codec.minBitrate; |
+ codec.maxFramerate = 30; |
+ |
+ memset(&codec.codecSpecific.H264, 0, sizeof(codec.codecSpecific.H264)); |
+ codec.codecSpecific.H264.profile = kProfileBase; |
+ codec.codecSpecific.H264.frameDroppingOn = true; |
+ codec.codecSpecific.H264.keyFrameInterval = 3000; |
+ codec.codecSpecific.H264.spsData = nullptr; |
+ codec.codecSpecific.H264.spsLen = 0; |
+ codec.codecSpecific.H264.ppsData = nullptr; |
+ codec.codecSpecific.H264.ppsLen = 0; |
+ |
+ codec.qpMax = 56; |
+ codec.numberOfSimulcastStreams = 1; |
+ codec.simulcastStream[0].width = codec.width; |
+ codec.simulcastStream[0].height = codec.height; |
+ codec.simulcastStream[0].minBitrate = codec.minBitrate; |
+ codec.simulcastStream[0].maxBitrate = codec.maxBitrate; |
+ codec.simulcastStream[0].targetBitrate = codec.targetBitrate; |
+ codec.simulcastStream[0].qpMax = codec.qpMax; |
+ codec.simulcastStream[0].numberOfTemporalLayers = 1; |
+ |
+ codec.mode = kRealtimeVideo; |
+ codec.extra_options = nullptr; |
+ |
+ // Initialize encoder and decoder. |
+ if (encoder_.InitEncode(&codec, number_of_cores, max_payload_size) |
+ != WEBRTC_VIDEO_CODEC_OK) { |
+ encoder_.Release(); |
+ return false; |
+ } |
+ if (decoder_.InitDecode(&codec, number_of_cores) != WEBRTC_VIDEO_CODEC_OK) { |
+ encoder_.Release(); |
+ decoder_.Release(); |
+ return false; |
+ } |
+ |
+ // Register so that Encoded and Decoded will be called. |
+ encoder_.RegisterEncodeCompleteCallback(this); |
+ decoder_.RegisterDecodeCompleteCallback(this); |
+ |
+ return true; |
+} |
+ |
+bool H264CodecTester::Encode(const VideoFrame& frame) { |
+ last_encoded_image_ = nullptr; |
+ if (encoder_.Encode(frame, nullptr, nullptr) != WEBRTC_VIDEO_CODEC_OK || |
+ !last_encoded_image_) { |
+ return false; |
+ } |
+ return true; |
+} |
+ |
+VideoFrame* H264CodecTester::Decode() { |
+ last_decoded_image_ = nullptr; |
+ if (decoder_.Decode(*last_encoded_image_, false, nullptr) |
+ != WEBRTC_VIDEO_CODEC_OK || !last_decoded_image_) { |
+ return nullptr; |
+ } |
+ return last_decoded_image_; |
+} |
+ |
+int32_t H264CodecTester::Encoded(const EncodedImage& encoded_image, |
+ const CodecSpecificInfo* codec_specific_info, |
+ const RTPFragmentationHeader* fragmentation) { |
+ last_encoded_image_ = &encoded_image; |
+ return WEBRTC_VIDEO_CODEC_OK; |
+} |
+ |
+int32_t H264CodecTester::Decoded(VideoFrame& decoded_image) { |
+ last_decoded_image_ = &decoded_image; |
+ return WEBRTC_VIDEO_CODEC_OK; |
+} |
+ |
+} // namespace openh264 |