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

📄 mpegvideo.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 4 页
字号:
    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->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; // mpeg2 must have slices        if(s->rtp_payload_size == 0) s->rtp_payload_size= 256*256*256;        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;        avctx->delay=0;        s->low_delay=1;        break;    case CODEC_ID_H263P:        s->out_format = FMT_H263;        s->h263_plus = 1;	/* Fx */	s->unrestricted_mv=(avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;	s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0;	/* /Fx */        /* These are just to be sure */        s->umvplus = 1;        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;        s->h263_rv10 = 1;        avctx->delay=0;        s->low_delay=1;        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;#endif    default:        return -1;    }        { /* set up some save defaults, some codecs might override them later */        static int done=0;        if(!done){            int i;            done=1;            default_mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );            memset(default_mv_penalty, 0, 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;    s->y_dc_scale_table=    s->c_dc_scale_table= ff_mpeg1_dc_scale_table;     /* dont use mv_penalty table for crap MV as it would be confused */    //FIXME remove after fixing / removing old ME    if (s->me_method < ME_EPZS) s->me.mv_penalty = default_mv_penalty;    s->encoding = 1;    /* init */    if (MPV_common_init(s) < 0)        return -1;        ff_init_me(s);#ifdef CONFIG_ENCODERS#ifdef CONFIG_RISKY    if (s->out_format == FMT_H263)        h263_encode_init(s);    if(s->msmpeg4_version)        ff_msmpeg4_encode_init(s);#endif    if (s->out_format == FMT_MPEG1)        ff_mpeg1_encode_init(s);#endif    /* init default q matrix */    for(i=0;i<64;i++) {        int j= s->dsp.idct_permutation[i];#ifdef CONFIG_RISKY        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->intra_matrix[j] =            s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];        }else#endif        { /* 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, 1, 31);        convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,                        s->inter_matrix, s->inter_quant_bias, 1, 31);    }    if(ff_rate_control_init(s) < 0)        return -1;    s->picture_number = 0;    s->picture_in_gop_number = 0;    s->fake_picture_number = 0;    /* motion detector init */    s->f_code = 1;    s->b_code = 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){    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;    /* 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;        }        rl->max_level[last] = av_malloc(MAX_RUN + 1);        memcpy(rl->max_level[last], max_level, MAX_RUN + 1);        rl->max_run[last] = av_malloc(MAX_LEVEL + 1);        memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);        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 */

⌨️ 快捷键说明

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