/* * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. * */ #ifndef MODULES_VIDEO_CODING_CODECS_H264_H264_ENCODER_IMPL_H_ #define MODULES_VIDEO_CODING_CODECS_H264_H264_ENCODER_IMPL_H_ #include #include #include "api/video/i420_buffer.h" #include "common_video/h264/h264_bitstream_parser.h" #include "modules/video_coding/codecs/h264/include/h264.h" #include "modules/video_coding/utility/quality_scaler.h" #include "third_party/openh264/src/codec/api/svc/codec_app_def.h" class ISVCEncoder; namespace webrtc { class H264EncoderImpl : public H264Encoder { public: struct LayerConfig { int simulcast_idx = 0; int width = -1; int height = -1; bool sending = true; bool key_frame_request = false; float max_frame_rate = 0; uint32_t target_bps = 0; uint32_t max_bps = 0; bool frame_dropping_on = false; int key_frame_interval = 0; void SetStreamState(bool send_stream); }; public: explicit H264EncoderImpl(const cricket::VideoCodec& codec); ~H264EncoderImpl() override; // |max_payload_size| is ignored. // The following members of |codec_settings| are used. The rest are ignored. // - codecType (must be kVideoCodecH264) // - targetBitrate // - maxFramerate // - width // - height int32_t InitEncode(const VideoCodec* codec_settings, int32_t number_of_cores, size_t max_payload_size) override; int32_t Release() override; int32_t RegisterEncodeCompleteCallback( EncodedImageCallback* callback) override; int32_t SetRateAllocation(const VideoBitrateAllocation& bitrate_allocation, uint32_t framerate) override; // The result of encoding - an EncodedImage and RTPFragmentationHeader - are // passed to the encode complete callback. int32_t Encode(const VideoFrame& frame, const CodecSpecificInfo* codec_specific_info, const std::vector* frame_types) override; EncoderInfo GetEncoderInfo() const override; // Exposed for testing. H264PacketizationMode PacketizationModeForTesting() const { return packetization_mode_; } private: SEncParamExt CreateEncoderParams(size_t i) const; webrtc::H264BitstreamParser h264_bitstream_parser_; // Reports statistics with histograms. void ReportInit(); void ReportError(); std::vector encoders_; std::vector pictures_; std::vector> downscaled_buffers_; std::vector configurations_; std::vector encoded_images_; std::vector> encoded_image_buffers_; VideoCodec codec_; H264PacketizationMode packetization_mode_; size_t max_payload_size_; int32_t number_of_cores_; EncodedImageCallback* encoded_image_callback_; bool has_reported_init_; bool has_reported_error_; }; } // namespace webrtc #endif // MODULES_VIDEO_CODING_CODECS_H264_H264_ENCODER_IMPL_H_