From 85a22099a7ba71d01abb61c08739dbedeea3a5df Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Sun, 14 Jul 2013 20:12:32 +0000 Subject: lavfi/stereo3d: subsampled yuv support for non-anaglyph outputs Signed-off-by: Paul B Mahol --- libavfilter/vf_stereo3d.c | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) (limited to 'libavfilter/vf_stereo3d.c') diff --git a/libavfilter/vf_stereo3d.c b/libavfilter/vf_stereo3d.c index ec3ab478b8..56b523ba5e 100644 --- a/libavfilter/vf_stereo3d.c +++ b/libavfilter/vf_stereo3d.c @@ -136,6 +136,8 @@ typedef struct Stereo3DContext { int ana_matrix[3][6]; int nb_planes; int linesize[4]; + int pheight[4]; + int hsub, vsub; int pixstep[4]; AVFrame *prev; double ts_unit; @@ -207,14 +209,39 @@ static const enum AVPixelFormat other_pix_fmts[] = { AV_PIX_FMT_GBRP12BE, AV_PIX_FMT_GBRP12LE, AV_PIX_FMT_GBRP14BE, AV_PIX_FMT_GBRP14LE, AV_PIX_FMT_GBRP16BE, AV_PIX_FMT_GBRP16LE, + AV_PIX_FMT_YUV410P, + AV_PIX_FMT_YUV411P, + AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P, + AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA422P, + AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVA444P, + AV_PIX_FMT_YUVJ411P, + AV_PIX_FMT_YUVJ420P, + AV_PIX_FMT_YUVJ422P, + AV_PIX_FMT_YUVJ440P, AV_PIX_FMT_YUVJ444P, + AV_PIX_FMT_YUV420P9LE, AV_PIX_FMT_YUVA420P9LE, + AV_PIX_FMT_YUV420P9BE, AV_PIX_FMT_YUVA420P9BE, + AV_PIX_FMT_YUV422P9LE, AV_PIX_FMT_YUVA422P9LE, + AV_PIX_FMT_YUV422P9BE, AV_PIX_FMT_YUVA422P9BE, AV_PIX_FMT_YUV444P9LE, AV_PIX_FMT_YUVA444P9LE, AV_PIX_FMT_YUV444P9BE, AV_PIX_FMT_YUVA444P9BE, + AV_PIX_FMT_YUV420P10LE, AV_PIX_FMT_YUVA420P10LE, + AV_PIX_FMT_YUV420P10BE, AV_PIX_FMT_YUVA420P10BE, + AV_PIX_FMT_YUV422P10LE, AV_PIX_FMT_YUVA422P10LE, + AV_PIX_FMT_YUV422P10BE, AV_PIX_FMT_YUVA422P10BE, AV_PIX_FMT_YUV444P10LE, AV_PIX_FMT_YUVA444P10LE, AV_PIX_FMT_YUV444P10BE, AV_PIX_FMT_YUVA444P10BE, + AV_PIX_FMT_YUV420P12BE, AV_PIX_FMT_YUV420P12LE, + AV_PIX_FMT_YUV422P12BE, AV_PIX_FMT_YUV422P12LE, AV_PIX_FMT_YUV444P12BE, AV_PIX_FMT_YUV444P12LE, + AV_PIX_FMT_YUV420P14BE, AV_PIX_FMT_YUV420P14LE, + AV_PIX_FMT_YUV422P14BE, AV_PIX_FMT_YUV422P14LE, AV_PIX_FMT_YUV444P14BE, AV_PIX_FMT_YUV444P14LE, + AV_PIX_FMT_YUV420P16LE, AV_PIX_FMT_YUVA420P16LE, + AV_PIX_FMT_YUV420P16BE, AV_PIX_FMT_YUVA420P16BE, + AV_PIX_FMT_YUV422P16LE, AV_PIX_FMT_YUVA422P16LE, + AV_PIX_FMT_YUV422P16BE, AV_PIX_FMT_YUVA422P16BE, AV_PIX_FMT_YUV444P16LE, AV_PIX_FMT_YUVA444P16LE, AV_PIX_FMT_YUV444P16BE, AV_PIX_FMT_YUVA444P16BE, AV_PIX_FMT_NONE @@ -426,6 +453,10 @@ static int config_output(AVFilterLink *outlink) s->nb_planes = av_pix_fmt_count_planes(outlink->format); av_image_fill_max_pixsteps(s->pixstep, NULL, desc); s->ts_unit = av_q2d(av_inv_q(av_mul_q(outlink->frame_rate, outlink->time_base))); + s->pheight[1] = s->pheight[2] = FF_CEIL_RSHIFT(s->height, desc->log2_chroma_h); + s->pheight[0] = s->pheight[3] = s->height; + s->hsub = desc->log2_chroma_w; + s->vsub = desc->log2_chroma_h; return 0; } @@ -488,10 +519,12 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) } for (i = 0; i < 4; i++) { - in_off_left[i] = (s->in.row_left + s->in.off_lstep) * ileft->linesize[i] + s->in.off_left * s->pixstep[i]; - in_off_right[i] = (s->in.row_right + s->in.off_rstep) * iright->linesize[i] + s->in.off_right * s->pixstep[i]; - out_off_left[i] = (s->out.row_left + s->out.off_lstep) * oleft->linesize[i] + s->out.off_left * s->pixstep[i]; - out_off_right[i] = (s->out.row_right + s->out.off_rstep) * oright->linesize[i] + s->out.off_right * s->pixstep[i]; + int hsub = i == 1 || i == 2 ? s->hsub : 0; + int vsub = i == 1 || i == 2 ? s->vsub : 0; + in_off_left[i] = (FF_CEIL_RSHIFT(s->in.row_left, vsub) + s->in.off_lstep) * ileft->linesize[i] + FF_CEIL_RSHIFT(s->in.off_left * s->pixstep[i], hsub); + in_off_right[i] = (FF_CEIL_RSHIFT(s->in.row_right, vsub) + s->in.off_rstep) * iright->linesize[i] + FF_CEIL_RSHIFT(s->in.off_right * s->pixstep[i], hsub); + out_off_left[i] = (FF_CEIL_RSHIFT(s->out.row_left, vsub) + s->out.off_lstep) * oleft->linesize[i] + FF_CEIL_RSHIFT(s->out.off_left * s->pixstep[i], hsub); + out_off_right[i] = (FF_CEIL_RSHIFT(s->out.row_right, vsub) + s->out.off_rstep) * oright->linesize[i] + FF_CEIL_RSHIFT(s->out.off_right * s->pixstep[i], hsub); } switch (s->out.format) { @@ -512,12 +545,12 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) oleft->linesize[i] * s->row_step, ileft->data[i] + in_off_left[i], ileft->linesize[i] * s->row_step, - s->linesize[i], s->height); + s->linesize[i], s->pheight[i]); av_image_copy_plane(oright->data[i] + out_off_right[i], oright->linesize[i] * s->row_step, iright->data[i] + in_off_right[i], iright->linesize[i] * s->row_step, - s->linesize[i], s->height); + s->linesize[i], s->pheight[i]); } break; case MONO_L: @@ -527,7 +560,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) av_image_copy_plane(out->data[i], out->linesize[i], iright->data[i] + in_off_left[i], iright->linesize[i], - s->linesize[i], s->height); + s->linesize[i], s->pheight[i]); } break; case ANAGLYPH_RB_GRAY: -- cgit v1.2.3