📄 parsemp4dsi.c
字号:
/***************************************** 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 + -