X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Fdirac.c;h=ef0ad318aa2215d13f9fe21f2c7ac28e1a2eb00d;hb=19a50f5df315c583d84712be7c724ba3ab587c1c;hp=b7a300e4a985d0292f8e1b962b270f95312491f3;hpb=1c76d96f74fe8703a5bae8ae36b8a9e01d3f9996;p=vlc diff --git a/modules/codec/dirac.c b/modules/codec/dirac.c index b7a300e4a9..ef0ad318aa 100644 --- a/modules/codec/dirac.c +++ b/modules/codec/dirac.c @@ -35,12 +35,12 @@ #endif #include +#include #include #include #include #include -#include #include @@ -103,13 +103,13 @@ static const char *const enc_chromafmt_list_text[] = #define ENC_CODINGMODE "coding-mode" #define ENC_CODINGMODE_TEXT N_("Picture coding mode") #define ENC_CODINGMODE_LONGTEXT N_("Field coding is where interlaced fields are coded" \ - " seperately as opposed to a pseudo-progressive frame") + " separately as opposed to a pseudo-progressive frame") static const char *const enc_codingmode_list[] = { "auto", "progressive", "field" }; static const char *const enc_codingmode_list_text[] = { N_("auto - let encoder decide based upon input (Best)"), N_("force coding frame as single picture"), - N_("force coding frame as seperate interlaced fields"), + N_("force coding frame as separate interlaced fields"), }; #define ENC_MCBLK_WIDTH "mc-blk-width" @@ -204,109 +204,108 @@ vlc_module_begin() set_category( CAT_INPUT ) set_subcategory( SUBCAT_INPUT_VCODEC ) set_description( N_("Dirac video encoder using dirac-research library") ) + set_shortname( "Dirac" ) set_capability( "encoder", 100 ) set_callbacks( OpenEncoder, CloseEncoder ) add_float( ENC_CFG_PREFIX ENC_QUALITY_FACTOR, 5.5, NULL, - ENC_QUALITY_FACTOR_TEXT, ENC_QUALITY_FACTOR_LONGTEXT, false ); + ENC_QUALITY_FACTOR_TEXT, ENC_QUALITY_FACTOR_LONGTEXT, false ) change_float_range(0., 10.); add_integer( ENC_CFG_PREFIX ENC_TARGETRATE, -1, NULL, - ENC_TARGETRATE_TEXT, ENC_TARGETRATE_LONGTEXT, false ); + ENC_TARGETRATE_TEXT, ENC_TARGETRATE_LONGTEXT, false ) change_integer_range(-1, INT_MAX); add_bool( ENC_CFG_PREFIX ENC_LOSSLESS, false, NULL, - ENC_LOSSLESS_TEXT, ENC_LOSSLESS_LONGTEXT, false ); + ENC_LOSSLESS_TEXT, ENC_LOSSLESS_LONGTEXT, false ) add_string( ENC_CFG_PREFIX ENC_PREFILTER, "diaglp", NULL, - ENC_PREFILTER_TEXT, ENC_PREFILTER_LONGTEXT, false ); + ENC_PREFILTER_TEXT, ENC_PREFILTER_LONGTEXT, false ) change_string_list( enc_prefilter_list, enc_prefilter_list_text, 0 ); add_integer( ENC_CFG_PREFIX ENC_PREFILTER_STRENGTH, 1, NULL, - ENC_PREFILTER_STRENGTH_TEXT, ENC_PREFILTER_STRENGTH_LONGTEXT, false ); + ENC_PREFILTER_STRENGTH_TEXT, ENC_PREFILTER_STRENGTH_LONGTEXT, false ) change_integer_range(0, 10); add_string( ENC_CFG_PREFIX ENC_CHROMAFMT, "420", NULL, - ENC_CHROMAFMT_TEXT, ENC_CHROMAFMT_LONGTEXT, false ); + ENC_CHROMAFMT_TEXT, ENC_CHROMAFMT_LONGTEXT, false ) change_string_list( enc_chromafmt_list, enc_chromafmt_list_text, 0 ); add_integer( ENC_CFG_PREFIX ENC_L1SEP, -1, NULL, - ENC_L1SEP_TEXT, ENC_L1SEP_LONGTEXT, false ); + ENC_L1SEP_TEXT, ENC_L1SEP_LONGTEXT, false ) change_integer_range(-1, INT_MAX); add_integer( ENC_CFG_PREFIX ENC_L1NUM, -1, NULL, - ENC_L1NUM_TEXT, ENC_L1NUM_LONGTEXT, false ); + ENC_L1NUM_TEXT, ENC_L1NUM_LONGTEXT, false ) change_integer_range(-1, INT_MAX); add_string( ENC_CFG_PREFIX ENC_CODINGMODE, "auto", NULL, - ENC_CODINGMODE_TEXT, ENC_CODINGMODE_LONGTEXT, false ); + ENC_CODINGMODE_TEXT, ENC_CODINGMODE_LONGTEXT, false ) change_string_list( enc_codingmode_list, enc_codingmode_list_text, 0 ); add_string( ENC_CFG_PREFIX ENC_MVPREC, "1/2", NULL, - ENC_MVPREC_TEXT, ENC_MVPREC_LONGTEXT, false ); + ENC_MVPREC_TEXT, ENC_MVPREC_LONGTEXT, false ) change_string_list( enc_mvprec_list, enc_mvprec_list, 0 ); add_integer( ENC_CFG_PREFIX ENC_MCBLK_WIDTH, -1, NULL, - ENC_MCBLK_WIDTH_TEXT, ENC_MCBLK_WIDTH_LONGTEXT, false ); - add_deprecated_alias( ENC_CFG_PREFIX ENC_MCBLK_XBLEN ); + ENC_MCBLK_WIDTH_TEXT, ENC_MCBLK_WIDTH_LONGTEXT, false ) change_integer_range(-1, INT_MAX); add_integer( ENC_CFG_PREFIX ENC_MCBLK_HEIGHT, -1, NULL, - ENC_MCBLK_HEIGHT, ENC_MCBLK_HEIGHT_LONGTEXT, false ); - add_deprecated_alias( ENC_CFG_PREFIX ENC_MCBLK_YBLEN ); + ENC_MCBLK_HEIGHT, ENC_MCBLK_HEIGHT_LONGTEXT, false ) change_integer_range(-1, INT_MAX); add_integer( ENC_CFG_PREFIX ENC_MCBLK_OVERLAP, -1, NULL, - ENC_MCBLK_OVERLAP_TEXT, ENC_MCBLK_OVERLAP_LONGTEXT, false ); + ENC_MCBLK_OVERLAP_TEXT, ENC_MCBLK_OVERLAP_LONGTEXT, false ) change_integer_range(-1, 100); /* advanced option only */ add_integer( ENC_CFG_PREFIX ENC_MCBLK_XBLEN, -1, NULL, - ENC_MCBLK_XBLEN_TEXT, ENC_MCBLK_XBLEN_LONGTEXT, true ); + ENC_MCBLK_XBLEN_TEXT, ENC_MCBLK_XBLEN_LONGTEXT, true ) change_integer_range(-1, INT_MAX); /* advanced option only */ add_integer( ENC_CFG_PREFIX ENC_MCBLK_YBLEN, -1, NULL, - ENC_MCBLK_YBLEN_TEXT, ENC_MCBLK_YBLEN_LONGTEXT, true ); + ENC_MCBLK_YBLEN_TEXT, ENC_MCBLK_YBLEN_LONGTEXT, true ) change_integer_range(-1, INT_MAX); add_string( ENC_CFG_PREFIX ENC_ME_SIMPLESEARCH, "", NULL, - ENC_ME_SIMPLESEARCH_TEXT, ENC_ME_SIMPLESEARCH_LONGTEXT, false ); + ENC_ME_SIMPLESEARCH_TEXT, ENC_ME_SIMPLESEARCH_LONGTEXT, false ) #if DIRAC_RESEARCH_VERSION_ATLEAST(1,0,1) add_bool( ENC_CFG_PREFIX ENC_ME_COMBINED, true, NULL, - ENC_ME_COMBINED_TEXT, ENC_ME_COMBINED_LONGTEXT, false ); + ENC_ME_COMBINED_TEXT, ENC_ME_COMBINED_LONGTEXT, false ) #endif add_integer( ENC_CFG_PREFIX ENC_DWTINTRA, -1, NULL, - ENC_DWTINTRA_TEXT, ENC_DWTINTRA_LONGTEXT, false ); + ENC_DWTINTRA_TEXT, ENC_DWTINTRA_LONGTEXT, false ) change_integer_range(-1, 6); add_integer( ENC_CFG_PREFIX ENC_DWTINTER, -1, NULL, - ENC_DWTINTER_TEXT, ENC_DWTINTER_LONGTEXT, false ); + ENC_DWTINTER_TEXT, ENC_DWTINTER_LONGTEXT, false ) change_integer_range(-1, 6); add_integer( ENC_CFG_PREFIX ENC_DWTDEPTH, -1, NULL, - ENC_DWTDEPTH_TEXT, ENC_DWTDEPTH_LONGTEXT, false ); + ENC_DWTDEPTH_TEXT, ENC_DWTDEPTH_LONGTEXT, false ) change_integer_range(-1, 4); /* advanced option only */ /* NB, unforunately vlc doesn't have a concept of 'dont care' */ add_integer( ENC_CFG_PREFIX ENC_MULTIQUANT, -1, NULL, - ENC_MULTIQUANT_TEXT, ENC_MULTIQUANT_LONGTEXT, true ); + ENC_MULTIQUANT_TEXT, ENC_MULTIQUANT_LONGTEXT, true ) change_integer_range(-1, 1); /* advanced option only */ /* NB, unforunately vlc doesn't have a concept of 'dont care' */ add_integer( ENC_CFG_PREFIX ENC_SPARTITION, -1, NULL, - ENC_SPARTITION_TEXT, ENC_SPARTITION_LONGTEXT, true ); + ENC_SPARTITION_TEXT, ENC_SPARTITION_LONGTEXT, true ) change_integer_range(-1, 1); add_bool( ENC_CFG_PREFIX ENC_NOAC, false, NULL, - ENC_NOAC_TEXT, ENC_NOAC_LONGTEXT, false ); + ENC_NOAC_TEXT, ENC_NOAC_LONGTEXT, false ) /* advanced option only */ add_float( ENC_CFG_PREFIX ENC_CPD, -1, NULL, - ENC_CPD_TEXT, ENC_CPD_LONGTEXT, true ); + ENC_CPD_TEXT, ENC_CPD_LONGTEXT, true ) change_integer_range(-1, INT_MAX); vlc_module_end() @@ -442,7 +441,7 @@ static int OpenEncoder( vlc_object_t *p_this ) float f_tmp; char *psz_tmp; - if( p_enc->fmt_out.i_codec != VLC_FOURCC('d','r','a','c') && + if( p_enc->fmt_out.i_codec != VLC_CODEC_DIRAC && !p_enc->b_force ) { return VLC_EGENERIC; @@ -461,7 +460,7 @@ static int OpenEncoder( vlc_object_t *p_this ) p_enc->p_sys = p_sys; p_enc->pf_encode_video = Encode; - p_enc->fmt_out.i_codec = VLC_FOURCC('d','r','a','c'); + p_enc->fmt_out.i_codec = VLC_CODEC_DIRAC; p_enc->fmt_out.i_cat = VIDEO_ES; if( ( p_sys->p_dts_fifo = block_FifoNew() ) == NULL ) @@ -506,9 +505,8 @@ static int OpenEncoder( vlc_object_t *p_this ) p_sys->ctx.src_params.frame_rate.denominator = p_enc->fmt_in.video.i_frame_rate_base; unsigned u_asr_num, u_asr_den; vlc_ureduce( &u_asr_num, &u_asr_den, - p_enc->fmt_in.video.i_height * p_enc->fmt_in.video.i_aspect, - p_enc->fmt_in.video.i_width * VOUT_ASPECT_FACTOR, - 0 ); + p_enc->fmt_in.video.i_sar_num, + p_enc->fmt_in.video.i_sar_den, 0 ); p_sys->ctx.src_params.pix_asr.numerator = u_asr_num; p_sys->ctx.src_params.pix_asr.denominator = u_asr_den; @@ -518,19 +516,19 @@ static int OpenEncoder( vlc_object_t *p_this ) if( !psz_tmp ) goto error; else if( !strcmp( psz_tmp, "420" ) ) { - p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0'); + p_enc->fmt_in.i_codec = VLC_CODEC_I420; p_enc->fmt_in.video.i_bits_per_pixel = 12; p_sys->ctx.src_params.chroma = format420; p_sys->i_buffer_in = p_enc->fmt_in.video.i_width * p_enc->fmt_in.video.i_height * 3 / 2; } else if( !strcmp( psz_tmp, "422" ) ) { - p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','2'); + p_enc->fmt_in.i_codec = VLC_CODEC_I422; p_enc->fmt_in.video.i_bits_per_pixel = 16; p_sys->ctx.src_params.chroma = format422; p_sys->i_buffer_in = p_enc->fmt_in.video.i_width * p_enc->fmt_in.video.i_height * 2; } else if( !strcmp( psz_tmp, "444" ) ) { - p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','4','4'); + p_enc->fmt_in.i_codec = VLC_CODEC_I444; p_enc->fmt_in.video.i_bits_per_pixel = 24; p_sys->ctx.src_params.chroma = format444; p_sys->i_buffer_in = p_enc->fmt_in.video.i_width * p_enc->fmt_in.video.i_height * 3; @@ -783,6 +781,7 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pic ) int i_plane, i_line, i_width, i_src_stride; uint8_t *p_dst; + if( !p_pic ) return NULL; /* we only know if the sequence is interlaced when the first * picture arrives, so final setup is done here */ /* XXX todo, detect change of interlace */ @@ -799,13 +798,12 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pic ) p_sys->p_dirac = dirac_encoder_init( &p_sys->ctx, 0 ); if( !p_sys->p_dirac ) { - msg_Err( p_enc, "Failed to initialize dirac encoder\n" ); - p_enc->b_error = 1; + msg_Err( p_enc, "Failed to initialize dirac encoder" ); return NULL; } date_Init( &date, p_enc->fmt_in.video.i_frame_rate, p_enc->fmt_in.video.i_frame_rate_base ); #if DIRAC_RESEARCH_VERSION_ATLEAST(1,0,2) - int i_delayinpics = dirac_encoder_ptsoffset( p_sys->p_dirac ); + int i_delayinpics = dirac_encoder_pts_offset( p_sys->p_dirac ); i_delayinpics /= p_sys->ctx.enc_params.picture_coding_mode + 1; date_Increment( &date, i_delayinpics ); #else @@ -859,10 +857,7 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pic ) * coded order */ p_block = block_New( p_enc, 1 ); if( !p_block ) - { - p_enc->b_error = 1; return NULL; - } p_block->i_dts = p_pic->date - p_sys->i_pts_offset; block_FifoPut( p_sys->p_dts_fifo, p_block ); p_block = NULL; @@ -877,10 +872,7 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pic ) p_block = block_New( p_enc, 1 ); if( !p_block ) - { - p_enc->b_error = 1; return NULL; - } p_block->i_dts = p_pic->date - p_sys->i_pts_offset + p_sys->i_field_time; block_FifoPut( p_sys->p_dts_fifo, p_block ); p_block = NULL; @@ -901,10 +893,7 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pic ) /* extract data from encoder temporary buffer. */ p_block = block_New( p_enc, p_sys->p_dirac->enc_buf.size ); if( !p_block ) - { - p_enc->b_error = 1; return NULL; - } memcpy( p_block->p_buffer, p_sys->p_dirac->enc_buf.buffer, p_sys->p_dirac->enc_buf.size ); @@ -933,10 +922,7 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pic ) /* XXX, should this be done using the packetizer ? */ p_enc->fmt_out.p_extra = malloc( len + sizeof(eos) ); if( !p_enc->fmt_out.p_extra ) - { - p_enc->b_error = 1; return NULL; - } memcpy( p_enc->fmt_out.p_extra, p_block->p_buffer, len); memcpy( (uint8_t*)p_enc->fmt_out.p_extra + len, eos, sizeof(eos) ); SetDWBE( (uint8_t*)p_enc->fmt_out.p_extra + len + 10, len );