|
|
|
@ -62,6 +62,7 @@ enum StereoCode { |
|
|
|
|
ALTERNATING_RL, // alternating frames (right eye first, left eye second)
|
|
|
|
|
CHECKERBOARD_LR, // checkerboard pattern (left eye first, right eye second)
|
|
|
|
|
CHECKERBOARD_RL, // checkerboard pattern (right eye first, left eye second)
|
|
|
|
|
HDMI, // HDMI frame pack (left eye first, right eye second)
|
|
|
|
|
STEREO_CODE_COUNT // TODO: needs autodetection
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -145,6 +146,7 @@ typedef struct Stereo3DContext { |
|
|
|
|
int pixstep[4]; |
|
|
|
|
AVFrame *prev; |
|
|
|
|
double ts_unit; |
|
|
|
|
int blanks; |
|
|
|
|
int in_off_left[4], in_off_right[4]; |
|
|
|
|
} Stereo3DContext; |
|
|
|
|
|
|
|
|
@ -196,6 +198,7 @@ static const AVOption stereo3d_options[] = { |
|
|
|
|
{ "sbsr", "side by side right first", 0, AV_OPT_TYPE_CONST, {.i64=SIDE_BY_SIDE_RL}, 0, 0, FLAGS, "out" }, |
|
|
|
|
{ "chl", "checkerboard left first", 0, AV_OPT_TYPE_CONST, {.i64=CHECKERBOARD_LR}, 0, 0, FLAGS, "out" }, |
|
|
|
|
{ "chr", "checkerboard right first", 0, AV_OPT_TYPE_CONST, {.i64=CHECKERBOARD_RL}, 0, 0, FLAGS, "out" }, |
|
|
|
|
{ "hdmi", "HDMI frame pack", 0, AV_OPT_TYPE_CONST, {.i64=HDMI}, 0, 0, FLAGS, "out" }, |
|
|
|
|
{ NULL } |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -446,6 +449,14 @@ static int config_output(AVFilterLink *outlink) |
|
|
|
|
s->out.height = s->height * 2; |
|
|
|
|
s->out.row_right = s->height; |
|
|
|
|
break; |
|
|
|
|
case HDMI: |
|
|
|
|
if (s->in.height <= 720) |
|
|
|
|
s->blanks = 30; |
|
|
|
|
else |
|
|
|
|
s->blanks = 45; |
|
|
|
|
s->out.height = s->height * 2 + s->blanks; |
|
|
|
|
s->out.row_right = s->height + s->blanks; |
|
|
|
|
break; |
|
|
|
|
case ABOVE_BELOW_2_RL: |
|
|
|
|
aspect.num *= 2; |
|
|
|
|
case ABOVE_BELOW_RL: |
|
|
|
@ -614,6 +625,14 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch (s->out.format) { |
|
|
|
|
case HDMI: |
|
|
|
|
for (i = 0; i < s->nb_planes; i++) { |
|
|
|
|
int j, h = s->height >> ((i == 1 || i == 2) ? s->vsub : 0); |
|
|
|
|
int b = (s->blanks) >> ((i == 1 || i == 2) ? s->vsub : 0); |
|
|
|
|
|
|
|
|
|
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: |
|
|
|
|