📄 gethdr.c
字号:
/* 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 + -