📄 cqsrbrd.c
字号:
/******************************************************************************//* cqsrbrd.c : Common code for implementation of the IDecoderBoard interface* REALmagic Quasar Hardware Library* Created by Aurelia Popa-Radu* Copyright Sigma Designs Inc* Sigma Designs Proprietary and confidential* Created on 8/27/99* Description:*******************************************************************************//****h* HwLib/IDecoderBoard_implementation * NAME * IDecoderBoard_implementation * DESCRIPTION * CQuasarBoard implementation of the IDecoderBoard interface. * This is the main interface between the user and this library. * COPYRIGHT * Copyright Sigma Designs Inc * Sigma Designs Proprietary and confidential/******************************************************************************/#include "pch.h"//#define AUDIO_PATCH#undef TEST_CC#ifdef TEST_CCDWORD g_Test;DWORD g_VSyncIntCounter = 0;#endif///////////////////////////////////////////////////////////////////////Bitparser - to be included in HwLibint m_incnt;unsigned char * m_rdbfr;unsigned long m_rdbfr_length;unsigned char * m_rdptr;unsigned char * m_rdmax;int m_bitcnt;unsigned int m_bfr;// return next n bits (right adjusted) without advancingunsigned int hwl_showbits (int n){ return m_bfr >> (32-n);}// advance by n bitsvoid hwl_flushbits (int n, int *Err){ int incnt; if(n<=31) m_bfr <<= n; else m_bfr = 0; incnt = m_incnt -= n; if (incnt <= 24) { if (m_rdptr < m_rdbfr+(m_rdbfr_length-4)) { do { m_bfr |= *m_rdptr++ << (24 - incnt); incnt += 8; } while (incnt <= 24); } else { do { if (m_rdptr >= m_rdbfr+m_rdbfr_length) { (*Err)++; m_bfr |= 0 << (24 - incnt); } else m_bfr |= *m_rdptr++ << (24 - incnt); incnt += 8; } while (incnt <= 24); } m_incnt = incnt; }}// return next n bits (right adjusted) + advanceunsigned int hwl_getbits (int n, int *Err){ unsigned int l; l = hwl_showbits (n); hwl_flushbits (n, Err); return l;}// hwl_align to the next bytevoid hwl_align (int *Err){ int incnt; if (m_incnt != 32) { incnt = m_incnt%8; hwl_flushbits (incnt, Err); }}void BitStream (unsigned char *pBuffer, unsigned long Length, int *Err){ m_rdbfr = pBuffer; m_rdbfr_length = Length; m_incnt = 0; m_rdptr = m_rdbfr + m_rdbfr_length; m_rdmax = m_rdptr; m_bitcnt = 0; m_bfr = 0; m_rdptr = m_rdbfr; hwl_flushbits (0, Err);}//////////////////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 Mpeg2QRESULT ParseDsiInfo(void* pDsiIn, DWORD dwDsiInSize, void* pDsiOut, DWORD dwDsiOutSize){ int Err = 0; DWORD vop_time_increment_resolution; DWORD temp; if( (pDsiIn == NULL) || (dwDsiInSize == 0) ) { QDbgLog((QLOG_TRACE, QDebugLevelError, TEXT("NULL DSI") )); return Q_FAIL; } BitStream ((BYTE*)pDsiIn, dwDsiInSize, &Err); temp = hwl_getbits(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( Err || (temp != VIDEO_OBJECT_SEQUENCE_START_CODE) ) { QDbgLog((QLOG_TRACE, QDebugLevelError, TEXT("NO VIDEO_OBJECT_SEQUENCE_START_CODE") )); return Q_FAIL; } temp = hwl_getbits(8,&Err); // profile_and_level_indication if( Err ) { QDbgLog((QLOG_TRACE, QDebugLevelError, TEXT("NO profile_and_level_indication") )); return Q_FAIL; } while( (temp = hwl_showbits(32)) != VISUAL_OBJECT_START_CODE) { temp = hwl_getbits(8,&Err); // USER_DATA_START_CODE, user data if( Err ) { QDbgLog((QLOG_TRACE, QDebugLevelError, TEXT("NO VISUAL_OBJECT_START_CODE") )); return Q_FAIL; } } temp = hwl_getbits(32,&Err);//VISUAL_OBJECT_START_CODE temp = hwl_getbits(1,&Err); // is_visual_object_identifier if( temp ) { temp = hwl_getbits(4,&Err); // visual_object_verid should be 0 temp = hwl_getbits(3,&Err); // visual_object_priority should be 1..7, no 0 } temp = hwl_getbits(4,&Err); // visual_object_type should be 1 = video id if( temp != 1 ) { QDbgLog((QLOG_TRACE, QDebugLevelError, TEXT("NO visual_object_type == video id") )); return Q_FAIL; } else { temp = hwl_getbits(1,&Err); // video_signal_type if( temp == 1 ) { temp = hwl_getbits(3,&Err); // video_format temp = hwl_getbits(1,&Err); // video_range temp = hwl_getbits(1,&Err); // colour_description if( temp == 1 ) { temp = hwl_getbits(8,&Err); // colour_primaries temp = hwl_getbits(8,&Err); // transfer_characteristics temp = hwl_getbits(8,&Err); // matrix_coefficients } } } hwl_align(&Err); while( ((temp = hwl_showbits(32)) & 0x000001E0) != 0x00000100 ) { temp = hwl_getbits(8,&Err); // USER_DATA_START_CODE, user data if( Err ) { QDbgLog((QLOG_TRACE, QDebugLevelError, TEXT("NO video object start code") )); return Q_FAIL; } } temp = hwl_getbits(32,&Err); // video_object_start_codeVideoObjectLayer: temp = hwl_showbits(32); // video_object_layer_start_code if( (temp & 0x000001E0) == 0x00000120 ) { // short_video_header = 0 temp = hwl_getbits(32,&Err);// video_object_layer_start_code temp = hwl_getbits(1,&Err); // random_accessible_vol temp = hwl_getbits(8,&Err); // video_object_type_indication temp = hwl_getbits(1,&Err); // is_object_layer_identifier if( temp == 1 ) { temp = hwl_getbits(4,&Err); // video_object_layer_verid should be 1 temp = hwl_getbits(3,&Err); // video_object_layer_priority } temp = hwl_getbits(4,&Err); // aspect_ratio_info if( temp == 0xf ) // extended par { temp = hwl_getbits(8,&Err); // par_width temp = hwl_getbits(8,&Err); // par_height } temp = hwl_getbits(1,&Err); // vol_control_parameters if( temp == 1 ) { temp = hwl_getbits(2,&Err); // chroma_format temp = hwl_getbits(1,&Err); // low_delay temp = hwl_getbits(1,&Err); // vbv_parameters if( temp == 1 ) { temp = hwl_getbits(15,&Err);// first_half_bit_rate temp = hwl_getbits(1,&Err); // marker_bit temp = hwl_getbits(15,&Err);// latter_half_bit_rate temp = hwl_getbits(1,&Err); // marker_bit temp = hwl_getbits(15,&Err);// first_half_vbv_buffer_size temp = hwl_getbits(1,&Err); // marker_bit temp = hwl_getbits(3,&Err); // latter_half_vbv_buffer_size temp = hwl_getbits(11,&Err);// first_half_vbv_occupancy temp = hwl_getbits(1,&Err); // marker_bit temp = hwl_getbits(15,&Err);// latter_half_vbv_occupancy temp = hwl_getbits(1,&Err); // marker_bit } } temp = hwl_getbits(2,&Err); // video_object_layer_shape temp = hwl_getbits(1,&Err); // marker_bit vop_time_increment_resolution = hwl_getbits(16,&Err); QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT("DSI vop_time_increment_resolution = %d"), vop_time_increment_resolution )); // for now the output is a DWORD = vop_time_increment_resolution *(DWORD*)pDsiOut = vop_time_increment_resolution; temp = hwl_getbits(1,&Err); // marker_bit temp = hwl_getbits(1,&Err); // fixed_vop_rate if(temp) { temp = 0; while( vop_time_increment_resolution ) { vop_time_increment_resolution >>= 1; temp++; } temp = hwl_getbits(temp,&Err); // fixed_vop_time_increment } } return Q_OK;}/////////////////////////////////////////////////////////////////////#include "cqsrbrd.h"#include "regs840x.h"#include "regs847x.h"#include "em847x.h"/****v* HwLib/g_HwLibVersion * NAME * g_HwLibVersion * DESCRIPTION * g_HwLibVersion can be used to retrieve the revision of the HwLib code /******************************************************************************/#include "rmver.h"DWORD g_HwLibVersion = RM_HWLIB_VERSION;/****f* HwLib/GetHwLibVersion * USAGE * DWORD GetHwLibVersion() * DESCRIPTION * It returns the revision of the HwLib source code. * SEE ALSO * g_HwLibVersion/******************************************************************************/DWORD GetHwLibVersion(){ return g_HwLibVersion;}/****v* HwLib/g_pIDecoderBoard[MAX_INSTANCES] * NAME * g_pIDecoderBoard[MAX_INSTANCES] * DESCRIPTION * Global array of maximum MAX_INSTANCES pointers to DecoderBoard objects. * Every EM8400 on the PCI bus will add a new object in this array. /******************************************************************************/IDecoderBoard* g_pIDecoderBoard [MAX_INSTANCES] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};/****v* HwLib/g_ErrorTable * NAME * g_ErrorTable * DESCRIPTION * Global Table used by GetLastQError to associate the error code to a string. * SOURCE */ErrorEntry g_ErrorTable[100] ={ { E_TOO_MANY_INSTANCES, TEXT("Too many instances already opened")}, { E_CREATE_INSTANCE_FAILED, TEXT("CreateInstance failed")}, { E_INVALID_PROPERTY_BUFFER,TEXT("Invalid Property Buffer")}, { E_INVALID_PROPERTY_SET, TEXT("Invalid Property Set")}, { E_INVALID_PROPERTY_ID, TEXT("Invalid Property Id")}, { E_GEN_FAILURE, TEXT("Hardware failure")}, { E_NOT_SUPPORTED, TEXT("Not supported")}, { E_INVALID_PARAMETER, TEXT("Invalid parameter")}, { E_LOAD_MICROCODE_FAILED, TEXT("Load microcode failed")}, { E_GET_SYMBOLS_FAILED, TEXT("Get symbols failed")}, { E_MICROCODE_FAILED, TEXT("After microcode load the DM data is not initialized!!!")}, { E_VIDEO_WRITE_COMMAND_FAILED, TEXT("VideoWriteCommand failed")}, { E_AUDIO_WRITE_COMMAND_FAILED, TEXT("AudioWriteCommand failed")}, { E_OSD_WRITE_COMMAND_FAILED, TEXT("OsdWriteCommand failed")}, { E_TEST_REG_FAILED, TEXT("Test registers failed")}, { E_TEST_PM_FAILED, TEXT("Test program memory failed")}, { E_TEST_DM_FAILED, TEXT("Test data memory failed")}, { E_TEST_DRAM_FAILED, TEXT("Test dram failed")}, { E_TEST_NOVA_FAILED, TEXT("Nova test failed")}, { E_NOVA_NOT_PRESENT, TEXT("Nova not present")},
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -