blob: 5837eea0ef57759b0afc1584a532e796a68bead5 [file] [log] [blame]
HEADER
#include "GENERICVideoSubscriber.h"
extern "C" {
#include <libavutil/display.h>
}
#include <accel.h>
#include <pluglog.h>
#include <frameUtils.h>
const std::string TAG = "GENERIC";
const char sep = separator();
namespace jami {
GENERICVideoSubscriber::GENERICVideoSubscriber(const std::string& dataPath)
: path_ {dataPath}
{}
GENERICVideoSubscriber::~GENERICVideoSubscriber()
{
std::ostringstream oss;
oss << "~GENERICMediaProcessor" << std::endl;
Plog::log(Plog::LogPriority::INFO, TAG, oss.str());
}
void
GENERICVideoSubscriber::update(jami::Observable<AVFrame*>*, AVFrame* const& iFrame)
{
if (!iFrame)
return;
AVFrame* pluginFrame = const_cast<AVFrame*>(iFrame);
//======================================================================================
// GET FRAME ROTATION
AVFrameSideData* side_data = av_frame_get_side_data(iFrame, AV_FRAME_DATA_DISPLAYMATRIX);
int angle {0};
if (side_data) {
auto matrix_rotation = reinterpret_cast<int32_t*>(side_data->data);
angle = static_cast<int>(av_display_rotation_get(matrix_rotation));
}
//======================================================================================
// GET RAW FRAME
// Use a non-const Frame
// Convert input frame to RGB
int inputHeight = pluginFrame->height;
int inputWidth = pluginFrame->width;
AVFrame* temp = transferToMainMemory(pluginFrame, AV_PIX_FMT_NV12);
AVFrame* bgrFrame = scaler.convertFormat(temp, AV_PIX_FMT_RGB24);
av_frame_unref(temp);
av_frame_free(&temp);
if (!bgrFrame)
return;
// transferToMainMemory USED TO COPY FRAME TO MAIN MEMORY IF HW ACCEL IS ENABLED
// NOT NEEDED TO BE USED IF ALL YOUR PROCESS WILL BE DONE WITHIN A
// HW ACCEL PLATFORM
if (firstRun) {
// IMPLEMENT CODE TO CONFIGURE
// VARIABLES UPON FIRST RUN
firstRun = false;
}
// IMPLEMENT PROCESS
//======================================================================================
// REPLACE AVFRAME DATA WITH FRAME DATA
if (bgrFrame->data[0]) {
uint8_t* frameData = bgrFrame->data[0];
if (angle == 90 || angle == -90) {
std::memmove(frameData,
frameData, // PUT HERE YOUR PROCESSED FRAME VARIABLE DATA!
static_cast<size_t>(pluginFrame->width * pluginFrame->height * 3)
* sizeof(uint8_t));
}
av_frame_copy_props(bgrFrame, pluginFrame);
moveFrom(pluginFrame, bgrFrame);
}
av_frame_unref(bgrFrame);
av_frame_free(&bgrFrame);
}
void
GENERICVideoSubscriber::attached(jami::Observable<AVFrame*>* observable)
{
std::ostringstream oss;
oss << "::Attached ! " << std::endl;
Plog::log(Plog::LogPriority::INFO, TAG, oss.str());
observable_ = observable;
}
void
GENERICVideoSubscriber::detached(jami::Observable<AVFrame*>*)
{
firstRun = true;
observable_ = nullptr;
std::ostringstream oss;
oss << "::Detached()" << std::endl;
Plog::log(Plog::LogPriority::INFO, TAG, oss.str());
}
void
GENERICVideoSubscriber::detach()
{
if (observable_) {
firstRun = true;
std::ostringstream oss;
oss << "::Calling detach()" << std::endl;
Plog::log(Plog::LogPriority::INFO, TAG, oss.str());
observable_->detach(this);
}
}
} // namespace jami