1. 程式人生 > >嵌入式 視訊編碼(H264)hi3518

嵌入式 視訊編碼(H264)hi3518

8.獲取/釋放編碼的碼流
HI_S32 HI_MPI_VENC_GetStream(VENC_CHN VeChn, VENC_STREAM_S *pstStream, HI_U32 u32BlockFlag);
HI_S32 HI_MPI_VENC_ReleaseStream(VENC_CHN VeChn, VENC_STREAM_S *pstStream); 
   A.如果通道未建立,返回錯誤碼 HI_ERR_VENC_UNEXIST。
   B.如果 pstStream為空,返回錯誤碼 HI_ERR_VENC_NULL_PTR。
   C.支援阻塞或非阻塞兩種方式獲取。同時可支援 select/poll 系統呼叫,u32BlockFlag:HI_IO_BLOCK(阻塞) HI_IO_NOBLOCK(非阻塞)。
      −  非阻塞獲取時,如果緩衝無資料,則返回 HI_ERR_VENC_BUF_EMPTY。 
      −  阻塞時,如果緩衝無資料,則會等待有資料時才返回 HI_SUCCESS。
   D.支援按包或按幀方式獲取碼流。如果按包獲取,則: 
      −  對於 H.264編碼協議,每次獲取的是一個 NAL 單元。 
      −  對於 JPEG編碼協議(包括 JPEG抓拍和 MJPEG) ,每次獲取的是一個 ECS或影象引數碼流包。 
      −  對於 MPEG4編碼協議,每次獲取的是一幀一個包,因此按幀獲取或者按包獲取,結果相同。
   E.碼流結構體 VENC_STREAM_S包含3 個部分: 
      −  碼流包資訊指標 
          pstPack 指向一組 VENC_PACK_S 的記憶體空間,該空間由呼叫者分配。如果是按包獲取,則此空間不小於 sizeof(VENC_PACK_S)的大小;如果按幀獲取,則此空間不小於 N × sizeof(VENC_PACK_S)的大小,其中 N代表當前幀之中的包的個數,可以在 select之後通過查詢介面獲得。 
      −  碼流包個數 u32PackCount  
          在輸入時,此值指定 pstPack 中 VENC_PACK_S 的個數。按包獲取時,u32PackCount 必須不小於1;按幀獲取時,包個數。在函式呼叫成功後,u32PackCount 返回實際填充 pstPack 的包的個數。 
      −  序列號 u32Seq 
          按幀獲取時是幀序列號;按包獲取時為包序列號。 
   F.如果使用者長時間不獲取碼流,那麼碼流緩衝區就會滿。一個編碼通道如果發生碼流緩衝區滿,就會停止該編碼通道編碼,等有足夠的碼流緩衝可以用來編碼時,才開始繼續編碼,這種情況對於主次碼流編碼通道來說,相互不受影響。
   G.使用者應該及時獲取碼流,防止由於碼流 buffer阻塞導致編碼器停止工作。 
   H.如果通道未建立,則返回錯誤碼 HI_ERR_VENC_UNEXIST。 
   I.如果 pstStream為空,則返回錯誤碼 HI_ERR_VENC_NULL_PTR。 
   J.此介面應當和 HI_MPI_VENC_GetStream配對起來使用,使用者獲取碼流後必須及時釋放已經獲取的碼流快取,否則可能會導致碼流 buffer滿,影響編碼器編碼,並且使用者必須按先獲取先釋放的順序釋放已經獲取的碼流快取。 
   K.在編碼通道反註冊以後,所有未釋放的碼流包均無效,不能再使用或者釋放這部分無效的碼流快取。
   L.釋放無效的碼流會返回 HI_ERR_VENC_ILLEGAL_PARAM。