source: svn/trunk/newcon3bcm2_21bu/magnum/portinginterface/xvd/7552/bxvd_pvr.c

Last change on this file was 2, checked in by phkim, 11 years ago

1.phkim

  1. revision copy newcon3sk r27
  • Property svn:executable set to *
File size: 28.6 KB
Line 
1/***************************************************************************
2 *     Copyright (c) 2004-2012, Broadcom Corporation
3 *     All Rights Reserved
4 *     Confidential Property of Broadcom Corporation
5 *
6 *  THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE
7 *  AGREEMENT  BETWEEN THE USER AND BROADCOM.  YOU HAVE NO RIGHT TO USE OR
8 *  EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT.
9 *
10 * $brcm_Workfile: bxvd_pvr.c $
11 * $brcm_Revision: Hydra_Software_Devel/37 $
12 * $brcm_Date: 2/1/12 1:58p $
13 *
14 * Module Description:
15 *   See Module Overview below
16 *
17 * Revision History:
18 *
19 * $brcm_Log: /magnum/portinginterface/xvd/7401/bxvd_pvr.c $
20 *
21 * Hydra_Software_Devel/37   2/1/12 1:58p btosi
22 * SW7425-2270: add support for IgnoreNRTUnderflow
23 *
24 * Hydra_Software_Devel/36   7/20/11 3:05p davidp
25 * SW7420-2001: Reorder header file includes.
26 *
27 * Hydra_Software_Devel/35   8/3/10 2:03p btosi
28 * SW7400-2870: added BXVD_[Set/Get]PlaybackRate(_isr)
29 *
30 * Hydra_Software_Devel/34   4/27/10 4:59p nilesh
31 * SW7601-186: Fixed pause/slow motion interaction in XDM to be compatible
32 * with XVD DMv2
33 *
34 * Hydra_Software_Devel/33   3/24/10 3:00p davidp
35 * SW7405-3137: Save and restore extended CDB read register address for
36 * decode restart cases.
37 *
38 * Hydra_Software_Devel/32   2/25/10 4:24p nilesh
39 * SW7405-2993: XDM Merge
40 *
41 * Hydra_Software_Devel/31   11/30/09 4:41p btosi
42 * SW7405-3245: added BXVD_DBG_* macros.  Map to either BDBG_INSTANCE_* or
43 * BDBG_* at compile.
44 *
45 * Hydra_Software_Devel/30   7/29/09 2:45p pblanco
46 * PR57177: There is no need for a GetFrameAdvanceMode API. Removing it.
47 *
48 * Hydra_Software_Devel/29   7/29/09 1:45p pblanco
49 * PR57177: Added BXVD_PVR_GetFrameAdvance and
50 * BXVD_PVR_GetFrameAdvance_isr functions.
51 *
52 * Hydra_Software_Devel/28   3/27/09 3:02p btosi
53 * PR52959: added support for programmable playback rate in vsync mode
54 *
55 * Hydra_Software_Devel/27   3/26/09 6:13p nilesh
56 * PR53580: Cleaned up DM structs
57 *
58 * Hydra_Software_Devel/26   3/24/09 4:52p nilesh
59 * PR52905: Added ISR versions of most get/set functions.  Cleaned up
60 * formatting.  Removed critical sections for some get functions.
61 *
62 * Hydra_Software_Devel/25   1/21/09 2:02p nilesh
63 * PR45052: Converted BDBG_xxx to BDBG_INSTANCE_xxx calls to support
64 * multiple channels
65 *
66 * Hydra_Software_Devel/24   12/5/08 5:53p davidp
67 * PR49533: Do not preserve decoder counters if decoder is not actively
68 * decoding.
69 *
70 * Hydra_Software_Devel/23   11/20/08 5:12p davidp
71 * PR49533: Add bPreserveCounters boolean to channel structure to not
72 * reset decoder counters for certain StartDecode situations.
73 *
74 * Hydra_Software_Devel/22   8/5/08 2:00p nilesh
75 * PR29915: Improve BDBG_MSG output
76 *
77 * Hydra_Software_Devel/21   10/22/07 10:39a btosi
78 * PR30310: added BXVD_PVR_GetGopTrickMode()
79 *
80 * Hydra_Software_Devel/20   9/21/07 7:45a pblanco
81 * PR35163: Fix compiler warning about unused argument.
82 *
83 * Hydra_Software_Devel/19   9/6/07 5:35p nilesh
84 * PR29915: Added BERR_TRACE wrapper around all return codes
85 *
86 * Hydra_Software_Devel/18   8/30/07 4:46p rayshap
87 * PR33893: Add support for BXVD_PVR_Set/GetAutoValidateStcOnPause
88 *
89 * Hydra_Software_Devel/17   6/13/07 8:07a btosi
90 * PR30310: added BXVD_PVR_SetGopTrickMode() to mainline branch
91 *
92 * Hydra_Software_Devel/17   6/12/07 3:50p btosi
93 * PR30310: added BXVD_PVR_SetGopTrickMode() to mainline branch
94 *
95 * Hydra_Software_Devel/17   6/12/07 3:48p btosi
96 * PR30310: added BXVD_PVR_SetGopTrickMode() to mainline branch
97 *
98 * Hydra_Software_Devel/16   4/11/07 2:27p davidp
99 * PR29581: Update channels bHostSparseMode before decoder is started in
100 * BXVD_PVR_SetHostSparseMode().
101 *
102 * Hydra_Software_Devel/15   1/10/07 5:58p davidp
103 * PR26837: If in sparse mode when bxvd_SetSkipPictureModeDecode is
104 * called, stop/start decode.
105 *
106 * Hydra_Software_Devel/14   12/12/06 3:01p davidp
107 * PR25443: Merge Simplified FW API branch into mainline
108 *
109 * Hydra_Software_Devel/xvd_7401_PR25443_Simplified_FW_API/3   12/11/06 4:58p davidp
110 * PR25443: Clear PVR state when BXVD_StopDecode is called unless preserve
111 * flag is set.
112 *
113 * Hydra_Software_Devel/xvd_7401_PR25443_Simplified_FW_API/2   11/15/06 4:16p davidp
114 * PR25443: Merge mainline changes into branch, cleanup code.
115 *
116 * Hydra_Software_Devel/xvd_7401_PR25443_Simplified_FW_API/1   11/6/06 6:15p davidp
117 * PR25443: Initial checkin of Simplified FW API support
118 *
119 * Hydra_Software_Devel/13   3/28/06 11:48a pblanco
120 * PR20274: Removed old trick mode API code.
121 *
122 * Hydra_Software_Devel/12   3/24/06 1:35p pblanco
123 * PR20274: Interim checkin prior to FW implementation.
124 *
125 * Hydra_Software_Devel/11   3/15/06 4:10p pblanco
126 * PR20197: It is no longer necessary for BXVD_PVR_SetSlowMotionRate to
127 * explicitly set the display field mode now that the correct structure
128 * member is being set by BXVD_SetDisplayFieldMode.
129 *
130 * Hydra_Software_Devel/10   3/15/06 3:35p pblanco
131 * PR20197: Added BDBG_MSG output to BXVD_PVR_SetSlowMotionRate.
132 *
133 * Hydra_Software_Devel/9   3/14/06 4:43p pblanco
134 * PR20197: Fixed test for slow motion rate so that only value > 1 changed
135 * to top field only. Also made sure that values of 0 are allowed as
136 * parameters.
137 *
138 * Hydra_Software_Devel/8   3/14/06 3:53p pblanco
139 * PR20197: Don't allow BXVD_SetSlowMotionRate to force field mode to top
140 * only when setting rate to 0 or 1 (normal).
141 *
142 * Hydra_Software_Devel/7   3/9/06 5:06p pblanco
143 * PR19785: Removed extraneous top field only settings for BTP trick mode
144 * enable.
145 *
146 * Hydra_Software_Devel/6   3/9/06 2:52p pblanco
147 * PR19792: interim checkin.
148 *
149 * Hydra_Software_Devel/5   1/30/06 9:01a pblanco
150 * PR19308: Pass trick mode as an unsigned long in
151 * BXVD_P_HostCmdDecEnableBRCMTrickPlay.
152 *
153 * Hydra_Software_Devel/4   1/10/06 11:19a pblanco
154 * PR16052: Added call to BXVD_P_HostCmdDecEnableBRCMTrickPlay to
155 * BXVD_PVR_EnableBTPMode.
156 *
157 * Hydra_Software_Devel/3   1/5/06 2:44p pblanco
158 * PR16052: Removed deprecated code.
159 *
160 * Hydra_Software_Devel/2   1/3/06 2:43p pblanco
161 * PR16052: Changed BRCM trick mode APIs to new BTPMode format. Removed
162 * unused Aas well.
163 *
164 * Hydra_Software_Devel/1   12/13/05 11:33a pblanco
165 * PR16052: Initial check in.
166 *
167 ****************************************************************************/
168#include "bstd.h"
169#include "bxvd.h"
170#include "bxvd_platform.h"
171#include "bxvd_priv.h"
172#include "bxvd_pvr.h"
173
174BDBG_MODULE(BXVD_PVR);
175
176/***************************************************************************
177***************************************************************************/
178BERR_Code BXVD_PVR_EnablePause
179(
180   BXVD_ChannelHandle hXvdCh,
181   bool bEnablePause
182   )
183{
184   BERR_Code rc = BERR_SUCCESS;
185
186   BDBG_ENTER(BXVD_PVR_EnablePause);
187
188   BKNI_EnterCriticalSection();
189   rc = BXVD_PVR_EnablePause_isr(
190      hXvdCh,
191      bEnablePause
192      );
193   BKNI_LeaveCriticalSection();
194
195   BDBG_LEAVE(BXVD_PVR_EnablePause);
196   return BERR_TRACE(rc);
197}
198
199BERR_Code BXVD_PVR_EnablePause_isr
200(
201   BXVD_ChannelHandle hXvdCh,
202   bool bEnablePause
203   )
204{
205   BERR_Code rc;
206   BXDM_Picture_Rate stCurrentPlaybackRate;
207   BDBG_ENTER(BXVD_PVR_EnablePause_isr);
208
209   BDBG_ASSERT(hXvdCh);
210
211   rc = BXDM_PictureProvider_GetPlaybackRate_isr(
212            hXvdCh->hPictureProvider,
213            &stCurrentPlaybackRate);
214
215   BXVD_DBG_MSG(hXvdCh, ("BXVD_PVR_EnablePause(%d)", bEnablePause));
216
217   if ( BERR_SUCCESS == rc )
218   {
219      switch ( bEnablePause )
220      {
221         case true:
222
223            /* SW7400-2870: pause if not already paused by a previous call to BXVD_PVR_EnablePause.*/
224            if ( false == hXvdCh->bPauseActive  )
225            {
226               hXvdCh->bPauseActive = true;
227               
228               hXvdCh->stSavedPlaybackRate = stCurrentPlaybackRate;
229               hXvdCh->bSavedPlaybackRateValid = true;
230
231               stCurrentPlaybackRate.uiNumerator = 0;
232               stCurrentPlaybackRate.uiDenominator = 1;
233
234               rc = BXDM_PictureProvider_SetPlaybackRate_isr(
235                        hXvdCh->hPictureProvider,
236                        &stCurrentPlaybackRate
237                        );
238            }
239            break;
240
241         case false:
242
243            /* SW7400-2870: un-pause if previously paused by calling BXVD_PVR_EnablePause. */
244            if ( true == hXvdCh->bPauseActive  )
245            {
246               hXvdCh->bPauseActive = false;
247
248               if ( true == hXvdCh->bSavedPlaybackRateValid )
249               {
250                  rc = BXDM_PictureProvider_SetPlaybackRate_isr(
251                           hXvdCh->hPictureProvider,
252                           &hXvdCh->stSavedPlaybackRate
253                           );
254               }
255               else
256               {
257                  stCurrentPlaybackRate.uiNumerator = 1;
258                  stCurrentPlaybackRate.uiDenominator = 1;
259
260                  rc = BXDM_PictureProvider_SetPlaybackRate_isr(
261                           hXvdCh->hPictureProvider,
262                           &stCurrentPlaybackRate
263                           );
264
265                  hXvdCh->stSavedPlaybackRate = stCurrentPlaybackRate;
266                  hXvdCh->bSavedPlaybackRateValid = true;
267               }
268            }
269            break;
270      }
271   }
272
273   BDBG_LEAVE(BXVD_PVR_EnablePause_isr);
274   return BERR_TRACE(rc);
275}
276
277/***************************************************************************
278***************************************************************************/
279BERR_Code BXVD_PVR_GetPauseStatus
280(
281   BXVD_ChannelHandle hXvdCh,
282   bool *pbPauseStatus
283   )
284{
285   BERR_Code rc;
286
287   BDBG_ENTER(BXVD_PVR_GetPauseStatus);
288
289   rc = BXVD_PVR_GetPauseStatus_isr(
290      hXvdCh,
291      pbPauseStatus
292      );
293
294   BDBG_LEAVE(BXVD_PVR_GetPauseStatus);
295   return BERR_TRACE(rc);
296}
297
298BERR_Code BXVD_PVR_GetPauseStatus_isr
299(
300   BXVD_ChannelHandle hXvdCh,
301   bool *pbPauseStatus
302   )
303{
304   BERR_Code rc=BERR_SUCCESS;
305   BDBG_ENTER(BXVD_PVR_GetPauseStatus_isr);
306
307   BDBG_ASSERT(hXvdCh);
308   BDBG_ASSERT(pbPauseStatus);
309
310   /* SW7400-2870: within XDM, stCurrentPlaybackRate.uiNumerator can be set to '0' by either
311    * BXVD_PVR_EnablePause or BXVD_SetPlaybackRate. Use the new flag 'bPauseActive'
312    * to determine if the system was paused by calling BXVD_PVR_EnablePause.
313    */
314   *pbPauseStatus = hXvdCh->bPauseActive;
315
316   BDBG_LEAVE(BXVD_PVR_GetPauseStatus_isr);
317   return BERR_TRACE( rc );
318}
319
320/***************************************************************************
321DEPRECATED: SW7400-2870: use BXVD_SetPlaybackRate(isr) instead
322***************************************************************************/
323BERR_Code BXVD_PVR_SetSlowMotionRate
324(
325   BXVD_ChannelHandle hXvdCh,
326   unsigned long ulRate
327   )
328{
329   BERR_Code rc;
330
331   BDBG_ENTER(BXVD_PVR_SetSlowMotionRate);
332
333   BKNI_EnterCriticalSection();
334   rc = BXVD_PVR_SetSlowMotionRate_isr(
335      hXvdCh,
336      ulRate
337      );
338   BKNI_LeaveCriticalSection();
339
340   BDBG_LEAVE(BXVD_PVR_SetSlowMotionRate);
341   return BERR_TRACE(rc);
342}
343
344BERR_Code BXVD_PVR_SetSlowMotionRate_isr
345(
346   BXVD_ChannelHandle hXvdCh,
347   unsigned long ulRate
348   )
349{
350   BERR_Code rc=BERR_SUCCESS;
351   BXDM_Picture_Rate stPlaybackRate;
352   BDBG_ENTER(BXVD_PVR_SetSlowMotionRate_isr);
353
354   BDBG_ASSERT(hXvdCh);
355
356   BXVD_DBG_MSG(hXvdCh, ("BXVD_PVR_SetSlowMotionRate(%d)", ulRate));
357
358   /* The addition of "uiPvrPlaybackRate" allows the playback rate to be treated roughly
359    * as a percentage of normal playback.
360    */
361   BKNI_Memset( &stPlaybackRate, 0, sizeof( BXDM_Picture_Rate ) );
362
363   stPlaybackRate.uiNumerator = 1;
364   if ( ulRate > 1 )
365   {
366      stPlaybackRate.uiDenominator = ulRate;
367   }
368   else
369   {
370      stPlaybackRate.uiDenominator = 1;
371   }
372
373   /* SW7601-186: XVD + DMv2 maintained separate pause and slow motion states
374    * and put precedence on the paused state.  However, XVD + XDM implements pause
375    * and slow motion using the same single state (the playback rate) in XDM.
376    *
377    * I.e. pause --> playback_rate = 0
378    *      slow motion --> playback_rate = slow motion rate
379    *
380    * The following call sequence exposed an XDM compatibility issue:
381    *    1) BXVD_PVR_EnablePause_isr(true) <-- playback_rate = 0
382    *    2) BXVD_PVR_SetSlowMotionRate_isr(1) <-- playback_rate = 100% (but should stay at 0)
383    *
384    * To maintain backwards compatibility with XVD + DMv2, the XDM playback rate
385    * is not changed if the system is in a paused state.  The slow motion rate is
386    * instead remembered and set when unpaused.
387    */
388   if ( false == hXvdCh->bPauseActive )
389   {
390      rc = BXDM_PictureProvider_SetPlaybackRate_isr(
391               hXvdCh->hPictureProvider,
392               &stPlaybackRate
393               );
394   }
395
396   hXvdCh->stSavedPlaybackRate = stPlaybackRate;
397   hXvdCh->bSavedPlaybackRateValid = true;
398
399   BDBG_LEAVE(BXVD_PVR_SetSlowMotionRate);
400   return BERR_TRACE( rc );
401}
402
403/***************************************************************************
404***************************************************************************/
405BERR_Code BXVD_PVR_GetSlowMotionRate
406(
407   BXVD_ChannelHandle hXvdCh,
408   unsigned long *pSMRate
409   )
410{
411   BERR_Code rc;
412   BDBG_ENTER(BXVD_PVR_GetSlowMotionRate);
413
414   rc = BXVD_PVR_GetSlowMotionRate_isr(
415      hXvdCh,
416      pSMRate
417      );
418
419   BDBG_LEAVE(BXVD_PVR_GetSlowMotionRate);
420   return BERR_TRACE(rc);
421}
422
423BERR_Code BXVD_PVR_GetSlowMotionRate_isr
424(
425   BXVD_ChannelHandle hXvdCh,
426   unsigned long *pSMRate
427   )
428{
429   BERR_Code rc=BERR_SUCCESS;
430   BXDM_Picture_Rate stPlaybackRate;
431   BDBG_ENTER(BXVD_PVR_GetSlowMotionRate_isr);
432
433   BDBG_ASSERT(hXvdCh);
434   BDBG_ASSERT(pSMRate);
435
436   /* SW7400-2870: if not paused by a call to BXVD_PVR_EnablePause, retrieve
437    * the playback rate from XDM.  If paused, return the valued saved in the
438    * channel structure.
439    */
440   if ( false == hXvdCh->bPauseActive )
441   {
442      rc = BXDM_PictureProvider_GetPlaybackRate_isr(
443                  hXvdCh->hPictureProvider,
444                  &stPlaybackRate
445                  );
446
447      if (  BERR_SUCCESS != rc )
448      {
449         *pSMRate = 0;
450         BXVD_DBG_WRN(hXvdCh, ("BXVD_PVR_GetSlowMotionRate_isr() BXDM_PictureProvider_GetPlaybackRate_isr returned %d", rc ));
451         return BERR_TRACE( rc );
452      }
453   }
454   else
455   {
456      if ( true == hXvdCh->bSavedPlaybackRateValid )
457      {
458         stPlaybackRate = hXvdCh->stSavedPlaybackRate;
459      }
460      else
461      {
462         /* It should be impossible to hit this case.  If "bPauseActive" is true,
463          * there should always be a saved playback rate.  Add this warning in the
464          * event a logic bug creeps in.
465          */
466         stPlaybackRate.uiNumerator = 1;
467         stPlaybackRate.uiDenominator = 1;
468         BXVD_DBG_WRN(hXvdCh, ("BXVD_PVR_GetSlowMotionRate_isr() bPauseActive but no saved playback rate."));
469      }
470   }
471
472   if ( 0 == stPlaybackRate.uiNumerator )
473   {
474      *pSMRate = 0;
475   }
476   else
477   {
478      *pSMRate = stPlaybackRate.uiDenominator / stPlaybackRate.uiNumerator;
479   }
480
481   BDBG_LEAVE(BXVD_PVR_GetSlowMotionRate_isr);
482   return BERR_TRACE( rc );
483}
484
485/***************************************************************************
486***************************************************************************/
487BERR_Code BXVD_PVR_FrameAdvance
488(
489   BXVD_ChannelHandle hXvdCh,
490   BXVD_PVR_FrameAdvanceMode eFrameAdvMode
491   )
492{
493   BERR_Code rc;
494
495   BDBG_ENTER(BXVD_PVR_FrameAdvance);
496
497   BKNI_EnterCriticalSection();
498   rc = BXVD_PVR_FrameAdvance_isr(
499      hXvdCh,
500      eFrameAdvMode
501      );
502   BKNI_LeaveCriticalSection();
503
504   BDBG_LEAVE(BXVD_PVR_FrameAdvance);
505   return BERR_TRACE(rc);
506}
507
508BERR_Code BXVD_PVR_FrameAdvance_isr
509(
510   BXVD_ChannelHandle hXvdCh,
511   BXVD_PVR_FrameAdvanceMode eFrameAdvMode
512   )
513{
514   BERR_Code rc;
515   BDBG_ENTER(BXVD_PVR_FrameAdvance_isr);
516
517   BDBG_ASSERT(hXvdCh);
518   BDBG_ASSERT(eFrameAdvMode <= BXVD_PVR_FrameAdvanceMode_eField_by_Field);
519
520   switch ( eFrameAdvMode )
521   {
522      case BXVD_PVR_FrameAdvanceMode_eFrame_by_Frame:
523         rc = BXDM_PictureProvider_SetFrameAdvanceMode_isr(
524               hXvdCh->hPictureProvider,
525               BXDM_PictureProvider_FrameAdvanceMode_eFrameByField
526               );
527         break;
528
529      case BXVD_PVR_FrameAdvanceMode_eField_by_Field:
530         rc = BXDM_PictureProvider_SetFrameAdvanceMode_isr(
531               hXvdCh->hPictureProvider,
532               BXDM_PictureProvider_FrameAdvanceMode_eField
533               );
534         break;
535
536      default:
537         BXVD_DBG_ERR(hXvdCh, ("Unknown frame advance mode (%d)", eFrameAdvMode));
538         return BERR_TRACE(BERR_INVALID_PARAMETER);
539   }
540
541   BXVD_DBG_MSG(hXvdCh, ("BXVD_PVR_FrameAdvance(%d)", eFrameAdvMode));
542
543   BDBG_LEAVE(BXVD_PVR_FrameAdvance_isr);
544   return BERR_TRACE( rc );
545}
546
547/***************************************************************************
548***************************************************************************/
549BERR_Code BXVD_PVR_EnableReverseFields(
550   BXVD_ChannelHandle hXvdCh,
551   bool bEnable
552   )
553{
554   BERR_Code rc;
555
556   BDBG_ENTER(BXVD_PVR_EnableReverseFields);
557
558   BKNI_EnterCriticalSection();
559   rc = BXVD_PVR_EnableReverseFields_isr(
560      hXvdCh,
561      bEnable
562      );
563   BKNI_LeaveCriticalSection();
564
565   BDBG_LEAVE(BXVD_PVR_EnableReverseFields);
566   return BERR_TRACE(rc);
567}
568
569BERR_Code BXVD_PVR_EnableReverseFields_isr(
570   BXVD_ChannelHandle hXvdCh,
571   bool bEnable
572   )
573{
574   BERR_Code rc;
575   BDBG_ENTER(BXVD_PVR_EnableReverseFields_isr);
576
577   BDBG_ASSERT(hXvdCh);
578
579   rc = BXDM_PictureProvider_SetReverseFieldsMode_isr(
580         hXvdCh->hPictureProvider,
581         bEnable
582         );
583
584   BXVD_DBG_MSG(hXvdCh, ("BXVD_PVR_EnableReverseFields(%d)", bEnable));
585
586   BDBG_LEAVE(BXVD_PVR_EnableReverseFields_isr);
587   return BERR_TRACE( rc );
588}
589
590/***************************************************************************
591***************************************************************************/
592BERR_Code BXVD_PVR_GetReverseFieldStatus
593(
594   BXVD_ChannelHandle hXvdCh,
595   bool *pbEnable
596   )
597{
598   BERR_Code rc;
599
600   BDBG_ENTER(BXVD_PVR_GetReverseFieldStatus);
601
602   rc = BXVD_PVR_GetReverseFieldStatus_isr(
603      hXvdCh,
604      pbEnable
605      );
606
607   BDBG_LEAVE(BXVD_PVR_GetReverseFieldStatus);
608   return BERR_TRACE(rc);
609}
610
611BERR_Code BXVD_PVR_GetReverseFieldStatus_isr
612(
613   BXVD_ChannelHandle hXvdCh,
614   bool *pbEnable
615   )
616{
617   BERR_Code rc;
618   BDBG_ENTER(BXVD_PVR_GetReverseFieldStatus_isr);
619
620   BDBG_ASSERT(hXvdCh);
621   BDBG_ASSERT(pbEnable);
622
623   rc = BXDM_PictureProvider_GetReverseFieldsMode_isr(
624         hXvdCh->hPictureProvider,
625         pbEnable
626         );
627
628   BDBG_LEAVE(BXVD_PVR_GetReverseFieldStatus_isr);
629   return BERR_TRACE( rc );
630}
631
632/***************************************************************************
633***************************************************************************/
634BERR_Code BXVD_PVR_SetHostSparseMode(
635   BXVD_ChannelHandle hXvdCh,
636   bool bSparseMode
637   )
638{
639   uint32_t            i;
640
641   BAVC_XptContextMap  XptContextMap;
642   BAVC_XptContextMap  aXptContextMap_Extended[BXVD_NUM_EXT_RAVE_CONTEXT];
643
644   bool bCurSparseMode = hXvdCh->stDecoderContext.bHostSparseMode;
645
646   BXDM_PictureProvider_PreserveStateSettings stPreserveStateSettings;
647   BERR_Code rc = BERR_SUCCESS;
648
649   BDBG_ENTER(BXVD_PVR_SetHostSparseMode);
650   BDBG_ASSERT(hXvdCh);
651
652   hXvdCh->stDecoderContext.bHostSparseMode = bSparseMode;
653
654   if ((bCurSparseMode != bSparseMode) && (hXvdCh->eDecoderState == BXVD_P_DecoderState_eActive))
655   {
656      if ((hXvdCh->sDecodeSettings.eVideoCmprStd != BAVC_VideoCompressionStd_eH264) &&
657          (bSparseMode == true))
658      {
659         BXVD_DBG_WRN(hXvdCh, ("Sparse mode enabled on Non H264 stream, Sparse mode now disabled"));
660         hXvdCh->stDecoderContext.bHostSparseMode = false;
661      }
662      else
663      {
664         BXVD_DBG_MSG(hXvdCh, ("BXVD_PVR_SetHostSparseMode: Stopping and starting decoding"));
665
666         BERR_TRACE(BXDM_PictureProvider_GetDefaultPreserveStateSettings(
667                  hXvdCh->hPictureProvider,
668                  &stPreserveStateSettings
669                  ));
670
671         stPreserveStateSettings.bDisplay = true;
672         stPreserveStateSettings.bCounters = true;
673         hXvdCh->bPreserveState = true;
674
675         BERR_TRACE(BXDM_PictureProvider_SetPreserveStateSettings_isr(
676                  hXvdCh->hPictureProvider,
677                  &stPreserveStateSettings
678                  ));
679
680         BERR_TRACE(BXVD_StopDecode(hXvdCh));
681
682         /* Reset XPT Rave CDB read register address */
683         XptContextMap.CDB_Read = hXvdCh->ulXptCDB_Read;
684         hXvdCh->sDecodeSettings.pContextMap = &XptContextMap;
685
686         for (i = 0; i < hXvdCh->sDecodeSettings.uiContextMapExtNum; i++)
687         {
688            hXvdCh->sDecodeSettings.aContextMapExtended[i] = &aXptContextMap_Extended[i];
689            aXptContextMap_Extended[i].CDB_Read = hXvdCh->aulXptCDB_Read_Extended[i];
690         }
691
692         rc = BERR_TRACE(BXVD_StartDecode(hXvdCh, &hXvdCh->sDecodeSettings));
693
694         hXvdCh->bPreserveState = false;
695      }
696   }
697   else
698   {
699      BXVD_DBG_MSG(hXvdCh, ("BXVD_PVR_SetHostSparseMode: NOT stopping/starting decoding.. Letting flush do it!!!"));
700   }
701
702   BDBG_LEAVE(BXVD_PVR_SetHostSparseMode);
703   return BERR_TRACE(rc);
704}
705
706/***************************************************************************
707***************************************************************************/
708BERR_Code BXVD_PVR_GetHostSparseMode
709(
710   BXVD_ChannelHandle hXvdCh,
711   bool *pbSparseMode
712   )
713{
714   BDBG_ENTER(BXVD_PVR_GetHostSparseMode);
715   BDBG_ASSERT(hXvdCh);
716   BDBG_ASSERT(pbSparseMode);
717
718   *pbSparseMode = hXvdCh->stDecoderContext.bHostSparseMode;
719
720   BDBG_LEAVE(BXVD_PVR_GetHostSparseMode);
721   return BERR_TRACE(BERR_SUCCESS);
722}
723
724/***************************************************************************
725***************************************************************************/
726BERR_Code BXVD_PVR_SetGopTrickMode
727(
728   BXVD_ChannelHandle hXvdCh,
729   bool bEnableTrickMode
730   )
731{
732   BERR_Code rc;
733
734   BDBG_ENTER(BXVD_PVR_SetGopTrickMode);
735
736   BKNI_EnterCriticalSection();
737   rc = BXVD_PVR_SetGopTrickMode_isr(
738      hXvdCh,
739      bEnableTrickMode
740      );
741   BKNI_LeaveCriticalSection();
742
743   BDBG_LEAVE(BXVD_PVR_SetGopTrickMode);
744   return BERR_TRACE(rc);
745}
746
747BERR_Code BXVD_PVR_SetGopTrickMode_isr
748(
749   BXVD_ChannelHandle hXvdCh,
750   bool bEnableTrickMode
751   )
752{
753   BDBG_ENTER(BXVD_PVR_SetGopTrickMode_isr);
754
755   BDBG_ASSERT(hXvdCh);
756
757   hXvdCh->stDecoderContext.bReversePlayback = bEnableTrickMode;
758
759   BXVD_DBG_MSG(hXvdCh, ("BXVD_PVR_SetGopTrickMode(%d)", bEnableTrickMode));
760
761   BDBG_LEAVE(BXVD_PVR_SetGopTrickMode_isr);
762   return BERR_TRACE(BERR_SUCCESS);
763}
764
765/***************************************************************************
766***************************************************************************/
767BERR_Code BXVD_PVR_GetGopTrickMode
768(
769   BXVD_ChannelHandle hXvdCh,
770   bool *pbEnableTrickMode
771   )
772{
773   BERR_Code rc;
774
775   BDBG_ENTER(BXVD_PVR_GetGopTrickMode);
776
777   rc = BXVD_PVR_GetGopTrickMode_isr(
778      hXvdCh,
779      pbEnableTrickMode
780      );
781
782   BDBG_LEAVE(BXVD_PVR_GetGopTrickMode);
783   return BERR_TRACE(rc);
784}
785
786BERR_Code BXVD_PVR_GetGopTrickMode_isr
787(
788   BXVD_ChannelHandle hXvdCh,
789   bool *pbEnableTrickMode
790   )
791{
792   BDBG_ENTER(BXVD_PVR_GetGopTrickMode_isr);
793
794   BDBG_ASSERT(hXvdCh);
795   BDBG_ASSERT(pbEnableTrickMode);
796
797   *pbEnableTrickMode = hXvdCh->stDecoderContext.bReversePlayback;
798
799   BDBG_LEAVE(BXVD_PVR_GetGopTrickMode_isr);
800   return BERR_TRACE(BERR_SUCCESS);
801}
802
803/***************************************************************************
804***************************************************************************/
805BERR_Code BXVD_PVR_SetAutoValidateStcOnPause
806(
807   BXVD_ChannelHandle hXvdCh,
808   bool bAutoValidateStcOnPause
809   )
810{
811   BERR_Code rc;
812
813   BDBG_ENTER(BXVD_PVR_SetAutoValidateStcOnPause);
814
815   BKNI_EnterCriticalSection();
816   rc = BXVD_PVR_SetAutoValidateStcOnPause_isr(
817      hXvdCh,
818      bAutoValidateStcOnPause
819      );
820   BKNI_LeaveCriticalSection();
821
822   BDBG_LEAVE(BXVD_PVR_SetAutoValidateStcOnPause);
823   return BERR_TRACE(rc);
824}
825
826BERR_Code BXVD_PVR_SetAutoValidateStcOnPause_isr
827(
828   BXVD_ChannelHandle hXvdCh,
829   bool bAutoValidateStcOnPause
830   )
831{
832   BERR_Code rc;
833   BDBG_ENTER(BXVD_PVR_SetAutoValidateStcOnPause_isr);
834
835   BDBG_ASSERT(hXvdCh);
836
837   rc = BXDM_PictureProvider_SetAutoValidateStcOnPauseMode_isr(
838         hXvdCh->hPictureProvider,
839         bAutoValidateStcOnPause
840         );
841
842   BXVD_DBG_MSG(hXvdCh, ("BXVD_PVR_SetAutoValidateStcOnPause(%d)", bAutoValidateStcOnPause));
843
844   BDBG_LEAVE(BXVD_PVR_SetAutoValidateStcOnPause_isr);
845   return BERR_TRACE(rc);
846}
847
848/***************************************************************************
849***************************************************************************/
850BERR_Code BXVD_PVR_GetAutoValidateStcOnPause
851(
852   BXVD_ChannelHandle hXvdCh,
853   bool *pbAutoValidateStcOnPause
854   )
855{
856   BERR_Code rc;
857
858   BDBG_ENTER(BXVD_PVR_GetAutoValidateStcOnPause);
859
860   rc = BXVD_PVR_GetAutoValidateStcOnPause_isr(
861      hXvdCh,
862      pbAutoValidateStcOnPause
863      );
864
865   BDBG_LEAVE(BXVD_PVR_GetAutoValidateStcOnPause);
866   return BERR_TRACE(rc);
867}
868
869BERR_Code BXVD_PVR_GetAutoValidateStcOnPause_isr
870(
871   BXVD_ChannelHandle hXvdCh,
872   bool *pbAutoValidateStcOnPause
873   )
874{
875   BERR_Code rc;
876   BDBG_ENTER(BXVD_PVR_GetAutoValidateStcOnPause_isr);
877
878   BDBG_ASSERT(hXvdCh);
879   BDBG_ASSERT(pbAutoValidateStcOnPause);
880
881   rc = BXDM_PictureProvider_GetAutoValidateStcOnPauseMode_isr(
882         hXvdCh->hPictureProvider,
883         pbAutoValidateStcOnPause
884         );
885
886   BDBG_LEAVE(BXVD_PVR_GetAutoValidateStcOnPause_isr);
887   return BERR_TRACE( rc );
888}
889
890/***************************************************************************
891   SW7425-2270:
892   The application will call SetIgnoreNRTUnderflow when it determines that an
893   NRT underflow is actually a gap in the content.
894   see expanded comment in bxvd_pvr.h
895****************************************************************************/
896
897BERR_Code BXVD_PVR_SetIgnoreNRTUnderflow(
898   BXVD_ChannelHandle hXvdCh,
899   bool bIgnoreNRTUnderflow
900   )
901{
902   BERR_Code rc;
903
904   BDBG_ENTER( BXVD_PVR_SetIgnoreNRTUnderflow );
905
906   BKNI_EnterCriticalSection();
907
908   rc = BXVD_PVR_SetIgnoreNRTUnderflow_isr( hXvdCh, bIgnoreNRTUnderflow );
909
910   BKNI_LeaveCriticalSection();
911   
912   BDBG_LEAVE( BXVD_PVR_SetIgnoreNRTUnderflow );
913
914   return BERR_TRACE( rc );
915}
916
917BERR_Code BXVD_PVR_SetIgnoreNRTUnderflow_isr(
918   BXVD_ChannelHandle hXvdCh,
919   bool bIgnoreNRTUnderflow
920   )
921{
922   BERR_Code rc = BERR_SUCCESS;
923   BDBG_ENTER( BXVD_PVR_SetIgnoreNRTUnderflow_isr );
924   
925   BDBG_ASSERT( hXvdCh );
926
927   /* Check handle type for correctness */
928   if (hXvdCh->eHandleType != BXVD_P_HandleType_XvdChannel)
929   {
930      BDBG_ERR(("Invalid handle type passed to function"));
931      return BERR_TRACE(BXVD_ERR_INVALID_HANDLE);
932   }
933   
934   rc = BXDM_PictureProvider_SetIgnoreNRTUnderflow_isr(
935            hXvdCh->hPictureProvider,
936            bIgnoreNRTUnderflow
937            );
938
939   BXVD_DBG_MSG(hXvdCh, ("BXVD_PVR_SetIgnoreNRTUnderflow::  bIgnoreNRTUnderflow:%d",
940                  bIgnoreNRTUnderflow
941                  ));
942
943
944   BDBG_LEAVE( BXVD_PVR_SetIgnoreNRTUnderflow_isr );
945
946   return BERR_TRACE( rc );
947}
948
949BERR_Code BXVD_PVR_GetIgnoreNRTUnderflow(
950   BXVD_ChannelHandle hXvdCh,
951   bool * pbIgnoreNRTUnderflow
952   )
953{
954   BERR_Code rc;
955
956   BDBG_ENTER( BXVD_PVR_GetIgnoreNRTUnderflow );
957
958   BKNI_EnterCriticalSection();
959
960   rc = BXVD_PVR_GetIgnoreNRTUnderflow_isr( hXvdCh, pbIgnoreNRTUnderflow );
961
962   BKNI_LeaveCriticalSection();
963   
964   BDBG_LEAVE( BXVD_PVR_GetIgnoreNRTUnderflow );
965
966   return BERR_TRACE( rc );
967}
968
969BERR_Code BXVD_PVR_GetIgnoreNRTUnderflow_isr(
970   BXVD_ChannelHandle hXvdCh,
971   bool * pbIgnoreNRTUnderflow
972   )
973{
974   BERR_Code rc = BERR_SUCCESS;
975   BDBG_ENTER( BXVD_PVR_GetIgnoreNRTUnderflow_isr );
976   
977   BDBG_ASSERT( hXvdCh );
978   BDBG_ASSERT( pbIgnoreNRTUnderflow );
979
980   /* Check handle type for correctness */
981   if (hXvdCh->eHandleType != BXVD_P_HandleType_XvdChannel)
982   {
983      BDBG_ERR(("Invalid handle type passed to function"));
984      return BERR_TRACE(BXVD_ERR_INVALID_HANDLE);
985   }
986   
987   rc = BXDM_PictureProvider_GetIgnoreNRTUnderflow_isr(
988            hXvdCh->hPictureProvider,
989            pbIgnoreNRTUnderflow
990            );
991
992   BXVD_DBG_MSG(hXvdCh, ("BXVD_PVR_GetIgnoreNRTUnderflow::  bIgnoreNRTUnderflow:%d",
993                  *pbIgnoreNRTUnderflow
994                  ));
995
996   BDBG_LEAVE( BXVD_PVR_GetIgnoreNRTUnderflow_isr );
997
998   return BERR_TRACE( rc );
999}
1000
1001
1002/*******************/
1003/* Deprecated APIs */
1004/*******************/
1005
1006/***************************************************************************
1007***************************************************************************/
1008BERR_Code BXVD_PVR_SetBUDMode
1009(
1010   BXVD_ChannelHandle hXvdCh,
1011   bool bBudMode
1012   )
1013{
1014   BDBG_ENTER(BXVD_PVR_SetBUDMode);
1015   BDBG_ASSERT(hXvdCh);
1016
1017   BSTD_UNUSED(hXvdCh);
1018   BSTD_UNUSED(bBudMode);
1019
1020   BXVD_DBG_WRN(hXvdCh, ("BXVD_PVR_SetBUDMode() is DEPRECATED. Video Decoder auto-detects BUD mode"));
1021
1022   BDBG_LEAVE(BXVD_PVR_SetBudMode);
1023   return BERR_TRACE(BERR_SUCCESS);
1024}
1025
1026/***************************************************************************
1027***************************************************************************/
1028BERR_Code BXVD_PVR_GetBUDMode
1029(
1030   BXVD_ChannelHandle hXvdCh,
1031   bool *pbBudMode
1032   )
1033{
1034   BDBG_ENTER(BXVD_PVR_GetBUDMode);
1035   BDBG_ASSERT(hXvdCh);
1036   BDBG_ASSERT(pbBudMode);
1037
1038   BSTD_UNUSED(hXvdCh);
1039   BSTD_UNUSED(pbBudMode);
1040
1041   BDBG_LEAVE(BXVD_PVR_GetBUDMode);
1042   return BERR_TRACE(BERR_SUCCESS);
1043}
1044
1045/* End of File */
Note: See TracBrowser for help on using the repository browser.