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

📄 gethdr.c

📁 MPEG-2 has 7 distinct parts as well. The first part is the Systems section which defines the contain
💻 C
📖 第 1 页 / 共 2 页
字号:
/* gethdr.c, header decoding                                                *//* Copyright (C) 1994, MPEG Software Simulation Group. All Rights Reserved. *//* * Disclaimer of Warranty * * These software programs are available to the user without any license fee or * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims * any and all warranties, whether express, implied, or statuary, including any * implied warranties or merchantability or of fitness for a particular * purpose.  In no event shall the copyright-holder be liable for any * incidental, punitive, or consequential damages of any kind whatsoever * arising from the use of these programs. * * This disclaimer of warranty extends to the user of these programs and user's * customers, employees, agents, transferees, successors, and assigns. * * The MPEG Software Simulation Group does not represent or warrant that the * programs furnished hereunder are free of infringement of any third-party * patents. * * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, * are subject to royalty fees to patent holders.  Many of these patents are * general enough such that they are unavoidable regardless of implementation * design. * */#include <stdio.h>#include "config.h"#include "global.h"/* private prototypes */static int gethdr _ANSI_ARGS_((void));static void getseqhdr _ANSI_ARGS_((void));static void getgophdr _ANSI_ARGS_((void));static void getpicturehdr _ANSI_ARGS_((void));static void ext_user_data _ANSI_ARGS_((void));static void sequence_extension _ANSI_ARGS_((void));static void sequence_display_extension _ANSI_ARGS_((void));static void quant_matrix_extension _ANSI_ARGS_((void));static void sequence_scalable_extension _ANSI_ARGS_((void));static void picture_display_extension _ANSI_ARGS_((void));static void picture_coding_extension _ANSI_ARGS_((void));static void picture_spatial_scalable_extension _ANSI_ARGS_((void));static void picture_temporal_scalable_extension _ANSI_ARGS_((void));static void ext_bit_info _ANSI_ARGS_((void));/* decode headers from all input streams */int getheader(){  int ret;  ld = &base;  ret = gethdr();  if (twostreams)  {    ld = &enhan;    if (gethdr()!=ret && !quiet)      fprintf(stderr,"streams out of sync\n");    ld = &base;  }  return ret;}/* * decode headers from one input stream * until an End of Sequence or picture start code * is found */static int gethdr(){  unsigned int code;  for (;;)  {    /* look for startcode */    startcode();    code = getbits(32);    switch (code)    {    case SEQ_START_CODE:      getseqhdr();      break;    case GOP_START_CODE:      getgophdr();      break;    case PICTURE_START_CODE:      getpicturehdr();      return 1;      break;    case SEQ_END_CODE:      return 0;      break;    default:      if (!quiet)        fprintf(stderr,"Unexpected startcode %08x (ignored)\n",code);      break;    }  }}/* align to start of next startcode */void startcode(){  /* byte align */  flushbits(ld->incnt&7);  while (showbits(24)!=1l)    flushbits(8);}/* decode sequence header */static void getseqhdr(){  int i;  int constrained_parameters_flag;  int load_intra_quantizer_matrix, load_non_intra_quantizer_matrix;  int pos;  pos = ld->bitcnt;  horizontal_size = getbits(12);  vertical_size = getbits(12);  aspect_ratio = getbits(4);  picture_rate = getbits(4);  bit_rate_value = getbits(18);  flushbits(1); /* marker bit (=1) */  vbv_buffer_size = getbits(10);  constrained_parameters_flag = getbits(1);  if (load_intra_quantizer_matrix = getbits(1))  {    for (i=0; i<64; i++)      ld->intra_quantizer_matrix[zig_zag_scan[i]] = getbits(8);  }  else  {    for (i=0; i<64; i++)      ld->intra_quantizer_matrix[i] = default_intra_quantizer_matrix[i];  }  if (load_non_intra_quantizer_matrix = getbits(1))  {    for (i=0; i<64; i++)      ld->non_intra_quantizer_matrix[zig_zag_scan[i]] = getbits(8);  }  else  {    for (i=0; i<64; i++)      ld->non_intra_quantizer_matrix[i] = 16;  }  /* copy luminance to chrominance matrices */  for (i=0; i<64; i++)  {    ld->chroma_intra_quantizer_matrix[i] =      ld->intra_quantizer_matrix[i];    ld->chroma_non_intra_quantizer_matrix[i] =      ld->non_intra_quantizer_matrix[i];  }  if (verbose>0)  {    printf("sequence header (byte %d)\n",(pos>>3)-4);    if (verbose>1)    {      printf("  horizontal_size=%d\n",horizontal_size);      printf("  vertical_size=%d\n",vertical_size);      printf("  aspect_ratio=%d\n",aspect_ratio);      printf("  picture_rate=%d\n",picture_rate);      printf("  bit_rate_value=%d\n",bit_rate_value);      printf("  vbv_buffer_size=%d\n",vbv_buffer_size);      printf("  constrained_parameters_flag=%d\n",constrained_parameters_flag);      printf("  load_intra_quantizer_matrix=%d\n",load_intra_quantizer_matrix);      printf("  load_non_intra_quantizer_matrix=%d\n",load_non_intra_quantizer_matrix);    }  }  ext_user_data();}/* decode group of pictures header */static void getgophdr(){  int drop_flag, hour, minute, sec, frame, closed_gop, broken_link;  int pos;  pos = ld->bitcnt;  drop_flag = getbits(1);  hour = getbits(5);  minute = getbits(6);  flushbits(1);  sec = getbits(6);  frame = getbits(6);  closed_gop = getbits(1);  broken_link = getbits(1);  if (verbose>0)  {    printf("group of pictures (byte %d)\n",(pos>>3)-4);    if (verbose>1)    {      printf("  drop_flag=%d\n",drop_flag);      printf("  timecode %d:%02d:%02d:%02d\n",hour,minute,sec,frame);      printf("  closed_gop=%d\n",closed_gop);      printf("  broken_link=%d\n",broken_link);    }  }  ext_user_data();}/* decode picture header */static void getpicturehdr(){  int pos;  ld->pict_scal = 0; /* unless overwritten by pict. spat. scal. ext. */  pos = ld->bitcnt;  temp_ref = getbits(10);  pict_type = getbits(3);  vbv_delay = getbits(16);  if (pict_type==P_TYPE || pict_type==B_TYPE)  {    full_forw = getbits(1);    forw_r_size = getbits(3) - 1;  }  if (pict_type==B_TYPE)  {    full_back = getbits(1);    back_r_size = getbits(3) - 1;  }  if (verbose>0)  {    printf("picture header (byte %d)\n",(pos>>3)-4);    if (verbose>1)    {      printf("  temp_ref=%d\n",temp_ref);      printf("  pict_type=%d\n",pict_type);      printf("  vbv_delay=%d\n",vbv_delay);      if (pict_type==P_TYPE || pict_type==B_TYPE)      {        printf("  full_forw=%d\n",full_forw);        printf("  forw_r_size=%d\n",forw_r_size);      }      if (pict_type==B_TYPE)      {        printf("  full_back=%d\n",full_back);        printf("  back_r_size=%d\n",back_r_size);      }    }  }  ext_bit_info();  ext_user_data();}/* decode slice header */int getslicehdr(){  int slice_vertical_position_extension;  int qs;  int pos;  pos = ld->bitcnt;  slice_vertical_position_extension =    (ld->mpeg2 && vertical_size>2800) ? getbits(3) : 0;  if (ld->scalable_mode==SC_DP)    ld->pri_brk = getbits(7);  qs = getbits(5);  ld->quant_scale =    ld->mpeg2 ? (ld->qscale_type ? non_linear_mquant_table[qs] : qs<<1) : qs;  if (getbits(1))  {    ld->intra_slice = getbits(1);    flushbits(7);    ext_bit_info();  }  else    ld->intra_slice = 0;  if (verbose>2)  {    printf("slice header (byte %d)\n",(pos>>3)-4);    if (verbose>3)    {      if (ld->mpeg2 && vertical_size>2800)        printf("  slice_vertical_position_extension=%d\n",slice_vertical_position_extension);      if (ld->scalable_mode==SC_DP)        printf("  priority_breakpoint=%d\n",ld->pri_brk);      printf("  quantizer_scale_code=%d\n",qs);    }  }  return slice_vertical_position_extension;}/* decode extension and user data */static void ext_user_data(){  int code,ext_ID;  startcode();  while ((code = showbits(32))==EXT_START_CODE || code==USER_START_CODE)  {    if (code==EXT_START_CODE)    {      flushbits(32);      ext_ID = getbits(4);      switch (ext_ID)      {      case SEQ_ID:        sequence_extension();        break;      case DISP_ID:        sequence_display_extension();        break;      case QUANT_ID:        quant_matrix_extension();        break;      case SEQSCAL_ID:        sequence_scalable_extension();        break;      case PANSCAN_ID:        picture_display_extension();        break;      case CODING_ID:        picture_coding_extension();        break;      case SPATSCAL_ID:        picture_spatial_scalable_extension();        break;      case TEMPSCAL_ID:        picture_temporal_scalable_extension();        break;      default:        fprintf(stderr,"reserved extension start code ID %d\n",ext_ID);        break;      }      startcode();    }    else    {      if (verbose)        printf("user data\n");      flushbits(32);      startcode();    }  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -