ve_lavc.c

来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 1,050 行 · 第 1/3 页

C
1,050
字号
    mux_v->avg_rate= lavc_venc_context->bit_rate;    lavc_venc_context->bit_rate_tolerance= lavc_param_vrate_tolerance*1000;    lavc_venc_context->time_base= (AVRational){mux_v->h.dwScale, mux_v->h.dwRate};    lavc_venc_context->qmin= lavc_param_vqmin;    lavc_venc_context->qmax= lavc_param_vqmax;    lavc_venc_context->mb_qmin= lavc_param_mb_qmin;    lavc_venc_context->mb_qmax= lavc_param_mb_qmax;    lavc_venc_context->lmin= (int)(FF_QP2LAMBDA * lavc_param_lmin + 0.5);    lavc_venc_context->lmax= (int)(FF_QP2LAMBDA * lavc_param_lmax + 0.5);    lavc_venc_context->mb_lmin= (int)(FF_QP2LAMBDA * lavc_param_mb_lmin + 0.5);    lavc_venc_context->mb_lmax= (int)(FF_QP2LAMBDA * lavc_param_mb_lmax + 0.5);    lavc_venc_context->max_qdiff= lavc_param_vqdiff;    lavc_venc_context->qcompress= lavc_param_vqcompress;    lavc_venc_context->qblur= lavc_param_vqblur;    lavc_venc_context->max_b_frames= lavc_param_vmax_b_frames;    lavc_venc_context->b_quant_factor= lavc_param_vb_qfactor;    lavc_venc_context->rc_strategy= lavc_param_vrc_strategy;    lavc_venc_context->b_frame_strategy= lavc_param_vb_strategy;    lavc_venc_context->b_quant_offset= (int)(FF_QP2LAMBDA * lavc_param_vb_qoffset + 0.5);    lavc_venc_context->luma_elim_threshold= lavc_param_luma_elim_threshold;    lavc_venc_context->chroma_elim_threshold= lavc_param_chroma_elim_threshold;    lavc_venc_context->rtp_payload_size= lavc_param_packet_size;    if(lavc_param_packet_size )lavc_venc_context->rtp_mode=1;    lavc_venc_context->strict_std_compliance= lavc_param_strict;    lavc_venc_context->i_quant_factor= lavc_param_vi_qfactor;    lavc_venc_context->i_quant_offset= (int)(FF_QP2LAMBDA * lavc_param_vi_qoffset + 0.5);    lavc_venc_context->rc_qsquish= lavc_param_rc_qsquish;    lavc_venc_context->rc_qmod_amp= lavc_param_rc_qmod_amp;    lavc_venc_context->rc_qmod_freq= lavc_param_rc_qmod_freq;    lavc_venc_context->rc_eq= lavc_param_rc_eq;    mux_v->max_rate=    lavc_venc_context->rc_max_rate= lavc_param_rc_max_rate*1000;    lavc_venc_context->rc_min_rate= lavc_param_rc_min_rate*1000;    mux_v->vbv_size=    lavc_venc_context->rc_buffer_size= lavc_param_rc_buffer_size*1000;    lavc_venc_context->rc_initial_buffer_occupancy=            lavc_venc_context->rc_buffer_size *            lavc_param_rc_initial_buffer_occupancy;    lavc_venc_context->rc_buffer_aggressivity= lavc_param_rc_buffer_aggressivity;    lavc_venc_context->rc_initial_cplx= lavc_param_rc_initial_cplx;    lavc_venc_context->debug= lavc_param_debug;    lavc_venc_context->last_predictor_count= lavc_param_last_pred;    lavc_venc_context->pre_me= lavc_param_pre_me;    lavc_venc_context->me_pre_cmp= lavc_param_me_pre_cmp;    lavc_venc_context->pre_dia_size= lavc_param_pre_dia_size;    lavc_venc_context->me_subpel_quality= lavc_param_me_subpel_quality;    lavc_venc_context->me_range= lavc_param_me_range;    lavc_venc_context->intra_quant_bias= lavc_param_ibias;    lavc_venc_context->inter_quant_bias= lavc_param_pbias;    lavc_venc_context->coder_type= lavc_param_coder;    lavc_venc_context->context_model= lavc_param_context;    lavc_venc_context->scenechange_threshold= lavc_param_sc_threshold;    lavc_venc_context->noise_reduction= lavc_param_noise_reduction;    lavc_venc_context->quantizer_noise_shaping= lavc_param_qns;    lavc_venc_context->inter_threshold= lavc_param_inter_threshold;    lavc_venc_context->nsse_weight= lavc_param_nssew;    lavc_venc_context->frame_skip_threshold= lavc_param_skip_threshold;    lavc_venc_context->frame_skip_factor= lavc_param_skip_factor;    lavc_venc_context->frame_skip_exp= lavc_param_skip_exp;    lavc_venc_context->frame_skip_cmp= lavc_param_skip_cmp;    if (lavc_param_intra_matrix)    {	char *tmp;	lavc_venc_context->intra_matrix =	    av_malloc(sizeof(*lavc_venc_context->intra_matrix)*64);	i = 0;	while ((tmp = strsep(&lavc_param_intra_matrix, ",")) && (i < 64))	{	    if (!tmp || (tmp && !strlen(tmp)))		break;	    lavc_venc_context->intra_matrix[i++] = atoi(tmp);	}		if (i != 64)	    av_freep(&lavc_venc_context->intra_matrix);	else	    mp_msg(MSGT_MENCODER, MSGL_V, "Using user specified intra matrix\n");    }    if (lavc_param_inter_matrix)    {	char *tmp;	lavc_venc_context->inter_matrix =	    av_malloc(sizeof(*lavc_venc_context->inter_matrix)*64);	i = 0;	while ((tmp = strsep(&lavc_param_inter_matrix, ",")) && (i < 64))	{	    if (!tmp || (tmp && !strlen(tmp)))		break;	    lavc_venc_context->inter_matrix[i++] = atoi(tmp);	}		if (i != 64)	    av_freep(&lavc_venc_context->inter_matrix);	else	    mp_msg(MSGT_MENCODER, MSGL_V, "Using user specified inter matrix\n");    }    p= lavc_param_rc_override_string;    for(i=0; p; i++){        int start, end, q;        int e=sscanf(p, "%d,%d,%d", &start, &end, &q);        if(e!=3){	    mp_msg(MSGT_MENCODER,MSGL_ERR,"error parsing vrc_q\n");            return 0;        }        lavc_venc_context->rc_override=             realloc(lavc_venc_context->rc_override, sizeof(RcOverride)*(i+1));        lavc_venc_context->rc_override[i].start_frame= start;        lavc_venc_context->rc_override[i].end_frame  = end;        if(q>0){            lavc_venc_context->rc_override[i].qscale= q;            lavc_venc_context->rc_override[i].quality_factor= 1.0;        }        else{            lavc_venc_context->rc_override[i].qscale= 0;            lavc_venc_context->rc_override[i].quality_factor= -q/100.0;        }        p= strchr(p, '/');        if(p) p++;    }    lavc_venc_context->rc_override_count=i;    lavc_venc_context->mpeg_quant=lavc_param_mpeg_quant;    lavc_venc_context->dct_algo= lavc_param_fdct;    lavc_venc_context->idct_algo= lavc_param_idct;    lavc_venc_context->lumi_masking= lavc_param_lumi_masking;    lavc_venc_context->temporal_cplx_masking= lavc_param_temporal_cplx_masking;    lavc_venc_context->spatial_cplx_masking= lavc_param_spatial_cplx_masking;    lavc_venc_context->p_masking= lavc_param_p_masking;    lavc_venc_context->dark_masking= lavc_param_dark_masking;        lavc_venc_context->border_masking = lavc_param_border_masking;    if (lavc_param_aspect != NULL)    {	int par_width, par_height, e;	float ratio=0;		e= sscanf (lavc_param_aspect, "%d/%d", &par_width, &par_height);	if(e==2){            if(par_height)                ratio= (float)par_width / (float)par_height;        }else{	    e= sscanf (lavc_param_aspect, "%f", &ratio);	}	if (e && ratio > 0.1 && ratio < 10.0) {	    lavc_venc_context->sample_aspect_ratio= av_d2q(ratio * height / width, 255);	    mp_dbg(MSGT_MENCODER, MSGL_DBG2, "sample_aspect_ratio: %d/%d\n",                 lavc_venc_context->sample_aspect_ratio.num,                lavc_venc_context->sample_aspect_ratio.den);	    mux_v->aspect = ratio;	    mp_dbg(MSGT_MENCODER, MSGL_DBG2, "aspect_ratio: %f\n", ratio);	} else {	    mp_dbg(MSGT_MENCODER, MSGL_ERR, "aspect ratio: cannot parse \"%s\"\n", lavc_param_aspect);	    return 0;	}    }    else if (lavc_param_autoaspect) {	lavc_venc_context->sample_aspect_ratio = av_d2q((float)d_width/d_height*height / width, 255);	mux_v->aspect = (float)d_width/d_height;    }    /* keyframe interval */    if (lavc_param_keyint >= 0) /* != -1 */	lavc_venc_context->gop_size = lavc_param_keyint;    else	lavc_venc_context->gop_size = 250; /* default */    lavc_venc_context->flags = 0;    if (lavc_param_mb_decision)    {	mp_msg(MSGT_MENCODER, MSGL_INFO, MSGTR_MPCODECS_HighQualityEncodingSelected);        lavc_venc_context->mb_decision= lavc_param_mb_decision;    }    lavc_venc_context->me_cmp= lavc_param_me_cmp;    lavc_venc_context->me_sub_cmp= lavc_param_me_sub_cmp;    lavc_venc_context->mb_cmp= lavc_param_mb_cmp;#ifdef FF_CMP_VSAD    lavc_venc_context->ildct_cmp= lavc_param_ildct_cmp;#endif        lavc_venc_context->dia_size= lavc_param_dia_size;    lavc_venc_context->flags|= lavc_param_qpel;    lavc_venc_context->flags|= lavc_param_trell;    lavc_venc_context->flags|= lavc_param_lowdelay;    lavc_venc_context->flags|= lavc_param_bit_exact;    lavc_venc_context->flags|= lavc_param_aic;    lavc_venc_context->flags|= lavc_param_aiv;    lavc_venc_context->flags|= lavc_param_umv;    lavc_venc_context->flags|= lavc_param_obmc;    lavc_venc_context->flags|= lavc_param_loop;    lavc_venc_context->flags|= lavc_param_v4mv ? CODEC_FLAG_4MV : 0;    lavc_venc_context->flags|= lavc_param_data_partitioning;    lavc_venc_context->flags|= lavc_param_cbp;    lavc_venc_context->flags|= lavc_param_mv0;    lavc_venc_context->flags|= lavc_param_qp_rd;    lavc_venc_context->flags|= lavc_param_ss;    lavc_venc_context->flags|= lavc_param_alt;    lavc_venc_context->flags|= lavc_param_ilme;#ifdef CODEC_FLAG_CLOSED_GOP    lavc_venc_context->flags|= lavc_param_closed_gop;#endif        if(lavc_param_gray) lavc_venc_context->flags|= CODEC_FLAG_GRAY;    if(lavc_param_normalize_aqp) lavc_venc_context->flags|= CODEC_FLAG_NORMALIZE_AQP;    if(lavc_param_interlaced_dct) lavc_venc_context->flags|= CODEC_FLAG_INTERLACED_DCT;    lavc_venc_context->flags|= lavc_param_psnr;    lavc_venc_context->intra_dc_precision = lavc_param_dc_precision - 8;    lavc_venc_context->prediction_method= lavc_param_prediction_method;    lavc_venc_context->brd_scale = lavc_param_brd_scale;    lavc_venc_context->bidir_refine = lavc_param_bidir_refine;    lavc_venc_context->scenechange_factor = lavc_param_sc_factor;    if((lavc_param_video_global_header&1)       /*|| (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))*/){        lavc_venc_context->flags |= CODEC_FLAG_GLOBAL_HEADER;    }    if(lavc_param_video_global_header&2){        lavc_venc_context->flags2 |= CODEC_FLAG2_LOCAL_HEADER;    }    lavc_venc_context->mv0_threshold = lavc_param_mv0_threshold;    lavc_venc_context->refs = lavc_param_refs;    lavc_venc_context->b_sensitivity = lavc_param_b_sensitivity;    lavc_venc_context->level = lavc_param_level;    mux_v->imgfmt = lavc_param_format;    switch(lavc_param_format)    {	case IMGFMT_YV12:	    lavc_venc_context->pix_fmt = PIX_FMT_YUV420P;	    break;	case IMGFMT_422P:	    lavc_venc_context->pix_fmt = PIX_FMT_YUV422P;	    break;	case IMGFMT_444P:	    lavc_venc_context->pix_fmt = PIX_FMT_YUV444P;	    break;	case IMGFMT_411P:	    lavc_venc_context->pix_fmt = PIX_FMT_YUV411P;	    break;	case IMGFMT_YVU9:	    lavc_venc_context->pix_fmt = PIX_FMT_YUV410P;	    break;	case IMGFMT_BGR32:	    lavc_venc_context->pix_fmt = PIX_FMT_RGB32;	    break;	default:    	    mp_msg(MSGT_MENCODER,MSGL_ERR,"%s is not a supported format\n", vo_format_name(lavc_param_format));    	    return 0;    }    if(!stats_file) {    /* lavc internal 2pass bitrate control */    switch(lavc_param_vpass){    case 2:    case 3:	lavc_venc_context->flags|= CODEC_FLAG_PASS2; 	stats_file= fopen(passtmpfile, "rb");	if(stats_file==NULL){	    mp_msg(MSGT_MENCODER,MSGL_ERR,"2pass failed: filename=%s\n", passtmpfile);            return 0;	}	fseek(stats_file, 0, SEEK_END);	size= ftell(stats_file);	fseek(stats_file, 0, SEEK_SET);		lavc_venc_context->stats_in= av_malloc(size + 1);	lavc_venc_context->stats_in[size]=0;	if(fread(lavc_venc_context->stats_in, size, 1, stats_file)<1){	    mp_msg(MSGT_MENCODER,MSGL_ERR,"2pass failed: reading from filename=%s\n", passtmpfile);            return 0;	}        	if(lavc_param_vpass == 2)	    break;	else	    fclose(stats_file);	    /* fall through */    case 1: 	lavc_venc_context->flags|= CODEC_FLAG_PASS1; 	stats_file= fopen(passtmpfile, "wb");	if(stats_file==NULL){	    mp_msg(MSGT_MENCODER,MSGL_ERR,"2pass failed: filename=%s\n", passtmpfile);            return 0;	}	if(lavc_param_turbo && (lavc_param_vpass == 1)) {	  /* uses SAD comparison functions instead of other hungrier */	  lavc_venc_context->me_pre_cmp = 0;	  lavc_venc_context->me_cmp = 0;	  lavc_venc_context->me_sub_cmp = 0;	  lavc_venc_context->mb_cmp = 2;	  /* Disables diamond motion estimation */	  lavc_venc_context->pre_dia_size = 0;	  lavc_venc_context->dia_size = 1;	  lavc_venc_context->quantizer_noise_shaping = 0; // qns=0	  lavc_venc_context->noise_reduction = 0; // nr=0	  lavc_venc_context->mb_decision = 0; // mbd=0 ("realtime" encoding)	  lavc_venc_context->flags &= ~CODEC_FLAG_QPEL;	  lavc_venc_context->flags &= ~CODEC_FLAG_4MV;	  lavc_venc_context->flags &= ~CODEC_FLAG_TRELLIS_QUANT;	  lavc_venc_context->flags &= ~CODEC_FLAG_CBP_RD;	  lavc_venc_context->flags &= ~CODEC_FLAG_QP_RD;	  lavc_venc_context->flags &= ~CODEC_FLAG_MV0;	}	break;    }    }    lavc_venc_context->me_method = ME_ZERO+lavc_param_vme;    /* fixed qscale :p */    if (lavc_param_vqscale >= 0.0)    {	mp_msg(MSGT_MENCODER, MSGL_INFO, MSGTR_MPCODECS_UsingConstantQscale, lavc_param_vqscale);	lavc_venc_context->flags |= CODEC_FLAG_QSCALE;        lavc_venc_context->global_quality= 	vf->priv->pic->quality = (int)(FF_QP2LAMBDA * lavc_param_vqscale + 0.5);    }    if(lavc_param_threads > 1)	avcodec_thread_init(lavc_venc_context, lavc_param_threads);    if (avcodec_open(lavc_venc_context, vf->priv->codec) != 0) {	mp_msg(MSGT_MENCODER,MSGL_ERR,MSGTR_CantOpenCodec);	return 0;    }    if (lavc_venc_context->codec->encode == NULL) {	mp_msg(MSGT_MENCODER,MSGL_ERR,"avcodec init failed (ctx->codec->encode == NULL)!\n");	return 0;    }        /* free second pass buffer, its not needed anymore */    av_freep(&lavc_venc_context->stats_in);    if(lavc_venc_context->bits_per_sample)        mux_v->bih->biBitCount= lavc_venc_context->bits_per_sample;    if(lavc_venc_context->extradata_size){

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?