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

📄 mpegvideo.c

📁 tcpmp播放器的flv插件
💻 C
📖 第 1 页 / 共 5 页
字号:
        if(s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])){            av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");            return -1;        }        if(pic->linesize[1] != pic->linesize[2]){            av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride mismatch)\n");            return -1;        }        s->linesize  = pic->linesize[0];        s->uvlinesize= pic->linesize[1];    }        if(pic->qscale_table==NULL){        if (s->encoding) {                    CHECKED_ALLOCZ(pic->mb_var   , mb_array_size * sizeof(int16_t))            CHECKED_ALLOCZ(pic->mc_mb_var, mb_array_size * sizeof(int16_t))            CHECKED_ALLOCZ(pic->mb_mean  , mb_array_size * sizeof(int8_t))        }        CHECKED_ALLOCZ(pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2) //the +2 is for the slice end check        CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t))        CHECKED_ALLOCZ(pic->mb_type_base , big_mb_num    * sizeof(uint32_t))        pic->mb_type= pic->mb_type_base + s->mb_stride+1;        if(s->out_format == FMT_H264){            for(i=0; i<2; i++){                CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b4_array_size+4)  * sizeof(int16_t))                pic->motion_val[i]= pic->motion_val_base[i]+4;                CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))            }            pic->motion_subsample_log2= 2;        }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){            for(i=0; i<2; i++){                CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t))                pic->motion_val[i]= pic->motion_val_base[i]+4;                CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))            }            pic->motion_subsample_log2= 3;        }        if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {            CHECKED_ALLOCZ(pic->dct_coeff, 64 * mb_array_size * sizeof(DCTELEM)*6)        }        pic->qstride= s->mb_stride;        CHECKED_ALLOCZ(pic->pan_scan , 1 * sizeof(AVPanScan))    }    //it might be nicer if the application would keep track of these but it would require a API change    memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);    s->prev_pict_types[0]= s->pict_type;    if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == B_TYPE)        pic->age= INT_MAX; // skipped MBs in b frames are quite rare in mpeg1/2 and its a bit tricky to skip them anyway        return 0;fail: //for the CHECKED_ALLOCZ macro    return -1;}/** * deallocates a picture */static void free_picture(MpegEncContext *s, Picture *pic){    int i;    if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){        s->avctx->release_buffer(s->avctx, (AVFrame*)pic);    }    av_freep(&pic->mb_var);    av_freep(&pic->mc_mb_var);    av_freep(&pic->mb_mean);    av_freep(&pic->mbskip_table);    av_freep(&pic->qscale_table);    av_freep(&pic->mb_type_base);    av_freep(&pic->dct_coeff);    av_freep(&pic->pan_scan);    pic->mb_type= NULL;    for(i=0; i<2; i++){        av_freep(&pic->motion_val_base[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;            }}static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){    int i;    // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)     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;     //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()    CHECKED_ALLOCZ(s->me.scratchpad,  (s->width+64)*4*16*2*sizeof(uint8_t))     s->rd_scratchpad=   s->me.scratchpad;    s->b_scratchpad=    s->me.scratchpad;    s->obmc_scratchpad= s->me.scratchpad + 16;    if (s->encoding) {        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->avctx->noise_reduction){            CHECKED_ALLOCZ(s->dct_error_sum, 2 * 64 * sizeof(int))        }    }       CHECKED_ALLOCZ(s->blocks, 64*12*2 * sizeof(DCTELEM))    s->block= s->blocks[0];    for(i=0;i<12;i++){        s->pblocks[i] = (short *)(&s->block[i]);    }    return 0;fail:    return -1; //free() through MPV_common_end()}static void free_duplicate_context(MpegEncContext *s){    if(s==NULL) return;    av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;    av_freep(&s->me.scratchpad);    s->rd_scratchpad=       s->b_scratchpad=        s->obmc_scratchpad= NULL;        av_freep(&s->dct_error_sum);    av_freep(&s->me.map);    av_freep(&s->me.score_map);    av_freep(&s->blocks);    s->block= NULL;}static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){#define COPY(a) bak->a= src->a    COPY(allocated_edge_emu_buffer);    COPY(edge_emu_buffer);    COPY(me.scratchpad);    COPY(rd_scratchpad);    COPY(b_scratchpad);    COPY(obmc_scratchpad);    COPY(me.map);    COPY(me.score_map);    COPY(blocks);    COPY(block);    COPY(start_mb_y);    COPY(end_mb_y);    COPY(me.map_generation);    COPY(pb);    COPY(dct_error_sum);    COPY(dct_count[0]);    COPY(dct_count[1]);#undef COPY}void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){    MpegEncContext bak;    int i;    //FIXME copy only needed parts//START_TIMER    backup_duplicate_context(&bak, dst);    memcpy(dst, src, sizeof(MpegEncContext));    backup_duplicate_context(dst, &bak);    for(i=0;i<12;i++){        dst->pblocks[i] = (short *)(&dst->block[i]);    }//STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads}static void update_duplicate_context_after_me(MpegEncContext *dst, MpegEncContext *src){#define COPY(a) dst->a= src->a    COPY(pict_type);    COPY(current_picture);    COPY(f_code);    COPY(b_code);    COPY(qscale);    COPY(lambda);    COPY(lambda2);    COPY(picture_in_gop_number);    COPY(gop_picture_number);    COPY(frame_pred_frame_dct); //FIXME don't set in encode_header    COPY(progressive_frame); //FIXME don't set in encode_header    COPY(partitioned_frame); //FIXME don't set in encode_header#undef COPY}/** * sets the given MpegEncContext to common defaults (same for encoding and decoding). * the changed fields will not depend upon the prior state of the MpegEncContext. */static void MPV_common_defaults(MpegEncContext *s){    s->y_dc_scale_table=    s->c_dc_scale_table= ff_mpeg1_dc_scale_table;    s->chroma_qscale_table= ff_default_chroma_qscale_table;    s->progressive_frame= 1;    s->progressive_sequence= 1;    s->picture_structure= PICT_FRAME;    s->coded_picture_number = 0;    s->picture_number = 0;    s->input_picture_number = 0;    s->picture_in_gop_number = 0;    s->f_code = 1;    s->b_code = 1;}/** * sets the given MpegEncContext to defaults for decoding. * the changed fields will not depend upon the prior state of the MpegEncContext. */void MPV_decode_defaults(MpegEncContext *s){    MPV_common_defaults(s);}/** * sets the given MpegEncContext to defaults for encoding. * the changed fields will not depend upon the prior state of the MpegEncContext. */#ifdef CONFIG_ENCODERSstatic void MPV_encode_defaults(MpegEncContext *s){    static int done=0;        MPV_common_defaults(s);        if(!done){        int i;        done=1;        default_mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );        memset(default_fcode_tab , 0, sizeof(uint8_t)*(2*MAX_MV+1));        for(i=-16; i<16; i++){            default_fcode_tab[i + MAX_MV]= 1;        }    }    s->me.mv_penalty= default_mv_penalty;    s->fcode_tab= default_fcode_tab;}#endif //CONFIG_ENCODERS/**  * init common structure for both encoder and decoder. * this assumes that some variables like width/height are already set */int MPV_common_init(MpegEncContext *s){    int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;    if(s->avctx->thread_count > MAX_THREADS || (16*s->avctx->thread_count > s->height && s->height)){        av_log(s->avctx, AV_LOG_ERROR, "too many threads\n");        return -1;    }    if((s->width || s->height) && avcodec_check_dimensions(s->avctx, s->width, s->height))        return -1;    dsputil_init(&s->dsp, s->avctx);    DCT_common_init(s);    s->flags= s->avctx->flags;    s->flags2= s->avctx->flags2;    s->mb_width  = (s->width  + 15) / 16;    s->mb_height = (s->height + 15) / 16;    s->mb_stride = s->mb_width + 1;    s->b8_stride = s->mb_width*2 + 1;    s->b4_stride = s->mb_width*4 + 1;    mb_array_size= s->mb_height * s->mb_stride;    mv_table_size= (s->mb_height+2) * s->mb_stride + 1;    /* set chroma shifts */    avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),                                                    &(s->chroma_y_shift) );    /* 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->b8_stride;    s->block_wrap[4]=    s->block_wrap[5]= s->mb_stride;     y_size = s->b8_stride * (2 * s->mb_height + 1);    c_size = s->mb_stride * (s->mb_height + 1);    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);    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) {        /* 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;        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(uint16_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_offset, 2 * 64 * sizeof(uint16_t))        }    }    CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture))    CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))

⌨️ 快捷键说明

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