diff options
author | Paul B Mahol <onemda@gmail.com> | 2013-04-17 17:27:02 +0000 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2013-04-17 17:34:17 +0000 |
commit | 1de7dcb4574da7fa6bfde44e59b136e193a61d9c (patch) | |
tree | 2fa0a48b887b7191d261b484d474d0046c21ffc7 | |
parent | 7ee2daed9b730e661249d8751d118b84c507dcf6 (diff) | |
download | ffmpeg-1de7dcb4574da7fa6bfde44e59b136e193a61d9c.tar.gz |
lavfi/stereo3d: fix interleave row output modes
Linesizes that did not match output width produced several artifacts.
Signed-off-by: Paul B Mahol <onemda@gmail.com>
-rw-r--r-- | libavfilter/vf_stereo3d.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/libavfilter/vf_stereo3d.c b/libavfilter/vf_stereo3d.c index 09d4554b83..57050036e8 100644 --- a/libavfilter/vf_stereo3d.c +++ b/libavfilter/vf_stereo3d.c @@ -63,6 +63,7 @@ typedef struct StereoComponent { enum StereoCode format; int width, height; int off_left, off_right; + int off_lstep, off_rstep; int row_left, row_right; } StereoComponent; @@ -229,6 +230,8 @@ static int config_output(AVFilterLink *outlink) s->in.height = s->height = inlink->h; s->row_step = 1; + s->in.off_lstep = + s->in.off_rstep = s->in.off_left = s->in.off_right = s->in.row_left = @@ -266,6 +269,8 @@ static int config_output(AVFilterLink *outlink) s->out.width = s->width; s->out.height = s->height; + s->out.off_lstep = + s->out.off_rstep = s->out.off_left = s->out.off_right = s->out.row_left = @@ -315,14 +320,14 @@ static int config_output(AVFilterLink *outlink) case INTERLEAVE_ROWS_LR: s->row_step = 2; s->height = s->height / 2; - s->out.off_right = s->width * 3; - s->in.off_right += s->in.width * 3; + s->out.off_rstep = + s->in.off_rstep = 1; break; case INTERLEAVE_ROWS_RL: s->row_step = 2; s->height = s->height / 2; - s->out.off_left = s->width * 3; - s->in.off_left += s->in.width * 3; + s->out.off_lstep = + s->in.off_lstep = 1; break; case MONO_R: s->in.off_left = s->in.off_right; @@ -368,10 +373,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) } av_frame_copy_props(out, inpicref); - in_off_left = s->in.row_left * inpicref->linesize[0] + s->in.off_left; - in_off_right = s->in.row_right * inpicref->linesize[0] + s->in.off_right; - out_off_left = s->out.row_left * out->linesize[0] + s->out.off_left; - out_off_right = s->out.row_right * out->linesize[0] + s->out.off_right; + in_off_left = (s->in.row_left + s->in.off_lstep) * inpicref->linesize[0] + s->in.off_left; + in_off_right = (s->in.row_right + s->in.off_rstep) * inpicref->linesize[0] + s->in.off_right; + out_off_left = (s->out.row_left + s->out.off_lstep) * out->linesize[0] + s->out.off_left; + out_off_right = (s->out.row_right + s->out.off_rstep) * out->linesize[0] + s->out.off_right; switch (s->out.format) { case SIDE_BY_SIDE_LR: |