⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mv_dec01.c

📁 tuner扫描
💻 C
📖 第 1 页 / 共 3 页
字号:
         lv_ud_count--;
      }
      
      /* free the sync semaphore, to continue : it allows no loses
         of user data while application is retrieving user data */
      returnVal = tmosalSemRelease(GV_MV_DEC_ud_status.ptr_sync_semaphore);
      if (returnVal != TM_OK)
      {
         DV_DBG_STORE_EVENT(IPVD_DBG_EV_UD_SEMAPHORE_ERROR,IPVD_DBG_UD_LEVEL,IPVD_SEMAPHORE_RELEASE,0,0,0);
      }
   }
   else
   {
      DV_DBG_STORE_EVENT(IPVD_DBG_EV_UD_SEMAPHORE_ERROR,IPVD_DBG_UD_LEVEL,IPVD_SEMAPHORE_ACQUIRE,0,0,0);
      *ou_nbytes_read_ptr = 0;
      *ou_nbytes_remaining_ptr= GV_MV_DEC_ud_status.dec_ud_bfm; /* in bytes */
   }
   
} /* End of MV_DEC_get_user_data */

/*MPF=======================================================================*/
/*  
    FUNCTION NAME:     MV_DEC_user_data_process

    PACKAGE:           DEC

    SCOPE:             PLATEFORM

    DESCRIPTION:
    This function contain the User Data parsing action to be done on the
    application thread.
    The application thread must call the MV_DEC_user_data_process() routine
    once for each notification of the MV_DEC_UD_PROCESSING_NEEDED_EVENT.

    This routine will stock User Data in a specific buffer, which size has
    been set by application during initialisation phase. This buffer can be read
    via MV_DEC_get_user_data() API.

    PRECONDITIONS:
    To be inform to call User Data parsing routine, Application must enable
    notification of MV_DEC_UD_PROCESSING_NEEDED_EVENT via API
    MV_DEC_enable_notification().

    POSTCONDITIONS:
    None

    NOTE:
    
    CALLING SEQUENCE:
    */
extern MV_DEC_ERROR
MV_DEC_user_data_process(
   void
   )
/*EMP=======================================================================*/
{
   MV_DEC_ERROR  lv_result = MV_DEC_OK;
   
   MV_REG_SIZE lv_fifo_size;
   
   unsigned long lv_ud_sequence_adr;
   unsigned long lv_ud_gop_adr;
   unsigned long lv_ud_picture_adr;
   unsigned long lv_gop_header_adr;
   unsigned long lv_picture_header_adr;
   unsigned long lv_slice_header_adr;
   unsigned long lv_pes_header_1_adr;
   unsigned long lv_pes_header_2_adr;
   unsigned char lv_pes_packet_size;
   unsigned long lv_video_start_ad;

   UInt32 lv_protection_level;
   
#ifdef DV_DEBUG
   register unsigned long lv_info0;
   register unsigned long lv_info1;
   register unsigned long lv_info2;
   register unsigned long lv_info3;
   
   
   lv_info0 = MV_drv_userdata_sequence_address();
   lv_info1 = MV_drv_gop_header_address();
   lv_info2 = GV_MV_DEC_ud_status.dec_gop_sc_found;
   lv_info3 = GV_MV_DEC_ud_status.dec_ud_found;
   
   DV_DBG_STORE_EVENT(IPVD_DBG_EV_ENTER_UD_PARSING,IPVD_DBG_UD_LEVEL,lv_info0,lv_info1,lv_info2,lv_info3);

   lv_info0 = MV_drv_pes_header_1_address();
   lv_info1 = GV_MV_DEC_ud_status.dec_pes_sc1_found;
   lv_info2 = MV_drv_pes_header_2_address();
   lv_info3 = GV_MV_DEC_ud_status.dec_pes_sc2_found;
   
   DV_DBG_STORE_EVENT(IPVD_DBG_EV_UD_PES_INSIDE,IPVD_DBG_UD_LEVEL,lv_info0,lv_info1,lv_info2,lv_info3);
#endif
   
   /* retrieve start address and size of the video fifo */
   lv_video_start_ad = MV_drv_video_fifo_start();
   lv_fifo_size = MV_drv_video_fifo_size();

   /* read pes header addresses to verify if they are include in the
      user data payload. Due to HW pb, normally adress read start from
      the end of the Start Code, but as this is not the case, we make
      shift of 4 bytes */
   lv_pes_header_1_adr = (MV_drv_pes_header_1_address() + 4);
   lv_pes_header_2_adr = (MV_drv_pes_header_2_address() + 4);

   if (GV_MV_DEC_ud_status.dec_ud_parsing_done == FALSE)
   {

      if(GV_MV_DEC_ud_status.dec_ud_found & MV_DEC_SEQ_UD)
      {
         /* parsing between:
            info_userdata_seq and (info_gop_header or info_picture_header) */
         lv_ud_sequence_adr = MV_drv_userdata_sequence_address();

         if(GV_MV_DEC_ud_status.dec_gop_sc_found == TRUE)
         {
            tmosalDisableInterruptsNoSysCall(&lv_protection_level);
            GV_MV_DEC_ud_status.dec_gop_sc_found = FALSE;
            tmosalEnableInterruptsNoSysCall(lv_protection_level);
   
            /* parsing between:
               info_userdata_seq and (info_gop_header - 4 bytes) */
            lv_gop_header_adr = MV_drv_gop_header_address();


            if (GV_MV_DEC_ud_status.dec_pes_sc1_found == TRUE)
            {
               if (((lv_pes_header_1_adr > lv_ud_sequence_adr) && (lv_pes_header_1_adr < lv_gop_header_adr))||
                   /*****************************************************************/
                   /* FIFO_START        SEQ_UD    PES1_SC    GOP_HEADER  FIFO_STOP  */
                   /*   ||-----------------|---------|------------|----------||     */
                   /*****************************************************************/
                   ((lv_pes_header_1_adr > lv_ud_sequence_adr) && (lv_pes_header_1_adr > lv_gop_header_adr) && (lv_gop_header_adr < lv_ud_sequence_adr)) ||
                   /*****************************************************************/
                   /* FIFO_START  GOP_HEADER      SEQ_UD      PES1_SC    FIFO_STOP  */
                   /*   ||-------------|------------|------------|-----------||     */
                   /*****************************************************************/
                   ((lv_pes_header_1_adr < lv_ud_sequence_adr) && (lv_pes_header_1_adr < lv_gop_header_adr) && (lv_gop_header_adr < lv_ud_sequence_adr)))
                  /*****************************************************************/
                  /* FIFO_START  PES1_SC      GOP_HEADER    SEQ_UD      FIFO_STOP  */
                  /*   ||-----------|------------|------------|-------------||     */
                  /*****************************************************************/
               {
                  /* the PES packet 1 is inserted in User Data, so retrieve its
                     lenght to skip it, store of UD will be done in 2 blocks */
                  /* first block storing from info_userdata_seq and (info_pes_header_1 - 4bytes) */
                  LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_pes_header_1_adr - 4 + lv_fifo_size) % lv_fifo_size));
 
                  /* retrieve size of PES 1 packet */
                  lv_pes_packet_size = *(unsigned char *)(GV_MV_INP_status.SDRAM_base_addr + lv_video_start_ad + ((lv_pes_header_1_adr + 4)% lv_fifo_size));

                  /* second block storing from (lv_pes_packet_size + 5 bytes)  and (info_gop_header - 4bytes) */
                  LF_MV_DEC_store_user_data(((lv_pes_header_1_adr + lv_pes_packet_size + 5) % lv_fifo_size), ((lv_gop_header_adr - 4 + lv_fifo_size ) % lv_fifo_size));
               }
               else
               {
                  LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_gop_header_adr - 4 + lv_fifo_size) % lv_fifo_size));  
               }
            }
            else if (GV_MV_DEC_ud_status.dec_pes_sc2_found == TRUE)
            {
               if (((lv_pes_header_2_adr > lv_ud_sequence_adr) && (lv_pes_header_2_adr < lv_gop_header_adr)) ||
                   /*****************************************************************/
                   /* FIFO_START        SEQ_UD    PES2_SC    GOP_HEADER  FIFO_STOP  */
                   /*   ||-----------------|---------|------------|----------||     */
                   /*****************************************************************/
                   ((lv_pes_header_2_adr > lv_ud_sequence_adr) && (lv_pes_header_2_adr > lv_gop_header_adr) && (lv_gop_header_adr < lv_ud_sequence_adr)) ||
                   /*****************************************************************/
                   /* FIFO_START  GOP_HEADER      SEQ_UD      PES2_SC    FIFO_STOP  */
                   /*   ||-------------|------------|------------|-----------||     */
                   /*****************************************************************/
                   ((lv_pes_header_2_adr < lv_ud_sequence_adr) && (lv_pes_header_2_adr < lv_gop_header_adr) && (lv_gop_header_adr < lv_ud_sequence_adr)))
                  /*****************************************************************/
                  /* FIFO_START  PES2_SC      GOP_HEADER    SEQ_UD      FIFO_STOP  */
                  /*   ||-----------|------------|------------|-------------||     */
                  /*****************************************************************/
               {
                  /* the PES packet 2 is inserted in User Data, so retrieve its
                     lenght to skip it, store of UD will be done in 2 blocks */
                  /* first block storing from info_userdata_seq and (info_pes_header_2 - 4bytes) */
                  LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_pes_header_2_adr - 4 + lv_fifo_size) % lv_fifo_size));
 
                  /* retrieve size of PES 2 packet */
                  lv_pes_packet_size = *(unsigned char *)((GV_MV_INP_status.SDRAM_base_addr + lv_video_start_ad + (lv_pes_header_2_adr + 4)) % lv_fifo_size);

                  /* second block storing from (lv_pes_packet_size + 5 bytes)  and (info_gop_header - 4bytes) */
                  LF_MV_DEC_store_user_data(((lv_pes_header_2_adr + lv_pes_packet_size + 5) % lv_fifo_size), ((lv_gop_header_adr - 4 + lv_fifo_size ) % lv_fifo_size));
               }
               else
               {
                  LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_gop_header_adr - 4 + lv_fifo_size) % lv_fifo_size));  
               }               
            }
            else
            {
               LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_gop_header_adr - 4 + lv_fifo_size) % lv_fifo_size));               
            }
         }

         
         else
         {
            /* parsing between:
               info_userdata_seq and (info_picture_header - 4 bytes) */
            lv_picture_header_adr = MV_drv_picture_header_address();
            if (GV_MV_DEC_ud_status.dec_pes_sc1_found == TRUE)
            {
               if (((lv_pes_header_1_adr > lv_ud_sequence_adr) && (lv_pes_header_1_adr < lv_picture_header_adr)) ||
                   /*****************************************************************/
                   /* FIFO_START        SEQ_UD    PES1_SC    PIC_HEADER  FIFO_STOP  */
                   /*   ||-----------------|---------|------------|----------||     */
                   /*****************************************************************/
                   ((lv_pes_header_1_adr > lv_ud_sequence_adr) && (lv_pes_header_1_adr > lv_picture_header_adr) && (lv_picture_header_adr < lv_ud_sequence_adr)) ||
                   /*****************************************************************/
                   /* FIFO_START  PIC_HEADER      SEQ_UD      PES1_SC    FIFO_STOP  */
                   /*   ||-------------|------------|------------|-----------||     */
                   /*****************************************************************/
                   ((lv_pes_header_1_adr < lv_ud_sequence_adr) && (lv_pes_header_1_adr < lv_picture_header_adr) && (lv_picture_header_adr < lv_ud_sequence_adr)))
                  /*****************************************************************/
                  /* FIFO_START  PES1_SC      PIC_HEADER    SEQ_UD      FIFO_STOP  */
                  /*   ||-----------|------------|------------|-------------||     */
                  /*****************************************************************/
               {
                  /* the PES packet 1 is inserted in User Data, so retrieve its
                     lenght to skip it, store of UD will be done in 2 blocks */
                  /* first block storing from info_userdata_seq and (info_pes_header_1 - 4bytes) */
                  LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_pes_header_1_adr - 4 + lv_fifo_size) % lv_fifo_size));
 
                  /* retrieve size of PES 1 packet */
                  lv_pes_packet_size = *(unsigned char *)(GV_MV_INP_status.SDRAM_base_addr + lv_video_start_ad + ((lv_pes_header_1_adr + 4)% lv_fifo_size));

                  /* second block storing from (lv_pes_packet_size + 5 bytes)  and (info_picture_header - 4bytes) */
                  LF_MV_DEC_store_user_data(((lv_pes_header_1_adr + lv_pes_packet_size + 5) % lv_fifo_size), ((lv_picture_header_adr - 4 + lv_fifo_size ) % lv_fifo_size));
               }
               else
               {
                  LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_picture_header_adr - 4 + lv_fifo_size) % lv_fifo_size));  
               }               
            }
            else if (GV_MV_DEC_ud_status.dec_pes_sc2_found == TRUE)
            {
               if (((lv_pes_header_2_adr > lv_ud_sequence_adr) && (lv_pes_header_2_adr < lv_picture_header_adr)) ||
                   /*****************************************************************/
                   /* FIFO_START        SEQ_UD    PES2_SC    PIC_HEADER  FIFO_STOP  */
                   /*   ||-----------------|---------|------------|----------||     */
                   /*****************************************************************/
                   ((lv_pes_header_2_adr > lv_ud_sequence_adr) && (lv_pes_header_2_adr > lv_picture_header_adr) && (lv_picture_header_adr < lv_ud_sequence_adr)) ||
                   /*****************************************************************/
                   /* FIFO_START  PIC_HEADER      SEQ_UD      PES2_SC    FIFO_STOP  */
                   /*   ||-------------|------------|------------|-----------||     */
                   /*****************************************************************/
                   ((lv_pes_header_2_adr < lv_ud_sequence_adr) && (lv_pes_header_2_adr < lv_picture_header_adr) && (lv_picture_header_adr < lv_ud_sequence_adr)))
                  /*****************************************************************/
                  /* FIFO_START  PES2_SC      PIC_HEADER    SEQ_UD      FIFO_STOP  */
                  /*   ||-----------|------------|------------|-------------||     */
                  /*****************************************************************/
               {
                  /* the PES packet 2 is inserted in User Data, so retrieve its
                     lenght to skip it, store of UD will be done in 2 blocks */
                  /* first block storing from info_userdata_seq and (info_pes_header_2 - 4bytes) */
                  LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_pes_header_2_adr - 4 + lv_fifo_size) % lv_fifo_size));
 
                  /* retrieve size of PES 2 packet */
                  lv_pes_packet_size = *(unsigned char *)((GV_MV_INP_status.SDRAM_base_addr + lv_video_start_ad + (lv_pes_header_2_adr + 4)) % lv_fifo_size);

                  /* second block storing from (lv_pes_packet_size + 5 bytes)  and (info_picture_header - 4bytes) */
                  LF_MV_DEC_store_user_data(((lv_pes_header_2_adr + lv_pes_packet_size + 5) % lv_fifo_size), ((lv_picture_header_adr - 4 + lv_fifo_size ) % lv_fifo_size));
               }
               else
               {
                  LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_picture_header_adr - 4 + lv_fifo_size) % lv_fifo_size));  
               }                              
            }
            else
            {
               LF_MV_DEC_store_user_data(lv_ud_sequence_adr, ((lv_picture_header_adr - 4 + lv_fifo_size) % lv_fifo_size));               
            }
         }
      }
      


      if(GV_MV_DEC_ud_status.dec_ud_found & MV_DEC_GOP_UD)
      {
         /* parsing between:
            info_userdata_gop and (info_picture_header - 4 bytes) */
         lv_ud_gop_adr = MV_drv_userdata_gop_address();
         lv_picture_header_adr = MV_drv_picture_header_address();

         if (GV_MV_DEC_ud_status.dec_pes_sc1_found == TRUE)
         {
            if (((lv_pes_header_1_adr > lv_ud_gop_adr) && (lv_pes_header_1_adr < lv_picture_header_adr)) ||
                /*****************************************************************/
                /* FIFO_START        GOP_UD    PES1_SC    PIC_HEADER  FIFO_STOP  */
                /*   ||-----------------|---------|------------|----------||     */
                /*****************************************************************/
                ((lv_pes_header_1_adr > lv_ud_gop_adr) && (lv_pes_header_1_adr > lv_picture_header_adr) && (lv_picture_header_adr < lv_ud_gop_adr)) ||

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -