📄 h263.c
字号:
if (size > 8){ uni_code<<=1; uni_code|=1; uni_len++; } } uni_DCtab_chrom_bits[level+256]= uni_code; uni_DCtab_chrom_len [level+256]= uni_len; }}#endif //CONFIG_ENCODERS#ifdef CONFIG_ENCODERSstatic void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){ int slevel, run, last; assert(MAX_LEVEL >= 64); assert(MAX_RUN >= 63); for(slevel=-64; slevel<64; slevel++){ if(slevel==0) continue; for(run=0; run<64; run++){ for(last=0; last<=1; last++){ const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64); int level= slevel < 0 ? -slevel : slevel; int sign= slevel < 0 ? 1 : 0; int bits, len, code; int level1, run1; len_tab[index]= 100; /* ESC0 */ code= get_rl_index(rl, last, run, level); bits= rl->table_vlc[code][0]; len= rl->table_vlc[code][1]; bits=bits*2+sign; len++; if(code!=rl->n && len < len_tab[index]){ bits_tab[index]= bits; len_tab [index]= len; }#if 1 /* ESC1 */ bits= rl->table_vlc[rl->n][0]; len= rl->table_vlc[rl->n][1]; bits=bits*2; len++; //esc1 level1= level - rl->max_level[last][run]; if(level1>0){ code= get_rl_index(rl, last, run, level1); bits<<= rl->table_vlc[code][1]; len += rl->table_vlc[code][1]; bits += rl->table_vlc[code][0]; bits=bits*2+sign; len++; if(code!=rl->n && len < len_tab[index]){ bits_tab[index]= bits; len_tab [index]= len; } }#endif #if 1 /* ESC2 */ bits= rl->table_vlc[rl->n][0]; len= rl->table_vlc[rl->n][1]; bits=bits*4+2; len+=2; //esc2 run1 = run - rl->max_run[last][level] - 1; if(run1>=0){ code= get_rl_index(rl, last, run1, level); bits<<= rl->table_vlc[code][1]; len += rl->table_vlc[code][1]; bits += rl->table_vlc[code][0]; bits=bits*2+sign; len++; if(code!=rl->n && len < len_tab[index]){ bits_tab[index]= bits; len_tab [index]= len; } }#endif /* ESC3 */ bits= rl->table_vlc[rl->n][0]; len = rl->table_vlc[rl->n][1]; bits=bits*4+3; len+=2; //esc3 bits=bits*2+last; len++; bits=bits*64+run; len+=6; bits=bits*2+1; len++; //marker bits=bits*4096+(slevel&0xfff); len+=12; bits=bits*2+1; len++; //marker if(len < len_tab[index]){ bits_tab[index]= bits; len_tab [index]= len; } } } }}void h263_encode_init(MpegEncContext *s){ static int done = 0; if (!done) { done = 1; init_uni_dc_tab(); init_rl(&rl_inter); init_rl(&rl_intra); init_rl(&rl_intra_aic); init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len); init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len); init_mv_penalty_and_fcode(s); } s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p // use fcodes >1 only for mpeg4 & h263 & h263p FIXME switch(s->codec_id){ case CODEC_ID_MPEG4: s->fcode_tab= fcode_tab; s->min_qcoeff= -2048; s->max_qcoeff= 2047; s->intra_ac_vlc_length = uni_mpeg4_intra_rl_len; s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64; s->inter_ac_vlc_length = uni_mpeg4_inter_rl_len; s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64; s->luma_dc_vlc_length= uni_DCtab_lum_len; s->chroma_dc_vlc_length= uni_DCtab_chrom_len; s->ac_esc_length= 7+2+1+6+1+12+1; if(s->flags & CODEC_FLAG_GLOBAL_HEADER){ s->avctx->extradata= av_malloc(1024); init_put_bits(&s->pb, s->avctx->extradata, 1024); mpeg4_encode_visual_object_header(s); mpeg4_encode_vol_header(s, 0, 0);// ff_mpeg4_stuffing(&s->pb); ? flush_put_bits(&s->pb); s->avctx->extradata_size= (get_bit_count(&s->pb)+7)>>3; } break; case CODEC_ID_H263P: s->fcode_tab= umv_fcode_tab; s->min_qcoeff= -127; s->max_qcoeff= 127; break; //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later case CODEC_ID_FLV1: if (s->h263_flv > 1) { s->min_qcoeff= -1023; s->max_qcoeff= 1023; } else { s->min_qcoeff= -127; s->max_qcoeff= 127; } s->y_dc_scale_table= s->c_dc_scale_table= ff_mpeg1_dc_scale_table; break; default: //nothing needed default table allready set in mpegvideo.c s->min_qcoeff= -127; s->max_qcoeff= 127; s->y_dc_scale_table= s->c_dc_scale_table= ff_mpeg1_dc_scale_table; }}/** * encodes a 8x8 block. * @param block the 8x8 block * @param n block index (0-3 are luma, 4-5 are chroma) */static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n){ int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code; RLTable *rl; rl = &rl_inter; if (s->mb_intra && !s->h263_aic) { /* DC coef */ level = block[0]; /* 255 cannot be represented, so we clamp */ if (level > 254) { level = 254; block[0] = 254; } /* 0 cannot be represented also */ else if (level < 1) { level = 1; block[0] = 1; } if (level == 128) //FIXME check rv10 put_bits(&s->pb, 8, 0xff); else put_bits(&s->pb, 8, level & 0xff); i = 1; } else { i = 0; if (s->h263_aic && s->mb_intra) rl = &rl_intra_aic; } /* AC coefs */ last_index = s->block_last_index[n]; last_non_zero = i - 1; for (; i <= last_index; i++) { j = s->intra_scantable.permutated[i]; level = block[j]; if (level) { run = i - last_non_zero - 1; last = (i == last_index); sign = 0; slevel = level; if (level < 0) { sign = 1; level = -level; } code = get_rl_index(rl, last, run, level); put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); if (code == rl->n) { if(s->h263_flv <= 1){ put_bits(&s->pb, 1, last); put_bits(&s->pb, 6, run); assert(slevel != 0); if(slevel < 128 && slevel > -128) put_bits(&s->pb, 8, slevel & 0xff); else{ put_bits(&s->pb, 8, 128); put_bits(&s->pb, 5, slevel & 0x1f); put_bits(&s->pb, 6, (slevel>>5)&0x3f); } }else{ if(slevel < 64 && slevel > -64) { /* 7-bit level */ put_bits(&s->pb, 1, 0); put_bits(&s->pb, 1, last); put_bits(&s->pb, 6, run); put_bits(&s->pb, 7, slevel & 0x7f); } else { /* 11-bit level */ put_bits(&s->pb, 1, 1); put_bits(&s->pb, 1, last); put_bits(&s->pb, 6, run); put_bits(&s->pb, 11, slevel & 0x7ff); } } } else { put_bits(&s->pb, 1, sign); } last_non_zero = i; } }}#endif#ifdef CONFIG_ENCODERS/***************************************************//** * add mpeg4 stuffing bits (01...1) */void ff_mpeg4_stuffing(PutBitContext * pbc){ int length; put_bits(pbc, 1, 0); length= (-get_bit_count(pbc))&7; if(length) put_bits(pbc, length, (1<<length)-1);}/* must be called before writing the header */void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){ int time_div, time_mod; if(s->current_picture_ptr->pts) s->time= (s->current_picture_ptr->pts*s->time_increment_resolution + 500*1000)/(1000*1000); else s->time= av_rescale(picture_number*(int64_t)s->avctx->frame_rate_base, s->time_increment_resolution, s->avctx->frame_rate); time_div= s->time/s->time_increment_resolution; time_mod= s->time%s->time_increment_resolution; if(s->pict_type==B_TYPE){ s->pb_time= s->pp_time - (s->last_non_b_time - s->time); }else{ s->last_time_base= s->time_base; s->time_base= time_div; s->pp_time= s->time - s->last_non_b_time; s->last_non_b_time= s->time; }}static void mpeg4_encode_gop_header(MpegEncContext * s){ int hours, minutes, seconds; put_bits(&s->pb, 16, 0); put_bits(&s->pb, 16, GOP_STARTCODE); seconds= s->time/s->time_increment_resolution; minutes= seconds/60; seconds %= 60; hours= minutes/60; minutes %= 60; hours%=24; put_bits(&s->pb, 5, hours); put_bits(&s->pb, 6, minutes); put_bits(&s->pb, 1, 1); put_bits(&s->pb, 6, seconds); put_bits(&s->pb, 1, 0); //closed gov == NO put_bits(&s->pb, 1, 0); //broken link == NO ff_mpeg4_stuffing(&s->pb);}static void mpeg4_encode_visual_object_header(MpegEncContext * s){ int profile_and_level_indication; int vo_ver_id; if(s->max_b_frames || s->quarter_sample){ profile_and_level_indication= 0xF1; // adv simple level 1 vo_ver_id= 5; }else{ profile_and_level_indication= 0x01; // simple level 1 vo_ver_id= 1; } //FIXME levels put_bits(&s->pb, 16, 0); put_bits(&s->pb, 16, VOS_STARTCODE); put_bits(&s->pb, 8, profile_and_level_indication); put_bits(&s->pb, 16, 0); put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE); put_bits(&s->pb, 1, 1); put_bits(&s->pb, 4, vo_ver_id); put_bits(&s->pb, 3, 1); //priority put_bits(&s->pb, 4, 1); //visual obj type== video obj put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME ff_mpeg4_stuffing(&s->pb);}static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number){ int vo_ver_id; if(s->max_b_frames || s->quarter_sample){ vo_ver_id= 5; s->vo_type= ADV_SIMPLE_VO_TYPE; }else{ vo_ver_id= 1; s->vo_type= SIMPLE_VO_TYPE; } put_bits(&s->pb, 16, 0); put_bits(&s->pb, 16, 0x100 + vo_number); /* video obj */ put_bits(&s->pb, 16, 0); put_bits(&s->pb, 16, 0x120 + vol_number); /* video obj layer */ put_bits(&s->pb, 1, 0); /* random access vol */ put_bits(&s->pb, 8, s->vo_type); /* video obj type indication */ put_bits(&s->pb, 1, 1); /* is obj layer id= yes */ put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */ put_bits(&s->pb, 3, 1); /* is obj layer priority */ aspect_to_info(s, s->avctx->sample_aspect_ratio); put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */ if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){ put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num); put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den); } if(s->low_delay){ put_bits(&s->pb, 1, 1); /* vol control parameters= yes */ put_bits(&s->pb, 2, 1); /* chroma format YUV 420/YV12 */ put_bits(&s->pb, 1, s->low_delay); put_bits(&s->pb, 1, 0); /* vbv parameters= no */ }else{ put_bits(&s->pb, 1, 0); /* vol cont
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -