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

📄 streams.c

📁 linux TV 源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*     streams.c    Copyright (C) Christian Wolff for convergence integrated media.    This program is free software; you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/#define __NO_VERSION__#include "streams.h"#include "dram.h"#include "l64021.h"#include "video.h"#include "audio.h"// Frees allocated channel buffersint DecoderKillChannelBuffers(struct cvdv_cards *card){	MDEBUG(1, ": -- DecoderKillChannelBuffers\n");	DecoderStopDecode(card);	DRAMFree(card, card->VideoES);	card->VideoES = BLANK;	DRAMFree(card, card->AudioES);	card->AudioES = BLANK;	DRAMFree(card, card->VideoPES);	card->VideoPES = BLANK;	DRAMFree(card, card->DataDump);	card->DataDump = BLANK;	DRAMFree(card, card->AudioPES);	card->AudioPES = BLANK;	DRAMFree(card, card->NaviBank);	card->NaviBank = BLANK;	card->ChannelBuffersAllocated = 0;//  DecoderWriteWord(	return 0;}// Allocates channel buffers// All sizes in bytes, preferably multiple of 256 (will be rounded up otherwise)int DecoderSetChannelBuffers(struct cvdv_cards *card, int VideoES,	// Video ES Channel Buffer size, e.g. 229376 byte for NTSC			     int AudioES,	// Audio ES Channel Buffer size, 4096 byte			     int VideoPES,	// Video PES Header / SPU Channel Buffer size, 512 byte			     int DataDump,	// Data Dump Channel Buffer size, e.g. 80896 byte			     int AudioPES,	// Audio PES Header / System Channel Buffer size, 512 byte			     int NaviBank){				// Navi Bank Channel Buffer size, 2048 byte#define BUFFERSET(buf,adr,align)  if (buf>0) {\  if (buf&((1<<align)-1)) buf=(buf&~((1<<align)-1))+(1<<align);\  addr=DRAMAlloc(card,buf,1<<align);\  if (addr==BLANK) return adr;\  card->buf=addr;\  addr>>=align;\  DecoderWriteByte(card,adr,addr&0xFF);\  DecoderWriteByte(card,adr+1,(addr>>8)&(0x003F));\  addr+=(buf>>align);\  DecoderWriteByte(card,adr+2,(addr-1)&0xFF);\  DecoderWriteByte(card,adr+3,((addr-1)>>8)&0x003F);\}	u32 addr;	MDEBUG(1, ": -- DecoderSetChannelBuffers\n");	//DecoderStopDecode(card);	DecoderStopChannel(card);	VideoES >>= 1;		// change to word sizes	AudioES >>= 1;	VideoPES >>= 1;	DataDump >>= 1;	AudioPES >>= 1;	NaviBank >>= 1;	if (card->ChannelBuffersAllocated)		DecoderKillChannelBuffers(card);	BUFFERSET(VideoES, 0x048, 7);	BUFFERSET(AudioES, 0x04C, 7);	BUFFERSET(VideoPES, 0x050, 7);	BUFFERSET(DataDump, 0x054, 7);	BUFFERSET(AudioPES, 0x058, 7);	BUFFERSET(NaviBank, 0x05C, 7);	card->VideoESSize = VideoES;			card->AudioESSize = AudioES;			card->VideoPESSize = VideoPES;			card->DataDumpSize = DataDump;			card->AudioPESSize = AudioPES;			card->NaviBankSize = NaviBank;			DecoderWriteByte(card, 0x044, 0x7F);	DecoderWriteByte(card, 0x044, 0x01);	if (NaviBank) {		card->reg07B |= 0x10;	// navi pack counter enable		DecoderWriteByte(card, 0x07B, card->reg07B);		//DecoderSetByte(card,0x07B,0x10);  // navi pack counter enable		card->NaviPackAddress =		    (DecoderReadWord(card, 0x05C) & 0x3FFF) << 7;		MDEBUG(4, ": navi bank init'ed: 0x%08X\n",card->NaviPackAddress);	} else {		card->reg07B &= ~0x10;	// navi pack counter disable		DecoderWriteByte(card, 0x07B, card->reg07B);		//DecoderDelByte(card,0x07B,0x10);  // navi pack counter disable		card->NaviPackAddress = 0;	}	card->ChannelBuffersAllocated = 1;#undef BUFFERSET	return 0;}//int DecoderReadFifoint DecoderUnPrepare(struct cvdv_cards *card){	MDEBUG(0, ": -- DecoderUnPrepare\n");	//DecoderStopDecode(card);	DecoderStopChannel(card);	DecoderKillChannelBuffers(card);	return 0;}void DecoderPrepare(struct cvdv_cards *card){	//VideoSetBackground(card,0,0,0,0);      // Video on black	VideoSetBackground(card, 1, 0, 0, 0);	// black	//VideoSetBackground(card,2,83,90,249);  // Red	//VideoSetBackground(card,2,155,53,53);  // Green	//VideoSetBackground(card,2,35,212,114); // Blue	//VideoSetBackground(card,2,4,128,128);  // Black	//VideoSetBackground(card,3,155,53,53);  // Video on Green	//DecoderWriteByte(card,0x044,0x00);  // Reset channel buffers on error//  DecoderWriteByte(card,0x044,0x01);  // don't Reset channel buffers on error	DecoderWriteByte(card, 0x040, 0x01);	// Reset Aux FIFO	DecoderWriteByte(card, 0x041, 0x01);	// Reset Data FIFO	//DecoderWriteByte(card,0x044,0x7E);    // Reset channel buffers, Reset channel buffers on error	DecoderWriteByte(card, 0x044, 0x7F);	// Reset channel buffers, don't Reset channel buffers on error//  udelay(100);//  DecoderWriteByte(card,0x040,0x00);  // Reset Aux FIFO//  DecoderWriteByte(card,0x041,0x00);  // Reset Data FIFO//  DecoderDelByte(card,0x044,0x7E);    // Reset channel buffers}// Selects audio type MPEG and sets stream ID's// AID:     -1=all MPEG, Audio Stream ID: 0..31// AExt:    -1=unused, Audio Stream Extension ID: 0..31, only used if AType=5void DecoderSelectAudioID(struct cvdv_cards *card){	int AID = card->setup.audioID;	int AExt = card->setup.audioIDext;	MDEBUG(1, ": -- SelectAudio %d %d\n", AID, AExt);	DecoderWriteByte(card, 0x07C, AExt & 0x1F);	// Audio Stream Extension ID	card->reg08F = (card->reg08F & ~0x1F) | (AID & 0x1F);	DecoderWriteByte(card, 0x08F, card->reg08F);	//DecoderMaskByte(card,0x08F,0x1F,AID&0x1F);   // Set Stream ID}// AHeader: 0=No Headers, 1=first PTS/DTS header, 2=all headers, 3=All with PTS/DTS// AType:   0=disable audio, 1=MPEG ID (MPEG 1), 2=Lin.PCM ID, 3=AC3 ID, 4=all MPEG (use only, if just one MPEG audio stream), 5=MPEG multichannel ID (MPEG 2)// AID:     -1=all MPEG, Audio Stream ID: 0..31// AExt:    -1=unused, Audio Stream Extension ID: 0..31, only used if AType=5// IEC956:  0:MPEG/AC3 data on digital out 1:IEC956 data on digital S/PDIF outvoid DecoderPrepareAudio(struct cvdv_cards *card){	int AHeader = 2;	int AType = 3;	int AID = card->setup.audioID;	int AExt = card->setup.audioIDext;	int IEC956 = card->setup.SPDIFmode;	MDEBUG(1, ": -- PrepAudio %d %d %d %d %d\n",	       AHeader, card->setup.audioselect, AID, AExt, IEC956);	switch (card->setup.audioselect) {	case audio_disable:	case audio_none:	case audio_SDDS:		AType = 0;		break;	case audio_MPEG:	// MPEG Audio		AType = 1;		break;	case audio_MPEG_EXT:	// MPEG Audio with extension stream		AType = 5;		break;	case audio_LPCM:	// Linear Pulse Code fe_modulation_t LPCM		AType = 2;		break;	case audio_AC3:	// AC-3		AType = 3;		break;	case audio_DTS:	// DTS		AType = 8;		break;	}	if (AType <= 0) {		card->reg08F = 0x00;	// disable audio and discard all packets		DecoderWriteByte(card, 0x08F, card->reg08F);		//DecoderWriteByte(card,0x08F,0x00);  // disable audio and discard all packets		//DecoderMaskByte(card,0x093,0xC3,0xC0);  // write no headers		card->reg093 = (card->reg093 & ~0x03);	// write no headers		DecoderWriteByte(card, 0x093, card->reg093);	} else {		AudioOpen(card);		DecoderMaskByte(card, 0x165, 0x1F, 0x00);	// reset the register		if (AType == 8) {	// DTS			card->reg090 |= 0x01;	// DTS in Transport Private 1 Stream stored in AudioES channel buffer			DecoderWriteByte(card, 0x090, card->reg090);			//DecoderSetByte(card,0x090,0x01);  // DTS in Transport Private 1 Stream stored in AudioES channel buffer			AudioSetMode(card, 0);			DecoderSetByte(card, 0x165, 0x01);			AudioStartFormat(card);		} else if (AType == 3) {	// AC3			card->reg090 |= 0x01;	// AC3 in Transport Private 1 Stream stored in AudioES channel buffer			DecoderWriteByte(card, 0x090, card->reg090);			//DecoderSetByte(card,0x090,0x01);  // AC3 in Transport Private 1 Stream stored in AudioES channel buffer			AudioSetMode(card, ((IEC956) ? 1 : 3));

⌨️ 快捷键说明

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