@ -45,14 +45,14 @@ typedef struct {
char * filename ;
uint8_t rgba_map [ 4 ] ;
int pix_step [ 4 ] ; ///< steps per pixel for each plane of the main output
char * dar _str;
AVRational dar ;
char * original_size _str;
int original_w , original_h ;
} AssContext ;
# define OFFSET(x) offsetof(AssContext, x)
static const AVOption ass_options [ ] = {
{ " dar " , " set subtitles display aspect ratio " , OFFSET ( dar _str) , AV_OPT_TYPE_STRING , { . str = " 1.0 " } , CHAR_MIN , CHAR_MAX } ,
{ " original_size " , " set the size of the original video (used to scale fonts) " , OFFSET ( original_size _str) , AV_OPT_TYPE_STRING , { . str = NULL } , CHAR_MIN , CHAR_MAX } ,
{ NULL } ,
} ;
@ -107,10 +107,11 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
return ret ;
}
if ( av_parse_ratio ( & ass - > dar , ass - > dar_str , 100 , 0 , ctx ) < 0 | |
ass - > dar . num < 0 | | ass - > dar . den < = 0 ) {
if ( ass - > original_size_str & &
av_parse_video_size ( & ass - > original_w , & ass - > original_h ,
ass - > original_size_str ) < 0 ) {
av_log ( ctx , AV_LOG_ERROR ,
" Invalid string '%s' or value for display aspect ratio . \n " , ass - > dar _str) ;
" Invalid original size '%s' . \n " , ass - > original_size _str) ;
return AVERROR ( EINVAL ) ;
}
@ -136,8 +137,6 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
}
ass_set_fonts ( ass - > renderer , NULL , NULL , 1 , NULL , 1 ) ;
av_log ( ctx , AV_LOG_INFO , " dar:%f \n " , av_q2d ( ass - > dar ) ) ;
return 0 ;
}
@ -146,7 +145,7 @@ static av_cold void uninit(AVFilterContext *ctx)
AssContext * ass = ctx - > priv ;
av_freep ( & ass - > filename ) ;
av_freep ( & ass - > dar _str) ;
av_freep ( & ass - > original_size _str) ;
if ( ass - > track )
ass_free_track ( ass - > track ) ;
if ( ass - > renderer )
@ -173,8 +172,6 @@ static int config_input(AVFilterLink *inlink)
{
AssContext * ass = inlink - > dst - > priv ;
const AVPixFmtDescriptor * pix_desc = & av_pix_fmt_descriptors [ inlink - > format ] ;
double sar = inlink - > sample_aspect_ratio . num ?
av_q2d ( inlink - > sample_aspect_ratio ) : 1 ;
av_image_fill_max_pixsteps ( ass - > pix_step , NULL , pix_desc ) ;
ff_fill_rgba_map ( ass - > rgba_map , inlink - > format ) ;
@ -183,7 +180,9 @@ static int config_input(AVFilterLink *inlink)
ass - > vsub = pix_desc - > log2_chroma_h ;
ass_set_frame_size ( ass - > renderer , inlink - > w , inlink - > h ) ;
ass_set_aspect_ratio ( ass - > renderer , av_q2d ( ass - > dar ) , sar ) ;
if ( ass - > original_w & & ass - > original_h )
ass_set_aspect_ratio ( ass - > renderer , ( double ) inlink - > w / inlink - > h ,
( double ) ass - > original_w / ass - > original_h ) ;
return 0 ;
}