📄 fame_syntax_mpeg4.c
字号:
int qscale; syntax_mpeg4->mb_width = mb_width; syntax_mpeg4->mb_height = mb_height; syntax_mpeg4->motion_pred = (fame_motion_vector_t *) fame_malloc(4*mb_width*mb_height*sizeof(fame_motion_vector_t)); syntax_mpeg4->cae_h = (fame_syntax_cae_t *) fame_malloc(sizeof(fame_syntax_cae_t)); syntax_mpeg4->cae_v = (fame_syntax_cae_t *) fame_malloc(sizeof(fame_syntax_cae_t)); syntax_mpeg4->cae_h->buffer = fame_malloc(CAE_SEQUENCE_LENGTH); syntax_mpeg4->cae_v->buffer = fame_malloc(CAE_SEQUENCE_LENGTH); /* alloc one line of blocks for Y, Cr, Cb vertical AC/DC predictors*/ /* 15 coefficients need to be kept (7+7 AC + 1 DC) for each predictor */ /* 16 are allocated for alignement. */ syntax_mpeg4->y_pred_v[0]=(short int **)fame_malloc(mb_width*sizeof(short int *)); syntax_mpeg4->y_pred_v[1]=(short int **)fame_malloc(mb_width*sizeof(short int *)); syntax_mpeg4->cr_pred_v = (short int **)fame_malloc(mb_width*sizeof(short int *)); syntax_mpeg4->cb_pred_v = (short int **)fame_malloc(mb_width*sizeof(short int *)); for(i = 0; i < mb_width; i++) { syntax_mpeg4->y_pred_v[0][i] = (short int *)fame_malloc(16 * sizeof(short int)); syntax_mpeg4->y_pred_v[1][i] = (short int *)fame_malloc(16 * sizeof(short int)); syntax_mpeg4->cr_pred_v[i] = (short int *)fame_malloc(16 * sizeof(short int)); syntax_mpeg4->cb_pred_v[i] = (short int *)fame_malloc(16 * sizeof(short int)); } syntax_mpeg4->y_pred_h[0] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->y_pred_h[1] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->y_pred_h[2] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->cr_pred_h[0] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->cr_pred_h[1] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->cb_pred_h[0] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->cb_pred_h[1] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->pred[0] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->pred[1] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->pred[2] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->pred[3] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->pred[4] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->pred[5] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->diff[0] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->diff[1] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->diff[2] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->diff[3] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->diff[4] = (short int *) fame_malloc(16 * sizeof(short int)); syntax_mpeg4->diff[5] = (short int *) fame_malloc(16 * sizeof(short int)); /* compute default DC predictor values */ syntax_mpeg4->pred_default = (short int *) fame_malloc(16 * sizeof(short int)); memset(syntax_mpeg4->pred_default, 0, 16 * sizeof(short int)); syntax_mpeg4->pred_default[0] = 1024; syntax_mpeg4->fps_num = 25; syntax_mpeg4->fps_den = 1; /* initialize vlc tables */ syntax_mpeg4->intra_table = (fame_vlc_t *) fame_malloc(2*64*511*sizeof(fame_vlc_t)); syntax_mpeg4->inter_table = (fame_vlc_t *) fame_malloc(2*64*511*sizeof(fame_vlc_t)); mpeg4_init_vlc_tables(syntax_mpeg4->intra_table, syntax_mpeg4->inter_table); /* center vlc tables */ syntax_mpeg4->intra_table += 64*255; syntax_mpeg4->inter_table += 64*255; /* Initialization of default values */ /* Video Object Sequence */ syntax_mpeg4->profile_and_level_indication = 0x01; /* Visual Object */ syntax_mpeg4->is_visual_object_identifier = 0; syntax_mpeg4->visual_object_type = MPEG4_Visual_Object_Type_VideoID ; syntax_mpeg4->visual_object_verid = 1; syntax_mpeg4->visual_object_priority = 1; syntax_mpeg4->visual_object_type = 1; /* video ID */ /* Video Signal Type */ syntax_mpeg4->video_signal_type = 0; /* not present */ syntax_mpeg4->video_format = 5; /* unspecified */ syntax_mpeg4->video_range = 0; syntax_mpeg4->colour_description = 0; /* not present */ syntax_mpeg4->colour_primaries = 2; /* unknown */ syntax_mpeg4->transfer_characteristics = 2; /* unknown */ syntax_mpeg4->matrix_coefficients = 2; /* unknown */ /* assign values depending on flags */ if(flags & FAME_SYNTAX_ARBITRARY_SHAPE) syntax_mpeg4->video_object_layer_shape = MPEG4_Video_Object_Layer_Shape_Binary; else syntax_mpeg4->video_object_layer_shape = MPEG4_Video_Object_Layer_Shape_Rectangular; if(flags & FAME_SYNTAX_LOSSLESS_SHAPE) syntax_mpeg4->change_conv_ratio_disable=1; else syntax_mpeg4->change_conv_ratio_disable=0; /* fill in quantization tables */ if(*intra_matrix) { int i; syntax_mpeg4->load_intra_quant_mat=1; for(i = 0; i < 64; i++) syntax_mpeg4->intra_quant_mat[i] = (*intra_matrix)[mpeg4_zigzag_table[i]]; } else { syntax_mpeg4->load_intra_quant_mat=0; *intra_matrix = mpeg4_intra_quantisation_table; } if(*inter_matrix) { int i; syntax_mpeg4->load_nonintra_quant_mat=1; for(i = 0; i < 64; i++) syntax_mpeg4->nonintra_quant_mat[i] = (*inter_matrix)[mpeg4_zigzag_table[i]]; } else { syntax_mpeg4->load_nonintra_quant_mat=0; *inter_matrix = mpeg4_inter_quantisation_table; } /* fill in intra DC quantizer values */ for(qscale = 0; qscale < 32; qscale++) { if(qscale >= 1 && qscale <= 4) { syntax_mpeg4->y_dc_scaler[qscale] = 8; syntax_mpeg4->c_dc_scaler[qscale] = 8; } if(qscale >= 5 && qscale <= 8) { syntax_mpeg4->y_dc_scaler[qscale] = qscale << 1; syntax_mpeg4->c_dc_scaler[qscale] = (qscale+13) >> 1; } if(qscale >= 9 && qscale <= 24) { syntax_mpeg4->y_dc_scaler[qscale] = qscale + 8; syntax_mpeg4->c_dc_scaler[qscale] = (qscale+13) >> 1; } if(qscale >= 25 && qscale <= 31) { syntax_mpeg4->y_dc_scaler[qscale] = (qscale << 1) - 16; syntax_mpeg4->c_dc_scaler[qscale] = qscale - 6; } intra_dc_y_scale_table[qscale] = syntax_mpeg4->y_dc_scaler[qscale]; intra_dc_c_scale_table[qscale] = syntax_mpeg4->c_dc_scaler[qscale]; } /* Initialize symbols for shape */ syntax_mpeg4->symbol = (int *) fame_malloc(2048*sizeof(int)); mpeg4_init_symbol(syntax_mpeg4->symbol); /* MPEG-4 uses global mismatch control */ *mismatch_type = fame_mismatch_global;}static void mpeg4_close(fame_syntax_t *syntax){ fame_syntax_mpeg4_t *syntax_mpeg4 = FAME_SYNTAX_MPEG4(syntax); int i; syntax_mpeg4->intra_table -= 64*255; /* uncenter intra vlc table */ syntax_mpeg4->inter_table -= 64*255; /* uncenter inter vlc table */ fame_free(syntax_mpeg4->symbol); fame_free(syntax_mpeg4->intra_table); fame_free(syntax_mpeg4->inter_table); for(i = 0; i < syntax_mpeg4->mb_width; i++) { fame_free(syntax_mpeg4->y_pred_v[0][i]); fame_free(syntax_mpeg4->y_pred_v[1][i]); fame_free(syntax_mpeg4->cr_pred_v[i]); fame_free(syntax_mpeg4->cb_pred_v[i]); } fame_free(syntax_mpeg4->y_pred_v[0]); fame_free(syntax_mpeg4->y_pred_v[1]); fame_free(syntax_mpeg4->cr_pred_v); fame_free(syntax_mpeg4->cb_pred_v); fame_free(syntax_mpeg4->y_pred_h[0]); fame_free(syntax_mpeg4->y_pred_h[1]); fame_free(syntax_mpeg4->y_pred_h[2]); fame_free(syntax_mpeg4->cr_pred_h[0]); fame_free(syntax_mpeg4->cb_pred_h[0]); fame_free(syntax_mpeg4->cr_pred_h[1]); fame_free(syntax_mpeg4->cb_pred_h[1]); fame_free(syntax_mpeg4->pred[0]); fame_free(syntax_mpeg4->pred[1]); fame_free(syntax_mpeg4->pred[2]); fame_free(syntax_mpeg4->pred[3]); fame_free(syntax_mpeg4->pred[4]); fame_free(syntax_mpeg4->pred[5]); fame_free(syntax_mpeg4->diff[0]); fame_free(syntax_mpeg4->diff[1]); fame_free(syntax_mpeg4->diff[2]); fame_free(syntax_mpeg4->diff[3]); fame_free(syntax_mpeg4->diff[4]); fame_free(syntax_mpeg4->diff[5]); fame_free(syntax_mpeg4->cae_v->buffer); fame_free(syntax_mpeg4->cae_h->buffer); fame_free(syntax_mpeg4->cae_v); fame_free(syntax_mpeg4->cae_h); fame_free(syntax_mpeg4->motion_pred);}static void mpeg4_use(fame_syntax_t *syntax, unsigned char *buffer, int size){ fame_syntax_mpeg4_t *syntax_mpeg4 = FAME_SYNTAX_MPEG4(syntax); bitbuffer_init(&syntax_mpeg4->buffer, buffer, size);}static int mpeg4_flush(fame_syntax_t *syntax){ fame_syntax_mpeg4_t *syntax_mpeg4 = FAME_SYNTAX_MPEG4(syntax); return(bitbuffer_flush(&syntax_mpeg4->buffer));}static void mpeg4_start_sequence(fame_syntax_t *syntax, int width, int height, int fps_num, int fps_den, int size, int bitrate){ fame_syntax_mpeg4_t *syntax_mpeg4 = FAME_SYNTAX_MPEG4(syntax); fame_bitbuffer_t *buff; buff = &syntax_mpeg4->buffer; syntax_mpeg4->fps_num = fps_num; syntax_mpeg4->fps_den = fps_den; /* Video Object Layer */ syntax_mpeg4->short_video_header = 0; syntax_mpeg4->random_accessible_vol = 0; syntax_mpeg4->video_object_type_indication = MPEG4_Video_Object_Type_SimpleObject; syntax_mpeg4->is_object_layer_identifier=0; syntax_mpeg4->video_object_layer_verid = 1; syntax_mpeg4->video_object_layer_priority = 1; syntax_mpeg4->aspect_ratio_info = 1; /* square */ syntax_mpeg4->par_width = 1; syntax_mpeg4->par_height = 1; syntax_mpeg4->vol_control_parameters = 0; syntax_mpeg4->video_object_layer_shape_extension = 0; syntax_mpeg4->vop_time_increment_resolution=fps_num; syntax_mpeg4->fixed_vop_time_increment=fps_den; syntax_mpeg4->fixed_vop_rate=1; syntax_mpeg4->video_object_layer_width = width; syntax_mpeg4->video_object_layer_height = height; syntax_mpeg4->interlaced=0; syntax_mpeg4->obmc_disable=1; syntax_mpeg4->sprite_enable=0; syntax_mpeg4->sadct_disable=1; syntax_mpeg4->not_8_bit=0; syntax_mpeg4->quant_precision=5; syntax_mpeg4->bits_per_pixel=8; syntax_mpeg4->quant_type=1; /* MPEG-4 */ syntax_mpeg4->quarter_sample=0; syntax_mpeg4->complexity_estimation_disable=1; syntax_mpeg4->resync_marker_disable=0; syntax_mpeg4->data_partitionned=0; syntax_mpeg4->reversible_vlc=0; syntax_mpeg4->newpred_enable=0; syntax_mpeg4->reduced_resolution_vop_enable=0; syntax_mpeg4->scalability=0; syntax_mpeg4->vop_time_increment=0; syntax_mpeg4->vop_reduced_resolution=0; syntax_mpeg4->interlaced=0;#ifndef OPENDIVX_COMPATIBILITY bitbuffer_write(buff,MPEG4_SEQUENCE_START_CODE,32); bitbuffer_write(buff,syntax_mpeg4->profile_and_level_indication,8); bitbuffer_write(buff,MPEG4_VISUAL_OBJ_START_CODE,32); bitbuffer_write(buff,syntax_mpeg4->is_visual_object_identifier,1); if ( syntax_mpeg4->is_visual_object_identifier ) { /* TODO */ } bitbuffer_write(buff,syntax_mpeg4->visual_object_type,4); if ( (syntax_mpeg4->visual_object_type == MPEG4_Visual_Object_Type_VideoID) || (syntax_mpeg4->visual_object_type == MPEG4_Visual_Object_Type_still_textureID)) { bitbuffer_write(buff,syntax_mpeg4->video_signal_type,1); if(syntax_mpeg4->video_signal_type) { /* TODO */ } } /* Next Start Code */ mpeg4_next_start_code(buff);#endif /* if syntax_mpeg4->visual_object_type == MPEG4_Visual_Object_Type_VideoID * on ne fait rien d'autre */ bitbuffer_write(buff,MPEG4_VIDEO_OBJ_START_CODE, 32); bitbuffer_write(buff,MPEG4_VIDEO_OBJ_LAYER_START_CODE, 32); syntax_mpeg4->short_video_header=0; bitbuffer_write(buff,syntax_mpeg4->random_accessible_vol,1); bitbuffer_write(buff,syntax_mpeg4->video_object_type_indication,8); if (syntax_mpeg4->video_object_type_indication == MPEG4_Video_Object_Type_FineGranularityScalable ) { /* Not Supported */ } else { bitbuffer_write(buff,syntax_mpeg4->is_object_layer_identifier, 1 ); if(syntax_mpeg4->is_object_layer_identifier) { /* TODO */ } bitbuffer_write(buff,syntax_mpeg4->aspect_ratio_info,4); if (syntax_mpeg4->aspect_ratio_info == MPEG4_Aspect_Ratio_Info_ExtendedPAR ) { /* TODO */ } bitbuffer_write(buff,syntax_mpeg4->vol_control_parameters, 1); if (syntax_mpeg4->vol_control_parameters) { /* TODO */ } bitbuffer_write(buff,syntax_mpeg4->video_object_layer_shape,2); if ((syntax_mpeg4->video_object_layer_shape == MPEG4_Video_Object_Layer_Shape_Grayscale) && (syntax_mpeg4->video_object_layer_verid != 1)) { /* TODO */ } bitbuffer_write(buff,1,1); /* Marker */ bitbuffer_write(buff,syntax_mpeg4->vop_time_increment_resolution, 16); bitbuffer_write(buff,1,1); /* Marker */ bitbuffer_write(buff,syntax_mpeg4->fixed_vop_rate,1); if(syntax_mpeg4->fixed_vop_rate); { bitbuffer_write(buff,syntax_mpeg4->fixed_vop_time_increment, get_min_bit(syntax_mpeg4->vop_time_increment_resolution)); } if(syntax_mpeg4->video_object_layer_shape != MPEG4_Video_Object_Layer_Shape_BinaryOnly ) { if(syntax_mpeg4->video_object_layer_shape == MPEG4_Video_Object_Layer_Shape_Rectangular ) { bitbuffer_write(buff,1,1); /* Marker */ bitbuffer_write(buff,syntax_mpeg4->video_object_layer_width,13); bitbuffer_write(buff,1,1); /* Marker */ bitbuffer_write(buff,syntax_mpeg4->video_object_layer_height,13); bitbuffer_write(buff,1,1); /* Marker */ } bitbuffer_write(buff,syntax_mpeg4->interlaced,1); bitbuffer_write(buff,syntax_mpeg4->obmc_disable,1); if (syntax_mpeg4->video_object_layer_verid == 0x01 ) { bitbuffer_write(buff,syntax_mpeg4->sprite_enable,1); } else bitbuffer_write(buff,syntax_mpeg4->sprite_enable,2); /* TODO test sprite */ if ((syntax_mpeg4->video_object_layer_verid != 0x01) && (syntax_mpeg4->video_object_layer_shape != MPEG4_Video_Object_Layer_Shape_Rectangular )) bitbuffer_write(buff,syntax_mpeg4->sadct_disable,1); bitbuffer_write(buff,syntax_mpeg4->not_8_bit,1); if (syntax_mpeg4->not_8_bit) { bitbuffer_write(buff,syntax_mpeg4->quant_precision,4); bitbuffer_write(buff,syntax_mpeg4->bits_per_pixel,4); } if ( syntax_mpeg4->video_object_layer_shape == MPEG4_Video_Object_Layer_Shape_Grayscale ) { /* not supported */ } bitbuffer_write(buff,syntax_mpeg4->quant_type,1); if ( syntax_mpeg4->quant_type) { int i; bitbuffer_write(buff,syntax_mpeg4->load_intra_quant_mat,1); if ( syntax_mpeg4->load_intra_quant_mat ) for(i = 0; i < 64; i++) /* already in zigzag order */ bitbuffer_write(buff,syntax_mpeg4->intra_quant_mat[i],8); bitbuffer_write(buff,syntax_mpeg4->load_nonintra_quant_mat,1); if ( syntax_mpeg4->load_nonintra_quant_mat ) for(i = 0; i < 64; i++) /* already in zigzag order */ bitbuffer_write(buff,syntax_mpeg4->nonintra_quant_mat[i],8); if( syntax_mpeg4->video_object_layer_shape == MPEG4_Video_Object_Layer_Shape_Grayscale ) { /* not supported */ } } if(syntax_mpeg4->video_object_layer_verid != 0x01) bitbuffer_write(buff,syntax_mpeg4->quarter_sample,1); bitbuffer_write(buff,syntax_mpeg4->complexity_estimation_disable,1); if(!syntax_mpeg4->complexity_estimation_disable) { /* TODO */ } bitbuffer_write(buff,syntax_mpeg4->resync_marker_disable,1); bitbuffer_write(buff,syntax_mpeg4->data_partitionned,1); if(syntax_mpeg4->data_partitionned) bitbuffer_write(buff,syntax_mpeg4->reversible_vlc,1); if (syntax_mpeg4->video_object_layer_verid != 0x01 ) { bitbuffer_write(buff,syntax_mpeg4->newpred_enable,1); if (syntax_mpeg4->newpred_enable) { /* TODO */ } bitbuffer_write(buff,syntax_mpeg4->reduced_resolution_vop_enable,1); } bitbuffer_write(buff,syntax_mpeg4->scalability,1); if (syntax_mpeg4->scalability) { /* TODO */ }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -