📄 buffer.h
字号:
/* Copyright 1996, ESS Technology, Inc. *//* SCCSID @(#)buffer.h 1.66 2/11/98 *//* * $Log$ */#ifndef __BUFFER_H__#define __BUFFER_H__#include "common.h"#ifdef SUB_PICTURE#include "spu/spu.h"#endif/****************************************************************************** Audio and Video bitstream buffer in DRAM. All units in dword. ******************************************************************************/#ifdef MPEG1#ifdef SVCD#define ADAM 128#define MPEG_VBV_size (3*47*8*ADAM/4)#define ABV_size (2*11*ADAM)#define MPEG_VBV_start 210032 #define ABV_start 2300 #else#define ADAM 128#define MPEG_VBV_size (47*8*ADAM/4)#define ABV_size (11*ADAM)#define MPEG_VBV_start (3708+ADJUST_4_LINE)#define ABV_start (2300+ADJUST_4_LINE)#endif#else#define ADAM 127#define MPEG_VBV_start (0x46800/4)#define MPEG_VBV_size (300*8*ADAM/4)#ifdef SUB_PICTURE#if SP_4_BITMODE/* 4 bit mode *//* old */#define ABV_start (0x2b348/4)#define ABV_size (ADAM*840/4)#if 0/* new */#define ABV_start (0x68/4)#define ABV_size (ADAM*872/4)#endif#else/* 8 bit mode */#define ABV_start (0x5c00/4)#define ABV_size (ADAM*2048/4)#endif#else#define ABV_start (0x91800/4)#define ABV_size (10*8*ADAM/4)#endif#endif#define MPEG_VBV_end (VBV_start + VBV_size)#define ABV_end (ABV_start + ABV_size)GBLDEF(int VBV_start, MPEG_VBV_start);GBLDEF(int VBV_end, 0);GBLDEF(int VBV_size, MPEG_VBV_size);/****************************************************************************** Number of dwords we read/write to the buffer with each DMA. Max 512. ******************************************************************************/#define VBV_read (2*ADAM)#define VBV_write (2*ADAM)#define ABV_read ADAM#define ABV_write ADAM/****************************************************************************** R/W pointers and transfer status flags. "filling" means xport buscon is running so buffer is being filled. "draining" means huffdec buscon is running so buffer is being drained. ******************************************************************************/GBLDEF_0 (int VBV_wrptr, 0);GBLDEF_0 (int VBV_rdptr, 0);GBLDEF (int ABV_wrptr, ABV_start);GBLDEF (int ABV_rdptr, ABV_start);GBLDEF_0 (int VBV_trigger, 0);GBLDEF_0 (int ABV_wrptr_save, 0);GBLDEF_0 (int BUF_ABV_overflow, 0);GBLDEF_0 (int ABV_filling, 0);GBLDEF_0 (int VBV_filling, 0);GBLDEF_0 (int ABV_draining, 0);GBLDEF_0 (int VBV_draining, 0);GBLDEF (int VBV_alarm, 1024); /* VBV space threshold when alarm goes off */GBLDEF (int PCM_starved, 1);GBLDEF (int PCM_fake_data, 0);#ifdef WATCHDOGGBLDEF_0 (int VBV_ABV_xport_xfer_count, 0);GBLDEF_0 (int VBV_ABV_huffman_xfer_count, 0);#endif/****************************************************************************** Some macros for internal use. ******************************************************************************/#define BUF_distance(front_ptr, back_ptr, val, buf_size) do { \ (val) = (front_ptr) - (back_ptr); \ if (val < 0) val += buf_size; \} while (0)#define BUF_advance_ptr(ptr, ndword, buf) do {\ (ptr) += (ndword); \ if ((ptr) >= cat2(buf,_end)) (ptr) -= cat2(buf,_size); \} while (0)#define BUF_retreat_ptr(ptr, ndword, buf) do {\ (ptr) -= (ndword); \ if ((ptr) < cat2(buf,_start)) (ptr) += cat2(buf,_size); \} while (0)/****************************************************************************** Occupancy in system buffer. 0 means empty. ******************************************************************************/#define VBV_update_occupancy(val) \ BUF_distance(VBV_wrptr, VBV_rdptr, val, VBV_size)#define ABV_update_occupancy(val) \ BUF_distance(ABV_wrptr, ABV_rdptr, val, ABV_size)/****************************************************************************** Space in system buffer. ******************************************************************************/#define VBV_update_space(val) do { \ val = VBV_rdptr - VBV_wrptr; \ if (val <= 0) val += VBV_size; \} while (0)#define ABV_update_space(val) do { \ val = ABV_rdptr - ABV_wrptr; \ if (val <= 0) val += ABV_size; \} while (0)/****************************************************************************** The PCM buffer followed by the zero buffer. The zero buffer should be no more than 256 dwords in the MPEG2 layout, and 252 dwords in the MPEG1 layout. PCM_size must be a multiple of 384 for MUSICAM, and a multiple of 256 for AC3. ******************************************************************************/#ifdef MPEG1#ifdef ECHO#define PCM_start 126032#define PCM_size 4992 /* Must be multiple of 384 */#else /* No echo */#ifdef SVCD#define PCM_start 5116 #else#define PCM_start 125264#endif#define PCM_size 5760 /* Must be multiple of 384 */#endif /* end of #ifdef ECHO */#define PCM_zero_size 48 /* The first 4 DW are used for "do blank" and the rest 44 DW are used for spatializer */#else#define PCM_start 773632#define PCM_size 2*6144 /* Must be multiple of 256 and 384 */#define PCM_zero_size 128#endif#define PCM_end (PCM_start + PCM_size)#define PCM_zero_start PCM_end#define PCM_zero_end (PCM_zero_start + PCM_zero_size)/****************************************************************************** R/W pointers. PCM_raw_wrptr is where decoded audio goes. Data is taken from PCM_rdptr to be sent to the audio DAC. Karaoke takes input from PCM_raw_rdptr. Results go to PCM_wrptr. If there is no karaoke PCM_raw_wrptr and PCM_wrptr are the same, and PCM_raw_rdptr doesn't exist. ******************************************************************************/GBLDEF (int PCM_raw_wrptr, PCM_start);GBLDEF (int PCM_rdptr, PCM_start);#ifdef KARAOKEGBLDEF (int PCM_wrptr, PCM_start);GBLDEF (int PCM_raw_rdptr, PCM_start);#ifdef SPATIALGBLDEF (int SPA_wrptr, PCM_start);#endif#else#define PCM_wrptr PCM_raw_wrptr#undef PCM_raw_rdptr#endif/****************************************************************************** Initialise all PCM pointers. ******************************************************************************/#ifdef KARAOKE#ifdef SPATIAL#define PCM_init_pointers() do { \ PCM_rdptr = PCM_raw_wrptr = PCM_start; \ PCM_wrptr = PCM_raw_rdptr = PCM_start; \ SPA_wrptr = PCM_wrptr; \} while (0)#else#define PCM_init_pointers() do { \ PCM_rdptr = PCM_raw_wrptr = PCM_start; \ PCM_wrptr = PCM_raw_rdptr = PCM_start; \} while (0)#endif#else#define PCM_init_pointers() PCM_rdptr = PCM_raw_wrptr = PCM_start#endif/****************************************************************************** Occupancy in PCM buffer. SPA_wrptr == PCM_rdptr means empty. ******************************************************************************/#if defined(KARAOKE) && defined(SPATIAL)#define PCM_update_occupancy(val) \ BUF_distance(SPA_wrptr, PCM_rdptr, val, PCM_size)#else#define PCM_update_occupancy(val) \ BUF_distance(PCM_wrptr, PCM_rdptr, val, PCM_size)#endif#ifdef KARAOKE#define PCM_update_raw_occupancy(val) \ BUF_distance(PCM_raw_wrptr, PCM_raw_rdptr, val, PCM_size)#else#define PCM_update_raw_occupancy(val) \ BUF_distance(PCM_raw_wrptr, PCM_rdptr, val, PCM_size)#endif/****************************************************************************** Room in PCM buffer for karaoke. ******************************************************************************/#ifdef KARAOKE#define PCM_update_kra_output_room(val) \ BUF_distance(PCM_raw_rdptr, PCM_wrptr, val, PCM_size)#define PCM_update_kra_input_available(val) \ BUF_distance(PCM_raw_wrptr, PCM_raw_rdptr, val, PCM_size)#endif/****************************************************************************** Room in PCM buffer for audio decoding. PCM_raw_wrptr == PCM_rdptr means buffer empty. ******************************************************************************/#define PCM_update_space(val) do { \ val = PCM_rdptr - PCM_raw_wrptr; \ if (val <= 0) val += PCM_size; \} while (0);/****************************************************************************** Some pointer advancement macros. These all assume that the buffer size is an integer multiple of the xfer size. ******************************************************************************/#define nice_ptr_advance(A, rw, n) do { \ A##_##rw += n; \ if (A##_##rw == A##_end) \ A##_##rw = A##_start; \} while (0)#define PCM_raw_wrptr_advance(n) nice_ptr_advance(PCM, raw_wrptr, n)#define PCM_rdptr_advance(n) nice_ptr_advance(PCM, rdptr, n)#define VBV_wrptr_advance(n) nice_ptr_advance(VBV, wrptr, n)#define VBV_rdptr_advance(n) nice_ptr_advance(VBV, rdptr, n)#define ABV_wrptr_advance(n) nice_ptr_advance(ABV, wrptr, n)#define ABV_rdptr_advance(n) nice_ptr_advance(ABV, rdptr, n)/****************************************************************************** Start d2a buscon. ******************************************************************************/#ifdef ZERO_BUFFER#define PCM_start_take_out() do { \ assert(!(mvd[gate_d2a_ff_status]&0xff)); \ PCM_take_out(); \ buscon_irq_enable(buscon_d2a_runbit); \} while (0);#else#define PCM_start_take_out() do { \ assert(!(mvd[gate_d2a_ff_status]&0xff)); \ PCM_take_out(); \} while (0);#endif/****************************************************************************** Clear buffers. ******************************************************************************/#define PCM_clear_buffer() dram_clear(PCM_start, PCM_size)#define PCM_clear_zero_buffer() dram_clear(PCM_zero_start, PCM_zero_size)/****************************************************************************** Exported functions. ******************************************************************************/void VBV_start_filling(void);void ABV_start_filling(void);void VBV_stop_filling(void);void ABV_stop_filling(void);void VBV_ABV_stop_filling(void);void VBV_ABV_stop_draining(void);void VBV_ABV_set_parameters(int);void PCM_init(void);void PCM_take_out(void);void PCM_back_track(void);void BUSCON_interrupt_service(void);#endif /* __BUFFER_H__ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -