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

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: Digest.c $             
  6.  * 
  7.  *
  8.  * Description:
  9.  * ============
  10.  * Implementation of the digest mechanism.
  11.  * 
  12.  * Log:
  13.  * ====
  14.  * $Revision: 20 $
  15.  * Last Modified by $Author:  $ at $Modtime:  $ 
  16.  ****************************************************************************************
  17.  * Updates:
  18.  ****************************************************************************************
  19.  * $Log: /I76/I76_Common/I76_Reference/Playcore/Digest/Digest.c $
  20.  * 
  21.  **************************************************************************************** */
  22. #include "Config.h" // Global Configuration - do not remove!
  23. #ifdef _DEBUG
  24. #undef IFTRACE
  25. #define IFTRACE if (gTraceCore)
  26. #include "DebugDbgMain.h"
  27. #endif //_DEBUG
  28. #if (defined(SVCD_DIGEST_SUPPORT) || 
  29.  defined(DVD_DIGEST_SUPPORT) ||  
  30.  defined(CLIPS_JPEG_DIGEST_SUPPORT))
  31. #include "Includecpu_address.h"
  32. #include "KernelEventdef.h"
  33. #include "KernelKer_API.h"
  34. #include "PlaycoreDigestDigest.h"
  35. #include "DriveDrv_Defs.h"
  36. #include "DriveDrv_API.h"
  37. #include "DecoderDEC_Defs.h"
  38. #include "DecoderDecoder.h"
  39. #include "Decoderlow_levelDEC_LL_Cmd.h"
  40. #include "Decoderlow_levelDEC_LL_API.h"
  41. #include "Decoderlow_levelDEC_LL_Def.h"
  42. #include "PlaycoreCoremainCoremain.h"
  43. #include "PlaycoreCoremainCoreGDef.h"
  44. #include "PlaycorePSPS.h"
  45. #include "PlaycoreTimingTiming.h"
  46. /////////////////////////////////////////////////////////////////////////////
  47. // Constants
  48. #define UNINITIALIZED 0xFFFF
  49. #define TIMER_INTERVAL_MS 50
  50. typedef enum { eStateReady, eStateBusy } enDisplayState;
  51. typedef enum 
  52. eDigestNext, eDigestPrev, eDigestStop, 
  53. eDigestFocus, eDigestSelection 
  54. } enPendingEvent;
  55. typedef enum 
  56. {
  57. eFrameNotValid, 
  58. eFrameNextTickValid, 
  59. eFrameValid 
  60. } enFrameState;
  61. /////////////////////////////////////////////////////////////////////////////
  62. //Global variables
  63. typedef struct Digest_Info_TAG 
  64. {
  65. CallbackFuncPtr pfCallback;
  66. UINT16 uUnitsCnt;
  67. UINT8 uIntroFramesCount; //the number of frames that will be displayed per digest item
  68. //  on the first time the frame is displayed.
  69. UINT16 uCurrAnimatedItem; //The item that is being animated 
  70. UINT16 uFirstVisibleItem; //The first item to be displayed in the current digest screen
  71. UINT16 uLastVisibleItem; //The last item to be displayed in the current digest screen
  72. UINT16 uItemOnFocus; //The item being focused
  73. UINT16 uLastFocusedItem; //The last item to gain focus
  74. UINT8 hTimer; //A Timer
  75. int hDigest_handler; //The event handler
  76. struct 
  77. {
  78. unsigned int eDigestMode :2; //Indication whether this is a track digest (or disc digest)
  79. unsigned int eCurrState :2; //The current display state
  80. unsigned int bIsPendingEvent :1; //An indication whether there is a pending event
  81. unsigned int ePendingEvent :3; //Holds the pending event
  82. unsigned int eValidOp :2; //Holds the current available operations: Next/Prev
  83. unsigned int eFrameState :2; //The current state for the focus frame - can it be
  84. //  displayed already or not.
  85. unsigned int reserved :4;
  86. } stateInfo;
  87. } Digest_Info;
  88. Digest_Info *g_DigestInfo = NULL;
  89. UINT8 g_uFramesToAnimate = 0; //The number of frames left to animate the current item
  90. extern BYTE g_DigestReadDiscError; //mikex_0827_2003_a
  91. /////////////////////////////////////////////////////////////////////////////
  92. // Forward declarations
  93. static void _stopDigestItem(UINT16 i_uItemToStop);
  94. static void _onTimer(UINT8 hTimer);
  95. static int _eventHandler(HDLR_OP Op, EVENT Event, void *Param);
  96. static void _onTick(void);
  97. static void OnDigestnext(void);
  98. static void OnDigestprev(void);
  99. /////////////////////////////////////////////////////////////////////////////
  100. // Digest Interface Implementation
  101. //////////////////////////////////////////////////////////////////////////////////
  102. // Function name : Digest_init
  103. //
  104. // Purpose : Initializations required for digest mode.
  105. //
  106. // Input Parameters : 
  107. // CallbackFuncPtr i_pfCallback - pointer to a callback function that will handle the 
  108. // presentation of the item. This function is specific for each navigator.
  109. // UINT16 i_uDigestUnitsCnt - The number of units to be displayed. 
  110. // enDigestMode i_eDigestMode - digest mode: Track view or Disc view.
  111. // UINT8 i_uIntroFramesCount - number of animation frames in the first digest screen.
  112. //
  113. // Return Value : BOOL - true in case all the given parameters are valid.
  114. //
  115. // Description : Insatlling the the digest as an event handler, and setting 
  116. // the decoder to the right state for digest.
  117. //////////////////////////////////////////////////////////////////////////////////
  118. BOOL Digest_init(CallbackFuncPtr i_pfCallback, UINT16 i_uDigestUnitsCnt, 
  119.  enDigestMode i_eDigestMode, UINT8 i_uIntroFramesCount)
  120. {
  121. dbg_printf(("Digest_init()n"));
  122. g_DigestInfo = (Digest_Info *)malloc(sizeof(Digest_Info));
  123. if(NULL == g_DigestInfo)
  124. {
  125. tr_printf(("WARNING: Digest_init() failed - alloc memory for g_DigestInfo failedn"));
  126. return(FALSE);
  127. }
  128. //safety checks
  129. if (NULL == i_pfCallback)
  130. {
  131. tr_printf(("WARNING: Digest_init() failed - given callback value invalidn"));
  132. return(FALSE);
  133. }
  134. if (0 == i_uDigestUnitsCnt)
  135. {
  136. tr_printf(("WARNING: Digest_init() failed - Invalid digest units size valuen"));
  137. return(FALSE);
  138. }
  139. //installing the System-Events Handler
  140. g_DigestInfo->hDigest_handler = install_core_event_handler(_eventHandler);
  141. if (-1 == g_DigestInfo->hDigest_handler)
  142. {
  143. tr_printf(("WARNING: Digest_init() failed - failed to install event handlern"));
  144. return FALSE;
  145. }
  146. //creating a Timer
  147. g_DigestInfo->hTimer= timer_service_create(_onTimer, TIMER_INTERVAL_MS, 
  148.   (TIMER_ENABLED | TIMER_REPEAT));
  149. if (NULL == g_DigestInfo->hTimer) 
  150. {
  151. tr_printf(("WARNING: Digest_init() failed - failed to create a timern"));
  152. return FALSE;
  153. }
  154. //initializing the Digest Information
  155. g_DigestInfo->pfCallback = i_pfCallback;
  156. g_DigestInfo->uUnitsCnt = i_uDigestUnitsCnt;
  157. g_DigestInfo->stateInfo.eDigestMode = i_eDigestMode;
  158. if (0 == i_uIntroFramesCount)
  159. {
  160. tr_printf(("WARNING: Digest_init() - intro frames count is 0, using default value 1n"));
  161. i_uIntroFramesCount = 1;
  162. }
  163. g_DigestInfo->uIntroFramesCount  = i_uIntroFramesCount;
  164. g_DigestInfo->uCurrAnimatedItem = UNINITIALIZED;
  165. g_DigestInfo->uLastVisibleItem = UNINITIALIZED;
  166. g_DigestInfo->uItemOnFocus = UNINITIALIZED;
  167. g_DigestInfo->uLastFocusedItem = UNINITIALIZED;
  168. g_DigestInfo->stateInfo.eCurrState    = eStateReady;
  169. g_DigestInfo->stateInfo.bIsPendingEvent = FALSE;
  170. g_DigestInfo->stateInfo.eValidOp = eDIGEST_OP_NONE;
  171. g_DigestInfo->stateInfo.eFrameState = eFrameNotValid;
  172. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_STOP, NULL);
  173. //setting the decoder to digest mode
  174. DEC_Digest_start();
  175. return(TRUE);
  176. }
  177. //////////////////////////////////////////////////////////////////////////////////
  178. // Function name : Digest_start
  179. //
  180. // Purpose : Displaying the first digest screen.
  181. //
  182. // Input Parameters : i_uInitialItem - The index of the Initial item, which will
  183. // be displayed at the upper-left corner.
  184. //
  185. // Return Value : void.
  186. // Description : Just setting the current and the last displayed items so that
  187. // on the next tick the updated information will be displayed.
  188. //   Setting the available operations from this point: Prev/Next
  189. //////////////////////////////////////////////////////////////////////////////////
  190. void Digest_start(UINT16 i_uInitialItem)
  191. {
  192. UINT16 uLastVisible;
  193. dbg_printf(("Digest_start(%d)n", i_uInitialItem));
  194. uLastVisible= (i_uInitialItem + DIGEST_MAX_FRAMES_ON_SCREEN - 1);
  195. if (uLastVisible >= g_DigestInfo->uUnitsCnt)
  196. uLastVisible= (g_DigestInfo->uUnitsCnt - 1);
  197. if (0 == i_uInitialItem)
  198. g_DigestInfo->uCurrAnimatedItem = UNINITIALIZED;
  199. else
  200. g_DigestInfo->uCurrAnimatedItem = (i_uInitialItem - 1);
  201. g_DigestInfo->uFirstVisibleItem= i_uInitialItem;
  202. g_DigestInfo->uLastVisibleItem = uLastVisible;
  203. g_DigestInfo->stateInfo.eValidOp = eDIGEST_OP_NONE;
  204. if (i_uInitialItem > 0)
  205. g_DigestInfo->stateInfo.eValidOp |= eDIGEST_OP_PREV;
  206. if (uLastVisible < (g_DigestInfo->uUnitsCnt - 1))
  207. g_DigestInfo->stateInfo.eValidOp |= eDIGEST_OP_NEXT;
  208. return;
  209. }
  210. /*for use by UI thread*/
  211. void Digest_next(void)
  212. {
  213. dbg_printf(("Digest_next()n"));
  214. if (g_DigestInfo->uLastVisibleItem == (g_DigestInfo->uUnitsCnt - 1))
  215. return;
  216. g_DigestInfo->stateInfo.bIsPendingEvent = TRUE;
  217. g_DigestInfo->stateInfo.ePendingEvent = eDigestNext;
  218. }
  219. //////////////////////////////////////////////////////////////////////////////////
  220. // Function name : OnDigestnext
  221. //
  222. // Purpose : Displaying the next digest screen.
  223. //
  224. // Return Value : void 
  225. //
  226. // Description : Just setting the current and the last displayed items so that
  227. // on the next tick the updated information will be displayed.
  228. //   Setting the available operations from this point: Prev/Next
  229. //////////////////////////////////////////////////////////////////////////////////
  230. static void OnDigestnext(void)
  231. {
  232. dbg_printf(("OnDigestnext()n"));
  233. if (g_DigestInfo->uLastVisibleItem == (g_DigestInfo->uUnitsCnt - 1))
  234. return;
  235. //checking if the command is a pending command
  236. if (eStateBusy == (enDisplayState)g_DigestInfo->stateInfo.eCurrState)
  237. {
  238. g_DigestInfo->stateInfo.bIsPendingEvent = TRUE;
  239. g_DigestInfo->stateInfo.ePendingEvent = eDigestNext;
  240. }
  241. else
  242. {
  243. //resetting the indication for the first frame presentation
  244. g_DigestInfo->stateInfo.eFrameState = eFrameNotValid;
  245. // First of all, stop the current Item
  246. _stopDigestItem(g_DigestInfo->uCurrAnimatedItem);
  247. //setting the current item to be the last item from the previous digest screen
  248. g_DigestInfo->uCurrAnimatedItem = g_DigestInfo->uLastVisibleItem;
  249. //setting the visible range
  250. g_DigestInfo->uFirstVisibleItem += DIGEST_MAX_FRAMES_ON_SCREEN;
  251. g_DigestInfo->uLastVisibleItem += DIGEST_MAX_FRAMES_ON_SCREEN;
  252. if (g_DigestInfo->uLastVisibleItem >= g_DigestInfo->uUnitsCnt)
  253. g_DigestInfo->uLastVisibleItem = (g_DigestInfo->uUnitsCnt - 1);
  254. //stop any on-going animation 
  255. g_uFramesToAnimate = 0;
  256. g_DigestInfo->uItemOnFocus = UNINITIALIZED;
  257. g_DigestInfo->stateInfo.eValidOp = eDIGEST_OP_NONE;
  258. //is prev available
  259. if (g_DigestInfo->uFirstVisibleItem > 0)
  260. g_DigestInfo->stateInfo.eValidOp |= eDIGEST_OP_PREV;
  261. //is next available
  262. if (g_DigestInfo->uLastVisibleItem < (g_DigestInfo->uUnitsCnt - 1))
  263. g_DigestInfo->stateInfo.eValidOp |= eDIGEST_OP_NEXT;
  264. }
  265. return;
  266. }
  267. //////////////////////////////////////////////////////////////////////////////////
  268. // Function name : Digest_prev
  269. //
  270. // Purpose : Displaying the previous digest screen.
  271. //
  272. // Return Value : void 
  273. //
  274. // Description : Just setting the current and the last displayed items so that
  275. // on the next tick the updated information will be displayed.
  276. //   Setting the available operations from this point: Prev/Next
  277. //////////////////////////////////////////////////////////////////////////////////
  278. void Digest_prev(void)
  279. {
  280. dbg_printf(("Digest_prev()n"));
  281. if ((DIGEST_MAX_FRAMES_ON_SCREEN - 1) == g_DigestInfo->uLastVisibleItem)
  282. return;
  283. g_DigestInfo->stateInfo.bIsPendingEvent = TRUE;
  284. g_DigestInfo->stateInfo.ePendingEvent = eDigestPrev;
  285. }
  286. static void OnDigestprev(void)
  287. {
  288. dbg_printf(("OnDigestprev()n"));
  289. if ((DIGEST_MAX_FRAMES_ON_SCREEN - 1) == g_DigestInfo->uLastVisibleItem)
  290. return;
  291. //checking if the command is a pending command
  292. if (eStateBusy == (enDisplayState)g_DigestInfo->stateInfo.eCurrState)
  293. {
  294. g_DigestInfo->stateInfo.bIsPendingEvent = TRUE;
  295. g_DigestInfo->stateInfo.ePendingEvent = eDigestPrev;
  296. }
  297. else
  298. {
  299. //resetting the indication for the first frame presentation
  300. g_DigestInfo->stateInfo.eFrameState = eFrameNotValid;
  301. // First of all, stop the current Item
  302. _stopDigestItem(g_DigestInfo->uCurrAnimatedItem);
  303. //calculating the appropriate visible range
  304. //the current Item is always set to 1 less than the first, so that onTick it will be increased
  305. if (g_DigestInfo->uFirstVisibleItem > DIGEST_MAX_FRAMES_ON_SCREEN) {
  306. g_DigestInfo->uFirstVisibleItem -= DIGEST_MAX_FRAMES_ON_SCREEN;
  307. g_DigestInfo->uCurrAnimatedItem = (g_DigestInfo->uFirstVisibleItem - 1);
  308. }
  309. else {
  310. g_DigestInfo->uFirstVisibleItem = 0;
  311. g_DigestInfo->uCurrAnimatedItem = UNINITIALIZED;
  312. }
  313. g_DigestInfo->uLastVisibleItem= (g_DigestInfo->uFirstVisibleItem + 
  314. DIGEST_MAX_FRAMES_ON_SCREEN - 1);
  315. if (g_DigestInfo->uLastVisibleItem >= (g_DigestInfo->uUnitsCnt))
  316. g_DigestInfo->uLastVisibleItem = (g_DigestInfo->uUnitsCnt - 1);
  317. //stop any on going animation
  318. g_uFramesToAnimate = 0;
  319. g_DigestInfo->uItemOnFocus = UNINITIALIZED;
  320. g_DigestInfo->stateInfo.eValidOp = eDIGEST_OP_NONE;
  321. //is prev available
  322. if (g_DigestInfo->uFirstVisibleItem > 0)
  323. g_DigestInfo->stateInfo.eValidOp |= eDIGEST_OP_PREV;
  324. //is next available
  325. if (g_DigestInfo->uLastVisibleItem < (g_DigestInfo->uUnitsCnt - 1))
  326. g_DigestInfo->stateInfo.eValidOp |= eDIGEST_OP_NEXT;
  327. }
  328. return;
  329. }
  330. //////////////////////////////////////////////////////////////////////////////////
  331. // Function name : Digest_onItemFocus
  332. //
  333. // Purpose : Start animate the item that got focus.
  334. //
  335. // Input Parameters : 
  336. // UINT16 i_uItem - zero based index of the item that got the focus.
  337. //
  338. // Return Value : BOOL - an indication whether the given index is valid.
  339. //
  340. // Description : Setting the item that is being focused.
  341. //////////////////////////////////////////////////////////////////////////////////
  342. BOOL Digest_setFocus(UINT16 i_uItem)
  343. {
  344. dbg_printf(("Digest_setFocus(%d)n", i_uItem));
  345. //safty check for the index
  346. if ((i_uItem < g_DigestInfo->uFirstVisibleItem) || 
  347. (i_uItem > g_DigestInfo->uLastVisibleItem))
  348. {
  349. dbg_printf(("Digest: given index is out of current range.n"));
  350. return(FALSE);
  351. }
  352. if ((eStateBusy == (enDisplayState)g_DigestInfo->stateInfo.eCurrState) || //busy
  353. (0 != g_uFramesToAnimate)) //or still has intro frames to display
  354. {
  355. g_DigestInfo->stateInfo.bIsPendingEvent = TRUE;
  356. g_DigestInfo->stateInfo.ePendingEvent = eDigestFocus;
  357. g_DigestInfo->uItemOnFocus = i_uItem;
  358. }
  359. else
  360. {
  361. g_DigestInfo->uItemOnFocus = i_uItem;
  362. }
  363. return(TRUE);
  364. }
  365. #ifdef _DEBUG
  366. //this function is only used by the debug menu on the terminal
  367. void Digest_onItemLostFocus(void)
  368. {
  369. dbg_printf(("Digest_onItemLostFocus()n"));
  370. g_DigestInfo->uItemOnFocus = UNINITIALIZED;
  371. g_DigestInfo->uLastFocusedItem = UNINITIALIZED;
  372. g_uFramesToAnimate = 0;
  373. }
  374. #endif //_DEBUG
  375. //////////////////////////////////////////////////////////////////////////////////
  376. // Function name : Digest_getCurrentDisplayed
  377. //
  378. // Purpose : Returning the 1-based index of the current displayed item.
  379. //
  380. // Input Parameters : none
  381. //
  382. // Return Value : UINT8 - zero-based index of the item currently being displayed.
  383. //
  384. // Description : returning the member variable that holds the currently 
  385. // displayed item.
  386. //////////////////////////////////////////////////////////////////////////////////
  387. UINT16 Digest_getCurrentDisplayed(void)
  388. {
  389. return (g_DigestInfo->uCurrAnimatedItem);
  390. }
  391. //////////////////////////////////////////////////////////////////////////////////
  392. // Function name : Digest_getVisibleRange
  393. //
  394. // Purpose : Providing a mean to get the currently displayed digest items.
  395. //
  396. // Output Parameters : 
  397. // UINT16 *p_uFirstItem - Zero-based index of the first displayed item on screen.
  398. // UINT16 *p_uLastItem - Zero-based index of the last displayed item on screen.
  399. //
  400. // Return Value : void 
  401. //
  402. // Description : Calculating the indexes of the first and the last displayed items.
  403. //////////////////////////////////////////////////////////////////////////////////
  404. void Digest_getVisibleRange(UINT16 *o_pFirstItem, UINT16 *o_pLastItem)
  405. {
  406. dbg_printf(("Digest_getVisibleRange()n"));
  407. if(NULL != g_DigestInfo)
  408. {
  409. *o_pFirstItem = g_DigestInfo->uFirstVisibleItem;
  410. if (UNINITIALIZED == g_DigestInfo->uCurrAnimatedItem)
  411. *o_pLastItem = g_DigestInfo->uFirstVisibleItem;
  412. else
  413. *o_pLastItem = g_DigestInfo->uCurrAnimatedItem;
  414. }
  415. else
  416. {
  417. //return 0 if g_DigestInfo unmalloced
  418. *o_pFirstItem = 0;
  419. *o_pLastItem = 0;
  420. }
  421. return;
  422. }
  423. //////////////////////////////////////////////////////////////////////////////////
  424. // Function name : Digest_getDigestMode
  425. //
  426. // Purpose : Getting the current digest mode.
  427. //
  428. // Input Parameters : none
  429. //
  430. // Return Value : enDigestMode - the current digest mode: disc view or Track view 
  431. //
  432. // Description : returning the internal indication for the digest mode.
  433. //////////////////////////////////////////////////////////////////////////////////
  434. enDigestMode Digest_getDigestMode(void)
  435. {
  436. dbg_printf(("Digest_getDigestMode()n"));
  437. return (enDigestMode)g_DigestInfo->stateInfo.eDigestMode;
  438. }
  439. //////////////////////////////////////////////////////////////////////////////////
  440. // Function name : Digest_getValidOp
  441. //
  442. // Purpose : Getting the current valid operations: Prev / Next / None.
  443. //
  444. // Input Parameters : none
  445. //
  446. // Return Value : enDIGEST_VALID_OP 
  447. //
  448. // Description : Returning the internal variable that holds the available
  449. // navigation operations considering the current displayed
  450. // digest screen.
  451. //////////////////////////////////////////////////////////////////////////////////
  452. enDIGEST_VALID_OP Digest_getValidOp(void)
  453. {
  454. dbg_printf(("Digest_getValidOp()n"));
  455. return (enDIGEST_VALID_OP)g_DigestInfo->stateInfo.eValidOp;
  456. }
  457. //////////////////////////////////////////////////////////////////////////////////
  458. // Function name : Digest_firstItemDisplayed
  459. //
  460. // Purpose : Getting an indication whether the first item has already
  461. // been displayed, cause if so then for example the focus
  462. // frame can be displayed by the UI.
  463. //
  464. // Input Parameters : none
  465. //
  466. // Return Value : BOOL - TRUE in case the frame can be displayed, FALSE otherwise.
  467. //
  468. // Description : Checking the internal indication that indicates whether or not
  469. // the first frame of the first item on screen has been displayed.
  470. //////////////////////////////////////////////////////////////////////////////////
  471. BOOL Digest_firstItemDisplayed(void)
  472. {
  473. dbg_printf(("Digest_firstItemDisplayed()n"));
  474. if(NULL != g_DigestInfo)
  475. {
  476. if (eFrameValid == (enFrameState)g_DigestInfo->stateInfo.eFrameState)
  477. return(TRUE);
  478. }
  479. return(FALSE);
  480. }
  481. //////////////////////////////////////////////////////////////////////////////////
  482. // Function name : Digest_terminate
  483. //
  484. // Purpose : Terminating the digest operation.
  485. //
  486. // Input Parameters : none
  487. //
  488. // Return Value : void 
  489. //
  490. // Description : stop the decoder from running on digest mode.
  491. //////////////////////////////////////////////////////////////////////////////////
  492. void Digest_terminate(void)
  493. {
  494. dbg_printf(("Digest_terminate()n"));
  495. // Terminate the current Item, if it is not in Ready state
  496. if (eStateReady != g_DigestInfo->stateInfo.eCurrState) {
  497. _stopDigestItem(g_DigestInfo->uCurrAnimatedItem);
  498. }
  499. g_DigestInfo->stateInfo.eFrameState = eFrameNotValid;
  500. //resetting the decoder mode
  501. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_STOP, NULL);
  502. DEC_Digest_stop();
  503. drv_abort_play();
  504. //destroying the Timer
  505. timer_service_disable(g_DigestInfo->hTimer);
  506. timer_service_delete(g_DigestInfo->hTimer);
  507. //removing the event handler
  508. remove_core_event_handler(g_DigestInfo->hDigest_handler);
  509. g_DigestInfo->hDigest_handler = -1;
  510. //resetting the indexes
  511. g_DigestInfo->uCurrAnimatedItem = UNINITIALIZED;
  512. g_DigestInfo->uFirstVisibleItem = UNINITIALIZED;
  513. g_DigestInfo->uLastVisibleItem = UNINITIALIZED;
  514. g_uFramesToAnimate = 0;
  515. if(NULL != g_DigestInfo)
  516. {
  517. free(g_DigestInfo);
  518. g_DigestInfo = NULL;
  519. }
  520. return;
  521. }
  522. //////////////////////////////////////////////////////////////////////////////////
  523. // Internal functions
  524. static void _stopDigestItem(UINT16 i_uItemToStop)
  525. {
  526. if (UNINITIALIZED != i_uItemToStop)
  527. (*(g_DigestInfo->pfCallback))(i_uItemToStop, eDigestQuery_Stop);
  528. }
  529. //////////////////////////////////////////////////////////////////////////////////
  530. // Function name : _displayDigestItem
  531. //
  532. // Purpose : Displaying an item.
  533. //
  534. // Input Parameters : UINT16 i_uItemToAnimate - the index of the item to be annimated.
  535. //   BOOL bFirstFrame - an indication whether th first frame of
  536. // a Digest item is being displayed. After the first frame is 
  537. // displayed the drive should keep on playing.
  538. //
  539. // Return Value : static void 
  540. //
  541. // Description : Setting the decoder to the digest mode and displayng the 
  542. // current item.
  543. //////////////////////////////////////////////////////////////////////////////////
  544. static void _displayDigestItem(UINT16 i_uItemToAnimate, BOOL bFirstFrame)
  545. {
  546. dbg_printf(("Digest: _displayDigestItem - item = %d, bFirst=%d n", 
  547. i_uItemToAnimate, bFirstFrame));
  548. g_DigestInfo->stateInfo.eCurrState = eStateBusy;
  549. //clearing the screen upon displaying the first frame
  550. if ( (g_DigestInfo->uFirstVisibleItem == i_uItemToAnimate) &&
  551.  bFirstFrame && 
  552.  (UNINITIALIZED == g_DigestInfo->uItemOnFocus) ) //not in focus mode
  553. {
  554. DEC_Digest_clearScreen();
  555. }
  556. else {
  557. DEC_Digest_keepScreen();
  558. }
  559. // Select the Widnow-Position for the current Item
  560. DEC_Digest_setWindowPosition(i_uItemToAnimate - g_DigestInfo->uFirstVisibleItem);
  561. //presenting the item by using the callback function which is specific to each navigator
  562. if (bFirstFrame) {
  563. (*g_DigestInfo->pfCallback)(i_uItemToAnimate, eDigestQuery_Start);
  564. }
  565. else {
  566. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_PLAY, NULL);
  567. }
  568. return;
  569. }
  570. //////////////////////////////////////////////////////////////////////////////////
  571. // Function name : _onTimer
  572. //
  573. // Purpose : Handling a Timer event. 
  574. //
  575. // Input Parameters : None
  576. //
  577. // Return Value : None 
  578. //
  579. // Description : Generates a TICK_100 Event, in order to allow processing
  580. //   without restrictions.
  581. //////////////////////////////////////////////////////////////////////////////////
  582. #pragma argsused
  583. static void _onTimer(UINT8 hTimer)
  584. {
  585. send_tick(IE_CORE_TICK_100);
  586. }
  587. //////////////////////////////////////////////////////////////////////////////////
  588. // Function name : _eventHandler
  589. //
  590. // Purpose : Handling the received events. 
  591. //
  592. // Input Parameters : 
  593. // HDLR_OP Op
  594. // EVENT Event
  595. // void *Param
  596. //
  597. // Return Value : int 
  598. //
  599. // Description : Handling only the TICK event.
  600. //////////////////////////////////////////////////////////////////////////////////
  601. #pragma argsused
  602. static int _eventHandler(HDLR_OP Op, EVENT Event, void *Param)
  603. {
  604. if ((HDLR_EVENT == Op) && (IE_CORE_TICK_100 == Event)) {
  605. _onTick();
  606. }
  607. return(0);
  608. }
  609. //////////////////////////////////////////////////////////////////////////////////
  610. // Function name : _onTick
  611. //
  612. // Purpose : Checking on each tick if the last digest operation has 
  613. // finished.
  614. //
  615. // Input Parameters : none
  616. //
  617. // Return Value : static void 
  618. //
  619. // Description : Verifying that the Decoder is Idle, and if it is - invoking
  620. // the next appropriate action.
  621. //////////////////////////////////////////////////////////////////////////////////
  622. static void _onTick(void)
  623. {
  624. if ((eStateReady == g_DigestInfo->stateInfo.eCurrState) ||
  625. DEC_Digest_isIdle())
  626. {
  627. g_DigestInfo->stateInfo.eCurrState = eStateReady;
  628. if (eFrameNextTickValid == (enFrameState)g_DigestInfo->stateInfo.eFrameState)
  629. {
  630. g_DigestInfo->stateInfo.eFrameState = eFrameValid;
  631. if(g_DigestInfo->uFirstVisibleItem == g_DigestInfo->uLastVisibleItem)
  632. {
  633. _stopDigestItem(g_DigestInfo->uCurrAnimatedItem);
  634. }
  635. }
  636. //checking if there is a pending command cause it should be performed first
  637. if (g_DigestInfo->stateInfo.bIsPendingEvent)
  638. {
  639. //switch on the pending event
  640. switch ((enPendingEvent)g_DigestInfo->stateInfo.ePendingEvent)
  641. {
  642. case eDigestNext:
  643. OnDigestnext();
  644. break;
  645. case eDigestPrev:
  646. OnDigestprev();
  647. break;
  648. case eDigestStop:
  649. Digest_terminate();
  650. break;
  651. case eDigestFocus:
  652. Digest_setFocus(g_DigestInfo->uItemOnFocus);
  653. break;
  654. }
  655. g_DigestInfo->stateInfo.bIsPendingEvent = FALSE;
  656. }
  657. //The following order of the checks is crucial:
  658. //Are there more intro frames to animate for the current item?
  659. else if (g_uFramesToAnimate > 0)
  660. {
  661. //decoding next picture only if it's the first item or last picture copy done
  662. if((g_DigestInfo->uCurrAnimatedItem == (g_DigestInfo->uFirstVisibleItem-1))||
  663. DEC_Digest_IsCopyDone() )
  664. {
  665. //is this the first animation frame for the item?
  666. if (g_uFramesToAnimate == g_DigestInfo->uIntroFramesCount)
  667. {
  668. // First of all, stop the current Item
  669. _stopDigestItem(g_DigestInfo->uCurrAnimatedItem);
  670. g_DigestInfo->uCurrAnimatedItem++;
  671. _displayDigestItem(g_DigestInfo->uCurrAnimatedItem, TRUE);
  672. //If this is the first item on screen then setting the indication
  673. if (g_DigestInfo->uCurrAnimatedItem == g_DigestInfo->uFirstVisibleItem)
  674. {
  675. g_DigestInfo->stateInfo.eFrameState = eFrameNextTickValid;
  676. }
  677. }
  678. else
  679. {
  680. _displayDigestItem(g_DigestInfo->uCurrAnimatedItem, FALSE);
  681. }
  682. g_uFramesToAnimate--;
  683. }
  684. }
  685. //are there more digest items to display in the current screen?
  686. else if ((g_DigestInfo->uCurrAnimatedItem < g_DigestInfo->uLastVisibleItem) ||
  687.  (UNINITIALIZED == g_DigestInfo->uCurrAnimatedItem))
  688. {
  689. g_uFramesToAnimate = g_DigestInfo->uIntroFramesCount;
  690. }
  691. //is there an item being focused?
  692. else if (UNINITIALIZED != g_DigestInfo->uItemOnFocus)
  693. {
  694. //is this a new focused item?
  695. if ((g_DigestInfo->uItemOnFocus != g_DigestInfo->uLastFocusedItem) ||
  696. (UNINITIALIZED == g_DigestInfo->uLastFocusedItem))
  697. {
  698. _stopDigestItem(g_DigestInfo->uCurrAnimatedItem);
  699. g_DigestInfo->uLastFocusedItem = g_DigestInfo->uItemOnFocus;
  700. _displayDigestItem(g_DigestInfo->uItemOnFocus, TRUE);
  701. }
  702. else
  703. _displayDigestItem(g_DigestInfo->uItemOnFocus, FALSE);
  704. }
  705. }
  706. else if (TRUE == (*g_DigestInfo->pfCallback)(g_DigestInfo->uCurrAnimatedItem, eDigestQuery_IsFinished))
  707. {
  708. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_STOP, NULL);
  709. g_DigestInfo->uLastFocusedItem = UNINITIALIZED;
  710. }
  711. //<<<mikex_0827_2003_a: add the recovery error mechanism in digest mode
  712. else if(g_DigestReadDiscError > 0 )
  713. {
  714. DEC_PlaybackCommand(DEC_PLAYBACK_CMD_STOP, NULL);
  715. g_DigestReadDiscError =0;
  716. }//mikex_0827_2003_a>>>
  717. return;
  718. }
  719. UINT16 DigestGetFirstItem(void)
  720. {
  721. return g_DigestInfo->uFirstVisibleItem;
  722. }
  723. #ifdef S1_GUI // ZKR GLV778
  724. BOOL digest_pending(void)
  725. {
  726. return g_DigestInfo->stateInfo.bIsPendingEvent;
  727. }
  728. #endif
  729. //////////////////////////////////////////////////////////////////////////////////
  730. // Function name : Digest_IsFirstDigestWindow
  731. //
  732. // Purpose : Check if current display window is the first one on the screen
  733. //
  734. // Input Parameters : 
  735. //
  736. // Return Value : TRUE: Yes
  737. //                         : FALSE: No
  738. //
  739. // Description : 
  740. //////////////////////////////////////////////////////////////////////////////////
  741. BOOL Digest_IsFirstDigestWindow()
  742. {
  743. return ( 0 == ( ( g_DigestInfo->uCurrAnimatedItem - g_DigestInfo->uFirstVisibleItem ) % DIGEST_MAX_FRAMES_ON_SCREEN ) );
  744. }
  745. #endif //#if (defined(SVCD_DIGEST_SUPPORT) || defined(DVD_DIGEST_SUPPORT))