www.pudn.com > jm50g.zip > sei.c
/* *********************************************************************** * COPYRIGHT AND WARRANTY INFORMATION * * Copyright 2001, International Telecommunications Union, Geneva * * DISCLAIMER OF WARRANTY * * These software programs are available to the user without any * license fee or royalty on an "as is" basis. The ITU disclaims * any and all warranties, whether express, implied, or * statutory, including any implied warranties of merchantability * or of fitness for a particular purpose. In no event shall the * contributor or the ITU 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 ITU does not represent or warrant that the programs furnished * hereunder are free of infringement of any third-party patents. * Commercial implementations of ITU-T Recommendations, including * shareware, may be subject to royalty fees to patent holders. * Information regarding the ITU-T patent policy is available from * the ITU Web site at http://www.itu.int. * * THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE ITU-T PATENT POLICY. ************************************************************************ */ #include "contributors.h" #include#include #include #include #include #include #include "global.h" #include "memalloc.h" #include "sei.h" /*! ************************************************************************ * \file sei.c * * \brief * Functions to implement SEI messages * * \author * Main contributors (see contributors.h for copyright, address and affiliation details) * - Dong Tian ************************************************************************ */ /*! ************************************************************************ * \basic functions on supplemental enhancement information * \brief * The implementations are based on FCD ************************************************************************ */ /*! ************************************************************************ * \InterpretSEIMessage * \brief * Interpret the SEI rbsp * \input * msg: a pointer that point to the sei message. * size: the size of the sei message * img: the image pointer * \output * ************************************************************************ */ void InterpretSEIMessage(byte* msg, int size, struct img_par *img) { int payload_type = 0; int payload_size = 0; int offset = 0; byte tmp_byte; do { // sei_message(); payload_type = 0; tmp_byte = msg[offset++]; while (tmp_byte == 0xFF) { payload_type += 255; tmp_byte = msg[offset++]; } payload_type += tmp_byte; // this is the last byte payload_size = 0; tmp_byte = msg[offset++]; while (tmp_byte == 0xFF) { payload_size += 255; tmp_byte = msg[offset++]; } payload_size += tmp_byte; // this is the last byte switch ( payload_type ) // sei_payload( type, size ); { case SEI_SPARE_PICTURE: interpret_spare_picture( msg+offset, payload_size, img ); break; case SEI_SUBSEQ_INFORMATION: interpret_subsequence_info( msg+offset, payload_size, img ); break; case SEI_SUBSEQ_LAYER_CHARACTERISTICS: interpret_subsequence_layer_info( msg+offset, payload_size, img ); break; case SEI_SUBSEQ_CHARACTERISTICS: interpret_subsequence_characteristics_info( msg+offset, payload_size, img ); break; case SEI_SCENE_INFORMATION: // JVT-D099 interpret_scene_information( msg+offset, payload_size, img ); break; case SEI_USER_DATA_REGISTERED_ITU_T_T35: interpret_user_data_registered_itu_t_t35_info( msg+offset, payload_size, img ); break; case SEI_USER_DATA_UNREGISTERED: interpret_user_data_unregistered_info( msg+offset, payload_size, img ); break; case SEI_PANSCAN_RECT: interpret_pan_scan_rect_info( msg+offset, payload_size, img ); break; case SEI_RANDOM_ACCESS_POINT: interpret_random_access_info( msg+offset, payload_size, img ); break; default: printf("The SEI type %d is not supported in JM yet.\n", payload_type); exit(0); break; } offset += payload_size; } while( msg[offset] != 0x80 ); // more_rbsp_data() msg[offset] != 0x80 // ignore the trailing bits rbsp_trailing_bits(); assert(msg[offset] == 0x80); // this is the trailing bits assert( offset+1 == size ); } void interpret_spare_picture( byte* payload, int size, struct img_par *img ) { int i,x,y; SyntaxElement sym; Bitstream* buf; int bit0, bit1, bitc, no_bit0; int delta_frame_num, CurrFrameNum, TargetFrameNum; int num_spare_pics; int delta_spare_frame_num, CandidateSpareFrameNum, SpareFrameNum; int ref_area_indicator; int m, n, left, right, top, bottom,directx, directy; byte ***map; // #define WRITE_MAP_IMAGE #ifdef WRITE_MAP_IMAGE int j, k, i0, j0, tmp, kk; char filename[20] = "map_dec.yuv"; FILE *fp; byte** Y; static int old_pn=-1; static int first = 1; #endif assert( payload!=NULL); assert( img!=NULL); CurrFrameNum = img->number % MAX_FN; // UVLC coded map: sym.type = SE_HEADER; // This will be true for all symbols generated here sym.mapping = linfo; // Mapping rule: Simple code number to len/info buf = malloc(sizeof(Bitstream)); buf->bitstream_length = size; buf->streamBuffer = payload; buf->frame_bitoffset = 0; sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; delta_frame_num = sym.value1; TargetFrameNum = CurrFrameNum - delta_frame_num; if( TargetFrameNum < 0 ) TargetFrameNum = MAX_FN + TargetFrameNum; #ifdef WRITE_MAP_IMAGE printf( "TargetFrameNum is %d\n", TargetFrameNum ); #endif sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; num_spare_pics = sym.value1 + 1; #ifdef WRITE_MAP_IMAGE printf( "num_spare_pics is %d\n", num_spare_pics ); #endif get_mem3D(&map, num_spare_pics, img->height/16, img->width/16); for (i=0; i streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; delta_spare_frame_num = sym.value1; SpareFrameNum = CandidateSpareFrameNum - delta_spare_frame_num; if( SpareFrameNum < 0 ) SpareFrameNum = MAX_FN + SpareFrameNum; sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; ref_area_indicator = sym.value1; switch ( ref_area_indicator ) { case 0: // The whole frame can serve as spare picture for (y=0; y height/16; y++) for (x=0; x width/16; x++) map[i][y][x] = 0; break; case 1: // The map is not compressed for (y=0; y height/16; y++) for (x=0; x width/16; x++) { sym.len = GetfixedSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length, 1); assert( sym.len == 1 ); map[i][y][x] = sym.inf; buf->frame_bitoffset += sym.len; } break; case 2: // The map is compressed bit0 = 0; bit1 = 1; bitc = bit0; no_bit0 = -1; x = ( img->width/16 - 1 ) / 2; y = ( img->height/16 - 1 ) / 2; left = right = x; top = bottom = y; directx = 0; directy = 1; for (m=0; m height/16; m++) for (n=0; n width/16; n++) { if (no_bit0<0) { sym.len = GetVLCSymbol( buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; no_bit0 = sym.value1; } if (no_bit0>0) map[i][y][x] = bit0; else map[i][y][x] = bit1; no_bit0--; // go to the next mb: if ( directx == -1 && directy == 0 ) { if (x > left) x--; else if (x == 0) { y = bottom + 1; bottom++; directx = 1; directy = 0; } else if (x == left) { x--; left--; directx = 0; directy = 1; } } else if ( directx == 1 && directy == 0 ) { if (x < right) x++; else if (x == img->width/16 - 1) { y = top - 1; top--; directx = -1; directy = 0; } else if (x == right) { x++; right++; directx = 0; directy = -1; } } else if ( directx == 0 && directy == -1 ) { if ( y > top) y--; else if (y == 0) { x = left - 1; left--; directx = 0; directy = 1; } else if (y == top) { y--; top--; directx = -1; directy = 0; } } else if ( directx == 0 && directy == 1 ) { if (y < bottom) y++; else if (y == img->height/16 - 1) { x = right+1; right++; directx = 0; directy = -1; } else if (y == bottom) { y++; bottom++; directx = 1; directy = 0; } } } break; default: printf( "Wrong ref_area_indicator %d!\n", ref_area_indicator ); exit(0); break; } } // end of num_spare_pics #ifdef WRITE_MAP_IMAGE // begin to write map seq if ( old_pn != img->number ) { old_pn = img->number; get_mem2D(&Y, img->height, img->width); if (first) { fp = fopen( filename, "wb" ); first = 0; } else fp = fopen( filename, "ab" ); assert( fp != NULL ); for (kk=0; kk height/16; i++) for (j=0; j < img->width/16; j++) { tmp=map[kk][i][j]==0? 255 : 0; for (i0=0; i0<16; i0++) for (j0=0; j0<16; j0++) Y[i*16+i0][j*16+j0]=tmp; } // write the map image for (i=0; i < img->height; i++) for (j=0; j < img->width; j++) fputc(Y[i][j], fp); for (k=0; k < 2; k++) for (i=0; i < img->height/2; i++) for (j=0; j < img->width/2; j++) fputc(128, fp); } fclose( fp ); free_mem2D( Y ); } // end of writing map image #undef WRITE_MAP_IMAGE #endif free_mem3D( map, num_spare_pics ); free(buf); } void interpret_subsequence_info( byte* payload, int size, struct img_par *img ) { SyntaxElement sym; Bitstream* buf; int subseq_layer_num, subseq_id, last_picture_flag, stored_frame_cnt; // #define PRINT_SUBSEQUENCE_INFO sym.type = SE_HEADER; sym.mapping = linfo; buf = malloc(sizeof(Bitstream)); buf->bitstream_length = size; buf->streamBuffer = payload; buf->frame_bitoffset = 0; sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; subseq_layer_num = sym.value1; #ifdef PRINT_SUBSEQUENCE_INFO printf("subseq_layer_num = %d\n", subseq_layer_num ); #endif sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; subseq_id = sym.value1; #ifdef PRINT_SUBSEQUENCE_INFO printf("subseq_id = %d\n", subseq_id); #endif sym.len = GetfixedSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length, 1); assert( sym.len == 1 ); buf->frame_bitoffset += sym.len; last_picture_flag = sym.inf; #ifdef PRINT_SUBSEQUENCE_INFO printf("last_picture_flag = %d\n", last_picture_flag); #endif if (buf->frame_bitoffset/8 < size) // more_rbsp_data() { sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; stored_frame_cnt = sym.value1; #ifdef PRINT_SUBSEQUENCE_INFO printf("stored_frame_cnt = %d\n", stored_frame_cnt); #endif } free(buf); #ifdef PRINT_SUBSEQUENCE_INFO #undef PRINT_SUBSEQUENCE_INFO #endif } void interpret_subsequence_layer_info( byte* payload, int size, struct img_par *img ) { int offset = 0; unsigned short bitrate, framerate; int i = 0; // #define PRINT_SUBSEQUENCE_CHAR while (offset < size) { bitrate = *(unsigned short*)&payload[offset]; offset += 2; framerate = *(unsigned short*)&payload[offset]; offset += 2; #ifdef PRINT_SUBSEQUENCE_CHAR printf("layer %d, bitrate = %d, framerate = %d\n", i++, bitrate, framerate); #endif } } void interpret_subsequence_characteristics_info( byte* payload, int size, struct img_par *img ) { SyntaxElement sym; Bitstream* buf; int i; int subseq_layer_num, subseq_id, duration_flag, subseq_duration, average_rate_flag, average_bit_rate, average_frame_rate; int num_referenced_subseqs, ref_subseq_layer_num, ref_subseq_id; // #define PRINT_SUBSEQUENCE_CHAR sym.type = SE_HEADER; sym.mapping = linfo; buf = malloc(sizeof(Bitstream)); buf->bitstream_length = size; buf->streamBuffer = payload; buf->frame_bitoffset = 0; sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; subseq_layer_num = sym.value1; #ifdef PRINT_SUBSEQUENCE_CHAR printf("subseq_layer_num = %d\n", subseq_layer_num ); #endif sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; subseq_id = sym.value1; #ifdef PRINT_SUBSEQUENCE_CHAR printf("subseq_id = %d\n", subseq_id); #endif sym.len = GetfixedSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length, 1); assert( sym.len == 1 ); buf->frame_bitoffset += sym.len; duration_flag = sym.inf; #ifdef PRINT_SUBSEQUENCE_CHAR printf("duration_flag = %d\n", duration_flag); #endif if ( duration_flag ) { sym.len = GetfixedSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length, 32); assert( sym.len == 32 ); buf->frame_bitoffset += sym.len; subseq_duration = sym.inf; #ifdef PRINT_SUBSEQUENCE_CHAR printf("subseq_duration = %d\n", subseq_duration); #endif } sym.len = GetfixedSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length, 1); assert( sym.len == 1 ); buf->frame_bitoffset += sym.len; average_rate_flag = sym.inf; #ifdef PRINT_SUBSEQUENCE_CHAR printf("average_rate_flag = %d\n", average_rate_flag); #endif if ( average_rate_flag ) { sym.len = GetfixedSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length, 16); assert( sym.len == 16 ); buf->frame_bitoffset += sym.len; average_bit_rate = sym.inf; #ifdef PRINT_SUBSEQUENCE_CHAR printf("average_bit_rate = %d\n", average_bit_rate); #endif sym.len = GetfixedSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length, 16); assert( sym.len == 16 ); buf->frame_bitoffset += sym.len; average_frame_rate = sym.inf; #ifdef PRINT_SUBSEQUENCE_CHAR printf("average_frame_rate = %d\n", average_frame_rate); #endif } sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; num_referenced_subseqs = sym.value1; #ifdef PRINT_SUBSEQUENCE_CHAR printf("num_referenced_subseqs = %d\n", num_referenced_subseqs); #endif for (i=0; i streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; ref_subseq_layer_num = sym.value1; #ifdef PRINT_SUBSEQUENCE_CHAR printf("ref_subseq_layer_num = %d\n", ref_subseq_layer_num); #endif sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; ref_subseq_id = sym.value1; #ifdef PRINT_SUBSEQUENCE_CHAR printf("ref_subseq_id = %d\n", ref_subseq_id); #endif } free( buf ); #ifdef PRINT_SUBSEQUENCE_CHAR #undef PRINT_SUBSEQUENCE_CHAR #endif } // JVT-D099 void interpret_scene_information( byte* payload, int size, struct img_par *img ) { SyntaxElement sym; Bitstream* buf; int scene_id, scene_transition_type, second_scene_id; // #define PRINT_SCENE_INFORMATION sym.type = SE_HEADER; sym.mapping = linfo; buf = malloc(sizeof(Bitstream)); buf->bitstream_length = size; buf->streamBuffer = payload; buf->frame_bitoffset = 0; sym.len = GetfixedSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length, 8); assert( sym.len == 8 ); buf->frame_bitoffset += sym.len; scene_id = sym.inf; #ifdef PRINT_SCENE_INFORMATION printf("scene_id = %d\n", scene_id); #endif sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; scene_transition_type = sym.value1; #ifdef PRINT_SCENE_INFORMATION printf("scene_transition_type = %d\n", scene_transition_type); #endif if ( scene_transition_type > 3 ) { sym.len = GetfixedSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length, 8); assert( sym.len == 8 ); buf->frame_bitoffset += sym.len; second_scene_id = sym.inf; #ifdef PRINT_SCENE_INFORMATION printf("second_scene_id = %d\n", second_scene_id); #endif } free( buf ); #ifdef PRINT_SCENE_INFORMATION #undef PRINT_SCENE_INFORMATION #endif } // End JVT-D099 void interpret_user_data_unregistered_info( byte* payload, int size, struct img_par *img ) { int offset = 0; byte payload_byte; // #define PRINT_USER_DATA_UNREGISTERED_INFO while (offset < size) { payload_byte = *(byte*)&payload[offset]; offset ++; #ifdef PRINT_USER_DATA_UNREGISTERED_INFO printf("Unreg data payload_byte = %d\n", payload_byte); #endif } #ifdef PRINT_USER_DATA_UNREGISTERED_INFO #undef PRINT_USER_DATA_UNREGISTERED_INFO #endif } void interpret_user_data_registered_itu_t_t35_info( byte* payload, int size, struct img_par *img ) { int offset = 0; byte itu_t_t35_country_code, itu_t_t35_country_code_extension_byte, payload_byte; // #define PRINT_USER_DATA_REGISTERED_ITU_T_T35_INFO itu_t_t35_country_code = *(byte*)&payload[offset]; offset++; #ifdef PRINT_USER_DATA_REGISTERED_ITU_T_T35_INFO printf(" ITU_T_T35_COUNTRTY_CODE %d \n", itu_t_t35_country_code); #endif if(itu_t_t35_country_code == 0xFF) { itu_t_t35_country_code_extension_byte = *(byte*)&payload[offset]; offset++; #ifdef PRINT_USER_DATA_REGISTERED_ITU_T_T35_INFO printf(" ITU_T_T35_COUNTRTY_CODE_EXTENSION_BYTE %d \n", itu_t_t35_country_code_extension_byte); #endif } while (offset < size) { payload_byte = *(byte*)&payload[offset]; offset ++; #ifdef PRINT_USER_DATA_REGISTERED_ITU_T_T35_INFO printf("itu_t_t35 payload_byte = %d\n", payload_byte); #endif } #ifdef PRINT_USER_DATA_REGISTERED_ITU_T_T35_INFO #undef PRINT_USER_DATA_REGISTERED_ITU_T_T35_INFO #endif } void interpret_pan_scan_rect_info( byte* payload, int size, struct img_par *img ) { int pan_scan_rect_id, pan_scan_rect_left_offset, pan_scan_rect_right_offset; int pan_scan_rect_top_offset, pan_scan_rect_bottom_offset; SyntaxElement sym; Bitstream* buf; // UVLC coded map: sym.type = SE_HEADER; sym.mapping = linfo; buf = malloc(sizeof(Bitstream)); buf->bitstream_length = size; buf->streamBuffer = payload; buf->frame_bitoffset = 0; sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; pan_scan_rect_id = sym.value1; sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; pan_scan_rect_left_offset = sym.value1; sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; pan_scan_rect_right_offset = sym.value1; sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; pan_scan_rect_top_offset = sym.value1; sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; pan_scan_rect_bottom_offset = sym.value1; // #define PRINT_PAN_SCAN_RECT #ifdef PRINT_PAN_SCAN_RECT printf("Pan Scan Id %d Left %d Right %d Top %d Bottom %d \n", pan_scan_rect_id, pan_scan_rect_left_offset, pan_scan_rect_right_offset, pan_scan_rect_top_offset, pan_scan_rect_bottom_offset); #endif #ifdef PRINT_PAN_SCAN_RECT #undef PRINT_PAN_SCAN_RECT #endif } void interpret_random_access_info( byte* payload, int size, struct img_par *img ) { int recovery_point_flag, exact_match_flag, broken_link_flag; SyntaxElement sym; Bitstream* buf; // UVLC coded map: sym.type = SE_HEADER; sym.mapping = linfo; buf = malloc(sizeof(Bitstream)); buf->bitstream_length = size; buf->streamBuffer = payload; buf->frame_bitoffset = 0; sym.len = GetVLCSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length ); sym.mapping(sym.len, sym.inf, &(sym.value1), &(sym.value2)); buf->frame_bitoffset += sym.len; recovery_point_flag = sym.value1; sym.len = GetfixedSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length, 1); //u(1) assert( sym.len == 1 ); exact_match_flag = sym.inf; buf->frame_bitoffset += sym.len; sym.len = GetfixedSymbol(buf->streamBuffer, buf->frame_bitoffset, &sym.inf, buf->bitstream_length, 1); //u(1) assert( sym.len == 1 ); broken_link_flag = sym.inf; buf->frame_bitoffset += sym.len; // #define PRINT_RANDOM_ACCESS #ifdef PRINT_RANDOM_ACCESS printf(" recovery_point_flag %d exact_match_flag %d broken_link_flag %d \n", recovery_point_flag, exact_match_flag, broken_link_flag); printf(" %d \n", buf->frame_bitoffset); #endif #ifdef PRINT_RANDOM_ACCESS #undef PRINT_RANDOM_ACCESS #endif }