blob: b72d4432f5325f5219c1561b84363ce6ef53f12b [file] [log] [blame]
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);