dvd_decoder.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:10k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.  * dvddecoder: interface to the DVD/MPEG decoder for the DVD Video Navigator
  3.  * Copyright (C) 1999 Christian Wolff for convergence integrated media GmbH
  4.  * 
  5.  * This program is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU General Public License
  7.  * as published by the Free Software Foundation; either version 2
  8.  * of the License, or (at your option) any later version.
  9.  * 
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  * 
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
  19.  * 
  20.  * The author can be reached at scarabaeus@convergence.de, 
  21.  * the project's page is at http://linuxtv.org/dvd/
  22.  */
  23. #include <stdio.h>
  24. #include "dvd_decoder.h"
  25. #include "cvdvext.h"
  26. #define DEFAULTDEVICE      "/dev/msc0"  // LSI DVD card, major 162, minor 0
  27. FILE* device=NULL;  // our character device for the card
  28. struct drawcmd dc;
  29. struct decodercmd decmd;
  30. // Set decoding stream number for video data
  31. // dec_stream: 0 thru 15 (should be 0 for DVD)
  32. // returns 0 on success, 1 on error
  33. int DecoderSetVideoStream(unsigned int dec_stream) {
  34.   if (device==NULL) return 1;
  35.   decmd.param1=dec_stream;
  36.   decmd.cmd=Decoder_Set_VideoStreamID;
  37.   return DecoderCommand(device,decmd);
  38. }
  39. // Set attributes of video data
  40. //   bits: descr.
  41. //   15-14 Video compression mode (0=MPEG-1, 1=MPEG-2)
  42. //   13-12 TV system (0=525/60, 1=625/50)
  43. //   11-10 Aspect ratio (0=4:3, 3=16:9)
  44. //    9- 8 permitted display mode on 4:3 monitor (0=both, 1=only pan-scan, 2=only letterbox)
  45. //    7    line 21-1 data present in GOP (1=yes, 0=no)
  46. //    6    line 21-2 data present in GOP (1=yes, 0=no)
  47. //    5- 3 source resolution (0=720x480/576, 1=704x480/576, 2=352x480/576, 3=352x240/288)
  48. //    2    source letterboxed (1=yes, 0=no)
  49. //    0    film/camera mode (0=camera, 1=film (625/50 only))
  50. // returns 0 on success, 1 on error
  51. int DecoderSetVideoAttr(unsigned int atr) {
  52.   if (device==NULL) return 1;
  53.   decmd.param1=atr;
  54.   decmd.cmd=Decoder_Set_Videoattribute;
  55.   return DecoderCommand(device,decmd);
  56. }
  57. // Set decoding stream number for audio data
  58. // dec_stream: 0 thru 7, or 15 for audio disable
  59. // extension: 
  60. //   0: MPEG1 Audio or MPEG2 Audio without extension stream
  61. //   1: MPEG2 Audio with extension stream
  62. // returns 0 on success, 1 on error
  63. int DecoderSetAudioStream(unsigned int dec_stream, int extension) {
  64.   if (device==NULL) return 1;
  65.   if (dec_stream<=7) {
  66.     decmd.param1=dec_stream&0x07;
  67.     decmd.param2=((extension)?0x10|(dec_stream&0x07):-1);
  68.   } else {
  69.     decmd.param1=-1;
  70.     decmd.param2=-1;
  71.   }
  72.   decmd.cmd=Decoder_Set_AudioStreamID;
  73.   return DecoderCommand(device,decmd);
  74. }
  75. // Set attributes of audio data
  76. //   bits: descr.
  77. //   15-13 audio coding mode (0=ac3, 2=mpeg1, 3=mpeg2ext, 4=LPCM, 6=DTS, 7=SDDS)
  78. //   12    multichannel extension
  79. //   11-10 audio type (0=not spec, 1=language included)
  80. //    9- 8 audio application mode (0=not spec, 1=karaoke, 2=surround)
  81. //    7- 6 Quantization / DRC (mpeg audio: 1=DRC exists)(lpcm: 0=16bit, 1=20bit, 2=24bit)
  82. //    5- 4 Sample frequency fs (0=48kHz, 1=96kHz)
  83. //    2- 0 number of audio channels (n+1 channels)
  84. // returns 0 on success, 1 on error
  85. int DecoderSetAudioAttr(unsigned int atr) {
  86.   if (device==NULL) return 1;
  87.   decmd.param1=atr;
  88.   decmd.cmd=Decoder_Set_Audioattribute;
  89.   return DecoderCommand(device,decmd);
  90. }
  91. // Set decoding stream number for SPU data
  92. // dec_stream, bit 0 thru 5: 0 thru 31, or 63 for SPU disable
  93. // dec_stream, bit 6: 1=display SPU stream, 0=decode, but don't display
  94. // returns 0 on success, 1 on error
  95. int DecoderSetSubPictureStream(unsigned int dec_stream) {
  96.   if (device==NULL) return 1;
  97.   decmd.cmd=Decoder_SPU;
  98.   decmd.param1=dec_stream&0x001F;
  99.   decmd.param2=(dec_stream&0x0040);
  100.   return DecoderCommand(device,decmd);
  101. }
  102. // Set palette information for SPU
  103. // data has to have colors*3 bytes: y,cr,cb
  104. // returns 0 on success, 1 on error
  105. int DecoderSetSubPicturePalette(int colors, unsigned char *data) {
  106.   if (device==NULL) return 1;
  107.   decmd.cmd=Decoder_SPU_Palette;
  108.   decmd.param1=colors*3;
  109.   decmd.data1=data;
  110.   return DecoderCommand(device,decmd);
  111. }
  112. // Set karaoke mode
  113. // mixmask: bitmap to set source to mix into left/right channel
  114. //     Bit 2:  0=don't mix, 1=mix Ch2 to Ch1 (Melody? to Right?)
  115. //     Bit 3:  0=don't mix, 1=mix Ch3 to Ch1 (Voice 1? to Right?)
  116. //     Bit 4:  0=don't mix, 1=mix Ch4 to Ch1 (Voice 2? to Right?)
  117. //     Bit 10: 0=don't mix, 1=mix Ch2 to Ch0 (Melody? to Left?)
  118. //     Bit 11: 0=don't mix, 1=mix Ch3 to Ch0 (Voice 1? to Left?)
  119. //     Bit 12: 0=don't mix, 1=mix Ch4 to Ch0 (Voice 2? to Left?)
  120. // returns 0 on success, 1 on error
  121. int DecoderSetKaraokeMix(unsigned int mixmask) {
  122.   if (device==NULL) return -1;
  123.   decmd.cmd=Decoder_SetKaraoke;
  124.   decmd.param1=((mixmask&0x0404)?1:0);
  125.   decmd.param2=((mixmask&0x0808)?1:0);
  126.   decmd.param3=((mixmask&0x1010)?1:0);
  127.   return DecoderCommand(device,decmd);
  128. }
  129. // highlighting SPU button
  130. // active:
  131. //   1=show highlight, 0=hide highlight
  132. // coli: color information(SL_COLI or AC_COLI) MSB first 
  133. //   bits:  descr.
  134. //   31-28  Emphasis pixel-2 color
  135. //   27-24  Emphasis pixel-1 color
  136. //   23-20  Pattern pixel color
  137. //   19-16  Background pixel color
  138. //   15-12  Emphasis pixel-2 contrast
  139. //   11- 8  Emphasis pixel-1 contrast
  140. //    7- 4  Pattern pixel contrast
  141. //    3- 0  Background pixel contrast
  142. // posi: button position(BTN_POSI) MSB first
  143. //   bits:  descr.
  144. //   47-46  button color number
  145. //   45-36  start x
  146. //   33-24  end x
  147. //   23-22  auto action mode
  148. //   21-12  start y
  149. //    9- 0  end y
  150. // returns 0 on success, 1 on error
  151. int DecoderHighlight(int active, unsigned char *coli, unsigned char *posi) {
  152.   if (device==NULL) return 1;
  153.   decmd.cmd=Decoder_Highlight;  // set highlight information
  154.   decmd.param1=active;  // show highlight information?
  155.   decmd.data1=coli;  // color & contrast
  156.   decmd.data2=posi;  // where to highlight?
  157.   return DecoderCommand(device,decmd);
  158. }
  159. // put decoder into or out of pause
  160. // cmd: 0=pause off, 1=pause on, 2=pause toggle
  161. // returns 0 on success, 1 on error
  162. int DecoderPause(int cmd) {
  163.   if (device==NULL) return 1;
  164.   decmd.cmd=Decoder_Pause;
  165.   decmd.param1=cmd;
  166.   return DecoderCommand(device,decmd);
  167. }
  168. // retreive navigation pack parsed from the stream
  169. // data will be filled with 1024 bytes of DSI or PCI data
  170. // returns 1024 on success, 0 on error
  171. int DecoderGetNaviPack(unsigned char *data) {
  172.   if (device==NULL) return 0;
  173.   decmd.cmd=Decoder_GetNavi;  // retreive navi pack from the channel buffer
  174.   decmd.data1=data;
  175.   return DecoderCommand(device,decmd);
  176. }
  177. // Bypass CSS module, use data as-is
  178. // returns 0 on success, -1 on error
  179. int DecoderCSSBypass(void) {
  180.   if (device==NULL) return -1;
  181.   decmd.param1=0;  // DVD Decoder API: bypass and disable CSS module
  182.   decmd.cmd=Decoder_CSS;
  183.   return DecoderCommand(device,decmd);
  184. }  
  185. // Retreive host challenge for drive
  186. // disc: 1=disc key auth, 0=title key auth
  187. // data: will be filled with 10 bytes key data
  188. // returns 0 on success, -1 on error
  189. int DecoderCSSDriveAuthChallenge(int disc, char *data) {
  190.   if (device==NULL) return -1;
  191.   decmd.param1=((disc)?1:5);  // DVD Decoder API: retreive drive challenge
  192.   decmd.data1=data;
  193.   decmd.cmd=Decoder_CSS;
  194.   return DecoderCommand(device,decmd);
  195. }  
  196. // Send drive response to host
  197. // disc: 1=disc key auth, 0=title key auth
  198. // data: 5 bytes key data
  199. // returns 0 on success, -1 on error
  200. int DecoderCSSDriveAuthResponse(int disc, char *data) {
  201.   if (device==NULL) return -1;
  202.   decmd.param1=((disc)?2:6);  // DVD Decoder API: post drive response
  203.   decmd.data1=data;
  204.   decmd.cmd=Decoder_CSS;
  205.   return DecoderCommand(device,decmd);
  206. }  
  207. // Send drive challenge to host
  208. // and retreive host response for drive
  209. // disc: 1=disc key auth, 0=title key auth
  210. // data: 10 bytes key data, will be filled with 5 bytes key data
  211. // returns 0 on success, -1 on error
  212. int DecoderCSSHostAuth(int disc, char *data) {
  213.   if (device==NULL) return -1;
  214.   decmd.param1=((disc)?3:7);  // DVD Decoder API: post card challenge
  215.   decmd.data1=data;
  216.   decmd.cmd=Decoder_CSS;
  217.   return DecoderCommand(device,decmd);
  218. }  
  219. // Send disc key to host
  220. // data: 2048 bytes key data
  221. // returns 0 on success, -1 on error
  222. int DecoderCSSDiscKey(char *data) {
  223.   if (device==NULL) return -1;
  224.   decmd.param1=4;  // DVD Decoder API: post disc key
  225.   decmd.data1=data;
  226.   decmd.cmd=Decoder_CSS;
  227.   return DecoderCommand(device,decmd);
  228. }  
  229. // Send title key to host
  230. // data: 5 bytes key data
  231. // returns 0 on success, -1 on error
  232. int DecoderCSSTitleKey(char *data) {
  233.   if (device==NULL) return -1;
  234.   decmd.param1=8;  // DVD Decoder API: post title key
  235.   decmd.data1=data;
  236.   decmd.cmd=Decoder_CSS;
  237.   return DecoderCommand(device,decmd);
  238. }  
  239. // sends one Logical Block to the DVD Decoder
  240. // data: pointer to data to be sent to the decoder
  241. // size: amount of bytes in data
  242. // initial: 1 if first block of a stream
  243. // returns 0 on success, 1 on error
  244. int DecoderWrite(unsigned char *data, int size, int initial) {
  245.   if (device==NULL) return 1;
  246.   decmd.cmd=Decoder_WriteBlock;
  247.   decmd.param1=size;
  248.   decmd.param2=initial;
  249.   decmd.param3=initial;
  250.   decmd.data1=data;
  251.   if (DecoderCommand(device,decmd)) return 1;
  252.   return 0;
  253. }
  254. // Set the path to the device that displays the DVD data
  255. // This file has to accept the I/O-Controls defined in this
  256. // convergence DVD Decoder API: http://linuxtv.org/dvd/api/
  257. // returns 0 on success, 1 on error
  258. int DecoderSetDevice(char *Path) {
  259.   if (strlen(Path)==0) {
  260.     if ((device=fopen(DEFAULTDEVICE,"w"))==NULL) return 1;
  261.   } else {
  262.     if ((device=fopen(Path,"w"))==NULL) return 1;
  263.   }
  264.   decmd.cmd=Decoder_Set_Streamtype;
  265.   decmd.param1=stream_DVD;  // DVD stream with SPU/Navi/etc.
  266.   DecoderCommand(device,decmd);
  267.   return 0;
  268. }