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

📄 decoder.c

📁 linux TV 源码
💻 C
📖 第 1 页 / 共 4 页
字号:
					((stream->sh.aspectratio == 2) ? "3:4" : 					 ((stream->sh.aspectratio == 3) ? "9:16" : 					  ((stream->sh.aspectratio == 4) ? "1:2.21" : 					   "?:?")))), 				       ((stream->sh.frameratecode == 1) ? "23.976" : 					((stream->sh.frameratecode == 2) ? "24" : 					 ((stream->sh.frameratecode == 3) ? "25" : 					  ((stream->sh.frameratecode == 4) ? "29.97" : 					   ((stream->sh.frameratecode == 5) ? "30" : 					    ((stream->sh.frameratecode == 6) ? "50" : 					     ((stream->sh.frameratecode == 7) ? "59.94" : 					      ((stream->sh.frameratecode == 8) ? "60" : 					       "?")))))))), 				       stream->sh.bitrate * 400, 				       stream->sh.vbvbuffersize * 16, 				       ((stream->sh.constrained) ? ", constrained" : "")					);				break;			}			break;		case 1:  // group of pictures			if (! stream->gop.valid) 				switch (i) {				case 0: 					stream->gop.timecode = data & 0x01; 					break;				case 1: 					stream->gop.timecode = 						(stream->gop.timecode << 8) | 						data; 					break;				case 2: 					stream->gop.timecode = 						(stream->gop.timecode << 8) | 						data; 					break;				case 3: 					stream->gop.timecode = 						(stream->gop.timecode << 8) | 						data; 					break;				case 4: 					stream->gop.closedgop = data & 0x01; 					break;				case 5: 					stream->gop.brokenlink = data & 0x01;					stream->gop.valid = 1;					break;				}			break;		case 2:  // picture			if (0) 				switch (i) {				case 0: 					break;				}			break;		case 7:  // extension layer			if (i == 0) card->AuxFifoExt = data;			else 				switch (card->AuxFifoExt) {  // extension code				case 1:  // sequence extension					if ((stream->sh.valid) && 					    (! stream->se.valid))						switch (i) {						case 1: 							stream->se.profilelevel								= data; 							break;						case 2: 							stream->se.progressive								= data & 0x01; 							break;						case 3: 							stream->se.chroma = 								(data >> 4) & 								0x03; 							stream->se.hsizeext = 								(data >> 2) & 								0x03;							stream->se.vsizeext = 								data & 0x03;							stream->hsize |= 								(stream->se.hsizeext << 12);							stream->vsize |= 								(stream->se.vsizeext << 12);							break;						case 4: 							stream->se.bitrateext =								data & 0x0F; 							break;						case 5: 							stream->se.bitrateext =								(stream->se.bitrateext << 8) | data; 							stream->bitrate |= 								(stream->se.bitrateext << 18); 							break;						case 6: 							stream->se.vbvbuffersizeext = data; 							stream->vbvbuffersize |= (stream->se.vbvbuffersizeext << 10); 							break;						case 7:							stream->se.lowdelay =								(data >> 7) & 								0x01;							stream->se.frextn = 								(data >> 5) & 								0x03;							stream->se.frextd = 								data & 0x1F;							stream->se.valid = 1;							stream->MPEG2 = 1;							MDEBUG(1, ": AUX - MPEG2 - %dx%d %s %s*%d/%d fps, %d bps, %d kByte vbv%s%s\n", stream->hsize, stream->vsize, 							       ((stream->sh.aspectratio == 1) ? "1:1" : 								((stream->sh.aspectratio == 2) ? "3:4" : 								 ((stream->sh.aspectratio == 3) ? "9:16" : 								  ((stream->sh.aspectratio == 4) ? "1:2.21" : 								   "?:?")))), 							       ((stream->sh.frameratecode == 1) ? "23.976" : 								((stream->sh.frameratecode == 2) ? "24" : 								 ((stream->sh.frameratecode == 3) ? "25" : 								  ((stream->sh.frameratecode == 4) ? "29.97" : 								   ((stream->sh.frameratecode == 5) ? "30" : 								    ((stream->sh.frameratecode == 6) ? "50" : 								     ((stream->sh.frameratecode == 7) ? "59.94" : 								      ((stream->sh.frameratecode == 8) ? "60" : 								       "?")))))))), 							       stream->se.frextn + 1, 							       stream->se.frextd + 1, 							       stream->bitrate * 400, 							       stream->vbvbuffersize * 16, 							       ((stream->sh.constrained) ? ", constrained" : ""), 							       ((stream->se.lowdelay) ? ", low delay" : "")								);							break;						}					break;				case 2:  // sequence display extension					if (0)						switch (i) {						case 0: 							break;						}					break;				case 3:  // quant matrix extension					if (0) 						switch (i) {						case 0: 							break;						}					break;				case 4:  // copyright  extension					if (0) 						switch (i) {						case 0: 							break;						}					break;				case 7:  // picture display extension					if (0) switch (i) {					case 0: 						break;					}					break;				case 8:  // picture coding extension					if (0) 						switch (i) {						case 0: 							break;						}					break;				default:					break;				}			break;		default:break;		}			}  }void DecoderReadDataFifo(struct cvdv_cards *card) {        MDEBUG(3, ": DATA - ");	while (card->DataFifoHead != card->DataFifoTail) {	        MDEBUG(3,"%03X ", card->DataFifo[card->DataFifoTail]);		card->DataFifoTail = (card->DataFifoTail + 1) & FIFO_MASK;	}	MDEBUG(3,"\n");}int DecoderReadNavipack(struct cvdv_cards *card) {	u32 startaddr, endaddr, writeaddr;	u8 navipack[1024];	u16 PacketLength;	u8 SubStreamID;	//struct Navi navi;	int i;	startaddr = (DecoderReadWord(card, 0x05C) & 0x3FFF) << 7;           // 21 bit word address	endaddr = (DecoderReadWord(card, 0x05E) & 0x3FFF) << 7;             // 21 bit word address	writeaddr = DecoderReadByte(card, 0x075) & 0xFF;	writeaddr |= (DecoderReadWord(card, 0x077) & 0x0FFF) << 8;	//writeaddr <<= 3;	MDEBUG(3, ": -- DecoderReadNavipack 0x%08X-0x%08X, ->0x%08X <-0x%08X\n", 	       startaddr, endaddr, writeaddr, card->NaviPackAddress);		if (DecoderReadByte(card, 0x07B) & 0xC0) {  // navi pack available?		DRAMReadByte(card, card->NaviPackAddress, 1024, navipack, 0);		card->reg07B |= 0x20;  // decrement navi counter		DecoderWriteByte(card, 0x07B, card->reg07B);		card->reg07B &= ~0x20;		//DecoderSetByte(card, 0x07B, 0x20);  // decrement navi counter		card->NaviPackAddress += 512;       // increment in words		if (card->NaviPackAddress >= endaddr) 			card->NaviPackAddress = startaddr;		MDEBUG(4, ": Navipack %02X %02X %02X %02X  %02X %02X %02X %02X\n", 		       navipack[0], navipack[1], navipack[2], navipack[3], navipack[4], 		       navipack[5], navipack[6], navipack[7]);		if ((!navipack[0]) && (!navipack[1]) && (navipack[2] == 1) && 		    (navipack[3] == 0xBF)) {			PacketLength = (navipack[4] << 8) | navipack[5];			SubStreamID = navipack[6];			MDEBUG(4, ": Navipack Len=%d, ID=%d\n", PacketLength, SubStreamID);			i = 7;  // start of payload data in navipack[]			switch (SubStreamID) {			case 0:  // Presentation Control Information (PCI)				if (PacketLength < 980) return 1;  // Packet too small				DecoderQueueNavi(card, navipack);				break;			case 1:  // Data Search Information (DSI)				if (PacketLength < 1018) return 1;  // Packet too small				DecoderQueueNavi(card, navipack);				break;			default:				break;			}		} else {			MDEBUG(4, "navipack format error:%02X %02X %02X %02X %02X %02X %02X %02X\n",			       navipack[0], navipack[1], navipack[2], navipack[3], navipack[4], 			       navipack[5], navipack[6], navipack[7]);		}	} else {		MDEBUG(4, ": no navi pack avail.\n");	}	return 0;}int AudioStart(struct cvdv_cards *card) {	DecoderReadAudioInfo(card);  // detect audio type	if (card->stream.audio.valid) {		MDEBUG(1, ": Audio Init in delayed decoder start\n");		if (card->AudioInitialized) AudioClose(card);		switch (card->setup.audioselect) {		case audio_MPEG:  // MPEG Audio		case audio_MPEG_EXT:  // MPEG Audio with ext.			MDEBUG(1, ": Using MPEG Audio\n");			AudioInit(card, card->stream.audio.mpeg.samplefreq, 0);			if (card->stream.audio.mpeg.mode == 3) AudioDualMono(card, 2);  // left channel only			else AudioDualMono(card, 0);			break;		case audio_DTS:		case audio_LPCM:  // Linear Pulse Code fe_modulation_t LPCM			MDEBUG(1, ": Using LPCM Audio\n");			AudioInit(card, 48, 0);  // or 96			break;		case audio_AC3:  // AC-3			MDEBUG(1, ": Using AC-3 Audio\n");			switch (card->stream.audio.ac3.fscod) {			case 0:AudioInit(card, 48, 0); break;			case 1:AudioInit(card, 44, 0); break;			case 2:AudioInit(card, 32, 0); break;			}			break;		case audio_none:		case audio_disable:		case audio_SDDS:			break;		}	} else return 1;	return 0;}u32 DecoderReadSCR(struct cvdv_cards *card, u16 address){	u32 SCR;	SCR = DecoderReadByte(card, address);	SCR |= ((u32)DecoderReadByte(card, address+1) << 8);	SCR |= ((u32)DecoderReadByte(card, address+2) << 16);	SCR |= ((u32)DecoderReadByte(card, address+3) << 24);	return SCR;}u32 DecoderReadRWAddr(struct cvdv_cards *card, u16 address){	u32 addr;	addr = DecoderReadByte(card, address) & 0xFF;	addr |= (((u32)DecoderReadByte(card, address+1) & 0xFF) << 8);	addr |= (((u32)DecoderReadByte(card, address+2) & 0x0F) << 16);	return addr;}int PTSGetFirstPTS(PTSStorage *store, u32 *PTS){	if ( store->end == store->begin ) {		return 0;	} else {		*PTS = store->PTS[store->begin];		return 1;	}}void PTSStoreAdd(PTSStorage *store, u32 PTS, u32 AddrB, u32 AddrE){	int new;	MDEBUG(3, ": PTSStoreAdd - store in [%d] %08X - %08X\n", store->end, AddrB, AddrE); // cheap fix: don't store if address rollover	if ((AddrB & 0x00080000) != (AddrE & 0x00080000)) return;	new = store->end;	store->end++;	if (store->end >= store->size) store->end = 0;	if (store->end == store->begin) {		store->begin++;		if (store->begin >= store->size) store->begin = 0;	}	store->AddrB[new] = AddrB;	store->AddrE[new] = AddrE;	store->PTS[new] = PTS;}int PTSGetPTS (PTSStorage *store, u32 Addr, u32 *PTS ){	u32 AddrB;	u32 AddrE;	int i;	int found;	int search;	MDEBUG(3, ": PTSGetPTS - search %08X\n", Addr);	if (store->end == store->begin) {		store->LastAddr = Addr;		return 0;	}	// Search for the PTS in the array	found = 0;	search = 1;	while (search && !found) {	 // Get the first value		i = store->begin;		AddrB = store->AddrB[i];		AddrE = store->AddrE[i];		MDEBUG(3, ": PTSGetPTS - search in [%d] %08X - %08X\n", i, AddrB, AddrE);	 //If in range, keep it		if ((Addr >= AddrB) && (Addr <= AddrE)) {			*PTS = store->PTS[i];			found = 1;		} else {			if ((Addr & 0x00080000) == (AddrB & 0x00080000)) {				if (Addr < AddrB ) search = 0;			} else {				if ((store->LastAddr & 0x00080000) == (Addr & 0x00080000)) search = 0;			}		}		if (search) {			store->begin++;			if (store->begin >= store->size) store->begin = 0;			if (store->end == store->begin ) search = 0;		}	}	store->LastAddr = Addr;	return found;}

⌨️ 快捷键说明

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