// Copyright 2019 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef EASYMEDIA_ENCODER_H_ #define EASYMEDIA_ENCODER_H_ #include #ifdef __cplusplus #include "codec.h" #include "media_reflector.h" namespace easymedia { DECLARE_FACTORY(Encoder) // usage: REFLECTOR(Encoder)::Create(codecname, param) // T must be the final class type exposed to user DECLARE_REFLECTOR(Encoder) #define DEFINE_ENCODER_FACTORY(REAL_PRODUCT, FINAL_EXPOSE_PRODUCT) \ DEFINE_MEDIA_CHILD_FACTORY(REAL_PRODUCT, REAL_PRODUCT::GetCodecName(), FINAL_EXPOSE_PRODUCT, Encoder) \ DEFINE_MEDIA_CHILD_FACTORY_EXTRA(REAL_PRODUCT) \ DEFINE_MEDIA_NEW_PRODUCT_BY(REAL_PRODUCT, Encoder, Init() != true) class Encoder : public Codec { public: virtual ~Encoder() = default; virtual bool InitConfig(const MediaConfig& cfg); }; // self define by user class ParameterBuffer { public: ParameterBuffer(size_t st = sizeof(int)) : size(st), ptr(nullptr) { if (sizeof(int) != st && st != 0) { ptr = malloc(st); if (!ptr) { size = 0; } } } ~ParameterBuffer() { if (ptr) { free(ptr); } } size_t GetSize() { return size; } int GetValue() { return value; } void SetValue(int v) { value = v; } void* GetPtr() { return ptr; } void SetPtr(void* data, size_t data_len) { if (ptr && ptr != data) { free(ptr); } ptr = data; size = data_len; } private: size_t size; int value; void* ptr; }; #define DEFINE_VIDEO_ENCODER_FACTORY(REAL_PRODUCT) DEFINE_ENCODER_FACTORY(REAL_PRODUCT, VideoEncoder) class _API VideoEncoder : public Encoder { public: // changes static const uint32_t kQPChange = (1 << 0); static const uint32_t kFrameRateChange = (1 << 1); static const uint32_t kBitRateChange = (1 << 2); static const uint32_t kForceIdrFrame = (1 << 3); static const uint32_t kOSDDataChange = (1 << 4); static const uint32_t kOSDPltChange = (1 << 5); static const uint32_t kMoveDetectionFlow = (1 << 6); static const uint32_t kROICfgChange = (1 << 7); static const uint32_t kRcModeChange = (1 << 8); static const uint32_t kRcQualityChange = (1 << 9); static const uint32_t kSplitChange = (1 << 10); static const uint32_t kGopChange = (1 << 11); static const uint32_t kGopModeChange = (1 << 12); static const uint32_t kProfileChange = (1 << 13); static const uint32_t kUserDataChange = (1 << 14); // enable fps/bps statistics. static const uint32_t kEnableStatistics = (1 << 31); VideoEncoder() : codec_type(CODEC_TYPE_NONE) { } virtual ~VideoEncoder() = default; void RequestChange(uint32_t change, std::shared_ptr value); virtual void QueryChange(uint32_t change, void* value, int32_t size); protected: bool HasChangeReq() { return !change_list.empty(); } std::pair> PeekChange(); CodecType codec_type; private: std::mutex change_mtx; std::list>> change_list; DECLARE_PART_FINAL_EXPOSE_PRODUCT(Encoder) }; #define DEFINE_AUDIO_ENCODER_FACTORY(REAL_PRODUCT) DEFINE_ENCODER_FACTORY(REAL_PRODUCT, AudioEncoder) class _API AudioEncoder : public Encoder { public: AudioEncoder() : codec_type(CODEC_TYPE_NONE) { } virtual ~AudioEncoder() = default; virtual int GetNbSamples() { return 0; } protected: CodecType codec_type; DECLARE_PART_FINAL_EXPOSE_PRODUCT(Encoder) }; } // namespace easymedia #endif #endif // EASYMEDIA_ENCODER_H_