Blame src/libmpg123/mpeghead.h

Packit c32a2d
/*
Packit c32a2d
	mpeghead: the bits of an MPEG frame header
Packit c32a2d
Packit c32a2d
	copyright ?-2011 by the mpg123 project - free software under the terms of the LGPL 2.1
Packit c32a2d
	see COPYING and AUTHORS files in distribution or http://mpg123.org
Packit c32a2d
	initially written by Michael Hipp & Thomas Orgis (from parse.c)
Packit c32a2d
*/
Packit c32a2d
#ifndef MPG123_MPEGHEAD_H
Packit c32a2d
#define MPG123_MPEGHEAD_H
Packit c32a2d
Packit c32a2d
/*
Packit c32a2d
	Avoid human error, let perl do the work of dissecting an MPEG header into parts.
Packit c32a2d
	To be clear: Never edit the following definitions by hand, modify the code block inside this comment and run it through perl instead!
Packit c32a2d
Packit c32a2d
	$head = "AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM";
Packit c32a2d
	%parts = qw(A sync B version C layer D crc E bitrate F samplerate G padding H private I channel J chanex K copyright L original M emphasis);
Packit c32a2d
	for(sort keys %parts)
Packit c32a2d
	{
Packit c32a2d
		$name = uc($parts{$_});
Packit c32a2d
		$bits = $head;
Packit c32a2d
		$bits =~ s/$_/1/g;
Packit c32a2d
		$bits =~ s/[^1 ]/0/g;
Packit c32a2d
		print "\/\* $bits \*\/\n";
Packit c32a2d
		$bits =~ s/\s//g;
Packit c32a2d
		print "#define HDR_$name".(" " x (18-length($name))).sprintf("0x%08x", eval("0b$bits"))."\n";
Packit c32a2d
		$bits =~ m/(0*)$/;
Packit c32a2d
		print "#define HDR_${name}_VAL(h)".(" " x (11-length($name)))."(((h)\&HDR_$name) >> ".length($1).")\n";
Packit c32a2d
	}
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
/* 11111111 11100000 00000000 00000000 */
Packit c32a2d
#define HDR_SYNC              0xffe00000
Packit c32a2d
#define HDR_SYNC_VAL(h)       (((h)&HDR_SYNC) >> 21)
Packit c32a2d
/* 00000000 00011000 00000000 00000000 */
Packit c32a2d
#define HDR_VERSION           0x00180000
Packit c32a2d
#define HDR_VERSION_VAL(h)    (((h)&HDR_VERSION) >> 19)
Packit c32a2d
/* 00000000 00000110 00000000 00000000 */
Packit c32a2d
#define HDR_LAYER             0x00060000
Packit c32a2d
#define HDR_LAYER_VAL(h)      (((h)&HDR_LAYER) >> 17)
Packit c32a2d
/* 00000000 00000001 00000000 00000000 */
Packit c32a2d
#define HDR_CRC               0x00010000
Packit c32a2d
#define HDR_CRC_VAL(h)        (((h)&HDR_CRC) >> 16)
Packit c32a2d
/* 00000000 00000000 11110000 00000000 */
Packit c32a2d
#define HDR_BITRATE           0x0000f000
Packit c32a2d
#define HDR_BITRATE_VAL(h)    (((h)&HDR_BITRATE) >> 12)
Packit c32a2d
/* 00000000 00000000 00001100 00000000 */
Packit c32a2d
#define HDR_SAMPLERATE        0x00000c00
Packit c32a2d
#define HDR_SAMPLERATE_VAL(h) (((h)&HDR_SAMPLERATE) >> 10)
Packit c32a2d
/* 00000000 00000000 00000010 00000000 */
Packit c32a2d
#define HDR_PADDING           0x00000200
Packit c32a2d
#define HDR_PADDING_VAL(h)    (((h)&HDR_PADDING) >> 9)
Packit c32a2d
/* 00000000 00000000 00000001 00000000 */
Packit c32a2d
#define HDR_PRIVATE           0x00000100
Packit c32a2d
#define HDR_PRIVATE_VAL(h)    (((h)&HDR_PRIVATE) >> 8)
Packit c32a2d
/* 00000000 00000000 00000000 11000000 */
Packit c32a2d
#define HDR_CHANNEL           0x000000c0
Packit c32a2d
#define HDR_CHANNEL_VAL(h)    (((h)&HDR_CHANNEL) >> 6)
Packit c32a2d
/* 00000000 00000000 00000000 00110000 */
Packit c32a2d
#define HDR_CHANEX            0x00000030
Packit c32a2d
#define HDR_CHANEX_VAL(h)     (((h)&HDR_CHANEX) >> 4)
Packit c32a2d
/* 00000000 00000000 00000000 00001000 */
Packit c32a2d
#define HDR_COPYRIGHT         0x00000008
Packit c32a2d
#define HDR_COPYRIGHT_VAL(h)  (((h)&HDR_COPYRIGHT) >> 3)
Packit c32a2d
/* 00000000 00000000 00000000 00000100 */
Packit c32a2d
#define HDR_ORIGINAL          0x00000004
Packit c32a2d
#define HDR_ORIGINAL_VAL(h)   (((h)&HDR_ORIGINAL) >> 2)
Packit c32a2d
/* 00000000 00000000 00000000 00000011 */
Packit c32a2d
#define HDR_EMPHASIS          0x00000003
Packit c32a2d
#define HDR_EMPHASIS_VAL(h)   (((h)&HDR_EMPHASIS) >> 0)
Packit c32a2d
Packit c32a2d
/*
Packit c32a2d
	A generic mask for telling if a header is somewhat valid for the current stream.
Packit c32a2d
	Meaning: Most basic info is not allowed to change.
Packit c32a2d
	Checking of channel count needs to be done, too, though. So,
Packit c32a2d
	if channel count matches, frames are decoded the same way: frame buffers and decoding
Packit c32a2d
	routines can stay the same, especially frame buffers (think spf * channels!).
Packit c32a2d
*/
Packit c32a2d
#define HDR_CMPMASK (HDR_SYNC|HDR_VERSION|HDR_LAYER|HDR_SAMPLERATE)
Packit c32a2d
Packit c32a2d
/* A stricter mask, for matching free format headers. */
Packit c32a2d
#define HDR_SAMEMASK (HDR_SYNC|HDR_VERSION|HDR_LAYER|HDR_BITRATE|HDR_SAMPLERATE|HDR_CHANNEL)
Packit c32a2d
Packit c32a2d
/* Free format headers have zero bitrate value. */
Packit c32a2d
#define HDR_FREE_FORMAT(head) (!(head & HDR_BITRATE))
Packit c32a2d
Packit c32a2d
/* A mask for changed sampling rate (version or rate bits). */
Packit c32a2d
#define HDR_SAMPMASK (HDR_VERSION|HDR_SAMPLERATE)
Packit c32a2d
Packit c32a2d
#endif