Annotation of margi2/streams.c, revision 1.1.1.1

1.1       cvs         1: /* 
                      2:     streams.c
                      3: 
                      4:     Copyright (C) Christian Wolff for convergence integrated media.
                      5: 
                      6:     This program is free software; you can redistribute it and/or modify
                      7:     it under the terms of the GNU General Public License as published by
                      8:     the Free Software Foundation; either version 2 of the License, or
                      9:     (at your option) any later version.
                     10: 
                     11:     This program is distributed in the hope that it will be useful,
                     12:     but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13:     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14:     GNU General Public License for more details.
                     15: 
                     16:     You should have received a copy of the GNU General Public License
                     17:     along with this program; if not, write to the Free Software
                     18:     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     19: */
                     20: 
                     21: #define __NO_VERSION__
                     22: 
                     23: #include "streams.h"
                     24: #include "dram.h"
                     25: #include "l64021.h"
                     26: #include "video.h"
                     27: #include "audio.h"
                     28: 
                     29: // Frees allocated channel buffers
                     30: int DecoderKillChannelBuffers(struct cvdv_cards *card)
                     31: {
                     32:        printk(KERN_DEBUG LOGNAME ": -- DecoderKillChannelBuffers\n");
                     33:        DecoderStopDecode(card);
                     34:        DRAMFree(card, card->VideoES);
                     35:        card->VideoES = BLANK;
                     36:        DRAMFree(card, card->AudioES);
                     37:        card->AudioES = BLANK;
                     38:        DRAMFree(card, card->VideoPES);
                     39:        card->VideoPES = BLANK;
                     40:        DRAMFree(card, card->DataDump);
                     41:        card->DataDump = BLANK;
                     42:        DRAMFree(card, card->AudioPES);
                     43:        card->AudioPES = BLANK;
                     44:        DRAMFree(card, card->NaviBank);
                     45:        card->NaviBank = BLANK;
                     46:        card->ChannelBuffersAllocated = 0;
                     47: //  DecoderWriteWord(
                     48:        return 0;
                     49: }
                     50: 
                     51: // Allocates channel buffers
                     52: // All sizes in bytes, preferably multiple of 256 (will be rounded up otherwise)
                     53: int DecoderSetChannelBuffers(struct cvdv_cards *card, int VideoES,     // Video ES Channel Buffer size, e.g. 229376 byte for NTSC
                     54:                             int AudioES,       // Audio ES Channel Buffer size, 4096 byte
                     55:                             int VideoPES,      // Video PES Header / SPU Channel Buffer size, 512 byte
                     56:                             int DataDump,      // Data Dump Channel Buffer size, e.g. 80896 byte
                     57:                             int AudioPES,      // Audio PES Header / System Channel Buffer size, 512 byte
                     58:                             int NaviBank)
                     59: {                              // Navi Bank Channel Buffer size, 2048 byte
                     60: #define BUFFERSET(buf,adr,align)  if (buf>0) {\
                     61:   if (buf&((1<<align)-1)) buf=(buf&~((1<<align)-1))+(1<<align);\
                     62:   addr=DRAMAlloc(card,buf,1<<align);\
                     63:   if (addr==BLANK) return adr;\
                     64:   card->buf=addr;\
                     65:   addr>>=align;\
                     66:   DecoderWriteByte(card,adr,addr&0xFF);\
                     67:   DecoderWriteByte(card,adr+1,(addr>>8)&(0x003F));\
                     68:   addr+=(buf>>align);\
                     69:   DecoderWriteByte(card,adr+2,(addr-1)&0xFF);\
                     70:   DecoderWriteByte(card,adr+3,((addr-1)>>8)&0x003F);\
                     71: }
                     72:        u32 addr;
                     73:        printk(KERN_DEBUG LOGNAME ": -- DecoderSetChannelBuffers\n");
                     74:        //DecoderStopDecode(card);
                     75:        DecoderStopChannel(card);
                     76:        VideoES >>= 1;          // change to word sizes
                     77:        AudioES >>= 1;
                     78:        VideoPES >>= 1;
                     79:        DataDump >>= 1;
                     80:        AudioPES >>= 1;
                     81:        NaviBank >>= 1;
                     82:        if (card->ChannelBuffersAllocated)
                     83:                DecoderKillChannelBuffers(card);
                     84:        BUFFERSET(VideoES, 0x048, 7);
                     85:        BUFFERSET(AudioES, 0x04C, 7);
                     86:        BUFFERSET(VideoPES, 0x050, 7);
                     87:        BUFFERSET(DataDump, 0x054, 7);
                     88:        BUFFERSET(AudioPES, 0x058, 7);
                     89:        BUFFERSET(NaviBank, 0x05C, 7);
                     90: 
                     91:        card->VideoESSize = VideoES;            
                     92:        card->AudioESSize = AudioES;            
                     93:        card->VideoPESSize = VideoPES;          
                     94:        card->DataDumpSize = DataDump;          
                     95:        card->AudioPESSize = AudioPES;          
                     96:        card->NaviBankSize = NaviBank;          
                     97: 
                     98:        DecoderWriteByte(card, 0x044, 0x7F);
                     99:        DecoderWriteByte(card, 0x044, 0x01);
                    100:        if (NaviBank) {
                    101:                card->reg07B |= 0x10;   // navi pack counter enable
                    102:                DecoderWriteByte(card, 0x07B, card->reg07B);
                    103:                //DecoderSetByte(card,0x07B,0x10);  // navi pack counter enable
                    104:                card->NaviPackAddress =
                    105:                    (DecoderReadWord(card, 0x05C) & 0x3FFF) << 7;
                    106: //printk(KERN_DEBUG LOGNAME ": navi bank init'ed: 0x%08X\n",card->NaviPackAddress);
                    107:        } else {
                    108:                card->reg07B &= ~0x10;  // navi pack counter disable
                    109:                DecoderWriteByte(card, 0x07B, card->reg07B);
                    110:                //DecoderDelByte(card,0x07B,0x10);  // navi pack counter disable
                    111:                card->NaviPackAddress = 0;
                    112:        }
                    113:        card->ChannelBuffersAllocated = 1;
                    114: #undef BUFFERSET
                    115:        return 0;
                    116: }
                    117: 
                    118: //int DecoderReadFifo
                    119: 
                    120: int DecoderUnPrepare(struct cvdv_cards *card)
                    121: {
                    122:        printk(KERN_ERR LOGNAME ": -- DecoderUnPrepare\n");
                    123:        //DecoderStopDecode(card);
                    124:        DecoderStopChannel(card);
                    125:        DecoderKillChannelBuffers(card);
                    126:        return 0;
                    127: }
                    128: 
                    129: void DecoderPrepare(struct cvdv_cards *card)
                    130: {
                    131:        //VideoSetBackground(card,0,0,0,0);      // Video on black
                    132:        VideoSetBackground(card, 1, 0, 0, 0);   // black
                    133:        //VideoSetBackground(card,2,83,90,249);  // Red
                    134:        //VideoSetBackground(card,2,155,53,53);  // Green
                    135:        //VideoSetBackground(card,2,35,212,114); // Blue
                    136:        //VideoSetBackground(card,2,4,128,128);  // Black
                    137:        //VideoSetBackground(card,3,155,53,53);  // Video on Green
                    138: 
                    139: //  DecoderWriteByte(card,0x044,0x00);  // Reset channel buffers on error
                    140: //  DecoderWriteByte(card,0x044,0x01);  // don't Reset channel buffers on error
                    141: 
                    142:        DecoderWriteByte(card, 0x040, 0x01);    // Reset Aux FIFO
                    143:        DecoderWriteByte(card, 0x041, 0x01);    // Reset Data FIFO
                    144:        //DecoderWriteByte(card,0x044,0x7E);    // Reset channel buffers, Reset channel buffers on error
                    145:        DecoderWriteByte(card, 0x044, 0x7F);    // Reset channel buffers, don't Reset channel buffers on error
                    146: //  udelay(100);
                    147: //  DecoderWriteByte(card,0x040,0x00);  // Reset Aux FIFO
                    148: //  DecoderWriteByte(card,0x041,0x00);  // Reset Data FIFO
                    149: //  DecoderDelByte(card,0x044,0x7E);    // Reset channel buffers
                    150: }
                    151: 
                    152: // Selects audio type MPEG and sets stream ID's
                    153: // AID:     -1=all MPEG, Audio Stream ID: 0..31
                    154: // AExt:    -1=unused, Audio Stream Extension ID: 0..31, only used if AType=5
                    155: void DecoderSelectAudioID(struct cvdv_cards *card)
                    156: {
                    157:        int AID = card->setup.audioID;
                    158:        int AExt = card->setup.audioIDext;
                    159:        printk(KERN_DEBUG LOGNAME ": -- SelectAudio %d %d\n", AID, AExt);
                    160:        DecoderWriteByte(card, 0x07C, AExt & 0x1F);     // Audio Stream Extension ID
                    161:        card->reg08F = (card->reg08F & ~0x1F) | (AID & 0x1F);
                    162:        DecoderWriteByte(card, 0x08F, card->reg08F);
                    163:        //DecoderMaskByte(card,0x08F,0x1F,AID&0x1F);   // Set Stream ID
                    164: }
                    165: 
                    166: // AHeader: 0=No Headers, 1=first PTS/DTS header, 2=all headers, 3=All with PTS/DTS
                    167: // 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)
                    168: // AID:     -1=all MPEG, Audio Stream ID: 0..31
                    169: // AExt:    -1=unused, Audio Stream Extension ID: 0..31, only used if AType=5
                    170: // IEC956:  0:MPEG/AC3 data on digital out 1:IEC956 data on digital S/PDIF out
                    171: void DecoderPrepareAudio(struct cvdv_cards *card)
                    172: {
                    173:        int AHeader = 2;
                    174:        int AType = 3;
                    175:        int AID = card->setup.audioID;
                    176:        int AExt = card->setup.audioIDext;
                    177:        int IEC956 = card->setup.SPDIFmode;
                    178:        printk(KERN_DEBUG LOGNAME ": -- PrepAudio %d %d %d %d %d\n",
                    179:               AHeader, card->setup.audioselect, AID, AExt, IEC956);
                    180:        switch (card->setup.audioselect) {
                    181:        case audio_disable:
                    182:        case audio_none:
                    183:        case audio_SDDS:
                    184:                AType = 0;
                    185:                break;
                    186:        case audio_MPEG:        // MPEG Audio
                    187:                AType = 1;
                    188:                break;
                    189:        case audio_MPEG_EXT:    // MPEG Audio with extension stream
                    190:                AType = 5;
                    191:                break;
                    192:        case audio_LPCM:        // Linear Pulse Code Modulation LPCM
                    193:                AType = 2;
                    194:                break;
                    195:        case audio_AC3: // AC-3
                    196:                AType = 3;
                    197:                break;
                    198:        case audio_DTS: // DTS
                    199:                AType = 8;
                    200:                break;
                    201:        }
                    202:        if (AType <= 0) {
                    203:                card->reg08F = 0x00;    // disable audio and discard all packets
                    204:                DecoderWriteByte(card, 0x08F, card->reg08F);
                    205:                //DecoderWriteByte(card,0x08F,0x00);  // disable audio and discard all packets
                    206:                //DecoderMaskByte(card,0x093,0xC3,0xC0);  // write no headers
                    207:                card->reg093 = (card->reg093 & ~0x03);  // write no headers
                    208:                DecoderWriteByte(card, 0x093, card->reg093);
                    209:        } else {
                    210:                AudioOpen(card);
                    211:                DecoderMaskByte(card, 0x165, 0x1F, 0x00);       // reset the register
                    212:                if (AType == 8) {       // DTS
                    213:                        card->reg090 |= 0x01;   // DTS in Transport Private 1 Stream stored in AudioES channel buffer
                    214:                        DecoderWriteByte(card, 0x090, card->reg090);
                    215:                        //DecoderSetByte(card,0x090,0x01);  // DTS in Transport Private 1 Stream stored in AudioES channel buffer
                    216:                        AudioSetMode(card, 0);
                    217:                        DecoderSetByte(card, 0x165, 0x01);
                    218:                        AudioStartFormat(card);
                    219:                } else if (AType == 3) {        // AC3
                    220:                        card->reg090 |= 0x01;   // AC3 in Transport Private 1 Stream stored in AudioES channel buffer
                    221:                        DecoderWriteByte(card, 0x090, card->reg090);
                    222:                        //DecoderSetByte(card,0x090,0x01);  // AC3 in Transport Private 1 Stream stored in AudioES channel buffer
                    223:                        AudioSetMode(card, ((IEC956) ? 1 : 3));
                    224:                } else if (AType == 2) {        // PCM
                    225:                        card->reg090 |= 0x01;   // PCM in Transport Private 1 Stream stored in AudioES channel buffer
                    226:                        DecoderWriteByte(card, 0x090, card->reg090);
                    227:                        //DecoderSetByte(card,0x090,0x01);  // PCM in Transport Private 1 Stream stored in AudioES channel buffer
                    228:                        AudioSetMode(card, 4);
                    229:                } else {        // MPEG
                    230:                        card->reg090 &= ~0x01;  // MPEG Audio stored in AudioES channel buffer
                    231:                        DecoderWriteByte(card, 0x090, card->reg090);
                    232:                        //DecoderDelByte(card,0x090,0x01);  // MPEG Audio stored in AudioES channel buffer
                    233:                        if (AID < 0)
                    234:                                AType = 4;
                    235:                        if (AExt >= 0)
                    236:                                AType = 5;
                    237:                        else
                    238:                                AExt = -1;
                    239:                        AudioSetMode(card, ((IEC956) ? 0 : 2));
                    240:                }
                    241:                card->setup.audioID = AID;
                    242:                card->setup.audioIDext = AExt;
                    243:                DecoderSelectAudioID(card);
                    244:                card->reg08F = (card->reg08F & ~0xE0) | ((AType & 0x07) << 5);  // Set Stream Type
                    245:                DecoderWriteByte(card, 0x08F, card->reg08F);
                    246:                //DecoderMaskByte(card,0x08F,0xE0,(AType&0x07)<<5);   // Set Stream Type
                    247:                AudioSetVolume(card, 0xFF);     // Set PCM scale to full volume
                    248:                //DecoderMaskByte(card,0x093,0xC3,(AHeader&0x03)|0xC0);  // write header select
                    249:                card->reg093 = (card->reg093 & ~0x03) | (AHeader & 0x03);       // write header select
                    250:                DecoderWriteByte(card, 0x093, card->reg093);
                    251:                //  Mute the card and put it in play mode, then wait for the parameters to be parsed and un-mute if successful
                    252:                //AudioMute(card,1);
                    253:                if (AType > 0) {
                    254:                        AudioStartDecode(card);
                    255:                        //AudioSetPlayMode(card,AUDIO_PLAY);
                    256:                        AudioSetPlayMode(card, AUDIO_PAUSE);
                    257:                }
                    258:                //card->startingA=1;
                    259:        }
                    260:        card->lastaattr = 0;
                    261: }
                    262: 
                    263: // VHeader: -1=disable Video, 0=No Headers, 1=first PTS/DTS header, 2=all headers, 3=All with PTS/DTS
                    264: // VID: -1=all MPEG, 0..15=Video Stream ID
                    265: void DecoderPrepareVideo(struct cvdv_cards *card)
                    266: {
                    267:        int VHeader = 3;
                    268:        int VID = card->setup.videoID;
                    269:        if (VHeader < 0) {
                    270:                card->reg091 = 0x00;
                    271:                DecoderWriteByte(card, 0x091, card->reg091);
                    272:                //DecoderWriteByte(card,0x091,0x00);
                    273:        } else {
                    274:                if (VID < 0) {
                    275:                        card->reg091 = ((VHeader & 0x03) << 6) | (2 << 4);
                    276:                        DecoderWriteByte(card, 0x091, card->reg091);
                    277:                        //DecoderWriteByte(card,0x091,((VHeader&0x03)<<6)|(2<<4));
                    278:                } else {
                    279:                        card->reg091 =
                    280:                            ((VHeader & 0x03) << 6) | (1 << 4) | (VID &
                    281:                                                                  0x0F);
                    282:                        DecoderWriteByte(card, 0x091, card->reg091);
                    283:                        //DecoderWriteByte(card,0x091,((VHeader&0x03)<<6)|(1<<4)|(VID&0x0F));
                    284:                }
                    285:        }
                    286: }
                    287: 
                    288: // Prepare Decoder for Elementary Streams, Disable Preparser
                    289: int DecoderPrepareES(struct cvdv_cards *card)
                    290: {
                    291:        int i;
                    292:        printk(KERN_DEBUG LOGNAME ": -- PrepareES\n");
                    293:        //DecoderStopDecode(card);
                    294: 
                    295: //  DecoderWriteByte(card,0x05,0x00);
                    296: 
                    297:        DecoderMaskByte(card, 0x007, 0xCE, 0xC2 | (3 << 2));    // Stream Select: A/V Elementary Stream
                    298: //printk(KERN_DEBUG LOGNAME ": Int - A VideoES w/r addr: %08X %08X\n",
                    299: //  (DecoderReadByte(card,0x060)|(DecoderReadByte(card,0x061)<<8)|(DecoderReadByte(card,0x062)<<16))<<2,
                    300: //  (DecoderReadByte(card,0x06C)|(DecoderReadByte(card,0x06D)<<8)|(DecoderReadByte(card,0x06E)<<16))<<2);
                    301:        // set the decoding buffers
                    302:        card->reg093 = (card->reg093 & ~0xFC);  // write no header
                    303:        DecoderWriteByte(card, 0x093, card->reg093);
                    304:        if ((i = DecoderSetChannelBuffers(card, 256000, 4096, 0, 0, 0, 0))) {
                    305:                printk(KERN_ERR LOGNAME
                    306:                       ": SetDecoderBuffers failed for buffer at 0x%03X\n",
                    307:                       i);
                    308:                DecoderKillChannelBuffers(card);
                    309:                return 1;
                    310:        }
                    311: //printk(KERN_DEBUG LOGNAME ": Int - B VideoES w/r addr: %08X %08X\n",
                    312: //  (DecoderReadByte(card,0x060)|(DecoderReadByte(card,0x061)<<8)|(DecoderReadByte(card,0x062)<<16))<<2,
                    313: //  (DecoderReadByte(card,0x06C)|(DecoderReadByte(card,0x06D)<<8)|(DecoderReadByte(card,0x06E)<<16))<<2);
                    314: 
                    315: //printk(KERN_DEBUG LOGNAME ": Int - C VideoES w/r addr: %08X %08X\n",
                    316: //  (DecoderReadByte(card,0x060)|(DecoderReadByte(card,0x061)<<8)|(DecoderReadByte(card,0x062)<<16))<<2,
                    317: //  (DecoderReadByte(card,0x06C)|(DecoderReadByte(card,0x06D)<<8)|(DecoderReadByte(card,0x06E)<<16))<<2);
                    318: 
                    319: //  DecoderStartChannel(card);   
                    320: //  DecoderStartDecode(card);
                    321: 
                    322: //printk(KERN_DEBUG LOGNAME ": Int - D VideoES w/r addr: %08X %08X\n",
                    323: //  (DecoderReadByte(card,0x060)|(DecoderReadByte(card,0x061)<<8)|(DecoderReadByte(card,0x062)<<16))<<2,
                    324: //  (DecoderReadByte(card,0x06C)|(DecoderReadByte(card,0x06D)<<8)|(DecoderReadByte(card,0x06E)<<16))<<2);
                    325: 
                    326:        DecoderPrepare(card);
                    327: 
                    328:        return 0;
                    329: }
                    330: 
                    331: // Prepare Decoder for Packetised Elementary Streams, set parameters of Preparser
                    332: int DecoderPreparePES(struct cvdv_cards *card)
                    333: {
                    334: 
                    335:        // SPUID: -1=No SPU, 0..31=Display SPU of this ID
                    336:        // DataDump: 0=disable DataDump, 1=process DataDump Substreams
                    337:        // PackHeader: 0=write no headers, 1=write one header, 2=write all headers
                    338:        // SysHeader: 0=write no headers, 1=write one header, 2=write all headers
                    339:        // DSIHeader: 0=write no headers, 3=write PCI and DSI headers and packets
                    340:        int i;
                    341:        int SPUID = -1;
                    342:        int DataDump = 0;
                    343:        int PackHeader = 0;
                    344:        int SysHeader = 0;
                    345:        int DSIHeader = 0;
                    346: 
                    347:        printk(KERN_DEBUG LOGNAME ": -- PreparePES\n");
                    348:        DecoderMaskByte(card, 0x007, 0xCE, 0xC2 | (0 << 2));    // Stream Select: A/V PES Packets
                    349: 
                    350:        if (SPUID < 0)
                    351:                card->reg092 = 0;       // Do we use SPU?
                    352:        else
                    353:                card->reg092 = 0x20 | (SPUID & 0x1F);
                    354:        if (DataDump)
                    355:                card->reg092 |= 0x40;   // Do we use DataDump?
                    356:        DecoderWriteByte(card, 0x092, card->reg092);
                    357:        //DecoderMaskByte(card,0x093,0xFC,((DSIHeader&0x03)<<6)|((PackHeader&0x03)<<4)|((SysHeader&0x03)<<2));
                    358:        card->reg093 =
                    359:            (card->reg093 & ~0xFC) | (((DSIHeader & 0x03) << 6) |
                    360:                                      ((PackHeader & 0x03) << 4) |
                    361:                                      ((SysHeader & 0x03) << 2));
                    362:        DecoderWriteByte(card, 0x093, card->reg093);
                    363:        // set the decoding buffers
                    364:        if (
                    365:            (i =
                    366:             DecoderSetChannelBuffers(card, 256000, 4096, 512, 0, 512,
                    367:                                      0))) {
                    368:                printk(KERN_ERR LOGNAME
                    369:                       ": SetDecoderBuffers failed for buffer at 0x%03X\n",
                    370:                       i);
                    371:                DecoderKillChannelBuffers(card);
                    372:                return 1;
                    373:        }
                    374: 
                    375:        DecoderPrepare(card);
                    376: 
                    377:        return 0;
                    378: }
                    379: 
                    380: 
                    381: // Prepare Decoder for MPEG 1 Systems Streams or MPEG 2 Program Streams
                    382: // SPUID: -1:ignore, 0...15 SPU Substream ID
                    383: // DataDump: 0:disable data dump stream, 1:enable data dump stream
                    384: // PackHeader: 0:write no headers, 1:write one header, 2:write all headers, 3:always discard
                    385: // SysHeader: 0:always discard, 1:write one header, 2:write all headers, 3:always discard
                    386: // DSIHeader: 0:write no DSI or PCI headers, 3:write DSI and PCI headers + packets
                    387: // DVD: 0: normal MPEG-2 data, 1: DVD stream with navi pack data
                    388: int DecoderPreparePS(struct cvdv_cards *card,
                    389:                     int SPUID, int DataDump,
                    390:                     int PackHeader, int SysHeader, int DSIHeader, int DVD)
                    391: {
                    392:        int i=0;
                    393:        printk(KERN_DEBUG LOGNAME ": -- PreparePS %s\n",
                    394:               ((DVD) ? "DVD" : ""));
                    395:        //DecoderStopDecode(card);
                    396:        DecoderMaskByte(card, 0x007, 0xCE, 0xC2 | (1 << 2));    // Stream Select: MPEG1 System / MPEG2 Program Stream
                    397: 
                    398:        if (SPUID < 0)
                    399:                card->reg092 = 0;       // Do we use SPU?
                    400:        else
                    401:                card->reg092 = 0x20 | (SPUID & 0x1F);
                    402:        if (DataDump)
                    403:                card->reg092 |= 0x40;   // Do we use DataDump?
                    404:        DecoderWriteByte(card, 0x092, card->reg092);
                    405:        //DecoderMaskByte(card,0x093,0xFC,((DSIHeader&0x03)<<6)|((PackHeader&0x03)<<4)|((SysHeader&0x03)<<2));
                    406:        card->reg093 =
                    407:            (card->reg093 & ~0xFC) | (((DSIHeader & 0x03) << 6) |
                    408:                                      ((PackHeader & 0x03) << 4) |
                    409:                                      ((SysHeader & 0x03) << 2));
                    410:        DecoderWriteByte(card, 0x093, card->reg093);
                    411:        // set the decoding buffers
                    412:        if (DVD) {              // do we need SPU-, navi- and datadump-buffers?
                    413:                
                    414:          //      if(card->videomode == NTSC)
                    415:                i = DecoderSetChannelBuffers(card, 340000, 32768, 16384, 0, 
                    416:                                             512,2048) ;
                    417:                //else
                    418:                //              i = DecoderSetChannelBuffers(card, 291878, 16384, 512, 0, 
                    419:                //   512,0) ;
                    420: 
                    421:                if (i) {
                    422:                        printk(KERN_ERR LOGNAME
                    423:                               ": SetDecoderBuffers failed for buffer at 0x%03X\n",
                    424:                               i);
                    425:                        DecoderKillChannelBuffers(card);
                    426:                        return 1;
                    427:                }
                    428:                
                    429:        } else {                // normal PS
                    430:                if (
                    431:                    (i =
                    432:                   DecoderSetChannelBuffers(card, 300000, 64288, 512,
                    433:                                   0, 512, 0))) {
                    434:                        printk(KERN_ERR LOGNAME
                    435:                               ": SetDecoderBuffers failed for buffer at 0x%03X\n",
                    436:                               i);
                    437:                        DecoderKillChannelBuffers(card);
                    438:                        return 1;
                    439:                }
                    440:        }
                    441: 
                    442:        DecoderPrepare(card);
                    443: 
                    444:        return 0;
                    445: }

LinuxTV legacy CVS <linuxtv.org/cvs>