--- margi2/decoder.c 2001/03/12 17:06:26 1.7 +++ margi2/decoder.c 2001/03/15 15:58:16 1.8 @@ -101,15 +101,19 @@ void DecoderPause(struct cvdv_cards *car AudioSetPlayMode(card, MAUDIO_PAUSE); DecoderStopDecode(card); card->videostate.playState=VIDEO_FREEZED; + card->videoffwd = 0; + card->videoslow = 0; } void DecoderUnPause(struct cvdv_cards *card) { DecoderStartDecode(card); + card->videoffwd = 0; AudioSetPlayMode(card, MAUDIO_PLAY); DecoderMaskByte(card, 0x007, 0xD2, 0xC2); // Del 0x010, SCR counter run card->videostate.playState=VIDEO_PLAYING;; + card->videoslow = 0; } void CloseCard(struct cvdv_cards *card) @@ -127,6 +131,7 @@ void CloseCard(struct cvdv_cards *card) DecoderUnPrepare(card); DecoderStreamReset(card); DecoderSetupReset(card); + VideoSetBackground(card, 1, 0, 0, 0); AudioClose(card); OSDClose(card); @@ -658,21 +663,6 @@ int AudioStart(struct cvdv_cards *card) return 0; } -// Slow mode: displays every field times -// slowfactor=0 disables this mode. -void VideoSlow(struct cvdv_cards *card, int slowfactor) -{ - if (!slowfactor && card->slowdown) DecoderWriteByte(card, 0x0ED, 0x00); // run - card->lastslow = 0; - card->slowdown = slowfactor; -} - -// Puts decoder in pause after so many fields -void StepsToPause(struct cvdv_cards *card, int steps) -{ - card->videosteps = steps; -} - u32 DecoderReadSCR(struct cvdv_cards *card, u16 address) { u32 SCR; @@ -973,6 +963,7 @@ void L64021Intr(struct cvdv_cards *card) // int err, h; u8 intr[5]; u8 layer; + u8 reg; //u8 oldlayer = 0; long ISRTime, DeltaSyncTime, Offset; @@ -1007,46 +998,93 @@ void L64021Intr(struct cvdv_cards *card) // DecoderReadByte(card, 0x007), // DecoderReadByte(card, 0x005)); - if (intr[0] & 0x80) { // new field card->fields++; - if (card->slowdown > 0) { - if (card->lastslow == 0) { - DecoderWriteByte(card, 0x0ED, 0x03); // repeat frame - card->lastslow++; - } else if (card->lastslow == card->slowdown) { - DecoderWriteByte(card, 0x0ED, 0x00); // run - } else card->lastslow++; - } - - if (card->videosteps > 0) { - card->videosteps--; - if (!card->videosteps) DecoderPause(card); + + if (card->videoffwd){ + AudioStopDecode(card); + card->videosync = 0; + card->videodelay = 0; + card->videoskip = 0; + reg = DecoderReadByte(card, 0x0EC); + if ((reg & 0x07) == 0x00) { + DecoderWriteByte(card, 0x0EC, + (card->videoffwd& + 0x03) |0x04); + } + } else if (DecoderReadByte(card, 0x0EC) & 0x07){ + if (card->audiostate.AVSyncState) + card->videosync = 1; + DecoderWriteByte(card, 0x0EC, 0x00); + AudioStartDecode(card); } + if (card->videoslow){ + if (!card->videoslow_last){ + AudioStopDecode(card); + card->videosync = 0; + card->videodelay = card->videoslow;; + card->videoskip = 0; + card->videoslow_last = 1; + card->videodelay_last = 0; + } else { + if (card->videodelay_last == -1){ + card->videodelay = + card->videoslow; + } + + if (!card->videodelay) + card->videodelay_last = -1; + else + card->videodelay_last = + card->videodelay; + } + } else if( card->videoslow_last ){ + card->videoslow_last = 0; + if (card->audiostate.AVSyncState) + card->videosync = 1; + AudioStartDecode(card); + } + + if (card->videodelay > 0) { //printk(KERN_DEBUG LOGNAME ": Video delay %d\n", card->videodelay); - if( (DecoderReadByte(card, 0x0ED) & 0x01) == 0x00) { + if( (DecoderReadByte(card, 0x0ED) & 0x03) + == 0x00) { card->videodelay--; if(card->videodelay){ - DecoderWriteByte(card, 0x0ED, 0x01); + DecoderWriteByte(card, 0x0ED, + 0x01); } else { - DecoderWriteByte(card, 0x0ED, 0x00); + DecoderWriteByte(card, 0x0ED, + 0x00); + } + } else { + card->videodelay--; + if(!card->videodelay){ + DecoderWriteByte(card, 0x0ED, + 0x00); } } - } else if (card->videorip > 0) { -//printk(KERN_DEBUG LOGNAME ": Video rip %d\n", card->videorip); - if ((DecoderReadByte(card, 0x0EC) & 0x03) == 0x00) { - if (DecoderReadWord(card, 0x096) > 5) { // pictures in video ES channel - card->videorip--; - if(card->videorip) { - DecoderWriteByte(card, 0x0EC, 0x01); + } else if (card->videoskip > 0) { +//printk(KERN_DEBUG LOGNAME ": Video rip %d\n", card->videoskip); + if ((DecoderReadByte(card, 0x0EC) & 0x03) + == 0x00) { + if (DecoderReadWord(card, 0x096) > 5) { + // pictures in video ES channel + card->videoskip--; + if(card->videoskip) { + DecoderWriteByte(card, + 0x0EC + ,0x05); } else { - DecoderWriteByte(card, 0x0EC, 0x00); + DecoderWriteByte(card, + 0x0EC + , 0x00); } } else { - card->videorip = 0; + card->videoskip = 0; DecoderWriteByte (card, 0x0EC, 0x00); } } @@ -1208,8 +1246,8 @@ printk(KERN_DEBUG LOGNAME ": Int - CSS S } // if (intr[3] & 0x08) { // Data Dump channel PES data ready -// } - + // } + if (intr[4] & 0x10 ) { // SPU decode error printk(KERN_DEBUG LOGNAME ": Int - SPU decode error: (1CA)=0x%02X\n", DecoderReadByte(card, 0x1CA)); DecoderDelByte(card, 0x1A0, 0x01); // SPU decode stop @@ -1218,7 +1256,7 @@ printk(KERN_DEBUG LOGNAME ": Int - SPU d // Audio / Video Syncronisation - if (card->videosync && !card->videorip && !card->videodelay && !card->slowdown) { + if (card->videosync && !card->videoskip && !card->videodelay) { SCR_base = DecoderReadSCR(card, 0x009); SCR_compareV = DecoderReadSCR(card, 0x00D); //printk(KERN_DEBUG LOGNAME ": Sync: SCR = %08X\n", SCR_compareV); @@ -1286,14 +1324,14 @@ printk(KERN_DEBUG LOGNAME ": <<< Pausing } else { } } else { - card->videorip = 0; + card->videoskip = 0; if (Offset > -100) { if (Offset < -10) { - card->videorip = 10; + card->videoskip = 10; } else { - card->videorip = 3; + card->videoskip = 3; } -printk(KERN_DEBUG LOGNAME ": >>> FForward %d\n", card->videorip); +printk(KERN_DEBUG LOGNAME ": >>> FForward %d\n", card->videoskip); } } } else {