[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