mirror of https://github.com/FFmpeg/FFmpeg.git
Currently, every filter needs to provide code to transfer data from AVFrame* to model input (DNNData*), and also from model output (DNNData*) to AVFrame*. Actually, such transfer can be implemented within DNN module, and so filter can focus on its own business logic. DNN module also exports the function pointer pre_proc and post_proc in struct DNNModel, just in case that a filter has its special logic to transfer data between AVFrame* and DNNData*. The default implementation within DNN module is used if the filter does not set pre/post_proc.pull/352/head
parent
6918e240d7
commit
2003e32f62
14 changed files with 451 additions and 426 deletions
@ -0,0 +1,135 @@ |
||||
/*
|
||||
* Copyright (c) 2020 |
||||
* |
||||
* This file is part of FFmpeg. |
||||
* |
||||
* FFmpeg is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Lesser General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2.1 of the License, or (at your option) any later version. |
||||
* |
||||
* FFmpeg is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Lesser General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Lesser General Public |
||||
* License along with FFmpeg; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||
*/ |
||||
|
||||
#include "dnn_io_proc.h" |
||||
#include "libavutil/imgutils.h" |
||||
#include "libswscale/swscale.h" |
||||
|
||||
DNNReturnType proc_from_dnn_to_frame(AVFrame *frame, DNNData *output, void *log_ctx) |
||||
{ |
||||
struct SwsContext *sws_ctx; |
||||
int bytewidth = av_image_get_linesize(frame->format, frame->width, 0); |
||||
if (output->dt != DNN_FLOAT) { |
||||
av_log(log_ctx, AV_LOG_ERROR, "do not support data type rather than DNN_FLOAT\n"); |
||||
return DNN_ERROR; |
||||
} |
||||
|
||||
switch (frame->format) { |
||||
case AV_PIX_FMT_RGB24: |
||||
case AV_PIX_FMT_BGR24: |
||||
sws_ctx = sws_getContext(frame->width * 3, |
||||
frame->height, |
||||
AV_PIX_FMT_GRAYF32, |
||||
frame->width * 3, |
||||
frame->height, |
||||
AV_PIX_FMT_GRAY8, |
||||
0, NULL, NULL, NULL); |
||||
sws_scale(sws_ctx, (const uint8_t *[4]){(const uint8_t *)output->data, 0, 0, 0}, |
||||
(const int[4]){frame->width * 3 * sizeof(float), 0, 0, 0}, 0, frame->height, |
||||
(uint8_t * const*)frame->data, frame->linesize); |
||||
sws_freeContext(sws_ctx); |
||||
return DNN_SUCCESS; |
||||
case AV_PIX_FMT_GRAYF32: |
||||
av_image_copy_plane(frame->data[0], frame->linesize[0], |
||||
output->data, bytewidth, |
||||
bytewidth, frame->height); |
||||
return DNN_SUCCESS; |
||||
case AV_PIX_FMT_YUV420P: |
||||
case AV_PIX_FMT_YUV422P: |
||||
case AV_PIX_FMT_YUV444P: |
||||
case AV_PIX_FMT_YUV410P: |
||||
case AV_PIX_FMT_YUV411P: |
||||
case AV_PIX_FMT_GRAY8: |
||||
sws_ctx = sws_getContext(frame->width, |
||||
frame->height, |
||||
AV_PIX_FMT_GRAYF32, |
||||
frame->width, |
||||
frame->height, |
||||
AV_PIX_FMT_GRAY8, |
||||
0, NULL, NULL, NULL); |
||||
sws_scale(sws_ctx, (const uint8_t *[4]){(const uint8_t *)output->data, 0, 0, 0}, |
||||
(const int[4]){frame->width * sizeof(float), 0, 0, 0}, 0, frame->height, |
||||
(uint8_t * const*)frame->data, frame->linesize); |
||||
sws_freeContext(sws_ctx); |
||||
return DNN_SUCCESS; |
||||
default: |
||||
av_log(log_ctx, AV_LOG_ERROR, "do not support frame format %d\n", frame->format); |
||||
return DNN_ERROR; |
||||
} |
||||
|
||||
return DNN_SUCCESS; |
||||
} |
||||
|
||||
DNNReturnType proc_from_frame_to_dnn(AVFrame *frame, DNNData *input, void *log_ctx) |
||||
{ |
||||
struct SwsContext *sws_ctx; |
||||
int bytewidth = av_image_get_linesize(frame->format, frame->width, 0); |
||||
if (input->dt != DNN_FLOAT) { |
||||
av_log(log_ctx, AV_LOG_ERROR, "do not support data type rather than DNN_FLOAT\n"); |
||||
return DNN_ERROR; |
||||
} |
||||
|
||||
switch (frame->format) { |
||||
case AV_PIX_FMT_RGB24: |
||||
case AV_PIX_FMT_BGR24: |
||||
sws_ctx = sws_getContext(frame->width * 3, |
||||
frame->height, |
||||
AV_PIX_FMT_GRAY8, |
||||
frame->width * 3, |
||||
frame->height, |
||||
AV_PIX_FMT_GRAYF32, |
||||
0, NULL, NULL, NULL); |
||||
sws_scale(sws_ctx, (const uint8_t **)frame->data, |
||||
frame->linesize, 0, frame->height, |
||||
(uint8_t * const*)(&input->data), |
||||
(const int [4]){frame->width * 3 * sizeof(float), 0, 0, 0}); |
||||
sws_freeContext(sws_ctx); |
||||
break; |
||||
case AV_PIX_FMT_GRAYF32: |
||||
av_image_copy_plane(input->data, bytewidth, |
||||
frame->data[0], frame->linesize[0], |
||||
bytewidth, frame->height); |
||||
break; |
||||
case AV_PIX_FMT_YUV420P: |
||||
case AV_PIX_FMT_YUV422P: |
||||
case AV_PIX_FMT_YUV444P: |
||||
case AV_PIX_FMT_YUV410P: |
||||
case AV_PIX_FMT_YUV411P: |
||||
case AV_PIX_FMT_GRAY8: |
||||
sws_ctx = sws_getContext(frame->width, |
||||
frame->height, |
||||
AV_PIX_FMT_GRAY8, |
||||
frame->width, |
||||
frame->height, |
||||
AV_PIX_FMT_GRAYF32, |
||||
0, NULL, NULL, NULL); |
||||
sws_scale(sws_ctx, (const uint8_t **)frame->data, |
||||
frame->linesize, 0, frame->height, |
||||
(uint8_t * const*)(&input->data), |
||||
(const int [4]){frame->width * sizeof(float), 0, 0, 0}); |
||||
sws_freeContext(sws_ctx); |
||||
break; |
||||
default: |
||||
av_log(log_ctx, AV_LOG_ERROR, "do not support frame format %d\n", frame->format); |
||||
return DNN_ERROR; |
||||
} |
||||
|
||||
return DNN_SUCCESS; |
||||
} |
@ -0,0 +1,36 @@ |
||||
/*
|
||||
* Copyright (c) 2020 |
||||
* |
||||
* This file is part of FFmpeg. |
||||
* |
||||
* FFmpeg is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Lesser General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2.1 of the License, or (at your option) any later version. |
||||
* |
||||
* FFmpeg is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Lesser General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Lesser General Public |
||||
* License along with FFmpeg; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||
*/ |
||||
|
||||
/**
|
||||
* @file |
||||
* DNN input&output process between AVFrame and DNNData. |
||||
*/ |
||||
|
||||
|
||||
#ifndef AVFILTER_DNN_DNN_IO_PROC_H |
||||
#define AVFILTER_DNN_DNN_IO_PROC_H |
||||
|
||||
#include "../dnn_interface.h" |
||||
#include "libavutil/frame.h" |
||||
|
||||
DNNReturnType proc_from_frame_to_dnn(AVFrame *frame, DNNData *input, void *log_ctx); |
||||
DNNReturnType proc_from_dnn_to_frame(AVFrame *frame, DNNData *output, void *log_ctx); |
||||
|
||||
#endif |
Loading…
Reference in new issue