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

📄 parsemp4dsi.c

📁 Sample code for use on smp 863x processor.
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************** Copyright © 2001-2003	 Sigma Designs, Inc. All Rights Reserved Proprietary and Confidential *****************************************/#include "../rua/include/rua.h"#include "parsemp4dsi.h"#define DBG_MAX_STRING 2000#if 0#define TRACE ENABLE#else#define TRACE DISABLE#endif//MPEG 4 visual object defines#define VIDEO_OBJECT_SEQUENCE_START_CODE        0x000001B0      // reserved in Mpeg2#define VIDEO_OBJECT_SEQUENCE_END_CODE          0x000001B1      // reserved in Mpeg2#define USER_DATA_START_CODE                    0x000001B2      // same as Mpeg2#define GROUP_VOP_START_CODE                    0x000001B3      // SEQUENCE_HEADER for Mpeg2#define VIDEO_SESSION_ERROR_CODE                0x000001B4      // SEQUENCE_ERROR_CODE for Mpeg2#define VISUAL_OBJECT_START_CODE                0x000001B5      // EXTENSION_START_CODE for Mpeg2#define VIDEO_OBJECT_START_CODE_BEGIN           0x00000100      // ??#define VOP_START_CODE                          0x000001B6      // reserved in Mpeg2// 0x000001B6 - 0x000001B9 reserved for Mpeg4#define FACE_OBJECT_START_CODE                  0x000001BA      // PACK_START_CODE for Mpeg2#define FACE_OBJECT_PLANE_START_CODE            0x000001BB      // SYSTEM_START_CODE for Mpeg2#define MESH_OBJECT_START_CODE                  0x000001BC      // PROGRAM_STREAM_MAP for Mpeg2#define MESH_OBJECT_PLANE_START_CODE            0x000001BD      // PRIVATE_STREAM_1 for Mpeg2#define STILL_TEXTURE_OBJECT_START_CODE         0x000001BE      // PADDING_STREAM for Mpeg2#define TEXTURE_SPATIAL_LAYER_START_CODE        0x000001BF      // PRIVATE_STREAM_2 for Mpeg2#define TEXTURE_SNR_LAYER_START_CODE            0x000001C0      // AUDIO_STREAM for Mpeg2// 0x000001C1 - 0x000001C5 reserved for Mpeg4// TBD system start codes 0x000001C6 - 0x000001FF	// AUDIO_STREAM for Mpeg2struct BitStreamParserContext {	RMuint32 m_incnt;	RMuint8 *m_rdbfr;	RMuint32 m_rdbfr_length;	RMuint8 *m_rdptr;	RMuint8 *m_rdmax;	RMuint32 m_bitcnt;	RMuint32 m_bfr;	};// return next n bits (right adjusted) without advancingstatic RMuint32 hwl_showbits (struct BitStreamParserContext *pContext, RMuint32 n){	return pContext->m_bfr >> (32-n);}// advance by n bitsstatic void hwl_flushbits (struct BitStreamParserContext *pContext, RMuint32 n, RMuint32 *Err){	RMuint32 incnt;	if(n<=31)		pContext->m_bfr <<= n;	else		pContext->m_bfr = 0;	incnt = pContext->m_incnt -= n;	if (incnt <= 24)	{		if (pContext->m_rdptr < pContext->m_rdbfr + (pContext->m_rdbfr_length - 4))		{			do			{				pContext->m_bfr |= *(pContext->m_rdptr++) << (24 - incnt);				incnt += 8;			}			while (incnt <= 24);		}		else		{			do			{				if (pContext->m_rdptr >= pContext->m_rdbfr + pContext->m_rdbfr_length)				{					(*Err)++;					pContext->m_bfr |= 0 << (24 - incnt);				}				else					pContext->m_bfr |= *(pContext->m_rdptr++) << (24 - incnt);				incnt += 8;			}			while (incnt <= 24);		}		pContext->m_incnt = incnt;	}}// return next n bits (right adjusted) + advancestatic RMuint32 hwl_getbits (struct BitStreamParserContext *pContext, RMuint32 n, RMuint32 *Err){	RMuint32 l;	l = hwl_showbits (pContext, n);	hwl_flushbits (pContext, n, Err);	return l;}// hwl_align to the next bytestatic void hwl_align (struct BitStreamParserContext *pContext, RMuint32 *Err){	RMuint32 incnt;	if (pContext->m_incnt != 32)	{		incnt = pContext->m_incnt % 8;		hwl_flushbits (pContext, incnt, Err);	}}static void BitStream (struct BitStreamParserContext *pContext, RMuint8 *pBuffer, RMuint32 Length, RMuint32 *Err){	pContext->m_rdbfr = pBuffer;	pContext->m_rdbfr_length = Length;	pContext->m_incnt = 0;	pContext->m_rdptr = pContext->m_rdbfr + pContext->m_rdbfr_length;	pContext->m_rdmax = pContext->m_rdptr;	pContext->m_bitcnt = 0;	pContext->m_bfr = 0;	pContext->m_rdptr = pContext->m_rdbfr;	hwl_flushbits (pContext, 0, Err);}RMstatus ParseMP4VideoDSI(void* pDsiIn, RMuint32 dwDsiInSize, void* pDsiOut, RMuint32 dwDsiOutSize){	RMuint32 Err = 0;	RMuint32 vop_time_increment_resolution;	RMuint32 temp;	struct BitStreamParserContext BitParserContext; 	if( (pDsiIn == NULL) || (dwDsiInSize == 0) )	{		RMDBGLOG((TRACE,"NULL DSI\n"));		return RM_ERROR;	} 	if( (pDsiOut == NULL) || (dwDsiOutSize == 0) )	{		RMDBGLOG((TRACE, "NULL DSIout\n"));		return RM_ERROR;	}	BitStream (&BitParserContext, (RMuint8*)pDsiIn, dwDsiInSize, &Err);	temp = hwl_getbits(&BitParserContext,32,&Err);	// visual_object_sequence_start_code	if( !Err && (temp != VIDEO_OBJECT_SEQUENCE_START_CODE) )	{		if( (temp & 0x000001E0) == VIDEO_OBJECT_START_CODE_BEGIN )	// vweb files			goto VideoObjectLayer;		if (temp == VISUAL_OBJECT_START_CODE)			goto VisualObject;	}	if( Err || (temp != VIDEO_OBJECT_SEQUENCE_START_CODE) )	{		RMDBGLOG((TRACE, "NO VIDEO_OBJECT_SEQUENCE_START_CODE\n"));		return RM_ERROR;	}	temp = hwl_getbits(&BitParserContext,8,&Err);	// profile_and_level_indication	if( Err )	{		RMDBGLOG((TRACE, "NO profile_and_level_indication\n"));		return RM_ERROR;	}	while( (temp = hwl_showbits(&BitParserContext,32)) != VISUAL_OBJECT_START_CODE)	{		temp = hwl_getbits(&BitParserContext,8,&Err);	// USER_DATA_START_CODE, user data		if( Err )		{			RMDBGLOG((TRACE, "NO VISUAL_OBJECT_START_CODE\n"));			return RM_ERROR;		}	}	temp = hwl_getbits(&BitParserContext,32,&Err);//VISUAL_OBJECT_START_CODE VisualObject:	temp = hwl_getbits(&BitParserContext,1,&Err);	// is_visual_object_identifier	if( temp )	{		temp = hwl_getbits(&BitParserContext,4,&Err);	// visual_object_verid should be 1		RMDBGLOG((TRACE, "visual_obj_verID %lu\n", temp));		if (temp != 1)			RMDBGLOG((ENABLE, "*** visual_obj_verID %lu != 1!!\n", temp));		temp = hwl_getbits(&BitParserContext,3,&Err);	// visual_object_priority should be 1..7, no 0		RMDBGLOG((TRACE, "visual_obj_priority %lu\n", temp));	}	temp = hwl_getbits(&BitParserContext,4,&Err);	// visual_object_type should be 1 = video id	if( temp != 1 )	{		RMDBGLOG((TRACE, "NO visual_object_type == video id\n"));		return RM_ERROR;	}	else	{		temp = hwl_getbits(&BitParserContext,1,&Err);	// video_signal_type		if( temp == 1 )		{			temp = hwl_getbits(&BitParserContext,3,&Err);	// video_format			RMDBGLOG((TRACE, "\tvideo_format %lu\n", temp));			temp = hwl_getbits(&BitParserContext,1,&Err);	// video_range			RMDBGLOG((TRACE, "\tvideo_range %lu\n", temp));			temp = hwl_getbits(&BitParserContext,1,&Err);	// colour_description			if( temp == 1 )			{				temp = hwl_getbits(&BitParserContext,8,&Err);	// colour_primaries				RMDBGLOG((TRACE, "\t\tcolour_primaries %lu\n", temp));				temp = hwl_getbits(&BitParserContext,8,&Err);	// transfer_characteristics				RMDBGLOG((TRACE, "\t\ttransfer_characteristics %lu\n", temp));				temp = hwl_getbits(&BitParserContext,8,&Err);	// matrix_coefficients				RMDBGLOG((TRACE, "\t\tmatrix_coeff %lu\n", temp));			}		}	}	hwl_align(&BitParserContext,&Err);	while( ((temp = hwl_showbits(&BitParserContext,32)) & 0x000001E0) != 0x00000100 )	{		temp = hwl_getbits(&BitParserContext,8,&Err);	// USER_DATA_START_CODE, user data		if( Err )		{			RMDBGLOG((TRACE, "NO video object start code\n"));			return RM_ERROR;		}	}	temp = hwl_getbits(&BitParserContext,32,&Err);	// video_object_start_code	RMDBGLOG((TRACE, "video_obj_start_code 0x%lx\n", temp));VideoObjectLayer:	temp = hwl_showbits(&BitParserContext,32);		// video_object_layer_start_code	if( (temp & 0x000001E0) == 0x00000120 )

⌨️ 快捷键说明

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