Browse code

avfilter/vf_stereo3d: add HDMI output format

Signed-off-by: Paul B Mahol <onemda@gmail.com>

Paul B Mahol authored on 2015/09/05 12:35:46
Showing 1 changed files
... ...
@@ -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: