📄 decoder.c
字号:
((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 + -