Skip to content

Commit d11c21d

Browse files
author
xianing
committed
add macos simpleFilter
1 parent b823f60 commit d11c21d

14 files changed

Lines changed: 1205 additions & 47 deletions

File tree

iOS/SimpleFilter/ExtensionProvider.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ namespace agora {
88
namespace extension {
99
ExtensionProvider::ExtensionProvider() {
1010
audioProcessor_ = new agora::RefCountedObject<AdjustVolumeAudioProcessor>();
11-
waterMarkProcessor_ = new agora::RefCountedObject<WatermarkProcessor>();
11+
YUVProcessor_ = new agora::RefCountedObject<YUVImageProcessor>();
1212
}
1313

1414
ExtensionProvider::~ExtensionProvider() {
1515
audioProcessor_.reset();
16-
waterMarkProcessor_.reset();
16+
YUVProcessor_.reset();
1717
}
1818

1919
// Provide information about all plug-ins that support packaging.
@@ -37,7 +37,7 @@ namespace agora {
3737

3838
// Create a video plug-in. After the SDK calls this method, you need to return the IExtensionVideoFilter instance
3939
agora_refptr<agora::rtc::IExtensionVideoFilter> ExtensionProvider::createVideoFilter(const char* name) {
40-
auto videoFilter = new agora::RefCountedObject<agora::extension::ExtensionVideoFilter>(waterMarkProcessor_);
40+
auto videoFilter = new agora::RefCountedObject<agora::extension::ExtensionVideoFilter>(YUVProcessor_);
4141
return videoFilter;
4242
}
4343

iOS/SimpleFilter/ExtensionProvider.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
namespace agora {
1313
namespace extension {
1414
static const char* AUDIO_FILTER_NAME = "VolumeChange";
15-
static const char* VIDEO_FILTER_NAME = "Watermark";
15+
static const char* VIDEO_FILTER_NAME = "Grey";
1616

1717
class ExtensionProvider : public agora::rtc::IExtensionProvider {
1818
private:
1919
agora_refptr<AdjustVolumeAudioProcessor> audioProcessor_;
20-
agora_refptr<WatermarkProcessor> waterMarkProcessor_;
20+
agora_refptr<YUVImageProcessor> YUVProcessor_;
2121
public:
2222
ExtensionProvider();
2323

iOS/SimpleFilter/ExtensionVideoFilter.cpp

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77

88
namespace agora {
99
namespace extension {
10-
11-
ExtensionVideoFilter::ExtensionVideoFilter(agora_refptr<WatermarkProcessor> processor):threadPool_(1) {
12-
waterMarkProcessor_ = processor;
13-
}
10+
11+
ExtensionVideoFilter::ExtensionVideoFilter(agora_refptr<YUVImageProcessor> processor):threadPool_(1) {
12+
YUVProcessor = processor;
13+
}
1414

1515
ExtensionVideoFilter::~ExtensionVideoFilter() {
16-
waterMarkProcessor_->releaseOpenGL();
16+
YUVProcessor->releaseOpenGL();
1717
}
1818

1919
//Set the process mode between the SDK and the video plug-in
@@ -36,29 +36,29 @@ namespace agora {
3636

3737
int ExtensionVideoFilter::start(agora::agora_refptr<Control> control) {
3838
printf("ExtensionVideoFilter::start\n");
39-
if (!waterMarkProcessor_) {
39+
if (!YUVProcessor) {
4040
return -1;
4141
}
4242
if (control) {
4343
control_ = control;
44-
waterMarkProcessor_->setExtensionControl(control);
44+
YUVProcessor->setExtensionControl(control);
4545
}
4646
if (mode_ == ProcessMode::kAsync){
4747
invoker_id = threadPool_.RegisterInvoker("thread_videofilter");
48-
auto res = threadPool_.PostTaskWithRes(invoker_id, [waterMarkProcessor=waterMarkProcessor_] {
49-
return waterMarkProcessor->initOpenGL();
48+
auto res = threadPool_.PostTaskWithRes(invoker_id, [yuvProcessor=YUVProcessor] {
49+
return yuvProcessor->initOpenGL();
5050
});
5151
isInitOpenGL = res.get();
5252
} else {
53-
isInitOpenGL = waterMarkProcessor_->initOpenGL();
53+
isInitOpenGL = YUVProcessor->initOpenGL();
5454
}
5555
return 0;
5656
}
5757

5858
int ExtensionVideoFilter::stop() {
5959
printf("ExtensionVideoFilter::stop\n");
60-
if (waterMarkProcessor_) {
61-
waterMarkProcessor_->releaseOpenGL();
60+
if (YUVProcessor) {
61+
YUVProcessor->releaseOpenGL();
6262
isInitOpenGL = false;
6363
}
6464
return 0;
@@ -70,8 +70,8 @@ namespace agora {
7070
}
7171

7272
bool isAsyncMode = (mode_ == ProcessMode::kAsync);
73-
if (isAsyncMode && waterMarkProcessor_ && control_ && invoker_id >= 0) {
74-
threadPool_.PostTask(invoker_id, [videoFrame=frame, processor=waterMarkProcessor_, control=control_] {
73+
if (isAsyncMode && YUVProcessor && control_ && invoker_id >= 0) {
74+
threadPool_.PostTask(invoker_id, [videoFrame=frame, processor=YUVProcessor, control=control_] {
7575
rtc::VideoFrameData srcData;
7676
videoFrame->getVideoFrameData(srcData);
7777
processor->processFrame(srcData);
@@ -90,10 +90,10 @@ namespace agora {
9090
return kBypass;
9191
}
9292
bool isSyncMode = (mode_ == ProcessMode::kSync);
93-
if (isSyncMode && waterMarkProcessor_) {
93+
if (isSyncMode && YUVProcessor) {
9494
rtc::VideoFrameData srcData;
9595
src->getVideoFrameData(srcData);
96-
waterMarkProcessor_->processFrame(srcData);
96+
YUVProcessor->processFrame(srcData);
9797
dst = src;
9898
return kSuccess;
9999
}
@@ -106,7 +106,7 @@ namespace agora {
106106
size_t buf_size) {
107107
printf("setProperty %s %s\n", key, buf);
108108
std::string stringParameter((char*)buf);
109-
waterMarkProcessor_->setParameters(stringParameter);
109+
YUVProcessor->setParameters(stringParameter);
110110
return 0;
111111
}
112112

iOS/SimpleFilter/ExtensionVideoFilter.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace agora {
1515
namespace extension {
1616
class ExtensionVideoFilter : public agora::rtc::IExtensionVideoFilter {
1717
public:
18-
ExtensionVideoFilter(agora_refptr<WatermarkProcessor> processor);
18+
ExtensionVideoFilter(agora_refptr<YUVImageProcessor> processor);
1919

2020
~ExtensionVideoFilter();
2121

@@ -35,7 +35,7 @@ namespace agora {
3535

3636
private:
3737
agora::agora_refptr<Control> control_;
38-
agora::agora_refptr<WatermarkProcessor> waterMarkProcessor_;
38+
agora::agora_refptr<YUVImageProcessor> YUVProcessor;
3939
bool isInitOpenGL = false;
4040
ProcessMode mode_;
4141
agora::extension::ThreadPool threadPool_;

iOS/SimpleFilter/VideoProcessor.cpp

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,51 +6,53 @@
66

77
#include <chrono>
88

9-
#include <opencv2/opencv.hpp>
10-
119
namespace agora {
1210
namespace extension {
13-
bool WatermarkProcessor::initOpenGL() {
11+
bool enableGrey = true;
12+
bool YUVImageProcessor::initOpenGL() {
1413
const std::lock_guard<std::mutex> lock(mutex_);
1514
return true;
1615
}
1716

18-
bool WatermarkProcessor::releaseOpenGL() {
17+
bool YUVImageProcessor::releaseOpenGL() {
1918
const std::lock_guard<std::mutex> lock(mutex_);
2019
return true;
2120
}
2221

23-
int WatermarkProcessor::processFrame(agora::rtc::VideoFrameData &capturedFrame) {
22+
int YUVImageProcessor::processFrame(agora::rtc::VideoFrameData &capturedFrame) {
2423
if (wmEffectEnabled_) {
25-
addWatermark(capturedFrame);
24+
process(capturedFrame);
2625
}
2726
return 0;
2827
}
2928

30-
void WatermarkProcessor::addWatermark(const agora::rtc::VideoFrameData &capturedFrame) {
31-
cv::Mat image(capturedFrame.height, capturedFrame.width, CV_8U,
32-
(void*)capturedFrame.pixels.data);
33-
double fontSize = image.cols / 400.0;
34-
cv::Point point(image.cols/2, image.rows/2);
35-
cv::Scalar scalar(255, 0, 0);
36-
cv::Mat textImg = cv::Mat::zeros(image.rows, image.cols, image.type());
37-
cv::putText(textImg, wmStr_, point, cv::FONT_HERSHEY_DUPLEX, fontSize, scalar, 3);
38-
cv::flip(textImg, textImg, 1);
39-
image = image + textImg;
29+
void YUVImageProcessor::process(const agora::rtc::VideoFrameData &capturedFrame) {
30+
if(!enableGrey){
31+
return;
32+
}
33+
// agora::rtc::RawPixelBuffer::Format format = capturedFrame.pixels.format;
34+
unsigned char* pic = capturedFrame.pixels.data;
35+
int offset = capturedFrame.height * capturedFrame.width;
36+
memset(pic + offset, 128, capturedFrame.height * capturedFrame.width / 2);
4037
}
4138

42-
int WatermarkProcessor::setParameters(std::string parameter) {
39+
int YUVImageProcessor::setParameters(std::string parameter) {
4340
const std::lock_guard<std::mutex> lock(mutex_);
44-
41+
if(parameter == "1"){
42+
enableGrey = true;
43+
}
44+
else{
45+
enableGrey = false;
46+
}
4547
return 0;
4648
}
4749

48-
std::thread::id WatermarkProcessor::getThreadId() {
50+
std::thread::id YUVImageProcessor::getThreadId() {
4951
std::thread::id id = std::this_thread::get_id();
5052
return id;
5153
}
5254

53-
void WatermarkProcessor::dataCallback(const char* data){
55+
void YUVImageProcessor::dataCallback(const char* data){
5456
if (control_) {
5557
control_->postEvent("key", data);
5658
}

iOS/SimpleFilter/VideoProcessor.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
namespace agora {
1818
namespace extension {
19-
class WatermarkProcessor : public RefCountInterface {
19+
class YUVImageProcessor : public RefCountInterface {
2020
public:
2121
bool initOpenGL();
2222

@@ -34,9 +34,9 @@ namespace agora {
3434
};
3535

3636
protected:
37-
~WatermarkProcessor() {}
37+
~YUVImageProcessor() {}
3838
private:
39-
void addWatermark(const agora::rtc::VideoFrameData &capturedFrame);
39+
void process(const agora::rtc::VideoFrameData &capturedFrame);
4040
void dataCallback(const char* data);
4141

4242
std::mutex mutex_;

0 commit comments

Comments
 (0)