macro.c
上传用户:poi891205
上传日期:2013-07-15
资源大小:9745k
文件大小:26k
源码类别:

DVD

开发平台:

C/C++

  1. //
  2. // FILE
  3. // macro.c
  4. //
  5. // DESCRIPTION
  6. //
  7. //
  8. #include "config.h"
  9. #include "global.h"
  10. #include "memmap.h"
  11. #include "cd.h"
  12. #include "macro.h"
  13. #include "osd.h"
  14. #include "func.h"
  15. #include "supfunc.h"
  16. #include "dma.h"
  17. #include "vpp.h"
  18. #include "atapi_if.h"
  19. #include "stc.h"
  20. #include "lbaif.h"
  21. #include "util.h"
  22. #include "svcd.h"   //Jeff 20010717
  23. #include "dsp3_if.h" //Jeff 20010827
  24. #include "auddrv.h" //2004AUDDRV oliver 20041011 for using audio driver API purpose
  25. #include "dvdpe.h"
  26. #include "viddec.h"
  27. #include "cdxa.h"
  28. #include "mpegsys.h"
  29. #include "cdfunc.h"
  30. #include "dvdpe.h"
  31. #include "setup.h"
  32. #include "pu8560.h" //alan,2002/5/28 10:07PM
  33. #include "fs96602.h"//#ifdef SUPPORT_FILE_SYSTEM_MODE
  34. #include "fsGUI.h"
  35. #include "fsNAV.h"
  36. #include "srv2.h" //cyue: add streamming play
  37. #include "kinf.h"
  38. #include "sinf.h"
  39. #include "kernel.h"
  40. #include "asf_if.h"
  41. #include "avi_if.h"
  42. #include "audcodec.h"
  43. #include "bit_rate.h"   // 2004/07/26 yltseng
  44. #include "cardfs.h"     //wthsin, 2004/8/5 01:24am
  45. #ifndef DVDRELEASE
  46. //#define MACRO_DBG       1
  47. #endif
  48. #ifdef MACRO_DBG
  49. #define MONE_FUNCTION
  50. #define macro_puts(s)       io_write_wait(s)
  51. #endif
  52. #ifdef  MONE_FUNCTION
  53. #define macro_function(s)   do {macro_puts(s); macro_puts("n");} while (0)
  54. #endif
  55. #ifndef macro_puts
  56. #define macro_puts(s)       ((void)0)
  57. #endif
  58. #ifndef macro_function
  59. #define macro_function(s)   ((void)0)
  60. #endif
  61. //
  62. // standalone debugging
  63. // enable macro_puts() with UART0_puts()
  64. //
  65. #if 0
  66. #include "uartsup.h"
  67. #undef  macro_puts
  68. #define macro_puts(s)       UART0_puts(s)
  69. #endif
  70. #ifdef SUPPORT_MIDI_MENU_SEL
  71. extern UINT8 gIsMidiSelMenu;
  72. #endif
  73. //2004AUDDRV extern  void    DSPReset();
  74. extern  int     DTSAC3_check(void);        //Jeff 20010717
  75. extern  void    resync_audio(void);
  76. extern  int     get_size_map(int track);
  77. extern  int     get_segment_length(int s);
  78. //2004AUDDRV init_cdda(void);//kenny
  79. //2004AUDDRV extern  void    init_dtscd(void);
  80. //2004AUDDRV extern  void    init_mp3(void);
  81. extern  int     do_mp3(void);
  82. extern int do_aac(void);
  83. extern  int     do_audio_cdda(void);
  84. extern  void    set_video_aspect(void);
  85. void    InitializeCDPlayback(UINT32 lba,UINT32 len,UINT8 id);
  86. #include "ninf.h"
  87. #include "pinf.h"
  88. extern UINT32 save_srn_start_t;
  89. UINT32  mp3ReadLen; //To count data(units in Word) that move to Aud Buf(for MP3 timeing display) Jeff 20010919
  90. BYTE    audio_only;
  91. t_seq_info last_header;
  92. static  inline  void
  93. restart_sup(void)
  94. {
  95. reset_sup();
  96. }
  97. void MacroSaveHeader()
  98. {
  99.     if( (!show_logo)&&((psd_state&PSD_SEL_LIST)==0) )
  100.     {
  101.         //Terry,2004/6/7 06:39PM
  102.         //for HanYing, Video Masaic.
  103.         save_sequence_info(&last_header);
  104.     }
  105. }
  106. void MacroRestoreHeader()
  107. {
  108.     setup_sequence_info(&last_header);
  109. }
  110. /*
  111. ** Abort()
  112. **
  113. ** HIGH PRIORITY.  IMMEDIATE
  114. */
  115. void    MacroAbort()
  116. {
  117. macro_puts("abortn");
  118. avd_idle_state();
  119. SetIntrMask(0);
  120.   //SetIntrFlag(0);
  121. }
  122. /*
  123. ** Sync()
  124. **
  125. ** HIGH PRIORITY.  IMMEDIATE
  126. */
  127. void    MacroSync()
  128. {
  129. while (IsRPicStart || !IsVPicEnd)
  130. ;
  131. }
  132. /*
  133. ** Pause()
  134. **
  135. ** Cause the player to PAUSE and stop.
  136. **
  137. */
  138. void    MacroPause()
  139. {
  140. AUDIF_Set_Pause();//2004AUDDRV AudioSetPause(); //Pause command to DSP Jeff 20010919
  141. avd_pause_on();
  142. }
  143. //
  144. // Continue()
  145. //
  146. // Release from PAUSE status and continue playback.
  147. // STC and other timers should be reset and resynced according to incoming
  148. // bitstream.
  149. //
  150. void    MacroContinue()
  151. {
  152. avd_pause_off();
  153. avd_play_state();
  154. AUDIF_Set_Continue();//2004AUDDRV AudioSetContinue(); //Continue-play command to DSP Jeff 20010919
  155. }
  156. /*
  157. ** DisplayBackground()
  158. **
  159. ** Display the background for preview.
  160. ** Also set display picture id to 2
  161. **
  162. */
  163. //void    MacroDisplayBackground()
  164. //{
  165. //  set_disbuf(1);
  166. //}
  167. /*
  168. ** Freeze()
  169. **
  170. ** Cause the player to play audio only.  Video output is freezed.
  171. **
  172. */
  173. //void    MacroFreeze()
  174. //{
  175. //}
  176. /*
  177. ** OSD_OnOff()
  178. **
  179. **
  180. */
  181. /*
  182. void    MacroOSD_OnOff()
  183. {
  184.   if (MacroParam.OSD_OnOff.on_off)
  185.   {
  186.         // reset link address
  187.     regs0->tlink_addr  = LINK_NULL;
  188.     regs0->blink_addr  = LINK_NULL;
  189.   }
  190.   else
  191.   {
  192.         // setup link address
  193.     regs0->tlink_addr  = region[0].osd_header[0];
  194.     regs0->blink_addr  = region[0].osd_header[1];
  195.   }
  196. }
  197. */
  198. /*
  199. ** PlayMP3()
  200. **
  201. ** interestingly, I am still not sure how to design this.
  202. **
  203. */
  204. void    MacroPlayMP3(void)
  205. {
  206.     macro_function(__FUNCTION__);
  207.     /*
  208.     ** play video elementary bitstream only.
  209.     */
  210.     CDSetPlayCRC();
  211.     s_msf             = MacroParam.PlayMP3.address_msf;
  212.     s_len             = MacroParam.PlayMP3.length;
  213.     e_msf  = addmsf(s_msf, s_len);
  214.     if(adv_search_time<0)
  215.     {
  216.         if (GetCurrentFileType() == CDROM)
  217.         {
  218.             mp3ReadLen = (PlayBackLength-10)<<11;
  219.             s_msf = addmsf(e_msf,-10);
  220.         }
  221.     }
  222.     InitializeCDPlayback(msf2l(s_msf),(UINT32)s_len,0);
  223.     VOBU_DIS = 0; //Jeff 20011024
  224. }
  225. /*
  226. void PlayMP3FromEnd(UINT32 msf, UINT32 len)
  227. {
  228. }
  229. */
  230. /*
  231. void PlayMP3FromX(UINT32 msf, UINT32 len, UINT32 Xmsf)
  232. {
  233.   MacroParam.PlayMP3.address_msf=(msf);
  234.   MacroParam.PlayMP3.length=(len);
  235.   CDSetPlayCRC();
  236.   s_msf             = MacroParam.PlayMP3.address_msf;
  237.   s_len             = MacroParam.PlayMP3.length;
  238.   e_msf  = addmsf(s_msf, s_len); //Jeff 20010827
  239.   st_msf = s_msf;
  240. //  mp3ReadLen = 0;
  241.   //InitializeCDPlayback(msf2l(s_msf),(UINT32)s_len,0);
  242.   InitializeCDPlayback(msf2l(Xmsf), (UINT32)s_len, 0);
  243.   VOBU_DIS = 0;
  244. }
  245. */
  246. UINT8 avd_search_header(void)
  247. {
  248.     if (AVD_state == STATE_FINDFIRSTSEQ) return TRUE;
  249.     return FALSE;
  250. }
  251. extern void init_svcd_as(void); // in navuser_if.c
  252. extern BYTE audioNotContinuous; //Jeff 20021125
  253. //
  254. // FUNCTION
  255. // InitializeCDPlayback()
  256. //
  257. void
  258. InitializeCDPlayback(UINT32 lba,UINT32 len,UINT8 id)
  259. {
  260.     macro_function(__FUNCTION__);
  261.     #ifdef ZOOM_FFBF_NOT_ACROSS_TRACK//Jack 20040930
  262.     if(vpp_zoom || adv_search_time)
  263.     {
  264.         vpp_zoom = 0;
  265.         adv_search_time = 0;
  266.         osd_tog_region(REGION1,OSD_OFF);
  267.         //PrintOsdMsg(STR_OS_PLAY,REGION1, 1,0);
  268.     }
  269.     #endif
  270.     if(counter_down==-1)
  271.         counter_down = 5;
  272.     flush_atapi();
  273. // initialize new playback
  274.     audio_only    = 0;
  275.     set_video_stream_id(0xe0);
  276. // initialize cd track
  277.     cd_update_trk_now();
  278. // initialize service program
  279.     setup_decode_service(SERVICE_CD);
  280.     cd_type = GetCurrentFileType();
  281.     do_system = do_system_init = do_system_layer;
  282.     restart_video_engine();
  283.     restart_audio_engine();
  284.     if ((cd_type != CDDVD) && (cd_type_loaded != CDROM)) // Robert 2004/02/05, cdrom disc should not enter.
  285.     {
  286.         //terry,2002/5/1 12:12AM
  287.         //audio/subtitle must be initial,avoid being reset on trk chg
  288.         init_svcd_as();
  289.         // initialize cd msf
  290.         //printf("psd_state:%xn",psd_state);
  291.         if (cd_type_loaded != CDROM)
  292.         {
  293.             if (((psd_state&PSD_PLAY_SEG) != PSD_PLAY_SEG) || (bDiscType == CD_OKO))
  294.             {
  295.                 st_msf = gettrkmsf(cd_trk_now) & 0x00ffffff;
  296.                 if ((psd_state & PSD_PLAY_LIST) && pFsJpeg->List.p.play_time)
  297.                 {
  298.                     e_msf = addmsf(s_msf, getUINT16_bi(&pFsJpeg->List.p.play_time) * 5);
  299.                 }
  300.                 else if ((bDiscType == CD_OKO) && ((!IsPBCOn()) || (psd_state & PSD_PLAY_LIST)))
  301.                 {
  302.                     UINT8 a_o_id = (pFsJpeg->cdrom.oko_trk_end[cd_trk_now] >> 24);
  303.                     e_msf = pFsJpeg->cdrom.oko_trk_end[cd_trk_now] & 0x00ffffff;
  304.                     set_audio_stream_id(0xc0 | (a_o_id >> 4));
  305.                     sup_set_channel(a_o_id & 0xf);
  306.                 }
  307.                 else
  308.                 {
  309.                     e_msf = get_next_trk_msf(cd_trk_now);
  310.                 }
  311.         if (bDiscType == CD_CVD)
  312.                 {
  313.                     //printf("oko id:%dn",oko_menu_id);
  314.     set_audio_stream_id(0xc0 |oko_menu_id);
  315.                     sup_set_channel(oko_menu_id);
  316.                 }
  317. if ((gettrkcna(cd_trk_now) & CNA_DATA) == 0)
  318.                     cd_type = CDDA;
  319.             } //if( ( (psd_state&PSD_PLAY_SEG)!=PSD_PLAY_SEG )||(bDiscType == CD_OKO) )
  320.         } //if(cd_type_loaded!=CDROM)
  321.         if (len == 0) len = msf2l(e_msf) - msf2l(s_msf);
  322.         // setup VCD specific information
  323.         if (cd_type != CDDA)
  324.         {
  325.             unsigned v_id;
  326.             // initialize video stream
  327.             v_id = 0xe0 | (id & 0x03);    // VCD: depends on PSD
  328.             if(v_id >= 0xe3) v_id = 0xe0;
  329.             if(v_id != 0xe0) audio_only = 2;
  330.             set_video_stream_id(v_id);
  331.             //printf("st_msf:%x s_msf:%xn",st_msf,s_msf);
  332.             //printf("2.goto_active:%xn",goto_active);
  333.     if (goto_active == 1)
  334.             {
  335.                 // * search video-sequence header
  336.                 //we must avoid user keyin when searching video seq. header
  337.                 //macro_puts("macro: search seq.hdrn");
  338.                 reset_sequence_state();
  339.                 AVD_ResetMediaStatus();
  340.                 AVD_state = STATE_FINDFIRSTSEQ;
  341.                 start_atapi_intr(msf2l(st_msf),5*75, 16);
  342.                 MediaMainLoop();
  343.                 flush_atapi();
  344.     restart_video_engine();
  345.     restart_audio_engine();
  346.                 //if (!sequence_start)
  347.                 //  macro_puts("macro: seq.hdr NOT foundn");
  348.                 //else
  349.                 //  macro_puts("macro: seq.hdr FOUNDn");
  350.         if (sequence_start)
  351.             goto_active = 0;
  352.             } else if (((psd_state==(PSD_PLAY_LIST|PSD_PLAY_ENTRY)) || adv_search_time<0) && (cd_type_loaded!=CDROM)) {
  353.                 // list, entry or backward playback: force auto-setting
  354.                 goto_active = 1;
  355.             } else if ((last_header.horizontal_size_value)&&(last_header.vertical_size_value)) {
  356.                 // has last-header: use saved-header info.
  357.                 Restore_header();
  358.     } else {
  359.                 // otherwise
  360.                 goto_active = 1;
  361.             }
  362.             //printf("3.goto_active:%xn",goto_active);
  363.             //printf("psd_state:%x goto_active:%xn",psd_state,goto_active);
  364.             if (goto_active)
  365.             {
  366.                 if( (get_size_map(cd_trk_now)==1) || (cd_type_loaded==CDVCD10))
  367.                     setup_vcd_motion_pal();
  368.                 else
  369.                     setup_vcd_motion_ntsc();
  370.                 goto_active=0;
  371.             }
  372.         } //if(cd_type != CDDA)
  373.         //printf("stream_video:%x audio_only:%x psd_state:%xn",stream_video,audio_only,psd_state);
  374.     } //if ((cd_type!=CDDVD)&&(cd_type!=CDROM))
  375.     AVD_ResetMediaStatus();
  376.     source_end = 0;
  377.     if ((play_state != VCD_STATE_PREVIEW) && (play_state != VCD_STATE_9FRAMES))
  378.     {
  379.         avd_play_state();
  380.     }
  381.     else
  382.     {
  383.         avd_preview_state();
  384.     }
  385.     SetIntrMask(INTR_MASK_NORMAL);
  386.     restart_sup();
  387.     timeout_playback    = 0;
  388.     regs0->rtc_31_16    = 0;
  389.     timestamp_key       = 0;    // alan 0425
  390.     set_stc(0);
  391.     set_stc_init();
  392.     P_frame         = 0;    // clear pause
  393.     // navigator-state
  394.     PE_ClearNav();
  395.     sys_cmd = 0;
  396.     if (vpp_zoom<2)
  397.     {
  398.         set_video_aspect();
  399.     }
  400. #ifndef IR_TOOL
  401. printf("cd_type:%xn",cd_type);
  402. #endif
  403.     switch(cd_type)
  404.     {
  405. case CD_DA:
  406. case CDDA:
  407. {
  408. //Jeff 20020527
  409. BYTE bDTS=0;
  410. BYTE preCDsubtype;
  411. int     iRetry=0;
  412. preCDsubtype = cd_subtype; //Jeff 20021206
  413. audio_only = 1;   // terry,2002/4/30 05:32PM ff>=4 mute audio
  414. //init_cdda();        // for mix mode
  415. cd_subtype = CD_DA;       //Jeff 20020415
  416. setup_decode_service(SERVICE_CDDA);
  417. //4-7-23 0:28
  418. AUDIF_Set_Volume(0);//AudioSetVolume(0); //Jeff 20021125
  419.         // 2004/01/17 yltseng, because when we do some action during DTSAC3_check(), this action may be invalid because
  420.         // goto_active is set to 1. So we prevent user input during DTSAC3_check by setting counter_down longer
  421.         counter_down = 10;  
  422. do { //Jeff 20020518
  423. int iCheckType;
  424. audioNotContinuous=5; //Jeff 20021125
  425. goto_active = 1; //avoid display time show error time
  426. start_atapi_intr(msf2l(st_msf),150, 16);//terry,0515,search track start up
  427. iRetry++;
  428. iCheckType = DTSAC3_check();
  429. #ifdef SUPPORT_AC3_CD_DISC //terry,2004/2/17 06:35PM
  430. if (iCheckType==0xac3)
  431. { //Jeff 20040102
  432. //Dolby-CD
  433. cd_subtype = CD_AC3;
  434. AUDIF_Init_AC3CD();//2004AUDDRV init_ac3cd();
  435. setup_SetAC3Config();
  436. if ( setup_IsSet2SPDIF_Bitstream() ) {
  437. AUDIF_Reset_DSP();//2004AUDDRV DSPReset();
  438. }
  439. iRetry = 3;
  440. bDTS=0xf;
  441. } else
  442. #endif
  443. if (iCheckType > 0)
  444. {
  445. cd_subtype = CD_DTS;       //move to here 2003-8-13 0:38
  446. //printf("DTS bitstreamn");
  447. #if !defined(NO_DTS_OUTPUT)||defined(FORCE_NO_DTS_OUTPUT)//nono 4-5-5 13:31
  448. #ifndef DTS_CD_OUT_RAW_A
  449. if ( !setup_IsSet2SPDIF_Bitstream() )//nono 2-7-5 21:38
  450. #endif
  451. {
  452. AUDIF_Init_DTSCD();//2004AUDDRV init_dtscd();
  453. }
  454. #endif//#ifndef NO_DTS_OUTPUT
  455. // cd_subtype = CD_DTS;       //Jeff 20020415
  456. setup_SetDTSCDConfig();
  457. #ifndef DTS_CD_OUT_RAW_A
  458. if ( setup_IsSet2SPDIF_Bitstream() ) { //Jeff 20031230
  459.                     //ycwen 2004/08/31 : if not download PCM again, it would be wrong when "AC3->DTS"
  460.                     AUDIF_Set_CodingMode(AUDIF_CODING_MODE_PCM);//2004AUDDRV audif_set_coding_mode(AUDIF_CODING_MODE_PCM);
  461. AUDIF_Reset_DSP();//2004AUDDRV DSPReset();
  462. }
  463. #endif
  464. iRetry = 3;
  465. bDTS=1;
  466. }
  467. //printf("2.cd_subtype=%xn",cd_subtype);
  468. } while(iRetry < 3);
  469. printf("program:%x source_end:%x AVD_media_status:%x goto_active:%x sys_cmd:%xn",program_end,source_end,AVD_media_status,goto_active,sys_cmd);
  470. if(program_end)
  471. {
  472. //terry,2003/8/24 04:38PM
  473. program_end = 0;
  474. source_end = 0;
  475. goto_active = 0;
  476. sys_cmd = 0;
  477. AVD_ResetMediaStatus();
  478. }
  479. if (bDTS==0) AUDIF_Init_CDDA();//2004AUDDRV init_cdda();
  480. flush_atapi();
  481. goto_active=0;
  482. if (preCDsubtype != cd_subtype) AUDIF_Reset_DSP();//2004AUDDRV DSPReset(); //Jeff 20021206
  483. #ifndef CD_INIT_DNOT_MUTE//4-8-20 12:16
  484. audioNotContinuous=10; //Jeff 20021125
  485. AUDIF_Set_Volume(0);//2004AUDDRV AudioSetVolume(0); //Jeff 20021125
  486. #else   //ycwen : 2004/9/6 : To prevent bf/ff from de-mute
  487.     #ifdef MP3_CD_FF1_BF1_MUTE
  488.         if (adv_search_time != 0)
  489.     #else
  490.         if ((adv_search_time > 2)||(adv_search_time < -2))
  491.     #endif
  492.             AUDIF_Set_Volume(0);//2004AUDDRV AudioSetVolume(0);
  493. #endif
  494. }
  495. break;
  496. #ifdef SUPPORT_MP4
  497. case CDROM_MP4:
  498. do_system = do_system_init = do_avi_movi_parser;
  499. restart_mp4_video_engine();
  500. #if defined(SUPPORT_CARD_STORAGE)||defined(SUPPORT_USB)||defined(SPHE8202_CARD_STORAGE)
  501. if (media_type == MEDIA_CARD)
  502. setup_decode_service(SERVICE_CARDFILE);
  503. #endif
  504. break;
  505. #endif
  506. #ifdef SUPPORT_WMA
  507. case CDROM_WMA:
  508. do_system = do_system_init = doASFHeader;
  509. audio_only = 1;
  510. #if defined(SUPPORT_CARD_STORAGE)||defined(SUPPORT_USB)||defined(SPHE8202_CARD_STORAGE)
  511. if (media_type == MEDIA_CARD)
  512. setup_decode_service(SERVICE_CARDFILE);
  513. #endif
  514. AUDIF_Init_WMA();//2004AUDDRV InitWma();
  515. //ycwen 2004/10/26 To prevent wma FF/BF from de-mute when changing track
  516.     #ifdef MP3_CD_FF1_BF1_MUTE
  517.         if (adv_search_time != 0)
  518.     #else
  519.         if ((adv_search_time > 2)||(adv_search_time < -2))
  520.     #endif
  521.             AUDIF_Set_Volume(0);
  522. break;
  523. #endif
  524. #ifdef SUPPORT_WAV
  525.     case CDROM_WAV:
  526.         printf("SUPPORT_WAV in macro.cn");
  527.         do_system = do_system_init = do_audio_cdda;
  528.         audio_only = 1; 
  529. #if defined(SUPPORT_CARD_STORAGE)||defined(SUPPORT_USB)||defined(SPHE8202_CARD_STORAGE)
  530.             if (media_type == MEDIA_CARD)
  531. setup_decode_service(SERVICE_CARDFILE);
  532. #endif
  533. AUDIF_Init_CDDA();
  534.         #ifdef MP3_CD_FF1_BF1_MUTE
  535.             if (adv_search_time != 0)
  536.         #else
  537.             if ((adv_search_time > 2)||(adv_search_time < -2))
  538.         #endif
  539.                 AUDIF_Set_Volume(0);
  540.     break;
  541. #endif
  542. #ifdef SUPPORT_AAC
  543. case CDROM_AAC:
  544. do_system = do_system_init = do_aac;
  545. audio_only = 1;
  546. #if defined(SUPPORT_CARD_STORAGE)||defined(SUPPORT_USB)||defined(SPHE8202_CARD_STORAGE)
  547. if (media_type==MEDIA_CARD)
  548. setup_decode_service(SERVICE_CARDFILE);
  549. #endif
  550. AUDIF_Init_AAC();
  551. break;
  552. #endif
  553. case CDROM:
  554. do_system = do_system_init = do_mp3;
  555. audio_only = 1; //Jeff 20011116
  556. #ifdef REMAIN_TIME  // 2004/08/10 yltseng
  557. Mp3_kbitrate = Mp3_kbitrate_PreCalc = PreParseMP3BitRate( VBR_MP3_CENTER_N_LBA, 20, lba, len );
  558. #endif
  559. #if defined(SUPPORT_CARD_STORAGE)||defined(SUPPORT_USB)||defined(SPHE8202_CARD_STORAGE)
  560. if (media_type==MEDIA_CARD)
  561. setup_decode_service(SERVICE_CARDFILE);
  562. #endif
  563.     // 2004/08/11 yltseng
  564.         AUDIF_Init_MP3();//2004AUDDRV init_mp3();
  565.         break;
  566.     default:
  567. #ifdef SUPPORT_PRECALCULATE_VIDEOBITRATE_FOR_FILE_MODE
  568.     // 2004/08/11 yltseng, initialization for pre-calculate video bitrate
  569.         Mp3_kbitrate_PreCalc = 0;
  570. #endif
  571. #ifdef SUPPORT_FILE_SYSTEM_MODE
  572. #if defined(SUPPORT_CARD_STORAGE)||defined(SUPPORT_USB)||defined(SPHE8202_CARD_STORAGE)
  573. if ((cd_type_loaded == CDROM) || (cd_type == CDROM_MPG)) // Robert 021127
  574. {
  575. if (media_type == MEDIA_CARD)
  576. setup_decode_service(SERVICE_CARDFILE);
  577. }
  578. #endif
  579. #endif
  580. #ifdef SUPPORT_MIDI
  581. #ifdef SUPPORT_MIDI_MENU_SEL
  582. if ( gIsMidiSelMenu||Is_MIDI_STATE() )
  583. {
  584. } else
  585. #else
  586. if ( Is_MIDI_STATE() )
  587. {
  588. } else
  589. #endif
  590. #endif
  591.     #ifdef DVD_SERVO
  592. if ((cd_type_loaded == CDVCD10) && (is_svo_dvd()))
  593. #else
  594. if (cd_type_loaded == CDVCD10)
  595. #endif
  596. {
  597. AUDIF_Set_CodingMode(AUDIF_CODING_MODE_AC3);//2004AUDDRV audif_set_coding_mode(AUDIF_CODING_MODE_AC3); // robert 2004/02/19
  598. }
  599. else
  600. AUDIF_Init_MP3();//2004AUDDRV init_mp3();//for mix-mode
  601.         break;
  602. case CDDVD:
  603. break;
  604.     } //switch(cd_type)
  605.     if(IsPBCOn() && (rep_ab_mode == REPEAT_FIND_B))
  606.     {
  607.         s_msf=repStart;
  608.         lba=msf2l(s_msf);
  609.     }
  610.     {//terry, reduce code ,0528
  611.         int bat;
  612.         #if DISC_SYSTEM!=DISC_SYSTEM_ATAPI
  613.             ss_msf = s_msf;
  614.             printf("goto msf %06xn", s_msf);
  615.             //if(cd_type_loaded==CDDVD)
  616.             //bat=128;
  617.             //else
  618.             bat=32;
  619.         #else
  620.             if ((cd_type == CDDVD) || (cd_type == CDDA) || (cd_type == CD_DA))
  621.             {
  622. #ifdef DVD_AUDIO
  623.                 bat=32;    //terry,2004/2/26 08:08PM
  624. #else
  625.                 bat=16;    //terry,2004/2/26 08:08PM
  626. #endif
  627.             }
  628.             else
  629.                 bat=4;
  630.         #endif
  631. #if defined (SUPPORT_WMA) || defined (SUPPORT_MP4)
  632.         if (GetCurrentFileType() == CDROM_WMA)
  633.             bat = 1;
  634. else if (GetCurrentFileType() == CDROM_MP4)
  635. bat = 32;
  636. #endif
  637.         #ifndef IR_TOOL
  638.         printf("initplayback,lba:%x s_msf:%x e_msf:%x len:%dn",lba,s_msf,e_msf,len);
  639.         #endif
  640.         #if defined(SUPPORT_CARD_STORAGE)||defined(SUPPORT_USB)||defined(SPHE8202_CARD_STORAGE)
  641.          if (media_type==MEDIA_CARD)  //wthsin, 2004/7/7 02:34pm
  642.          {
  643.            if(adv_search_time!=0)  adv_search_time=0;
  644.          }
  645.         #endif
  646.         start_atapi_intr(lba,len, bat);
  647.         if(cd_type_loaded!=CDDVD)
  648.         {
  649.             get_cdkit_time(CD_TRK_CHANGED);
  650.             if(adv_search_time>=0) p_msf=0;//terry,2004/1/19 03:22PM,for bw ,cross track ,time error
  651.             else p_msf=e_msf;
  652.         }
  653.     }
  654. }
  655. /*
  656. ** Play()
  657. **
  658. **
  659. */
  660. void    MacroPlay()
  661. {
  662.   timeout_playback              = 0;
  663. }
  664. void    MacroFindFirstNav()
  665. {
  666.     flush_atapi();
  667.     start_atapi_intr(MacroParam.FindFirstNav.lba, MacroParam.FindFirstNav.len, 16);
  668.     setup_decode_service(SERVICE_CD);
  669.     restart_video_engine();
  670.     set_video_stream_id(0xe0);
  671.     set_audio_stream_id(0xc0);
  672.     SetIntrMask(INTR_MASK_NORMAL);
  673.     //SetIntrFlag(0);
  674.     restart_video_engine();
  675.     restart_sup();
  676.     timeout_playback    = 0;
  677.     regs0->rtc_31_16    = 0;
  678.     AVD_state           = STATE_FINDFIRSTNAV;
  679.     AVD_ResetMediaStatus();
  680. }
  681. //
  682. // FUNCTION
  683. // MacroPlayLBA
  684. //
  685. // DESCRIPTION
  686. // playback from a specific LBA location.
  687. //
  688. // PARAMETER
  689. // MacroParam.PlayLBA.lba : LBA start address
  690. //
  691. void
  692. MacroPlayLBA()
  693. {
  694.     UINT8 id=0;
  695.     macro_function(__FUNCTION__);
  696.     if( (bDiscType == CD_OKO)&&(psd_state==(PSD_SEL_LIST|PSD_PLAY_SEG)) )
  697.     {
  698.         id=2;
  699.         cd_trk_now=1;
  700.     }
  701.     InitializeCDPlayback(MacroParam.PlayLBA.lba,MacroParam.PlayLBA.len,id);
  702. #ifdef MACRO_DBG
  703.     printf("playlba, msf:%x len:%d lba:%d stream_video:%xn",
  704.           s_msf,(msf2l(e_msf)-msf2l(s_msf)+5),msf2l(s_msf),stream_video);
  705. #endif
  706. }
  707. // Cyue: for VOD
  708. #ifdef SUPPORT_STREAM_BUFFER
  709. //======================================================
  710. //void  MacroPlayStream()
  711. //      Initializing system to play stream
  712. //INPUT  ARGUMENTS: NONE
  713. //OUTPUT ARGUMENTS: NONE;
  714. //RETURN: NONE
  715. //
  716. // cyue: 2002-08-08 08:35AM Add to Standard code
  717. //======================================================
  718. void    MacroPlayStream()
  719. {
  720.   stream_init(); //init streambuffer
  721.   // initialize new playback
  722.   audio_only    = 0;
  723.   set_video_stream_id(0xe0);
  724.   set_audio_stream_id(0xc0);
  725.   // initialize service program
  726.   setup_decode_service(SERVICE_STREAMING);
  727.   cd_type       = 0;
  728.   // initialize video stream
  729.   set_video_stream_id(0xe0);
  730.   AVD_ResetMediaStatus();
  731.   avd_play_state();
  732.   restart_video_engine();
  733.   restart_audio_engine();
  734.   SetIntrMask(INTR_MASK_NORMAL);
  735.   restart_sup();
  736.   timeout_playback              = 0;
  737.   regs0->rtc_31_16              = 0;
  738.   timestamp_key                 = 0;    // alan 0425
  739.   set_stc(0);
  740.   set_stc_init();
  741.   P_frame           = 0;    // clear pause
  742.   // navigator-state
  743.   PE_ClearNav();
  744.   sys_cmd=0;
  745. }
  746. #endif //#ifdef SUPPORT_STREAM_BUFFER
  747. /*
  748. ** PlayTrack()
  749. */
  750. void    MacroPlayTrack()
  751. {
  752.   int item;
  753.   macro_function(__FUNCTION__);
  754.   item      = MacroParam.PlayTrack.track;
  755.   s_msf     = gettrkmsf(item)&0x00ffffff;
  756. //  goto_active = 0x0f;
  757.   /*if ((gettrkcna(item)&CNA_DATA)==0)
  758.     cd_type=CDDA;
  759.   else
  760.     cd_type=cd_type_loaded;*/
  761.   InitializeCDPlayback(msf2l(s_msf),0,0);
  762.   #ifdef MACRO_DBG
  763.   printf("playtrk, msf:%x emsf:%d leadout:%x lba:%d stream_video:%xn",s_msf,e_msf,gettrkmsf_leadout(),msf2l(s_msf),stream_video);
  764.   #endif
  765. }
  766. /*
  767. ** PlayEntry()
  768. */
  769. void    MacroPlayEntry()
  770. {
  771.   int item;
  772.   item  = MacroParam.PlayEntry.entry;
  773.   s_msf = get_entry(item);
  774.   //printf("item:%x msf:%06x lba:%06xn",item,s_msf,msf2l(s_msf));
  775.   s_msf             = MSF(bcd2bin(msf_mm(s_msf)), bcd2bin(msf_ss(s_msf)), bcd2bin(msf_ff(s_msf)));
  776.   //cd_type=cd_type_loaded;
  777.   InitializeCDPlayback(msf2l(s_msf),0,0);
  778.   #ifdef MACRO_DBG
  779.   printf("playentry, msf:%x len:%d lba:%d n",s_msf,msf2l(e_msf)-msf2l(s_msf),msf2l(s_msf));
  780.   #endif
  781. }
  782. /*
  783. ** PlaySegment()
  784. */
  785. void    MacroPlaySegment(void)
  786. {
  787.   int   item;
  788.   BYTE  seg_code;
  789.   item              = MacroParam.PlaySegment.segment;
  790.   seg_code          = get_segment(item);
  791.   #ifdef MACRO_DBG
  792.   printf("SEG CODE=%xn",seg_code);
  793.   #endif
  794.   #ifdef MACRO_DBG
  795.   printf("SEG CODE[4:2]=%xn",(seg_code>>2) & 0x07);
  796.   #endif
  797.   s_msf  = get_segment_msf(item)&0x00ffffff;
  798.   SegLen = get_segment_length(item);
  799.   e_msf  = addmsf_ss(s_msf,SegLen*2);
  800.   st_msf = s_msf;
  801.   //cd_type=cd_type_loaded;
  802.   InitializeCDPlayback(msf2l(s_msf), 0,(seg_code>>2) & 0x07);
  803. #if 0
  804.   /*
  805.   ** SEG_CODE [1:0]
  806.   **
  807.   ** 00 : no-audio
  808.   ** 01 : mono audio
  809.   ** 10 : stereo audio
  810.   ** 11 : 2-channel audio
  811.   */
  812.   if( (seg_code&0x03)==0 )
  813.       vcd_state       = 0;
  814.   else
  815.       vcd_state       = VCD_AUDIO;
  816.   /*
  817.   ** SEG_CODE [4:2]
  818.   **
  819.   ** 000 : no video
  820.   ** 001 : NSTC normal res. still
  821.   ** 010 : NTSC high res. still
  822.   ** 011 : NTSC normal res. motion
  823.   ** 100 : reserved
  824.   ** 101 : PAL normal res. still
  825.   ** 110 : PAL high res. still
  826.   ** 111 : PAL normal res. motion
  827.   */
  828.   id=(seg_code>>2) & 0x07;
  829.   switch (id)
  830.   {
  831.   case 1:   /* NTSC normal-res still        */
  832.   case 5:   /*  PAL normal-res still        */
  833.   case 2:       /* NTSC high-res still          */
  834.   case 6:       /*  PAL high-res still          */
  835.     vcd_state                 |= VCD_VIDEO;
  836.     stream_video              = 0xe0| (id&0x03) ;
  837.     break;
  838.   case 3:   /* NTSC normal-res motion       */
  839.   case 7:       /*  PAL normal-res motion       */
  840.     vcd_state                 |= VCD_VIDEO;
  841.     stream_video              = 0xe0;
  842.     break;
  843.   }
  844.   #ifdef MACRO_DBG
  845.    printf("playseg, msf:%x len:%d lba:%d stream_video:%xn",s_msf,(msf2l(e_msf)-msf2l(s_msf)+5),msf2l(s_msf),stream_video);
  846.   #endif
  847. #endif
  848. }
  849. /*
  850. ** PlayOneSlide
  851. **
  852. ** Playback exactly one slide and pause.
  853. */
  854. //void    MacroPlayOneSlide()
  855. //{
  856. //}
  857. /*
  858. ** PlayRomSlide()
  859. **
  860. ** Playback video-elementary bitstream embedded in ROM (address space).
  861. **
  862. */
  863. void    MacroPlayRomSlide()
  864. {
  865.     macro_puts("play_rom_sliden");
  866.     // reset navigator-state
  867.     PE_ClearNav();
  868.     //
  869.     // setup video source and server.
  870.     romimage_ptr                  = MacroParam.PlayRomSlide.rom_addr;
  871.     setup_decode_service(SERVICE_ROMV);
  872.     SetIntrMask(INTR_MASK_NORMAL_ROM);
  873.     restart_video_engine();
  874.     restart_sup();
  875.     timeout_playback    = 0;
  876.     regs0->rtc_31_16    = 0;
  877.     set_stc(0);
  878.     set_stc_init();
  879.     save_srn_start_t=0;
  880.     macro_puts("prs_statusn");
  881.     // avd-state
  882.     avd_playoneromslide_state();
  883.     AVD_ResetMediaStatus();
  884.     // parser-state
  885.     P_frame           = 0;
  886.     //
  887.     macro_puts("prs_aspectn");
  888.     set_video_aspect();
  889.     //
  890.     macro_puts("prs_stopcdn");
  891.     if (!CDOpened()) CDSetStop();
  892.     macro_puts("prs_exitn");
  893. }
  894. //void    MacroPlaySector()
  895. //{
  896. //}
  897. //void    MacroPlaySlides()
  898. //{
  899. //}
  900. //void    MacroPreview()
  901. //{
  902. //}
  903. //void    MacroPreviewSector()
  904. //{
  905. //}
  906. /*
  907. ** ReadCD
  908. **
  909. */
  910. //void    MacroReadCD()
  911. //{
  912. //}
  913. //void    MacroReadSeqheader()
  914. //{
  915. //}
  916. /*
  917. ** SelectStream()
  918. **
  919. ** Select next incoming stream
  920. **
  921. ** Typical values:
  922. **
  923. **  0xe0    Video motion picture
  924. **  0xe1    Video low-res still picture
  925. **  0xe2    Video hi-res still picture
  926. **  0xc0    Audio (main)
  927. **  0xc1    Audio (alternate)
  928. **
  929. **  0xff    Auto select next incoming stream.
  930. **
  931. */
  932. #if 0
  933. void    MacroSelectStream()
  934. {
  935.   set_video_stream_id(MacroParam.SelectStream.video);
  936.   set_audio_stream_id(MacroParam.SelectStream.audio);
  937. }
  938. #endif