1ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org/* 2ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 3ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org * 4ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org * Use of this source code is governed by a BSD-style license 5ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org * that can be found in the LICENSE file in the root of the source 6ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org * tree. An additional intellectual property rights grant can be found 7ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org * in the file PATENTS. All contributing project authors may 8ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org */ 10ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org 11ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org#ifndef WEBRTC_VIDEO_ENCODER_H_ 12ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org#define WEBRTC_VIDEO_ENCODER_H_ 13ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org 14b7d9a97ce41022e984348efb5f28bf6dd6c6b779Peter Boström#include <string> 15ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org#include <vector> 16ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org 176cd6ba8ae016200a7a13b43294b8faf5d1d4affdpbos@webrtc.org#include "webrtc/common_types.h" 18ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org#include "webrtc/typedefs.h" 19ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org#include "webrtc/video_frame.h" 20ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org 21ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.orgnamespace webrtc { 22ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org 23ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.orgclass RTPFragmentationHeader; 24ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org// TODO(pbos): Expose these through a public (root) header or change these APIs. 25ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.orgstruct CodecSpecificInfo; 26ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.orgstruct VideoCodec; 27ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org 28ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.orgclass EncodedImageCallback { 29ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org public: 30ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org virtual ~EncodedImageCallback() {} 31ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org 32ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org // Callback function which is called when an image has been encoded. 33f31f56d8d48dbc3c981d445891e83a68dc9d8f6achangbin.shao@webrtc.org virtual int32_t Encoded(const EncodedImage& encoded_image, 34f31f56d8d48dbc3c981d445891e83a68dc9d8f6achangbin.shao@webrtc.org const CodecSpecificInfo* codec_specific_info, 35f31f56d8d48dbc3c981d445891e83a68dc9d8f6achangbin.shao@webrtc.org const RTPFragmentationHeader* fragmentation) = 0; 36ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org}; 37ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org 38ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.orgclass VideoEncoder { 39ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org public: 40ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org enum EncoderType { 4171f6f4405c1c5f60097f8d10841378088e78e8b9Zeke Chin kH264, 42ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org kVp8, 435b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org kVp9, 444d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström kUnsupportedCodec, 45ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org }; 46ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org 47ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org static VideoEncoder* Create(EncoderType codec_type); 48ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org 496cd6ba8ae016200a7a13b43294b8faf5d1d4affdpbos@webrtc.org static VideoCodecVP8 GetDefaultVp8Settings(); 505b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org static VideoCodecVP9 GetDefaultVp9Settings(); 516cd6ba8ae016200a7a13b43294b8faf5d1d4affdpbos@webrtc.org static VideoCodecH264 GetDefaultH264Settings(); 526cd6ba8ae016200a7a13b43294b8faf5d1d4affdpbos@webrtc.org 53ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org virtual ~VideoEncoder() {} 54ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org 555b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Initialize the encoder with the information from the codecSettings 565b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // 575b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Input: 585b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // - codec_settings : Codec settings 595b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // - number_of_cores : Number of cores available for the encoder 605b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // - max_payload_size : The maximum size each payload is allowed 615b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // to have. Usually MTU - overhead. 625b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // 635b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Return value : Set bit rate if OK 645b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // <0 - Errors: 655b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // WEBRTC_VIDEO_CODEC_ERR_PARAMETER 665b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // WEBRTC_VIDEO_CODEC_ERR_SIZE 675b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // WEBRTC_VIDEO_CODEC_LEVEL_EXCEEDED 685b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // WEBRTC_VIDEO_CODEC_MEMORY 695b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // WEBRTC_VIDEO_CODEC_ERROR 70ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org virtual int32_t InitEncode(const VideoCodec* codec_settings, 71ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org int32_t number_of_cores, 724591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org size_t max_payload_size) = 0; 735b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org 745b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Register an encode complete callback object. 755b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // 765b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Input: 775b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // - callback : Callback object which handles encoded images. 785b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // 795b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Return value : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise. 80ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org virtual int32_t RegisterEncodeCompleteCallback( 81ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org EncodedImageCallback* callback) = 0; 82ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org 835b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Free encoder memory. 845b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Return value : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise. 855b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org virtual int32_t Release() = 0; 86b1dac33cac5a64cbec6b0fd72624fa9d3060376chenrike@webrtc.org 875b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Encode an I420 image (as a part of a video stream). The encoded image 885b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // will be returned to the user through the encode complete callback. 895b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // 905b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Input: 915b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // - frame : Image to be encoded 925b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // - frame_types : Frame type to be generated by the encoder. 935b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // 945b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Return value : WEBRTC_VIDEO_CODEC_OK if OK 955b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // <0 - Errors: 965b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // WEBRTC_VIDEO_CODEC_ERR_PARAMETER 975b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // WEBRTC_VIDEO_CODEC_MEMORY 985b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // WEBRTC_VIDEO_CODEC_ERROR 995b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // WEBRTC_VIDEO_CODEC_TIMEOUT 1004765070b8d6f024509c717c04d9b708750666927Miguel Casas-Sanchez virtual int32_t Encode(const VideoFrame& frame, 101ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org const CodecSpecificInfo* codec_specific_info, 10222993e1a0c114122fc1b9de0fc74d4096ec868bdpbos const std::vector<FrameType>* frame_types) = 0; 103ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org 1045b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Inform the encoder of the new packet loss rate and the round-trip time of 1055b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // the network. 1065b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // 1075b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Input: 1085b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // - packet_loss : Fraction lost 1095b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // (loss rate in percent = 100 * packetLoss / 255) 1105b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // - rtt : Round-trip time in milliseconds 1115b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Return value : WEBRTC_VIDEO_CODEC_OK if OK 1125b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // <0 - Errors: WEBRTC_VIDEO_CODEC_ERROR 11316825b1a828bb4ff40f7682040e43a239b7b8ca3pkasting@chromium.org virtual int32_t SetChannelParameters(uint32_t packet_loss, int64_t rtt) = 0; 1145b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org 1155b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Inform the encoder about the new target bit rate. 1165b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // 1175b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Input: 1185b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // - bitrate : New target bit rate 1195b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // - framerate : The target frame rate 1205b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // 1215b8831782074d490969171de5f8c67251f36d9ccmarpan@webrtc.org // Return value : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise. 122ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org virtual int32_t SetRates(uint32_t bitrate, uint32_t framerate) = 0; 123ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org 124ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org virtual int32_t SetPeriodicKeyFrames(bool enable) { return -1; } 125eb66e800d1f5f74ab366715d2618fbede8cf3e12Peter Boström virtual void OnDroppedFrame() {} 1266e2ce6e1ae41d8eeb0f233cbd26087daa03ab702jackychen virtual int GetTargetFramerate() { return -1; } 127eb66e800d1f5f74ab366715d2618fbede8cf3e12Peter Boström virtual bool SupportsNativeHandle() const { return false; } 128b7d9a97ce41022e984348efb5f28bf6dd6c6b779Peter Boström virtual const char* ImplementationName() const { return "unknown"; } 129ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org}; 130ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org 1314d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström// Class used to wrap external VideoEncoders to provide a fallback option on 1324d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström// software encoding when a hardware encoder fails to encode a stream due to 1334d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström// hardware restrictions, such as max resolution. 1344d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boströmclass VideoEncoderSoftwareFallbackWrapper : public VideoEncoder { 1354d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström public: 1364d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström VideoEncoderSoftwareFallbackWrapper(VideoCodecType codec_type, 1374d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström webrtc::VideoEncoder* encoder); 1384d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström 1394d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström int32_t InitEncode(const VideoCodec* codec_settings, 1404d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström int32_t number_of_cores, 1414d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström size_t max_payload_size) override; 1424d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström 1434d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström int32_t RegisterEncodeCompleteCallback( 1444d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström EncodedImageCallback* callback) override; 1454d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström 1464d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström int32_t Release() override; 1474765070b8d6f024509c717c04d9b708750666927Miguel Casas-Sanchez int32_t Encode(const VideoFrame& frame, 1484d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström const CodecSpecificInfo* codec_specific_info, 14922993e1a0c114122fc1b9de0fc74d4096ec868bdpbos const std::vector<FrameType>* frame_types) override; 1504d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström int32_t SetChannelParameters(uint32_t packet_loss, int64_t rtt) override; 1514d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström 1524d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström int32_t SetRates(uint32_t bitrate, uint32_t framerate) override; 1534d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström void OnDroppedFrame() override; 1546e2ce6e1ae41d8eeb0f233cbd26087daa03ab702jackychen int GetTargetFramerate() override; 155eb66e800d1f5f74ab366715d2618fbede8cf3e12Peter Boström bool SupportsNativeHandle() const override; 156b7d9a97ce41022e984348efb5f28bf6dd6c6b779Peter Boström const char* ImplementationName() const override; 1574d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström 1584d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström private: 159b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric bool InitFallbackEncoder(); 160b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric 161b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric // Settings used in the last InitEncode call and used if a dynamic fallback to 162b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric // software is required. 163b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric VideoCodec codec_settings_; 164b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric int32_t number_of_cores_; 165b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric size_t max_payload_size_; 166b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric 167b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric // The last bitrate/framerate set, and a flag for noting they are set. 168b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric bool rates_set_; 169b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric uint32_t bitrate_; 170b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric uint32_t framerate_; 171b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric 172b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric // The last channel parameters set, and a flag for noting they are set. 173b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric bool channel_parameters_set_; 174b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric uint32_t packet_loss_; 175b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric int64_t rtt_; 176b1ce663d16e0aa882aa4767ea8404f8c48a7370dnoahric 1774d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström const EncoderType encoder_type_; 1784d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström webrtc::VideoEncoder* const encoder_; 1794d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström 1804d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström rtc::scoped_ptr<webrtc::VideoEncoder> fallback_encoder_; 181b7d9a97ce41022e984348efb5f28bf6dd6c6b779Peter Boström std::string fallback_implementation_name_; 1824d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström EncodedImageCallback* callback_; 1834d71edef45afa38b3f68b6af0519ac0f21d327dfPeter Boström}; 184ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org} // namespace webrtc 185ab990ae43a2b84b103cb3c50bc38502375c13e68pbos@webrtc.org#endif // WEBRTC_VIDEO_ENCODER_H_ 186