Annotation of margi2/decoder.c, revision 1.8
1.1 cvs 1: /*
2: decoder.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 "decoder.h"
24: #include "l64021.h"
25: #include "video.h"
26: #include "audio.h"
27: #include "streams.h"
28: #include "osd.h"
29: #include "dram.h"
1.5 mocm 30: #include "cvdv.h"
1.1 cvs 31:
32: int DecoderGetNavi(struct cvdv_cards *card, u8 *navidata)
33: {
34: if (card->navihead == card->navitail) return 0;
35: // printk(KERN_DEBUG LOGNAME ": Retreiving NaviPack\n");
36: memcpy(navidata, &card->navibuffer[card->navitail], NAVISIZE);
37: card->navitail += NAVISIZE;
38: if (card->navitail >= NAVIBUFFERSIZE) card->navitail = 0;
39: return NAVISIZE;
40: }
41:
42: // returns 1 on overrun, 0 on no error
43: int DecoderQueueNavi(struct cvdv_cards *card, u8 *navidata)
44: {
45: memcpy(&card->navibuffer[card->navihead], navidata, NAVISIZE);
46: card->navihead += NAVISIZE;
47: if (card->navihead >= NAVIBUFFERSIZE) card->navihead = 0;
48: if (card->navihead == card->navitail) {
49: // printk(KERN_DEBUG LOGNAME ": NaviPack buffer overflow\n");
50: card->navitail += NAVISIZE;
51: if (card->navitail >= NAVIBUFFERSIZE) card->navitail = 0;
52: return 1;
53: }
54: return 0;
55: }
56:
1.6 mocm 57: u32 ParseSCR(const u8 *data)
1.1 cvs 58: {
59: u32 SCR_base=0;
1.6 mocm 60: u8 scrdata[9];
61: copy_from_user (scrdata, data, 9);
62:
1.1 cvs 63: if ((!scrdata[0]) && (!scrdata[1]) && (scrdata[2]==1)
64: && (scrdata[3]==0xBA) && ((scrdata[4]&0xC0)==0x40)) {
65: SCR_base=((scrdata[4]>>3)&0x07);
66: SCR_base=(SCR_base<<2) | (scrdata[4]&0x03);
67: SCR_base=(SCR_base<<8) | scrdata[5];
68: SCR_base=(SCR_base<<5) | ((scrdata[6]>>3)&0x1F);
69: SCR_base=(SCR_base<<2) | (scrdata[6]&0x03);
70: SCR_base=(SCR_base<<8) | scrdata[7];
71: SCR_base=(SCR_base<<5) | ((scrdata[8]>>3)&0x1F);
72: }
73: return SCR_base;
74: }
75:
76: u32 SetSCR(struct cvdv_cards *card, u32 SCR_base)
77: {
78: // printk(KERN_ERR LOGNAME ": SCR in DVD Pack: 0x%08X\n",SCR_base);
79: if (DecoderReadByte(card, 0x007) & 0x10) { // SCR already stopped
80: DecoderWriteByte(card,0x009,SCR_base&0xFF); // Set SCR counter
81: DecoderWriteByte(card,0x00A,(SCR_base>>8)&0xFF);
82: DecoderWriteByte(card,0x00B,(SCR_base>>16)&0xFF);
83: DecoderWriteByte(card,0x00C,(SCR_base>>24)&0xFF);
84: } else {
85: DecoderMaskByte(card,0x007,0xD2,0xD2);
86: // Set 0x10, halt SCR counter
87: DecoderWriteByte(card,0x009,SCR_base&0xFF); // Set SCR counter
88: DecoderWriteByte(card,0x00A,(SCR_base>>8)&0xFF);
89: DecoderWriteByte(card,0x00B,(SCR_base>>16)&0xFF);
90: DecoderWriteByte(card,0x00C,(SCR_base>>24)&0xFF);
91: DecoderMaskByte(card,0x007,0xD2,0xC2);
92: // Del 0x10, SCR counter run
93: }
94: return SCR_base;
95: }
96:
97: void DecoderPause(struct cvdv_cards *card)
98: {
99: DecoderMaskByte(card, 0x007, 0xD2, 0xD2);
100: // Set 0x010, halt SCR counter
1.6 mocm 101: AudioSetPlayMode(card, MAUDIO_PAUSE);
1.1 cvs 102: DecoderStopDecode(card);
1.7 mocm 103: card->videostate.playState=VIDEO_FREEZED;
1.8 ! mocm 104: card->videoffwd = 0;
! 105: card->videoslow = 0;
1.1 cvs 106: }
107:
108: void DecoderUnPause(struct cvdv_cards *card)
109: {
110: DecoderStartDecode(card);
1.8 ! mocm 111: card->videoffwd = 0;
1.6 mocm 112: AudioSetPlayMode(card, MAUDIO_PLAY);
1.1 cvs 113: DecoderMaskByte(card, 0x007, 0xD2, 0xC2);
114: // Del 0x010, SCR counter run
1.7 mocm 115: card->videostate.playState=VIDEO_PLAYING;;
1.8 ! mocm 116: card->videoslow = 0;
1.1 cvs 117: }
118:
119: void CloseCard(struct cvdv_cards *card)
120: {
1.6 mocm 121: int i;
122: #ifdef NOINT
123: spin_lock(&card->timelock);
124: i = del_timer(&card->timer);
125: spin_unlock(&card->timelock);
126: #endif
1.4 mocm 127: MargiFlush(card);
1.1 cvs 128: printk(KERN_DEBUG LOGNAME ": Closing card\n");
1.3 rjkm 129: card->DecoderOpen = 1;
130: DecoderClose(card);
131: DecoderUnPrepare(card);
1.1 cvs 132: DecoderStreamReset(card);
133: DecoderSetupReset(card);
1.8 ! mocm 134: VideoSetBackground(card, 1, 0, 0, 0);
1.1 cvs 135:
136: AudioClose(card);
137: OSDClose(card);
1.4 mocm 138: L64021Init(card);
1.6 mocm 139:
1.5 mocm 140: OSDOpen(card, 50, 50, 150, 150, 2, 1);
141: OSDTest(card);
1.1 cvs 142: }
143:
144:
145: void DecoderReadAudioInfo(struct cvdv_cards *card)
146: {
147: u8 data;
148: static int bitrates[17] = {0, 32, 40, 48, 56, 64, 80, 96, 112,
149: 128, 160, 192, 224, 256, 320, 384, 0};
150: struct AudioParam *audio = &card->stream.audio;
151: data = DecoderReadByte(card, 0x150);
152: audio->mpeg.present = data & 0x60;
153: // MPEG Layer Code 00 reserverd, we can assume valid MPEG params
154: if (audio->mpeg.present) {
155: audio->mpeg.MPEG2 = data & 0x80;
156: audio->mpeg.layer = 4 - ((data >> 5) & 0x03);
157: if (data & 0x0F) {
158: if ((data & 0x0F) == 1) audio->mpeg.bitrate = 32;
159: else switch (audio->mpeg.layer) {
160: case 1:
161: audio->mpeg.bitrate = 32 * (data & 0x0F);
162: break; // Layer I
163: case 2:
164: audio->mpeg.bitrate = bitrates[(data & 0x0F) +
165: 1];
166: break; // Layer II
167: default:
168: audio->mpeg.bitrate = bitrates[data & 0x0F];
169: // Layer III
170: }
171: } else audio->mpeg.bitrate = 0;
172: data = DecoderReadByte(card, 0x151);
173: switch ((data >> 6) & 0x03) {
174: case 0:
175: audio->mpeg.samplefreq = 44;
176: break;
177: case 1:
178: audio->mpeg.samplefreq = 48;
179: break;
180: case 2:
181: audio->mpeg.samplefreq = 32;
182: break;
183: default:
184: audio->mpeg.samplefreq = 0; // invalid
185: }
186: audio->mpeg.mode = (data >> 3) & 0x03;
187: audio->mpeg.modeext = (data >> 1) & 0x03;
188: audio->mpeg.copyright = data & 0x01;
189: data=DecoderReadByte(card, 0x152);
190: audio->mpeg.original = data & 0x80;
191: audio->mpeg.emphasis = (data >> 5) & 0x03;
192: }
193: data = DecoderReadByte(card, 0x153);
194: audio->ac3.present = (data != 0);
195: // value 0 for bits 0..5 forbidden, we can assume valid ac3 params
196: if (audio->ac3.present) {
197: audio->ac3.acmod = (data >> 5) & 0x07;
198: audio->ac3.dialnorm = data & 0x1F;
199: data = DecoderReadByte(card, 0x154);
200: audio->ac3.bsmod = (data >> 5) & 0x07;
201: audio->ac3.dialnorm2 = data > 0x1F;
202: data = DecoderReadByte(card, 0x155);
203: audio->ac3.surmixlev = (data >> 6) & 0x03;
204: audio->ac3.mixlevel = (data >> 1) & 0x1F;
205: data = DecoderReadByte(card, 0x156);
206: audio->ac3.cmixlev = (data >> 6) & 0x03;
207: audio->ac3.mixlevel2 = (data >> 1) & 0x1F;
208: data = DecoderReadByte(card, 0x157);
209: audio->ac3.fscod = (data >> 6) & 0x03;
210: audio->ac3.lfeon = (data >> 5) & 0x01;
211: audio->ac3.bsid = data & 0x1F;
212: data = DecoderReadByte(card, 0x158);
213: audio->ac3.dsurmod = (data >> 6) & 0x03;
214: audio->ac3.frmsizecod = data & 0x3F;
215: audio->ac3.langcod = DecoderReadByte(card, 0x159);
216: audio->ac3.langcod2 = DecoderReadByte(card, 0x15A);
217: audio->ac3.timecod = DecoderReadByte(card, 0x15B);
218: data = DecoderReadByte(card, 0x15C);
219: audio->ac3.timecod = (audio->ac3.timecod << 6) |
220: ((data >> 2) & 0x3F);
221: audio->ac3.roomtyp = data & 0x03;
222: audio->ac3.timecod2 = DecoderReadByte(card, 0x15D);
223: data = DecoderReadByte(card, 0x15E);
224: audio->ac3.timecod2 = (audio->ac3.timecod2 << 6) |
225: ((data >> 2) & 0x3F);
226: audio->ac3.roomtyp2 = data & 0x03;
227: }
228: audio->pcm.present =! (DecoderReadByte(card, 0x161) & 0x20);
229: // PCM FIFO not empty? Then, we can assume valid LPCM params
230: if (audio->pcm.present) {
231: data = DecoderReadByte(card, 0x15F);
232: audio->pcm.audio_frm_num = (data >> 3) & 0x1F;
233: audio->pcm.num_of_audio_ch = data & 0x07;
234: data = DecoderReadByte(card, 0x160);
235: audio->pcm.Fs = (data >> 6) & 0x03;
236: audio->pcm.quantization = (data >> 4) & 0x03;
237: audio->pcm.emphasis = (data >> 2) & 0x03;
238: audio->pcm.mute_bit = (data >> 1) & 0x01;
239: }
240: switch (card->setup.audioselect) {
241: case audio_disable:
242: audio->valid = 0;
243: break;
244: case audio_none:
245: case audio_DTS:
246: case audio_SDDS:
247: if ((audio->valid = (audio->ac3.present ||
248: audio->pcm.present ||
249: audio->mpeg.present))) {
250: if (audio->mpeg.present) {
251: card->setup.audioselect = audio_MPEG;
252: } else if (audio->pcm.present) {
253: card->setup.audioselect = audio_LPCM;
254: } else if (audio->ac3.present) {
255: card->setup.audioselect = audio_AC3;
256: }
257: } else {
258: audio->valid = 0;
259: card->setup.audioselect = audio_none;
260: }
261: break;
262: case audio_MPEG: // MPEG Audio
263: case audio_MPEG_EXT: // MPEG Audio with extension stream
264: audio->valid = audio->mpeg.present;
265: break;
266: case audio_LPCM: // Linear Pulse Code Modulation LPCM
267: audio->valid = audio->pcm.present;
268: break;
269: case audio_AC3: // AC-3
270: audio->valid = audio->ac3.present;
271: break;
272: }
273: printk(KERN_DEBUG LOGNAME ": -- DecoderReadAudioInfo - type/valid %d/%d:\n", card->setup.audioselect, audio->valid);
274: if (audio->mpeg.present || audio->ac3.present || audio->pcm.present)
275: printk(KERN_DEBUG LOGNAME ": Audio - Decoded parameters:\n");
276: if (audio->mpeg.present) printk(KERN_DEBUG LOGNAME ": MPEG%s Layer %d, %d kHz, %d kbps, %s, %s%s, %s emphasis\n",
277: ((audio->mpeg.MPEG2) ? "2" : "1"),
278: audio->mpeg.layer,
279: audio->mpeg.samplefreq,
280: audio->mpeg.bitrate,
281: ((audio->mpeg.mode == 0) ? "stereo" : ((audio->mpeg.mode == 1) ? "joint stereo" : ((audio->mpeg.mode == 2) ? "dual channel" : "single channel"))),
282: ((audio->mpeg.copyright) ? "copyrighted " : ""),
283: ((audio->mpeg.original) ? "original" : "copy"),
284: ((audio->mpeg.emphasis == 0) ? "no" : ((audio->mpeg.emphasis == 1) ? "50/15 usec." : ((audio->mpeg.emphasis == 2) ? "invalid" : "J.17")))
285: );
286: if (audio->ac3.present) printk(KERN_DEBUG LOGNAME ": AC3 acmod=%d bsmod=%d dialnorm=%d dialnorm2=%d surmixlev=%d mixlevel=%d cmixlev=%d mixlevel2=%d fscod=%d lfeon=%d bsid=%d dsurmod=%d frmsizecod=%d langcod=%d langcod2=%d timecod=%d roomtyp=%d timecod2=%d roomtyp2=%d\n",
287: audio->ac3.acmod,
288: audio->ac3.bsmod,
289: audio->ac3.dialnorm,
290: audio->ac3.dialnorm2,
291: audio->ac3.surmixlev,
292: audio->ac3.mixlevel,
293: audio->ac3.cmixlev,
294: audio->ac3.mixlevel2,
295: audio->ac3.fscod,
296: audio->ac3.lfeon,
297: audio->ac3.bsid,
298: audio->ac3.dsurmod,
299: audio->ac3.frmsizecod,
300: audio->ac3.langcod,
301: audio->ac3.langcod2,
302: audio->ac3.timecod,
303: audio->ac3.roomtyp,
304: audio->ac3.timecod2,
305: audio->ac3.roomtyp2);
306: if (audio->pcm.present) printk(KERN_DEBUG LOGNAME ": LPCM audio_frm_num=%d num_of_audio_ch=%d Fs=%d quantization=%d emphasis=%d mute_bit=%d\n",
307: audio->pcm.audio_frm_num,
308: audio->pcm.num_of_audio_ch,
309: audio->pcm.Fs,
310: audio->pcm.quantization,
311: audio->pcm.emphasis,
312: audio->pcm.mute_bit);
313: }
314:
315: void DecoderReadAuxFifo(struct cvdv_cards *card)
316: {
317: int i = 0;
318: u8 data;
319: int layer;
320:
321: struct StreamInfo *stream = &card->stream;
322: // printk(KERN_DEBUG LOGNAME ": AUX - ");
323: // printk("%03X ", card->AuxFifo[card->AuxFifoTail]);
324: while (card->AuxFifoHead != card->AuxFifoTail) {
325:
326: layer = (card->AuxFifo[card->AuxFifoTail] >> 8) & 0x07;
327: data = card->AuxFifo[card->AuxFifoTail] & 0xFF;
328: card->AuxFifoTail = (card->AuxFifoTail + 1) & FIFO_MASK;
329: if (layer != card->AuxFifoLayer) { // start of a new layer?
330: i = 0;
331: card->AuxFifoLayer = layer;
332: } else i++;
333: switch (layer) { // layer code
334: case 0: // sequence header
335: if (! stream->sh.valid) switch (i) {
336: case 0:
337: stream->sh.hsize = data & 0x0F;
338: break;
339: case 1:
340: stream->sh.hsize = (stream->sh.hsize << 8)
341: | data;
342: stream->hsize = stream->sh.hsize;
343: break;
344: case 2:
345: stream->sh.vsize = data & 0x0F;
346: break;
347: case 3:
348: stream->sh.vsize = (stream->sh.vsize << 8) |
349: data;
350: stream->vsize = stream->sh.vsize;
351: break;
352: case 4:
353: stream->sh.aspectratio = data & 0x0F;
354: break;
355: case 5:
356: stream->sh.frameratecode = data & 0x0F;
357: break;
358: case 6:
359: stream->sh.bitrate = data & 0x03;
360: break;
361: case 7:
362: stream->sh.bitrate = (stream->sh.bitrate << 8)
363: | data;
364: break;
365: case 8:
366: stream->sh.bitrate = (stream->sh.bitrate << 8)
367: | data;
368: stream->bitrate = stream->sh.bitrate;
369: break;
370: case 9:
371: stream->sh.vbvbuffersize = data & 0x03;
372: break;
373: case 10:
374: stream->sh.vbvbuffersize =
375: (stream->sh.vbvbuffersize << 8) |
376: data;
377: stream->vbvbuffersize =
378: stream->sh.vbvbuffersize;
379: break;
380: case 11:
381: stream->sh.constrained = data & 0x01;
382: stream->sh.valid = 1;
383: printk(KERN_DEBUG LOGNAME ": AUX - MPEG1 - %dx%d %s %s fps, %d bps, %d kByte vbv%s\n", stream->sh.hsize, stream->sh.vsize,
384: ((stream->sh.aspectratio == 1) ? "1:1" :
385: ((stream->sh.aspectratio == 2) ? "3:4" :
386: ((stream->sh.aspectratio == 3) ? "9:16" :
387: ((stream->sh.aspectratio == 4) ? "1:2.21" :
388: "?:?")))),
389: ((stream->sh.frameratecode == 1) ? "23.976" :
390: ((stream->sh.frameratecode == 2) ? "24" :
391: ((stream->sh.frameratecode == 3) ? "25" :
392: ((stream->sh.frameratecode == 4) ? "29.97" :
393: ((stream->sh.frameratecode == 5) ? "30" :
394: ((stream->sh.frameratecode == 6) ? "50" :
395: ((stream->sh.frameratecode == 7) ? "59.94" :
396: ((stream->sh.frameratecode == 8) ? "60" :
397: "?")))))))),
398: stream->sh.bitrate * 400,
399: stream->sh.vbvbuffersize * 16,
400: ((stream->sh.constrained) ? ", constrained" : "")
401: );
402: break;
403: }
404: break;
405: case 1: // group of pictures
406: if (! stream->gop.valid)
407: switch (i) {
408: case 0:
409: stream->gop.timecode = data & 0x01;
410: break;
411: case 1:
412: stream->gop.timecode =
413: (stream->gop.timecode << 8) |
414: data;
415: break;
416: case 2:
417: stream->gop.timecode =
418: (stream->gop.timecode << 8) |
419: data;
420: break;
421: case 3:
422: stream->gop.timecode =
423: (stream->gop.timecode << 8) |
424: data;
425: break;
426: case 4:
427: stream->gop.closedgop = data & 0x01;
428: break;
429: case 5:
430: stream->gop.brokenlink = data & 0x01;
431: stream->gop.valid = 1;
432: break;
433: }
434: break;
435: case 2: // picture
436: if (0)
437: switch (i) {
438: case 0:
439: break;
440: }
441: break;
442: case 7: // extension layer
443: if (i == 0) card->AuxFifoExt = data;
444: else
445: switch (card->AuxFifoExt) { // extension code
446: case 1: // sequence extension
447: if ((stream->sh.valid) &&
448: (! stream->se.valid))
449: switch (i) {
450: case 1:
451: stream->se.profilelevel
452: = data;
453: break;
454: case 2:
455: stream->se.progressive
456: = data & 0x01;
457: break;
458: case 3:
459: stream->se.chroma =
460: (data >> 4) &
461: 0x03;
462: stream->se.hsizeext =
463: (data >> 2) &
464: 0x03;
465: stream->se.vsizeext =
466: data & 0x03;
467: stream->hsize |=
468: (stream->se.hsizeext << 12);
469: stream->vsize |=
470: (stream->se.vsizeext << 12);
471: break;
472: case 4:
473: stream->se.bitrateext =
474: data & 0x0F;
475: break;
476: case 5:
477: stream->se.bitrateext =
478: (stream->se.bitrateext << 8) | data;
479: stream->bitrate |=
480: (stream->se.bitrateext << 18);
481: break;
482: case 6:
483: stream->se.vbvbuffersizeext = data;
484: stream->vbvbuffersize |= (stream->se.vbvbuffersizeext << 10);
485: break;
486: case 7:
487: stream->se.lowdelay =
488: (data >> 7) &
489: 0x01;
490: stream->se.frextn =
491: (data >> 5) &
492: 0x03;
493: stream->se.frextd =
494: data & 0x1F;
495: stream->se.valid = 1;
496: stream->MPEG2 = 1;
497: printk(KERN_DEBUG LOGNAME ": AUX - MPEG2 - %dx%d %s %s*%d/%d fps, %d bps, %d kByte vbv%s%s\n", stream->hsize, stream->vsize,
498: ((stream->sh.aspectratio == 1) ? "1:1" :
499: ((stream->sh.aspectratio == 2) ? "3:4" :
500: ((stream->sh.aspectratio == 3) ? "9:16" :
501: ((stream->sh.aspectratio == 4) ? "1:2.21" :
502: "?:?")))),
503: ((stream->sh.frameratecode == 1) ? "23.976" :
504: ((stream->sh.frameratecode == 2) ? "24" :
505: ((stream->sh.frameratecode == 3) ? "25" :
506: ((stream->sh.frameratecode == 4) ? "29.97" :
507: ((stream->sh.frameratecode == 5) ? "30" :
508: ((stream->sh.frameratecode == 6) ? "50" :
509: ((stream->sh.frameratecode == 7) ? "59.94" :
510: ((stream->sh.frameratecode == 8) ? "60" :
511: "?")))))))),
512: stream->se.frextn + 1,
513: stream->se.frextd + 1,
514: stream->bitrate * 400,
515: stream->vbvbuffersize * 16,
516: ((stream->sh.constrained) ? ", constrained" : ""),
517: ((stream->se.lowdelay) ? ", low delay" : "")
518: );
519: break;
520: }
521: break;
522: case 2: // sequence display extension
523: if (0)
524: switch (i) {
525: case 0:
526: break;
527: }
528: break;
529: case 3: // quant matrix extension
530: if (0)
531: switch (i) {
532: case 0:
533: break;
534: }
535: break;
536: case 4: // copyright extension
537: if (0)
538: switch (i) {
539: case 0:
540: break;
541: }
542: break;
543: case 7: // picture display extension
544: if (0) switch (i) {
545: case 0:
546: break;
547: }
548: break;
549: case 8: // picture coding extension
550: if (0)
551: switch (i) {
552: case 0:
553: break;
554: }
555: break;
556: default:
557: break;
558: }
559: break;
560: default:break;
561: }
562:
563: }
564: }
565:
566: void DecoderReadDataFifo(struct cvdv_cards *card)
567: {
568: // printk(KERN_DEBUG LOGNAME ": DATA - ");
569: while (card->DataFifoHead != card->DataFifoTail) {
570: // printk("%03X ", card->DataFifo[card->DataFifoTail]);
571: card->DataFifoTail = (card->DataFifoTail + 1) & FIFO_MASK;
572: }
573: // printk("\n");
574: }
575:
576: int DecoderReadNavipack(struct cvdv_cards *card)
577: {
578: u32 startaddr, endaddr, writeaddr;
579: u8 navipack[1024];
580: u16 PacketLength;
581: u8 SubStreamID;
582: //struct Navi navi;
583: int i;
584: startaddr = (DecoderReadWord(card, 0x05C) & 0x3FFF) << 7;
585: // 21 bit word address
586: endaddr = (DecoderReadWord(card, 0x05E) & 0x3FFF) << 7;
587: // 21 bit word address
588: writeaddr = DecoderReadByte(card, 0x075) & 0xFF;
589: writeaddr |= (DecoderReadWord(card, 0x077) & 0x0FFF) << 8;
590: //writeaddr <<= 3;
591: //printk(KERN_DEBUG LOGNAME ": -- DecoderReadNavipack 0x%08X-0x%08X, ->0x%08X <-0x%08X\n", startaddr, endaddr, writeaddr, card->NaviPackAddress);
592:
593: if (DecoderReadByte(card, 0x07B) & 0xC0) { // navi pack available?
594: DRAMReadByte(card, card->NaviPackAddress, 1024, navipack, 0);
595: card->reg07B |= 0x20; // decrement navi counter
596: DecoderWriteByte(card, 0x07B, card->reg07B);
597: card->reg07B &= ~0x20;
598: //DecoderSetByte(card, 0x07B, 0x20); // decrement navi counter
599: card->NaviPackAddress += 512; // increment in words
600: if (card->NaviPackAddress >= endaddr)
601: card->NaviPackAddress = startaddr;
602: //printk(KERN_DEBUG LOGNAME ": Navipack %02X %02X %02X %02X %02X %02X %02X %02X\n",
603: // navipack[0], navipack[1], navipack[2], navipack[3], navipack[4], navipack[5], navipack[6], navipack[7]);
604: if ((!navipack[0]) && (!navipack[1]) && (navipack[2] == 1) && (navipack[3] == 0xBF)) {
605: PacketLength = (navipack[4] << 8) | navipack[5];
606: SubStreamID = navipack[6];
607: //printk(KERN_DEBUG LOGNAME ": Navipack Len=%d, ID=%d\n", PacketLength, SubStreamID);
608: i = 7; // start of payload data in navipack[]
609: switch (SubStreamID) {
610: case 0: // Presentation Control Information (PCI)
611: if (PacketLength < 980) return 1; // Packet too small
612: DecoderQueueNavi(card, navipack);
613: break;
614: case 1: // Data Search Information (DSI)
615: if (PacketLength < 1018) return 1; // Packet too small
616: DecoderQueueNavi(card, navipack);
617: break;
618: default:
619: break;
620: }
621: // } else {
622: // printk(KERN_DEBUG LOGNAME ": navi pack format error: %02X %02X %02X %02X %02X %02X %02X %02X.\n",
623: // navipack[0], navipack[1], navipack[2], navipack[3], navipack[4], navipack[5], navipack[6], navipack[7]);
624: }
625: // } else {
626: // printk(KERN_DEBUG LOGNAME ": no navi pack avail.\n");
627: }
628: return 0;
629: }
630:
631: int AudioStart(struct cvdv_cards *card)
632: {
633: DecoderReadAudioInfo(card); // detect audio type
634: if (card->stream.audio.valid) {
635: printk(KERN_DEBUG LOGNAME ": Audio Init in delayed decoder start\n");
636: if (card->AudioInitialized) AudioClose(card);
637: switch (card->setup.audioselect) {
638: case audio_MPEG: // MPEG Audio
639: case audio_MPEG_EXT: // MPEG Audio with ext.
640: printk(KERN_DEBUG LOGNAME ": Using MPEG Audio\n");
641: AudioInit(card, card->stream.audio.mpeg.samplefreq, 0);
642: if (card->stream.audio.mpeg.mode == 3) AudioDualMono(card, 2); // left channel only
643: else AudioDualMono(card, 0);
644: break;
645: case audio_DTS:
646: case audio_LPCM: // Linear Pulse Code Modulation LPCM
647: printk(KERN_DEBUG LOGNAME ": Using LPCM Audio\n");
648: AudioInit(card, 48, 0); // or 96
649: break;
650: case audio_AC3: // AC-3
651: printk(KERN_DEBUG LOGNAME ": Using AC-3 Audio\n");
652: switch (card->stream.audio.ac3.fscod) {
653: case 0:AudioInit(card, 48, 0); break;
654: case 1:AudioInit(card, 44, 0); break;
655: case 2:AudioInit(card, 32, 0); break;
656: }
657: break;
658: case audio_none:
659: case audio_disable:
660: case audio_SDDS:
661: }
662: } else return 1;
663: return 0;
664: }
665:
666: u32 DecoderReadSCR(struct cvdv_cards *card, u16 address)
667: {
668: u32 SCR;
669: SCR = DecoderReadByte(card, address);
670: SCR |= ((u32)DecoderReadByte(card, address+1) << 8);
671: SCR |= ((u32)DecoderReadByte(card, address+2) << 16);
672: SCR |= ((u32)DecoderReadByte(card, address+3) << 24);
673: return SCR;
674: }
675:
676: u32 DecoderReadRWAddr(struct cvdv_cards *card, u16 address)
677: {
678: u32 addr;
679: addr = DecoderReadByte(card, address) & 0xFF;
680: addr |= (((u32)DecoderReadByte(card, address+1) & 0xFF) << 8);
681: addr |= (((u32)DecoderReadByte(card, address+2) & 0x0F) << 16);
682: return addr;
683: }
684:
685: int PTSGetFirstPTS(PTSStorage *store, u32 *PTS)
686: {
687: if ( store->end == store->begin ) {
688: return 0;
689: } else {
690: *PTS = store->PTS[store->begin];
691: return 1;
692: }
693: }
694:
695: void PTSStoreAdd(PTSStorage *store, u32 PTS, u32 AddrB, u32 AddrE)
696: {
697: int new;
698:
699: //printk(KERN_DEBUG LOGNAME ": PTSStoreAdd - store in [%d] %08X - %08X\n", store->end, AddrB, AddrE);
700:
701: // cheap fix: don't store if address rollover
702: if ((AddrB & 0x00080000) != (AddrE & 0x00080000)) return;
703:
704: new = store->end;
705:
706: store->end++;
707: if (store->end >= store->size) store->end = 0;
708: if (store->end == store->begin) {
709: store->begin++;
710: if (store->begin >= store->size) store->begin = 0;
711: }
712:
713: store->AddrB[new] = AddrB;
714: store->AddrE[new] = AddrE;
715: store->PTS[new] = PTS;
716: }
717:
718: int PTSGetPTS (PTSStorage *store, u32 Addr, u32 *PTS )
719: {
720: u32 AddrB;
721: u32 AddrE;
722: int i;
723: int found;
724: int search;
725:
726: //printk(KERN_DEBUG LOGNAME ": PTSGetPTS - search %08X\n", Addr);
727:
728: if (store->end == store->begin) {
729: store->LastAddr = Addr;
730: return 0;
731: }
732:
733: // Search for the PTS in the array
734: found = 0;
735: search = 1;
736: while (search && !found) {
737: // Get the first value
738: i = store->begin;
739: AddrB = store->AddrB[i];
740: AddrE = store->AddrE[i];
741:
742: //printk(KERN_DEBUG LOGNAME ": PTSGetPTS - search in [%d] %08X - %08X\n", i, AddrB, AddrE);
743:
744: //If in range, keep it
745: if ((Addr >= AddrB) && (Addr <= AddrE)) {
746: *PTS = store->PTS[i];
747: found = 1;
748: } else {
749: if ((Addr & 0x00080000) == (AddrB & 0x00080000)) {
750: if (Addr < AddrB ) search = 0;
751: } else {
752: if ((store->LastAddr & 0x00080000) == (Addr & 0x00080000)) search = 0;
753: }
754: }
755: if (search) {
756: store->begin++;
757: if (store->begin >= store->size) store->begin = 0;
758: if (store->end == store->begin ) search = 0;
759: }
760: }
761: store->LastAddr = Addr;
762: return found;
763: }
764:
765:
766: u32 GetPTS(u8 *data, u32* MediaPointer, int mpeg, int hlength,int off)
767: {
768: u32 PTS = 0xFFFFFFFFUL;
769: int p = 0;
770:
771: // Read PTS, if present
772: if ((mpeg == 2 && data[p + 7] & 0x80) ||
773: (mpeg == 1 && off)) {
774: if (mpeg == 1) p = off-9;
775: PTS = (data[p + 9] >> 1) & 0x03UL;
776: PTS = (PTS << 8) | (data[p + 10] & 0xFFUL);
777: PTS = (PTS << 7) | ((data[p + 11] >> 1) & 0x7FUL);
778: PTS = (PTS << 8) | (data[p + 12] & 0xFFULL);
779: PTS = (PTS << 7) | ((data[p + 13] >> 1) & 0x7FUL);
780: }
781: // Now, skip rest of PES header and stuffing
782: if (mpeg == 2){
783: p += (9 + (data[p + 8] & 0xFF));
784: p = ((p + 7) / 8) * 8;
785: } else p = hlength+7;
786: if (!(data[p++] | data[p++] | data[p++] | data[p++])) {
787: *MediaPointer = (u32)data[p++] & 0xFF;
788: *MediaPointer = (*MediaPointer << 8) | ((u32)data[p++] & 0xFF);
789: *MediaPointer = (*MediaPointer << 8) | ((u32)data[p++] & 0xFF);
790: *MediaPointer = (*MediaPointer << 8) | ((u32)data[p++] & 0xFF);
791: } else {
792: *MediaPointer = 0xFFFFFFFFUL;
793: }
794: return PTS;
795: }
796:
797: int ReadPESChunk(struct cvdv_cards *card, u32 *addr, u8 *data, u32 start, u32 end)
798: {
799: int i = 5, err = -1;
800: while (err && (i--)) err &= DRAMReadByte(card, *addr << 2, 8, &data[0], 0);
801: if (err) return 1;
802: (*addr)++;
803: if (*addr >= end) *addr = start;
804: return 0;
805: }
806:
807: void ReadPESHeaders(struct cvdv_cards *card)
808: {
809: u8 startcode[] = {0x00, 0x00, 0x01};
810: int LoopCount;
811: u32 LastVAddr; // Current Video Address
812: u32 LastAAddr; // Current Audio Address
813: u32 Addr; // Current Header Address
814: u32 PESAddr; // Pointer from Header Block
815: u32 PTS; // PTS from Header Block
816: u8 Data[32];
817: u32 AudioPESStart;
818: u32 AudioPESEnd;
819: int i, j, p, fail;
820: u32 FailAddr;
821: int hlength=0;
822: int mpeg=0;
823: int check;
824: int mp=0;
825: int off=0;
826:
827: AudioPESStart = (DecoderReadWord(card, 0x058) & 0x3FFF) << 5;
828: AudioPESEnd = ((DecoderReadWord(card, 0x05A) & 0x3FFF) + 1) << 5;
829:
830: LastVAddr = DecoderReadRWAddr(card, 0x060);
831: LastAAddr = DecoderReadRWAddr(card, 0x063);
832:
833: if (card->LastAddr == 0) card->LastAddr = AudioPESStart;
834:
835: //card->AudioPES .. (((DecoderReadWord(card,0x05A) & 0x3FFF) + 1) << 5)
836:
837: //Read the PES header buffer
838: Addr = DecoderReadRWAddr(card, 0x072) & 0x0007FFFF;
839: if (Addr >= AudioPESEnd) {
840: Addr = card->LastAddr = AudioPESStart;
841: }
842:
843: LoopCount = 0;
844: while ((card->LastAddr != Addr) && (LoopCount++ < 200)) {
845: //printk(KERN_DEBUG LOGNAME ": Read PES header: round %d 0x%08X -> 0x%08X\n", LoopCount, card->LastAddr, Addr);
846: FailAddr = card->LastAddr;
847: fail = 0;
848: p = 0;
849:
850: if (ReadPESChunk(card, &card->LastAddr, &Data[p], AudioPESStart, AudioPESEnd)) continue;
851: p+=8;
852: j=1;
853:
854:
855: //printk(KERN_DEBUG LOGNAME ": PES header: %02X %02X %02X %02X %02X %02X %02X %02X\n", Data[0],Data[1],Data[2],Data[3],Data[4],Data[5],Data[6],Data[7]);
856: if (memcmp(Data, startcode, 3)) continue;
857: if ((Data[3] == 0xE0) || (Data[3] == 0xBD)
858: || ((Data[3] & 0xE0) == 0xC0)) {
859:
860: fail |= ReadPESChunk(card, &card->LastAddr,
861: &Data[p], AudioPESStart,
862: AudioPESEnd);
863:
864:
865: p+=8;
866: j++;
867: if ( (Data[6] & 0xC0) == 0x80 ){
868: hlength = 9+Data[8];
869: mpeg = 2;
870: } else {
871: mpeg = 1;
872: mp = 6;
873: check = Data[mp];
874: mp++;
875: while (check == 0xFF){
876: if (!fail && mp == p) {
877: fail |= ReadPESChunk(
878: card,
879: &card->LastAddr,
880: &Data[p],
881: AudioPESStart,
882: AudioPESEnd);
883: p+=8;
884: j++;
885: }
886: check = Data[mp];
887: mp++;
888: }
889: if (!fail && mp == p) {
890: fail |= ReadPESChunk(
891: card,
892: &card->LastAddr,
893: &Data[p],
894: AudioPESStart,
895: AudioPESEnd);
896: p+=8;
897: j++;
898: }
899:
900: if ( !fail && (check & 0xC0) == 0x40){
901: check = Data[mp];
902: mp++;
903: if (!fail && mp == p) {
904: fail |= ReadPESChunk(
905: card,
906: &card->LastAddr,
907: &Data[p],
908: AudioPESStart,
909: AudioPESEnd);
910: p+=8;
911: j++;
912: }
913: check = Data[mp];
914: mp++;
915: }
916: if ( !fail && (check & 0x20)){
917: if (check & 0x30) hlength = mp+10;
918: else hlength = mp+5;
919: off = mp-1;
920: }
921: //printk(KERN_DEBUG LOGNAME ": PTS: %02X %02X %02X %02X %02X\n", Data[off],Data[off+1],Data[off+2],Data[off+3],Data[off+4]);
922:
923:
924: }
925:
926: for (i = 1; (i < ((hlength+7) / 8)) && (!fail);
927: i++) {
928: fail |= ReadPESChunk(card, &card->LastAddr, &Data[p], AudioPESStart, AudioPESEnd);
929: p+=8;
930: j++;
931: }
932:
933: //printk(KERN_DEBUG LOGNAME ": PES header: %d chunks read, HL = %d\n", j, Data[8]);
934: if (!fail) {
935: PTS = GetPTS(Data, &PESAddr,
936: mpeg, hlength,off);
937: //printk(KERN_DEBUG LOGNAME ": PTS from PES header: %d @ 0x%08X\n", PTS, PESAddr);
938: if ((PTS != 0xFFFFFFFF) && (PESAddr != 0xFFFFFFFF)) {
939: if (Data[3] == 0xE0) { // Video
940: //printk(KERN_DEBUG LOGNAME ": Video PTS from PES header: %d @ 0x%08X - 0x%08X\n", PTS, PESAddr, LastVAddr);
941: PTSStoreAdd(&card->VideoPTSStore, PTS, PESAddr, LastVAddr);
942: } else { // Audio
943: //printk(KERN_DEBUG LOGNAME ": Audio PTS from PES header: %d @ 0x%08X - 0x%08X\n", PTS, PESAddr, LastAAddr);
944: PTSStoreAdd(&card->AudioPTSStore, PTS, PESAddr, LastAAddr);
945: }
946: }
947: }
948: } else {
949: //card->LastAddr = Addr;
950: }
951: // In case of error, rewind and try again
952: if (fail) card->LastAddr = FailAddr;
953: }
954: }
955:
956: void L64021Intr(struct cvdv_cards *card)
957: {
958: //static void L64021Intr(struct cvdv_cards *card) {
959: // struct cvdv_cards *card=dev_id;
960: u32 SCR_base, SCR_compareV, SCR_compareA;
961: u32 VideoAddr, AudioAddr, PTS;
962: int i, a, v, as, vs, ap, vp;
963: // int err, h;
964: u8 intr[5];
965: u8 layer;
1.8 ! mocm 966: u8 reg;
1.1 cvs 967: //u8 oldlayer = 0;
968: long ISRTime, DeltaSyncTime, Offset;
969:
970: int used = 0;
971: u8 err;
972:
973: err = DecoderReadByte(card, 0x095);
974: if (err & 0x17) {
975: printk(KERN_DEBUG LOGNAME ": Packet Error: 0x%02X\n", err);
976: }
977:
978: ISRTime = 0; // TODO system time
979:
980: for (i = 0; i < 5; i++)
981: if ((intr[i] = DecoderReadByte(card, i))) used = 1;
982: if (used) {
983: //printk(KERN_DEBUG LOGNAME ": Int - L64021: %02X %02X %02X %02X %02X\n", intr[0], intr[1], intr[2], intr[3], intr[4]);
984: //printk(KERN_DEBUG LOGNAME ": Int - L64021 Aux/Data Fifo: %02X %02X\n",
985: // DecoderReadByte(card, 0x040),
986: // DecoderReadByte(card, 0x041));
987: //printk(KERN_DEBUG LOGNAME ": Int - L64021 VideoES w/r addr: %08X %08X\n",
988: // (DecoderReadByte(card, 0x060) | (DecoderReadByte(card, 0x061) << 8) | (DecoderReadByte(card, 0x062) << 16)) << 2,
989: // (DecoderReadByte(card, 0x06C) | (DecoderReadByte(card, 0x06D) << 8) | (DecoderReadByte(card, 0x06E) << 16)) << 2);
990:
991:
992: //if (DecoderReadByte(card, 0x005) & 0x04) DecoderDelByte(card, 0x005, 0x04);
993: //if (DecoderReadByte(card, 0x005) & 0x04) DecoderWriteByte(card, 0x005, 0x03);
994: //DecoderMaskByte(card, 0x007, 0x0C, 1 << 2); // Stream Select: MPEG1 System / MPEG2 Program Stream
995: //DecoderWriteByte(card, 0x005, 0x03);
996: //DecoderWriteByte(card, 0x007, 0xC7);
997: //printk(KERN_DEBUG LOGNAME ": Int - L64021 Channel Status: %02X %02X\n",
998: // DecoderReadByte(card, 0x007),
999: // DecoderReadByte(card, 0x005));
1000:
1001: if (intr[0] & 0x80) { // new field
1002: card->fields++;
1003:
1.8 ! mocm 1004:
! 1005: if (card->videoffwd){
! 1006: AudioStopDecode(card);
! 1007: card->videosync = 0;
! 1008: card->videodelay = 0;
! 1009: card->videoskip = 0;
! 1010: reg = DecoderReadByte(card, 0x0EC);
! 1011: if ((reg & 0x07) == 0x00) {
! 1012: DecoderWriteByte(card, 0x0EC,
! 1013: (card->videoffwd&
! 1014: 0x03) |0x04);
! 1015: }
! 1016: } else if (DecoderReadByte(card, 0x0EC) & 0x07){
! 1017: if (card->audiostate.AVSyncState)
! 1018: card->videosync = 1;
! 1019: DecoderWriteByte(card, 0x0EC, 0x00);
! 1020: AudioStartDecode(card);
1.1 cvs 1021: }
1.8 ! mocm 1022:
! 1023: if (card->videoslow){
! 1024: if (!card->videoslow_last){
! 1025: AudioStopDecode(card);
! 1026: card->videosync = 0;
! 1027: card->videodelay = card->videoslow;;
! 1028: card->videoskip = 0;
! 1029: card->videoslow_last = 1;
! 1030: card->videodelay_last = 0;
! 1031: } else {
! 1032: if (card->videodelay_last == -1){
! 1033: card->videodelay =
! 1034: card->videoslow;
! 1035: }
! 1036:
! 1037: if (!card->videodelay)
! 1038: card->videodelay_last = -1;
! 1039: else
! 1040: card->videodelay_last =
! 1041: card->videodelay;
! 1042: }
! 1043: } else if( card->videoslow_last ){
! 1044: card->videoslow_last = 0;
! 1045: if (card->audiostate.AVSyncState)
! 1046: card->videosync = 1;
! 1047: AudioStartDecode(card);
! 1048: }
! 1049:
1.1 cvs 1050:
1051: if (card->videodelay > 0) {
1052: //printk(KERN_DEBUG LOGNAME ": Video delay %d\n", card->videodelay);
1.8 ! mocm 1053: if( (DecoderReadByte(card, 0x0ED) & 0x03)
! 1054: == 0x00) {
1.1 cvs 1055: card->videodelay--;
1056: if(card->videodelay){
1.8 ! mocm 1057: DecoderWriteByte(card, 0x0ED,
! 1058: 0x01);
1.1 cvs 1059: } else {
1.8 ! mocm 1060: DecoderWriteByte(card, 0x0ED,
! 1061: 0x00);
! 1062: }
! 1063: } else {
! 1064: card->videodelay--;
! 1065: if(!card->videodelay){
! 1066: DecoderWriteByte(card, 0x0ED,
! 1067: 0x00);
1.1 cvs 1068: }
1069: }
1.8 ! mocm 1070: } else if (card->videoskip > 0) {
! 1071: //printk(KERN_DEBUG LOGNAME ": Video rip %d\n", card->videoskip);
! 1072: if ((DecoderReadByte(card, 0x0EC) & 0x03)
! 1073: == 0x00) {
! 1074: if (DecoderReadWord(card, 0x096) > 5) {
! 1075: // pictures in video ES channel
! 1076: card->videoskip--;
! 1077: if(card->videoskip) {
! 1078: DecoderWriteByte(card,
! 1079: 0x0EC
! 1080: ,0x05);
1.1 cvs 1081: } else {
1.8 ! mocm 1082: DecoderWriteByte(card,
! 1083: 0x0EC
! 1084: , 0x00);
1.1 cvs 1085: }
1086: } else {
1.8 ! mocm 1087: card->videoskip = 0;
1.1 cvs 1088: DecoderWriteByte (card, 0x0EC, 0x00);
1089: }
1090: }
1091: }
1092:
1093:
1094: i = (DecoderReadByte(card, 0x113) & 0xFC) | (DecoderReadByte(card, 0x114) & 0x01);
1095: v = DecoderGetVideoESLevel(card);
1096: if (card->startingV) {
1097: vs = card->VideoESSize;
1098: if (vs > 0) vp = (100 * v) / vs;
1099: else vp = 0;
1.4 mocm 1100: if (vp > 40) {
1.1 cvs 1101: printk(KERN_DEBUG LOGNAME ": Delayed Video Decoder start\n");
1102: card->startingV = 0;
1103: DecoderStartDecode(card);
1104: //DecoderWriteByte(card, 0x0EC, 0x05); // Skip B Frames
1105: //DecoderWriteByte(card, 0x0EC, 0x06); // Skip B and P Frames
1106: //DecoderWriteByte(card, 0x0EE, 0x03); // Rip forward mode
1107: //DecoderWriteByte(card, 0x0ED, 0x03); // Repeat frame mode
1108: // DecoderSetVideoPanic(card, 1, 3); // video panic at 3 pictures
1109: //DecoderSetVideoPanic(card, 0, DecoderGetVideoESSize(card) / 4); // video panic at 25 percent
1110: //VideoSetBackground(card, 0, 0, 0, 0); // Video on black
1111: }
1112: }
1113: a = DecoderGetAudioESLevel(card);
1114: if (card->startingA) {
1115: as = card->AudioESSize;
1116: if (as > 0) ap = (100 * a) / as;
1117: else ap = 0;
1.4 mocm 1118: if (ap > 40) {
1.1 cvs 1119: printk(KERN_DEBUG LOGNAME ": Delayed Audio Decoder start\n");
1.6 mocm 1120: AudioSetPlayMode(card, MAUDIO_PLAY);
1.1 cvs 1121: if (!AudioStart(card)) {
1122: card->startingA = 0;
1123: }
1124: }
1125: }
1126: if (card->fields >= 250) { // 5 seconds (PAL)
1127: //SCR_base = DecoderReadByte(card, 0x09);
1128: //SCR_base = SCR_base | (DecoderReadMWord(card, 0x0A) << 8);
1129: SCR_base = DecoderReadSCR(card, 0x009);
1130: SCR_compareA = DecoderReadSCR(card, 0x014);
1131: SCR_compareV = DecoderReadSCR(card, 0x00D);
1132: if (DecoderReadByte(card, 0x013) & 0x03)
1133: // printk(KERN_DEBUG LOGNAME ": SCR 0x%08X, videocmp=0x%08X, audiocmp=0x%08X %02X\n", SCR_base, SCR_compareV, SCR_compareA, DecoderReadByte(card, 0x013));
1134: //if (DecoderReadByte(card, 0x013) & 0x03)
1135: //printk(KERN_DEBUG LOGNAME ": SCR 0x%08X, videocmp=0x%08X, audiocmp=0x%08X %02X\n", SCR_base, DecoderReadDWord(card, 0x00D), DecoderReadDWord(card, 0x014), DecoderReadByte(card, 0x013));
1136: card->fields = 0;
1137: }
1138: }
1139:
1140: if (intr[0] & 0x04) { // First Slice Start Code
1141: //printk(KERN_DEBUG LOGNAME ": Int - First Slice Start Code\n");
1142: if (card->showvideo) {
1143: // Unmute card video if first picture slice detected
1144: VideoSetBackground(card, 0, 0, 0, 0); // Video on black
1145: card->showvideo = 0;
1146: }
1147: }
1148:
1149: if (intr[0] & 0x02 ) { // Aux/User Data Fifo
1150: // printk(KERN_DEBUG LOGNAME ": Int - Aux/Data FIFO Ready\n");
1151: used = 0;
1152: while ( (used++ < 1000) &&
1153: (layer = DecoderReadByte(card, 0x040)) & 0x03){
1154: card->AuxFifo[card->AuxFifoHead] = ((layer << 6) & 0x0700) | DecoderReadByte(card, 0x043);
1155: card->AuxFifoHead = (card->AuxFifoHead + 1) & FIFO_MASK;
1156: }
1157: if (used < 1000) DecoderReadAuxFifo(card);
1158: used = 0;
1159:
1160: while ( (used++ < 1000) &&
1161: (layer = DecoderReadByte(card, 0x041)) & 0x03){
1162: card->DataFifo[card->DataFifoHead] = ((layer << 6) & 0x0300) | DecoderReadByte(card, 0x043);
1163: card->DataFifoHead = (card->DataFifoHead + 1) & FIFO_MASK;
1164: }
1165: if (used < 1000 ) DecoderReadDataFifo(card);
1166: }
1167:
1168: if ((intr[0] & 0x01) != card->intdecodestatus) { // decode status
1169: card->intdecodestatus = intr[0] & 0x01;
1170: printk(KERN_DEBUG LOGNAME ": Int - decode status now %s\n", ((card->intdecodestatus) ? "running" : "stopped"));
1171: if (card->intdecodestatus) { // now running
1172: // DecoderSetVideoPanic(card, 1, 3); // video panic at 3 pictures
1173: DecoderSetVideoPanic(card, 0, card->VideoESSize / 4);
1174: card->showvideo = 1;
1175: //VideoSetBackground(card, 0, 0, 0, 0); // Video on black
1176: } else { // now stopped
1177: if (card->closing) {
1178: card->closing = 0;
1179: CloseCard(card);
1180: }
1181: }
1182:
1183: }
1184:
1185: // if (intr[1] & 0x80) { // SCR compare
1186: //printk(KERN_DEBUG LOGNAME ": Int - SCR compare\n");
1187: //DecoderDelByte(card, 0x013, 0x02);
1188: //VideoSetBackground(card, 0, 0, 0, 0); // Video on black
1189: // }
1190: // if (intr[1] & 0x40) { // SCR Overflow
1191: //printk(KERN_DEBUG LOGNAME ": Int - SCR Overflow\n");
1192: // }
1193: // if (intr[1] & 0x20) { // Begin Vertical Blank
1194: // }
1195: if (intr[1] & 0x10) { // Begin Active Video
1196: if (card->highlight_valid) {
1197: for (i = 0; i < 10; i++) DecoderWriteByte(card, 0x1C0 + i, card->highlight[i]);
1198: card->highlight_valid = 0;
1199: }
1200: }
1201: //if (intr[1] & 0x08) { // SPU Start Code Detected
1202: //printk(KERN_DEBUG LOGNAME ": Int - SPU Start Code Detected\n");
1203: //}
1204: if (intr[1] & 0x04) { // SCR compare audio
1205: printk(KERN_DEBUG LOGNAME ": Int - SCR compare audio\n");
1206: DecoderDelByte(card, 0x013, 0x01);
1207: AudioStart(card);
1208: }
1209: // both follwing are used in A/V-sync below
1210: // if (intr[1] & 0x02) { // picture start code detected
1211: //printk(KERN_DEBUG LOGNAME ": Int - picture start code detected\n");
1212: // }
1213: // if (intr[1] & 0x01) { // audio sync code detected
1214: //printk(KERN_DEBUG LOGNAME ": Int - audio sync code detected\n");
1215: // }
1216:
1217: // if (! card->stream.audio.valid) DecoderReadAudioInfo(card);
1218:
1219: if (intr[2] & 0x20) { // DSI PES data ready
1220: //printk(KERN_DEBUG LOGNAME ": Int - DSI PES data ready\n");
1221: DecoderReadNavipack(card);
1222: }
1223:
1224: if (intr[2] & 0x06) { // Audio / Video PES data ready
1225: ReadPESHeaders(card);
1226: }
1227:
1228: if (intr[3] & 0x40) { // CSS
1229: card->css.status = DecoderReadByte(card, 0x0B0);
1230: printk(KERN_DEBUG LOGNAME ": Int - CSS Status 0x%02X\n", card->css.status);
1231: if (card->css.status&0x01) card->css.ChallengeReady = 1; // challenge ready
1232: if (card->css.status&0x02) card->css.ResponseReady = 1; // response ready
1233: if (card->css.status&0x04) card->css.DiskKey = 1; // Disk key ready
1234: if (card->css.status&0x08) card->css.Error = 1; // Disk key error
1235: if (card->css.status&0x10) card->css.TitleKey = 1; // Title key ready
1236: if (card->css.status&0x20) card->css.TitleKeyDiff = 1; // Title key error
1237: }
1238:
1239:
1240: if (intr[3] & 0x30) { // Audio/Video ES channel buffer underflow
1241: //printk(KERN_DEBUG LOGNAME ": Int - ES channel buffer underflow\n");
1242: if (card->closing) {
1243: card->closing = 0;
1244: CloseCard(card);
1245: }
1246: }
1247:
1248: // if (intr[3] & 0x08) { // Data Dump channel PES data ready
1.8 ! mocm 1249: // }
! 1250:
1.1 cvs 1251: if (intr[4] & 0x10 ) { // SPU decode error
1252: printk(KERN_DEBUG LOGNAME ": Int - SPU decode error: (1CA)=0x%02X\n", DecoderReadByte(card, 0x1CA));
1253: DecoderDelByte(card, 0x1A0, 0x01); // SPU decode stop
1254: DecoderSetByte(card, 0x1A0, 0x01); // SPU decode start
1255: }
1256:
1257: // Audio / Video Syncronisation
1258:
1.8 ! mocm 1259: if (card->videosync && !card->videoskip && !card->videodelay) {
1.1 cvs 1260: SCR_base = DecoderReadSCR(card, 0x009);
1261: SCR_compareV = DecoderReadSCR(card, 0x00D);
1262: //printk(KERN_DEBUG LOGNAME ": Sync: SCR = %08X\n", SCR_compareV);
1263: if (intr[1] & 0x02) { // picture start code detected
1264: //printk(KERN_DEBUG LOGNAME ": Sync: picture start code\n");
1265: DecoderMaskByte(card, 0x011, 0x03, 0x01); // Set SCR compare/capture mode to capture
1266: DecoderSetByte(card, 0x11, 0x04); // Set "capture on picture start"
1267: if (intr[1] & 0x01) { // audio sync code detected
1268: //printk(KERN_DEBUG LOGNAME ": Sync: audio sync code, too\n");
1269: DecoderSetByte(card, 0x11, 0x08); // Set "capture on audio sync code"
1270: }
1271: VideoAddr = DecoderReadRWAddr(card,0x080);
1272: if (PTSGetPTS(&card->VideoPTSStore, VideoAddr, &PTS)) {
1273: //printk(KERN_DEBUG LOGNAME ": Sync: video PTS found for 0x%08X = %08X\n", VideoAddr, PTS);
1274: card->oldVPTS = card->VPTS;
1275: card->VPTS = PTS;
1276: card->VSCR = ((long)SCR_compareV - (long)PTS) / 2;
1277: // card->VideoTime = ISRTime;
1278: }
1279: } else if (intr[1] & 0x01) { // audio sync code detected
1280: //printk(KERN_DEBUG LOGNAME ": Sync: audio sync code, only\n");
1281: DecoderMaskByte(card, 0x011, 0x03, 0x01); // Set SCR compare/capture mode to capture
1282: DecoderSetByte(card, 0x11, 0x08); // Set "capture on audio sync code"
1283: AudioAddr = DecoderReadRWAddr(card,0x083);
1284: //printk(KERN_DEBUG LOGNAME ": Sync: audio PTS search for 0x%08X\n", AudioAddr);
1285: if (PTSGetPTS(&card->AudioPTSStore, AudioAddr, &PTS)) {
1286: //printk(KERN_DEBUG LOGNAME ": Sync: audio PTS found for 0x%08X = %08X\n", AudioAddr, PTS);
1287: card->oldAPTS = card->APTS;
1288: card->APTS = PTS;
1289: card->ASCR = ((long)SCR_compareV - (long)PTS) / 2;
1290: // card->AudioTime = ISRTime;
1291: } else {
1292: card->ASCR = 0x7FFFFFFF;
1293: }
1294:
1295: if (card->VSCR != 0x7FFFFFFF) {
1296: if (card->ASCR != 0x7FFFFFFF) {
1297: DeltaSyncTime = ISRTime - card->SyncTime;
1298: card->SyncTime = ISRTime;
1299:
1300: // Calculate Audio and Video SCR difference
1301: Offset = (card->ASCR - card->VSCR - (10 * 736)) / 736;
1302: //printk(KERN_DEBUG LOGNAME ": Sync: compare SCRs: Audio = %ld Video = %ld -> %ld\n", card->ASCR, card->VSCR, Offset);
1303:
1304: // if the APTS and SCR are off update SCR to keep SubPic synced
1305: if ((SCR_compareV > card->APTS) || ((card->APTS - SCR_compareV) > 10000)) {
1306: Offset = 0;
1307: SetSCR(card, card->APTS);
1308: }
1309:
1310: // if more than 3 frames away
1311: if ((Offset > 3) || (Offset < -3)) {
1312: if (Offset > 0 ) {
1313: card->videodelay = 0;
1314: if (Offset < 100) {
1315: if (Offset < 10) {
1316: card->videodelay = 1;
1317: } else {
1318: card->videodelay = Offset / 2;
1319: if (card->videodelay > 20) {
1320: card->videodelay = 20;
1321: }
1322: }
1323: printk(KERN_DEBUG LOGNAME ": <<< Pausing %d\n", card->videodelay);
1324: } else {
1325: }
1326: } else {
1.8 ! mocm 1327: card->videoskip = 0;
1.1 cvs 1328: if (Offset > -100) {
1329: if (Offset < -10) {
1.8 ! mocm 1330: card->videoskip = 10;
1.1 cvs 1331: } else {
1.8 ! mocm 1332: card->videoskip = 3;
1.1 cvs 1333: }
1.8 ! mocm 1334: printk(KERN_DEBUG LOGNAME ": >>> FForward %d\n", card->videoskip);
1.1 cvs 1335: }
1336: }
1337: } else {
1338: }
1339: card->VSCR = 0x7FFFFFFF;
1340: }
1341: }
1342: }
1343: }
1344: }
1345: DecoderWriteByte(card, 0x006, 0x01); // Clear Interrupt Pin
1346: }
1347:
1348: // Enable the IRQ Masks
1349: void L64021InstallIntr(struct cvdv_cards *card) {
1350: u8 data;
1351:
1352: data=0;
1353: data |= 0x80; // new field
1354: data |= 0x40; // audio sync recovery
1355: data |= 0x20; // SPU SCR compare
1356: // data |= 0x10; // SDRAM Transfer Done
1357: // data |= 0x08; // Sequence End Code Detect
1358: data |= 0x04; // First Slice Start Code
1359: data |= 0x02; // Aux/User Data Fifo
1360: data |= 0x01; // decode status
1361: DecoderWriteByte(card, 0x000, (~data) & 0xFF);
1362:
1363: data = 0;
1364: // data |= 0x80; // SCR compare
1365: // data |= 0x40; // SCR Overflow
1366: // data |= 0x20; // Begin Vertical Blank
1367: data |= 0x10; // Begin Active Video
1368: data |= 0x08; // SPU Start Code Detected
1369: data |= 0x04; // SCR compare audio
1370: data |= 0x02; // picture start code detected
1371: data |= 0x01; // audio sync code detected
1372: DecoderWriteByte(card, 0x001, (~data) & 0xFF);
1373:
1374: data = 0;
1375: // data |= 0x80; // DTS video event
1376: // data |= 0x40; // DTS audio event
1377: data |= 0x20; // DSI PES data ready
1378: // data |= 0x10; // Seq end code in video channel
1379: data |= 0x08; // SPU PES data ready
1380: data |= 0x04; // Video PES data ready
1381: data |= 0x02; // Audio PES data ready
1382: // data |= 0x01; // Pack data ready
1383: DecoderWriteByte(card, 0x002, (~data) & 0xFF);
1384:
1385: data = 0;
1386: // data |= 0x80; // Reserved
1387: data |= 0x40; // CSS
1388: data |= 0x20; // Video ES channel buffer underflow
1389: data |= 0x10; // Audio ES channel buffer underflow
1390: // data |= 0x08; // Data Dump channel PES data ready
1391: data |= 0x04; // SPU channel buffer overflow
1392: data |= 0x02; // Video ES channel buffer overflow
1393: data |= 0x01; // Audio ES channel buffer overflow
1394: DecoderWriteByte(card, 0x003, (~data) & 0xFF);
1395:
1396: data = 0;
1397: // data |= 0x80; // S/PDIF channel buffer underflow
1398: // data |= 0x40; // packet error
1399: // data |= 0x20; // reserved
1400: data |= 0x10; // SPU decode error
1401: // data |= 0x08; // Audio Sync error
1402: // data |= 0x04; // Audio CRC or illegal bit error
1403: // data |= 0x02; // context error
1404: // data |= 0x01; // VLC or Run length error
1405: DecoderWriteByte(card, 0x004, (~data) & 0xFF);
1406: card->IntInstalled = 1;
1407: }
1408:
1409: int L64021RemoveIntr(struct cvdv_cards *card) {
1410: // Disable the IRQ Masks
1411: DecoderWriteByte(card, 0x000, 0xFF); // No ints
1412: DecoderWriteByte(card, 0x001, 0xFF); // No ints
1413: DecoderWriteByte(card, 0x002, 0xFF); // No ints
1414: DecoderWriteByte(card, 0x003, 0xFF); // No ints
1415: DecoderWriteByte(card, 0x004, 0xFF); // No ints
1416: card->IntInstalled = 0;
1417: return 0;
1418: }
1419:
1420: int L64021Reset(struct cvdv_cards *card) {
1421: L64021RemoveIntr(card); // Stop interrupts
1422: // Reset
1423: printk(KERN_DEBUG LOGNAME ": L64021 Software reset...\n");
1424: //DecoderSetByte(card, 0x007, 0x20); // reset on
1425: DecoderMaskByte(card, 0x007, 0xE2, 0xE2); // reset on
1426: while (!(DecoderReadByte(card, 0x007) & 0x02)) ; // wait until reset is done
1427: //DecoderDelByte(card, 0x007, 0x20); // reset off
1428: DecoderMaskByte(card, 0x007, 0xE2, 0xC2); // reset off
1429: printk(KERN_DEBUG LOGNAME ": L64021 Software reset done.\n");
1430: DecoderStopChannel(card);
1431: DecoderStopDecode(card);
1432: DecoderStreamReset(card);
1433: DecoderSetupReset(card);
1434: printk(KERN_INFO LOGNAME ": L64021 Rev. 0x%02X reset successfully.\n", DecoderReadByte(card, 0x0F5));
1435: return 0;
1436: }
1437:
1438: int L64021Setup(struct cvdv_cards *card) {
1439: printk(KERN_DEBUG LOGNAME ": -- L64021Setup\n");
1440: DecoderWriteByte(card, 0x0C1, 0x88); //
1441: switch (card->videomode) {
1442: case NTSC: // NTSC M, N. America, Taiwan, Japan
1443: DecoderMaskByte(card, 0x122, 0x03, 0x01); // Television Standard: NTSC
1444: /* Default values:
1445: DecoderWriteByte(card, 0x116, 90); // Main Reads per Line
1446: DecoderWriteByte(card, 0x11A, 4); // Vline Count Init
1447: DecoderWriteByte(card, 0x11C, 0x13); // Pixel State Reset Value / BT.656 Mode / Sync Active Low
1448: DecoderWriteByte(card, 0x129, 23); // Start- and End Row
1449: DecoderWriteByte(card, 0x12A, 262 & 0xFF);
1450: DecoderWriteByte(card, 0x12B, (262>>4)&0x70);
1451: DecoderWriteByte(card, 0x12C, 244 & 0xFF); // Start- and End Column
1452: DecoderWriteByte(card, 0x12D, 1683 & 0xFF);
1453: DecoderWriteByte(card, 0x12E, ((1683>>4)&0x70)|((244>>8)&0x07));
1454: DecoderWriteByte(card, 0x132, 240 & 0xFF); // SAV Column
1455: DecoderWriteByte(card, 0x133, 1684 & 0xFF); // EAV Column
1456: DecoderWriteByte(card, 0x134, ((1684>>4)&0x70)|((240>>8)&0x07));
1457: DecoderWriteByte(card, 0x12F, (21&0x1F)|((262>>3)&0x20)|(1<<6)|((265>>1)&0x80)); // VCode Zero...
1458: DecoderWriteByte(card, 0x130, 262&0xFF); // ... and VCode Even
1459: DecoderWriteByte(card, 0x131, 265&0xFF); // ... and FCode
1460: */
1461: break;
1462: case PAL: // PAL-B, D, G, H, I, Europe, Asia
1463: DecoderMaskByte(card, 0x122, 0x03, 0x02); // Television Standard: PAL
1464: /* Default values:
1465: DecoderWriteByte(card, 0x116, 90); // Main Reads per Line
1466: DecoderWriteByte(card, 0x11A, 1); // Vline Count Init
1467: DecoderWriteByte(card, 0x11C, 0x13); // Pixel State Reset Value / BT.656 Mode / Sync Active Low
1468: DecoderWriteByte(card, 0x129, 23); // Start- and End Row
1469: DecoderWriteByte(card, 0x12A, 310 & 0xFF);
1470: DecoderWriteByte(card, 0x12B, (310>>4)&0x70);
1471: DecoderWriteByte(card, 0x12C, 264 & 0xFF); // Start- and End Column
1472: DecoderWriteByte(card, 0x12D, 1703 & 0xFF);
1473: DecoderWriteByte(card, 0x12E, ((1703>>4)&0x70)|((264>>8)&0x07));
1474: DecoderWriteByte(card, 0x132, 260 & 0xFF); // SAV Column
1475: DecoderWriteByte(card, 0x133, 1704 & 0xFF); // EAV Column
1476: DecoderWriteByte(card, 0x134, ((1704>>4)&0x70)|((260>>8)&0x07));
1477: DecoderWriteByte(card, 0x12F, (21&0x1F)|((310>>3)&0x20)|(0<<6)|((312>>1)&0x80)); // VCode Zero...
1478: DecoderWriteByte(card, 0x130, 310&0xFF); // ... and VCode Even
1479: DecoderWriteByte(card, 0x131, 312&0xFF); // ... and FCode
1480: */
1481: break;
1482: case PAL60: // PAL 60Hz
1483: case NTSC60: // NTSC 60Hz, USA HDTV
1484: case PALM: // PAL-M normal, Brazil
1485: case PALM60: // PAL-M HDTV, Brazil
1486: case PALN: // PAL-N, Uruguay, Paraguay
1487: case PALNc: // PAL-Nc, Argentinia
1488: default: // TODO: set mode according to other standards
1489: DecoderMaskByte(card, 0x122, 0x03, 0x00); // Television Standard: User programmed
1490: DecoderWriteByte(card, 0x116, 90); // Main Reads per Line
1491: DecoderWriteByte(card, 0x11A, 1); // Vline Count Init
1492: DecoderWriteByte(card, 0x11C, 0x13); // Pixel State Reset Value / BT.656 Mode / Sync Active Low
1493: DecoderWriteByte(card, 0x129, 23); // Start- and End Row
1494: DecoderWriteByte(card, 0x12A, 310 & 0xFF);
1495: DecoderWriteByte(card, 0x12B, (310>>4)&0x70);
1496: DecoderWriteByte(card, 0x12C, 264 & 0xFF); // Start- and End Column
1497: DecoderWriteByte(card, 0x12D, 1703 & 0xFF);
1498: DecoderWriteByte(card, 0x12E, ((1703>>4)&0x70)|((264>>8)&0x07));
1499: DecoderWriteByte(card, 0x132, 260 & 0xFF); // SAV Column
1500: DecoderWriteByte(card, 0x133, 1704 & 0xFF); // EAV Column
1501: DecoderWriteByte(card, 0x134, ((1704>>4)&0x70)|((260>>8)&0x07));
1502: DecoderWriteByte(card, 0x12F, (21&0x1F)|((310>>3)&0x20)|(0<<6)|((312>>1)&0x80)); // VCode Zero...
1503: DecoderWriteByte(card, 0x130, 310&0xFF); // ... and VCode Even
1504: DecoderWriteByte(card, 0x131, 312&0xFF); // ... and FCode
1505: break;
1506: }
1507: DecoderWriteByte(card, 0x045, 0x00); // disable compares and panic mode
1508: DecoderWriteByte(card, 0x094, 0x00); // disable TOS Detect
1509: DecoderMaskByte(card, 0x109, 0x30, 0x00); // Display Override off, don't change OSD, Background
1510: DecoderWriteByte(card, 0x112, 0x00); // Disable Horizontal 2:1 Filter
1511: DecoderWriteByte(card, 0x113, 0x14); // FreezeMode 1 / 3:2 Pulldown / Repeat First Field / Top Field First
1512: DecoderWriteByte(card, 0x114, ( 5 <<3)|( 0 <<1)|( 0 <<2)|( 1 <<7)); // VideoMode/FilterEnable/FilterAB/FieldSyncEnable
1513: DecoderWriteByte(card, 0x115, 0); // Horizontal Filter Scale
1514: DecoderWriteByte(card, 0x117, 0x80); // Automatic Field Inversion Correction
1515: // DecoderWriteByte(card, 0x117, 0x00); // no Automatic Field Inversion Correction
1516: DecoderWriteByte(card, 0x118, 0); // Horizontal Pan and Scan Word Offset (signed)
1517: DecoderWriteByte(card, 0x119, 0); // Vertical Pan and Scan Line Offset
1518: DecoderWriteByte(card, 0x11B, 0x00); // Override Picture Width
1519: // if (0) { // letterbox
1520: // DecoderWriteByte(card, 0x114, (DecoderReadByte(card, 0x114) & ~0x78) | 0x40); // mode 8
1521: // DecoderWriteByte(card, 0x129, 0x35);
1522: // DecoderWriteByte(card, 0x12A, 0xE7);
1523: // DecoderWriteByte(card, 0x114, DecoderReadByte(card, 0x114) & ~0x77); // ???
1524: // } else {
1525: // if (0) { // MPEG-1
1526: // DecoderWriteByte(card, 0x114, (DecoderReadByte(card, 0x114) & ~0x78) | 0x10); // mode 2
1527: // } else { // MPEG-2
1528: // DecoderWriteByte(card, 0x114, (DecoderReadByte(card, 0x114) & ~0x78) | 0x28); // mode 5
1529: // }
1530: // }
1531: L64021InstallIntr(card); // Set the interrupt masks, again
1532:
1533: return 0;
1534: }
1535:
1536: int L64021Init(struct cvdv_cards *card) {
1537: printk(KERN_DEBUG LOGNAME ": -- L64021Init\n");
1538: L64021Reset(card);
1539: L64021Setup(card);
1540: VideoSetBackground(card, 1, 0, 0, 0); // black
1541: DecoderWriteByte(card, 0x135, 0x01); // Enable Video Out, Disable SPU Mix
1542: DecoderWriteByte(card,0x11C,0x13); // Pixel State Reset Value / BT.656 Mode / Sync Active Low
1543: L64021InstallIntr(card);
1544: return 0;
1545: }
1546:
1547:
LinuxTV legacy CVS <linuxtv.org/cvs>