[FFmpeg-cvslog] lavfi/hflip: Support Bayer pixel formats.

Carl Eugen Hoyos git at videolan.org
Tue Aug 25 02:30:11 EEST 2020


ffmpeg | branch: master | Carl Eugen Hoyos <ceffmpeg at gmail.com> | Sun Jul 26 21:58:31 2020 +0200| [b61376bdee61c08732105fa331eb076497eface9] | committer: Carl Eugen Hoyos

lavfi/hflip: Support Bayer pixel formats.

Fixes part of ticket #8819.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b61376bdee61c08732105fa331eb076497eface9
---

 libavfilter/hflip.h       | 1 +
 libavfilter/vf_hflip.c    | 4 +++-
 tests/checkasm/vf_hflip.c | 1 +
 3 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/libavfilter/hflip.h b/libavfilter/hflip.h
index 204090dbb4..a40b98470b 100644
--- a/libavfilter/hflip.h
+++ b/libavfilter/hflip.h
@@ -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
 
diff --git a/libavfilter/vf_hflip.c b/libavfilter/vf_hflip.c
index b77afc77fc..8d7bd9b4db 100644
--- a/libavfilter/vf_hflip.c
+++ b/libavfilter/vf_hflip.c
@@ -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;
diff --git a/tests/checkasm/vf_hflip.c b/tests/checkasm/vf_hflip.c
index 6bb4d09d64..48ebf85fdb 100644
--- a/tests/checkasm/vf_hflip.c
+++ b/tests/checkasm/vf_hflip.c
@@ -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);
 



More information about the ffmpeg-cvslog mailing list