mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-27 04:35:34 +08:00
[fix] fix openh264 encoder resolution change failed
This commit is contained in:
@@ -8,9 +8,6 @@
|
|||||||
#define SAVE_RECEIVED_NV12_STREAM 0
|
#define SAVE_RECEIVED_NV12_STREAM 0
|
||||||
#define SAVE_ENCODED_H264_STREAM 0
|
#define SAVE_ENCODED_H264_STREAM 0
|
||||||
|
|
||||||
#define YUV420P_BUFFER_SIZE 1280 * 720 * 3 / 2
|
|
||||||
static unsigned char yuv420p_frame_[YUV420P_BUFFER_SIZE];
|
|
||||||
|
|
||||||
void Nv12ToI420(unsigned char *Src_data, int src_width, int src_height,
|
void Nv12ToI420(unsigned char *Src_data, int src_width, int src_height,
|
||||||
unsigned char *Dst_data) {
|
unsigned char *Dst_data) {
|
||||||
// NV12 video size
|
// NV12 video size
|
||||||
@@ -58,6 +55,11 @@ OpenH264Encoder::~OpenH264Encoder() {
|
|||||||
file_h264_ = nullptr;
|
file_h264_ = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (yuv420p_frame_) {
|
||||||
|
delete[] yuv420p_frame_;
|
||||||
|
yuv420p_frame_ = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
if (encoded_frame_) {
|
if (encoded_frame_) {
|
||||||
delete[] encoded_frame_;
|
delete[] encoded_frame_;
|
||||||
encoded_frame_ = nullptr;
|
encoded_frame_ = nullptr;
|
||||||
@@ -66,7 +68,7 @@ OpenH264Encoder::~OpenH264Encoder() {
|
|||||||
Release();
|
Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
int OpenH264Encoder::InitEncoderParams() {
|
int OpenH264Encoder::InitEncoderParams(int width, int height) {
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (!openh264_encoder_) {
|
if (!openh264_encoder_) {
|
||||||
@@ -81,8 +83,8 @@ int OpenH264Encoder::InitEncoderParams() {
|
|||||||
// encoder_params_.iUsageType = SCREEN_CONTENT_REAL_TIME;
|
// encoder_params_.iUsageType = SCREEN_CONTENT_REAL_TIME;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
encoder_params_.iPicWidth = frame_width_;
|
encoder_params_.iPicWidth = width;
|
||||||
encoder_params_.iPicHeight = frame_height_;
|
encoder_params_.iPicHeight = height;
|
||||||
encoder_params_.iTargetBitrate = target_bitrate_;
|
encoder_params_.iTargetBitrate = target_bitrate_;
|
||||||
encoder_params_.iMaxBitrate = max_bitrate_;
|
encoder_params_.iMaxBitrate = max_bitrate_;
|
||||||
encoder_params_.iRCMode = RC_BITRATE_MODE;
|
encoder_params_.iRCMode = RC_BITRATE_MODE;
|
||||||
@@ -123,11 +125,13 @@ int OpenH264Encoder::ResetEncodeResolution(unsigned int width,
|
|||||||
frame_width_ = width;
|
frame_width_ = width;
|
||||||
frame_height_ = height;
|
frame_height_ = height;
|
||||||
|
|
||||||
encoder_params_.iPicWidth = width;
|
if (0 != InitEncoderParams(width, height)) {
|
||||||
encoder_params_.iPicHeight = height;
|
LOG_ERROR("Reset encoder params [{}x{}] failed", width, height);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (openh264_encoder_->InitializeExt(&encoder_params_) != 0) {
|
if (0 != openh264_encoder_->InitializeExt(&encoder_params_)) {
|
||||||
LOG_ERROR("Failed to initialize OpenH264 encoder");
|
LOG_ERROR("Reset encoder resolution [{}x{}] failed", width, height);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,7 +149,7 @@ int OpenH264Encoder::Init() {
|
|||||||
openh264_encoder_->SetOption(ENCODER_OPTION_TRACE_LEVEL, &trace_level);
|
openh264_encoder_->SetOption(ENCODER_OPTION_TRACE_LEVEL, &trace_level);
|
||||||
|
|
||||||
// Create encoder parameters based on the layer configuration.
|
// Create encoder parameters based on the layer configuration.
|
||||||
InitEncoderParams();
|
InitEncoderParams(frame_width_, frame_height_);
|
||||||
|
|
||||||
if (openh264_encoder_->InitializeExt(&encoder_params_) != 0) {
|
if (openh264_encoder_->InitializeExt(&encoder_params_) != 0) {
|
||||||
LOG_ERROR("Failed to initialize OpenH264 encoder");
|
LOG_ERROR("Failed to initialize OpenH264 encoder");
|
||||||
@@ -153,8 +157,8 @@ int OpenH264Encoder::Init() {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int video_format = EVideoFormatType::videoFormatI420;
|
video_format_ = EVideoFormatType::videoFormatI420;
|
||||||
openh264_encoder_->SetOption(ENCODER_OPTION_DATAFORMAT, &video_format);
|
openh264_encoder_->SetOption(ENCODER_OPTION_DATAFORMAT, &video_format_);
|
||||||
|
|
||||||
if (SAVE_RECEIVED_NV12_STREAM) {
|
if (SAVE_RECEIVED_NV12_STREAM) {
|
||||||
file_nv12_ = fopen("received_nv12_stream.yuv", "w+b");
|
file_nv12_ = fopen("received_nv12_stream.yuv", "w+b");
|
||||||
@@ -228,7 +232,7 @@ int OpenH264Encoder::Encode(
|
|||||||
raw_frame_ = {0};
|
raw_frame_ = {0};
|
||||||
raw_frame_.iPicWidth = video_frame->width;
|
raw_frame_.iPicWidth = video_frame->width;
|
||||||
raw_frame_.iPicHeight = video_frame->height;
|
raw_frame_.iPicHeight = video_frame->height;
|
||||||
raw_frame_.iColorFormat = EVideoFormatType::videoFormatI420;
|
raw_frame_.iColorFormat = video_format_;
|
||||||
raw_frame_.uiTimeStamp =
|
raw_frame_.uiTimeStamp =
|
||||||
std::chrono::system_clock::now().time_since_epoch().count();
|
std::chrono::system_clock::now().time_since_epoch().count();
|
||||||
|
|
||||||
@@ -362,6 +366,7 @@ void OpenH264Encoder::ForceIdr() {
|
|||||||
|
|
||||||
int OpenH264Encoder::Release() {
|
int OpenH264Encoder::Release() {
|
||||||
if (openh264_encoder_) {
|
if (openh264_encoder_) {
|
||||||
|
openh264_encoder_->Uninitialize();
|
||||||
WelsDestroySVCEncoder(openh264_encoder_);
|
WelsDestroySVCEncoder(openh264_encoder_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ class OpenH264Encoder : public VideoEncoder {
|
|||||||
void ForceIdr();
|
void ForceIdr();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int InitEncoderParams();
|
int InitEncoderParams(int width, int height);
|
||||||
int ResetEncodeResolution(unsigned int width, unsigned int height);
|
int ResetEncodeResolution(unsigned int width, unsigned int height);
|
||||||
|
|
||||||
int Release();
|
int Release();
|
||||||
@@ -63,6 +63,7 @@ class OpenH264Encoder : public VideoEncoder {
|
|||||||
// openh264
|
// openh264
|
||||||
ISVCEncoder* openh264_encoder_ = nullptr;
|
ISVCEncoder* openh264_encoder_ = nullptr;
|
||||||
SEncParamExt encoder_params_;
|
SEncParamExt encoder_params_;
|
||||||
|
int video_format_;
|
||||||
SSourcePicture raw_frame_;
|
SSourcePicture raw_frame_;
|
||||||
unsigned char* yuv420p_frame_ = nullptr;
|
unsigned char* yuv420p_frame_ = nullptr;
|
||||||
int yuv420p_frame_capacity_ = 0;
|
int yuv420p_frame_capacity_ = 0;
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
class IOStatistics {
|
class IOStatistics {
|
||||||
public:
|
public:
|
||||||
|
|||||||
Reference in New Issue
Block a user