Files
DisplayFlow/demo/windows_sender/VideoEncoder.h
2025-12-22 13:48:06 +08:00

50 lines
1.1 KiB
C++

#pragma once
#include <d3d11.h>
#include <wrl/client.h>
#include <vector>
#include <cstdint>
#ifndef NO_FFMPEG
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavutil/imgutils.h>
#include <libavutil/opt.h>
#include <libswscale/swscale.h>
}
#endif
using Microsoft::WRL::ComPtr;
class VideoEncoder {
public:
VideoEncoder();
~VideoEncoder();
bool Initialize(ID3D11Device* device, int width, int height, int fps, int bitrate);
bool Reinitialize(int width, int height, int fps, int bitrate);
bool EncodeFrame(ID3D11Texture2D* texture, std::vector<uint8_t>& outputData, bool& isKeyFrame);
void Release();
private:
ID3D11Device* device_ = nullptr;
ID3D11DeviceContext* context_ = nullptr;
ComPtr<ID3D11Texture2D> stagingTexture_;
#ifndef NO_FFMPEG
AVCodecContext* codecContext_ = nullptr;
AVFrame* frame_ = nullptr;
AVPacket* packet_ = nullptr;
SwsContext* swsContext_ = nullptr;
#else
void* codecContext_ = nullptr;
void* frame_ = nullptr;
void* packet_ = nullptr;
void* swsContext_ = nullptr;
#endif
int width_ = 0;
int height_ = 0;
int pts_ = 0;
};