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

📄 fame_syntax_mpeg4.c

📁 一个很好用的MPEG1/4的开源编码器
💻 C
📖 第 1 页 / 共 5 页
字号:
  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 + -