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

📄 mv_dec01.c

📁 tuner扫描
💻 C
📖 第 1 页 / 共 3 页
字号:
                /*****************************************************************/
                /* FIFO_START  PIC_HEADER      GOP_UD      PES1_SC    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)))
               /*****************************************************************/
               /* FIFO_START  PES1_SC      PIC_HEADER    GOP_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_gop and (info_pes_header_1 - 4bytes) */
               LF_MV_DEC_store_user_data(lv_ud_gop_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_gop_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_gop_adr) && (lv_pes_header_2_adr < lv_picture_header_adr)) ||
                /*****************************************************************/
                /* FIFO_START        GOP_UD    PES2_SC    PIC_HEADER  FIFO_STOP  */
                /*   ||-----------------|---------|------------|----------||     */
                /*****************************************************************/
                ((lv_pes_header_2_adr > lv_ud_gop_adr) && (lv_pes_header_2_adr > lv_picture_header_adr) && (lv_picture_header_adr < lv_ud_gop_adr)) ||
                /*****************************************************************/
                /* FIFO_START  PIC_HEADER      GOP_UD      PES2_SC    FIFO_STOP  */
                /*   ||-------------|------------|------------|-----------||     */
                /*****************************************************************/
                ((lv_pes_header_2_adr < lv_ud_gop_adr) && (lv_pes_header_2_adr < lv_picture_header_adr) && (lv_picture_header_adr < lv_ud_gop_adr)))
               /*****************************************************************/
               /* FIFO_START  PES2_SC      PIC_HEADER    GOP_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_gop and (info_pes_header_2 - 4bytes) */
               LF_MV_DEC_store_user_data(lv_ud_gop_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_gop_adr, ((lv_picture_header_adr - 4 + lv_fifo_size) % lv_fifo_size));  
            }            
         }
         else
         {
            LF_MV_DEC_store_user_data(lv_ud_gop_adr, ((lv_picture_header_adr - 4 + lv_fifo_size) % lv_fifo_size));               
         }
      }
      
      
      if(GV_MV_DEC_ud_status.dec_ud_found & MV_DEC_PICT_UD)
      {
         /* parsing between:
            info_userdata_picture and (info_slice_header - 4 bytes) */
         lv_ud_picture_adr = MV_drv_userdata_picture_address();
         lv_slice_header_adr = MV_drv_slice_header_address();
         if (GV_MV_DEC_ud_status.dec_pes_sc1_found == TRUE)
         {
            if (((lv_pes_header_1_adr > lv_ud_picture_adr) && (lv_pes_header_1_adr < lv_slice_header_adr)) ||
                /*****************************************************************/
                /* FIFO_START        PIC_UD    PES1_SC    SLC_HEADER  FIFO_STOP  */
                /*   ||-----------------|---------|------------|----------||     */
                /*****************************************************************/
                ((lv_pes_header_1_adr > lv_ud_picture_adr) && (lv_pes_header_1_adr > lv_slice_header_adr) && (lv_slice_header_adr < lv_ud_picture_adr)) ||
                /*****************************************************************/
                /* FIFO_START  SLC_HEADER      PIC_UD      PES1_SC    FIFO_STOP  */
                /*   ||-------------|------------|------------|-----------||     */
                /*****************************************************************/
                ((lv_pes_header_1_adr < lv_ud_picture_adr) && (lv_pes_header_1_adr < lv_slice_header_adr) && (lv_slice_header_adr < lv_ud_picture_adr)))
               /*****************************************************************/
               /* FIFO_START  PES1_SC      SLC_HEADER    PIC_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_picture and (info_pes_header_1 - 4bytes) */
               LF_MV_DEC_store_user_data(lv_ud_picture_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_slice_header - 4bytes) */
               LF_MV_DEC_store_user_data(((lv_pes_header_1_adr + lv_pes_packet_size + 5) % lv_fifo_size), ((lv_slice_header_adr - 4 + lv_fifo_size ) % lv_fifo_size));
            }
            else
            {
               LF_MV_DEC_store_user_data(lv_ud_picture_adr, ((lv_slice_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_picture_adr) && (lv_pes_header_2_adr < lv_slice_header_adr)) ||
                /*****************************************************************/
                /* FIFO_START        PIC_UD    PES2_SC    SLC_HEADER  FIFO_STOP  */
                /*   ||-----------------|---------|------------|----------||     */
                /*****************************************************************/
                ((lv_pes_header_2_adr > lv_ud_picture_adr) && (lv_pes_header_2_adr > lv_slice_header_adr) && (lv_slice_header_adr < lv_ud_picture_adr)) ||
                /*****************************************************************/
                /* FIFO_START  SLC_HEADER      PIC_UD      PES2_SC    FIFO_STOP  */
                /*   ||-------------|------------|------------|-----------||     */
                /*****************************************************************/
                ((lv_pes_header_2_adr < lv_ud_picture_adr) && (lv_pes_header_2_adr < lv_slice_header_adr) && (lv_slice_header_adr < lv_ud_picture_adr)))
               /*****************************************************************/
               /* FIFO_START  PES2_SC      SLC_HEADER    PIC_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_picture and (info_pes_header_2 - 4bytes) */
               LF_MV_DEC_store_user_data(lv_ud_picture_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_slice_header - 4bytes) */
               LF_MV_DEC_store_user_data(((lv_pes_header_2_adr + lv_pes_packet_size + 5) % lv_fifo_size), ((lv_slice_header_adr - 4 + lv_fifo_size ) % lv_fifo_size));
            }
            else
            {
               LF_MV_DEC_store_user_data(lv_ud_picture_adr, ((lv_slice_header_adr - 4 + lv_fifo_size) % lv_fifo_size));  
            }            
         }
         else
         {
            LF_MV_DEC_store_user_data(lv_ud_picture_adr, ((lv_slice_header_adr - 4 + lv_fifo_size) % lv_fifo_size));               
         }
      }

      GV_MV_DEC_ud_status.dec_ud_parsing_done = TRUE;
      GV_MV_DEC_ud_status.dec_ud_found = 0;
      if (GV_MV_DEC_ud_status.dec_pes_sc1_found == TRUE)
      {
         GV_MV_DEC_ud_status.dec_pes_sc1_found = FALSE;
      }
      if (GV_MV_DEC_ud_status.dec_pes_sc2_found == TRUE)
      {
         GV_MV_DEC_ud_status.dec_pes_sc2_found = FALSE;
      }      

      /* notify to application MV_DEC_UD_AVAILABLE_EVENT, so that it can now
         call MV_DEC_get_user_data */
      if (GV_MV_DEC_status.dec_event_enabled & MV_DEC_UD_AVAILABLE_EVENT)
      {
         DV_DBG_STORE_EVENT(IPVD_DBG_EV_UD_AVAILABLE,IPVD_DBG_UD_LEVEL,lv_info0,lv_info1,lv_info2,lv_info3);
         
         /* Notify the application. */
         GV_MV_DEC_status.function_ptr(MV_DEC_UD_AVAILABLE_EVENT);
      }     
   }
   else
   {
      lv_result = MV_DEC_NOT_OK;
   }

#ifdef DV_DEBUG
   lv_info0 = MV_drv_userdata_gop_address();
   lv_info1 = MV_drv_picture_header_address();
   lv_info2 = MV_drv_userdata_picture_address();
   lv_info3 = MV_drv_slice_header_address();
#endif
   DV_DBG_STORE_EVENT(IPVD_DBG_EV_EXIT_UD_PARSING,IPVD_DBG_UD_LEVEL,lv_info0,lv_info1,lv_info2,lv_info3);
   
   return lv_result;   

} /* End of MV_DEC_user_data_process */

/*==========================================================================*/
/*       L O C A L  F U N C T I O N S                                       */ 
/*==========================================================================*/
/*LPF=======================================================================*/
/*  
    FUNCTION NAME:     LF_MV_DEC_store_user_data

    PACKAGE:           DEC

    SCOPE:             COMPONENT

    DESCRIPTION:
    Store data from start address to stop address in User Data buffer.
    parameters are specified in bytes address offset % video fifo start
    address

    PRECONDITIONS:
    None

    POSTCONDITIONS:
    None

    NOTE:
    
    CALLING SEQUENCE:
    */
static void
LF_MV_DEC_store_user_data(
   unsigned long in_start_addr,
   unsigned long in_stop_addr
   )
/*EMP=======================================================================*/
{
   unsigned long lv_nr_to_store; /* in bytes */
   unsigned long lv_load_count; /* in bytes */
   unsigned long lv_free_space; /* in bytes */
   unsigned long lv_video_start_ad;
   MV_REG_SIZE lv_fifo_size;
   tmErrorCode_t returnVal;
   Int32 timeout = 1000;

#ifdef DV_DEBUG
   register unsigned long lv_info0;
   register unsigned long lv_info1;
   register unsigned long lv_info2;
   register unsigned long lv_info3 = 0;
#endif
   
   /* take the sync semaphore, to continue : it allows no loses
      of user data while application is retrieving user data */
   returnVal = tmosalSemAcquire(GV_MV_DEC_ud_status.ptr_sync_semaphore, &timeout);

   if(returnVal == TM_OK)
   {
      /* retrieve size of the video fifo, for wrap around */
      lv_fifo_size = MV_drv_video_fifo_size();

      lv_nr_to_store = ((in_stop_addr - in_start_addr + lv_fifo_size) % lv_fifo_size);

#ifdef DV_DEBUG
      lv_info0 = in_start_addr;
      lv_info1 = in_stop_addr;
      lv_info2 = lv_nr_to_store;
#endif      
      DV_DBG_STORE_EVENT(IPVD_DBG_EV_UD_STORE_DATA,IPVD_DBG_UD_LEVEL,lv_info0,lv_info1,lv_info2,lv_info3);

      /* determine nr of bytes free in the buffer */
      lv_free_space = (GV_MV_DEC_ud_status.dec_ud_buffer_size - GV_MV_DEC_ud_status.dec_ud_bfm);
   
      /* verify if it remains enough place in ud buffer, if not fullfill it
         up to ud buffer becomes full and notify it to application */
      if (lv_nr_to_store > lv_free_space)
      {
         lv_nr_to_store = lv_free_space;

         DV_DBG_STORE_EVENT(IPVD_DBG_EV_UD_BUFFER_FULL,IPVD_DBG_UD_LEVEL,lv_info0,lv_info1,lv_info2,lv_info3);
      
         if (GV_MV_DEC_status.dec_event_enabled & MV_DEC_UD_BUFFER_FULL_EVENT)
         {
            GV_MV_DEC_status.function_ptr(MV_DEC_UD_BUFFER_FULL_EVENT);
         }
      }
   
      /* retrieve start address of the video fifo */
      lv_video_start_ad = MV_drv_video_fifo_start();
   
      /* Load the determined nr of bytes */
      for ( lv_load_count = 0; lv_load_count < lv_nr_to_store; lv_load_count++)
      {
         *(unsigned char *)(GV_MV_DEC_ud_status.dec_ud_adr + GV_MV_DEC_ud_status.dec_ud_wptr) = *(unsigned char *)(GV_MV_INP_status.SDRAM_base_addr + lv_video_start_ad  + in_start_addr);
         GV_MV_DEC_ud_status.dec_ud_wptr++;
         GV_MV_DEC_ud_status.dec_ud_bfm++;
         GV_MV_DEC_ud_status.dec_ud_wptr =  GV_MV_DEC_ud_status.dec_ud_wptr % GV_MV_DEC_ud_status.dec_ud_buffer_size; /* for ud buffer wrap around */
         in_start_addr = ((in_start_addr + 1) % lv_fifo_size); /* for fifo wrap around */
      }

      /* 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);
   }
   
} /* End of LF_MV_DEC_store_user_data */

⌨️ 快捷键说明

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