if (!pluginFrame) | |
return; | |
//====================================================================================== | |
// GET FRAME ROTATION | |
AVFrameSideData* side_data = av_frame_get_side_data(pluginFrame, 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)); | |
} | |
delete side_data; | |
//====================================================================================== | |
// GET RAW FRAME | |
// Use a non-const Frame | |
// Convert input frame to RGB | |
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); |