/*---- DXhead.h -------------------------------------------- decoder MPEG Layer III handle Xing header Copyright 1998 Xing Technology Corp. -----------------------------------------------------------*/ /* A Xing header may be present in the ancillary * data field of the first frame of an mp3 bitstream * The Xing header (optionally) contains * frames total number of audio frames in the bitstream * bytes total number of bytes in the bitstream * toc table of contents * toc (table of contents) gives seek points * for random access * the ith entry determines the seek point for * i-percent duration * seek point in bytes = (toc[i]/256.0) * total_bitstream_bytes * e.g. half duration seek point = (toc[50]/256.0) * total_bitstream_bytes */ #define FRAMES_FLAG 0x0001 #define BYTES_FLAG 0x0002 #define TOC_FLAG 0x0004 #define VBR_SCALE_FLAG 0x0008 #define FRAMES_AND_BYTES (FRAMES_FLAG | BYTES_FLAG) /* structure to receive extracted header * toc may be NULL */ typedef struct { int h_id; /* from MPEG header, 0=MPEG2, 1=MPEG1 */ int samprate; /* determined from MPEG header */ int flags; /* from Xing header data */ int frames; /* total bit stream frames from Xing header data */ int bytes; /* total bit stream bytes from Xing header data */ int vbr_scale; /* encoded vbr scale from Xing header data */ unsigned char *toc; /* pointer to unsigned char toc_buffer[100] */ /* may be NULL if toc not desired */ } XHEADDATA; int mpg123_get_xing_header(XHEADDATA * X, unsigned char *buf); /* return 0=fail, 1=success * X structure to receive header data (output) * buf bitstream input */ int mpg123_seek_point(unsigned char TOC[100], int file_bytes, float percent); /* return seekpoint in bytes (may be at eof if percent=100.0) * TOC = table of contents from Xing header * file_bytes = number of bytes in mp3 file * percent = play time percentage of total playtime. May be * fractional (e.g. 87.245) */ int mpg123_stream_check_for_xing_header(struct frame *fr, XHEADDATA * xhead);