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

📄 mpegvideo.c

📁 linux下的MPEG1
💻 C
📖 第 1 页 / 共 5 页
字号:
    if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){        av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet, set threshold to 1000000000\n");        return -1;    }    if((s->flags2 & CODEC_FLAG2_INTRA_VLC) && s->codec_id != CODEC_ID_MPEG2VIDEO){        av_log(avctx, AV_LOG_ERROR, "intra vlc table not supported by codec\n");        return -1;    }    if(s->flags & CODEC_FLAG_LOW_DELAY){        if (s->codec_id != CODEC_ID_MPEG2VIDEO && s->codec_id != CODEC_ID_MPEG1VIDEO){            av_log(avctx, AV_LOG_ERROR, "low delay forcing is only available for mpeg1/2\n");            return -1;        }        if (s->max_b_frames != 0){            av_log(avctx, AV_LOG_ERROR, "b frames cannot be used with low delay\n");            return -1;        }    }    if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4       && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO       && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){        av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n");        return -1;    }    if(s->avctx->thread_count > 1)        s->rtp_mode= 1;    if(!avctx->time_base.den || !avctx->time_base.num){        av_log(avctx, AV_LOG_ERROR, "framerate not set\n");        return -1;    }    i= (INT_MAX/2+128)>>8;    if(avctx->me_threshold >= i){        av_log(avctx, AV_LOG_ERROR, "me_threshold too large, max is %d\n", i - 1);        return -1;    }    if(avctx->mb_threshold >= i){        av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n", i - 1);        return -1;    }    if(avctx->b_frame_strategy && (avctx->flags&CODEC_FLAG_PASS2)){        av_log(avctx, AV_LOG_INFO, "notice: b_frame_strategy only affects the first pass\n");        avctx->b_frame_strategy = 0;    }    i= ff_gcd(avctx->time_base.den, avctx->time_base.num);    if(i > 1){        av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");        avctx->time_base.den /= i;        avctx->time_base.num /= i;//        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= !!(s->flags & CODEC_FLAG_LOW_DELAY);        avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);        break;    case CODEC_ID_MPEG2VIDEO:        s->out_format = FMT_MPEG1;        s->low_delay= !!(s->flags & CODEC_FLAG_LOW_DELAY);        avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);        s->rtp_mode= 1;        break;    case CODEC_ID_LJPEG:    case CODEC_ID_JPEGLS:    case CODEC_ID_MJPEG:        s->out_format = FMT_MJPEG;        s->intra_only = 1; /* force intra only for jpeg */        s->mjpeg_write_tables = avctx->codec->id != CODEC_ID_JPEGLS;        s->mjpeg_data_only_frames = 0; /* write all the needed headers */        s->mjpeg_vsample[0] = 2;        s->mjpeg_vsample[1] = 2>>chroma_v_shift;        s->mjpeg_vsample[2] = 2>>chroma_v_shift;        s->mjpeg_hsample[0] = 2;        s->mjpeg_hsample[1] = 2>>chroma_h_shift;        s->mjpeg_hsample[2] = 2>>chroma_h_shift;        if (mjpeg_init(s) < 0)            return -1;        avctx->delay=0;        s->low_delay=1;        break;#ifdef CONFIG_H261_ENCODER    case CODEC_ID_H261:        if (ff_h261_get_picture_format(s->width, s->height) < 0) {            av_log(avctx, AV_LOG_ERROR, "The specified picture size of %dx%d is not valid for the H.261 codec.\nValid sizes are 176x144, 352x288\n", s->width, s->height);            return -1;        }        s->out_format = FMT_H261;        avctx->delay=0;        s->low_delay=1;        break;#endif    case CODEC_ID_H263:        if (h263_get_picture_format(s->width, s->height) == 7) {            av_log(avctx, AV_LOG_INFO, "The specified picture size of %dx%d is not valid for the H.263 codec.\nValid sizes are 128x96, 176x144, 352x288, 704x576, and 1408x1152. Try H.263+.\n", s->width, s->height);            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|CODEC_FLAG_ALT_SCAN));    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);/* xine: do not need this for decode or MPEG-1 encoding modes */#if 0#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);#endif /* #if 0 *//* xine: we DO want this for MPEG-1 encoding */    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;    ff_rate_control_uninit(s);/* xine: do not need this for decode or MPEG-1 encoding modes */#if 0    MPV_common_end(s);    if (s->out_format == FMT_MJPEG)        mjpeg_close(s);#endif /* #if 0 */    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)

⌨️ 快捷键说明

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