lavfi/qsv: Copy metadata fields from the given input
Currently it always copies the metadata fields from the last input when there are multiple inputs for the filter. For example, the metadata fields from input1 are copied to the output for overlay_qsv filter, however for regular overlay filters, the metadata fields from input0 are copied to the output. With this fix, we may copy the metadata fields from input0 to the ouput as well. Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
This commit is contained in:
parent
67fc9b8427
commit
578ac59887
@ -441,11 +441,6 @@ static QSVFrame *submit_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *p
|
||||
av_frame_free(&qsv_frame->frame);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (av_frame_copy_props(qsv_frame->frame, picref) < 0) {
|
||||
av_frame_free(&qsv_frame->frame);
|
||||
return NULL;
|
||||
}
|
||||
} else
|
||||
qsv_frame->frame = av_frame_clone(picref);
|
||||
|
||||
@ -494,12 +489,6 @@ static QSVFrame *query_frame(QSVVPPContext *s, AVFilterLink *outlink, const AVFr
|
||||
if (!out_frame->frame)
|
||||
return NULL;
|
||||
|
||||
ret = av_frame_copy_props(out_frame->frame, in);
|
||||
if (ret < 0) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Failed to copy metadata fields from src to dst.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = av_hwframe_get_buffer(outlink->hw_frames_ctx, out_frame->frame, 0);
|
||||
if (ret < 0) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Can't allocate a surface.\n");
|
||||
@ -516,12 +505,6 @@ static QSVFrame *query_frame(QSVVPPContext *s, AVFilterLink *outlink, const AVFr
|
||||
if (!out_frame->frame)
|
||||
return NULL;
|
||||
|
||||
ret = av_frame_copy_props(out_frame->frame, in);
|
||||
if (ret < 0) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Failed to copy metadata fields from src to dst.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = map_frame_to_surface(out_frame->frame,
|
||||
&out_frame->surface);
|
||||
if (ret < 0)
|
||||
@ -958,7 +941,7 @@ int ff_qsvvpp_close(AVFilterContext *avctx)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picref)
|
||||
int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picref, AVFrame *propref)
|
||||
{
|
||||
AVFilterContext *ctx = inlink->dst;
|
||||
AVFilterLink *outlink = ctx->outputs[0];
|
||||
@ -1015,6 +998,16 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr
|
||||
return AVERROR(EAGAIN);
|
||||
break;
|
||||
}
|
||||
|
||||
if (propref) {
|
||||
ret1 = av_frame_copy_props(out_frame->frame, propref);
|
||||
if (ret1 < 0) {
|
||||
av_frame_free(&out_frame->frame);
|
||||
av_log(ctx, AV_LOG_ERROR, "Failed to copy metadata fields from src to dst.\n");
|
||||
return ret1;
|
||||
}
|
||||
}
|
||||
|
||||
out_frame->frame->pts = av_rescale_q(out_frame->surface.Data.TimeStamp,
|
||||
default_tb, outlink->time_base);
|
||||
|
||||
|
@ -131,7 +131,7 @@ int ff_qsvvpp_init(AVFilterContext *avctx, QSVVPPParam *param);
|
||||
int ff_qsvvpp_close(AVFilterContext *avctx);
|
||||
|
||||
/* vpp filter frame and call the cb if needed */
|
||||
int ff_qsvvpp_filter_frame(QSVVPPContext *vpp, AVFilterLink *inlink, AVFrame *frame);
|
||||
int ff_qsvvpp_filter_frame(QSVVPPContext *vpp, AVFilterLink *inlink, AVFrame *frame, AVFrame *propref);
|
||||
|
||||
int ff_qsvvpp_print_iopattern(void *log_ctx, int mfx_iopattern,
|
||||
const char *extra_string);
|
||||
|
@ -228,13 +228,16 @@ static int process_frame(FFFrameSync *fs)
|
||||
{
|
||||
AVFilterContext *ctx = fs->parent;
|
||||
QSVVPPContext *qsv = fs->opaque;
|
||||
AVFrame *frame = NULL;
|
||||
AVFrame *frame = NULL, *propref = NULL;
|
||||
int ret = 0, i;
|
||||
|
||||
for (i = 0; i < ctx->nb_inputs; i++) {
|
||||
ret = ff_framesync_get_frame(fs, i, &frame, 0);
|
||||
if (ret == 0)
|
||||
ret = ff_qsvvpp_filter_frame(qsv, ctx->inputs[i], frame);
|
||||
if (ret == 0) {
|
||||
if (i == 0)
|
||||
propref = frame;
|
||||
ret = ff_qsvvpp_filter_frame(qsv, ctx->inputs[i], frame, propref);
|
||||
}
|
||||
if (ret < 0 && ret != AVERROR(EAGAIN))
|
||||
break;
|
||||
}
|
||||
|
@ -71,13 +71,16 @@ static int process_frame(FFFrameSync *fs)
|
||||
{
|
||||
AVFilterContext *ctx = fs->parent;
|
||||
QSVVPPContext *qsv = fs->opaque;
|
||||
AVFrame *frame = NULL;
|
||||
AVFrame *frame = NULL, *propref = NULL;
|
||||
int ret = 0;
|
||||
|
||||
for (int i = 0; i < ctx->nb_inputs; i++) {
|
||||
ret = ff_framesync_get_frame(fs, i, &frame, 0);
|
||||
if (ret == 0)
|
||||
ret = ff_qsvvpp_filter_frame(qsv, ctx->inputs[i], frame);
|
||||
if (ret == 0) {
|
||||
if (i == 0)
|
||||
propref = frame;
|
||||
ret = ff_qsvvpp_filter_frame(qsv, ctx->inputs[i], frame, propref);
|
||||
}
|
||||
if (ret < 0 && ret != AVERROR(EAGAIN))
|
||||
break;
|
||||
}
|
||||
|
@ -748,7 +748,7 @@ static int activate(AVFilterContext *ctx)
|
||||
|
||||
if (qsv->session) {
|
||||
if (in || qsv->eof) {
|
||||
ret = ff_qsvvpp_filter_frame(qsv, inlink, in);
|
||||
ret = ff_qsvvpp_filter_frame(qsv, inlink, in, in);
|
||||
av_frame_free(&in);
|
||||
if (ret == AVERROR(EAGAIN))
|
||||
goto not_ready;
|
||||
|
Loading…
Reference in New Issue
Block a user