mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
avfilter/vf_stereo3d: add direct (faster) path:
for above below and side by side to alternating format for above below and side by side to mono format Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
parent
577e0132a2
commit
c54632d381
@ -614,24 +614,61 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
|
||||
ileft = iright = inpicref;
|
||||
};
|
||||
|
||||
out = oleft = oright = ff_get_video_buffer(outlink, outlink->w, outlink->h);
|
||||
if (!out) {
|
||||
av_frame_free(&s->prev);
|
||||
av_frame_free(&inpicref);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
av_frame_copy_props(out, inpicref);
|
||||
|
||||
if (s->out.format == ALTERNATING_LR ||
|
||||
s->out.format == ALTERNATING_RL) {
|
||||
oright = ff_get_video_buffer(outlink, outlink->w, outlink->h);
|
||||
if (!oright) {
|
||||
if ((s->out.format == ALTERNATING_LR ||
|
||||
s->out.format == ALTERNATING_RL) &&
|
||||
(s->in.format == SIDE_BY_SIDE_LR ||
|
||||
s->in.format == SIDE_BY_SIDE_RL ||
|
||||
s->in.format == SIDE_BY_SIDE_2_LR ||
|
||||
s->in.format == SIDE_BY_SIDE_2_RL ||
|
||||
s->in.format == ABOVE_BELOW_LR ||
|
||||
s->in.format == ABOVE_BELOW_RL ||
|
||||
s->in.format == ABOVE_BELOW_2_LR ||
|
||||
s->in.format == ABOVE_BELOW_2_RL)) {
|
||||
oright = av_frame_clone(inpicref);
|
||||
oleft = av_frame_clone(inpicref);
|
||||
if (!oright || !oleft) {
|
||||
av_frame_free(&oright);
|
||||
av_frame_free(&oleft);
|
||||
av_frame_free(&s->prev);
|
||||
av_frame_free(&inpicref);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
av_frame_copy_props(oright, inpicref);
|
||||
} else if ((s->out.format == MONO_L ||
|
||||
s->out.format == MONO_R) &&
|
||||
(s->in.format == SIDE_BY_SIDE_LR ||
|
||||
s->in.format == SIDE_BY_SIDE_RL ||
|
||||
s->in.format == SIDE_BY_SIDE_2_LR ||
|
||||
s->in.format == SIDE_BY_SIDE_2_RL ||
|
||||
s->in.format == ABOVE_BELOW_LR ||
|
||||
s->in.format == ABOVE_BELOW_RL ||
|
||||
s->in.format == ABOVE_BELOW_2_LR ||
|
||||
s->in.format == ABOVE_BELOW_2_RL)) {
|
||||
out = oleft = oright = av_frame_clone(inpicref);
|
||||
if (!out) {
|
||||
av_frame_free(&s->prev);
|
||||
av_frame_free(&inpicref);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
} else {
|
||||
out = oleft = oright = ff_get_video_buffer(outlink, outlink->w, outlink->h);
|
||||
if (!out) {
|
||||
av_frame_free(&s->prev);
|
||||
av_frame_free(&inpicref);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
av_frame_copy_props(out, inpicref);
|
||||
|
||||
if (s->out.format == ALTERNATING_LR ||
|
||||
s->out.format == ALTERNATING_RL) {
|
||||
oright = ff_get_video_buffer(outlink, outlink->w, outlink->h);
|
||||
if (!oright) {
|
||||
av_frame_free(&oleft);
|
||||
av_frame_free(&s->prev);
|
||||
av_frame_free(&inpicref);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
av_frame_copy_props(oright, inpicref);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
@ -644,6 +681,32 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
|
||||
}
|
||||
|
||||
switch (s->out.format) {
|
||||
case ALTERNATING_LR:
|
||||
case ALTERNATING_RL:
|
||||
switch (s->in.format) {
|
||||
case ABOVE_BELOW_LR:
|
||||
case ABOVE_BELOW_RL:
|
||||
case ABOVE_BELOW_2_LR:
|
||||
case ABOVE_BELOW_2_RL:
|
||||
case SIDE_BY_SIDE_LR:
|
||||
case SIDE_BY_SIDE_RL:
|
||||
case SIDE_BY_SIDE_2_LR:
|
||||
case SIDE_BY_SIDE_2_RL:
|
||||
oleft->width = outlink->w;
|
||||
oright->width = outlink->w;
|
||||
oleft->height = outlink->h;
|
||||
oright->height = outlink->h;
|
||||
|
||||
for (i = 0; i < s->nb_planes; i++) {
|
||||
oleft->data[i] += s->in_off_left[i];
|
||||
oright->data[i] += s->in_off_right[i];
|
||||
}
|
||||
break;
|
||||
default:
|
||||
goto copy;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case HDMI:
|
||||
for (i = 0; i < s->nb_planes; i++) {
|
||||
int j, h = s->height >> ((i == 1 || i == 2) ? s->vsub : 0);
|
||||
@ -652,8 +715,6 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
|
||||
for (j = h; j < h + b; j++)
|
||||
memset(oleft->data[i] + j * s->linesize[i], 0, s->linesize[i]);
|
||||
}
|
||||
case ALTERNATING_LR:
|
||||
case ALTERNATING_RL:
|
||||
case SIDE_BY_SIDE_LR:
|
||||
case SIDE_BY_SIDE_RL:
|
||||
case SIDE_BY_SIDE_2_LR:
|
||||
@ -664,6 +725,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
|
||||
case ABOVE_BELOW_2_RL:
|
||||
case INTERLEAVE_ROWS_LR:
|
||||
case INTERLEAVE_ROWS_RL:
|
||||
copy:
|
||||
for (i = 0; i < s->nb_planes; i++) {
|
||||
av_image_copy_plane(oleft->data[i] + out_off_left[i],
|
||||
oleft->linesize[i] * s->out.row_step,
|
||||
@ -680,11 +742,30 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
|
||||
case MONO_L:
|
||||
iright = ileft;
|
||||
case MONO_R:
|
||||
for (i = 0; i < s->nb_planes; i++) {
|
||||
av_image_copy_plane(out->data[i], out->linesize[i],
|
||||
iright->data[i] + s->in_off_left[i],
|
||||
iright->linesize[i] * s->in.row_step,
|
||||
s->linesize[i], s->pheight[i]);
|
||||
switch (s->in.format) {
|
||||
case ABOVE_BELOW_LR:
|
||||
case ABOVE_BELOW_RL:
|
||||
case ABOVE_BELOW_2_LR:
|
||||
case ABOVE_BELOW_2_RL:
|
||||
case SIDE_BY_SIDE_LR:
|
||||
case SIDE_BY_SIDE_RL:
|
||||
case SIDE_BY_SIDE_2_LR:
|
||||
case SIDE_BY_SIDE_2_RL:
|
||||
out->width = outlink->w;
|
||||
out->height = outlink->h;
|
||||
|
||||
for (i = 0; i < s->nb_planes; i++) {
|
||||
out->data[i] += s->in_off_left[i];
|
||||
}
|
||||
break;
|
||||
default:
|
||||
for (i = 0; i < s->nb_planes; i++) {
|
||||
av_image_copy_plane(out->data[i], out->linesize[i],
|
||||
iright->data[i] + s->in_off_left[i],
|
||||
iright->linesize[i] * s->in.row_step,
|
||||
s->linesize[i], s->pheight[i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case ANAGLYPH_RB_GRAY:
|
||||
|
Loading…
Reference in New Issue
Block a user