File:  [DVB] / margi2 / cardbase.c
Revision 1.11: download - view: text, annotated - select for diffs
Mon Feb 4 12:20:13 2002 UTC (22 years, 4 months ago) by mocm
Branches: MAIN
CVS tags: HEAD
added module options to turn off/on svhs, composite and zv output
default is on for all
see README for more information

/* 
    cardbase.c

    Copyright (C) Christian Wolff for convergence integrated media.

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#define __NO_VERSION__

#include "cardbase.h"

// List of pci cards in the system
struct cvdv_cards *first_card = NULL;
struct cvdv_cards *minorlist[MAXDEV];

u8 FlushPacket[32] = {
	0x00, 0x00, 0x01, 0xE0,	// video stream start code
	0x00, 0x1a,		// 26 more bytes
	0x81, 0xC1,		// flags: copy=1, PTS_DTS=11, PES_extension=1
	0x0D,			// 13 more header bytes
	0x31, 0x00, 0x03, 0x5F, 0xEB,	// PTS
	0x11, 0x00, 0x03, 0x48, 0x75,	// DTS
	0x1E,			// flags: P-STD_buffer=1, 
	0x60, 0xE8,		// P-STD_buffer_scale=1, P-STD_buffer_size=232(kByte)
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

void DecoderStreamReset(struct cvdv_cards *card)
{
	card->stream.valid = 0;
	card->stream.sh.valid = 0;
	card->stream.se.valid = 0;
	card->stream.gop.valid = 0;
	card->stream.MPEG2 = 0;
	card->stream.audio.valid = 0;
	memset(&card->stream.audio.mpeg,0,sizeof(struct AudioMPEG));
	memset(&card->stream.audio.ac3,0,sizeof(struct AudioAC3));
	memset(&card->stream.audio.pcm,0,sizeof(struct AudioPCM));
	card->AuxFifoExt = 0;
	card->AuxFifoLayer = -1;
}
void PTSStoreInit(PTSStorage * store, int size)
{
	int i;
	if (size > MAX_PTS)
		size = MAX_PTS;
	store->size = size;
	store->begin = 0;
	store->end = 0;
	store->LastAddr = 0;
	for (i = 0; i < store->size; i++) {
		store->AddrB[i] = 0;
		store->AddrE[i] = 0;
		store->PTS[i] = 0;
	}
}

void DecoderCSSReset(struct cvdv_cards *card)
{
	card->css.status = 0;
	card->css.ChallengeReady = 0;
	card->css.ResponseReady = 0;
	card->css.DiskKey = 0;
	card->css.TitleKey = 0;
	card->css.Error = 0;
	card->css.TitleKeyDiff = 0;
	card->LastAddr = 0;	// last used address in PES buffer
	card->VPTS = 0;
	card->oldVPTS = 0;
	card->VSCR = 0;
	card->APTS = 0;
	card->oldAPTS = 0;
	card->ASCR = 0;
	card->SyncTime = 0;
	card->paused = 0;	// pause status
	card->lastvattr = 0;	// last set dvd video attribute
	card->lastaattr = 0;	// last set dvd audio attribute
	card->nonblock = 0;
}

void DecoderSetupReset(struct cvdv_cards *card)
{
	card->DecoderOpen = 0;
	card->closing = 0;
	card->channelrun = 0;
	card->setup.streamtype = stream_none;
	card->setup.audioselect = audio_none;
	card->setup.videoID = 0;
	card->setup.audioID = 0;
	card->setup.audioIDext = -1;
	card->setup.SPDIFmode = 0;
	card->startingV = 0;
	card->startingA = 0;
	card->startingDVDV = 0;
	card->startingDVDA = 0;
	card->videodelay = 0;
	card->videodelay_last = 0;
	card->videoslow_last = 0;
	card->videoslow = 0;
	card->videoffwd = 0;
	card->videoffwd_last = 0;
	card->videoskip = 0;
	card->videoskip_last = 0;
	card->videosync = 0; 
	card->paused = 0;
	PTSStoreInit(&card->VideoPTSStore, MAX_PTS);
	PTSStoreInit(&card->AudioPTSStore, MAX_PTS);
#ifdef DVB
        card->audiostate.AVSyncState=true;
#endif
}



void card_init(struct cvdv_cards *card, unsigned int minor)
{
	card->DRAMFirstBlock = NULL;
	card->DRAMSize = 0;
	card->OSD.open = 0;
	card->DMAABusy = 0;
	card->DMABBusy = 0;
	card->IntInstalled = 0;
	card->ChannelBuffersAllocated = 0;
	card->VideoES = BLANK;
	card->AudioES = BLANK;
	card->VideoPES = BLANK;
	card->DataDump = BLANK;
	card->AudioPES = BLANK;
	card->NaviBank = BLANK;
	card->FrameBuffersAllocated = 0;
	card->FrameStoreLuma1 = BLANK;
	card->FrameStoreChroma1 = BLANK;
	card->FrameStoreLuma2 = BLANK;
	card->FrameStoreChroma2 = BLANK;
	card->FrameStoreLumaB = BLANK;
	card->FrameStoreChromaB = BLANK;
	card->DecoderOpen = 0;
	card->AuxFifoHead = 0;
	card->AuxFifoTail = 0;
	card->DataFifoHead = 0;
	card->DataFifoTail = 0;
	card->FifoALast = -1;
	card->FifoBLast = -1;
	//reset_stream(card);
	DecoderStreamReset(card);
	DecoderSetupReset(card);
	card->AudioInitialized = 0;
	card->AudioOldMode = -1;
	card->closing = 0;
	card->startingV = 0;
	card->startingA = 0;
	card->startingDVDV = 0;
	card->startingDVDA = 0;
	card->channelrun = 0;
	card->fields = 0;
	DecoderCSSReset(card);
	card->NaviPackAddress = 0;
	init_waitqueue_head(&card->wqA);
	init_waitqueue_head(&card->wqB);
	card->navihead = 0;	// write pointer for navi ring buffer
	card->navitail = 0;	// read pointer for navi ring buffer
	card->intdecodestatus = 0;	// last status of decode interrupt
	card->showvideo = 0;	// show video instead black as soon as picture slice is there
	card->videodelay = 0;	// slow counter
	card->videodelay_last = 0;	// slow counter
	card->videoffwd = 0;	// fast playback
	card->videoffwd_last = 0;	// fast playback
	card->videoskip = 0;	// fast counter
	card->videoskip_last = 0;	// fast counter
	card->videoslow_last = 0;
	card->videoslow = 0;
	card->videosync = 0;	// do audio/video sync basen on PTS?
	PTSStoreInit(&card->VideoPTSStore, MAX_PTS);
	PTSStoreInit(&card->AudioPTSStore, MAX_PTS);
	card->LastAddr = 0;	// last used address in PES buffer
	card->VPTS = 0;
	card->oldVPTS = 0;
	card->VSCR = 0;
	card->APTS = 0;
	card->oldAPTS = 0;
	card->ASCR = 0;
	card->SyncTime = 0;
	card->paused = 0;	// pause status
	card->lastvattr = 0;	// last set dvd video attribute
	card->lastaattr = 0;	// last set dvd audio attribute
	card->reg08F = 0;	// mirror of decoder registers
	card->reg090 = 0;
	card->reg091 = 0;
	card->reg092 = 0;
	card->reg093 = 0;
	card->highlight_valid = 0;	// SPU highlight info available for next BAV int
	card->do_flush = 0;

	card->open = 0;

	card->VideoESSize = 0;		
	card->AudioESSize = 0;		
	card->VideoPESSize = 0;		
	card->DataDumpSize = 0;		
	card->AudioPESSize = 0;		
	card->NaviBankSize = 0;		
	card->currentType = -1;
	card->rbufA.buffy = NULL;
	card->rbufB.buffy = NULL;
	card->use_ringA = 0;
	card->use_ringB = 0;
	card->minor = minor;
	card->hasZV = 0;
#ifdef NOINT
	init_timer(&card->timer);
	spin_lock_init(&card->timelock);
#endif
#ifdef DVB
	card->dvb_registered = 0;
        card->audiostate.AVSyncState=true;
	card->nonblock = 0;
#endif
	card->svhs = 0;
	card->composite = 0;
}


LinuxTV legacy CVS <linuxtv.org/cvs>