1. 程式人生 > >HEVC學習(十七) —— NAL unit 的解碼過程之一

HEVC學習(十七) —— NAL unit 的解碼過程之一

下圖為官方標準中NAL層的句法元素,且以虛擬碼的形式給出瞭解碼過程:

在HM中由TAppDecTop::decode()呼叫byteStreamNALUnit(bytestream, nalUnit, stats)實現如上虛擬碼:

/**
 * Parse an AVC AnnexB Bytestream bs to extract a single nalUnit
 * while accumulating bytestream statistics into stats.
 *
 * Returns false if EOF was reached (NB, nalunit data may be valid),
 *         otherwise true.
 */
Bool
byteStreamNALUnit(
  InputByteStream& bs,
  vector<uint8_t>& nalUnit,
  AnnexBStats& stats)
{
  Bool eof = false;
  try
  {
    _byteStreamNALUnit(bs, nalUnit, stats); //!< 實際完成NAL解析工作的函式
  }
  catch (...) //!< 捕獲所有異常
  {
    eof = true;
  }
  stats.m_numBytesInNALUnit = UInt(nalUnit.size());
  return eof;
}

在分析NAL解析過程之前,先介紹幾個會被呼叫到的子函式,以便更好地理解解析過程。

1. Bool eofBeforeNBytes(UInt n)

如果在讀碼流的接下來的n位元組的過程中遇到了檔案結束符,則該函式返回true,否則返回false。

  /**
   * returns true if an EOF will be encountered within the next
   * n bytes.
   */
  Bool eofBeforeNBytes(UInt n)
  {
    assert(n <= 4);
    if (m_NumFutureBytes >= n) //!< m_NumFutureBytes大於等於n只會在該函式被呼叫2次及2次以上的情況下發生,滿足該條件時無須繼續讀多餘的位元組,故返回false
      return false;

    n -= m_NumFutureBytes; //!< n先減去m_NumFutureBytes的目的是防止被函式peekBytes呼叫時再讀入接下來的n位元組資料
    try
    {
      for (UInt i = 0; i < n; i++)
      {
        m_FutureBytes = (m_FutureBytes << 8) | m_Input.get(); //!< 每次讀入一個位元組,迴圈結束後,m_FutureBytes存放的是讀入的n個位元組的資料
        m_NumFutureBytes++;
      }
    }
    catch (...) //!< 出現異常即讀到檔案結尾,返回true
    {
      return true;
    }
    return false;
  }

2. uint32_t peekBytes(UInt n)

該函式在不移動檔案指標的前提下返回檔案中接下來的n位元組。實現的即是虛擬碼中的next_bits(n)的功能。

  /**
   * return the next n bytes in the stream without advancing
   * the stream pointer.
   *
   * Returns: an unsigned integer representing an n byte bigendian
   * word.
   *
   * If an attempt is made to read past EOF, an n-byte word is
   * returned, but the portion that required input bytes beyond EOF
   * is undefined.
   *
   */
  uint32_t peekBytes(UInt n)
  {
    eofBeforeNBytes(n);
    return m_FutureBytes >> 8*(m_NumFutureBytes - n); //!< 若m_NumFutureBytes=4, n=3,則返回m_FutureBytes左移8位後(即有效資料位為3位元組)的資料
  }

3. uint8_t readByte()

該函式讀檔案的一個位元組並返回。

  /**
   * consume and return one byte from the input.
   *
   * If bytestream is already at EOF prior to a call to readByte(),
   * an exception std::ios_base::failure is thrown.
   */
  uint8_t readByte()
  {
    if (!m_NumFutureBytes) //!< m_FutureBytes為NULL,則從檔案中讀入一個位元組並返回
    {
      uint8_t byte = m_Input.get();
      return byte;
    }//! m_FutureBytes非NULL,則從它當中取出一個位元組出來
    m_NumFutureBytes--; //!< 計數值減1
    uint8_t wanted_byte = m_FutureBytes >> 8*m_NumFutureBytes; //!< m_FutureBytes為4位元組,取出有效資料中的最高位元組
    m_FutureBytes &= ~(0xff << 8*m_NumFutureBytes); //!< 對應位置的資料清零
    return wanted_byte;
  }

4. uint32_t readBytes(UInt n)

該函式讀檔案的n個位元組並返回。

  /**
   * consume and return n bytes from the input.  n bytes from
   * bytestream are interpreted as bigendian when assembling
   * the return value.
   */
  uint32_t readBytes(UInt n)
  {
    uint32_t val = 0;
    for (UInt i = 0; i < n; i++)
      val = (val << 8) | readByte(); //!< 每次呼叫readByte()讀入一個位元組,通過對val左移8位且與輸入值進行或運算實現將n個位元組儲存到val這個變數中
    return val;
  }

相關推薦

HEVC學習 —— NAL unit解碼過程之一

下圖為官方標準中NAL層的句法元素,且以虛擬碼的形式給出瞭解碼過程: 在HM中由TAppDecTop::decode()呼叫byteStreamNALUnit(bytestream, nalUnit, stats)實現如上虛擬碼: /** * Parse an AVC

HEVC學習 —— NAL unit解碼過程之二

下面介紹實際完成NAL解析工作的函式: /** * Parse an AVC AnnexB Bytestream bs to extract a single nalUnit * while accumulating bytestream statistics into

python學習 擴展python

生成 實現 語言 擴展 運行速度 ava python學習 簡單 用c語言實現 c, c++, java比python快幾個數量級。 17.1 考慮哪個更重要 開發速度還是運行速度更重要。 17.2 非常簡單的途徑:Jython和IronPython Jython可以直接訪

C++語言學習——模板

china typename itl while ptr 特殊 實例化 需求 所有 C++語言學習(十七)——模板 一、模板簡介 泛型(Generic Programming)即是指具有在多種數據類型上皆可操作的含意。 泛型編程的代表作品STL是一種高效、泛型、可交互操作的

機器學習之python學習

今天來學習python中的tuple、 這個資料結果用的還是比較少的。 當然了,你們也可以參考廖雪峰大神的python教學快速入門。 程式碼塊 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : SundayC

JMeter學習JMeter測試Java 目的:對Java程式進行測試

目的:對Java程式進行測試   目錄 一、核心步驟 二、例項 三、JMeter Java Sampler介紹 四、自帶Java Request Sampler   一、核心步驟 1.建立一個Java工程; 2.將JMeter的lib目錄下

機器學習 kaggle競賽之泰坦尼克號專案實戰-2

導航        想寫這篇部落格的由衷是做完幾個專案,有時對於圖的畫法和模型融合演算法原理理解還很膚淺,特此加深一下印象。 內容概覽 圖 pandas、matplotlib、seaborn 餅圖 直方圖

python學習——補充內建函式、使用迭代器協議實現斐波那契數列、描述符、pycharm的問題

一、補充內建函式 #--------------------------isinstance/isinbclass-------------- class Foo: pass class Bar(Foo): pass b1=Bar() print(isinstance(b1,

深度學習

1、在殘差網路中利用1*1進行降維,即設計一個瓶頸層來使得網路更深可能不是一個好主意,網路的通道更多即網路更寬一些在實驗中可能更能利用GPU的運算資源。 2、一個訓練的技巧,當使用較小的學習率時使用較大的動量,使用較大的學習率時使用較小的動量,兩者的關係如圖所示: 3、如果損失函式的表

opencv學習:影象金子塔

邊緣檢測運算元 參考學習連結:https://blog.csdn.net/xiaowei_cqu/article/details/7829481 影象金子塔 參考學習連結:https://www.cnblogs.com/Matrix420/p/4214123.html open

webpack學習:使用 process.env.NODE_ENV 區別生產模式和開發模式

demo地址: https://github.com/Lkkkkkkg/webpack-demo 繼上一次分離生產模式和開發模式的配置: https://blog.csdn.net/qq593249106/article/details/84964816 合併程式碼 之前因為開發模式

webpack學習:快取

demo地址: https://github.com/Lkkkkkkg/webpack-demo 繼上一次使用 process.env.NODE_ENV 區別生產模式和開發模式: https://blog.csdn.net/qq593249106/article/details/849705

機器學習與深度學習系列連載: 第一部分 機器學習非監督度學習-2 Unsupervised Learning-4Generative Models

生成模型 Generative Models 用非監督學習生成結構化資料,是非監督模型的一個重要分支,本節重點介紹三個演算法: Pixel RNN ,VAE 和GAN(以後會重點講解原理) 1. Pixel RNN RNN目前還沒有介紹,,以後會重點講解,大家

dart語言學習— 方法物件

含義 方法可作為物件賦值給其他變數 方法可作為引數傳遞給其他方法 void main(List<String> args) { var func = printHello; Function func1 = printHello; func

spring深入學習 IOC 之分析各 scope 的 bean 建立

在 Spring 中存在著不同的 scope,預設是 singleton ,還有 prototype、request 等等其他的 scope,他們的初始化步驟是怎樣的呢?這個答案在這篇部落格中給出。 singleton Spring 的 scope 預設為 singleton,其初始化的程式

訊息中介軟體--RabbitMQ學習---高階特性之死信佇列

死信佇列:DLX,Dead- Letter- Exchange 利用DLX,當訊息在一個佇列中變成死信( dead message)之後它能被重新 publish到另一個 Exchange,這個 Exchange就是DLX 死信佇列訊息變成死信有一下幾種情況

Spring 學習——Spring AOP之返回通知、異常通知和環繞通知

返回通知 •無論連線點是正常返回還是丟擲異常, 後置通知都會執行. 如果只想在連線點返回的時候記錄日誌, 應使用返回通知代替後置通知.   在返回通知中訪問連線點的返回值 •在返回通知中, 只要將 returning 屬性新增到 @AfterReturning 註解中

opencv學習之XML和YAML檔案讀寫操作

可能大部分人到現在接觸的XML和YAML檔案很少,等以後訓練人臉模型進行人臉識別的時候用的就多了。現在先了解一下這兩種檔案型別。 XML:Extensible Markup Language,可擴充套件標記語言,標準通用語言的子集,是一種用於標記電子檔案使其具

深度學習——SSD, YOLOv2

SSD SSD是Wei Liu於2016年提出的演算法。 論文: 《SSD: Single Shot MultiBox Detector》 程式碼: 網路結構 YOLO有一些缺陷:每個網格只預測一個物體,容易造成漏檢;對於物體的尺

關於JavaScript的學習——錯誤處理與除錯

第十七章   錯誤處理對於今天覆雜的Web應用程式開發而言至關重要。不能提前預測到可能發生的錯誤,不能提前採取回覆策略,可能導致較差的使用者體驗,最終引發使用者不滿。多數瀏覽器在預設情況下都不會向用戶報告錯誤,因此在開發和除錯期間需要啟動瀏覽器的錯誤報告功