Commit 85a22099 authored by Paul B Mahol's avatar Paul B Mahol

lavfi/stereo3d: subsampled yuv support for non-anaglyph outputs

Signed-off-by: 's avatarPaul B Mahol <onemda@gmail.com>
parent 04b98362
...@@ -136,6 +136,8 @@ typedef struct Stereo3DContext { ...@@ -136,6 +136,8 @@ typedef struct Stereo3DContext {
int ana_matrix[3][6]; int ana_matrix[3][6];
int nb_planes; int nb_planes;
int linesize[4]; int linesize[4];
int pheight[4];
int hsub, vsub;
int pixstep[4]; int pixstep[4];
AVFrame *prev; AVFrame *prev;
double ts_unit; double ts_unit;
...@@ -207,14 +209,39 @@ static const enum AVPixelFormat other_pix_fmts[] = { ...@@ -207,14 +209,39 @@ static const enum AVPixelFormat other_pix_fmts[] = {
AV_PIX_FMT_GBRP12BE, AV_PIX_FMT_GBRP12LE, AV_PIX_FMT_GBRP12BE, AV_PIX_FMT_GBRP12LE,
AV_PIX_FMT_GBRP14BE, AV_PIX_FMT_GBRP14LE, AV_PIX_FMT_GBRP14BE, AV_PIX_FMT_GBRP14LE,
AV_PIX_FMT_GBRP16BE, AV_PIX_FMT_GBRP16LE, 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_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_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_YUV444P9LE, AV_PIX_FMT_YUVA444P9LE,
AV_PIX_FMT_YUV444P9BE, AV_PIX_FMT_YUVA444P9BE, 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_YUV444P10LE, AV_PIX_FMT_YUVA444P10LE,
AV_PIX_FMT_YUV444P10BE, AV_PIX_FMT_YUVA444P10BE, 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_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_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_YUV444P16LE, AV_PIX_FMT_YUVA444P16LE,
AV_PIX_FMT_YUV444P16BE, AV_PIX_FMT_YUVA444P16BE, AV_PIX_FMT_YUV444P16BE, AV_PIX_FMT_YUVA444P16BE,
AV_PIX_FMT_NONE AV_PIX_FMT_NONE
...@@ -426,6 +453,10 @@ static int config_output(AVFilterLink *outlink) ...@@ -426,6 +453,10 @@ static int config_output(AVFilterLink *outlink)
s->nb_planes = av_pix_fmt_count_planes(outlink->format); s->nb_planes = av_pix_fmt_count_planes(outlink->format);
av_image_fill_max_pixsteps(s->pixstep, NULL, desc); 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->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; return 0;
} }
...@@ -488,10 +519,12 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) ...@@ -488,10 +519,12 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
} }
for (i = 0; i < 4; i++) { 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]; int hsub = i == 1 || i == 2 ? s->hsub : 0;
in_off_right[i] = (s->in.row_right + s->in.off_rstep) * iright->linesize[i] + s->in.off_right * s->pixstep[i]; int vsub = i == 1 || i == 2 ? s->vsub : 0;
out_off_left[i] = (s->out.row_left + s->out.off_lstep) * oleft->linesize[i] + s->out.off_left * s->pixstep[i]; 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);
out_off_right[i] = (s->out.row_right + s->out.off_rstep) * oright->linesize[i] + s->out.off_right * s->pixstep[i]; 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) { switch (s->out.format) {
...@@ -512,12 +545,12 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) ...@@ -512,12 +545,12 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
oleft->linesize[i] * s->row_step, oleft->linesize[i] * s->row_step,
ileft->data[i] + in_off_left[i], ileft->data[i] + in_off_left[i],
ileft->linesize[i] * s->row_step, 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], av_image_copy_plane(oright->data[i] + out_off_right[i],
oright->linesize[i] * s->row_step, oright->linesize[i] * s->row_step,
iright->data[i] + in_off_right[i], iright->data[i] + in_off_right[i],
iright->linesize[i] * s->row_step, iright->linesize[i] * s->row_step,
s->linesize[i], s->height); s->linesize[i], s->pheight[i]);
} }
break; break;
case MONO_L: case MONO_L:
...@@ -527,7 +560,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) ...@@ -527,7 +560,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
av_image_copy_plane(out->data[i], out->linesize[i], av_image_copy_plane(out->data[i], out->linesize[i],
iright->data[i] + in_off_left[i], iright->data[i] + in_off_left[i],
iright->linesize[i], iright->linesize[i],
s->linesize[i], s->height); s->linesize[i], s->pheight[i]);
} }
break; break;
case ANAGLYPH_RB_GRAY: case ANAGLYPH_RB_GRAY:
......
#tb 0: 1/25 #tb 0: 1/25
0, 0, 0, 1, 152064, 0xb787afe4 0, 0, 0, 1, 76032, 0xad4c8a22
0, 1, 1, 1, 152064, 0x21f0e774 0, 1, 1, 1, 76032, 0x0dfdc6ad
0, 2, 2, 1, 152064, 0x5704de73 0, 2, 2, 1, 76032, 0x6341da83
0, 3, 3, 1, 152064, 0xe80907da 0, 3, 3, 1, 76032, 0x8dbcb05f
0, 4, 4, 1, 152064, 0xbaed9048 0, 4, 4, 1, 76032, 0xad87bbee
#tb 0: 1/25 #tb 0: 1/25
0, 0, 0, 1, 152064, 0x3064732b 0, 0, 0, 1, 76032, 0x5d0effbe
0, 1, 1, 1, 152064, 0xc6cde2ab 0, 1, 1, 1, 76032, 0x5bb49e95
0, 2, 2, 1, 152064, 0x3c039f65 0, 2, 2, 1, 76032, 0xb6301bc7
0, 3, 3, 1, 152064, 0xbd3b53e0 0, 3, 3, 1, 76032, 0x7cf1d042
0, 4, 4, 1, 152064, 0x3ab585b6 0, 4, 4, 1, 76032, 0x24fafa55
#tb 0: 2/25 #tb 0: 2/25
0, 0, 0, 1, 608256, 0x3b69ed4c 0, 0, 0, 1, 304128, 0xb9c0ef40
0, 1, 1, 1, 608256, 0x0e09d9a1 0, 1, 1, 1, 304128, 0xfa0b7709
0, 2, 2, 1, 608256, 0x2edb143c 0, 2, 2, 1, 304128, 0x14255f47
0, 3, 3, 1, 608256, 0xb5084f1e 0, 3, 3, 1, 304128, 0xa9da07de
0, 4, 4, 1, 608256, 0x8be7da2d 0, 4, 4, 1, 304128, 0x9d64b93b
#tb 0: 2/25 #tb 0: 2/25
0, 0, 0, 1, 608256, 0x3f2fed4c 0, 0, 0, 1, 304128, 0x7babef40
0, 1, 1, 1, 608256, 0xc3c3d9a1 0, 1, 1, 1, 304128, 0x287d7709
0, 2, 2, 1, 608256, 0x80f5143c 0, 2, 2, 1, 304128, 0x385f5f47
0, 3, 3, 1, 608256, 0x23004f1e 0, 3, 3, 1, 304128, 0x503507de
0, 4, 4, 1, 608256, 0xc596da2d 0, 4, 4, 1, 304128, 0xb97db93b
#tb 0: 1/25 #tb 0: 1/25
0, 0, 0, 1, 304128, 0x4213231e 0, 0, 0, 1, 152064, 0x2f9389ef
0, 1, 1, 1, 304128, 0xfd78ca2e 0, 1, 1, 1, 152064, 0x16c66551
0, 2, 2, 1, 304128, 0xbd197de7 0, 2, 2, 1, 152064, 0xd779f64a
0, 3, 3, 1, 304128, 0x1e935bba 0, 3, 3, 1, 152064, 0x7a7c80b0
0, 4, 4, 1, 304128, 0x45b1160d 0, 4, 4, 1, 152064, 0x0702b652
#tb 0: 1/25 #tb 0: 1/25
0, 0, 0, 1, 304128, 0x5ac6231e 0, 0, 0, 1, 152064, 0xd1f489ef
0, 1, 1, 1, 304128, 0x4ea3ca2e 0, 1, 1, 1, 152064, 0xe4fe6551
0, 2, 2, 1, 304128, 0x1b717de7 0, 2, 2, 1, 152064, 0xd0d9f64a
0, 3, 3, 1, 304128, 0xf9e75bba 0, 3, 3, 1, 152064, 0xfd3a80b0
0, 4, 4, 1, 304128, 0xb3b3160d 0, 4, 4, 1, 152064, 0x488eb652
#tb 0: 1/50 #tb 0: 1/50
0, 0, 0, 1, 152064, 0x269fdfa9 0, 0, 0, 1, 76032, 0x3ff06515
0, 1, 1, 1, 152064, 0xfbea4366 0, 1, 1, 1, 76032, 0x00d824da
0, 2, 2, 1, 152064, 0xc957dddc 0, 2, 2, 1, 76032, 0x64a33c64
0, 3, 3, 1, 152064, 0xf3dcec43 0, 3, 3, 1, 76032, 0xeef328ed
0, 4, 4, 1, 152064, 0x0b5d30a2 0, 4, 4, 1, 76032, 0x4bb209cc
#tb 0: 1/25 #tb 0: 1/25
0, 0, 0, 1, 304128, 0x341f231e 0, 0, 0, 1, 152064, 0xbe2f89ef
0, 1, 1, 1, 304128, 0x6230ca2e 0, 1, 1, 1, 152064, 0x4c806551
0, 2, 2, 1, 304128, 0x364e7de7 0, 2, 2, 1, 152064, 0x8165f64a
0, 3, 3, 1, 304128, 0xd8305bba 0, 3, 3, 1, 152064, 0xadf280b0
0, 4, 4, 1, 304128, 0xdb0a160d 0, 4, 4, 1, 152064, 0x6677b652
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment