nav_clips.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:200k
源码类别:

DVD

开发平台:

Others

  1. /****************************************************************************************
  2.  *  Copyright (c) 2002 ZORAN Corporation, All Rights Reserved
  3.  *  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
  4.  *
  5.  *  File: $Workfile: nav_clips.c $             
  6.  *
  7.  * Description: 
  8.  * ============
  9.  * 
  10.  * 
  11.  * Log:
  12.  * ====
  13.  * $Revision: 228 $
  14.  * Last Modified by $Author: Leslie $ at $Modtime: 04-04-03 14:14 $ 
  15.  ****************************************************************************************
  16.  * Updates:
  17.  ****************************************************************************************
  18.  * $Log: /I76/I76_Common/I76_Reference/Playcore/Nav_Clips/nav_clips.c $
  19.  * 
  20.  * 228   04-04-03 14:17 Leslie
  21.  * Fix MPEG Clip A2B Repeat problem
  22.  * 
  23.  * 227   04-04-01 19:19 Fwang
  24.  * Fix AVI AB repeat goes to start of clip.
  25.  * 
  26.  * 226   4/01/04 6:33p Terencet
  27.  * cancel rotation when press play, force to auto playback
  28.  * 
  29.  * 225   04-04-01 15:38 Aidenl
  30.  * For D90NB, Flush logo due to mp3,jpeg R1 address is different with
  31.  * others
  32.  * 
  33.  * 224   3/30/04 5:54p Terencet
  34.  * add SDJPEG_DISPLAY_BY_ADP switch
  35.  * 
  36.  * 223   04-03-30 16:11 Williaml
  37.  * set the play mode to normal from program, intro or shuffle after full
  38.  * stop
  39.  * 
  40.  * 222   3/27/04 6:09p Terencet
  41.  * when rotation active will stop auto presentation and cache
  42.  * 
  43.  * 221   04-03-26 11:52 Leonh
  44.  * 
  45.  * 220   3/25/04 8:03p Robinj
  46.  * Add "AVI_SUBTITLE_CHANGE_ONSCAN" for changing subtitle with short delay
  47.  * but there is a break
  48.  * 
  49.  * 219   3/25/04 7:58p Terencet
  50.  * don't cache for JPEG digest mode
  51.  * 
  52.  * 218   04-03-25 18:30 Chaol
  53.  * fix FF time problem
  54.  * 
  55.  * 217   04-03-25 17:08 Leslie
  56.  * Set Default JEPG display buffer to be R1
  57.  * 
  58.  * 216   04-03-24 18:37 Leonh
  59.  * Prohibit continuously do the skipf and skpb for AVI playback
  60.  * 
  61.  * 215   3/21/04 8:49p Lotan
  62.  * merge 4 with certification DB
  63.  * 
  64.  * 214   3/20/04 6:35p Terencet
  65.  * clear subdir count in clips constructor to fix wrong clips num
  66.  * 
  67.  * 213   04-03-16 11:50 Jerryc
  68.  * 
  69.  * 212   3/10/04 4:26p Lotan
  70.  * Merge with Divx Certification DB 3
  71.  * 
  72.  * 210   3/04/04 10:22p Lotan
  73.  * Second merge with Divx Certification DB,
  74.  * including 2x16 SDram
  75.  * 
  76.  * 209   04-03-04 15:38 Jerryc
  77.  * add more macro MANUAL_DIRECTORY_EXPLORER to reduce sdram requirment in
  78.  * case the macro is not defined. 
  79.  * 
  80.  * 208   3/01/04 6:29p Lotan
  81.  * merge with Divx certification DB
  82.  * 
  83.  * 207   04-02-25 16:21 Leslie
  84.  * Fix HD-JPEG problem
  85.  * 
  86.  * 206   2/20/04 6:13p Glenl
  87.  * Merged S1 code
  88.  * 
  89.  * 205   2/17/04 4:39p Rinata
  90.  * malloc for Jpeg temp buffers
  91.  * 
  92.  * 204   2/15/04 7:41p Lotan
  93.  * update DRM message handling 
  94.  * 
  95.  * 203   2/13/04 5:16p Terencet
  96.  * avoid massage pool full while skiping WMA unsupported rate
  97.  * 
  98.  * 202   2/12/04 5:09p Rond
  99.  * fixed YUV issue
  100.  * 
  101.  * 201   2/12/04 4:15p Rond
  102.  * fixed bottom subtitle issue
  103.  * 
  104.  * 200   2/11/04 12:42a Lotan
  105.  * new Divx DRM handling method.
  106.  * 
  107.  * 199   2/10/04 8:42p Rond
  108.  * subtitle issues
  109.  * 
  110.  * 198   2/08/04 10:22a Eyalr
  111.  * fix compile erro on subtitle
  112.  * 
  113.  * 197   2/08/04 10:07a Eyalr
  114.  * added changes for Subtitle
  115.  * 
  116.  * 196   2/04/04 10:09a Leslie
  117.  * Add JPEG Cache and Display Buffer Toggling
  118.  * 
  119.  * 195   2/02/04 19:24 Eyalr
  120.  * fixed subtitles bug
  121.  * 
  122.  * 194   20/01/04 12:20 Lotan
  123.  * add OnDrmInfoMsgArrived(void) declaration
  124.  * 
  125.  * 193   20/01/04 12:13 Lotan
  126.  * add Dec_Avi_Drm.h file inclusion
  127.  * 
  128.  * 192   20/01/04 12:06 Lotan
  129.  * add OnDrmInfoMsgArrived() function and switch-case
  130.  * 
  131.  * 191   1/20/04 12:29p Chaol
  132.  * patch for WMA stop resume, trick it as PAUSE
  133.  * 
  134.  * 190   1/14/04 11:07a Chaol
  135.  * check if JPEG new line ready to copy display
  136.  * 
  137.  * 189   1/13/04 12:11 Hamadk
  138.  * Merged with CES DB
  139.  * 
  140.  * 188   12/26/03 12:28 Eyalr
  141.  * Added first code for subtitle support
  142.  * 
  143.  * 187   12/24/03 17:42 Hamadk
  144.  * Added handling for demux finished event
  145.  * 
  146.  * 186   12/22/03 4:00p Chaol
  147.  * add JPEG copy to display buffer when new line  ready
  148.  * 
  149.  * 185   11/28/03 7:24p Leslie
  150.  * 
  151.  * 184   11/25/03 6:13p Leslie
  152.  * free scratch pad after searching clips
  153.  * signature: MikeX_1125_2003
  154.  * 
  155.  * 183   11/12/03 7:54a Leslie
  156.  * The sub directory max counter was error.
  157.  * MikeX_1112_2003
  158.  * 
  159.  * 182   9/29/03 8:18 Hamadk
  160.  * 
  161.  * 180   03-09-05 17:08 Angieh
  162.  * Correct a careless error
  163.  * 
  164.  * 179   9/04/03 11:52a Leonh
  165.  * add the really define for uDirTreeLevel
  166.  * 
  167.  * 178   03-08-22 13:55 Angieh
  168.  * Override the Transition-Effect.
  169.  * 
  170.  * 177   8/14/03 7:12p Leonh
  171.  * solve jpeg flash problem in another way
  172.  * 
  173.  * 176   03-08-06 18:33 Leonh
  174.  * correct the state to play state when press play key after slowf and
  175.  * slowr
  176.  * 
  177.  * 175   03-08-04 21:04 Leonh
  178.  * make mpeg ab repeat work ok
  179.  * 
  180.  * 174   03-08-01 21:16 Leonh
  181.  * correct the condition for timer enable
  182.  * 
  183.  * 173   03-08-01 11:47 Leonh
  184.  * JPEG zoom state, keep on the fly
  185.  * 
  186.  * 172   7/30/03 11:18a Mikex
  187.  * bug fix for screen blicker after pressed stop when play the jpeg disc
  188.  * in NTSC mode.
  189.  * 
  190.  * 171   03-07-28 17:02 Leslie
  191.  * Check in changes for Task Force
  192.  * 
  193.  * 170   03-07-24 12:00 Frankm
  194.  * Adjust_jpeg_logo() for single track.
  195.  * 
  196.  * 169   03-07-10 15:38 Frankm
  197.  * Adjust logo "flash" in two cases.
  198.  * 
  199.  * 168   03-07-10 14:50 Frankm
  200.  * Adjust the logo "flash" bug on jpeg disc.
  201.  * 
  202.  * 165   03-06-30 16:56 Leslie
  203.  * Merge Alco Step A code
  204.  * 
  205.  * 164   03-06-24 11:51 Ivany
  206.  * Setting  MODE  to be "Shuffle",  the MODE changes into "FOLDER NORMAL"
  207.  * automatically after selecting a track, then  the selected track can be
  208.  * played normally.
  209.  * 
  210.  * 163   03-06-23 18:33 Tonnyg
  211.  * if one pic is in zoom, next one won't be called
  212.  * 
  213.  * 162   03-06-23 12:03 Ivany
  214.  * display logo when media type changes
  215.  * 
  216.  * 161   03-06-16 17:04 Leonh
  217.  * reset all parameter
  218.  * 
  219.  * 160   03-06-13 15:47 Leonh
  220.  * to support to 5000 clips
  221.  * 
  222.  * 159   03-06-11 17:02 Frankm
  223.  * Add support for 5000 clips.
  224.  * 
  225.  * 158   03-06-10 12:12 Leonh
  226.  * 
  227.  * 157   03-06-06 15:33 Frankm
  228.  * Stop shouldn't cancel the intro mode.
  229.  * 
  230.  * 156   03-06-06 11:33 Leonh
  231.  * prohibit skipf or skipb when sing track
  232.  * 
  233.  * 155   03-06-04 17:18 Leonh
  234.  * allow change play mode on fly on old menu
  235.  * 
  236.  * 154   03-06-03 18:23 Leonh
  237.  * correct behavior when disc repeat
  238.  * 
  239.  * 152   03-05-30 11:53 Jerryc
  240.  * fix dead lock in Clips_getClipFileInfoAt().
  241.  * 
  242.  * 151   03-05-29 18:02 Jerryc
  243.  * support flash card.
  244.  * 
  245.  * 150   03-05-28 13:57 Billt
  246.  * Close Menu after the last clip playbacked
  247.  * 
  248.  * 149   03-05-28 11:33 Leonh
  249.  * 
  250.  * 148   03-05-27 14:19 Leonh
  251.  * 
  252.  * 147   03-05-26 18:40 Leonh
  253.  * 
  254.  * 146   03-05-23 18:40 Leonh
  255.  * 
  256.  * 145   03-05-23 11:29 Janeg
  257.  * Select action end program mode.
  258.  * 
  259.  * 144   03-05-21 16:26 Jerryc
  260.  * don't reset play mode on numeric selection.
  261.  * 
  262.  * 143   03-05-19 13:43 Leslie
  263.  * Add drive Play Mode
  264.  * 
  265.  * 142   03-05-16 19:04 Jerryc
  266.  * fix in folder repeat mode, skip next problem.
  267.  * 
  268.  * 141   5/16/03 4:58p Tonnyg
  269.  * to disable setup after a subdir of CD-ROM or PCD is entered by Vestel 
  270.  * 
  271.  * 140   03-05-16 15:40 Jerryc
  272.  * fix disc repeat hanging pbe.
  273.  * 
  274.  * 139   03-05-16 11:59 Jerryc
  275.  * in single/repeat track mode, skip prev/next always go to the same
  276.  * track.
  277.  * 
  278.  * 138   03-05-16 11:13 Jerryc
  279.  * fix single track mode problem.
  280.  * 
  281.  * 137   03-04-30 10:35 Jerryc
  282.  * clear program mode when changing folder.
  283.  * 
  284.  * 136   03-04-28 14:33 Jerryc
  285.  * clean up.
  286.  * 
  287.  * 135   03-04-28 11:58 Jerryc
  288.  * for no menu mode, UI sees no directory items.
  289.  * 
  290.  * 134   03-04-25 17:27 Jerryc
  291.  * folders are always list on the top.
  292.  * 
  293.  * 133   03-04-24 16:40 Tonnyg
  294.  * 
  295.  * 132   03-04-24 11:59 Jerryc
  296.  * further fix random mode.
  297.  * 
  298.  * 131   03-04-24 10:45 Jerryc
  299.  * fix random mode.
  300.  * 
  301.  * 130   03-04-23 11:55 Jerryc
  302.  * fix pbe: mp3 play ->ffwd ->pause->play, behaviour is not as expected.
  303.  * 
  304.  * 129   03-04-22 15:26 Jerryc
  305.  * don't reset play mode to normal when finishing play back the playlist.
  306.  * 
  307.  * 128   03-04-22 14:25 Jerryc
  308.  * clean up.
  309.  * 
  310.  * 127   03-04-22 9:51 Jerryc
  311.  * define a macro for intro play time.
  312.  * 
  313.  * 126   03-04-21 17:13 Jerryc
  314.  * update cop_next_chapter on every tick.
  315.  * 
  316.  * 125   03-04-21 11:22 Jerryc
  317.  * fix random mode.
  318.  * 
  319.  * 124   03-04-18 13:46 Jerryc
  320.  * fix long dir name problem.
  321.  * 
  322.  * 123   03-04-11 14:07 Janeg
  323.  * JerryC: Pause/Play JPEG after displaying whole picture.
  324.  * 
  325.  * 122   03-04-10 15:57 Janeg
  326.  * Jerry Cai:
  327.  * Maintain play mode after swithcing folder.
  328.  * Disable scan after manual and natural stop.
  329.  * Send IE_UI_CLIPS_UPDATE in no menu mode.
  330.  * 
  331.  * 121   03-04-09 21:37 Janeg
  332.  * 
  333.  * 120   4/09/03 11:11a Lyncolnc
  334.  * Added event to clear UI messages like Q1..Q5 when the current clip
  335.  * (JPG) finished its playback.
  336.  * 
  337.  * 119   03-04-07 14:47 Billt
  338.  * don't cancel repeat when play from stopresume
  339.  * 
  340.  * 118   03-04-02 16:57 Jerryc
  341.  * add function IsGotoNextChapterAllowed().
  342.  * 
  343.  * 117   03-04-02 11:28 Janeg
  344.  * Add error report to UI.
  345.  * 
  346.  * 116   03-04-01 16:34 Jerryc
  347.  * change some tr_printf to dbg_printf.
  348.  * 
  349.  * 115   03-04-01 15:13 Jerryc
  350.  * fix mp3 time search.
  351.  * 
  352.  * 114   03-03-28 15:07 Jerryc
  353.  * set play  mode to normal when change folder.
  354.  * 
  355.  * 113   03-03-27 15:08 Jerryc
  356.  * notify UI on current clip number change.
  357.  * 
  358.  * 112   03-03-24 17:00 Jerryc
  359.  * allow change play mode from track repeat to folder nornal on the fly.
  360.  * 
  361.  * 111   03-03-20 17:31 Billt
  362.  * Fixed a compiler switch bug
  363.  * 
  364.  * 110   03-03-20 11:48 Jerryc
  365.  * change dir num from 100 to 300.
  366.  * 
  367.  * 109   03-03-18 10:52 Jerryc
  368.  * fix digest stop pbe
  369.  * 
  370.  * 108   03-03-17 11:03 Jerryc
  371.  * change repeat a->b min gap to be 1s.
  372.  * 
  373.  * 107   03-03-14 18:15 Jerryc
  374.  * Clips_getClipFileInfoAt is now implemented in a synchonous way to aoid
  375.  * conflict between UI and core task.
  376.  * 
  377.  * 106   03-03-14 14:50 Jerryc
  378.  * display logo in constructor
  379.  * 
  380.  * 105   03-03-13 14:02 Jerryc
  381.  * clean up code
  382.  * 
  383.  * 104   03-03-11 17:34 Jerryc
  384.  * correct disc scan mode
  385.  * 
  386.  * 103   03-03-11 15:48 Jerryc
  387.  * notify UI when browser content is ready.
  388.  * 
  389.  * 102   03-03-11 14:28 Jerryc
  390.  * when MP3 FB finishes, play the current song in normal mode.
  391.  * 
  392.  * 101   03-03-10 16:16 Jerryc
  393.  * clean up.
  394.  * 
  395.  * 100   03-03-10 15:28 Jerryc
  396.  * clean up
  397.  * 
  398.  * 99    03-03-10 13:53 Jerryc
  399.  * clean up the browser object implementation.
  400.  * 
  401.  * 98    03-03-07 19:10 Jerryc
  402.  * jerryc, add support for random play mode
  403.  * 
  404.  * 97    03-03-06 19:12 Jerryc
  405.  * jerryc, fix function getPrevItemInPrevFolder().
  406.  * 
  407.  * 96    03-03-06 16:13 Jerryc
  408.  * jerryc, fix some play modes.
  409.  * 
  410.  * 95    03-03-05 17:40 Jerryc
  411.  * jerryc, fix some play modes.
  412.  * 
  413.  * 94    03-03-05 10:41 Jerryc
  414.  * jerryc, fix some playback mode pbe. 
  415.  * 
  416.  * 93    03-03-04 16:22 Jerryc
  417.  * jerryc, clear program list before exit clip nav.
  418.  * 
  419.  * 92    03-03-04 15:32 Jerryc
  420.  * jerryc, fix compile errors.
  421.  * 
  422.  * 91    03-03-04 15:16 Hannahh
  423.  * 
  424.  * 90    03-03-04 15:01 Jerryc
  425.  * jerryc, clean up  
  426.  * 
  427.  * 88    03-03-04 11:50 Jerryc
  428.  * jerryc, add function Clips_SetBrowserStyle.
  429.  * 
  430.  * 87    03-03-04 11:34 Jerryc
  431.  * jerry cai, merge new nav clips lib 
  432.  * 
  433.  * 83    03-02-21 13:53 Leslie
  434.  * 
  435.  * 82    03-02-20 18:04 Victorwu
  436.  * Add disc and folder intro for Vestel
  437.  * 
  438.  * 81    03-02-19 17:36 Victorwu
  439.  * Fix bugs and add new features for Vestel
  440.  * 
  441.  * 80    03-02-14 11:46 Victorwu
  442.  * Fix bugs for VESTEL new filesearch.
  443.  * 
  444.  * 78    03-02-11 17:33 Leslie
  445.  * Change g_pClipsNav from Initialzied Data to Uninitialized data type
  446.  * 
  447.  * 77    03-02-10 17:46 Leslie
  448.  * 
  449.  * 76    03-02-10 17:33 Leslie
  450.  * Add AUTO_REWIND_PLAYBACK_FOR_JPEG_DISCS
  451.  * 
  452.  * 75    03-02-09 22:25 Leslie
  453.  * Fix Clip not auto playback problem
  454.  * 
  455.  * 74    03-02-08 0:36 Leslie
  456.  * Add MANUAL_DIRECTORY_EXPLORER
  457.  * 
  458.  * 73    03-02-06 18:31 Leslie
  459.  * Support MPEG CLips Slow, STEP and Time Search
  460.  * 
  461.  * 72    03-02-06 14:21 Leslie
  462.  * Scan supporrted for MPEG Clips
  463.  * 
  464.  * 71    03-02-03 18:05 Leslie
  465.  * Use Clip_recordMarker for recording Book marker instead of direct
  466.  * call/control
  467.  * 
  468.  * 70    2/02/03 7:54p Adamw
  469.  * //fix file search problem.
  470.  * //double the array element cause of unicode implemented
  471.  * //or else when search long name file many file will lost
  472.  * 
  473.  * 69    03-01-30 0:11 Leslie
  474.  * Fix MP3 Time Search problem
  475.  * Support MP3 A2B inside track
  476.  * Remove compiler warnning
  477.  *
  478.  * 68    03-01-28 18:43 Leslie
  479.  * Support MP3 Time Search
  480.  * 
  481.  * 67    03-01-27 23:58 Leslie
  482.  * Remove compile warnning
  483.  * 
  484.  * 66    03-01-24 20:31 Leslie
  485.  * Support Clip Intro Play for MP3 clips
  486.  * 
  487.  * 65    03-01-14 1:41 Leslie
  488.  * MP3 Scan supported
  489.  * 
  490.  * 64    03-01-10 12:21 Leslie
  491.  * Add wide-character strings support
  492.  * 
  493.  * 63    03-01-09 12:30 Leslie
  494.  * 
  495.  * 62    10/30/02 17:49 Rond
  496.  * 
  497.  * 4     11/09/02 15:49 Atai
  498.  * Vaddis 5e production update
  499.  * 
  500.  * 66    25/08/02 12:08 Nirm
  501.  * - Fixed invokePlayback() to renew Pause only after all of the
  502.  * Current-Clip's information has been updated, since OnStop() uses this
  503.  * information.
  504.  * 
  505.  * 65    22/08/02 11:08 Nirm
  506.  * - Fixed a typo in _onPresentationFinished(): the next Play-List item
  507.  * must be computed based on the current Item, instead of the current
  508.  * Clip.
  509.  * 
  510.  * 64    20/08/02 20:10 Nirm
  511.  * - Upon setting the Playback-Filter during Stop, the playback is reset
  512.  * to the first suitable Item on the Play-List.
  513.  * 
  514.  * 63    20/08/02 18:04 Nirm
  515.  * - Playback Filter is reset upon Program invocation.
  516.  * 
  517.  * 62    20/08/02 13:33 Nirm
  518.  * - Fixes to the Playback-Filter mechanism: take into account the
  519.  * Digestable attribute.
  520.  * 
  521.  * 61    19/08/02 22:27 Nirm
  522.  * - Added Playback-Filter.
  523.  * 
  524.  * 60    19/08/02 15:07 Nirm
  525.  * - Code optimization.
  526.  * 
  527.  * 59    19/08/02 14:46 Nirm
  528.  * - Added Repeat-Folder support.
  529.  * 
  530.  * 58    19/08/02 11:34 Nirm
  531.  * - Added Directory Nesting-Level control.
  532.  * 
  533.  * 57    18/08/02 14:02 Nirm
  534.  * - Digest interface changes.
  535.  * 
  536.  * 56    13/08/02 19:20 Nirm
  537.  * - Upon encountering an Error, continue playback unless in Pause mode.
  538.  * 
  539.  * 55    13/08/02 13:48 Nirm
  540.  * - Clip_isFinished() replaced by Clip_getStatus();
  541.  * - Error-Recovery re-introduced.
  542.  * 
  543.  * 54    9/08/02 13:19 Nirm
  544.  * - If selected, the Background is presented upon Play-List construction,
  545.  * instead of in the constructor. This is needed in order to allow the
  546.  * user to select the proper Background setting.
  547.  * 
  548.  * 53    9/08/02 11:51 Nirm
  549.  * - The Background is captured upon construction, to prevent undefined
  550.  * background-color appearance.
  551.  * 
  552.  * 52    9/08/02 10:46 Nirm
  553.  * - Fixed Assertion problem when executing Stop on an empty play-list;
  554.  * - Corrected cache-ahead to work as expected in Shuffle mode.
  555.  * 
  556.  * 51    8/08/02 20:27 Nirm
  557.  * - Enabled Numeric-Selection from Shuffle mode.
  558.  * 
  559.  * 50    7/08/02 23:13 Nirm
  560.  * - Extended Digest support to more than 256 items.
  561.  *
  562.  * 49    4/08/02 21:07 Nirm
  563.  * - For still-images, the Background is cleared before playback.
  564.  * 
  565.  * 48    4/08/02 17:27 Nirm
  566.  * - Fixed OnPlaybackFinished() to use the Presentation-Time of the
  567.  * current-clip, instead of the cached-clip.
  568.  * 
  569.  * 47    4/08/02 14:11 Nirm
  570.  * - Various fixes related to the Transition-Effect and Caching mechanism.
  571.  * 
  572.  * 46    2/08/02 19:52 Nirm
  573.  * - Added Cache-Ahead mechansim.
  574.  * 
  575.  * 45    1/08/02 23:40 Nirm
  576.  * - Enhanced Digest to support initial-item selection; the initial item
  577.  * is always presented as the first item on a Page.
  578.  * 
  579.  * 44    31/07/02 12:53 Nirm
  580.  * - Enhanced the Transition-Override mechanism.
  581.  * 
  582.  * 43    30/07/02 20:35 Nirm
  583.  * - Integrated Multi-Standard support for Clips.
  584.  * 
  585.  * 42    22/07/02 10:46 Nirm
  586.  * - Reduced heap-memory consumption.
  587.  * 
  588.  * 41    21/07/02 20:03 Nirm
  589.  * - Switched to using an Extended-Addressing Array for 16mbit versions.
  590.  * 
  591.  * 40    7/07/02 14:55 Nirm
  592.  * - MAX_DIRNAME_LEN for file-searches was increased to 32; this is needed
  593.  * to distinguish between directories with long names.
  594.  * 
  595.  * 39    4/06/02 21:16 Nirm
  596.  * - Code cleanup.
  597.  * 
  598.  * 38    3/06/02 19:59 Nirm
  599.  * - Moved SC_CLIPS_LIST_ADDRESS to ScPadAlloc.h
  600.  * 
  601.  * 37    2/06/02 20:56 Nirm
  602.  * - Added support of Full-Stop and Stop-Resume for MP3.
  603.  *
  604.  * 36    26/05/02 17:23 Ettim
  605.  * Using the extended address mode and setting the file list size to 500
  606.  * files.
  607.  * 
  608.  * 35    23/05/02 14:08 Ettim
  609.  * Some code preparations in order to work with an absolute 32 bit address
  610.  * on the scratch pad.
  611.  * 
  612.  * 34    16/05/02 12:37 Ettim
  613.  * Enabled zoom in JPEG.
  614.  * Keeping pause state while angle setting.
  615.  * 
  616.  * 33    15/05/02 9:31 Ettim
  617.  * Added UI support for L/R (Transition) and Angle buttons (no OSD yet).
  618.  * 
  619.  * 32    10/05/02 16:55 Nirm
  620.  * - Flie search is terminated once the Clips-List capacity has been
  621.  * reached.
  622.  * 
  623.  * 31    10/05/02 14:53 Nirm
  624.  * - Cleanup of compilation-warnings.
  625.  * 
  626.  * 30    29/04/02 12:25 Nirm
  627.  * - Fixes for JPEG Digest.
  628.  * 
  629.  * 29    23/04/02 9:32 Nirm
  630.  * - Added dependency in "Config.h".
  631.  * 
  632.  * 28    11/04/02 13:47 Ettim
  633.  * Digest for JPEG updates
  634.  * 
  635.  * 27    11/04/02 9:47 Ettim
  636.  * Getting the parameters for the digest (digest mode & intro frames
  637.  * count) from the UI.
  638.  * 
  639.  * 26    10/04/02 12:29 Ettim
  640.  * Added jpeg support.
  641.  *
  642.  * 25    3/27/02 13:18 Ettim
  643.  * Replaced D_PICTURE_CD_ENABLED with CLIPS_JPEG_SUPPORT
  644.  * 
  645.  * 24    27/03/02 9:19 Nirm
  646.  * - Changed CLIPS_TICKS_PER_SECOND -> KER_TICKS_PER_SECOND;
  647.  * - Moved some privately-used definitions from Nav_Clips.h
  648.  * 
  649.  * 23    3/26/02 19:14 Ettim
  650.  * Added new clips navigation support.
  651.  * 
  652.  * 22    14/03/02 12:11 Nirm
  653.  * - Optimized the implementation of _findAndAddClips().
  654.  * 
  655.  * 21    3/12/02 3:20a Dingming
  656.  * 12 digest for PCD supported
  657.  * 
  658.  * 20    3/12/02 2:57a Dingming
  659.  * PCD slide show supported
  660.  * 
  661.  * 19    11/03/02 20:12 Nirm
  662.  * - Removed unnecessary "extern";
  663.  * - Documentation typo fixed.
  664.  * 
  665.  * 18    3/09/02 3:51a Dingming
  666.  * remove display logo for PCD digest stop
  667.  * 
  668.  * 17    3/08/02 3:57a Dingming
  669.  * PCD digest supporting
  670.  * 
  671.  * 16    7/03/02 16:52 Nirm
  672.  * Integrated Exceptioning mechanism.
  673.  * 
  674.  * 15    3/07/02 4:07a Dingming
  675.  * clean up jpg digest variable
  676.  * 
  677.  * 14    3/06/02 4:07a Dingming
  678.  * implement for PCD playback
  679.  * 
  680.  * 13    3/05/02 5:51a Dingming
  681.  * picture cd implement
  682.  * 
  683.  * 12    3/05/02 1:26a Dingming
  684.  * move JPG restore Angle to the common area
  685.  * 
  686.  * 11    4/03/02 19:22 Nirm
  687.  * Integrated support for Full-Stop.
  688.  * 
  689.  * 10    2/28/02 2:52a Dingming
  690.  * code porting for picture cd
  691.  * 
  692.  * 9     21/02/02 16:54 Nirm
  693.  * - Added support for Long/Short filenames;
  694.  * - Added support for Wrap-Around on Program-Edges;
  695.  * - Code cleanup.
  696.  * 
  697.  * 8     20/02/02 17:38 Nirm
  698.  * - Added Long-Filename support;
  699.  * - Turned Clips_findClips() to fully asynchronous.
  700.  * 
  701.  * 7     19/02/02 9:40 Nirm
  702.  * Code Cleanup.
  703.  * 
  704.  * 6     18/02/02 20:33 Nirm
  705.  * Integrated MP3-ID3 extraction.
  706.  * 
  707.  * 5     18/02/02 11:26 Nirm
  708.  * Added MP3-ID3v1 support.
  709.  * 
  710.  * 4     15/02/02 0:54 Nirm
  711.  * - Collection of the Clips is temporarily done outside the constructor.
  712.  * 
  713.  * 3     14/02/02 23:44 Nirm
  714.  * - Fixed wrong copy of the FindFile info.
  715.  *
  716.  * 2     14/02/02 18:13 Nirm
  717.  * Integration of the Clips Navigator.
  718.  * 
  719.  * 1     7/02/02 7:49 Nirm
  720.  ****************************************************************************************/
  721. #include "Config.h" // Global Configuration - do not remove!
  722. #ifdef _DEBUG
  723. #undef IFTRACE
  724. #define IFTRACE if (gTraceNavigator)
  725. #include "DebugDbgMain.h"
  726. #endif
  727. #include <embedded.h>
  728. #include "IncludeSysDefs.h"
  729. #include "Includestring_ex.h"
  730. #include "Includemath-macro.h"
  731. #include "KernelKer_API.h"
  732. #include "KernelEventDef.h"
  733. #include "PlaycoreCoremainCoreGDef.h"
  734. #include "PlaycoreDataStructuresArray.h"
  735. #include "PlaycoreExceptionException.h"
  736. #include "PlaycoreFileSysFileSystem.h"
  737. #include "PlaycoreNav_ClipsNav_Clips.h"
  738. #include "PlaycoreNav_ClipsPE_Clips.h"
  739. #include "PlaycoreNav_ClipsMP3.h"
  740. #include "PlaycorePlayModePlayMode.h"
  741. #include "PlaycoreScPadScPadAlloc.h"
  742. #include "PlaycoreTimingTiming.h"
  743. #include "Playcorenav_cddape_cd.h"
  744. #include "PlaycoreNav_ClipsClip_Impl.h"
  745. #include "PlaycoreNav_ClipsClip.h"
  746. #include "servicesinclude_heap.h"
  747. #include "PlaycoreNav_CDDAcdnav_err.h"
  748. #include "LogoLogo.h"
  749. #include "DecoderDec_Avi_Drm.h"
  750. #include "Decoderdecoder.h"
  751. #include "PlaycoreNav_ClipsAuxSubtitles.h"
  752. #ifdef CLIPS_JPEG_SUPPORT
  753. #include "PlaycoreNav_ClipsJPEG.h"
  754. #ifdef CLIPS_JPEG_DIGEST_SUPPORT
  755. #include "PlaycoreDigestdigest.h"
  756. #endif //CLIPS_JPEG_DIGEST_SUPPORT
  757. #endif //CLIPS_JPEG_SUPPORT
  758. #ifdef SUPPORT_FLASH_CARD
  759. #include "drivefe_manager.h"
  760. #include "mediacardsincluderegister.h"
  761. UINT32 Clips_GetCurrClipSize(void);
  762. UINT32 Clips_GetCurrClipSartAddr(void);
  763. extern BOOL drv_suspend_playback(BOOL bSuspend);
  764. #endif
  765. extern void sc_GetBytes(WORD i_hSourceAddress, WORD i_cbOffset, WORD i_cbSize, BYTE *o_pDestBuff);
  766. /////////////////////////////////////////////////////////////////////////////
  767. // Constants and Enumerations
  768. #define MPEG_SEARCH_ADDRESS_OFFSET  300L // 4 seconds
  769. #define CLIPS_LOCATION_TOLERANCE 30
  770. #define CLIPS_ERROR_RECOVERY_RETRY_COUNT 3
  771. #define CLIPS_A2B_MIN_GAP 1 // in seconds
  772. #define CLIPS_MAX_BOOKMARKER_NUM 3
  773. #define CLIPS_MPEG_NUM_OF_SECTORES_PER_SECOND 75L
  774. #define CLIPS_INTRO_PLAY_TIME 10 // in seconds
  775. #define RGB_2_Y(r,g,b) ( (( ( 66 * r) + (129 * g) + (25 * b) + 128) >> 8) +  16 )
  776. #define RGB_2_U(r,g,b) ( (( (-38 * r) - (74 * g)  + (112 * b) + 128) >> 8) + 128 )
  777. #define RGB_2_V(r,g,b) ( (( (112 * r) - (94 * g)  - (18 * b) + 128) >> 8) + 128 )
  778. typedef enum { ePause, eStopResume, eFullStop } enStopType;
  779. typedef enum { eFindClipRendezvous, eTimerRendezvous, ePositionA, ePositionB } enRendezvousType;
  780. typedef enum { eMarkerA, eMarkerB, eResumePlayback, eBookmark } enClip_MarkerType;
  781. typedef enum { 
  782. eBuildAll,
  783. eBuildFileListOnly,
  784. eBuildPeerDirListBasedOnSubDirList,
  785. } enBuildBrowser;
  786. typedef enum { 
  787. eUIToGetClipInfo,
  788. eClipInfoReadyForUI,
  789. eClipInfoNotAvailable,
  790. } enGetClipInfoStatus;
  791. /////////////////////////////////////////////////////////////////////////////
  792. // Macros
  793. #define SHARED_INFO (gns.clips)
  794. #define PEER_DIR_ARRAY_SIZE Array_getSize(SHARED_INFO.hDirsArray[CLIPS_PEER_ARRAY])
  795. #ifdef MANUAL_DIRECTORY_EXPLORER
  796. #define SUB_DIR_ARRAY_SIZE Array_getSize(SHARED_INFO.hDirsArray[CLIPS_SUB_ARRAY])
  797. #else
  798. #define SUB_DIR_ARRAY_SIZE 0
  799. #endif
  800. // <<< Robin_0903_2004
  801. #ifdef DIVX_SUPPORT_MULTI_SUBTITLE_MODE0
  802. static BOOL bNeedWaitForUI = FALSE;
  803. #endif
  804. // >>> Robin_0903_2004
  805. UINT16 g_uAvailableClipTypes;
  806. BOOL change_pallet;
  807. static UINT16 g_uPlaybackFilter;
  808. DWORD CurrLocationBackup = -1;
  809. // <<< SEC BK.LIM101303: Search first file if  Root dose not have  any file list to play.
  810. #ifdef EXINO2
  811. #ifdef MP3_SUBFOLDER_AUTOPLAY
  812. BOOL g_bClipsAutoplay;
  813. #endif
  814. #endif
  815. // SEC BK.LIM101303>>>
  816. // <<< Stivenz_0223_2005: If current chapter is unsupported then goto next.
  817. #ifdef D_MP4_SKIP_UNSUPPORTED_CHAPTER
  818. extern BOOL bMP4DRMDisable;
  819. #endif
  820. extern BOOL isFailedToReadMP3Head;//LeonHe_2005_0519: Failed to read the MP3 Head.
  821. typedef struct ClipsNavInfo_TAG
  822. {
  823. UINT8  m_eClipsListStatus;
  824. UINT8  m_uCurrPlaybackMode; // Stores the Current Playback-Mode
  825. // Presentation time
  826. UINT8  m_hPresentationTimer; // Holds the timer for the presentation time
  827. // Play-State related
  828. UINT8  m_bPresentationMode; // Indicates whether Presentation-Mode is active
  829. // Cached-Playback related
  830. UINT16 m_hCachedClip; // Holds a handle to a Cached Clip
  831. // Stop-Resume related
  832. ClipMarker m_cmResumeMarker;
  833. ClipMarker m_PositionA;
  834. ClipMarker m_PositionB;
  835. #ifdef CLIPS_JPEG_DIGEST_SUPPORT
  836. // Digest related
  837. UINT8  m_bDigestMode; // Indicates whether digest mode is active
  838. UINT16 m_uDigestableTypes; // Holds a mask of all Digestable Types
  839. UINT16 m_uDigestableItemsCnt; // Holds the number of Digestable Items
  840. UINT32 m_hDigestUnits; // Holds the Items indexes to be displayed on digest mode
  841. #endif //CLIPS_JPEG_DIGEST_SUPPORT
  842. // Error-Handling and Recovery
  843. struct Clips_ErrorRecoveryInfo_TAG {
  844. UINT8 uRetryCount; // Holds the play retry counter
  845. } m_ErrorRecoveryInfo;
  846. // Operation-Mask related
  847. ULONG m_ulCOP_Mask;
  848. } Clips_Nav_Info;
  849. static Clips_Nav_Info *g_pClipsNav = NULL;
  850. extern unsigned char time_display; 
  851. #ifdef D_USE_VARIABLE_FOR_LIB
  852. extern WORD clips_skip_back_threshold;
  853. #endif
  854. #if defined(_DEBUG) || defined(D_RELEASE_TRACE_ENABLED) // ZKR GL051004
  855. #define DBG_W2A(szWString) _wcs2str(szWString, g_szDebugString, sizeof(g_szDebugString))
  856. static char g_szDebugString[64];
  857. #endif //_DEBUG
  858. BYTE ui_enter_pressed = 0;
  859. /////////////////////////////////////////////////////////////////////////////
  860. // Forward-Declarations of Private-Services
  861. static BOOL _findAndAddClips(UINT16 uMaxClipsToFind, BOOL bRootLevel);
  862. static void constructor(void);
  863. static void destructor(void);
  864. static BOOL invokePlayback(BOOL bOverrideTransition);
  865. static void PerformErrorRecovery(UINT16 hClipInstance, enClipStatus eStatus);
  866. static UINT16 computePlaylistItem(UINT16 uCurrItem, BOOL bNext);
  867. static void cancelRepeatModes(BYTE uModesMask);
  868. // Event Handlers
  869. static void OnFindClips(UINT16 uTypesToFind);
  870. static void OnTick(void);
  871. static void OnPlay(void);
  872. static void OnPlaybackFinished(void);
  873. static void OnStop(enStopType eType);
  874. static void OnRendezvous(void *Param);
  875. static void _onPresentationFinished(void);
  876. #ifdef CLIPS_JPEG_SUPPORT
  877. static void OnAngleSelection(enClipImageOrientation i_eOrientation);
  878. static void OnTransitionSelection(enClipTransitionEffect i_eTransition);
  879. #ifdef CLIPS_JPEG_DIGEST_SUPPORT
  880. static BOOL _handleDigestUnit(UINT16 uUnitIndex, enDigestQuery eQuery);
  881. static void OnDigest(UINT16 Param);
  882. static void _terminateDigestMode(void);
  883. #endif //CLIPS_JPEG_DIGEST_SUPPORT
  884. #endif //CLIPS_JPEG_SUPPORT
  885. static void OnModeChange(void);
  886. static void OnNextItem(void);
  887. static void OnPreviousItem(void);
  888. static void OnNumericSelection(UINT16 uSelection);
  889. // Presentation timer callback function
  890. static void OnPresentationTimeExpired(UINT8 hTimer);
  891. static void OnStatusReport(void);
  892. static void OnScan(int iScanSpeed);
  893. static void OnIntro(void);
  894. static void OnGotoTime(WORD wTime);
  895. static void OnSetMarkerA(void);
  896. static void OnSetMarkerB(void);
  897. static void OnCancelABRepeat(void);
  898. static void OnA2BRepeat(int Param);
  899. static void OnIFrameDisplayed(void);
  900. static void OnDemuxFinished(void);
  901. static void OnDrmInfoMsgArrived(void);
  902. static void OnSubtitleArrived(void);
  903. static void OnSubtitleChanged(void);
  904. #ifdef AVI_AUDIO_CHANGE_ONSCAN //ZKR JK0413 : add for audio change on-the-fly 
  905. static void OnAudioChanged(void);
  906. #endif
  907. #ifdef IS_MP4_CAPABLE
  908. static void OnChapterChanged(void);
  909. extern void MP4Clip_subtitleArrived(void);
  910. #endif
  911. static void OnStep(void);
  912. static void OnSlow(int iSpeed);
  913. static UINT16 getLastItemInPrevFolders(void);
  914. static UINT16 getFirstItemInSubFoldersOrNextFolders(void);
  915. static void notifyUIOnBrowserContentChange(BYTE ucUpdatePeerDirListWindow, BYTE ucUpdateFileListWindow);
  916. static BOOL FileSys_InRootDir(void);
  917. static BOOL Browser_Construct(void);
  918. static void Browser_Destruct(void);
  919. static void Browser_InitArrays(void);
  920. static void Browser_Build(enBuildBrowser eBuildBrowserType, BOOL bNotifyUI);
  921. static void Browser_OpenFolder(UINT8 ucWhichWindow, int iWhichEntry, BOOL bNotifyUI);
  922. static void Browser_GetFolderInfo(UINT16 uDirNum,ClipInfo *o_pInfo, enWINDOWTYPE eWin);
  923. static void SetBrowserStyle(enClipsBrowserStyle eBrowserStyle);
  924. static void OnGetClipInfoForUI(ClipInfo *o_pClipFileInfo);
  925. static BOOL IsGotoNextChapterAllowed(void);
  926. static BOOL IsGotoPreviousChapterAllowed(void);
  927. static void Browser_ResetPeerFoldersArray(void);
  928. static void Browser_ResetSubFoldersArray(void);
  929. static void OnDriveError(void);
  930. static void OnDemuxError(void);
  931. #ifdef I77_COMPANION_CHIP
  932. void JPEGClip_BeforeAbort(void);
  933. void DEC_JPEG_End_Resolution(void);
  934. #endif
  935. #ifdef D_DIVX_EXTERNAL_SUBTITLE_SELECTION
  936. void Set_SubFile_Count(WORD wCount);
  937. #endif
  938. /////////////////////////////////////////////////////////////////////////////
  939. // Public Services
  940. // <<< SEC BK.LIM101303: Search first file if  Root dose not have  any file list to play.
  941. #ifdef EXINO2
  942. #ifdef MP3_SUBFOLDER_AUTOPLAY
  943. void Clips_set_Autoplay(BOOL bAutoplay)
  944. {
  945. g_bClipsAutoplay = bAutoplay;
  946. }
  947. #endif
  948. #endif
  949. // >>>
  950. enClipsListStatus Clips_getClipsListStatus(void)
  951. {
  952. return (enClipsListStatus)g_pClipsNav->m_eClipsListStatus;
  953. }
  954. /*
  955. Desc: This function is for Explorer style browser only. Tells Clips nav to 
  956.       play within a folder or cross folders or play a single Item.
  957. In:   BOOL bPlayMode 
  958. Out:  None.
  959. */
  960. void Clips_SetExplorerStyleBrowserPlayMode(enClipsExplorerStyleBrowserPlayMode ePlayMode)
  961. {
  962. ie_send_ex(IE_CORE_CLIPS_EXPLORER_BROWSER_PLAY_MODE, (void*)ePlayMode);
  963. }
  964. void Clips_SetExplorerStyleBrowserDiscScanMode(BOOL bDiscScanMode)
  965. {
  966. ie_send_ex(IE_CORE_CLIPS_EXPLORER_BROWSER_DISC_SCAN_MODE, (void*)bDiscScanMode);
  967. }
  968. void Clips_findClips(UINT16 uTypesToFind)
  969. {
  970. UINT32 ulParam= (((UINT32)eFindClipRendezvous << 16) | uTypesToFind);
  971. #ifdef CLIPS_DISPLAY_BACKGROUND
  972. // Capture the current Background, to be used later
  973. PE_Clips_CaptureBackground();
  974. // Display the Background
  975. PE_Clips_DisplayBackground();
  976. #else
  977. PE_Clips_ClearBackground();
  978. #endif //CLIPS_DISPLAY_BACKGROUND
  979. // Reset the Available Types
  980. g_uAvailableClipTypes= (UINT16)eClipType_None;
  981. // Store the Types to Find as the default Playback-Filter
  982. g_uPlaybackFilter= uTypesToFind;
  983. // Invoke the search
  984. g_pClipsNav->m_eClipsListStatus= (UINT8)eCLS_Building;
  985. ie_send_ex(IE_CORE_CDNAV_RENDEZVOUS, (void*)ulParam);
  986. return;
  987. }
  988. #ifdef CLIPS_MANUAL_PLAYLIST_CONSTRUCTION_SUPPORT
  989. BOOL Clips_addClip(LPCWSTR i_pszFilename)
  990. {
  991. UINT16 hFindFile;
  992. UINT16 hClipInstance;
  993. FindData fdFileInfo;
  994. #ifdef CLIPS_DISPLAY_BACKGROUND
  995. // Capture the current Background, to be used later
  996. PE_Clips_CaptureBackground();
  997. // Display the Background
  998. PE_Clips_DisplayBackground();
  999. #else
  1000. PE_Clips_ClearBackground();
  1001. #endif //CLIPS_DISPLAY_BACKGROUND
  1002. g_pClipsNav->m_eClipsListStatus= (UINT8)eCLS_Building;
  1003. // Assumption: The requested file is either in the current Working-Directory,
  1004. // or consists of a Full-Path relative to the current Working-Directory.
  1005. hFindFile= FileSys_findFirstFile(i_pszFilename, &fdFileInfo);
  1006. if ((NULL == hFindFile) || ! FileSys_findClose(hFindFile)) {
  1007. tr_printf(("FATAL: Clips_addClip() Failed [1]: Cannot add %s.n", DBG_W2A(i_pszFilename)));
  1008. return FALSE;
  1009. }
  1010. // Try to enqueue the Clip
  1011. hClipInstance= ClipsRepository_addClip(&fdFileInfo);
  1012. if (NULL == hClipInstance) {
  1013. dbg_printf(("WARNING: Clips_addClip() Failed [2]: %s rejected.n", DBG_W2A(i_pszFilename)));
  1014. return FALSE;  
  1015. }
  1016. // Update the Available-Types
  1017. g_uAvailableClipTypes |= (UINT16)Clip_getType(hClipInstance);
  1018. // Update the cummulative Playback-Time
  1019. SHARED_INFO.uClipsCnt++;
  1020. // SHARED_INFO.uTotalPlaybackTime += pClipFileInfo->ulPlaybackTime;
  1021. dbg_printf(("%d. %sn", ClipsRepository_getSize(), DBG_W2A(fdFileInfo.szFileID)));
  1022. return TRUE;
  1023. }
  1024. BOOL Clips_addClipEx(const FindData *i_pFileInfo)
  1025. {
  1026. UINT16 hClipInstance;
  1027. g_pClipsNav->m_eClipsListStatus= (UINT8)eCLS_Building;
  1028. #ifdef CLIPS_DISPLAY_BACKGROUND
  1029. // Capture the current Background, to be used later
  1030. PE_Clips_CaptureBackground();
  1031. // Display the Background
  1032. PE_Clips_DisplayBackground();
  1033. #else
  1034. PE_Clips_ClearBackground();
  1035. #endif //CLIPS_DISPLAY_BACKGROUND
  1036. // Try to enqueue the Clip
  1037. hClipInstance= ClipsRepository_addClip(i_pFileInfo);
  1038. if (NULL == hClipInstance) {
  1039. dbg_printf(("WARNING: Clips_addClipEx() Failed [1]: %s rejected.n", DBG_W2A(i_pFileInfo->szFileID)));
  1040. return FALSE;
  1041. }
  1042. // Update the Available-Types
  1043. g_uAvailableClipTypes |= (UINT16)Clip_getType(hClipInstance);
  1044. // Update the cummulative Playback-Time
  1045. SHARED_INFO.uClipsCnt++;
  1046. // SHARED_INFO.uTotalPlaybackTime += pClipFileInfo->ulPlaybackTime;
  1047. dbg_printf(("%d. %sn", ClipsRepository_getSize(), DBG_W2A(i_pFileInfo->szFileID)));
  1048. return TRUE;
  1049. }
  1050. #endif //CLIPS_MANUAL_PLAYLIST_CONSTRUCTION_SUPPORT
  1051. void Clips_removeAllClips()
  1052. {
  1053. ClipsRepository_empty();
  1054. // Reset the Available Types
  1055. g_uAvailableClipTypes= (UINT16)eClipType_None;
  1056. // Update the cummulative Playback-Time
  1057. SHARED_INFO.uClipsCnt= 0;
  1058. // SHARED_INFO.uTotalPlaybackTime= 0;
  1059. return;
  1060. }
  1061. void Clips_finalizeClipsList()
  1062. {
  1063. UINT16 uEntriesCnt, uSlot;
  1064. SHARED_INFO.uCurrentClipNumber = 0; 
  1065. // Initialize the default Program-List to a sequencial playback of the Playlist
  1066. PM_InitializeProgramList();
  1067. //PM_SetPlaybackMode(PM_PLAYBACK_NORMAL);
  1068. uEntriesCnt= ClipsRepository_getSize();
  1069. // Initialize the settings of the Global variables
  1070. SHARED_INFO.uClipsCnt= uEntriesCnt;
  1071. if (0 != uEntriesCnt) {
  1072. for (uSlot= 1; uSlot <= uEntriesCnt; uSlot++)
  1073. PM_SetProgramListEntry(uSlot, uSlot);
  1074. // Initialize the current Position to the first item on the Playlist
  1075. SHARED_INFO.uCurrPlaylistItem= computePlaylistItem(0, TRUE);
  1076. #ifdef D_NO_CLIPS_AUTORUN
  1077. SHARED_INFO.uCurrentClipNumber = 1; 
  1078. #endif
  1079. // Initialize the Clip-Information for the first Clip
  1080. // Clip_getFileInfo(ClipsRepository_getInstanceAt(0), 
  1081. Clip_getCurrFileInfo(ClipsRepository_getInstanceAt(0),
  1082.  &(SHARED_INFO.cieCurrClip).ciInfo);
  1083. (SHARED_INFO.cieCurrClip).eClipStatus= (UINT8)eCS_Idle;
  1084. (SHARED_INFO.cieCurrClip).bIsExtendedInfoAvailable= FALSE;
  1085. // Clear any Resume Marker
  1086. (g_pClipsNav->m_cmResumeMarker).dwAddress= (ULONG)-1;
  1087. }
  1088. g_pClipsNav->m_eClipsListStatus= (UINT8)eCLS_Finalized;
  1089. #ifdef CLIPS_JPEG_DIGEST_SUPPORT
  1090. if ((g_pClipsNav->m_uDigestableItemsCnt > 0) && 
  1091. (g_pClipsNav->m_uDigestableTypes & g_uPlaybackFilter))
  1092. {
  1093. SET_COP_MASK(COP_TITLE_MENU);
  1094. }
  1095. else
  1096. CLEAR_COP_MASK(COP_TITLE_MENU);
  1097. #endif //CLIPS_JPEG_DIGEST_SUPPORT
  1098. #ifdef MANUAL_DIRECTORY_EXPLORER
  1099. // Reset the Playback Mode
  1100. if (PM_IsPlaybackProgram(PM_GetPlaybackMode())) 
  1101.  PM_SetPlaybackMode(PM_PLAYBACK_NORMAL);
  1102. g_pClipsNav->m_uCurrPlaybackMode = PM_PLAYBACK_NORMAL;
  1103. OnModeChange();
  1104. #else
  1105. PM_SetPlaybackMode(PM_PLAYBACK_NORMAL);
  1106. #endif
  1107. return;
  1108. }
  1109. /*
  1110. This function is used by UI task only.
  1111. o_pClipFileInfo->cbFileSize is used as a synchonization flag
  1112. between UI and core task.
  1113. */
  1114. BOOL Clips_getClipFileInfoAt(UINT16 uClipNumber, ClipInfo *o_pClipFileInfo)
  1115. {
  1116. // WORD  watchdog = 500;
  1117. if(NULL == o_pClipFileInfo)
  1118. return FALSE;
  1119. o_pClipFileInfo->cbFileSize = eUIToGetClipInfo;
  1120. SHARED_INFO.iGetClipFileInfoAtNumber = uClipNumber;
  1121. ie_send_ex(IE_CORE_GET_CLIP_FILE_INFO, (void *)(o_pClipFileInfo));
  1122. while ((eUIToGetClipInfo == o_pClipFileInfo->cbFileSize) && NULL != g_pClipsNav)  
  1123. {
  1124. usleep(10000UL);
  1125. }
  1126. if(eClipInfoReadyForUI == o_pClipFileInfo->cbFileSize)
  1127. return TRUE;
  1128. else
  1129. return FALSE;
  1130. }
  1131. void Clips_setPresentationTime(enClipType eType, UINT8 uPresentationTime)
  1132. {
  1133. Clip_setPresentationTime(eType, uPresentationTime);
  1134. return;
  1135. }
  1136. UINT16 Clips_getAvailableTypes(void)
  1137. {
  1138. return g_uAvailableClipTypes;
  1139. }
  1140. UINT16 Clips_getPlaybackFilter(void)
  1141. {
  1142. return g_uPlaybackFilter;
  1143. }
  1144. void Clips_setPlaybackFilter(UINT16 uTypesToPlay)
  1145. {
  1146. if (uTypesToPlay == g_uPlaybackFilter)
  1147. return;
  1148. g_uPlaybackFilter= uTypesToPlay;
  1149. // If during stop, reset the playback to the first suitable item
  1150. if (PST_STOP == gcs.pstate) {
  1151. // Initialize the current Position to the first suitable item on the Playlist
  1152. SHARED_INFO.uCurrPlaylistItem= computePlaylistItem(0, TRUE);
  1153. if (0 != SHARED_INFO.uCurrPlaylistItem) {
  1154. SHARED_INFO.uCurrentClipNumber= PM_GetProgramListEntry(SHARED_INFO.uCurrPlaylistItem);
  1155. // Initialize the Clip-Information for the Clip
  1156. // Clip_getFileInfo(ClipsRepository_getInstanceAt(SHARED_INFO.uCurrentClipNumber-1), 
  1157. Clip_getCurrFileInfo(ClipsRepository_getInstanceAt(SHARED_INFO.uCurrentClipNumber-1),
  1158.  &(SHARED_INFO.cieCurrClip).ciInfo);
  1159. (SHARED_INFO.cieCurrClip).eClipStatus= (UINT8)eCS_Idle;
  1160. (SHARED_INFO.cieCurrClip).bIsExtendedInfoAvailable= FALSE;
  1161. // Clear any Resume Marker
  1162. (g_pClipsNav->m_cmResumeMarker).dwAddress= (ULONG)-1;
  1163. }
  1164. }
  1165. #ifdef CLIPS_JPEG_DIGEST_SUPPORT
  1166. if ((g_pClipsNav->m_uDigestableItemsCnt > 0) && 
  1167. (g_pClipsNav->m_uDigestableTypes & g_uPlaybackFilter))
  1168. {
  1169. SET_COP_MASK(COP_TITLE_MENU);
  1170. }
  1171. else
  1172. CLEAR_COP_MASK(COP_TITLE_MENU);
  1173. #endif //CLIPS_JPEG_DIGEST_SUPPORT
  1174. return;
  1175. }
  1176. // <<< SEC BK.LIM101303: Search first file if  Root dose not have  any file list to play.
  1177. #ifdef EXINO2
  1178. #ifdef MP3_SUBFOLDER_AUTOPLAY
  1179. void Clip_Initial_Find_FirstPlayableItem()
  1180. {
  1181. UINT16 uPlayItem, uClipNum;
  1182. uClipNum= PM_GetProgramListEntry(SHARED_INFO.uCurrPlaylistItem);
  1183. #ifdef DISABLE
  1184. if( (0 == uClipNum)
  1185. &&(0 ==SHARED_INFO.uCurrPlaylistItem)
  1186. && (eWholeDisc == SHARED_INFO.uExplorerStyleBrowserPlayMode)
  1187. && (eWINDOWS_EXPLORER_STYLE == SHARED_INFO.eWindowsExplorerStyleBrowser))
  1188. #endif 
  1189. if( (0 == uClipNum)
  1190. &&(0 ==SHARED_INFO.uCurrPlaylistItem)
  1191. && (eWINDOWS_EXPLORER_STYLE == SHARED_INFO.eWindowsExplorerStyleBrowser))
  1192. {
  1193. SHARED_INFO.uCurrPlaylistItem = getFirstItemInSubFoldersOrNextFolders(); 
  1194. }
  1195. }
  1196. #endif
  1197. #endif
  1198. // SEC BK.LIM101303>>>
  1199. /////////////////////////////////////////////////////////////////////////////
  1200. // Navigation Interface
  1201. /////////////////////////////////////////////////////////////////////////////
  1202. // Clips_Navigator()
  1203. //
  1204. // Description: The main router for Clips Navigation Events.
  1205. //
  1206. // Input: Op - The type of Operation being invoked
  1207. // Event - The Event to route
  1208. // Param - An optional Parameter to the Event being routed
  1209. //
  1210. // Output: None
  1211. // In/Out: None
  1212. // Return: Zero on success; Non-Zero otherwise.
  1213. //
  1214. // Remarks: None
  1215. int Clips_Navigator(HDLR_OP Op, EVENT Event, void *Param)
  1216. {
  1217. switch (Op) 
  1218. {
  1219. case HDLR_ENTER:
  1220. constructor();
  1221. break;
  1222. case HDLR_EXIT:
  1223. destructor();
  1224. break;
  1225. case HDLR_EVENT:
  1226. if (NULL == g_pClipsNav)
  1227. return -1;
  1228. switch (Event)
  1229. {
  1230. case IE_CORE_PAUSE:
  1231. OnStop(ePause);
  1232. break;
  1233. case IE_CORE_STOP:
  1234. OnStop((TRUE == (BOOL)Param) ? eFullStop : eStopResume);
  1235. break;
  1236. case IE_CORE_RESTART:
  1237. #ifdef DIVX_SUPPORT_MULTI_SUBTITLE_MODE0
  1238. bNeedWaitForUI = FALSE;
  1239. #endif
  1240. SHARED_INFO.uCurrPlaylistItem= computePlaylistItem(0, TRUE);
  1241. // Clear any Resume Marker
  1242. (g_pClipsNav->m_cmResumeMarker).dwAddress= (ULONG)-1;
  1243. // <<< SEC BK.LIM101303: Search first file if  Root dose not have any file list to play
  1244. #ifdef EXINO2
  1245. #ifdef MP3_SUBFOLDER_AUTOPLAY
  1246. if(g_bClipsAutoplay)
  1247. Clip_Initial_Find_FirstPlayableItem();
  1248. #endif
  1249. #endif
  1250. // SEC BK.LIM101303>>>
  1251. // Fall-Through!
  1252. case IE_CORE_PLAY:
  1253. OnPlay();
  1254. break;
  1255. case IE_CORE_NEXT_CHAPTER:
  1256. OnNextItem();
  1257. break;
  1258. case IE_CORE_PREVIOUS_CHAPTER:
  1259. OnPreviousItem();
  1260. break;
  1261. case IE_CORE_GOTO_ENTRY:
  1262. case IE_CORE_MENU_NUMERICAL_SELECTION:
  1263. OnNumericSelection((UINT16)Param);
  1264. break;
  1265. #ifdef MANUAL_DIRECTORY_EXPLORER
  1266. case IE_CORE_FIND_CLIP_ITEM_IN_OTHER_FOLDER:
  1267. if (PST_STOP == gcs.pstate)
  1268. {
  1269. if(0 ==Param)
  1270. getFirstItemInSubFoldersOrNextFolders();
  1271. else
  1272. if(1 == Param)
  1273. getLastItemInPrevFolders();
  1274. }
  1275. break;
  1276. case IE_CORE_SET_CLIPS_BROWSER_STYLE:
  1277. SetBrowserStyle((enClipsBrowserStyle)Param);
  1278. break;
  1279. case IE_CORE_CLIPS_EXPLORER_BROWSER_PLAY_MODE:
  1280. SHARED_INFO.uExplorerStyleBrowserPlayMode = (enClipsExplorerStyleBrowserPlayMode)Param;
  1281. break;
  1282. case IE_CORE_CLIPS_EXPLORER_BROWSER_DISC_SCAN_MODE:
  1283. SHARED_INFO.bIsIntroPlayMode = (BOOL)Param;
  1284. break;
  1285. #endif
  1286. case IE_CORE_GET_CLIP_FILE_INFO:
  1287. OnGetClipInfoForUI((ClipInfo *)Param);
  1288. break;
  1289. case IE_CORE_CDNAV_RENDEZVOUS:
  1290. OnRendezvous(Param);
  1291. break;
  1292. case IE_CORE_CDNAV_FINISHED:
  1293. OnPlaybackFinished();
  1294. break;
  1295. case IE_CORE_PM_RESET:
  1296. // Reset the PM: return to Normal Playback, no Repeats of any kind
  1297. PM_SetPlaybackMode(PM_PLAYBACK_NORMAL);
  1298. PM_ClearRepeat();
  1299. break;
  1300. case IE_CORE_CLIPS_PARAMETER_RESET:
  1301. Clips_removeAllClips();
  1302. ClipsSysStateReset();
  1303. g_pClipsNav->m_eClipsListStatus= (UINT8)eCLS_Uninitialized;
  1304. break;
  1305. #ifdef CLIPS_JPEG_SUPPORT
  1306. case IE_CORE_ANGLE_SELECTION:
  1307. OnAngleSelection((enClipImageOrientation)Param);
  1308. break;
  1309. case IE_CORE_TRANS_SELECTION:
  1310. OnTransitionSelection((enClipTransitionEffect)Param);
  1311. break;
  1312. #ifdef CLIPS_JPEG_DIGEST_SUPPORT
  1313. case IE_CORE_DIGEST:
  1314. OnDigest((UINT16)Param & 0xFFFF);
  1315. break;
  1316. #endif
  1317. #endif //CLIPS_JPEG_SUPPORT
  1318. case IE_CORE_TICK_200:
  1319. OnTick();
  1320. break;
  1321. case IE_CORE_SEAMLESS_MODE_CHANGE:
  1322. OnModeChange();
  1323. break;
  1324. case IE_CORE_SCAN:
  1325. OnScan((int)Param);
  1326. break;
  1327. case IE_CORE_CDNAV_INTRO:
  1328. OnIntro();
  1329. break;
  1330. case IE_CORE_GOTO_TIME:
  1331. OnGotoTime((WORD)Param);
  1332. break;
  1333. case IE_CORE_AB_REPEAT:
  1334. OnA2BRepeat((int)Param);
  1335. break;
  1336. case IE_CORE_I_FRAME:
  1337. OnIFrameDisplayed();
  1338. break;
  1339. case IE_CORE_DEMUX_FINISHED:
  1340. OnDemuxFinished();
  1341. break;
  1342. case IE_CORE_DEMUX_ERROR:
  1343. OnDemuxError();
  1344. break;
  1345. case IE_CORE_SUBTITLE_ARRIVED:
  1346. #ifdef IS_MP4_CAPABLE
  1347. if (SI_IS_CURRENT_MP4_CLIP) // MP4, subtitle, text
  1348. {
  1349. MP4Clip_subtitleArrived();
  1350. }
  1351. else // AVI
  1352. #endif
  1353. {
  1354. OnSubtitleArrived();
  1355. }
  1356. break;
  1357. case IE_CORE_SUBTITLE_CHANGED:
  1358. OnSubtitleChanged();
  1359. break;
  1360. #ifdef AVI_AUDIO_CHANGE_ONSCAN   //ZKR JK0413 : add for audio change on-the-fly 
  1361. case IE_CORE_AUDIO_CHANGED:
  1362. OnAudioChanged();
  1363. break;
  1364. #endif
  1365. #ifdef IS_MP4_CAPABLE
  1366. case IE_CORE_CHAPTER_CHANGED:
  1367. OnChapterChanged();
  1368. break;
  1369. #endif
  1370.       case IE_CORE_DRM_INFO_ARRIVED:
  1371.          OnDrmInfoMsgArrived();
  1372. break;
  1373. case IE_CORE_STEP:
  1374. OnStep();
  1375. break;
  1376. case IE_CORE_SLOW:
  1377. OnSlow((int)Param);
  1378. break;
  1379. case EVENT_CLASS_CORE:
  1380. #ifdef _DEBUG
  1381. OnStatusReport();
  1382. #endif //_DEBUG
  1383. break;
  1384. #ifdef D_USE_TIMEOUT_FOR_JPG_TRICK
  1385. case IE_CORE_ZOOM:
  1386. case IE_CORE_PANNING:
  1387. if( eClipType_JPEG == SI_CLIPS_CURR_CLIP_INFO.ciInfo.eType )
  1388. {
  1389.   if(PST_PAUSE == gcs.pstate)  // Add by Torrance
  1390.   {
  1391.       timer_service_disable(g_pClipsNav->m_hPresentationTimer);
  1392.   }
  1393.   else
  1394.   {
  1395. timer_service_enable(g_pClipsNav->m_hPresentationTimer, TRUE);
  1396.     }
  1397.      }
  1398. break;
  1399. #else
  1400. case IE_CORE_ZOOM:
  1401. timer_service_disable(g_pClipsNav->m_hPresentationTimer);    //disable the timer if exist, next jpg won't be show if zoom is called.
  1402. break;
  1403. #endif
  1404. case IE_CORE_DRIVE_READ_FAIL:
  1405. OnDriveError();
  1406. break;
  1407. default:
  1408. // dbg_printf(("Clips_Nav: Unexpected Event %Xn", (Event & 0xFF)));
  1409. break;
  1410. } // endof switch(Event)
  1411. break;
  1412. default:
  1413. dbg_printf(("Clips_Nav: Unknown Operation requested %dn", Op));
  1414. break;
  1415. } //endof switch(Op)
  1416. return 0;
  1417. }
  1418. /////////////////////////////////////////////////////////////////////////////
  1419. // Private Services
  1420. /////////////////////////////////////////////////////////////////////////////
  1421. // _findAndAddClips()
  1422. //
  1423. // Description: Searches the File-System for certain Clips, and enqueues
  1424. // them in the Play-List.
  1425. //
  1426. // Input: None
  1427. // Output: None
  1428. // In/Out: None
  1429. // Return: None
  1430. //
  1431. // Remarks: None
  1432. static BOOL _findAndAddClips(UINT16 uMaxClipsToFind, BOOL bRootLevel)
  1433. {
  1434. BOOL bSearchAborted;
  1435. UINT16  uSubDirsCnt;
  1436. UINT16 uPos;
  1437. UINT16 hFindFile;
  1438. static UINT16 uDirTreeLevel;
  1439. static UINT16 uLastUsedArrayPos;
  1440. static FindData *pFileInfo;
  1441. if (bRootLevel) {
  1442. // Allocate a FindData structure
  1443. pFileInfo= (FindData*)malloc(sizeof(FindData));
  1444. if (NULL == pFileInfo) {
  1445. tr_printf(("FATAL: _findAndAddClips() Failed [2]: Low system resourcesn"));
  1446. return FALSE;
  1447. }
  1448. uLastUsedArrayPos= 0;
  1449. uDirTreeLevel= 0;
  1450. }
  1451. // Start scanning the Current Directory
  1452. hFindFile= FileSys_findFirstFile(FILESYS_WILDCARD_SEARCH, pFileInfo);
  1453. if (NULL == hFindFile) {
  1454. // Robin_1124_2004_B, should free pFileInfo if not find File at first time
  1455. if (bRootLevel) {
  1456. free(pFileInfo);
  1457. }
  1458. return FALSE;
  1459. }
  1460. // Start scanning the Current-Directory
  1461. bSearchAborted= FALSE;
  1462. uSubDirsCnt= 0;
  1463. do {
  1464. // If an Exception was thrown, abort the search
  1465. if (Exception_catchAndRethrow(EXCEPTION_MEDIUM_EJECTED)) {
  1466. tr_printf(("EXCEPTION: _findAndAddClips() Aborting [2]n"));
  1467. bSearchAborted= TRUE;
  1468. break;
  1469. }
  1470. // Verify that there is vacancy in the Clips-Repository
  1471. if (uMaxClipsToFind == ClipsRepository_getSize())
  1472. break;
  1473. // Check the Type of File found
  1474. if (FILETYPE_VOLUME == pFileInfo->uFileType) 
  1475. {
  1476.   //do nothing.
  1477. }
  1478. else
  1479. if (FILETYPE_DIRECTORY == pFileInfo->uFileType) {
  1480. // Skip the Current and the Parent directories
  1481. if (0x00 == pFileInfo->szFileID[0] || 0 == wcscmp(pFileInfo->szFileID, L"."))
  1482. continue;
  1483. if( (0x01 == pFileInfo->szFileID[0]) || 0 == wcscmp(pFileInfo->szFileID, L".."))
  1484. continue;
  1485. // Enqueue the Directory found, for later use
  1486. if (! Array_setAt(SHARED_INFO.hDirsArray[0], (uLastUsedArrayPos + uSubDirsCnt),
  1487.   (const BYTE*)pFileInfo->szFileID))
  1488. {
  1489. dbg_printf(("WARNING: _findAndAddClips() Failed [3]n"));
  1490. break;
  1491. }
  1492. Array_getAt(SHARED_INFO.hDirsArray[0],(uLastUsedArrayPos + uSubDirsCnt),(const BYTE*)pFileInfo->szFileID);
  1493. uSubDirsCnt++;
  1494. }
  1495. else if (FILETYPE_NORMAL == pFileInfo->uFileType) {
  1496. UINT16 hClipInstance= ClipsRepository_addClip(pFileInfo);
  1497. if (NULL == hClipInstance) {
  1498. dbg_printf(("WARNING: _findAndAddClips() Failed [4]: %s rejected.n", DBG_W2A(pFileInfo->szFileID)));
  1499. continue;
  1500. }
  1501. // Update the Available-Types
  1502. g_uAvailableClipTypes |= (UINT16)Clip_getType(hClipInstance);
  1503. #ifdef CLIPS_JPEG_DIGEST_SUPPORT
  1504. // Update the number of Digestable Items
  1505. if (Clip_hasAttribute(hClipInstance, eCA_Digestable)) {
  1506. g_pClipsNav->m_uDigestableTypes |= (UINT16)Clip_getType(hClipInstance);
  1507. g_pClipsNav->m_uDigestableItemsCnt++;
  1508. }
  1509. #endif //CLIPS_JPEG_DIGEST_SUPPORT
  1510. // Update the cummulative Playback-Time
  1511. //jerry cai SHARED_INFO.uClipsCnt will be updated by  Clips_finalizeClipsList SHARED_INFO.uClipsCnt++;
  1512. // SHARED_INFO.uTotalPlaybackTime += pClipFileInfo->ulPlaybackTime;
  1513. dbg_printf(("%d. %sn", ClipsRepository_getSize(), DBG_W2A(pFileInfo->szFileID)));
  1514. }
  1515. } while (FileSys_findNextFile(hFindFile, pFileInfo));
  1516. // Terminate the search
  1517. FileSys_findClose(hFindFile);
  1518. if (! bSearchAborted && (uDirTreeLevel < CLIPS_MAX_DIR_NESTING_LEVEL)) {
  1519. UINT16 uFirstSubDirPos;
  1520. // Now, handle all directories that were found on the way, recursively
  1521. memset(pFileInfo->szFileID, 0, sizeof(pFileInfo->szFileID));
  1522. // Record the position of the First Sub-Directory found at this level,
  1523. // and increment the Last-Used slot of the Sub-Directories Array.
  1524. uFirstSubDirPos= uLastUsedArrayPos;
  1525. uLastUsedArrayPos += uSubDirsCnt;
  1526. for (uPos= uFirstSubDirPos; uPos < (uFirstSubDirPos + uSubDirsCnt); uPos++) {
  1527. // If an Exception was thrown, abort the search
  1528. if (Exception_catchAndRethrow(EXCEPTION_MEDIUM_EJECTED)) {
  1529. tr_printf(("EXCEPTION: _findAndAddClips() Aborting [5]n"));
  1530. bSearchAborted= TRUE;
  1531. break;
  1532. }
  1533. // Verify that there is vacancy in the Clips-List
  1534. if (uMaxClipsToFind == ClipsRepository_getSize())
  1535. break;
  1536. // Extract the next Sub-Directory name
  1537. if (! Array_getAt(SHARED_INFO.hDirsArray[0], uPos, (BYTE*)pFileInfo->szFileID)) {
  1538. dbg_printf(("WARNING: _findAndAddClips() Failed [6]n"));
  1539. continue;
  1540. }
  1541. // Enter the Sub-Directory
  1542. if (! FileSys_changeDir(pFileInfo->szFileID)) {
  1543. dbg_printf(("WARNING: _findAndAddClips() Failed [7]n"));
  1544. continue;
  1545. }
  1546. // Increment the Nesting Level
  1547. uDirTreeLevel++;
  1548. // Continue the search recursively
  1549. if (! _findAndAddClips(uMaxClipsToFind, FALSE)) {
  1550. dbg_printf(("WARNING: _findAndAddClips() Failed [8]n"));
  1551. break;
  1552. }
  1553. // Return to the Current-Directory
  1554. if (! FileSys_goUp()) {
  1555. dbg_printf(("WARNING: _findAndAddClips() Failed [9]n"));
  1556. break;
  1557. }
  1558. // Restore the Nesting Level
  1559. uDirTreeLevel--;
  1560. }
  1561. // Restore the Last-Used slot of the Sub-Directories Array
  1562. uLastUsedArrayPos -= uSubDirsCnt;
  1563. }
  1564. if (bRootLevel) {
  1565. free(pFileInfo);
  1566. }
  1567. return (! bSearchAborted);
  1568. }
  1569. /////////////////////////////////////////////////////////////////////////////
  1570. // constructor()
  1571. //
  1572. // Description: Constructs and initializes the Clips Navigator.
  1573. //
  1574. // Input: None
  1575. // Output: None
  1576. // In/Out: None
  1577. // Return: None
  1578. //
  1579. // Remarks: None
  1580. static void constructor()
  1581. {
  1582. BOOL bLongFilenameSupport;
  1583. dbg_printf(("Clips_constructor()n"));
  1584. dbg_printf(("--> Size of Navigator is: %d Bytes (Global) + %d Bytes (Heap)n", 
  1585. (int)sizeof(S_CLIPS_GLOBALS), (int)sizeof(Clips_Nav_Info)));
  1586. // Initialize the globals
  1587. g_uAvailableClipTypes= (UINT16)eClipType_None;
  1588. g_uPlaybackFilter= 0xFFFF;
  1589. gns.clips.iClipBitRate = -1;
  1590. // RB_1124_2004, when clip constuctor, set bNeedWaitForUI to FALSE
  1591. #ifdef DIVX_SUPPORT_MULTI_SUBTITLE_MODE0
  1592. bNeedWaitForUI = FALSE;
  1593. #endif
  1594. // Initialize the File-System and select the appropriate naming convention
  1595. #ifdef CLIPS_USE_LONG_FILENAMES
  1596. bLongFilenameSupport= TRUE;
  1597. #else
  1598. bLongFilenameSupport= FALSE;
  1599. #endif //CLIPS_USE_LONG_FILENAMES
  1600. if (! FileSys_selectType(eAny) || ! FileSys_initialize(bLongFilenameSupport)) {
  1601. tr_printf(("WARNING: Failed to initialize the File-System.n"));
  1602. #ifdef EXINO2 //ZKR JK0509 : can't construct fail
  1603.                 ie_send(IE_CORE_MEDIA_UNIDENTIFIED);
  1604. #endif
  1605. return;
  1606. }
  1607. // Allocate the Clips Navigator
  1608. if(NULL != g_pClipsNav)
  1609. {
  1610. tr_printf(("Try to reallocate resources for the Clips Navigator struct.n"));
  1611. }
  1612. else
  1613. {
  1614. g_pClipsNav= (Clips_Nav_Info *)malloc(sizeof(Clips_Nav_Info));
  1615. if (NULL == g_pClipsNav) 
  1616. {
  1617. tr_printf(("Failed to allocate resources for the Clips Navigator struct.n"));
  1618. return;
  1619. }
  1620. }
  1621. //initializing the rand seed
  1622. srand((UINT16)timing_get_clock());
  1623. //creating the presentation timer
  1624. g_pClipsNav->m_hPresentationTimer= 
  1625. timer_service_create(OnPresentationTimeExpired, 1, 
  1626.  (TIMER_DISABLED | TIMER_ONCE));
  1627. if (NULL == g_pClipsNav->m_hPresentationTimer) {
  1628. tr_printf(("FATAL: Clips_construct() Failed [1]: Low system resourcesn"));
  1629. free(g_pClipsNav);
  1630. g_pClipsNav= NULL;
  1631. return;
  1632. }
  1633. g_pClipsNav->m_bPresentationMode= FALSE;
  1634. g_pClipsNav->m_hCachedClip= NULL;
  1635. // Clear the Resume Marker
  1636. (g_pClipsNav->m_cmResumeMarker).dwAddress= (ULONG)-1;
  1637. // Reset error recovery
  1638. (g_pClipsNav->m_ErrorRecoveryInfo).uRetryCount = CLIPS_ERROR_RECOVERY_RETRY_COUNT;
  1639. #ifdef CLIPS_JPEG_DIGEST_SUPPORT
  1640. g_pClipsNav->m_bDigestMode= FALSE;
  1641. g_pClipsNav->m_uDigestableTypes= (UINT16)eClipType_None;
  1642. g_pClipsNav->m_uDigestableItemsCnt= 0;
  1643. g_pClipsNav->m_hDigestUnits= NULL;
  1644. #endif //CLIPS_JPEG_DIGEST_SUPPORT
  1645. // Initialize the Clips-List and Program-List
  1646. g_pClipsNav->m_eClipsListStatus= (UINT8)eCLS_Uninitialized;
  1647. if (!ClipsRepository_construct(CLIPS_MAX_PROGRAM_SIZE)) {
  1648. tr_printf(("FATAL: Clips_construct() Failed [2]: Low system resourcesn"));
  1649. timer_service_delete(g_pClipsNav->m_hPresentationTimer);
  1650. free(g_pClipsNav);
  1651. g_pClipsNav= NULL;
  1652. return;
  1653. }
  1654. Browser_Construct();
  1655. // Reset the Playback Mode
  1656. PM_SetPlaybackMode(PM_PLAYBACK_NORMAL);
  1657. // Set the allowed Core Operations
  1658. SET_COP_MASK(0xFFFFFFFFL);
  1659. CLEAR_COP_MASK( COP_REVERSE_PLAY |COP_SCAN | COP_SCAN_BACKWARD |
  1660. COP_SLOW | COP_STEP | COP_PANNING | COP_TITLE_MENU |
  1661. COP_ROOT_MENU | COP_AUDIO_CHANGE | COP_SUBPIC_CHANGE |
  1662. COP_ANGLE_CHANGE | COP_RETURN | COP_ABREPEAT |
  1663. COP_SCAN | COP_SCAN_BACKWARD );
  1664. // Initialize the current Position to the first item on the Playlist
  1665. SHARED_INFO.uCurrPlaylistItem= 0;
  1666. // Initialize the settings of the Global variables
  1667. SHARED_INFO.uClipsCnt= 0;
  1668. SHARED_INFO.uCurrentClipNumber= 0;
  1669. SHARED_INFO.uSubDirCount= 0; //clear it, if not may get wrong track number for non-explore style menu
  1670. SHARED_INFO.iCurrentTime= 0;
  1671. SHARED_INFO.uTotalPlaybackTime= 0;
  1672. SHARED_INFO.eCurrentTransition= eCTE_None;
  1673. SHARED_INFO.iScanSpeed = 0;
  1674. SHARED_INFO.iClipBitRate = 0;
  1675. SHARED_INFO.bIsIntroPlayMode = FALSE;
  1676. #ifdef MANUAL_DIRECTORY_EXPLORER
  1677. SHARED_INFO.uSubDirArraySize = 0; //ERICM_4JUN25K
  1678. #endif
  1679. #ifdef MANUAL_DIRECTORY_EXPLORER
  1680. SHARED_INFO.eWindowsExplorerStyleBrowser = eWINDOWS_EXPLORER_STYLE;
  1681. #else
  1682. SHARED_INFO.eWindowsExplorerStyleBrowser = eSingle_LIST_STYLE;
  1683. #endif
  1684. _uiMPEG4ProcessedFileAddr = (UINT32)-1; //Invalidate AVI index
  1685. // for explorer style browser only.
  1686. SHARED_INFO.uExplorerStyleBrowserPlayMode = eSingleFolder;
  1687. SHARED_INFO.bDisplayLogoWhenPlayAudioOnlySteam = 1;
  1688. memset(&SHARED_INFO.cieCurrClip, 0, sizeof(ClipInfoEx));
  1689. // Acquire the current Playback-Mode
  1690. g_pClipsNav->m_uCurrPlaybackMode= PM_GetPlaybackMode();
  1691. gcs.pstate= PST_STOP; // Currently in STOP mode
  1692. #if defined(SDRAM_2X16MBITS) && !defined(NEW_2X16M_MAPPING)
  1693. Logo_display(); // Flush logo again, due to mp3,jpeg R1 address is different with others
  1694. #endif
  1695. #ifdef SUPPORT_TWO_LOGOS
  1696. #ifdef CLIPS_DISPLAY_BACKGROUND
  1697. PE_Clips_DisplayBackground();
  1698. #else
  1699. PE_Clips_DisplayLogo();
  1700. #endif //CLIPS_DISPLAY_BACKGROUND
  1701. #endif
  1702. return;
  1703. }
  1704. /////////////////////////////////////////////////////////////////////////////
  1705. // destructor()
  1706. //
  1707. // Description: Destroys the Clips Navigator.
  1708. //
  1709. // Input: None
  1710. // Output: None
  1711. // In/Out: None
  1712. // Return: None
  1713. //
  1714. // Remarks: None
  1715. static void destructor()
  1716. {
  1717. dbg_printf(("Clips_destructor()n"));
  1718. if (NULL != g_pClipsNav) {
  1719. #ifdef CLIPS_JPEG_DIGEST_SUPPORT
  1720. if (g_pClipsNav->m_bDigestMode)
  1721. _terminateDigestMode();
  1722. #endif //CLIPS_JPEG_DIGEST_SUPPORT
  1723. timer_service_disable(g_pClipsNav->m_hPresentationTimer);
  1724. timer_service_delete(g_pClipsNav->m_hPresentationTimer);
  1725. if (0 != SHARED_INFO.uCurrentClipNumber) 
  1726. {
  1727. #ifdef I77_COMPANION_CHIP
  1728. if (eClipType_JPEG == (gns.clips.cieCurrClip).ciInfo.eType)
  1729. {
  1730. JPEGClip_BeforeAbort();
  1731. }
  1732. #endif
  1733. Clip_abortPlayback(ClipsRepository_getInstanceAt(SHARED_INFO.uCurrentClipNumber-1),
  1734.    FALSE);
  1735. }
  1736. // Release the Clips-List
  1737. Clips_removeAllClips();
  1738. ClipsRepository_destruct();
  1739. Browser_Destruct();
  1740. PM_InitializeProgramList();   
  1741.       
  1742. g_pClipsNav->m_eClipsListStatus= (UINT8)eCLS_Uninitialized;
  1743. free(g_pClipsNav);
  1744. g_pClipsNav= NULL;
  1745. }
  1746. // Reset the Playback Mode
  1747. PM_SetPlaybackMode(PM_PLAYBACK_NORMAL);
  1748. //clear repeat mode
  1749.    PM_ClearRepeat();
  1750. // Reset the settings of the Global variables
  1751. SHARED_INFO.uClipsCnt= 0;
  1752. SHARED_INFO.uCurrentClipNumber= 0;
  1753. SHARED_INFO.iCurrentTime= 0;
  1754. SHARED_INFO.uTotalPlaybackTime= 0;
  1755. memset(&SHARED_INFO.cieCurrClip, 0, sizeof(ClipInfoEx));
  1756. // <<< SEC BK.LIM101303: Search first file if  Root dose not have any file list to play
  1757. #ifdef EXINO2
  1758. #ifdef MP3_SUBFOLDER_AUTOPLAY
  1759. if(g_bClipsAutoplay)
  1760. g_bClipsAutoplay = FALSE;
  1761. #endif
  1762. #endif
  1763. // >>>
  1764. #ifndef SUPPORT_TWO_LOGOS
  1765. PE_Clips_DisplayLogo();
  1766. #endif
  1767. return;
  1768. }
  1769. void ClipsSysStateReset( void )
  1770. {
  1771. destructor();
  1772. constructor();
  1773. }
  1774. /////////////////////////////////////////////////////////////////////////////
  1775. // invokePlayback()
  1776. //
  1777. // Description: Invokes playback of the current Clip on the Playlist.
  1778. //
  1779. // Input: None
  1780. // Output: None
  1781. // In/Out: None
  1782. // Return: TRUE if playback was started successfully; FALSE otherwise.
  1783. //
  1784. // Remarks:
  1785. // The method extracts the information for the current Clip from the Playlist,
  1786. // and then computes the size of the Clip.
  1787. static BOOL invokePlayback(BOOL bOverrideTransition)
  1788. {
  1789. UINT16 uClipNum;
  1790. UINT16 hClipInstance;
  1791. const ClipMarker *pResumeMarker;
  1792. // WCHAR szTempFilename[SC_CLIPS_CURRENT_FILENAME_SZ*2];
  1793. if (0 == SHARED_INFO.uCurrPlaylistItem) {
  1794. tr_printf(("FATAL: invokePlayback() Failed [1]n"));
  1795. return FALSE;
  1796. }
  1797. // Retrieve the Clip-Info corresponding to the Play-Item to play
  1798. uClipNum= PM_GetProgramListEntry(SHARED_INFO.uCurrPlaylistItem);
  1799. hClipInstance= ClipsRepository_getInstanceAt(uClipNum-1);
  1800. if (NULL == hClipInstance) {
  1801. tr_printf(("FATAL: invokePlayback() Failed [2]n"));
  1802. return FALSE;
  1803. }
  1804. SHARED_INFO.iScanSpeed = 0;
  1805. // If there is any caching in progress, then abort it (unless the Clip to
  1806. // play is the one being cached).
  1807. if ((NULL != g_pClipsNav->m_hCachedClip) &&
  1808. (eCS_Finished != Clip_getStatus(g_pClipsNav->m_hCachedClip)) &&
  1809. (hClipInstance != g_pClipsNav->m_hCachedClip))
  1810. {
  1811. Clip_abortPlayback(g_pClipsNav->m_hCachedClip, TRUE);
  1812. }
  1813. // Invalidate any Caching
  1814. g_pClipsNav->m_hCachedClip= NULL;
  1815. // Unconditionally override Transition-Effect if there is Clip-Type change
  1816. if (Clip_getType(hClipInstance) != (SHARED_INFO.cieCurrClip).ciInfo.eType)
  1817. {
  1818. #ifdef I77_COMPANION_CHIP
  1819. #ifdef I77_BRAIN_STORM
  1820. if( gcst.hd_jpeg_mode_preference != SD_JPEG_MODE )
  1821. #else
  1822. if( gps->hd_jpeg_mode_preference != SD_JPEG_MODE )
  1823. #endif
  1824. {
  1825. if(eClipType_JPEG == (SHARED_INFO.cieCurrClip).ciInfo.eType)
  1826. DEC_JPEG_End_Resolution();
  1827. }
  1828. #endif
  1829. bOverrideTransition= TRUE;
  1830. PE_Clips_DisplayLogo();
  1831. }
  1832. // Cancel Presentation-Mode
  1833. g_pClipsNav->m_bPresentationMode= FALSE;
  1834. // Acquire the Clip-Information for the new Clip
  1835. (SHARED_INFO.cieCurrClip).eClipStatus= (UINT8)eCS_Idle;
  1836. // Clip_getFileInfo(hClipInstance, &(SHARED_INFO.cieCurrClip).ciInfo);
  1837. Clip_getCurrFileInfo(hClipInstance, &(SHARED_INFO.cieCurrClip).ciInfo);
  1838. #ifdef SUPPORT_FLASH_CARD
  1839. if(IS_PLAYING_CARD)
  1840. {
  1841. STRUCT_FILE *pfile = FCU_TEMP_FILE_STRCUT_ADDR;
  1842. FileSys_FileOpen(pfile, Clips_GetCurrClipSartAddr(), 0, Clips_GetCurrClipSize());
  1843. }
  1844. #endif
  1845. #ifdef CLIPS_ACQUIRE_EXTENDED_INFO
  1846. //if (uClipNum != SHARED_INFO.uCurrentClipNumber) {
  1847. //fix the but that the sample rate of first trace is incorrect. ZCH SeanLui 0420
  1848. if ((uClipNum != SHARED_INFO.uCurrentClipNumber) || ((SHARED_INFO.uCurrentClipNumber == 1) && ((SHARED_INFO.cieCurrClip).bIsExtendedInfoAvailable == FALSE)) )
  1849. {
  1850. //Angie_0810_2004:Move the MP3 and WMA extend info from gns to SCPAD for I86 memory reducing.
  1851. if(gns.clips.cieCurrClip.ExtInfo_sc_handle == NULL)
  1852. gns.clips.cieCurrClip.ExtInfo_sc_handle = SC_CLIPS_EXTINFO_ADDR;
  1853. (SHARED_INFO.cieCurrClip).bIsExtendedInfoAvailable=
  1854. Clip_getExtendedInfo(hClipInstance, gns.clips.cieCurrClip.ExtInfo_sc_handle);
  1855. //LeonHe_2005_0519: Jump out directly when Failed to read the MP3 Head.
  1856. if(isFailedToReadMP3Head)
  1857. {
  1858. isFailedToReadMP3Head = FALSE;//Clear the Flag
  1859. return FALSE;
  1860. }
  1861. }
  1862. #else
  1863. (SHARED_INFO.cieCurrClip).bIsExtendedInfoAvailable= FALSE;
  1864. #endif //CLIPS_ACQUIRE_EXTENDED_INFO
  1865. // Move into Playback State
  1866. if (PST_PAUSE == gcs.pstate) {
  1867. #ifdef CLIPS_PROHIBIT_PAUSE_ACROSS_ITEM_BOUNDARIES
  1868. // For Still-Images, force Persistent-Pause
  1869. if (!Clip_hasAttribute(hClipInstance, eCA_StillImage))
  1870. gcs.pstate= PST_PLAY;
  1871. #endif //CLIPS_PROHIBIT_PAUSE_ACROSS_ITEM_BOUNDARIES
  1872. }
  1873. else if ((PST_STILL != gcs.pstate) || 
  1874.  !Clip_hasAttribute(hClipInstance, eCA_StillImage)) 
  1875. {
  1876. gcs.pstate= PST_PLAY;
  1877. }
  1878. // Initiate Error-Recovery 
  1879. (g_pClipsNav->m_ErrorRecoveryInfo).uRetryCount= CLIPS_ERROR_RECOVERY_RETRY_COUNT;
  1880. // If the current Clip isn't a Still-Image, display the Logo or Background
  1881. if ( !Clip_hasAttribute(hClipInstance, eCA_StillImage) 
  1882.     && ( eClipType_MPEG != Clip_getType(hClipInstance) )
  1883. && ( eClipType_AVI != Clip_getType(hClipInstance) )
  1884. #ifdef IS_ASF_CAPABLE
  1885. && ( eClipType_ASF != Clip_getType(hClipInstance) )
  1886. #endif
  1887. #ifdef IS_MP4_CAPABLE
  1888. && ( eClipType_MP4 != Clip_getType(hClipInstance) )
  1889. #endif
  1890.     && SHARED_INFO.bDisplayLogoWhenPlayAudioOnlySteam) {
  1891. #ifdef CLIPS_DISPLAY_BACKGROUND
  1892. PE_Clips_DisplayBackground();
  1893. #else
  1894. PE_Clips_DisplayLogo();
  1895. #endif //CLIPS_DISPLAY_BACKGROUND
  1896. }
  1897. else {
  1898. #ifdef CLIPS_DISPLAY_BACKGROUND
  1899. if ( ( eClipType_MPEG != Clip_getType(hClipInstance) ) && 
  1900.  ( eClipType_AVI != Clip_getType(hClipInstance) )
  1901. #ifdef IS_ASF_CAPABLE
  1902. && ( eClipType_ASF != Clip_getType(hClipInstance) )
  1903. #endif
  1904. #ifdef IS_MP4_CAPABLE
  1905. && ( eClipType_MP4 != Clip_getType(hClipInstance) )
  1906. #endif
  1907. )
  1908. // Clear the Background for a Still-Image
  1909. PE_Clips_ClearBackground();
  1910. #endif //CLIPS_DISPLAY_BACKGROUND
  1911.   }
  1912. //FW0329_2005A Upate before activate subtitle menu. Fix null instance when press NEXT
  1913. //Robin_1112_2004, for display the clip list menu if can't auto playback the first clip
  1914. SHARED_INFO.uCurrentClipNumber= uClipNum;
  1915. // Check if the playback needs to be resumed, or not
  1916. if ((ULONG)-1 != (g_pClipsNav->m_cmResumeMarker).dwAddress)
  1917. pResumeMarker= &g_pClipsNav->m_cmResumeMarker;
  1918. else
  1919. pResumeMarker= NULL;
  1920. // <<< Robin_0903_2004
  1921. #ifdef DIVX_SUPPORT_MULTI_SUBTITLE_MODE0
  1922. if (((eClipType_AVI == Clip_getType(hClipInstance))
  1923. #ifdef IS_ASF_CAPABLE
  1924. || (eClipType_ASF == Clip_getType(hClipInstance))
  1925. #endif
  1926. #ifdef IS_MP4_CAPABLE
  1927. || (eClipType_MP4 == Clip_getType(hClipInstance))
  1928. #endif
  1929. )  && ((SHARED_INFO.cieCurrClip).ciInfo.wSubFileCnt > 1) && 
  1930. (bNeedWaitForUI == TRUE))
  1931. {
  1932. ie_send_ex(IE_UI_DIVX_EXTERNAL_SUBTITLE_SELECTION, 0);
  1933. Set_SubFile_Count(((SHARED_INFO.cieCurrClip).ciInfo.wSubFileCnt));
  1934. gcs.pstate = PST_WAIT_UI; // RB_TBD
  1935. return TRUE;
  1936. }
  1937. #endif
  1938. // >>> Robin_0903_2004
  1939. if ((eClipType_AVI == Clip_getType(hClipInstance))
  1940. #ifdef IS_ASF_CAPABLE
  1941. || (eClipType_ASF == Clip_getType(hClipInstance))
  1942. #endif
  1943. #ifdef IS_MP4_CAPABLE
  1944. || (eClipType_MP4 == Clip_getType(hClipInstance))
  1945. #endif
  1946.  )
  1947. {
  1948. //Prohibit continuously do the skipf and skpb for AVI, and it will be set after calling the Clip_startPlayback if allowed
  1949. CLEAR_COP_MASK(COP_NEXT_CHAPTER);
  1950. CLEAR_COP_MASK(COP_PREVIOUS_CHAPTER);
  1951. CLEAR_COP_MASK(COP_PAUSE);
  1952. CLEAR_COP_MASK(COP_STEP);
  1953. CLEAR_COP_MASK(COP_SCAN | COP_SCAN_BACKWARD );
  1954. #ifndef AVI_FF_NO_INDEX
  1955. // If this is an AVI file in which the idx processing failed, don't allow resuming
  1956. if(FALSE == _bMPEG4TrickModeOn)
  1957. pResumeMarker = NULL;
  1958. #endif
  1959. }else
  1960. {
  1961. //Invalidate MPEG4 index
  1962. _uiMPEG4ProcessedFileAddr= (UINT32)-1;
  1963. }
  1964. // Override the Transition-Effect, if required
  1965. if (bOverrideTransition) {
  1966. Clip_setTransitionEffect(hClipInstance, eCTE_None);
  1967. SHARED_INFO.eCurrentTransition=eCTE_None;//angieh_0822_2003_A Override the Transition-Effect.
  1968. }
  1969. else {
  1970. Clip_setTransitionEffect(hClipInstance, SHARED_INFO.eCurrentTransition);
  1971. }
  1972. // Start/Resume Playback
  1973. if (!Clip_startPlayback(hClipInstance, pResumeMarker, FALSE)) {
  1974. dbg_printf(("WARNING: invokePlayback() Failed [3]: Cannot play clip.n"));
  1975. #ifdef DIVX_SUPPORT_MULTI_SUBTITLE_MODE0
  1976. bNeedWaitForUI = FALSE;
  1977. #endif
  1978. return FALSE;
  1979. }
  1980. // Clear any Resume Marker
  1981. (g_pClipsNav->m_cmResumeMarker).dwAddress= (ULONG)-1;
  1982. // Update the shared info for the current Clip
  1983. // SHARED_INFO.uCurrentClipNumber= uClipNum;
  1984. SHARED_INFO.iCurrentTime= (int)Clip_getTime(hClipInstance);
  1985. SHARED_INFO.eCurrentAngle= (UINT8)Clip_getOrientation(hClipInstance);
  1986. #ifdef MANUAL_DIRECTORY_EXPLORER
  1987. notifyUIOnBrowserContentChange(eCLIPS_UPDATE_NONE, eCLIPS_UPDATE_INDEX);
  1988. #endif
  1989. ie_send(IE_UI_CLIPS_CLEAR_UI);
  1990. if ((eClipType_AVI == Clip_getType(hClipInstance))
  1991. #ifdef IS_ASF_CAPABLE
  1992. || (eClipType_ASF == Clip_getType(hClipInstance))
  1993. #endif
  1994. #ifdef IS_MP4_CAPABLE
  1995. || (eClipType_MP4 == Clip_getType(hClipInstance))
  1996. #endif
  1997.  )
  1998.  {
  1999.   SET_COP_MASK(COP_PAUSE);
  2000. SET_COP_MASK(COP_STEP);
  2001.  }
  2002. if(IsGotoNextChapterAllowed())
  2003. SET_COP_MASK(COP_NEXT_CHAPTER);
  2004. else
  2005. CLEAR_COP_MASK(COP_NEXT_CHAPTER);
  2006. if (IsGotoPreviousChapterAllowed())
  2007. SET_COP_MASK(COP_PREVIOUS_CHAPTER);
  2008. else
  2009. CLEAR_COP_MASK(COP_PREVIOUS_CHAPTER);
  2010. if (Clip_hasAttribute(hClipInstance, eCA_Zoomable))
  2011. SET_COP_MASK(COP_ZOOM);
  2012. else
  2013. CLEAR_COP_MASK(COP_ZOOM);
  2014. if (Clip_hasAttribute(hClipInstance, eCA_Scanable))
  2015. SET_COP_MASK( COP_SCAN | COP_SCAN_BACKWARD );
  2016. else
  2017. CLEAR_COP_MASK(COP_SCAN | COP_SCAN_BACKWARD );
  2018. if (Clip_hasAttribute(hClipInstance, eCA_Slowable))
  2019. SET_COP_MASK(COP_STEP | COP_SLOW );
  2020. else
  2021. CLEAR_COP_MASK(COP_STEP | COP_SLOW);
  2022. if ( Clip_hasAttribute(hClipInstance, eCA_Markable))
  2023. SET_COP_MASK( COP_ABREPEAT | COP_TIME_PLAY );
  2024. else
  2025. CLEAR_COP_MASK( COP_ABREPEAT | COP_TIME_PLAY );
  2026. // Renew Pause
  2027. if (PST_PAUSE == gcs.pstate)
  2028. OnStop(ePause);
  2029. // dbg_printf(("Playing clip: %sn", DBG_W2A((SHARED_INFO.cieCurrClip).ciInfo.szFilename)));
  2030. // memset(szTempFilename, 0, sizeof(szTempFilename));
  2031. // sc_GetBytes(SC_CLIPS_CURRENT_FILENAME_ADDR, (WORD)0, (WORD)(SC_CLIPS_CURRENT_FILENAME_SZ*4), (BYTE*)szTempFilename);
  2032. // dbg_printf(("Playing clip: %sn", DBG_W2A(szTempFilename));
  2033. return TRUE;
  2034. }
  2035. /////////////////////////////////////////////////////////////////////////////
  2036. // computePlaylistItem()
  2037. //
  2038. // Description: Computes the next/previous Playlist-Item to play.
  2039. //
  2040. // Input: uCurrItem - The index of the current Item, as a reference;
  2041. // bNext - Indicates whether to compute the Next Item, or Previous.
  2042. // Output: None
  2043. // In/Out: None
  2044. // Return: The 1-based index in the Play-List of the requested Item; Zero if 
  2045. // there is no such Item.
  2046. //
  2047. // Remarks:
  2048. // The Item is selected based on the setting of the Playback-Filter, 
  2049. // if one is in effect.
  2050. static UINT16 computePlaylistItem(UINT16 uCurrItem, BOOL bNext)
  2051. {
  2052. UINT16 uPos, uRequestedItem;
  2053. UINT16 uClipNumber, hClipInstance;
  2054. UINT16 uProgramSize= PM_GetProgramSize();
  2055. if (0 == uProgramSize)
  2056. return 0;
  2057. uRequestedItem= 0;
  2058. // Initialize the search, according to the selected direction
  2059. if((eWINDOWS_EXPLORER_STYLE == SHARED_INFO.eWindowsExplorerStyleBrowser)
  2060.    && eSingleItem == SHARED_INFO.uExplorerStyleBrowserPlayMode)
  2061. uPos= uCurrItem;
  2062.    else   
  2063. if (PM_IsRepeatSingle()) 
  2064. uPos= uCurrItem;
  2065. else
  2066. uPos= uCurrItem + (bNext ? 1 : -1);
  2067. while (TRUE) 
  2068. {
  2069. // Check the termination condition
  2070. if ( (bNext && (uPos > (uProgramSize - 1))) ||
  2071.  (!bNext && (uPos == 0)) )
  2072. {
  2073. break;
  2074. }
  2075. // Acquire the Clip-Instance corresponding to the current Item
  2076. uClipNumber= PM_GetProgramListEntry(uPos);
  2077. hClipInstance= ClipsRepository_getInstanceAt(uClipNumber-1);
  2078. if (NULL != hClipInstance) {
  2079. // Examine the Clip's Type to see if it is included in the Playback Filter
  2080. if (g_uPlaybackFilter & (UINT16)Clip_getType(hClipInstance)) {
  2081. if ( ( ( SHARED_INFO.bIsIntroPlayMode ) && ( Clip_getType(hClipInstance) == eClipType_MP3 ) )
  2082. || ( !SHARED_INFO.bIsIntroPlayMode ) 
  2083. || (eWINDOWS_EXPLORER_STYLE == SHARED_INFO.eWindowsExplorerStyleBrowser)) // allow JPEG intro mode, ...
  2084. {
  2085. uRequestedItem= uPos;
  2086. break;
  2087. }
  2088. }
  2089. }
  2090. // Move to the next/previous Item
  2091. uPos += (bNext ? 1 : -1);
  2092. }
  2093. return uRequestedItem;
  2094. }
  2095. /////////////////////////////////////////////////////////////////////////////
  2096. // cancelRepeatModes()
  2097. //
  2098. // Description: Cancels the specific Repeat-Modes, if any exist.
  2099. //
  2100. // Input: uModesMask - A mask specifying which Repeat-Modes to cancel
  2101. // Output: None
  2102. // In/Out: None
  2103. // Return: None
  2104. //
  2105. // Remarks: None
  2106. static void cancelRepeatModes(BYTE uModesMask)
  2107. {
  2108. BOOL bRepeatModeChanged= FALSE;
  2109. // Cancel "Repeat Single" if it is in effect
  2110. if ((uModesMask & PM_REPEAT_SINGLE) && PM_IsRepeatSingle()) {
  2111. PM_SetRepeatSingle(FALSE);
  2112. bRepeatModeChanged= TRUE;
  2113. }
  2114. // Cancel "Repeat All" if it is in effect
  2115. if ((uModesMask & PM_REPEAT_ALL) && PM_IsRepeatAll()) {
  2116. PM_SetRepeatAll(FALSE);
  2117. bRepeatModeChanged= TRUE;
  2118. }
  2119. // Cancel "Repeat Folder" if it is in effect
  2120. if ((uModesMask & PM_REPEAT_FOLDER) && PM_IsRepeatFolder()) {
  2121. PM_SetRepeatFolder(FALSE);
  2122. bRepeatModeChanged= TRUE;
  2123. }
  2124. if ((uModesMask & PM_REPEAT_AB_MASK) && (0 != PM_GetRepeatAB())) {
  2125. PM_SetRepeatAB(0);
  2126. OnCancelABRepeat();
  2127. bRepeatModeChanged= TRUE;
  2128. }
  2129. if (bRepeatModeChanged)
  2130. ie_send(IE_UI_STATE_CHANGE);
  2131. return;
  2132. }
  2133. /////////////////////////////////////////////////////////////////////////////////////////////////
  2134. // Event Handlers
  2135. /////////////////////////////////////////////////////////////////////////////
  2136. // OnFindClips()
  2137. //
  2138. // Description: A handler for the IE_CDNAV_RENDEZVOUS Event.
  2139. //
  2140. // Input: uTypesToFind - A bitwise-OR combination of the Clip-Types to find
  2141. // Output: None
  2142. // In/Out: None
  2143. // Return: None
  2144. //
  2145. // Remarks:
  2146. // This handler is responsible for automatically collecting Clips of some
  2147. // Types.
  2148. // It is triggered by a call to Clips_findClips().
  2149. static void OnFindClips(UINT16 uTypesToFind)
  2150. {
  2151. BOOL bCWD_Established= TRUE;
  2152. ClipsRepository_setTypeFilter(uTypesToFind);
  2153. // init the Clips-List
  2154. ClipsRepository_clear();
  2155. // Set the appropriate Working-Directory for the search:
  2156. // Switch the the Root directory
  2157. if (!FileSys_goToRootDir()) {
  2158. tr_printf(("FATAL: OnFindClips() Failed [1]: Cannot access the Root Directory.n"));
  2159. bCWD_Established= FALSE;
  2160. }
  2161. // For Picture-CD, enter the "PICTURES" directory
  2162. if (bCWD_Established &&
  2163. (DEC_DISC_TYPE_PICTURE_CD == g_disc_type) &&
  2164. !FileSys_changeDir(L"PICTURES"))
  2165. {
  2166. tr_printf(("FATAL: OnFindClips() Failed [2]: Cannot access 'PICTURES' Directory.n"));
  2167. bCWD_Established= FALSE;
  2168. }
  2169. if(!bCWD_Established)
  2170. {
  2171. tr_printf(("FATAL: OnFindClips() Failed [3]n"));
  2172. }
  2173. #ifdef MANUAL_DIRECTORY_EXPLORER
  2174. if(eWINDOWS_EXPLORER_STYLE == SHARED_INFO.eWindowsExplorerStyleBrowser)
  2175.         {
  2176. #if defined (EXINO2) && defined(MP3_SUBFOLDER_AUTOPLAY)
  2177. if(g_bClipsAutoplay)
  2178. Browser_Build(eBuildAll, FALSE);
  2179. else
  2180. #endif 
  2181. #ifndef OPEN_CLIPS_AFTER_ONFINDCLIPS_COMPLETED
  2182.   Browser_Build(eBuildAll, TRUE);
  2183. #else
  2184. Browser_Build(eBuildAll, FALSE);
  2185. ie_send(IE_UI_CLOSE_MENU);
  2186. //MikeLv_0715 add this for auto play KODAK picture CD in directory_explorer mode.
  2187. #ifdef D_AUTO_PLAY_KODAK_PICTURE_CD_IN_BROWSER_MODE
  2188. if(DEC_DISC_TYPE_PICTURE_CD == g_disc_type)
  2189. {
  2190. if (! invokePlayback(FALSE)) 
  2191. {
  2192. tr_printf(("FATAL:OnFindClips()[4]:  Failed to play-backn"));
  2193. gcs.pstate= PST_STOP;
  2194. return;
  2195. }
  2196. }
  2197. #endif
  2198. #endif
  2199. }
  2200. else
  2201. #endif
  2202. {
  2203. ArrayInitBound(SHARED_INFO.hDirsArray[0], 0);
  2204. // Start a recursive search for Clips, starting at the current directory
  2205. _findAndAddClips(CLIPS_MAX_PROGRAM_SIZE, TRUE);
  2206. ArrayInitBound(SHARED_INFO.hDirsArray[0], 0);
  2207. // Finalize the Clips-List
  2208. Clips_finalizeClipsList();
  2209. #ifdef SUPPORT_FLASH_CARD
  2210. if(!IS_PLAYING_CARD)
  2211. #endif
  2212. FileSys_close(); //MikeX_1125_2003: free scratch pad after searching clips
  2213. #ifdef MANUAL_DIRECTORY_EXPLORER
  2214. notifyUIOnBrowserContentChange(eCLIPS_UPDATE_ALL, eCLIPS_UPDATE_ALL);
  2215. #endif
  2216. }
  2217. return;
  2218. }
  2219. /////////////////////////////////////////////////////////////////////////////
  2220. // OnTick()
  2221. //
  2222. // Description: A handler for the IE_CORE_TICK_250 Event.
  2223. //
  2224. // Input: None
  2225. // Output: None
  2226. // In/Out: None
  2227. // Return: None
  2228. //
  2229. // Remarks:
  2230. // This handler is responsible for issuing an IE_CORE_CDNAV_FINISHED Event.
  2231. // The handler checks whether the playback of the current Item has finished
  2232. // by examining both the Drive's status and the fullness of the Audio-Code
  2233. // buffer.
  2234. static void OnTick()
  2235. {
  2236. UINT16 hClipInstance;
  2237. enClipStatus eStatus;
  2238. int currentTime;
  2239. #ifdef V882_FLASH_CARD
  2240. if(TRUE == FlashCard_IsCardRemoved()){
  2241. if(PST_STOP != gcs.pstate){
  2242. OnStop(eFullStop);
  2243.       }
  2244. return;
  2245.    }
  2246. #endif
  2247. if (0 == SHARED_INFO.uCurrentClipNumber)
  2248. return;
  2249. #ifdef CLIPS_JPEG_DIGEST_SUPPORT
  2250. // Nothing to do in Digest Mode except check if new line ready to copy
  2251. if (g_pClipsNav->m_bDigestMode)
  2252. {
  2253. if( TRUE == DEC_JPEG_IsNewLineReady() )
  2254. {
  2255. DEC_JPEG_DecodeDoneCheck();
  2256. }
  2257. return;
  2258. }
  2259. #endif //CLIPS_JPEG_DIGEST_SUPPORT
  2260. if(IsGotoNextChapterAllowed())
  2261. SET_COP_MASK(COP_NEXT_CHAPTER);
  2262. else
  2263. CLEAR_COP_MASK(COP_NEXT_CHAPTER);
  2264. if (IsGotoPreviousChapterAllowed())
  2265. SET_COP_MASK(COP_PREVIOUS_CHAPTER);
  2266. else
  2267. CLEAR_COP_MASK(COP_PREVIOUS_CHAPTER);
  2268. hClipInstance= ClipsRepository_getInstanceAt(SHARED_INFO.uCurrentClipNumber-1);
  2269. // Refersh the current Clip
  2270. Clip_refresh(hClipInstance);
  2271. // Refresh any Cached Clip
  2272. if (NULL != g_pClipsNav->m_hCachedClip)
  2273. Clip_refresh(g_pClipsNav->m_hCachedClip);
  2274. // Update the current Clip-Time
  2275. {
  2276. int backup;
  2277. backup = SHARED_INFO.iCurrentTime;
  2278. SHARED_INFO.iCurrentTime = (int)Clip_getTime(hClipInstance);
  2279. if( ((SHARED_INFO.iScanSpeed > 0) && (backup > SHARED_INFO.iCurrentTime)) || PST_STOP == gcs.pstate )// Robin_0604_2004_B
  2280. {
  2281. SHARED_INFO.iCurrentTime = backup;
  2282. }
  2283. }
  2284. #ifdef D_ENABLE_JPEG_CACHE
  2285. //get caching/cached clip status
  2286. if((hClipInstance != g_pClipsNav->m_hCachedClip)&&(NULL != g_pClipsNav->m_hCachedClip))
  2287. {
  2288. if( (eCS_Finished == Clip_getStatus(g_pClipsNav->m_hCachedClip))
  2289. && (PST_STOP != gcs.pstate)
  2290. #ifdef CLIPS_JPEG_DIGEST_SUPPORT
  2291. &&(!g_pClipsNav->m_bDigestMode)
  2292. #endif
  2293. &&(!g_pClipsNav->m_bPresentationMode) )
  2294. {
  2295. _onPresentationFinished();
  2296. }
  2297. }
  2298. #endif
  2299. //get current clip status
  2300. eStatus= Clip_getStatus(hClipInstance);
  2301. if (eCS_Finished == eStatus) {
  2302. // Detect Playback-finish
  2303. if ((PST_STOP != gcs.pstate && PST_WAIT_UI != gcs.pstate) &&
  2304. #ifdef CLIPS_JPEG_DIGEST_SUPPORT
  2305. !g_pClipsNav->m_bDigestMode &&
  2306. #endif //CLIPS_JPEG_DIGEST_SUPPORT
  2307. !g_pClipsNav->m_bPresentationMode)
  2308. {
  2309. dbg_printf(("Finished playback.n"));
  2310. ie_send(IE_CORE_CDNAV_FINISHED);
  2311. }
  2312. }
  2313. else {
  2314. // Skip to next intro item
  2315. if ( ( SHARED_INFO.bIsIntroPlayMode ) && ( SHARED_INFO.iCurrentTime >= CLIPS_INTRO_PLAY_TIME ) )
  2316.       {
  2317. OnPlaybackFinished();
  2318. #ifdef MANUAL_DIRECTORY_EXPLORER
  2319. SHARED_INFO.iCurrentTime = 0; //BillTang_0714_2004: to avoid problem in EXPLORER clips menu
  2320. #endif
  2321.        return;
  2322. }
  2323. // Perform error recovery in case needed
  2324. PerformErrorRecovery(hClipInstance, eStatus);
  2325. }
  2326. // Take care of A2B Mode for MP3 Clips
  2327. if (PM_GetRepeatAB() & PM_REPEAT_AB_B){
  2328. if(SI_IS_CURRENT_MPEG_CLIP){
  2329. DWORD dwCurrentLocation = PE_CD_GetCurrentLocation();
  2330. if ( dwCurrentLocation > (g_pClipsNav->m_PositionB.dwAddress ) ){
  2331. UINT32 Param= ((UINT32)ePositionB << 16);
  2332. ie_send_ex(IE_CORE_CDNAV_RENDEZVOUS, (void *)Param);
  2333. }
  2334. }else{
  2335. currentTime = gns.clips.iCurrentTime;
  2336. if (  currentTime> (g_pClipsNav->m_PositionB.uTime) ){
  2337. UINT32 Param= ((UINT32)ePositionB << 16);
  2338. ie_send_ex(IE_CORE_CDNAV_RENDEZVOUS, (void *)Param);
  2339. }
  2340. }
  2341. }else{
  2342. if ( PM_REPEAT_AB_A && PM_GetRepeatAB()){
  2343. if ( g_pClipsNav->m_PositionA.uClipNumer != gns.clips.uCurrentClipNumber )
  2344. cancelRepeatModes(PM_REPEAT_AB_MASK);
  2345. }
  2346. }
  2347. return;
  2348. }
  2349. /////////////////////////////////////////////////////////////////////////////
  2350. // OnPlay()
  2351. //
  2352. // Description: A handler for the IE_CORE_PLAY Event.
  2353. //
  2354. // Input: None
  2355. // Output: None
  2356. // In/Out: None
  2357. // Return: None
  2358. //
  2359. // Remarks: None
  2360. static void OnPlay()
  2361. {
  2362. BOOL bOverrideTransition= FALSE;
  2363. dbg_printf(("OnPlay()n"));
  2364. #ifdef I77_COMPANION_CHIP
  2365. // andyc: check and makesure SPDIF is N'Sync
  2366. {
  2367. extern BOOL I77_resetSpdifIfNeeded(void);
  2368. I77_resetSpdifIfNeeded() ;
  2369. }
  2370. // andyc: check and makesure SPDIF is N'Sync
  2371. #endif//I77_COMPANION_CHIP
  2372. // Verify the necessity to actually invoke playback
  2373. if (PST_PLAY == gcs.pstate) {
  2374. dbg_printf(("Already in Playback state. Ignored.n"));
  2375. return;
  2376. }
  2377. #ifdef CLIPS_JPEG_DIGEST_SUPPORT
  2378. // Terminate Digest-Mode, if it is in effect
  2379. if (g_pClipsNav->m_bDigestMode) {
  2380. bOverrideTransition= TRUE;
  2381. _terminateDigestMode();
  2382. }
  2383. #endif //CLIPS_JPEG_DIGEST_SUPPORT
  2384. #ifdef CLIPS_WMA_STOPRESUME_PATCH
  2385. if( (PST_PAUSE == gcs.pstate) ||
  2386. ( (eClipType_WMA== (gns.clips.cieCurrClip).ciInfo.eType)&&(gcs.pstate == PST_STOP)&&
  2387. ((ULONG)-1 != (g_pClipsNav->m_cmResumeMarker).dwAddress) ) )
  2388. #else
  2389. // If the current state is Pause, then resume playback
  2390. if( PST_PAUSE == gcs.pstate )
  2391. #endif
  2392. {
  2393. UINT16 hClipInstance= ClipsRepository_getInstanceAt(SHARED_INFO.uCurrentClipNumber-1);
  2394. gcs.pstate = PST_PLAY;
  2395. if (Clip_hasAttribute(hClipInstance, eCA_StillImage) )
  2396.        {
  2397.        if( TRUE == g_pClipsNav->m_bPresentationMode)
  2398. _onPresentationFinished();
  2399.       }
  2400. else
  2401. {
  2402.        Clip_pausePlayback(hClipInstance, FALSE);
  2403. }
  2404. return;
  2405. }
  2406. else if (PST_STOP == gcs.pstate) {
  2407. bOverrideTransition= TRUE;
  2408. }
  2409. //Cancel Scan Mode
  2410. if ( PST_SCAN == gcs.pstate ){
  2411. OnScan(0);
  2412.         gcs.pstate= PST_PLAY;
  2413. return;
  2414. }
  2415. if ( PST_SLOW == gcs.pstate ) {
  2416. if ( gns.clips.iSlowSpeed > 0 ){
  2417. PE_CD_SetSlowMotion(FALSE, (UINT8)0);
  2418. gcs.pstate= PST_PLAY;
  2419. }
  2420. else
  2421.         {
  2422. OnScan(0);
  2423. gcs.pstate= PST_PLAY;
  2424. }
  2425. return;
  2426. }
  2427. //handle the case pressed 'Play' during still state
  2428. if (PST_STILL == gcs.pstate)
  2429. {
  2430. UINT16 hClipInstance= ClipsRepository_getInstanceAt(SHARED_INFO.uCurrentClipNumber-1);
  2431. //cancel the rotation if exist
  2432. if ( eCIO_Original != Clip_getOrientation(hClipInstance) )
  2433. {
  2434. Clip_setOrientation(hClipInstance, eCIO_Original);
  2435. }
  2436. //Disable the timer to avoid black screen sometime because of timeout.
  2437. //the timer will be enabled again in OnPlaybackFinished automatically after current playback finished
  2438. if(timer_service_is_active(g_pClipsNav->m_hPresentationTimer))
  2439. timer_service_disable(g_pClipsNav->m_hPresentationTimer);
  2440. }
  2441. // <<< Robin_0903_2004
  2442. #ifdef DIVX_SUPPORT_MULTI_SUBTITLE_MODE0
  2443. bNeedWaitForUI = !bNeedWaitForUI;
  2444. #endif
  2445. // >>> Robin_0903_2004
  2446. gcs.pstate= PST_PLAY;
  2447. if (! invokePlayback(bOverrideTransition)) {
  2448. tr_printf(("FATAL: Failed to invoke playbackn"));
  2449. gcs.pstate= PST_STOP;
  2450. }
  2451. return;
  2452. }
  2453. #pragma argsused
  2454. static void OnPresentationTimeExpired(UINT8 hTimer)
  2455. {
  2456. UINT32 Param= ((UINT32)eTimerRendezvous << 16);
  2457. ie_send_ex(IE_CORE_CDNAV_RENDEZVOUS, (void*)Param);
  2458. }
  2459. static void OnGetClipInfoForUI(ClipInfo *o_pClipFileInfo)
  2460. {
  2461. #ifdef MANUAL_DIRECTORY_EXPLORER
  2462. if(SHARED_INFO.iGetClipFileInfoAtNumber <= SUB_DIR_ARRAY_SIZE)
  2463. {
  2464.           Browser_GetFolderInfo(SHARED_INFO.iGetClipFileInfoAtNumber, o_pClipFileInfo, eRIGHT_WINDOW);
  2465.    if(ui_enter_pressed && (SHARED_INFO.iGetClipFileInfoAtNumber != 1))  //vestel's request: no setup after subdir is entered
  2466.    {
  2467.     CLEAR_COP_MASK(COP_SETUP);
  2468. ui_enter_pressed = 0;
  2469.    }
  2470. }
  2471. else
  2472. #endif
  2473. {
  2474. UINT16 hInstance;
  2475.  hInstance = ClipsRepository_getInstanceAt(SHARED_INFO.iGetClipFileInfoAtNumber - 1 - SUB_DIR_ARRAY_SIZE);
  2476. // Make sure that the requested Position is legal
  2477. if (NULL == hInstance) {
  2478. dbg_printf(("WARNING: Clips_getClipFileInfoAt() Failed [1]: Illegal Clip-Number requested.n"));
  2479. o_pClipFileInfo->cbFileSize = eClipInfoNotAvailable;
  2480. return ;
  2481. }
  2482. // Extract the Clip-Info corresponding to the requested Clip
  2483. Clip_getFileInfo(hInstance, o_pClipFileInfo);
  2484. }
  2485. o_pClipFileInfo->cbFileSize = eClipInfoReadyForUI;
  2486. return;
  2487. }
  2488. //////////////////////////////////////////////////////////////////////////////////
  2489. // Function name : OnRendezvous
  2490. //
  2491. // Purpose : Handling the IE_CORE_CDNAV_RENDEZVOUS event
  2492. //
  2493. // Input Parameters : none
  2494. //
  2495. // Return Value : static void
  2496. //
  2497. // Description : checking the Param in order to know which handler to call.
  2498. //////////////////////////////////////////////////////////////////////////////////
  2499. static void OnRendezvous(void *Param)
  2500. {
  2501. enRendezvousType eType;
  2502. UINT32 uParam= (UINT32)Param;
  2503. dbg_printf(("OnRendezvousn"));
  2504. eType= (enRendezvousType)(uParam >> 16);
  2505. if (eFindClipRendezvous == eType) 
  2506. {
  2507. OnFindClips((UINT16)(uParam & 0xFFFF));
  2508. }
  2509. else
  2510. {
  2511. if ( ( ePositionA == eType ) || ( ePositionB == eType ) )
  2512. {
  2513. dbg_printf(("Position%c Encountered.n", (ePositionA == eType) ? 'A' : 'B'));
  2514. if (g_pClipsNav->m_PositionA.uTime != -1)              //Don't jump to point A if the bookmark has already been cleared.
  2515. {
  2516. PE_CD_AbortPlayback(TRUE); // Maintain Standby mode
  2517. memcpy(&(g_pClipsNav->m_cmResumeMarker), &(g_pClipsNav->m_PositionA), sizeof(ClipMarker));
  2518. // <<< Robin_0903_2004
  2519. #ifdef DIVX_SUPPORT_MULTI_SUBTITLE_MODE0
  2520. bNeedWaitForUI = FALSE;
  2521. #endif
  2522. // >>> Robin_0903_2004
  2523. if (!invokePlayback(FALSE)) 
  2524. {
  2525. dbg_printf(("Failed to play-back the current List.n"));
  2526. gcs.pstate= PST_STOP;
  2527. }
  2528. ie_send(IE_UI_STATE_CHANGE);
  2529. }
  2530. }
  2531. else
  2532. {
  2533. #ifdef D_ENABLE_JPEG_CACHE
  2534. UINT16 hClipInstance= ClipsRepository_getInstanceAt(SHARED_INFO.uCurrentClipNumber-1);
  2535. // If there is any caching in progress, only cancel presentation mode
  2536. if ( ((NULL != g_pClipsNav->m_hCachedClip) 
  2537. &&(hClipInstance != g_pClipsNav->m_hCachedClip)
  2538. &&(eCS_Finished != Clip_getStatus(g_pClipsNav->m_hCachedClip))) )
  2539. {
  2540. tr_printf(("npresentation expired while JPEG cachingn"));
  2541. // Cancel Presentation-Mode
  2542. g_pClipsNav->m_bPresentationMode= FALSE;
  2543. }
  2544. else
  2545. #endif
  2546. {
  2547. _onPresentationFinished();
  2548. }
  2549. }
  2550. }
  2551. }
  2552. //////////////////////////////////////////////////////////////////////////////////
  2553. // Function name : _onPresentationFinished
  2554. //
  2555. // Purpose : Performing the playback finished operations only after the 
  2556. // presentation time of the clip is finished.
  2557. //            Determine the next item to play. 
  2558. // Input Parameters : none
  2559. //
  2560. // Return Value : static void 
  2561. //
  2562. // Description : 
  2563. //////////////////////////////////////////////////////////////////////////////////
  2564. static void _onPresentationFinished(void)
  2565. {
  2566. UINT16 uNextItem;
  2567. UINT16 hClipInstance= ClipsRepository_getInstanceAt(SHARED_INFO.uCurrentClipNumber-1);
  2568. tr_printf(("_onPresentationFinished()n"));
  2569. // Force a Full-Stop, just in case
  2570. Clip_abortPlayback(hClipInstance, TRUE);
  2571. // if(eClipType_WMA != SHARED_INFO.cieCurrClip.ciInfo.eType)//no need for WMA since sometime cause massage pool full
  2572. // ie_send(IE_UI_CLIPS_CLEAR_UI); //ZCO LC040703: Clear UI temp messages such as Q1..Q5 etc.
  2573. // Check if the Playback-Mode is "Single Repeat". If so, reschedule playback of the 
  2574. // current Playlist-Item again.
  2575. if (PM_IsRepeatSingle()) {
  2576. // <<< Robin_0903_2004
  2577. #ifdef DIVX_SUPPORT_MULTI_SUBTITLE_MODE0
  2578. bNeedWaitForUI = FALSE;
  2579. #endif
  2580. // >>> Robin_0903_2004
  2581. // Re-invoke playback only if this Clip is not a Still Image
  2582. if (!Clip_hasAttribute(hClipInstance, eCA_StillImage) &&
  2583. !invokePlayback(FALSE)) 
  2584. {
  2585. tr_printf(("FATAL: F_onPresentationFinished() ailed to invoke playbackn"));
  2586. gcs.pstate= PST_STOP;
  2587. }
  2588. //allow change play mode from track repeat to folder normal on the fly.
  2589. if (Clip_hasAttribute(hClipInstance, eCA_StillImage))
  2590. {
  2591. UINT8 uPresentationTime;
  2592. // Collect the Presentation-Time
  2593. uPresentationTime= Clip_getPresentationTime(hClipInstance);
  2594. if (0 != uPresentationTime) 
  2595. {
  2596. // Move to Still
  2597. gcs.pstate= PST_STILL;
  2598. // Engage Presentation-Mode
  2599. g_pClipsNav->m_bPresentationMode= TRUE;
  2600. if (INFINITE_PRESENTATION_TIME != uPresentationTime) {
  2601. dbg_printf(("INFO: Presentation-Timer set to %d seconds.n", uPresentationTime));
  2602. timer_service_set_freq(g_pClipsNav->m_hPresentationTimer, 
  2603.    (1000 * uPresentationTime));
  2604. timer_service_enable(g_pClipsNav->m_hPresentationTimer, TRUE);
  2605. }
  2606. else {
  2607. dbg_printf(("INFO: Infinite Presentation engaged.n"));
  2608. }
  2609. }
  2610. }
  2611. return;
  2612. }
  2613. if(PM_IsPlaybackRandom(PM_GetPlaybackMode()))
  2614. {
  2615. PM_ShuffleProgramList(FALSE, 0);
  2616. SHARED_INFO.uCurrPlaylistItem = 0;
  2617. }
  2618. if((eWINDOWS_EXPLORER_STYLE == SHARED_INFO.eWindowsExplorerStyleBrowser)
  2619.    && eSingleItem == SHARED_INFO.uExplorerStyleBrowserPlayMode)
  2620. {
  2621. SHARED_INFO.uCurrPlaylistItem= 0;
  2622. SHARED_INFO.uCurrentClipNumber= 0;    //jerry cai May 16, 2003
  2623. gcs.pstate= PST_STOP;
  2624. CLEAR_COP_MASK(COP_SCAN | COP_SCAN_BACKWARD );
  2625. #ifdef CLIPS_DISPLAY_BACKGROUND
  2626. PE_Clips_DisplayBackground();
  2627. #else
  2628. PE_Clips_DisplayLogo();
  2629. #endif //CLIPS_DISPLAY_BACKGROUND
  2630. return;
  2631. }
  2632. // Compute the Next Item
  2633. if ( ( PST_SCAN == gcs.pstate ) && ( 0 > SHARED_INFO.iScanSpeed ) ||
  2634.      ( PST_SLOW == gcs.pstate ) && ( 0 > SHARED_INFO.iSlowSpeed ) ) 
  2635.      // Also should consider the condition of Slow-Rev.
  2636.      // Jeanz, 2004_4_20
  2637. {
  2638. uNextItem= SHARED_INFO.uCurrPlaylistItem;
  2639. gcs.pstate = PST_PLAY;
  2640. SHARED_INFO.iScanSpeed = 0;
  2641. }
  2642. else
  2643. uNextItem= computePlaylistItem(SHARED_INFO.uCurrPlaylistItem, TRUE);
  2644. // Take care of Repeat-Folder
  2645. if (PM_IsRepeatFolder()
  2646.     && (eSingle_LIST_STYLE == SHARED_INFO.eWindowsExplorerStyleBrowser)) 
  2647. {
  2648. UINT16 uNextClipNumber, hNextClipInstance;
  2649. WCHAR szTempDirectoryName[SC_CLIPS_CURRENT_DIRECTORY_SZ*2];
  2650. LPCWSTR pszCurrFolder = szTempDirectoryName;//= (SHARED_INFO.cieCurrClip).ciInfo.szDirectoryName;
  2651. ClipInfo ciInfo;
  2652. memset(szTempDirectoryName, 0, sizeof(szTempDirectoryName));
  2653. sc_GetBytes(SC_CLIPS_CURRENT_DIRECTORY_ADDR, (WORD)0, (WORD)(SC_CLIPS_CURRENT_DIRECTORY_SZ*4), (BYTE*)szTempDirectoryName);
  2654. // Acquire the Clip-Info for the next Clip, if there is such
  2655. if (0 != uNextItem) {
  2656. uNextClipNumber= PM_GetProgramListEntry(uNextItem);
  2657. hNextClipInstance= ClipsRepository_getInstanceAt(uNextClipNumber-1);
  2658. Clip_getFileInfo(hNextClipInstance, &ciInfo);
  2659. }
  2660. // Check if the next Clip is within the current Folder
  2661. if ((0 == uNextItem) ||
  2662. (0 != wcscmp(pszCurrFolder, ciInfo.szDirectoryName)))
  2663. {
  2664. // The next Clip isn't within the current Folder: find the first
  2665. // Clip in this Folder.
  2666. UINT16 uPrevItem;
  2667. uNextItem= SHARED_INFO.uCurrentClipNumber;
  2668. uPrevItem= computePlaylistItem(uNextItem, FALSE);
  2669. // Scan backwards, beginning with the current Clip
  2670. while (0 != uPrevItem) {
  2671. uNextClipNumber= PM_GetProgramListEntry(uPrevItem);
  2672. hNextClipInstance= ClipsRepository_getInstanceAt(uNextClipNumber-1);
  2673. Clip_getFileInfo(hNextClipInstance, &ciInfo);
  2674. if (0 != wcscmp(pszCurrFolder, ciInfo.szDirectoryName))
  2675. break;
  2676. uNextItem= uPrevItem;
  2677. uPrevItem= computePlaylistItem(uPrevItem, FALSE);
  2678. }
  2679. }
  2680. }
  2681. #ifdef MANUAL_DIRECTORY_EXPLORER
  2682. else
  2683. if(0 == uNextItem
  2684.    && (eWINDOWS_EXPLORER_STYLE == SHARED_INFO.eWindowsExplorerStyleBrowser)
  2685.  && PM_IsRepeatFolder())
  2686. {
  2687. uNextItem = computePlaylistItem(0, TRUE);
  2688. }
  2689. else//go to the following folder when the current working folder is finished.
  2690. if(0 == uNextItem
  2691.  && (eWholeDisc == SHARED_INFO.uExplorerStyleBrowserPlayMode)
  2692.    && (eWINDOWS_EXPLORER_STYLE == SHARED_INFO.eWindowsExplorerStyleBrowser))
  2693. {
  2694. uNextItem = getFirstItemInSubFoldersOrNextFolders();
  2695. }
  2696. #endif
  2697. //the whole disc has been finished.
  2698. if (0 == uNextItem)
  2699. {
  2700. if(eSingle_LIST_STYLE == SHARED_INFO.eWindowsExplorerStyleBrowser)
  2701.          SHARED_INFO.uCurrPlaylistItem= computePlaylistItem(0, TRUE);
  2702. #ifdef AUTO_REWIND_PLAYBACK_FOR_JPEG_DISCS
  2703. // If the current playback-mode is not "Repeat All", then don't re-invoke the playback
  2704. if (!PM_IsRepeatAll() && ( eClipType_JPEG !=  g_uAvailableClipTypes ) ) {
  2705. #else
  2706. // If the current playback-mode is not "Repeat All", then don't re-invoke the playback
  2707. #ifdef D_REPEAT_PROGRAM_MODE
  2708. //jeanz_2004_0916 For wma/mp3 repeat program
  2709. if (! PM_IsRepeatAll() && !((PM_GetPlaybackMode() == PM_PLAYBACK_PROGRAM) 
  2710. &&( (eClipType_WMA == (gns.clips.cieCurrClip).ciInfo.eType) || (eClipType_MP3 == (gns.clips.cieCurrClip).ciInfo.eType)) ))
  2711. {
  2712. #else
  2713. if (! PM_IsRepeatAll()) {
  2714. #endif
  2715. #endif
  2716. // Cancel any current Repeat-Modes
  2717. if(eWINDOWS_EXPLORER_STYLE != SHARED_INFO.eWindowsExplorerStyleBrowser)
  2718. {
  2719. cancelRepeatModes(PM_REPEAT_SINGLE | PM_REPEAT_ALL | PM_REPEAT_FOLDER);
  2720. // PM_SetPlaybackMode(PM_PLAYBACK_NORMAL);
  2721. // OnModeChange();
  2722. #ifdef I77_COMPANION_CHIP
  2723. if ( eClipType_JPEG == (gns.clips.cieCurrClip).ciInfo.eType)
  2724. {
  2725. JPEGClip_BeforeAbort();
  2726. }
  2727. #endif
  2728. Clip_abortPlayback(hClipInstance, FALSE);
  2729. }
  2730. time_display = 0;
  2731. gcs.pstate= PST_STOP;
  2732. CLEAR_COP_MASK(COP_SCAN | COP_SCAN_BACKWARD );
  2733. #ifdef CLIPS_DISPLAY_BACKGROUND
  2734. #ifdef MERGE_FOR_A_CUSTOMER
  2735. if ( eClipType_MPEG == (gns.clips.cieCurrClip).ciInfo.eType){
  2736. Logo_selectSource(eBlackLogo);
  2737. Logo_display();
  2738. }
  2739. #endif
  2740. PE_Clips_DisplayBackground();
  2741. #else
  2742. PE_Clips_DisplayLogo();
  2743. #endif //CLIPS_DISPLAY_BACKGROUND
  2744. ie_send( IE_UI_CLOSE_MENU );
  2745. return;
  2746. }
  2747. }
  2748. else {
  2749. SHARED_INFO.uCurrPlaylistItem= uNextItem;
  2750. }
  2751. // <<< Robin_0903_2004
  2752. #ifdef DIVX_SUPPORT_MULTI_SUBTITLE_MODE0
  2753. bNeedWaitForUI = TRUE;
  2754. #endif
  2755. // >>> Robin_0903_2004
  2756. // Invoke playback of the next item on the Playlist
  2757. if (! invokePlayback(FALSE)) {
  2758. tr_printf(("FATAL:_onPresentationFinished()[2]  Failed to play-back the next itemn"));
  2759. // <<< Stivenz_0223_2005: If current chapter is unsupported then goto next.
  2760. #ifdef D_MP4_SKIP_UNSUPPORTED_CHAPTER
  2761. if(eClipType_MP4 == (gns.clips.cieCurrClip).ciInfo.eType && bMP4DRMDisable)
  2762. {
  2763. dbg_printf(("WARNING: will skip this unsupport chapter.n"));
  2764. ie_send(IE_CORE_CDNAV_FINISHED);
  2765. }
  2766. #else
  2767. gcs.pstate= PST_STOP;
  2768. #endif
  2769. return;
  2770. }
  2771. return;
  2772. }
  2773. /////////////////////////////////////////////////////////////////////////////
  2774. // OnPlaybackFinished()
  2775. //
  2776. // Description: A handler for the IE_CORE_CDNAV_FINISHED Event.
  2777. //
  2778. // Input: None
  2779. // Output: None
  2780. // In/Out: None
  2781. // Return: None
  2782. //
  2783. // Remarks:
  2784. // This Event is dispatched whenever the current Clip has finished playback.
  2785. // The handler will select the next Item on the Playlist and invoke its playback.
  2786. // If the entire Playlist has been exhausted, it is rewound.
  2787. static void OnPlaybackFinished()
  2788. {
  2789. UINT8 uPresentationTime;
  2790. UINT16 uExpectedItem;
  2791. UINT16 hClipInstance= ClipsRepository_getInstanceAt(SHARED_INFO.uCurrentClipNumber-1);
  2792. tr_printf(("OnPlaybackFinished()n"));
  2793. #ifdef USE_AUX_SUBTITLES
  2794. // undisplay auxiliary subtitles, if exist.
  2795. if ((SI_IS_CURRENT_MPEG4_CLIP && (FALSE != areAuxSubtitlePresent())) ||
  2796. SI_CLIPS_MP4_INTERNAL_SUBTITLE_ON)
  2797. stopDisplayAuxSubtitles();
  2798. #endif
  2799. // Abort the current Playback
  2800. Clip_abortPlayback(hClipInstance, TRUE);
  2801. // Collect the Presentation-Time
  2802. uPresentationTime= Clip_getPresentationTime(hClipInstance);
  2803. //In case of JPEG intro mode, presentation time is 0.
  2804. if(eWINDOWS_EXPLORER_STYLE == SHARED_INFO.eWindowsExplorerStyleBrowser
  2805.    && SHARED_INFO.bIsIntroPlayMode)
  2806. uPresentationTime = 0;
  2807. // Try caching the next item on the Playlist
  2808. g_pClipsNav->m_hCachedClip= NULL;
  2809. if ( ( PST_SCAN == gcs.pstate ) && ( 0 > SHARED_INFO.iScanSpeed ) ||
  2810.      ( PST_SLOW == gcs.pstate ) && ( 0 > SHARED_INFO.iSlowSpeed ) )
  2811.      // Also should consider the condition of Slow-Rev.
  2812.      // Jeanz, 2004_4_20
  2813. {
  2814. #ifdef MANUAL_DIRECTORY_EXPLORER
  2815. uExpectedItem= SHARED_INFO.uCurrPlaylistItem;
  2816. #else
  2817. uExpectedItem= computePlaylistItem(SHARED_INFO.uCurrPlaylistItem, FALSE);
  2818. #endif
  2819. }
  2820. else
  2821. uExpectedItem= computePlaylistItem(SHARED_INFO.uCurrPlaylistItem, TRUE);
  2822. if (0 != uExpectedItem && !PM_IsPlaybackRandom(PM_GetPlaybackMode())) {
  2823. // Calculate the next expected Clip Number
  2824. UINT16 uExpectedClipNumber= PM_GetProgramListEntry(uExpectedItem);
  2825. // Acquire the Instance of the next expected Clip
  2826. hClipInstance= ClipsRepository_getInstanceAt(uExpectedClipNumber-1);
  2827. // Try caching, if possible
  2828. if ((NULL != hClipInstance) && Clip_hasAttribute(hClipInstance, eCA_Cacheable)
  2829. #ifdef I77_COMPANION_CHIP// Only do caching for SD-JPEG
  2830. #ifdef I77_BRAIN_STORM
  2831. && ( gcst.hd_jpeg_mode_preference == SD_JPEG_MODE )
  2832. #else//I77_BRAIN_STORM
  2833. && ( gps->hd_jpeg_mode_preference == SD_JPEG_MODE )
  2834. #endif//I77_BRAIN_STORM
  2835. #endif
  2836. && !g_pClipsNav->m_bDigestMode
  2837. && (eCIO_Original == Clip_getOrientation(ClipsRepository_getInstanceAt(SHARED_INFO.uCurrentClipNumber-1)))
  2838.          )
  2839. {
  2840. //cache only when not digest/rotation mode
  2841. // Select the appropriate Transition for the Clip to cache
  2842. Clip_setTransitionEffect(hClipInstance, SHARED_INFO.eCurrentTransition);
  2843. dbg_printf(("Caching next clipn"));
  2844. // Attempt Caching
  2845. if (Clip_startPlayback(hClipInstance, NULL, TRUE)){
  2846. g_pClipsNav->m_hCachedClip= hClipInstance;
  2847. g_pClipsNav->m_bPresentationMode= TRUE;
  2848. }
  2849. }
  2850. }
  2851. // If the current state is Pause, then do nothing
  2852. if (PST_PAUSE == gcs.pstate && eClipType_JPEG == SI_CLIPS_CURR_CLIP_INFO.ciInfo.eType) {
  2853. // Engage Presentation-Mode
  2854. g_pClipsNav->m_bPresentationMode= TRUE;
  2855. return;
  2856. }
  2857. // Start the Presentation-Time Timer
  2858. if (0 != uPresentationTime) {
  2859. // Move to Still
  2860. gcs.pstate= PST_STILL;
  2861. // Engage Presentation-Mode
  2862. g_pClipsNav->m_bPresentationMode= TRUE;
  2863. if (INFINITE_PRESENTATION_TIME != uPresentationTime) {
  2864. dbg_printf(("INFO: Presentation-Timer set to %d seconds.n", uPresentationTime));
  2865. timer_service_set_freq(g_pClipsNav->m_hPresentationTimer, 
  2866.    (1000 * uPresentationTime));
  2867. if( gcs.mZoomLevel == NO_ZOOM && eClipType_JPEG == SI_CLIPS_CURR_CLIP_INFO.ciInfo.eType )//With zoom ,keep on the fly
  2868. {
  2869. //no auto presentation when rotation 
  2870. #ifndef EXINO2 //ZKR JK0428 : no stop auto presentation when rotation 
  2871. #if !defined(D_USE_TIMEOUT_FOR_JPG_TRICK)&&!defined(JPEG_KEEP_SLIDESHOW_AFTER_ROTATION)
  2872. if ( eCIO_Original == Clip_getOrientation(ClipsRepository_getInstanceAt(SHARED_INFO.uCurrentClipNumber-1)) )
  2873. #endif
  2874. #endif //EXINO2
  2875. timer_service_enable(g_pClipsNav->m_hPresentationTimer, TRUE);
  2876. }
  2877. }
  2878. else {
  2879. dbg_printf(("INFO: Infinite Presentation engaged.n"));
  2880. }
  2881. }
  2882. else {
  2883. // No Presentation-Time was set - presentation is finished
  2884. _onPresentationFinished();
  2885. }
  2886. return;
  2887. }
  2888. /////////////////////////////////////////////////////////////////////////////
  2889. // OnStop()
  2890. //
  2891. // Description: A handler for the IE_CORE_PAUSE or IE_CORE_STOP Event.
  2892. //
  2893. // Input: eType - The type of Stop being requested
  2894. // Output: None
  2895. // In/Out: None
  2896. // Return: None
  2897. //
  2898. // Remarks: None
  2899. static void OnStop(enStopType eType)
  2900. {
  2901. UINT16 hClipInstance= ClipsRepository_getInstanceAt(SHARED_INFO.uCurrentClipNumber-1);
  2902. #ifdef CLIPS_JPEG_DIGEST_SUPPORT
  2903. //checking if we are on digest mode
  2904. if (g_pClipsNav->m_bDigestMode)
  2905. {
  2906. _terminateDigestMode();
  2907. #ifdef CLIPS_DISPLAY_BACKGROUND
  2908. PE_Clips_DisplayBackground();
  2909. #else
  2910. PE_Clips_DisplayLogo();
  2911. #endif //CLIPS_DISPLAY_BACKGROUND
  2912. gcs.pstate= PST_STOP;
  2913. return;
  2914. }
  2915. #endif //CLIPS_JPEG_DIGEST_SUPPORT
  2916. // Make sure that there's any Clip to stop
  2917. if (NULL == hClipInstance)
  2918. return;
  2919. //disabling the timer 
  2920. timer_service_disable(g_pClipsNav->m_hPresentationTimer);
  2921. // Cancel Intro Play Mode if Stop/Pause
  2922. //SHARED_INFO.bIsIntroPlayMode = FALSE;
  2923. switch (eType) 
  2924. {
  2925. case ePause:
  2926. dbg_printf(("OnPause()n"));
  2927. if (!Clip_hasAttribute(hClipInstance, eCA_StillImage))
  2928.  Clip_pausePlayback(hClipInstance, TRUE);
  2929. gcs.pstate= PST_PAUSE;
  2930. break;
  2931. case eStopResume:
  2932. case eFullStop:
  2933. dbg_printf(("OnStop()n"));
  2934. #ifdef DIVX_SUPPORT_MULTI_SUBTITLE_MODE0
  2935. bNeedWaitForUI = FALSE;
  2936. #endif
  2937. Clip_beforeStop(hClipInstance);
  2938. if ((eStopResume == eType) && 
  2939. Clip_hasAttribute(hClipInstance, eCA_Markable))
  2940. {
  2941. dbg_printf(("Recording current-position.n"));
  2942. // Record the Resume-Marker
  2943. //Sean_1213_2004
  2944. switch((gns.clips.cieCurrClip).ciInfo.eType)
  2945. {
  2946. #ifdef CLIPS_WMA_STOPRESUME_FROM_CURRTRACK
  2947. case eClipType_WMA :
  2948. break;
  2949. #endif
  2950. #ifdef IS_OGG_VORBIS_CAPABLE
  2951. case eClipType_OGG :
  2952. break;
  2953. #endif
  2954. default:
  2955. Clip_recordMarker(hClipInstance, &g_pClipsNav->m_cmResumeMarker);
  2956. }
  2957. //<<<Sean_1213_2004
  2958. #ifdef CLIPS_WMA_STOPRESUME_PATCH
  2959. if (!Clip_hasAttribute(hClipInstance, eCA_StillImage)&&(eClipType_WMA== (gns.clips.cieCurrClip).ciInfo.eType))
  2960. Clip_pausePlayback(hClipInstance, TRUE);
  2961. #endif
  2962. }
  2963. else {
  2964. SHARED_INFO.iCurrentTime = 0;// Robin_0604_2004_B, current time reset 0 when full stop
  2965. //add by wl033004 for set the play mode to normal after full stop
  2966. #ifdef K1_WL
  2967. if ( PM_IsPlaybackProgram(PM_GetPlaybackMode()) || PM_IsPlaybackIntro(PM_GetPlaybackMode())
  2968. #ifdef D_ENABLE_SHUFFLE_MODE
  2969. || PM_IsPlaybackShuffle(PM_GetPlaybackMode())
  2970. #endif
  2971. )
  2972. {
  2973. PM_SetPlaybackMode(PM_PLAYBACK_NORMAL);
  2974.   mode_set_private_program_size(0);
  2975. OnModeChange();
  2976. }
  2977. #endif
  2978. //add by wl033004 for set the play mode to normal after full stop
  2979. (g_pClipsNav->m_cmResumeMarker).dwAddress= (ULONG)-1;
  2980. }
  2981. #ifdef I77_COMPANION_CHIP
  2982. if ( eClipType_JPEG == (gns.clips.cieCurrClip).ciInfo.eType)
  2983. {
  2984. JPEGClip_BeforeAbort();
  2985. }
  2986. #endif
  2987. #ifdef CLIPS_WMA_STOPRESUME_PATCH
  2988. if((eClipType_WMA != (gns.clips.cieCurrClip).ciInfo.eType)||(eStopResume != eType))
  2989. #endif
  2990. Clip_abortPlayback(hClipInstance, (eStopResume == eType) ? TRUE : FALSE);
  2991. #ifdef CLIPS_DISPLAY_BACKGROUND
  2992. #ifdef MERGE_FOR_A_CUSTOMER
  2993. if ( eClipType_MPEG == (gns.clips.cieCurrClip).ciInfo.eType){
  2994. Logo_selectSource(eBlackLogo);
  2995. Logo_display();
  2996. }
  2997. #endif
  2998. PE_Clips_DisplayBackground();
  2999. #else
  3000. PE_Clips_DisplayLogo();
  3001. #endif //CLIPS_DISPLAY_BACKGROUND
  3002. // Cancel any current Repeat-Modes, except Folder
  3003.   if(eWINDOWS_EXPLORER_STYLE != SHARED_INFO.eWindowsExplorerStyleBrowser)
  3004.   if (eStopResume != eType) //BT0407: only full stop cancel repeat mode
  3005. cancelRepeatModes(PM_REPEAT_SINGLE | PM_REPEAT_ALL | PM_REPEAT_AB_MASK);
  3006. gcs.pstate= PST_STOP;
  3007. if (!(IS_CLIPS_TYPE_WMA || IS_CLIPS_TYPE_MP3))
  3008. ie_send(IE_UI_CLIPS_CLEAR_UI);
  3009. #ifdef SLOW_STOP_FOR_CLIPS
  3010. if ( eFullStop == eType )
  3011. delay_us(1000000UL);
  3012. #endif//SLOW_STOP_FOR_CLIPS
  3013. CLEAR_COP_MASK(COP_SCAN | COP_SCAN_BACKWARD );
  3014. break;
  3015. }
  3016. return;
  3017. }
  3018. /////////////////////////////////////////////////////////////////////////////
  3019. // OnModeChange()
  3020. //
  3021. // Description: A handler for the IE_CORE_SEAMLESS_MODE_CHANGE Event.
  3022. //
  3023. // Input: None
  3024. // Output: None
  3025. // In/Out: None
  3026. // Return: None
  3027. //
  3028. // Remarks:
  3029. // The Seamless Mode-Change Event is triggered whenever the user switches
  3030. // from Normal playback to Program/Shuffle or vice-versa.
  3031. // The following behaviours are displayed:
  3032. // 1. For a transition from Normal Playback to Shuffle or Random:
  3033. //    a. If the Playback status is "Stopped", then the entire Playlist is
  3034. //       shuffled.
  3035. //    b. If the Playback status is "Playing", then everything except the
  3036. //       current Item is shuffled, and the current Item is placed at the
  3037. //       head of the shuffled Playlist. Playback continues normally.
  3038. //
  3039. // 2. For a transition from Normal Playback to Program:
  3040. //    a. If the Playback status is "Stopped", nothing usual happens.
  3041. //    b. If the Playback status is "Playing", the playback is Stopped, and
  3042. //       then restarted from the first Item on the Program.
  3043. // 3. For a transition from Any mode to Normal Playback:
  3044. //    The entire Playlist is reconstructed, and the current Item is
  3045. //    selected to be the current Item, if the current Playback status is
  3046. //    "Playing".
  3047. static void OnModeChange()
  3048. {
  3049. dbg_printf(("OnModeChangen"));
  3050. // Find-out what kind of mode has changed: the Playback-Mode or the Repeat-Mode
  3051. // If the change is not in Playback-Mode, then nothing to do.
  3052. if (g_pClipsNav->m_uCurrPlaybackMode == PM_GetPlaybackMode()) {
  3053. dbg_printf(("No Playback-Mode change detected.n"));
  3054. return;
  3055. }
  3056. // In case of a Playback-Mode change, cancel all current Repeat Modes
  3057. // Cancel Intro Play Mode if Stop
  3058. SHARED_INFO.bIsIntroPlayMode = FALSE;
  3059. cancelRepeatModes(PM_REPEAT_SINGLE | PM_REPEAT_ALL | PM_REPEAT_FOLDER | PM_REPEAT_AB_MASK);
  3060. // for explorer style browser only.
  3061. SHARED_INFO.uExplorerStyleBrowserPlayMode = eSingleFolder;
  3062. // Clear any Resume Marker
  3063. (g_pClipsNav->m_cmResumeMarker).dwAddress= (ULONG)-1;
  3064. // Detect a transition of type: Non-Shuffle -> Shuffle Or Random
  3065. if ((! PM_IsPlaybackShuffle(g_pClipsNav->m_uCurrPlaybackMode) && 
  3066. PM_IsPlaybackShuffle(PM_GetPlaybackMode())) ||
  3067. PM_IsPlaybackRandom(PM_GetPlaybackMode())) 
  3068. {
  3069. dbg_printf(("Non_Shuffle -> Shufflen"));
  3070. // If the current Playback-Status is other than Stopped, shuffle the Program-List while
  3071. // keeping the current item as the first item
  3072. if (PST_STOP != gcs.pstate)
  3073. PM_ShuffleProgramList(TRUE, SHARED_INFO.uCurrPlaylistItem);
  3074. else
  3075. PM_ShuffleProgramList(FALSE, 0);
  3076. // Now set the Current-Item to the first possible Item
  3077. SHARED_INFO.uCurrPlaylistItem= computePlaylistItem(0, TRUE);
  3078. }
  3079. // Detect a transition of type: Non-Normal -> Normal
  3080. if (! PM_IsPlaybackNormal(g_pClipsNav->m_uCurrPlaybackMode) && 
  3081. PM_IsPlaybackNormal(PM_GetPlaybackMode())) 
  3082. {
  3083. UINT16 uEntry, uEntriesCnt;
  3084. WORD uCurrClipIndex= (WORD)PM_GetProgramListEntry(SHARED_INFO.uCurrPlaylistItem);
  3085. dbg_printf(("Non_Normal -> Normaln"));
  3086. // Rebuild the Normal Program-List (sequential playback of the Tracks)
  3087. uEntriesCnt= ClipsRepository_getSize();
  3088. PM_InitializeProgramList();
  3089. for (uEntry= 1; uEntry <= uEntriesCnt; uEntry++)
  3090. PM_SetProgramListEntry((WORD)uEntry, (WORD)uEntry);
  3091. // Now update the Current Item to point at the Entry holding the current-Clip,
  3092. // if playback is currently in progress
  3093. if (PST_STOP != gcs.pstate)
  3094. SHARED_INFO.uCurrPlaylistItem= uCurrClipIndex;
  3095. else
  3096. #ifdef MANUAL_DIRECTORY_EXPLORER
  3097. SHARED_INFO.uCurrPlaylistItem= computePlaylistItem(0, TRUE);
  3098. #else
  3099. SHARED_INFO.uCurrPlaylistItem= 1;
  3100. #endif
  3101. }
  3102. // Detect a transition of type: Non-Program -> Program
  3103. if (! PM_IsPlaybackProgram(g_pClipsNav->m_uCurrPlaybackMode) && 
  3104. PM_IsPlaybackProgram(PM_GetPlaybackMode())) 
  3105. {
  3106. dbg_printf(("Non-Program ->Program n"));
  3107. #ifdef MANUAL_DIRECTORY_EXPLORER
  3108. SHARED_INFO.uCurrPlaylistItem= computePlaylistItem(0, TRUE);
  3109. #else
  3110. // Reset the Playback Filter
  3111. g_uPlaybackFilter= g_uAvailableClipTypes;
  3112. SHARED_INFO.uCurrPlaylistItem= 1;
  3113. #endif
  3114. if (PST_STOP != gcs.pstate) {
  3115. Clip_abortPlayback(ClipsRepository_getInstanceAt(SHARED_INFO.uCurrentClipNumber-1),
  3116.    TRUE);
  3117. gcs.pstate= PST_PLAY;
  3118. // <<< Robin_0903_2004
  3119. #ifdef DIVX_SUPPORT_MULTI_SUBTITLE_MODE0
  3120. bNeedWaitForUI = TRUE;
  3121. #endif
  3122. // >>> Robin_0903_2004
  3123. if (! invokePlayback(TRUE)) {
  3124. tr_printf(("FATAL: Failed to re-invoke playback after playback-mode changen"));
  3125. gcs.pstate= PST_STOP;
  3126. }
  3127. }
  3128. }