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

📄 p64dump.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1993 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the Network Research *	Group at Lawrence Berkeley Laboratory. * 4. Neither the name of the University nor of the Laboratory may be used *    to endorse or promote products derived from this software without *    specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * This code is derived from (but bears little resemblance to) * the P64 software implementation by the Stanford PVRG group. * Their copyright applies herein: *  * Copyright (C) 1990, 1991, 1993 Andy C. Hung, all rights reserved. * PUBLIC DOMAIN LICENSE: Stanford University Portable Video Research * Group. If you use this software, you agree to the following: This * program package is purely experimental, and is licensed "as is". * Permission is granted to use, modify, and distribute this program * without charge for any purpose, provided this license/ disclaimer * notice appears in the copies.  No warranty or maintenance is given, * either expressed or implied.  In no event shall the author(s) be * liable to you or a third party for any special, incidental, * consequential, or other damages, arising out of the use or inability * to use the program for any purpose (or the loss of data), even if we * have been advised of such possibilities.  Any public reference or * advertisement of this source code should refer to it as the Portable * Video Research Group (PVRG) code, and not by any author(s) (or * Stanford University) name. */#include <stdarg.h>#include <stdio.h>#include <string.h>#ifndef WIN32#include <sys/param.h>#include <sys/file.h>#endif#include <sys/stat.h>#include "bsd-endian.h"#include "p64.h"#include "p64dump.h"#include "p64-huff.h"#include "dct.h"P64Dumper::P64Dumper(int q){	dump_quantized_ = q;}P64Dumper::P64Dumper(){	dump_quantized_ = 0;}#if BYTE_ORDER == LITTLE_ENDIAN#define HUFFRQ(bs, bb) \ { \	register int t = *bs++; \	bb <<= 16; \	bb |= (t & 0xff) << 8; \	bb |= t >> 8; \}#else#define HUFFRQ(bs, bb) \ { \	bb <<= 16; \	bb |= *bs++; \}#endif#define P64MASK(s) ((1 << (s)) - 1)#define HUFF_DECODE(bs, ht, nbb, bb, result) { \	register int s__, v__; \ \	if (nbb < 16) { \		HUFFRQ(bs, bb); \		nbb += 16; \	} \	s__ = ht.maxlen; \	v__ = (bb >> (nbb - s__)) & P64MASK(s__); \	s__ = (ht.prefix)[v__]; \	nbb -= (s__ & 0x1f); \	result = s__ >> 5; \ }#define GET_BITS(bs, n, nbb, bb, result) \{ \	nbb -= n; \	if (nbb < 0)  { \		HUFFRQ(bs, bb); \		nbb += 16; \	} \	(result) = ((bb >> nbb) & P64MASK(n)); \}#define SKIP_BITS(bs, n, nbb, bb) \{ \	nbb -= n; \	if (nbb < 0)  { \		HUFFRQ(bs, bb); \		nbb += 16; \	} \}#define DUMPBITS(c) dump_bits(c)void P64Dumper::dump_bits(char c){	int nbits = (bs_ - dbs_) * 16 + dnbb_ - nbb_;	int v;	printf("%d/", nbits);	while (nbits > 16) {		GET_BITS(dbs_, 16, dnbb_, dbb_, v);		printf("%04x", v);		nbits -= 16;	}	if (nbits > 0) {		GET_BITS(dbs_, nbits, dnbb_, dbb_, v);		if (nbits <= 4)			printf("%01x%c", v, c);		else if (nbits <= 8)			printf("%02x%c", v, c);		else if (nbits <= 12)			printf("%03x%c", v, c);		else			printf("%04x%c", v, c);	}}void P64Dumper::err(const char* msg ...) const{	va_list ap;	va_start(ap, msg);	printf("-err: ");	vfprintf(stdout, msg, ap);	printf(" @g%d m%d %d/%d of %d/%d: %04x %04x %04x %04x|%04x\n",		gob_, mba_,	       (u_char*)bs_ - (u_char*)ps_, nbb_,	       (u_char*)es_ - (u_char*)ps_, pebit_,	       bs_[-4], bs_[-3], bs_[-2], bs_[-1], bs_[0]);}/* * Decode the next block of transform coefficients * from the input stream. */#ifdef INT_64int P64Dumper::parse_block(short* blk, INT_64* mask)#elseint P64Dumper::parse_block(short* blk, u_int* mask)#endif{#ifdef INT_64	INT_64 m0 = 0;#else	u_int m1 = 0, m0 = 0;#endif	/*	 * Cache bit buffer in registers.	 */	register int nbb = nbb_;	register int bb = bb_;	register short* qt = qt_;	register int val = 0, k;	if ((mt_ & MT_CBP) == 0) {		int v;		GET_BITS(bs_, 8, nbb, bb, v);		val = v;		if (v == 255)			v = 128;		if (mt_ & MT_INTRA)			v <<= 3;		else			v = qt[v];		blk[0] = v;		k = 1;		m0 |= 1;	} else if ((bb >> (nbb - 1)) & 1) {		/*		 * In CBP blocks, the first block present must be		 * non-empty (otherwise it's mask bit wouldn't		 * be set), so the first code cannot be an EOB.		 * CCITT optimizes this case by using a huffman		 * table equivalent to ht_tcoeff_ but without EOB,		 * in which 1 is coded as "1" instead of "11".		 * We grab two bits, the first bit is the code		 * and the second is the sign.		 */		int v;		GET_BITS(bs_, 2, nbb, bb, v);		val = v;		/*XXX quantize?*/		blk[0] = qt[(v & 1) ? 0xff : 1];		k = 1;		m0 |= 1;	} else {		k = 0;#ifndef INT_64		blk[0] = 0;/*XXX need this because the way we set bits below*/#endif	}	if (k != 0) {		printf("0:%d ", dump_quantized_? val : blk[0]);	}	int nc = 0;	for (;;) {		int r, v;		HUFF_DECODE(bs_, ht_tcoeff_, nbb, bb, r);		if (r <= 0) {			/* SYM_EOB, SYM_ILLEGAL, or SYM_ESCAPE */			if (r == SYM_ESCAPE) {				GET_BITS(bs_, 14, nbb, bb, r);				v = r & 0xff;				r >>= 8;				val = v;			} else {				if (r == SYM_ILLEGAL) {					bb_ = bb;					nbb_ = nbb;					err("illegal symbol in block");				}				/* EOB */				break;			}		} else {			v = (r << 22) >> 27;			r = r & 0x1f;			val = v;		}		k += r;		if (k >= 64) {			bb_ = bb;			nbb_ = nbb;			err("bad run length %d (r %d, v %d)", k, r, v);			break;		}		printf("%d:%d ", k, dump_quantized_? val : qt[v & 0xff]);		r = COLZAG[k++];		blk[r] = qt[v & 0xff];		++nc;#ifdef INT_64		m0 |= (INT_64)1 << r;#else		/*		 * This sets bit "r" if r < 32, otherwise		 * it sets bit 0, but this is okay since		 * we always set blk[0] XXX		 */		m0 |= 1 << (r & ((r-32) >> 31));		/*		 * If r >= 32, this sets bit 64-r in m1.		 * Otherwise, it does nothing.		 */		r -= 32;		m1 |= (~r >> 31 & 1) << r;#endif	}	/*	 * Done reading input.  Update bit buffer.	 */	bb_ = bb;	nbb_ = nbb;	*mask = m0;#ifndef INT_64	mask[1] = m1;#endif	DUMPBITS('\n');	return (nc);}/* * Parse a picture header.  We assume that the * start code has already been snarfed. */int P64Dumper::parse_picture_hdr(){	int tr;	GET_BITS(bs_, 5, nbb_, bb_, tr);	int pt;	GET_BITS(bs_, 6, nbb_, bb_, pt);	u_int fmt = (pt >> 2) & 1;	if (fmt_ != fmt) {		err("unexpected picture type %d/%d", fmt, fmt_);		return (-1);	}	int v;	GET_BITS(bs_, 1, nbb_, bb_, v);	printf("pic tr %d pt 0x%02x x%d ", tr, pt, v);	while (v != 0) {		GET_BITS(bs_, 9, nbb_, bb_, v);		/*		 * XXX from pvrg code: 0x8c in PSPARE means ntsc.		 * this is a hack.  we don't support it.		 */		int pspare = v >> 1;		if (pspare == 0x8c && (pt & 0x04) != 0) {			static int first = 1;			if (first) {				err("pvrg ntsc not supported");				first = 0;			}		}		v &= 1;	}	return (0);}inline int P64Dumper::parse_sc(){	int v;	GET_BITS(bs_, 16, nbb_, bb_, v);	DUMPBITS('\n');	if (v != 0x0001) {		err("bad start code %04x", v);		++bad_psc_;		return (-1);	}	return (0);}/* * Parse a GOB header, which consists of the GOB quantiation * factor (GQUANT) and spare bytes that we ignore. */int P64Dumper::parse_gob_hdr(int ebit){	mba_ = -1;	mvdh_ = 0;	mvdv_ = 0;	/*	 * Get the next GOB number (or 0 for a picture header).	 * The invariant at the top of this loop is that the	 * bit stream is positioned immediately past the last

⌨️ 快捷键说明

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