X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fwmv2enc.c;h=e4e51d32f933f2d5f13f4e8e6efe1501c057082a;hb=338ed3ed33c412c2828446c4e2a76949161fec6a;hp=91c7a2990e86b9f20a630cf8bc65801c6858701f;hpb=88bd7fdc821aaa0cbcf44cf075c62aaa42121e3f;p=ffmpeg diff --git a/libavcodec/wmv2enc.c b/libavcodec/wmv2enc.c index 91c7a2990e8..e4e51d32f93 100644 --- a/libavcodec/wmv2enc.c +++ b/libavcodec/wmv2enc.c @@ -19,31 +19,31 @@ */ #include "avcodec.h" -#include "dsputil.h" +#include "h263.h" #include "mpegvideo.h" #include "msmpeg4.h" #include "msmpeg4data.h" -#include "h263.h" #include "wmv2.h" -static int encode_ext_header(Wmv2Context *w){ - MpegEncContext * const s= &w->s; +static int encode_ext_header(Wmv2Context *w) +{ + MpegEncContext *const s = &w->s; PutBitContext pb; int code; init_put_bits(&pb, s->avctx->extradata, s->avctx->extradata_size); - put_bits(&pb, 5, s->avctx->time_base.den / s->avctx->time_base.num); //yes 29.97 -> 29 - put_bits(&pb, 11, FFMIN(s->bit_rate/1024, 2047)); + put_bits(&pb, 5, s->avctx->time_base.den / s->avctx->time_base.num); // yes 29.97 -> 29 + put_bits(&pb, 11, FFMIN(s->bit_rate / 1024, 2047)); - put_bits(&pb, 1, w->mspel_bit=1); + put_bits(&pb, 1, w->mspel_bit = 1); put_bits(&pb, 1, s->loop_filter); - put_bits(&pb, 1, w->abt_flag=1); - put_bits(&pb, 1, w->j_type_bit=1); - put_bits(&pb, 1, w->top_left_mv_flag=0); - put_bits(&pb, 1, w->per_mb_rl_bit=1); - put_bits(&pb, 3, code=1); + put_bits(&pb, 1, w->abt_flag = 1); + put_bits(&pb, 1, w->j_type_bit = 1); + put_bits(&pb, 1, w->top_left_mv_flag = 0); + put_bits(&pb, 1, w->per_mb_rl_bit = 1); + put_bits(&pb, 3, code = 1); flush_put_bits(&pb); @@ -52,94 +52,97 @@ static int encode_ext_header(Wmv2Context *w){ return 0; } -static av_cold int wmv2_encode_init(AVCodecContext *avctx){ - Wmv2Context * const w= avctx->priv_data; +static av_cold int wmv2_encode_init(AVCodecContext *avctx) +{ + Wmv2Context *const w = avctx->priv_data; - if(ff_MPV_encode_init(avctx) < 0) + if (ff_mpv_encode_init(avctx) < 0) return -1; ff_wmv2_common_init(w); - avctx->extradata_size= 4; - avctx->extradata= av_mallocz(avctx->extradata_size + 10); + avctx->extradata_size = 4; + avctx->extradata = av_mallocz(avctx->extradata_size + 10); encode_ext_header(w); return 0; } -int ff_wmv2_encode_picture_header(MpegEncContext * s, int picture_number) +int ff_wmv2_encode_picture_header(MpegEncContext *s, int picture_number) { - Wmv2Context * const w= (Wmv2Context*)s; + Wmv2Context *const w = (Wmv2Context *) s; put_bits(&s->pb, 1, s->pict_type - 1); - if(s->pict_type == AV_PICTURE_TYPE_I){ + if (s->pict_type == AV_PICTURE_TYPE_I) put_bits(&s->pb, 7, 0); - } put_bits(&s->pb, 5, s->qscale); - s->dc_table_index = 1; - s->mv_table_index = 1; /* only if P frame */ + s->dc_table_index = 1; + s->mv_table_index = 1; /* only if P frame */ s->per_mb_rl_table = 0; - s->mspel= 0; - w->per_mb_abt=0; - w->abt_type=0; - w->j_type=0; + s->mspel = 0; + w->per_mb_abt = 0; + w->abt_type = 0; + w->j_type = 0; assert(s->flipflop_rounding); if (s->pict_type == AV_PICTURE_TYPE_I) { - assert(s->no_rounding==1); - if(w->j_type_bit) put_bits(&s->pb, 1, w->j_type); + assert(s->no_rounding == 1); + if (w->j_type_bit) + put_bits(&s->pb, 1, w->j_type); - if(w->per_mb_rl_bit) put_bits(&s->pb, 1, s->per_mb_rl_table); + if (w->per_mb_rl_bit) + put_bits(&s->pb, 1, s->per_mb_rl_table); - if(!s->per_mb_rl_table){ + if (!s->per_mb_rl_table) { ff_msmpeg4_code012(&s->pb, s->rl_chroma_table_index); ff_msmpeg4_code012(&s->pb, s->rl_table_index); } put_bits(&s->pb, 1, s->dc_table_index); - s->inter_intra_pred= 0; - }else{ + s->inter_intra_pred = 0; + } else { int cbp_index; put_bits(&s->pb, 2, SKIP_TYPE_NONE); - ff_msmpeg4_code012(&s->pb, cbp_index=0); - if(s->qscale <= 10){ - int map[3]= {0,2,1}; - w->cbp_table_index= map[cbp_index]; - }else if(s->qscale <= 20){ - int map[3]= {1,0,2}; - w->cbp_table_index= map[cbp_index]; - }else{ - int map[3]= {2,1,0}; - w->cbp_table_index= map[cbp_index]; + ff_msmpeg4_code012(&s->pb, cbp_index = 0); + if (s->qscale <= 10) { + int map[3] = { 0, 2, 1 }; + w->cbp_table_index = map[cbp_index]; + } else if (s->qscale <= 20) { + int map[3] = { 1, 0, 2 }; + w->cbp_table_index = map[cbp_index]; + } else { + int map[3] = { 2, 1, 0 }; + w->cbp_table_index = map[cbp_index]; } - if(w->mspel_bit) put_bits(&s->pb, 1, s->mspel); + if (w->mspel_bit) + put_bits(&s->pb, 1, s->mspel); - if(w->abt_flag){ - put_bits(&s->pb, 1, w->per_mb_abt^1); - if(!w->per_mb_abt){ + if (w->abt_flag) { + put_bits(&s->pb, 1, w->per_mb_abt ^ 1); + if (!w->per_mb_abt) ff_msmpeg4_code012(&s->pb, w->abt_type); - } } - if(w->per_mb_rl_bit) put_bits(&s->pb, 1, s->per_mb_rl_table); + if (w->per_mb_rl_bit) + put_bits(&s->pb, 1, s->per_mb_rl_table); - if(!s->per_mb_rl_table){ + if (!s->per_mb_rl_table) { ff_msmpeg4_code012(&s->pb, s->rl_table_index); s->rl_chroma_table_index = s->rl_table_index; } put_bits(&s->pb, 1, s->dc_table_index); put_bits(&s->pb, 1, s->mv_table_index); - s->inter_intra_pred= 0;//(s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE); + s->inter_intra_pred = 0; // (s->width * s->height < 320 * 240 && s->bit_rate <= II_BITRATE); } - s->esc3_level_length= 0; - s->esc3_run_length= 0; + s->esc3_level_length = 0; + s->esc3_run_length = 0; return 0; } @@ -147,11 +150,10 @@ int ff_wmv2_encode_picture_header(MpegEncContext * s, int picture_number) /* Nearly identical to wmv1 but that is just because we do not use the * useless M$ crap features. It is duplicated here in case someone wants * to add support for these crap features. */ -void ff_wmv2_encode_mb(MpegEncContext * s, - int16_t block[6][64], +void ff_wmv2_encode_mb(MpegEncContext *s, int16_t block[6][64], int motion_x, int motion_y) { - Wmv2Context * const w= (Wmv2Context*)s; + Wmv2Context *const w = (Wmv2Context *) s; int cbp, coded_cbp, i; int pred_x, pred_y; uint8_t *coded_block; @@ -161,10 +163,9 @@ void ff_wmv2_encode_mb(MpegEncContext * s, if (!s->mb_intra) { /* compute cbp */ cbp = 0; - for (i = 0; i < 6; i++) { + for (i = 0; i < 6; i++) if (s->block_last_index[i] >= 0) cbp |= 1 << (5 - i); - } put_bits(&s->pb, ff_wmv2_inter_table[w->cbp_table_index][cbp + 64][1], @@ -173,52 +174,54 @@ void ff_wmv2_encode_mb(MpegEncContext * s, /* motion vector */ ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y); ff_msmpeg4_encode_motion(s, motion_x - pred_x, - motion_y - pred_y); + motion_y - pred_y); } else { /* compute cbp */ - cbp = 0; + cbp = 0; coded_cbp = 0; for (i = 0; i < 6; i++) { int val, pred; - val = (s->block_last_index[i] >= 1); + val = (s->block_last_index[i] >= 1); cbp |= val << (5 - i); if (i < 4) { /* predict value for close blocks only for luma */ - pred = ff_msmpeg4_coded_block_pred(s, i, &coded_block); + pred = ff_msmpeg4_coded_block_pred(s, i, &coded_block); *coded_block = val; - val = val ^ pred; + val = val ^ pred; } coded_cbp |= val << (5 - i); } - if (s->pict_type == AV_PICTURE_TYPE_I) { + if (s->pict_type == AV_PICTURE_TYPE_I) put_bits(&s->pb, - ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]); - } else { + ff_msmp4_mb_i_table[coded_cbp][1], + ff_msmp4_mb_i_table[coded_cbp][0]); + else put_bits(&s->pb, ff_wmv2_inter_table[w->cbp_table_index][cbp][1], ff_wmv2_inter_table[w->cbp_table_index][cbp][0]); - } put_bits(&s->pb, 1, 0); /* no AC prediction yet */ - if(s->inter_intra_pred){ - s->h263_aic_dir=0; - put_bits(&s->pb, ff_table_inter_intra[s->h263_aic_dir][1], ff_table_inter_intra[s->h263_aic_dir][0]); + if (s->inter_intra_pred) { + s->h263_aic_dir = 0; + put_bits(&s->pb, + ff_table_inter_intra[s->h263_aic_dir][1], + ff_table_inter_intra[s->h263_aic_dir][0]); } } - for (i = 0; i < 6; i++) { + for (i = 0; i < 6; i++) ff_msmpeg4_encode_block(s, block[i], i); - } } AVCodec ff_wmv2_encoder = { .name = "wmv2", + .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 8"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_WMV2, .priv_data_size = sizeof(Wmv2Context), .init = wmv2_encode_init, - .encode2 = ff_MPV_encode_picture, - .close = ff_MPV_encode_end, - .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }, - .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 8"), + .encode2 = ff_mpv_encode_picture, + .close = ff_mpv_encode_end, + .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, + AV_PIX_FMT_NONE }, };