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

📄 mpegvideo.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 4 页
字号:
    av_freep(&pic->mb_cmp_score);    av_freep(&pic->mbskip_table);    av_freep(&pic->qscale_table);    av_freep(&pic->mb_type_base);    av_freep(&pic->pan_scan);    pic->mb_type= NULL;    for(i=0; i<2; i++){        av_freep(&pic->motion_val[i]);        av_freep(&pic->ref_index[i]);    }        if(pic->type == FF_BUFFER_TYPE_SHARED){        for(i=0; i<4; i++){            pic->base[i]=            pic->data[i]= NULL;        }        pic->type= 0;            }}/* init common structure for both encoder and decoder */int MPV_common_init(MpegEncContext *s){    int y_size, c_size, yc_size, i, mb_array_size, x, y;    dsputil_init(&s->dsp, s->avctx);    DCT_common_init(s);    s->flags= s->avctx->flags;    s->mb_width  = (s->width  + 15) / 16;    s->mb_height = (s->height + 15) / 16;    s->mb_stride = s->mb_width + 1;    mb_array_size= s->mb_height * s->mb_stride;    /* set default edge pos, will be overriden in decode_header if needed */    s->h_edge_pos= s->mb_width*16;    s->v_edge_pos= s->mb_height*16;    s->mb_num = s->mb_width * s->mb_height;        s->block_wrap[0]=    s->block_wrap[1]=    s->block_wrap[2]=    s->block_wrap[3]= s->mb_width*2 + 2;    s->block_wrap[4]=    s->block_wrap[5]= s->mb_width + 2;    y_size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);    c_size = (s->mb_width + 2) * (s->mb_height + 2);    yc_size = y_size + 2 * c_size;    /* convert fourcc to upper case */    s->avctx->codec_tag=   toupper( s->avctx->codec_tag     &0xFF)                                  + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 )                        + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16)                         + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24);    s->avctx->stream_codec_tag=   toupper( s->avctx->stream_codec_tag     &0xFF)                                         + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 )                               + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16)                                + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24);    CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, (s->width+64)*2*17*2); //(width + edge + align)*interlaced*MBsize*tolerance    s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*17;    s->avctx->coded_frame= (AVFrame*)&s->current_picture;    CHECKED_ALLOCZ(s->mb_index2xy, (s->mb_num+1)*sizeof(int)) //error ressilience code looks cleaner with this    for(y=0; y<s->mb_height; y++){        for(x=0; x<s->mb_width; x++){            s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;        }    }    s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?        if (s->encoding) {        int mv_table_size= s->mb_stride * (s->mb_height+2) + 1;        /* Allocate MV tables */        CHECKED_ALLOCZ(s->p_mv_table_base            , mv_table_size * 2 * sizeof(int16_t))        CHECKED_ALLOCZ(s->b_forw_mv_table_base       , mv_table_size * 2 * sizeof(int16_t))        CHECKED_ALLOCZ(s->b_back_mv_table_base       , mv_table_size * 2 * sizeof(int16_t))        CHECKED_ALLOCZ(s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))        CHECKED_ALLOCZ(s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))        CHECKED_ALLOCZ(s->b_direct_mv_table_base     , mv_table_size * 2 * sizeof(int16_t))        s->p_mv_table           = s->p_mv_table_base            + s->mb_stride + 1;        s->b_forw_mv_table      = s->b_forw_mv_table_base       + s->mb_stride + 1;        s->b_back_mv_table      = s->b_back_mv_table_base       + s->mb_stride + 1;        s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;        s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;        s->b_direct_mv_table    = s->b_direct_mv_table_base     + s->mb_stride + 1;        //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()        CHECKED_ALLOCZ(s->me.scratchpad,  s->width*2*16*3*sizeof(uint8_t))                 CHECKED_ALLOCZ(s->me.map      , ME_MAP_SIZE*sizeof(uint32_t))        CHECKED_ALLOCZ(s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t))        if(s->codec_id==CODEC_ID_MPEG4){            CHECKED_ALLOCZ(s->tex_pb_buffer, PB_BUFFER_SIZE);            CHECKED_ALLOCZ(   s->pb2_buffer, PB_BUFFER_SIZE);        }                if(s->msmpeg4_version){            CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));        }        CHECKED_ALLOCZ(s->avctx->stats_out, 256);        /* Allocate MB type table */        CHECKED_ALLOCZ(s->mb_type  , mb_array_size * sizeof(uint8_t)) //needed for encoding                CHECKED_ALLOCZ(s->lambda_table, mb_array_size * sizeof(int))                CHECKED_ALLOCZ(s->q_intra_matrix, 64*32 * sizeof(int))        CHECKED_ALLOCZ(s->q_inter_matrix, 64*32 * sizeof(int))        CHECKED_ALLOCZ(s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t))        CHECKED_ALLOCZ(s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t))        CHECKED_ALLOCZ(s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))        CHECKED_ALLOCZ(s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))                if(s->avctx->noise_reduction){            CHECKED_ALLOCZ(s->dct_error_sum, 2 * 64 * sizeof(int))            CHECKED_ALLOCZ(s->dct_offset, 2 * 64 * sizeof(uint16_t))        }    }    CHECKED_ALLOCZ(s->blocks, 64*6*2 * sizeof(DCTELEM))            CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture))    CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))        if (s->out_format == FMT_H263 || s->encoding) {        int size;        /* MV prediction */        size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);        CHECKED_ALLOCZ(s->motion_val, size * 2 * sizeof(int16_t));    }    if(s->codec_id==CODEC_ID_MPEG4){        /* interlaced direct mode decoding tables */        CHECKED_ALLOCZ(s->field_mv_table, mb_array_size*2*2 * sizeof(int16_t))        CHECKED_ALLOCZ(s->field_select_table, mb_array_size*2* sizeof(int8_t))    }    if (s->out_format == FMT_H263) {        /* ac values */        CHECKED_ALLOCZ(s->ac_val[0], yc_size * sizeof(int16_t) * 16);        s->ac_val[1] = s->ac_val[0] + y_size;        s->ac_val[2] = s->ac_val[1] + c_size;                /* cbp values */        CHECKED_ALLOCZ(s->coded_block, y_size);                /* divx501 bitstream reorder buffer */        CHECKED_ALLOCZ(s->bitstream_buffer, BITSTREAM_BUFFER_SIZE);        /* cbp, ac_pred, pred_dir */        CHECKED_ALLOCZ(s->cbp_table  , mb_array_size * sizeof(uint8_t))        CHECKED_ALLOCZ(s->pred_dir_table, mb_array_size * sizeof(uint8_t))    }        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[0], yc_size * sizeof(int16_t));        s->dc_val[1] = s->dc_val[0] + y_size;        s->dc_val[2] = s->dc_val[1] + c_size;        for(i=0;i<yc_size;i++)            s->dc_val[0][i] = 1024;    }    /* which mb is a intra block */    CHECKED_ALLOCZ(s->mbintra_table, mb_array_size);    memset(s->mbintra_table, 1, mb_array_size);        /* default structure is frame */    s->picture_structure = PICT_FRAME;        /* 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->block= s->blocks[0];    for(i=0;i<12;i++){        s->pblocks[i] = (short *)(&s->block[i]);    }    s->parse_context.state= -1;    s->context_initialized = 1;    return 0; fail:    MPV_common_end(s);    return -1;}//extern int sads;/* init common structure for both encoder and decoder */void MPV_common_end(MpegEncContext *s){    int 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;        av_freep(&s->motion_val);    av_freep(&s->dc_val[0]);    av_freep(&s->ac_val[0]);    av_freep(&s->coded_block);    av_freep(&s->mbintra_table);    av_freep(&s->cbp_table);    av_freep(&s->pred_dir_table);    av_freep(&s->me.scratchpad);    av_freep(&s->me.map);    av_freep(&s->me.score_map);        av_freep(&s->mbskip_table);    av_freep(&s->prev_pict_types);    av_freep(&s->bitstream_buffer);    av_freep(&s->tex_pb_buffer);    av_freep(&s->pb2_buffer);    av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;    av_freep(&s->field_mv_table);    av_freep(&s->field_select_table);    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->blocks);    av_freep(&s->input_picture);    av_freep(&s->reordered_input_picture);    av_freep(&s->dct_error_sum);    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;}#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;    avctx->pix_fmt = PIX_FMT_YUV420P; // FIXME    s->bit_rate = avctx->bit_rate;    s->bit_rate_tolerance = avctx->bit_rate_tolerance;    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->rtp_mode = avctx->rtp_mode;    s->rtp_payload_size = avctx->rtp_payload_size;    if (avctx->rtp_callback)        s->rtp_callback = avctx->rtp_callback;    s->max_qdiff= avctx->max_qdiff;    s->qcompress= avctx->qcompress;    s->qblur= avctx->qblur;    s->avctx = avctx;    s->flags= avctx->flags;    s->max_b_frames= avctx->max_b_frames;    s->b_frame_strategy= avctx->b_frame_strategy;    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;    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->fixed_qscale;        s->progressive_sequence= !(avctx->flags & CODEC_FLAG_INTERLACED_DCT);    if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4){        av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\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;    }

⌨️ 快捷键说明

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