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

📄 mpegvideo.c

📁 tcpmp播放器的flv插件
💻 C
📖 第 1 页 / 共 5 页
字号:
//        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);    if(avctx->codec_id == CODEC_ID_MPEG4 && s->avctx->time_base.den > (1<<16)-1){        av_log(avctx, AV_LOG_ERROR, "timebase not supported by mpeg 4 standard\n");        return -1;            }    s->time_increment_bits = av_log2(s->avctx->time_base.den - 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;    case CODEC_ID_H261:        s->out_format = FMT_H261;        avctx->delay=0;        s->low_delay=1;        break;    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;        break;    case CODEC_ID_FLV1:        s->out_format = FMT_H263;        s->h263_flv = 2; /* format = 1; 11-bit codes */        s->unrestricted_mv = 1;        s->rtp_mode=0; /* don't allow GOB */        avctx->delay=0;        s->low_delay=1;        break;    case CODEC_ID_RV10:        s->out_format = FMT_H263;        avctx->delay=0;        s->low_delay=1;        break;    case CODEC_ID_RV20:        s->out_format = FMT_H263;        avctx->delay=0;        s->low_delay=1;        s->modified_quant=1;        s->h263_aic=1;        s->h263_plus=1;        s->loop_filter=1;        s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;        break;    case CODEC_ID_MPEG4:        s->out_format = FMT_H263;        s->h263_pred = 1;        s->unrestricted_mv = 1;        s->low_delay= s->max_b_frames ? 0 : 1;        avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);        break;    case CODEC_ID_MSMPEG4V1:        s->out_format = FMT_H263;        s->h263_msmpeg4 = 1;        s->h263_pred = 1;        s->unrestricted_mv = 1;        s->msmpeg4_version= 1;        avctx->delay=0;        s->low_delay=1;        break;    case CODEC_ID_MSMPEG4V2:        s->out_format = FMT_H263;        s->h263_msmpeg4 = 1;        s->h263_pred = 1;        s->unrestricted_mv = 1;        s->msmpeg4_version= 2;        avctx->delay=0;        s->low_delay=1;        break;    case CODEC_ID_MSMPEG4V3:        s->out_format = FMT_H263;        s->h263_msmpeg4 = 1;        s->h263_pred = 1;        s->unrestricted_mv = 1;        s->msmpeg4_version= 3;        s->flipflop_rounding=1;        avctx->delay=0;        s->low_delay=1;        break;    case CODEC_ID_WMV1:        s->out_format = FMT_H263;        s->h263_msmpeg4 = 1;        s->h263_pred = 1;        s->unrestricted_mv = 1;        s->msmpeg4_version= 4;        s->flipflop_rounding=1;        avctx->delay=0;        s->low_delay=1;        break;    case CODEC_ID_WMV2:        s->out_format = FMT_H263;        s->h263_msmpeg4 = 1;        s->h263_pred = 1;        s->unrestricted_mv = 1;        s->msmpeg4_version= 5;        s->flipflop_rounding=1;        avctx->delay=0;        s->low_delay=1;        break;    default:        return -1;    }        avctx->has_b_frames= !s->low_delay;    s->encoding = 1;    /* init */    if (MPV_common_init(s) < 0)        return -1;    if(s->modified_quant)        s->chroma_qscale_table= ff_h263_chroma_qscale_table;    s->progressive_frame=     s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME));    s->quant_precision=5;        ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);    ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp);    #ifdef CONFIG_H261_ENCODER    if (s->out_format == FMT_H261)        ff_h261_encode_init(s);#endif    if (s->out_format == FMT_H263)        h263_encode_init(s);    if(s->msmpeg4_version)        ff_msmpeg4_encode_init(s);    if (s->out_format == FMT_MPEG1)        ff_mpeg1_encode_init(s);    /* init q matrix */    for(i=0;i<64;i++) {        int j= s->dsp.idct_permutation[i];        if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){            s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];            s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];        }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){            s->intra_matrix[j] =            s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];        }else        { /* mpeg1/2 */            s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];            s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];        }        if(s->avctx->intra_matrix)            s->intra_matrix[j] = s->avctx->intra_matrix[i];        if(s->avctx->inter_matrix)            s->inter_matrix[j] = s->avctx->inter_matrix[i];    }    /* precompute matrix */    /* for mjpeg, we do include qscale in the matrix */    if (s->out_format != FMT_MJPEG) {        convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,                        s->intra_matrix, s->intra_quant_bias, avctx->qmin, 31, 1);        convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,                        s->inter_matrix, s->inter_quant_bias, avctx->qmin, 31, 0);    }    if(ff_rate_control_init(s) < 0)        return -1;        return 0;}int MPV_encode_end(AVCodecContext *avctx){    MpegEncContext *s = avctx->priv_data;#ifdef STATS    print_stats();#endif    ff_rate_control_uninit(s);    MPV_common_end(s);    if (s->out_format == FMT_MJPEG)        mjpeg_close(s);    av_freep(&avctx->extradata);          return 0;}#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++){

⌨️ 快捷键说明

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