mirror of
https://github.com/videolan/vlc.git
synced 2024-11-27 03:47:46 +08: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.
This commit is contained in:
parent
1a4208f9c8
commit
98a73f61a9
@ -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 );
|
||||
|
@ -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 );
|
||||
|
||||
/**
|
||||
|
@ -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:
|
||||
|
@ -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 )
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
@ -610,7 +609,7 @@ int picture_Export( vlc_object_t *p_obj,
|
||||
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 );
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user