⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpegvideo.c

📁 arm平台下的H264编码和解码源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
    }        if (s->h263_pred || s->h263_plus || !s->encoding) {        /* dc values */        //MN: we need these for error resilience of intra-frames        CHECKED_ALLOCZ(s->dc_val_base, yc_size * sizeof(int16_t));        s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;        s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;        s->dc_val[2] = s->dc_val[1] + c_size;        for(i=0;i<yc_size;i++)            s->dc_val_base[i] = 1024;    }    /* which mb is a intra block */    CHECKED_ALLOCZ(s->mbintra_table, mb_array_size);    memset(s->mbintra_table, 1, mb_array_size);        /* init macroblock skip table */    CHECKED_ALLOCZ(s->mbskip_table, mb_array_size+2);    //Note the +1 is for a quicker mpeg4 slice_end detection    CHECKED_ALLOCZ(s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);        s->parse_context.state= -1;    if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){       s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);       s->visualization_buffer[1] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);       s->visualization_buffer[2] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);    }    s->context_initialized = 1;    s->thread_context[0]= s;    for(i=1; i<s->avctx->thread_count; i++){        s->thread_context[i]= av_malloc(sizeof(MpegEncContext));        memcpy(s->thread_context[i], s, sizeof(MpegEncContext));    }    for(i=0; i<s->avctx->thread_count; i++){        if(init_duplicate_context(s->thread_context[i], s) < 0)           goto fail;        s->thread_context[i]->start_mb_y= (s->mb_height*(i  ) + s->avctx->thread_count/2) / s->avctx->thread_count;        s->thread_context[i]->end_mb_y  = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;    }    return 0; fail:    MPV_common_end(s);    return -1;}/* init common structure for both encoder and decoder */void MPV_common_end(MpegEncContext *s){    int i, j, k;    for(i=0; i<s->avctx->thread_count; i++){        free_duplicate_context(s->thread_context[i]);    }    for(i=1; i<s->avctx->thread_count; i++){        av_freep(&s->thread_context[i]);    }    av_freep(&s->parse_context.buffer);    s->parse_context.buffer_size=0;    av_freep(&s->mb_type);    av_freep(&s->p_mv_table_base);    av_freep(&s->b_forw_mv_table_base);    av_freep(&s->b_back_mv_table_base);    av_freep(&s->b_bidir_forw_mv_table_base);    av_freep(&s->b_bidir_back_mv_table_base);    av_freep(&s->b_direct_mv_table_base);    s->p_mv_table= NULL;    s->b_forw_mv_table= NULL;    s->b_back_mv_table= NULL;    s->b_bidir_forw_mv_table= NULL;    s->b_bidir_back_mv_table= NULL;    s->b_direct_mv_table= NULL;    for(i=0; i<2; i++){        for(j=0; j<2; j++){            for(k=0; k<2; k++){                av_freep(&s->b_field_mv_table_base[i][j][k]);                s->b_field_mv_table[i][j][k]=NULL;            }            av_freep(&s->b_field_select_table[i][j]);            av_freep(&s->p_field_mv_table_base[i][j]);            s->p_field_mv_table[i][j]=NULL;        }        av_freep(&s->p_field_select_table[i]);    }        av_freep(&s->dc_val_base);    av_freep(&s->ac_val_base);    av_freep(&s->coded_block_base);    av_freep(&s->mbintra_table);    av_freep(&s->cbp_table);    av_freep(&s->pred_dir_table);        av_freep(&s->mbskip_table);    av_freep(&s->prev_pict_types);    av_freep(&s->bitstream_buffer);    av_freep(&s->avctx->stats_out);    av_freep(&s->ac_stats);    av_freep(&s->error_status_table);    av_freep(&s->mb_index2xy);    av_freep(&s->lambda_table);    av_freep(&s->q_intra_matrix);    av_freep(&s->q_inter_matrix);    av_freep(&s->q_intra_matrix16);    av_freep(&s->q_inter_matrix16);    av_freep(&s->input_picture);    av_freep(&s->reordered_input_picture);    av_freep(&s->dct_offset);    if(s->picture){        for(i=0; i<MAX_PICTURE_COUNT; i++){            free_picture(s, &s->picture[i]);        }    }    av_freep(&s->picture);    avcodec_default_free_buffers(s->avctx);    s->context_initialized = 0;    s->last_picture_ptr=    s->next_picture_ptr=    s->current_picture_ptr= NULL;    for(i=0; i<3; i++)        av_freep(&s->visualization_buffer[i]);}#ifdef CONFIG_ENCODERS/* init video encoder */int MPV_encode_init(AVCodecContext *avctx){    MpegEncContext *s = avctx->priv_data;    int i, dummy;    int chroma_h_shift, chroma_v_shift;        MPV_encode_defaults(s);    avctx->pix_fmt = PIX_FMT_YUV420P; // FIXME    s->bit_rate = avctx->bit_rate;    s->width = avctx->width;    s->height = avctx->height;    if(avctx->gop_size > 600){	av_log(avctx, AV_LOG_ERROR, "Warning keyframe interval too large! reducing it ...\n");        avctx->gop_size=600;    }    s->gop_size = avctx->gop_size;    s->avctx = avctx;    s->flags= avctx->flags;    s->flags2= avctx->flags2;    s->max_b_frames= avctx->max_b_frames;    s->codec_id= avctx->codec->id;    s->luma_elim_threshold  = avctx->luma_elim_threshold;    s->chroma_elim_threshold= avctx->chroma_elim_threshold;    s->strict_std_compliance= avctx->strict_std_compliance;    s->data_partitioning= avctx->flags & CODEC_FLAG_PART;    s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;    s->mpeg_quant= avctx->mpeg_quant;    s->rtp_mode= !!avctx->rtp_payload_size;    if (s->gop_size <= 1) {        s->intra_only = 1;        s->gop_size = 12;    } else {        s->intra_only = 0;    }    s->me_method = avctx->me_method;    /* Fixed QSCALE */    s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);        s->adaptive_quant= (   s->avctx->lumi_masking                        || s->avctx->dark_masking                        || s->avctx->temporal_cplx_masking                         || s->avctx->spatial_cplx_masking                        || s->avctx->p_masking                        || (s->flags&CODEC_FLAG_QP_RD))                       && !s->fixed_qscale;        s->obmc= !!(s->flags & CODEC_FLAG_OBMC);    s->loop_filter= !!(s->flags & CODEC_FLAG_LOOP_FILTER);    s->alternate_scan= !!(s->flags & CODEC_FLAG_ALT_SCAN);    if(avctx->rc_max_rate && !avctx->rc_buffer_size){        av_log(avctx, AV_LOG_ERROR, "a vbv buffer size is needed, for encoding with a maximum bitrate\n");        return -1;    }        if(avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate){        av_log(avctx, AV_LOG_INFO, "Warning min_rate > 0 but min_rate != max_rate isnt recommanded!\n");    }        if(   s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate        && (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO)       && 90000LL * (avctx->rc_buffer_size-1) > s->avctx->rc_max_rate*0xFFFFLL){                av_log(avctx, AV_LOG_INFO, "Warning vbv_delay will be set to 0xFFFF (=VBR) as the specified vbv buffer is too large for the given bitrate!\n");    }           if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4        && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P && s->codec_id != CODEC_ID_FLV1){        av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");        return -1;    }            if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){        av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decission\n");        return -1;    }        if(s->obmc && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){        av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with H263(+)\n");        return -1;    }        if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){        av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");        return -1;    }    if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){        av_log(avctx, AV_LOG_ERROR, "data partitioning not supported by codec\n");        return -1;    }        if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){        av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");        return -1;    }        if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too        av_log(avctx, AV_LOG_ERROR, "mpeg2 style quantization not supporetd by codec\n");        return -1;    }            if((s->flags & CODEC_FLAG_CBP_RD) && !(s->flags & CODEC_FLAG_TRELLIS_QUANT)){        av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");        return -1;    }    if((s->flags & CODEC_FLAG_QP_RD) && s->avctx->mb_decision != FF_MB_DECISION_RD){        av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");        return -1;    }        if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){        av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet\n");        return -1;    }        if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4        && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO        && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){        av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n");        return -1;    }        if(s->avctx->thread_count > MAX_THREADS || 16*s->avctx->thread_count > s->height){        av_log(avctx, AV_LOG_ERROR, "too many threads\n");        return -1;    }        if(s->avctx->thread_count > 1)        s->rtp_mode= 1;    i= ff_gcd(avctx->frame_rate, avctx->frame_rate_base);    if(i > 1){        av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");        avctx->frame_rate /= i;        avctx->frame_rate_base /= i;//        return -1;    }        if(s->codec_id==CODEC_ID_MJPEG){        s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x        s->inter_quant_bias= 0;    }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){        s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x        s->inter_quant_bias= 0;    }else{        s->intra_quant_bias=0;        s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x    }        if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)        s->intra_quant_bias= avctx->intra_quant_bias;    if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)        s->inter_quant_bias= avctx->inter_quant_bias;            avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);    av_reduce(&s->time_increment_resolution, &dummy, s->avctx->frame_rate, s->avctx->frame_rate_base, (1<<16)-1);    s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;    switch(avctx->codec->id) {    case CODEC_ID_MPEG1VIDEO:        s->out_format = FMT_MPEG1;        s->low_delay= 0; //s->max_b_frames ? 0 : 1;        avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);        break;    case CODEC_ID_MPEG2VIDEO:        s->out_format = FMT_MPEG1;        s->low_delay= 0; //s->max_b_frames ? 0 : 1;        avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);        s->rtp_mode= 1;        break;    case CODEC_ID_LJPEG:    case CODEC_ID_MJPEG:        s->out_format = FMT_MJPEG;        s->intra_only = 1; /* force intra only for jpeg */        s->mjpeg_write_tables = 1; /* write all tables */	s->mjpeg_data_only_frames = 0; /* write all the needed headers */        s->mjpeg_vsample[0] = 1<<chroma_v_shift;        s->mjpeg_vsample[1] = 1;        s->mjpeg_vsample[2] = 1;         s->mjpeg_hsample[0] = 1<<chroma_h_shift;        s->mjpeg_hsample[1] = 1;         s->mjpeg_hsample[2] = 1;         if (mjpeg_init(s) < 0)            return -1;        avctx->delay=0;        s->low_delay=1;        break;#ifdef CONFIG_RISKY    case CODEC_ID_H263:        if (h263_get_picture_format(s->width, s->height) == 7) {            av_log(avctx, AV_LOG_INFO, "Input picture size isn't suitable for h263 codec! try h263+\n");            return -1;        }        s->out_format = FMT_H263;	s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;        avctx->delay=0;        s->low_delay=1;        break;    case CODEC_ID_H263P:        s->out_format = FMT_H263;        s->h263_plus = 1;	/* Fx */        s->umvplus = (avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;	s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0;	s->modified_quant= s->h263_aic;	s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0;	s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;	s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0;	s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;        s->h263_slice_structured= (s->flags & CODEC_FLAG_H263P_SLICE_STRUCT) ? 1:0;	/* /Fx */        /* These are just to be sure */        avctx->delay=0;        s->low_delay=1;

⌨️ 快捷键说明

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