Signed-off-by: Paul B Mahol <onemda@gmail.com>
Paul B Mahol authored on 2015/09/05 12:35:46... | ... |
@@ -62,6 +62,7 @@ enum StereoCode { |
62 | 62 |
ALTERNATING_RL, // alternating frames (right eye first, left eye second) |
63 | 63 |
CHECKERBOARD_LR, // checkerboard pattern (left eye first, right eye second) |
64 | 64 |
CHECKERBOARD_RL, // checkerboard pattern (right eye first, left eye second) |
65 |
+ HDMI, // HDMI frame pack (left eye first, right eye second) |
|
65 | 66 |
STEREO_CODE_COUNT // TODO: needs autodetection |
66 | 67 |
}; |
67 | 68 |
|
... | ... |
@@ -145,6 +146,7 @@ typedef struct Stereo3DContext { |
145 | 145 |
int pixstep[4]; |
146 | 146 |
AVFrame *prev; |
147 | 147 |
double ts_unit; |
148 |
+ int blanks; |
|
148 | 149 |
int in_off_left[4], in_off_right[4]; |
149 | 150 |
} Stereo3DContext; |
150 | 151 |
|
... | ... |
@@ -196,6 +198,7 @@ static const AVOption stereo3d_options[] = { |
196 | 196 |
{ "sbsr", "side by side right first", 0, AV_OPT_TYPE_CONST, {.i64=SIDE_BY_SIDE_RL}, 0, 0, FLAGS, "out" }, |
197 | 197 |
{ "chl", "checkerboard left first", 0, AV_OPT_TYPE_CONST, {.i64=CHECKERBOARD_LR}, 0, 0, FLAGS, "out" }, |
198 | 198 |
{ "chr", "checkerboard right first", 0, AV_OPT_TYPE_CONST, {.i64=CHECKERBOARD_RL}, 0, 0, FLAGS, "out" }, |
199 |
+ { "hdmi", "HDMI frame pack", 0, AV_OPT_TYPE_CONST, {.i64=HDMI}, 0, 0, FLAGS, "out" }, |
|
199 | 200 |
{ NULL } |
200 | 201 |
}; |
201 | 202 |
|
... | ... |
@@ -446,6 +449,14 @@ static int config_output(AVFilterLink *outlink) |
446 | 446 |
s->out.height = s->height * 2; |
447 | 447 |
s->out.row_right = s->height; |
448 | 448 |
break; |
449 |
+ case HDMI: |
|
450 |
+ if (s->in.height <= 720) |
|
451 |
+ s->blanks = 30; |
|
452 |
+ else |
|
453 |
+ s->blanks = 45; |
|
454 |
+ s->out.height = s->height * 2 + s->blanks; |
|
455 |
+ s->out.row_right = s->height + s->blanks; |
|
456 |
+ break; |
|
449 | 457 |
case ABOVE_BELOW_2_RL: |
450 | 458 |
aspect.num *= 2; |
451 | 459 |
case ABOVE_BELOW_RL: |
... | ... |
@@ -614,6 +625,14 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) |
614 | 614 |
} |
615 | 615 |
|
616 | 616 |
switch (s->out.format) { |
617 |
+ case HDMI: |
|
618 |
+ for (i = 0; i < s->nb_planes; i++) { |
|
619 |
+ int j, h = s->height >> ((i == 1 || i == 2) ? s->vsub : 0); |
|
620 |
+ int b = (s->blanks) >> ((i == 1 || i == 2) ? s->vsub : 0); |
|
621 |
+ |
|
622 |
+ for (j = h; j < h + b; j++) |
|
623 |
+ memset(oleft->data[i] + j * s->linesize[i], 0, s->linesize[i]); |
|
624 |
+ } |
|
617 | 625 |
case ALTERNATING_LR: |
618 | 626 |
case ALTERNATING_RL: |
619 | 627 |
case SIDE_BY_SIDE_LR: |