version 1.16, 2001/05/23 14:24:08
|
version 1.17, 2001/06/01 16:43:07
|
Line 493 int DecoderWriteBlock(struct cvdv_cards
|
Line 493 int DecoderWriteBlock(struct cvdv_cards
|
if (size > 0) { |
if (size > 0) { |
|
|
if (!card->use_ringA) |
if (!card->use_ringA) |
MargiSetABuffers(card, NBBUF * CHANNELBUFFERSIZE); |
MargiSetBuffers(card, NBBUF*CHANNELBUFFERSIZE,0); |
|
|
if (card->startingDVDV || card->startingDVDA) |
if (card->startingDVDV || card->startingDVDA) |
setSCR = 1; |
setSCR = 1; |
Line 547 int DecoderWriteBlock(struct cvdv_cards
|
Line 547 int DecoderWriteBlock(struct cvdv_cards
|
static long margi_write(struct cvdv_cards *card, const char *data, |
static long margi_write(struct cvdv_cards *card, const char *data, |
unsigned long count, int nonblock) |
unsigned long count, int nonblock) |
{ |
{ |
struct StreamSetup *setup = &card->setup; |
|
|
|
int res; |
int res; |
long int out=0; |
long int out=0; |
int wc = 0; |
int free; |
|
|
|
free = ring_write_rest(&(card->rbufA)); |
|
|
card->nonblock = nonblock; |
card->nonblock = nonblock; |
|
|
Line 559 static long margi_write(struct cvdv_card
|
Line 560 static long margi_write(struct cvdv_card
|
if (count > 0) { // Do we have data? |
if (count > 0) { // Do we have data? |
if ((res = Prepare(card))) |
if ((res = Prepare(card))) |
return res; |
return res; |
|
if (!card->use_ringA) |
if ((setup->streamtype != stream_ES) |
MargiSetBuffers(card, NBBUF*CHANNELBUFFERSIZE, |
&& (setup->streamtype != stream_PES)){ |
0); |
if (!card->use_ringA) |
if (!nonblock && |
MargiSetABuffers(card, NBBUF* |
!wait_event_interruptible(card->wqA, |
CHANNELBUFFERSIZE); |
free >count )){ |
|
out = MargiPushA(card, count, |
while (wc < 100 && |
data); |
!card->nonblock && out < count){ |
} else { |
wc++; |
out = MargiPushA(card, count, data); |
out += MargiPushA(card, count, data); |
|
if (out < count){ |
|
interruptible_sleep_on(&card->wqA); |
|
} |
|
} |
|
if (card->nonblock) { |
|
out = MargiPushA(card, count, data); |
|
} |
|
} |
} |
} |
} |
return out; |
return out; |
Line 587 static long margi_write(struct cvdv_card
|
Line 580 static long margi_write(struct cvdv_card
|
} |
} |
} |
} |
|
|
|
|
static long margi_write_audio(struct cvdv_cards *card, const char *data, |
static long margi_write_audio(struct cvdv_cards *card, const char *data, |
unsigned long count, int nonblock) |
unsigned long count, int nonblock) |
{ |
{ |
Line 594 static long margi_write_audio(struct cvd
|
Line 588 static long margi_write_audio(struct cvd
|
|
|
int res; |
int res; |
long int out=0; |
long int out=0; |
int wc = 0; |
int free; |
|
|
|
free = ring_write_rest(&(card->rbufB)); |
|
|
card->nonblock = nonblock; |
card->nonblock = nonblock; |
|
|
Line 602 static long margi_write_audio(struct cvd
|
Line 598 static long margi_write_audio(struct cvd
|
if (count > 0) { // Do we have data? |
if (count > 0) { // Do we have data? |
if ((res = Prepare(card))) |
if ((res = Prepare(card))) |
return res; |
return res; |
|
|
if ((setup->streamtype == stream_ES) |
if ((setup->streamtype == stream_ES) |
&& (setup->streamtype == stream_PES)){ |
|| (setup->streamtype == stream_PES)){ |
if (!card->use_ringB) |
if (!card->use_ringB) |
MargiSetBBuffers(card, NBBUF* |
MargiSetBuffers(card, NBBUF* |
CHANNELBUFFERSIZE); |
CHANNELBUFFERSIZE,1); |
|
if (!nonblock && |
while (wc < 1000 && |
!wait_event_interruptible(card->wqB, |
!card->nonblock && out < count){ |
free >count )){ |
wc++; |
out = MargiPushB(card, count, |
out += MargiPushB(card, count, data); |
data); |
if (out < count){ |
} else { |
interruptible_sleep_on(&card->wqB); |
|
} |
|
} |
|
if (card->nonblock) { |
|
out = MargiPushB(card, count, data); |
out = MargiPushB(card, count, data); |
} |
} |
} |
} |
Line 635 void pes_write(uint8_t *buf, int count,
|
Line 626 void pes_write(uint8_t *buf, int count,
|
struct cvdv_cards *card = (struct cvdv_cards *) priv; |
struct cvdv_cards *card = (struct cvdv_cards *) priv; |
|
|
margi_write(card, buf, count, 0); |
margi_write(card, buf, count, 0); |
|
|
} |
} |
|
|
|
|
Line 644 static ssize_t PSwrite(struct file *file
|
Line 634 static ssize_t PSwrite(struct file *file
|
{ |
{ |
struct cvdv_cards *card = |
struct cvdv_cards *card = |
minorlist[MINOR(file->f_dentry->d_inode->i_rdev) % MAXDEV]; // minor number modulo 16 |
minorlist[MINOR(file->f_dentry->d_inode->i_rdev) % MAXDEV]; // minor number modulo 16 |
return margi_write(card, data, count, 1); |
return margi_write(card, data, count, file->f_flags&O_NONBLOCK); |
|
|
} |
} |
|
|
static unsigned int PSpoll(struct file *file, poll_table * table) |
static unsigned int PSpoll(struct file *file, poll_table * table) |
Line 663 static unsigned int PSpoll(struct file *
|
Line 652 static unsigned int PSpoll(struct file *
|
return POLLERR; |
return POLLERR; |
} |
} |
|
|
|
static unsigned int poll_audio(struct file *file, poll_table * table) |
|
{ |
|
struct cvdv_cards *card = |
|
minorlist[MINOR(file->f_dentry->d_inode->i_rdev) % MAXDEV]; // minor number modulo 16 |
|
if (card != NULL) { |
|
poll_wait(file, &card->wqB, table); |
|
if ( !card->rbufB.buffy || ring_write_rest(&(card->rbufB)) ) |
|
return (POLLOUT | POLLWRNORM); |
|
else { |
|
return 0; |
|
} |
|
} else |
|
return POLLERR; |
|
} |
|
|
static int |
static int |
OSD_DrawCommand(struct cvdv_cards *card,osd_cmd_t *dc) |
OSD_DrawCommand(struct cvdv_cards *card,osd_cmd_t *dc) |
{ |
{ |
Line 998 static int margi_open(struct cvdv_cards
|
Line 1002 static int margi_open(struct cvdv_cards
|
if (card->open) |
if (card->open) |
closed = 0; |
closed = 0; |
if (closed) { // first open() for this card? |
if (closed) { // first open() for this card? |
MargiFreeBuffers(card); |
MargiFreeBuffers(card,2); |
VideoSetBackground(card, 1, 0, 0, 0); // black |
VideoSetBackground(card, 1, 0, 0, 0); // black |
} |
} |
card->open++; |
card->open++; |
Line 1017 static int PSopen(struct inode *inode, s
|
Line 1021 static int PSopen(struct inode *inode, s
|
{ |
{ |
struct cvdv_cards *card = minorlist[MINOR(inode->i_rdev) % MAXDEV]; |
struct cvdv_cards *card = minorlist[MINOR(inode->i_rdev) % MAXDEV]; |
card->audiostate.AVSyncState=true; |
card->audiostate.AVSyncState=true; |
return margi_open(card,0); |
return margi_open(card, file->f_flags); |
} |
} |
|
|
|
|
Line 1085 dvbdev_open(struct dvb_device *dvbdev, i
|
Line 1089 dvbdev_open(struct dvb_device *dvbdev, i
|
struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv; |
struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv; |
int type=num2type(card, num); |
int type=num2type(card, num); |
int ret=0; |
int ret=0; |
struct StreamSetup *setup = &card->setup; |
|
|
|
if (type<0) |
if (type<0) |
return -EINVAL; |
return -EINVAL; |
Line 1102 dvbdev_open(struct dvb_device *dvbdev, i
|
Line 1105 dvbdev_open(struct dvb_device *dvbdev, i
|
card->video_blank=true; |
card->video_blank=true; |
card->audiostate.AVSyncState=true; |
card->audiostate.AVSyncState=true; |
card->videostate.streamSource=VIDEO_SOURCE_DEMUX; |
card->videostate.streamSource=VIDEO_SOURCE_DEMUX; |
margi_open(card, 0); |
margi_open(card, file->f_flags); |
break; |
break; |
|
|
case DVB_DEVICE_AUDIO_0: |
case DVB_DEVICE_AUDIO_0: |
|
card->audiostate.AVSyncState=true; |
card->audiostate.streamSource=AUDIO_SOURCE_DEMUX; |
card->audiostate.streamSource=AUDIO_SOURCE_DEMUX; |
break; |
break; |
|
|
Line 1115 dvbdev_open(struct dvb_device *dvbdev, i
|
Line 1119 dvbdev_open(struct dvb_device *dvbdev, i
|
ret=DmxDevFilterAlloc(&card->dmxdev, file); |
ret=DmxDevFilterAlloc(&card->dmxdev, file); |
break; |
break; |
case DVB_DEVICE_DVR_0: |
case DVB_DEVICE_DVR_0: |
setup->streamtype = stream_PES; |
card->audiostate.AVSyncState=true; |
setup->audioselect = audio_MPEG; |
margi_open(card, file->f_flags); |
margi_open(card, 0); |
|
ret=DmxDevDVROpen(&card->dmxdev, file); |
ret=DmxDevDVROpen(&card->dmxdev, file); |
break; |
break; |
|
|
Line 1196 dvbdev_write(struct dvb_device *dvbdev,
|
Line 1199 dvbdev_write(struct dvb_device *dvbdev,
|
if ( card->setup.streamtype != stream_PES ) |
if ( card->setup.streamtype != stream_PES ) |
return -EPERM; |
return -EPERM; |
|
|
// return margi_write_audio(card, buf, count, |
return margi_write_audio(card, buf, count, |
// file->f_flags&O_NONBLOCK); |
file->f_flags&O_NONBLOCK); |
return count; |
|
|
|
case DVB_DEVICE_DVR_0: |
case DVB_DEVICE_DVR_0: |
return DmxDevDVRWrite(&card->dmxdev, file, buf, count, ppos); |
return DmxDevDVRWrite(&card->dmxdev, file, buf, count, ppos); |
Line 1242 dvbdev_ioctl(struct dvb_device *dvbdev,
|
Line 1244 dvbdev_ioctl(struct dvb_device *dvbdev,
|
struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv; |
struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv; |
void *parg=(void *)arg; |
void *parg=(void *)arg; |
int type=num2type(card, num); |
int type=num2type(card, num); |
|
uint16_t attr; |
|
|
switch (type) { |
switch (type) { |
case DVB_DEVICE_VIDEO_0: |
case DVB_DEVICE_VIDEO_0: |
Line 1385 dvbdev_ioctl(struct dvb_device *dvbdev,
|
Line 1388 dvbdev_ioctl(struct dvb_device *dvbdev,
|
case VIDEO_CAP_CSS: |
case VIDEO_CAP_CSS: |
f = stream_DVD; |
f = stream_DVD; |
} |
} |
|
|
card->setup.streamtype = f; |
card->setup.streamtype = f; |
|
|
} |
} |
break; |
break; |
|
|
|
case VIDEO_SET_ID: |
|
card->setup.videoID = arg; |
|
DecoderPrepareVideo(card); |
|
break; |
|
|
|
case VIDEO_SET_SYSTEM: |
|
card->videomode = (videosystem) arg; |
|
SetVideoSystem(card); |
|
break; |
|
|
|
case VIDEO_SET_HIGHLIGHT: |
|
{ |
|
uint8_t data1[4]; |
|
uint8_t data2[6]; |
|
videoHighlight_t vh; |
|
|
|
if(copy_from_user(&vh, parg, sizeof(videoHighlight_t))) |
|
return -EFAULT; |
|
|
|
data1[0] = vh.contrast1; |
|
data1[1] = vh.contrast2; |
|
data1[2] = vh.color1; |
|
data1[3] = vh.color2; |
|
data2[0] = vh.ypos & 0xFF; |
|
data2[1] = (uint8_t) ((vh.ypos >> 1) & 0xFF); |
|
data2[2] = (uint8_t) ((vh.ypos >> 2) & 0xFF); |
|
data2[3] = vh.xpos & 0xFF; |
|
data2[4] = (uint8_t) ((vh.xpos >> 1) & 0xFF); |
|
data2[5] = (uint8_t) ((vh.xpos >> 2) & 0xFF); |
|
return DecoderHighlight(card, vh.active, data1, data2); |
|
break; |
|
} |
|
|
|
case VIDEO_SET_SPU: |
|
{ |
|
videoSPU_t spu; |
|
|
|
if(copy_from_user(&spu, parg, sizeof(videoSPU_t))) |
|
return -EFAULT; |
|
|
|
return DecoderSPUStream(card, spu.streamID, spu.active); |
|
break; |
|
} |
|
|
|
case VIDEO_SET_SPU_Palette: |
|
{ |
|
videoSPUPalette_t spup; |
|
|
|
if(copy_from_user(&spup, parg, sizeof(videoSPUPalette_t))) |
|
return -EFAULT; |
|
|
|
return DecoderSPUPalette(card, spup.length, spup.palette); |
|
break; |
|
} |
|
|
|
case VIDEO_GET_NAVI: |
|
{ |
|
videoNaviPack_t navi; |
|
|
|
navi.length = DecoderGetNavi(card, &(navi.data)); |
|
if(copy_to_user(parg, &navi, sizeof(videoNaviPack_t))) |
|
return -EFAULT; |
|
} |
|
break; |
|
|
|
case VIDEO_SET_ATTRIBUTES: |
|
{ |
|
if (!card->ChannelBuffersAllocated) { |
|
DecoderStreamReset(card); |
|
MargiFlush(card); |
|
|
|
card->setup.streamtype = stream_DVD; |
|
card->setup.videoID = 0; |
|
DecoderPrepareVideo(card); |
|
DecoderPreparePS(card, 0, 0, 2, 2, 3, 1); |
|
} |
|
|
|
SetVideoAttr(card, arg); |
|
card->startingDVDV = 1; |
|
} |
|
break; |
|
|
default: |
default: |
return -ENOIOCTLCMD; |
return -ENOIOCTLCMD; |
} |
} |
Line 1515 dvbdev_ioctl(struct dvb_device *dvbdev,
|
Line 1600 dvbdev_ioctl(struct dvb_device *dvbdev,
|
|
|
card->setup.audioselect = (audio_type) f; |
card->setup.audioselect = (audio_type) f; |
DecoderPrepareAudio(card); |
DecoderPrepareAudio(card); |
|
break; |
} |
} |
break; |
|
|
case AUDIO_SET_ID: |
|
if (arg < 0 || arg >32) arg = 0; |
|
card->setup.audioID = arg; |
|
arg = 0; |
|
case AUDIO_SET_EXT_ID: |
|
if (arg < 0 || arg >32) arg = 0; |
|
card->setup.audioIDext = arg; |
|
|
|
attr = card->lastaattr; |
|
DecoderSelectAudioID(card); |
|
card->lastaattr = attr; |
|
break; |
|
|
|
case AUDIO_SET_MIXER: |
|
return -EINVAL; |
|
|
|
case AUDIO_SET_ATTRIBUTES: |
|
SetAudioAttr(card,arg); |
|
card->startingDVDA = ((card->setup.audioselect != audio_none) |
|
&& (card->setup.audioselect != |
|
audio_disable)); |
|
break; |
|
|
|
|
|
case AUDIO_SET_KARAOKE: |
|
{ |
|
break; |
|
} |
|
|
default: |
default: |
return -ENOIOCTLCMD; |
return -ENOIOCTLCMD; |
Line 1565 dvbdev_poll(struct dvb_device *dvbdev, i
|
Line 1679 dvbdev_poll(struct dvb_device *dvbdev, i
|
return PSpoll(file, wait); |
return PSpoll(file, wait); |
|
|
case DVB_DEVICE_AUDIO_0: |
case DVB_DEVICE_AUDIO_0: |
return POLLOUT;//PSpoll(file, wait); |
return poll_audio(file, wait); |
|
|
case DVB_DEVICE_CA_0: |
case DVB_DEVICE_CA_0: |
break; |
break; |