heifsave: expose compression option
improve error messaging, add further suffixes
This commit is contained in:
parent
5657099223
commit
42f9f78c86
@ -146,7 +146,8 @@ void
|
|||||||
vips__heif_error( struct heif_error *error )
|
vips__heif_error( struct heif_error *error )
|
||||||
{
|
{
|
||||||
if( error->code )
|
if( error->code )
|
||||||
vips_error( "heifload", "%s", error->message );
|
vips_error( "heif", "%s (%d.%d)", error->message, error->code,
|
||||||
|
error->subcode );
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *heif_magic[] = {
|
static const char *heif_magic[] = {
|
||||||
@ -814,6 +815,8 @@ vips_foreign_load_heif_file_header( VipsForeignLoad *load )
|
|||||||
|
|
||||||
const char *vips__heif_suffs[] = {
|
const char *vips__heif_suffs[] = {
|
||||||
".heic",
|
".heic",
|
||||||
|
".heif",
|
||||||
|
".avif",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -65,6 +65,10 @@ typedef struct _VipsForeignSaveHeif {
|
|||||||
*/
|
*/
|
||||||
gboolean lossless;
|
gboolean lossless;
|
||||||
|
|
||||||
|
/* Compression format
|
||||||
|
*/
|
||||||
|
VipsForeignHeifCompression compression;
|
||||||
|
|
||||||
int page_width;
|
int page_width;
|
||||||
int page_height;
|
int page_height;
|
||||||
int n_pages;
|
int n_pages;
|
||||||
@ -293,12 +297,15 @@ vips_foreign_save_heif_build( VipsObject *object )
|
|||||||
build( object ) )
|
build( object ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
/* TODO ... should be a param? the other useful one is AVC.
|
|
||||||
*/
|
|
||||||
error = heif_context_get_encoder_for_format( heif->ctx,
|
error = heif_context_get_encoder_for_format( heif->ctx,
|
||||||
heif_compression_HEVC, &heif->encoder );
|
heif->compression, &heif->encoder );
|
||||||
if( error.code ) {
|
if( error.code ) {
|
||||||
vips__heif_error( &error );
|
if ( error.code == heif_error_Unsupported_filetype ) {
|
||||||
|
vips_error( "heifsave", "%s", _( "Unsupported compression" ) );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vips__heif_error( &error );
|
||||||
|
}
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -401,6 +408,14 @@ vips_foreign_save_heif_class_init( VipsForeignSaveHeifClass *class )
|
|||||||
G_STRUCT_OFFSET( VipsForeignSaveHeif, lossless ),
|
G_STRUCT_OFFSET( VipsForeignSaveHeif, lossless ),
|
||||||
FALSE );
|
FALSE );
|
||||||
|
|
||||||
|
VIPS_ARG_ENUM( class, "compression", 14,
|
||||||
|
_( "compression" ),
|
||||||
|
_( "Compression format" ),
|
||||||
|
VIPS_ARGUMENT_OPTIONAL_INPUT,
|
||||||
|
G_STRUCT_OFFSET( VipsForeignSaveHeif, compression ),
|
||||||
|
VIPS_TYPE_FOREIGN_HEIF_COMPRESSION,
|
||||||
|
VIPS_FOREIGN_HEIF_COMPRESSION_HEVC );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -408,6 +423,7 @@ vips_foreign_save_heif_init( VipsForeignSaveHeif *heif )
|
|||||||
{
|
{
|
||||||
heif->ctx = heif_context_alloc();
|
heif->ctx = heif_context_alloc();
|
||||||
heif->Q = 50;
|
heif->Q = 50;
|
||||||
|
heif->compression = VIPS_FOREIGN_HEIF_COMPRESSION_HEVC;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct _VipsForeignSaveHeifFile {
|
typedef struct _VipsForeignSaveHeifFile {
|
||||||
@ -580,6 +596,7 @@ vips_foreign_save_heif_buffer_init( VipsForeignSaveHeifBuffer *buffer )
|
|||||||
*
|
*
|
||||||
* * @Q: %gint, quality factor
|
* * @Q: %gint, quality factor
|
||||||
* * @lossless: %gboolean, enable lossless encoding
|
* * @lossless: %gboolean, enable lossless encoding
|
||||||
|
* * @compression: use this #VipsForeignHeifCompression
|
||||||
*
|
*
|
||||||
* Write a VIPS image to a file in HEIF format.
|
* Write a VIPS image to a file in HEIF format.
|
||||||
*
|
*
|
||||||
@ -588,6 +605,8 @@ vips_foreign_save_heif_buffer_init( VipsForeignSaveHeifBuffer *buffer )
|
|||||||
*
|
*
|
||||||
* Set @lossless %TRUE to switch to lossless compression.
|
* Set @lossless %TRUE to switch to lossless compression.
|
||||||
*
|
*
|
||||||
|
* Use @compression to set the encoder e.g. HEVC, AVC, AV1
|
||||||
|
*
|
||||||
* See also: vips_image_write_to_file(), vips_heifload().
|
* See also: vips_image_write_to_file(), vips_heifload().
|
||||||
*
|
*
|
||||||
* Returns: 0 on success, -1 on error.
|
* Returns: 0 on success, -1 on error.
|
||||||
@ -616,6 +635,7 @@ vips_heifsave( VipsImage *in, const char *filename, ... )
|
|||||||
*
|
*
|
||||||
* * @Q: %gint, quality factor
|
* * @Q: %gint, quality factor
|
||||||
* * @lossless: %gboolean, enable lossless encoding
|
* * @lossless: %gboolean, enable lossless encoding
|
||||||
|
* * @compression: use this #VipsForeignHeifCompression
|
||||||
*
|
*
|
||||||
* As vips_heifsave(), but save to a memory buffer.
|
* As vips_heifsave(), but save to a memory buffer.
|
||||||
*
|
*
|
||||||
|
@ -74,6 +74,8 @@ GType vips_foreign_dz_depth_get_type (void) G_GNUC_CONST;
|
|||||||
#define VIPS_TYPE_FOREIGN_DZ_DEPTH (vips_foreign_dz_depth_get_type())
|
#define VIPS_TYPE_FOREIGN_DZ_DEPTH (vips_foreign_dz_depth_get_type())
|
||||||
GType vips_foreign_dz_container_get_type (void) G_GNUC_CONST;
|
GType vips_foreign_dz_container_get_type (void) G_GNUC_CONST;
|
||||||
#define VIPS_TYPE_FOREIGN_DZ_CONTAINER (vips_foreign_dz_container_get_type())
|
#define VIPS_TYPE_FOREIGN_DZ_CONTAINER (vips_foreign_dz_container_get_type())
|
||||||
|
GType vips_foreign_heif_compression_get_type (void) G_GNUC_CONST;
|
||||||
|
#define VIPS_TYPE_FOREIGN_HEIF_COMPRESSION (vips_foreign_heif_compression_get_type())
|
||||||
/* enumerations from "../../../libvips/include/vips/image.h" */
|
/* enumerations from "../../../libvips/include/vips/image.h" */
|
||||||
GType vips_demand_style_get_type (void) G_GNUC_CONST;
|
GType vips_demand_style_get_type (void) G_GNUC_CONST;
|
||||||
#define VIPS_TYPE_DEMAND_STYLE (vips_demand_style_get_type())
|
#define VIPS_TYPE_DEMAND_STYLE (vips_demand_style_get_type())
|
||||||
|
@ -623,6 +623,23 @@ typedef enum {
|
|||||||
int vips_dzsave( VipsImage *in, const char *name, ... )
|
int vips_dzsave( VipsImage *in, const char *name, ... )
|
||||||
__attribute__((sentinel));
|
__attribute__((sentinel));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VipsForeignHeifCompression:
|
||||||
|
* @VIPS_FOREIGN_HEIF_COMPRESSION_HEVC: x265
|
||||||
|
* @VIPS_FOREIGN_HEIF_COMPRESSION_AVC: x264
|
||||||
|
* @VIPS_FOREIGN_HEIF_COMPRESSION_JPEG: jpeg
|
||||||
|
* @VIPS_FOREIGN_HEIF_COMPRESSION_AV1: aom
|
||||||
|
*
|
||||||
|
* The compression format to use inside a HEIF container.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
VIPS_FOREIGN_HEIF_COMPRESSION_HEVC = 1,
|
||||||
|
VIPS_FOREIGN_HEIF_COMPRESSION_AVC = 2,
|
||||||
|
VIPS_FOREIGN_HEIF_COMPRESSION_JPEG = 3,
|
||||||
|
VIPS_FOREIGN_HEIF_COMPRESSION_AV1 = 4,
|
||||||
|
VIPS_FOREIGN_HEIF_COMPRESSION_LAST
|
||||||
|
} VipsForeignHeifCompression;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /*__cplusplus*/
|
#endif /*__cplusplus*/
|
||||||
|
@ -657,6 +657,26 @@ vips_foreign_dz_container_get_type( void )
|
|||||||
|
|
||||||
return( etype );
|
return( etype );
|
||||||
}
|
}
|
||||||
|
GType
|
||||||
|
vips_foreign_heif_compression_get_type( void )
|
||||||
|
{
|
||||||
|
static GType etype = 0;
|
||||||
|
|
||||||
|
if( etype == 0 ) {
|
||||||
|
static const GEnumValue values[] = {
|
||||||
|
{VIPS_FOREIGN_HEIF_COMPRESSION_HEVC, "VIPS_FOREIGN_HEIF_COMPRESSION_HEVC", "hevc"},
|
||||||
|
{VIPS_FOREIGN_HEIF_COMPRESSION_AVC, "VIPS_FOREIGN_HEIF_COMPRESSION_AVC", "avc"},
|
||||||
|
{VIPS_FOREIGN_HEIF_COMPRESSION_JPEG, "VIPS_FOREIGN_HEIF_COMPRESSION_JPEG", "jpeg"},
|
||||||
|
{VIPS_FOREIGN_HEIF_COMPRESSION_AV1, "VIPS_FOREIGN_HEIF_COMPRESSION_AV1", "av1"},
|
||||||
|
{VIPS_FOREIGN_HEIF_COMPRESSION_LAST, "VIPS_FOREIGN_HEIF_COMPRESSION_LAST", "last"},
|
||||||
|
{0, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
etype = g_enum_register_static( "VipsForeignHeifCompression", values );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( etype );
|
||||||
|
}
|
||||||
/* enumerations from "../../libvips/include/vips/image.h" */
|
/* enumerations from "../../libvips/include/vips/image.h" */
|
||||||
GType
|
GType
|
||||||
vips_demand_style_get_type( void )
|
vips_demand_style_get_type( void )
|
||||||
|
Loading…
Reference in New Issue
Block a user