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

📄 mpegvideo.c

📁 mpeg4 video codec mpeg4 video codec
💻 C
📖 第 1 页 / 共 5 页
字号:
    CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))        if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){        /* interlaced direct mode decoding tables */            for(i=0; i<2; i++){                int j, k;                for(j=0; j<2; j++){                    for(k=0; k<2; k++){                        CHECKED_ALLOCZ(s->b_field_mv_table_base[i][j][k]     , mv_table_size * 2 * sizeof(int16_t))                        s->b_field_mv_table[i][j][k]    = s->b_field_mv_table_base[i][j][k]     + s->mb_stride + 1;                    }                    CHECKED_ALLOCZ(s->b_field_select_table[i][j]     , mb_array_size * 2 * sizeof(uint8_t))                    CHECKED_ALLOCZ(s->p_field_mv_table_base[i][j]     , mv_table_size * 2 * sizeof(int16_t))                    s->p_field_mv_table[i][j]    = s->p_field_mv_table_base[i][j]     + s->mb_stride + 1;                }                CHECKED_ALLOCZ(s->p_field_select_table[i]      , mb_array_size * 2 * sizeof(uint8_t))            }    }    if (s->out_format == FMT_H263) {        /* ac values */        CHECKED_ALLOCZ(s->ac_val_base, yc_size * sizeof(int16_t) * 16);        s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;        s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;        s->ac_val[2] = s->ac_val[1] + c_size;                /* cbp values */        CHECKED_ALLOCZ(s->coded_block_base, y_size);        s->coded_block= s->coded_block_base + s->b8_stride + 1;        /* 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_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);    s->allocated_bitstream_buffer_size=0;    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);    s->context_initialized = 0;    s->last_picture_ptr=    s->next_picture_ptr=    s->current_picture_ptr= NULL;    s->linesize= s->uvlinesize= 0;    for(i=0; i<3; i++)        av_freep(&s->visualization_buffer[i]);    avcodec_default_free_buffers(s->avctx);}#ifdef CONFIG_ENCODERS#endif //CONFIG_ENCODERSvoid init_rl(RLTable *rl, int use_static){    int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];    uint8_t index_run[MAX_RUN+1];    int last, run, level, start, end, i;    /* If table is static, we can quit if rl->max_level[0] is not NULL */    if(use_static && rl->max_level[0])        return;    /* compute max_level[], max_run[] and index_run[] */    for(last=0;last<2;last++) {        if (last == 0) {            start = 0;            end = rl->last;        } else {            start = rl->last;            end = rl->n;        }        memset(max_level, 0, MAX_RUN + 1);        memset(max_run, 0, MAX_LEVEL + 1);        memset(index_run, rl->n, MAX_RUN + 1);        for(i=start;i<end;i++) {            run = rl->table_run[i];            level = rl->table_level[i];            if (index_run[run] == rl->n)                index_run[run] = i;            if (level > max_level[run])                max_level[run] = level;            if (run > max_run[level])                max_run[level] = run;        }        if(use_static)            rl->max_level[last] = av_mallocz_static(MAX_RUN + 1);        else        rl->max_level[last] = av_malloc(MAX_RUN + 1);        memcpy(rl->max_level[last], max_level, MAX_RUN + 1);        if(use_static)            rl->max_run[last] = av_mallocz_static(MAX_LEVEL + 1);        else        rl->max_run[last] = av_malloc(MAX_LEVEL + 1);        memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);        if(use_static)            rl->index_run[last] = av_mallocz_static(MAX_RUN + 1);        else        rl->index_run[last] = av_malloc(MAX_RUN + 1);        memcpy(rl->index_run[last], index_run, MAX_RUN + 1);    }}/* draw the edges of width 'w' of an image of size width, height *///FIXME check that this is ok for mpeg4 interlacedstatic void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w){    uint8_t *ptr, *last_line;    int i;    last_line = buf + (height - 1) * wrap;    for(i=0;i<w;i++) {        /* top and bottom */        memcpy(buf - (i + 1) * wrap, buf, width);        memcpy(last_line + (i + 1) * wrap, last_line, width);    }    /* left and right */    ptr = buf;    for(i=0;i<height;i++) {        memset(ptr - w, ptr[0], w);        memset(ptr + width, ptr[width-1], w);        ptr += wrap;    }    /* corners */    for(i=0;i<w;i++) {        memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */        memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */        memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */        memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */    }}int ff_find_unused_picture(MpegEncContext *s, int shared){    int i;        if(shared){        for(i=0; i<MAX_PICTURE_COUNT; i++){            if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;        }    }else{        for(i=0; i<MAX_PICTURE_COUNT; i++){            if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME        }        for(i=0; i<MAX_PICTURE_COUNT; i++){            if(s->picture[i].data[0]==NULL) return i;        }    }    assert(0);    return -1;}static void update_noise_reduction(MpegEncContext *s){    int intra, i;    for(intra=0; intra<2; intra++){        if(s->dct_count[intra] > (1<<16)){            for(i=0; i<64; i++){                s->dct_error_sum[intra][i] >>=1;        }            s->dct_count[intra] >>= 1;    }        for(i=0; i<64; i++){            s->dct_offset[intra][i]= (s->avctx->noise_reduction * s->dct_count[intra] + s->dct_error_sum[intra][i]/2) / (s->dct_error_sum[intra][i]+1);        }    }}/** * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded */int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx){    int i;    AVFrame *pic;    s->mb_skipped = 0;    assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);    /* mark&release old frames */    if (s->pict_type != B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {        avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);        /* release forgotten pictures */        /* if(mpeg124/h263) */        if(!s->encoding){            for(i=0; i<MAX_PICTURE_COUNT; i++){                if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){                    av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");                    avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);                                }            }        }    }alloc:    if(!s->encoding){        /* release non reference frames */        for(i=0; i<MAX_PICTURE_COUNT; i++){            if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){                s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);            }        }        if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)            pic= (AVFrame*)s->current_picture_ptr; //we allready have a unused image (maybe it was set before reading the header)        else{            i= ff_find_unused_picture(s, 0);            pic= (AVFrame*)&s->picture[i];        }        pic->reference= (s->pict_type != B_TYPE || s->codec_id == CODEC_ID_H264)                        && !s->dropable ? 3 : 0;        pic->coded_picture_number= s->coded_picture_number++;                    if( alloc_picture(s, (Picture*)pic, 0) < 0)            return -1;        s->current_picture_ptr= (Picture*)pic;        s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic        s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;        }    s->current_picture_ptr->pict_type= s->pict_type;//    if(s->flags && CODEC_FLAG_QSCALE)   //      s->current_picture_ptr->quality= s->new_picture_ptr->quality;    s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;    copy_picture(&s->current_picture, s->current_picture_ptr);    if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){    if (s->pict_type != B_TYPE) {        s->last_picture_ptr= s->next_picture_ptr;        if(!s->dropable)        s->next_picture_ptr= s->current_picture_ptr;    }/*    av_log(s->avctx, AV_LOG_DEBUG, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n", s->last_picture_ptr, s->next_picture_ptr,s->current_picture_ptr,        s->last_picture_ptr    ? s->last_picture_ptr->data[0] : NULL,         s->next_picture_ptr    ? s->next_picture_ptr->data[0] : NULL, 

⌨️ 快捷键说明

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