[vlc-commits] chroma: i420_nv12: handle more conversions using copy helper

Thomas Guillem git at videolan.org
Fri Mar 16 16:08:21 CET 2018


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Fri Mar  9 18:38:56 2018 +0100| [485f41736801950fb816d45bec8f23acac728673] | committer: Thomas Guillem

chroma: i420_nv12: handle more conversions using copy helper

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=485f41736801950fb816d45bec8f23acac728673
---

 modules/video_chroma/i420_nv12.c | 99 +++++++++++++++++++++++++++++++++++++---
 1 file changed, 92 insertions(+), 7 deletions(-)

diff --git a/modules/video_chroma/i420_nv12.c b/modules/video_chroma/i420_nv12.c
index b779ca8ec1..6b62284a1b 100644
--- a/modules/video_chroma/i420_nv12.c
+++ b/modules/video_chroma/i420_nv12.c
@@ -78,9 +78,62 @@ static void YV12_NV12( filter_t *p_filter, picture_t *p_src,
     I420_NV12( p_filter, p_src, p_dst );
 }
 
+static void NV12_I420( filter_t *p_filter, picture_t *p_src,
+                                           picture_t *p_dst )
+{
+    filter_sys_t *p_sys = p_filter->p_sys;
+    p_dst->format.i_x_offset = p_src->format.i_x_offset;
+    p_dst->format.i_y_offset = p_src->format.i_y_offset;
+    const size_t pitches[] = GET_PITCHES( p_src );
+    const uint8_t *planes[] = GET_PLANES( p_src );
+
+    Copy420_SP_to_P( p_dst, planes, pitches,
+                     p_src->format.i_y_offset + p_src->format.i_visible_height,
+                     &p_sys->cache );
+}
+
+static void NV12_YV12( filter_t *p_filter, picture_t *p_src,
+                                           picture_t *p_dst )
+{
+    NV12_I420( p_filter, p_src, p_dst );
+    picture_SwapUV( p_dst );
+}
+
+static void I42010B_P010( filter_t *p_filter, picture_t *p_src,
+                                              picture_t *p_dst )
+{
+    filter_sys_t *p_sys = p_filter->p_sys;
+    p_dst->format.i_x_offset = p_src->format.i_x_offset;
+    p_dst->format.i_y_offset = p_src->format.i_y_offset;
+    const size_t pitches[] = GET_PITCHES( p_src );
+    const uint8_t *planes[] = GET_PLANES( p_src );
+
+    Copy420_16_P_to_SP( p_dst, planes, pitches,
+                        p_src->format.i_y_offset + p_src->format.i_visible_height,
+                        -6, &p_sys->cache );
+}
+
+static void P010_I42010B( filter_t *p_filter, picture_t *p_src,
+                                              picture_t *p_dst )
+{
+    filter_sys_t *p_sys = p_filter->p_sys;
+    p_dst->format.i_x_offset = p_src->format.i_x_offset;
+    p_dst->format.i_y_offset = p_src->format.i_y_offset;
+    const size_t pitches[] = GET_PITCHES( p_src );
+    const uint8_t *planes[] = GET_PLANES( p_src );
+
+    Copy420_16_SP_to_P( p_dst, planes, pitches,
+                        p_src->format.i_y_offset + p_src->format.i_visible_height,
+                        6, &p_sys->cache );
+}
+
 /* Following functions are local */
 VIDEO_FILTER_WRAPPER( I420_NV12 )
 VIDEO_FILTER_WRAPPER( YV12_NV12 )
+VIDEO_FILTER_WRAPPER( NV12_I420 )
+VIDEO_FILTER_WRAPPER( NV12_YV12 )
+VIDEO_FILTER_WRAPPER( I42010B_P010 )
+VIDEO_FILTER_WRAPPER( P010_I42010B )
 
 /*****************************************************************************
  * Create: allocate a chroma function
@@ -91,15 +144,11 @@ static int Create( vlc_object_t *p_this )
 {
     filter_t *p_filter = (filter_t *)p_this;
 
-    if ( p_filter->fmt_out.video.i_chroma != VLC_CODEC_NV12 )
-        return -1;
 
     /* video must be even, because 4:2:0 is subsampled by 2 in both ways */
     if( p_filter->fmt_in.video.i_width  & 1
      || p_filter->fmt_in.video.i_height & 1 )
-    {
         return -1;
-    }
 
     /* resizing not supported */
     if( p_filter->fmt_in.video.i_x_offset + p_filter->fmt_in.video.i_visible_width !=
@@ -109,16 +158,52 @@ static int Create( vlc_object_t *p_this )
        || p_filter->fmt_in.video.orientation != p_filter->fmt_out.video.orientation )
         return -1;
 
-    switch( p_filter->fmt_in.video.i_chroma )
+    vlc_fourcc_t infcc = p_filter->fmt_in.video.i_chroma;
+    vlc_fourcc_t outfcc = p_filter->fmt_out.video.i_chroma;
+    uint8_t pixel_bytes = 1;
+
+    switch( infcc )
     {
         case VLC_CODEC_I420:
         case VLC_CODEC_J420:
+            if( outfcc != VLC_CODEC_NV12 )
+                return -1;
             p_filter->pf_video_filter = I420_NV12_Filter;
             break;
 
         case VLC_CODEC_YV12:
+            if( outfcc != VLC_CODEC_NV12 )
+                return -1;
             p_filter->pf_video_filter = YV12_NV12_Filter;
             break;
+        case VLC_CODEC_NV12:
+            switch( outfcc )
+            {
+                case VLC_CODEC_I420:
+                case VLC_CODEC_J420:
+                    p_filter->pf_video_filter = NV12_I420_Filter;
+                    break;
+                case VLC_CODEC_YV12:
+                    p_filter->pf_video_filter = NV12_YV12_Filter;
+                    break;
+                default:
+                    return -1;
+            }
+            break;
+
+        case VLC_CODEC_I420_10L:
+            if( outfcc != VLC_CODEC_P010 )
+                return -1;
+            pixel_bytes = 2;
+            p_filter->pf_video_filter = I42010B_P010_Filter;
+            break;
+
+        case VLC_CODEC_P010:
+            if( outfcc != VLC_CODEC_I420_10L )
+                return -1;
+            pixel_bytes = 2;
+            p_filter->pf_video_filter = P010_I42010B_Filter;
+            break;
 
         default:
             return -1;
@@ -129,8 +214,8 @@ static int Create( vlc_object_t *p_this )
     if (!p_sys)
          return VLC_ENOMEM;
 
-    CopyInitCache( &p_sys->cache, p_filter->fmt_in.video.i_x_offset +
-                                  p_filter->fmt_in.video.i_visible_width );
+    CopyInitCache( &p_sys->cache, ( p_filter->fmt_in.video.i_x_offset +
+                                    p_filter->fmt_in.video.i_visible_width ) * pixel_bytes );
     p_filter->p_sys = p_sys;
 
     return 0;



More information about the vlc-commits mailing list