]> git.sesse.net Git - ffmpeg/commitdiff
lavfi/hflip: Support Bayer pixel formats.
authorCarl Eugen Hoyos <ceffmpeg@gmail.com>
Sun, 26 Jul 2020 19:58:31 +0000 (21:58 +0200)
committerCarl Eugen Hoyos <ceffmpeg@gmail.com>
Mon, 24 Aug 2020 23:29:24 +0000 (01:29 +0200)
Fixes part of ticket #8819.

libavfilter/hflip.h
libavfilter/vf_hflip.c
tests/checkasm/vf_hflip.c

index 204090dbb4e2ca975df539dac83b30a644578f2b..a40b98470b477e045823d7ec172eefb785fd5e97 100644 (file)
@@ -27,6 +27,7 @@
 typedef struct FlipContext {
     const AVClass *class;
     int max_step[4];    ///< max pixel step for each plane, expressed as a number of bytes
+    int bayer_plus1;    ///< 1 .. not a Bayer input format, 2 .. Bayer input format
     int planewidth[4];  ///< width of each plane
     int planeheight[4]; ///< height of each plane
 
index b77afc77fc9ec343ad76348cbc3ed95aa24cfa85..8d7bd9b4dbc7139d73aab80b5f16a898a789b396 100644 (file)
@@ -138,6 +138,7 @@ static int config_props(AVFilterLink *inlink)
     s->planewidth[1]  = s->planewidth[2]  = AV_CEIL_RSHIFT(inlink->w, hsub);
     s->planeheight[0] = s->planeheight[3] = inlink->h;
     s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, vsub);
+    s->bayer_plus1    = !!(pix_desc->flags & AV_PIX_FMT_FLAG_BAYER) + 1;
 
     nb_planes = av_pix_fmt_count_planes(inlink->format);
 
@@ -149,6 +150,7 @@ int ff_hflip_init(FlipContext *s, int step[4], int nb_planes)
     int i;
 
     for (i = 0; i < nb_planes; i++) {
+        step[i] *= s->bayer_plus1;
         switch (step[i]) {
         case 1: s->flip_line[i] = hflip_byte_c;  break;
         case 2: s->flip_line[i] = hflip_short_c; break;
@@ -180,7 +182,7 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int job, int nb_jobs)
     int i, plane, step;
 
     for (plane = 0; plane < 4 && in->data[plane] && in->linesize[plane]; plane++) {
-        const int width  = s->planewidth[plane];
+        const int width  = s->planewidth[plane] / s->bayer_plus1;
         const int height = s->planeheight[plane];
         const int start = (height *  job   ) / nb_jobs;
         const int end   = (height * (job+1)) / nb_jobs;
index 6bb4d09d64e6dc03772d75001e05e9e873c8c418..48ebf85fdbb04d3bdc7dbc7763d22e4fa653f7bd 100644 (file)
@@ -40,6 +40,7 @@ static void check_hflip(int step, const char * report_name){
     int i;
     int step_array[4] = {1, 1, 1, 1};
     FlipContext s;
+    s.bayer_plus1 = 1;
 
     declare_func(void, const uint8_t *src, uint8_t *dst, int w);