📄 h263.c
字号:
for(mv=0; mv<MAX_MV*2+1; mv++){ umv_fcode_tab[mv]= 1; }}#endifstatic void init_uni_dc_tab(void){ int level, uni_code, uni_len; for(level=-256; level<256; level++){ int size, v, l; /* find number of bits */ size = 0; v = abs(level); while (v) { v >>= 1; size++; } if (level < 0) l= (-level) ^ ((1 << size) - 1); else l= level; /* luminance */ uni_code= DCtab_lum[size][0]; uni_len = DCtab_lum[size][1]; if (size > 0) { uni_code<<=size; uni_code|=l; uni_len+=size; if (size > 8){ uni_code<<=1; uni_code|=1; uni_len++; } } uni_DCtab_lum[level+256][0]= uni_code; uni_DCtab_lum[level+256][1]= uni_len; /* chrominance */ uni_code= DCtab_chrom[size][0]; uni_len = DCtab_chrom[size][1]; if (size > 0) { uni_code<<=size; uni_code|=l; uni_len+=size; if (size > 8){ uni_code<<=1; uni_code|=1; uni_len++; } } uni_DCtab_chrom[level+256][0]= uni_code; uni_DCtab_chrom[level+256][1]= uni_len; }}#ifdef CONFIG_ENCODERSstatic void init_uni_mpeg4_rl_tab(RLTable *rl, UINT32 *bits_tab, UINT8 *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->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; break; case CODEC_ID_H263P: s->fcode_tab= umv_fcode_tab; s->min_qcoeff= -128; s->max_qcoeff= 127; break; //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later default: //nothing needed default table allready set in mpegvideo.c s->min_qcoeff= -128; s->max_qcoeff= 127; s->y_dc_scale_table= s->c_dc_scale_table= ff_mpeg1_dc_scale_table; } if(s->mpeg_quant){ 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 }}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) { level = 1; block[0] = 1; } if (level == 128) 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) { put_bits(&s->pb, 1, last); put_bits(&s->pb, 6, run); put_bits(&s->pb, 8, slevel & 0xff); } else { put_bits(&s->pb, 1, sign); } last_non_zero = i; } }}#endif/***************************************************//** * 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->pict_type==I_TYPE){ //we will encode a vol header s->time_increment_resolution= s->frame_rate/ff_gcd(s->frame_rate, FRAME_RATE_BASE); if(s->time_increment_resolution>=256*256) s->time_increment_resolution= 256*128; s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1; } if(s->avctx->pts) s->time= (s->avctx->pts*s->time_increment_resolution + 500*1000)/(1000*1000); else s->time= picture_number*(INT64)FRAME_RATE_BASE*s->time_increment_resolution/s->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_vol_header(MpegEncContext * s){ int vo_ver_id=1; //must be 2 if we want GMC or q-pel char buf[255]; s->vo_type= s->has_b_frames ? CORE_VO_TYPE : SIMPLE_VO_TYPE; put_bits(&s->pb, 16, 0); put_bits(&s->pb, 16, 0x100); /* video obj */ put_bits(&s->pb, 16, 0); put_bits(&s->pb, 16, 0x120); /* 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 */ init_aspect_info(s); 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->aspected_width); put_bits(&s->pb, 8, s->aspected_height); } 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 control parameters= no */ } put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */ put_bits(&s->pb, 1, 1); /* marker bit */ put_bits(&s->pb, 16, s->time_increment_resolution); if (s->time_increment_bits < 1) s->time_increment_bits = 1; put_bits(&s->pb, 1, 1); /* marker bit */ put_bits(&s->pb, 1, 0); /* fixed vop rate=no */ put_bits(&s->pb, 1, 1); /* marker bit */ put_bits(&s->pb, 13, s->width); /* vol width */ put_bits(&s->pb, 1, 1); /* marker bit */ put_bits(&s->pb, 13, s->height); /* vol height */ put_bits(&s->pb, 1, 1); /* marker bit */ put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1); put_bits(&s->pb, 1, 1); /* obmc disable */ if (vo_ver_id == 1) { put_bits(&s->pb, 1, s->vol_sprite_usage=0); /* sprite enable */ }else{ /* vo_ver_id == 2 */ put_bits(&s->pb, 2, s->vol_sprite_usage=0); /* sprite enable */ } s->quant_precision=5; put_bits(&s->pb, 1, 0); /* not 8 bit == false */ put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/ if(s->mpeg_quant) put_bits(&s->pb, 2, 0); /* no custom matrixes */ if (vo_ver_id != 1) put_bits(&s->pb, 1, s->quarter_sample=0); put_bits(&s->pb, 1, 1); /* complexity estimation disable */ s->resync_marker= s->rtp_mode; put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */ put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0); if(s->data_partitioning){ put_bits(&s->pb, 1, 0); /* no rvlc */ } if (vo_ver_id != 1){ put_bits(&s->pb, 1, 0); /* newpred */ put_bits(&s->pb, 1, 0); /* reduced res vop */ } put_bits(&s->pb, 1, 0); /* scalability */ ff_mpeg4_stuffing(&s->pb); /* user data */ if(!ff_bit_exact){ put_bits(&s->pb, 16, 0); put_bits(&s->pb, 16, 0x1B2); /* user_data */ sprintf(buf, "FFmpeg%sb%s", FFMPEG_VERSION, LIBAVCODEC_BUILD_STR); put_string(&s->pb, buf); ff_mpeg4_stuffing(&s->pb); }}/* write mpeg4 VOP header */void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number){ int time_incr; int time_div, time_mod; if(s->pict_type==I_TYPE){ s->no_rounding=0; if(picture_number==0 || !s->strict_std_compliance) mpeg4_encode_vol_header(s); } s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;//printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE); put_bits(&s->pb, 16, 0); /* vop header */ put_bits(&s->pb, 16, 0x1B6); /* vop header */ put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */ time_div= s->time/s->time_increment_resolution; time_mod= s->time%s->time_increment_resolution; time_incr= time_div - s->last_time_base;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -