[vlc-commits] [Git][videolan/vlc][master] 2 commits: image: separate the encoding codec from the output video format

Jean-Baptiste Kempf (@jbk) gitlab at videolan.org
Thu Oct 12 06:00:30 UTC 2023



Jean-Baptiste Kempf pushed to branch master at VideoLAN / VLC


Commits:
98a73f61 by Steve Lhomme at 2023-10-12T05:42:24+00:00
image: separate the encoding codec from the output video format

The output is a bitstream in some codec, not a chroma that can be used as such.
The codec value should not be set as a chroma in the video_format_t.

The output video format is only used to force some dimensions on the output
that may not be the ones from the source.

- - - - -
702e8c8a by Steve Lhomme at 2023-10-12T05:42:24+00:00
picture: fix visible output when only on direction is provided

- - - - -


8 changed files:

- include/vlc_image.h
- include/vlc_picture.h
- lib/picture.c
- modules/video_filter/scene.c
- src/misc/image.c
- src/misc/picture.c
- test/src/misc/image.c
- test/src/misc/image_cvpx.c


Changes:

=====================================
include/vlc_image.h
=====================================
@@ -43,9 +43,11 @@ struct image_handler_t
     picture_t * (*pf_read_url)  ( image_handler_t *, const char *,
                                   video_format_t * );
     block_t * (*pf_write)       ( image_handler_t *, picture_t *,
-                                  const video_format_t *, const video_format_t * );
+                                  const video_format_t *,
+                                  vlc_fourcc_t, const video_format_t * );
     int (*pf_write_url)         ( image_handler_t *, picture_t *,
-                                  const video_format_t *, const video_format_t *,
+                                  const video_format_t *,
+                                  vlc_fourcc_t, const video_format_t *,
                                   const char * );
 
     picture_t * (*pf_convert)   ( image_handler_t *, picture_t *,
@@ -66,8 +68,8 @@ VLC_API void image_HandlerDelete( image_handler_t * );
 
 #define image_Read( a, b, c, d ) a->pf_read( a, b, c, d )
 #define image_ReadUrl( a, b, c ) a->pf_read_url( a, b, c )
-#define image_Write( a, b, c, d ) a->pf_write( a, b, c, d )
-#define image_WriteUrl( a, b, c, d, e ) a->pf_write_url( a, b, c, d, e )
+#define image_Write( a, b, c, d, e ) a->pf_write( a, b, c, d, e )
+#define image_WriteUrl( a, b, c, d, e, f ) a->pf_write_url( a, b, c, d, e, f )
 #define image_Convert( a, b, c, d ) a->pf_convert( a, b, c, d )
 
 VLC_API vlc_fourcc_t image_Type2Fourcc( const char *psz_name );


=====================================
include/vlc_picture.h
=====================================
@@ -461,7 +461,7 @@ picture_GetAncillary(const picture_t *pic, vlc_ancillary_id id);
 /**
  * This function will export a picture to an encoded bitstream.
  *
- * pp_image will contain the encoded bitstream in psz_format format.
+ * pp_image will contain the encoded bitstream in i_codec codec.
  *
  * p_fmt can be NULL otherwise it will be set with the format used for the
  * picture before encoding.
@@ -476,7 +476,7 @@ picture_GetAncillary(const picture_t *pic, vlc_ancillary_id id);
  * If at most one of them is > 0 then the picture aspect ratio will be kept.
  */
 VLC_API int picture_Export( vlc_object_t *p_obj, block_t **pp_image, video_format_t *p_fmt,
-                            picture_t *p_picture, vlc_fourcc_t i_format, int i_override_width,
+                            picture_t *p_picture, vlc_fourcc_t i_codec, int i_override_width,
                             int i_override_height, bool b_crop );
 
 /**


=====================================
lib/picture.c
=====================================
@@ -126,7 +126,7 @@ static libvlc_picture_t* libvlc_picture_from_attachment( input_attachment_t* att
     vlc_atomic_rc_init( &pic->rc );
     pic->attachment = vlc_input_attachment_Hold( attachment );
     pic->time = VLC_TICK_INVALID;
-    video_format_Init( &pic->fmt, fcc );
+    video_format_Init( &pic->fmt, 0 );
     switch ( fcc )
     {
     case VLC_CODEC_PNG:


=====================================
modules/video_filter/scene.c
=====================================
@@ -290,7 +290,7 @@ static void SavePicture( filter_t *p_filter, picture_t *p_pic )
     char *psz_temp = NULL;
     int i_ret;
 
-    video_format_Init( &fmt_out, p_sys->i_format );
+    video_format_Init( &fmt_out, 0 );
 
     /* Save snapshot psz_format to a memory zone */
     fmt_in = p_pic->format;
@@ -325,7 +325,7 @@ static void SavePicture( filter_t *p_filter, picture_t *p_pic )
     }
 
     /* Save the image */
-    i_ret = image_WriteUrl( p_sys->p_image, p_pic, &fmt_in, &fmt_out,
+    i_ret = image_WriteUrl( p_sys->p_image, p_pic, &fmt_in, p_sys->i_format, &fmt_out,
                             psz_temp );
     if( i_ret != VLC_SUCCESS )
     {


=====================================
src/misc/image.c
=====================================
@@ -66,16 +66,19 @@ static picture_t *ImageRead( image_handler_t *, block_t *,
 static picture_t *ImageReadUrl( image_handler_t *, const char *,
                                 video_format_t * );
 static block_t *ImageWrite( image_handler_t *, picture_t *,
-                            const video_format_t *, const video_format_t * );
+                            const video_format_t *,
+                            vlc_fourcc_t, const video_format_t * );
 static int ImageWriteUrl( image_handler_t *, picture_t *,
-                          const video_format_t *, const video_format_t *, const char * );
+                          const video_format_t *,
+                          vlc_fourcc_t, const video_format_t *,
+                          const char * );
 
 static picture_t *ImageConvert( image_handler_t *, picture_t *,
                                 const video_format_t *, video_format_t * );
 
 static decoder_t *CreateDecoder( image_handler_t *, const es_format_t * );
 static encoder_t *CreateEncoder( vlc_object_t *, const video_format_t *,
-                                 const video_format_t * );
+                                 vlc_fourcc_t, const video_format_t * );
 static filter_t *CreateConverter( vlc_object_t *, const es_format_t *,
                                   struct vlc_video_context *,
                                   const video_format_t * );
@@ -353,11 +356,11 @@ error:
 
 static block_t *ImageWrite( image_handler_t *p_image, picture_t *p_pic,
                             const video_format_t *p_fmt_in,
-                            const video_format_t *p_fmt_out )
+                            vlc_fourcc_t codec, const video_format_t *p_fmt_out )
 {
     /* Check if we can reuse the current encoder */
     if( p_image->p_enc &&
-        ( p_image->p_enc->fmt_out.i_codec != p_fmt_out->i_chroma ||
+        ( p_image->p_enc->fmt_out.i_codec != codec ||
           p_image->p_enc->fmt_out.video.i_width != p_fmt_out->i_width ||
           p_image->p_enc->fmt_out.video.i_height != p_fmt_out->i_height ) )
     {
@@ -369,7 +372,7 @@ static block_t *ImageWrite( image_handler_t *p_image, picture_t *p_pic,
     if( !p_image->p_enc )
     {
         p_image->p_enc = CreateEncoder( p_image->p_parent,
-                                        p_fmt_in, p_fmt_out );
+                                        p_fmt_in, codec, p_fmt_out );
         if( !p_image->p_enc ) return NULL;
     }
 
@@ -441,17 +444,18 @@ static block_t *ImageWrite( image_handler_t *p_image, picture_t *p_pic,
 }
 
 static int ImageWriteUrl( image_handler_t *p_image, picture_t *p_pic,
-                          const video_format_t *p_fmt_in, const video_format_t *p_fmt_out,
+                          const video_format_t *p_fmt_in,
+                          vlc_fourcc_t codec, const video_format_t *p_fmt_out,
                           const char *psz_url )
 {
     block_t *p_block;
     FILE *file;
     video_format_t fmt_out = *p_fmt_out;
 
-    if( !fmt_out.i_chroma )
+    if( !codec )
     {
         /* Try to guess format from file name */
-        fmt_out.i_chroma = image_Ext2Fourcc( psz_url );
+        codec = image_Ext2Fourcc( psz_url );
     }
 
     file = vlc_fopen( psz_url, "wb" );
@@ -461,7 +465,7 @@ static int ImageWriteUrl( image_handler_t *p_image, picture_t *p_pic,
         return VLC_EGENERIC;
     }
 
-    p_block = ImageWrite( p_image, p_pic, p_fmt_in, &fmt_out );
+    p_block = ImageWrite( p_image, p_pic, p_fmt_in, codec, &fmt_out );
 
     int err = 0;
     if( p_block )
@@ -691,7 +695,7 @@ static decoder_t *CreateDecoder( image_handler_t *p_image, const es_format_t *fm
 
 
 static encoder_t *CreateEncoder( vlc_object_t *p_this, const video_format_t *fmt_in,
-                                 const video_format_t *fmt_out )
+                                 vlc_fourcc_t codec, const video_format_t *fmt_out )
 {
     encoder_t *p_enc;
 
@@ -723,6 +727,8 @@ static encoder_t *CreateEncoder( vlc_object_t *p_this, const video_format_t *fmt
     p_enc->fmt_in.video.i_frame_rate_base = 1;
 
     es_format_InitFromVideo( &p_enc->fmt_out, fmt_out );
+    p_enc->fmt_out.i_codec = codec;
+    p_enc->fmt_out.video.i_chroma = 0;
     p_enc->fmt_out.video.i_width = p_enc->fmt_in.video.i_width;
     p_enc->fmt_out.video.i_height = p_enc->fmt_in.video.i_height;
     p_enc->ops = NULL;
@@ -739,7 +745,6 @@ static encoder_t *CreateEncoder( vlc_object_t *p_this, const video_format_t *fmt
         return NULL;
     }
     assert( p_enc->ops != NULL );
-    p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec;
 
     return p_enc;
 }


=====================================
src/misc/picture.c
=====================================
@@ -518,7 +518,7 @@ int picture_Export( vlc_object_t *p_obj,
                     block_t **pp_image,
                     video_format_t *p_fmt,
                     picture_t *p_picture,
-                    vlc_fourcc_t i_format,
+                    vlc_fourcc_t i_codec,
                     int i_override_width, int i_override_height,
                     bool b_crop )
 {
@@ -535,7 +535,6 @@ int picture_Export( vlc_object_t *p_obj,
     memset( &fmt_out, 0, sizeof(fmt_out) );
     fmt_out.i_sar_num =
     fmt_out.i_sar_den = 1;
-    fmt_out.i_chroma  = i_format;
 
     /* compute original width/height */
     unsigned int i_width, i_height, i_original_width, i_original_height;
@@ -590,8 +589,6 @@ int picture_Export( vlc_object_t *p_obj,
         fmt_out.i_height = ( i_override_height < 0 ) ?
                            i_original_height : (unsigned)i_override_height;
     }
-    fmt_out.i_visible_width = fmt_out.i_width;
-    fmt_out.i_visible_height = fmt_out.i_height;
 
     /* scale if only one direction is provided */
     if( fmt_out.i_height == 0 && fmt_out.i_width > 0 )
@@ -604,13 +601,15 @@ int picture_Export( vlc_object_t *p_obj,
         fmt_out.i_width  = i_width * fmt_out.i_height
                          * fmt_in.i_sar_num / fmt_in.i_height / fmt_in.i_sar_den;
     }
+    fmt_out.i_visible_width = fmt_out.i_width;
+    fmt_out.i_visible_height = fmt_out.i_height;
 
     image_handler_t *p_image = image_HandlerCreate( p_obj );
     if( !p_image )
         return VLC_ENOMEM;
 
     vlc_tick_t date = p_picture->date;
-    block_t *p_block = image_Write( p_image, p_picture, &fmt_in, &fmt_out );
+    block_t *p_block = image_Write( p_image, p_picture, &fmt_in, i_codec, &fmt_out );
 
     image_HandlerDelete( p_image );
 


=====================================
test/src/misc/image.c
=====================================
@@ -57,7 +57,7 @@ static int OpenIntf(vlc_object_t *root)
     fmt_in.i_height = fmt_in.i_visible_height = 600;
 
     video_format_t fmt_out;
-    video_format_Init(&fmt_out, VLC_CODEC_PNG);
+    video_format_Init(&fmt_out, 0);
     fmt_out.i_width = fmt_out.i_visible_width = 800;
     fmt_out.i_height = fmt_out.i_visible_height = 600;
 
@@ -66,7 +66,7 @@ static int OpenIntf(vlc_object_t *root)
 
     block_t *block;
 
-    block = image_Write(ih, picture, &fmt_in, &fmt_out);
+    block = image_Write(ih, picture, &fmt_in, VLC_CODEC_PNG, &fmt_out);
     assert(block != NULL);
     block_Release(block);
     picture_Release(picture);
@@ -76,7 +76,7 @@ static int OpenIntf(vlc_object_t *root)
     picture = picture_NewFromFormat(&fmt_in);
     fmt_out.i_width = fmt_out.i_visible_width = 400;
     fmt_out.i_height = fmt_out.i_visible_height = 300;
-    block = image_Write(ih, picture, &fmt_in, &fmt_out);
+    block = image_Write(ih, picture, &fmt_in, VLC_CODEC_PNG, &fmt_out);
     assert(block != NULL);
     block_Release(block);
     picture_Release(picture);


=====================================
test/src/misc/image_cvpx.c
=====================================
@@ -74,13 +74,13 @@ static int OpenIntf(vlc_object_t *root)
     assert(ret == VLC_SUCCESS);
 
     video_format_t fmt_out;
-    video_format_Init(&fmt_out, VLC_CODEC_PNG);
+    video_format_Init(&fmt_out, 0);
     fmt_out.i_width = fmt_out.i_visible_width = 800;
     fmt_out.i_height = fmt_out.i_visible_height = 600;
 
     block_t *block;
 
-    block = image_Write(ih, picture, &fmt_in, &fmt_out);
+    block = image_Write(ih, picture, &fmt_in, VLC_CODEC_PNG, &fmt_out);
     assert(block != NULL);
     block_Release(block);
     image_HandlerDelete(ih);



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/1a4208f9c88e34f12dbae4830b6918fbd202c395...702e8c8abfeb05c06657af88494aab55a990431c

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/1a4208f9c88e34f12dbae4830b6918fbd202c395...702e8c8abfeb05c06657af88494aab55a990431c
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list