|  | /* | 
|  | * Copyright (c) 2022, Alliance for Open Media. All rights reserved | 
|  | * | 
|  | * This source code is subject to the terms of the BSD 2 Clause License and | 
|  | * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License | 
|  | * was not distributed with this source code in the LICENSE file, you can | 
|  | * obtain it at www.aomedia.org/license/software. If the Alliance for Open | 
|  | * Media Patent License 1.0 was not distributed with this source code in the | 
|  | * PATENTS file, you can obtain it at www.aomedia.org/license/patent. | 
|  | */ | 
|  |  | 
|  | #ifndef AOM_AV1_DUCKY_ENCODE_H_ | 
|  | #define AOM_AV1_DUCKY_ENCODE_H_ | 
|  |  | 
|  | #include <cstddef> | 
|  | #include <cstdint> | 
|  | #include <memory> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "aom/aom_encoder.h" | 
|  | #include "av1/encoder/firstpass.h" | 
|  | #include "av1/ratectrl_qmode_interface.h" | 
|  |  | 
|  | namespace aom { | 
|  | struct VideoInfo { | 
|  | int frame_width; | 
|  | int frame_height; | 
|  | aom_rational_t frame_rate; | 
|  | aom_img_fmt_t img_fmt; | 
|  | int frame_count; | 
|  | std::string file_path; | 
|  | }; | 
|  |  | 
|  | struct EncodeFrameResult { | 
|  | std::vector<uint8_t> bitstream_buf; | 
|  | // TODO(angiebird): update global_coding_idx and global_order_idx properly. | 
|  | int global_coding_idx; | 
|  | int global_order_idx; | 
|  | int q_index; | 
|  | int rdmult; | 
|  | int rate; | 
|  | int64_t dist; | 
|  | double psnr; | 
|  | }; | 
|  |  | 
|  | enum class EncodeFrameMode { | 
|  | kNone,          // Let native AV1 determine q index and rdmult | 
|  | kQindex,        // DuckyEncode determines q index and AV1 determines rdmult | 
|  | kQindexRdmult,  // DuckyEncode determines q index and rdmult | 
|  | }; | 
|  |  | 
|  | enum class EncodeGopMode { | 
|  | kNone,    // native AV1 decides GOP | 
|  | kGopRcl,  // rate control lib decides GOP | 
|  | }; | 
|  |  | 
|  | struct EncodeFrameDecision { | 
|  | EncodeFrameMode qp_mode; | 
|  | EncodeGopMode gop_mode; | 
|  | FrameEncodeParameters parameters; | 
|  | }; | 
|  |  | 
|  | using GopEncodeInfoList = std::vector<GopEncodeInfo>; | 
|  |  | 
|  | // DuckyEncode is an experimental encoder c++ interface for two-pass mode. | 
|  | // This object can be used to do zero or more encode passes, where each encode | 
|  | // pass consists of: | 
|  | // - StartEncode() | 
|  | // - Zero or more calls to EncodeFrame() | 
|  | // - EndEncode() | 
|  | // Encode passes may not overlap, and any other sequence of these calls is | 
|  | // invalid. | 
|  | class DuckyEncode { | 
|  | public: | 
|  | explicit DuckyEncode(const VideoInfo &video_info, int max_ref_frames, | 
|  | int speed = 3); | 
|  | ~DuckyEncode(); | 
|  | std::vector<FIRSTPASS_STATS> ComputeFirstPassStats(); | 
|  | void StartEncode(const std::vector<FIRSTPASS_STATS> &stats_list); | 
|  | TplGopStats ObtainTplStats(const GopStruct gop_struct); | 
|  | std::vector<TplGopStats> ComputeTplStats(const GopStructList &gop_list); | 
|  | std::vector<EncodeFrameResult> EncodeVideo( | 
|  | const GopStructList &gop_list, | 
|  | const GopEncodeInfoList &gop_encode_info_list); | 
|  | EncodeFrameResult EncodeFrame(const EncodeFrameDecision &decision); | 
|  | void EndEncode(); | 
|  | void AllocateBitstreamBuffer(const VideoInfo &video_info); | 
|  |  | 
|  | private: | 
|  | class EncodeImpl; | 
|  | std::unique_ptr<EncodeImpl> impl_ptr_; | 
|  | bool write_temp_delimiter_; | 
|  | std::vector<uint8_t> bitstream_buf_; | 
|  | size_t pending_ctx_size_; | 
|  | }; | 
|  | }  // namespace aom | 
|  |  | 
|  | #endif  // AOM_AV1_DUCKY_ENCODE_H_ |