星期三, 2月 17, 2016

H.264 SPS, PPS, Slice, MB主要資訊

SPS(Sequence Parameter Set)主要描述影片串流的資訊,此外也包含vui的資訊:

  • profile_idc: 代表視訊所用的H264 Profile,如 Base, Extension, High Profile。codec會根據profile來初始化一些參數。
  • pic_order_cnt_type: 代表計算圖片顯示順序(Picture Order Count, POC)所採用的方式 (POC Type)。大部分為零。
  • log2_max_frame_num_minus4: 代表畫面幀的最大數字((值+4)*2)。在解碼時,會有緩衝區用來儲存I, P參考幀,該緩衝區會重覆使用。每個畫面幀在解碼時會有一個frame_num數字,代表該畫面於解碼緩衝區id。
  • pic_width_in_mbs_minu1: 畫面幀的寛度,以microblock為單位。
  • pic_height_in_map_units_minus1: 畫面幀的高度,以map unit為單位?。
  • direct_8x8_inference_flag: 描述mv預測方式。
  • vui:
    • num_units_in_tick: 時間單位
    • time_scale: 每個時間單位播幾張畫面

PPS(Picture Parameter Set)主要描述畫面幀(或field場)資訊:
  • pic_parameter_set_id: PPS的id,在一個影片中會有很多畫面幀或片段(Slice),這些畫面片段會參考PPS的設定進行編解碼。
  • seq_parameter_set_id: 目前PPS所參考到的SPS id。
  • entropy_coding_mode_flag: 畫面幀壓縮方法,如1代表CABAC。


Slice Header:
  • first_mb_in_slice: 第一個mb在slice中的位置,通常為0。
  • slice_type: Slice的類型,如 I, P, B frame/slice
  • frame_num: 在緩衝區的frame id

MicroBlock:













星期二, 2月 16, 2016

CodeLite使用補充


  • 安裝cscope
https://github.com/eranif/codelite/issues/795

  • 假如程式碼不需要build只想要查尋原始source code,則可匯入舊的程式碼,如library。(忽略custom build, 如果是用msys2等,直接打開shell 在msys2下make編譯library就好,不要再codelite中設定)。


假設舊的程式碼在 D:\TestArea\MyCustomProject and uses makefile for the build process.
The fastest way to import this project into CodeLite is:
  • Create a new project Workspace -> Create New Project give it any name and place it under D:\TestArea\MyCustomProject ( you can check the option 'create the project under a separate directory' )
  • Right-click on the project, and select Import Files From Directory. The import dialog will pop up; accept its defaults and click OK. (匯入不會把檔案複製一遍,原檔案還是會留在原來的地方)
  • Once the import process completes, you can expand the tree to the left, where you should see all source files imported from the disk.
  • You can add / delete any targets from the Project Settings -> Customize >Custom Build , the below screenshot shows how to add a cmake target
You can access all the targets from the menu bar as shown below or by right clicking on the project and select Custom Build Targets

ffmpeg parser libx264資料


  • FFMPEG结构体分析:AVFormatContext

http://blog.csdn.net/leixiaohua1020/article/details/14214705
  • 使用FFMPEG类库分离出多媒体文件中的H.264码流

http://blog.csdn.net/leixiaohua1020/article/details/11800877

  • FFmpeg的H.264解码器源代码简单分析:解析器(Parser)部分

http://blog.csdn.net/leixiaohua1020/article/details/45001033


  •  最简单的视频编码器:基于libx264(编码YUV为H.264)

http://blog.csdn.net/leixiaohua1020/article/details/42078645



  • 下載x264 程式碼

  1. git clone git://git.videolan.org/x264.git  
YASM Setup
Download YASM executable from ​http://yasm.tortall.net/Download.html. You have to download the "general use" binaries and NOT the ones for VS2010. Either Win32 or Win64 binaries support outputting object files for both architectures so that should not matter. The last tested version was yasm-1.3.0-win64.exe.
Rename the downloaded executable to yasm.exe and place it in your MSYS2 path. E.g.C:\msys64\usr\bin\yasm.exe.
  • 到codelite設定一下路徑



  •  問題: codelite中,debugger有時候會不work,到設定中修改automatically set...就可以除錯


  • 問題: 在編譯完後執行後產生不出來h264檔案,x264_encoder_encode函式傳回值為0, pNals, iNal值也為0,原因為多執行緒 delay encode的問題,如下:
http://blog.sina.com.cn/s/blog_51396f890102f061.html
到程式39行,新增一行
  pParam->i_threads  = 1;
強制thread為1就解決delay encode的問題,但是效能會比較差。

星期一, 2月 15, 2016

NALU h.264 相關資料

Concept:


  • Exploring H.264. Part 2: H.264 Bitstream format

http://gentlelogic.blogspot.tw/2011/11/exploring-h264-part-2-h264-bitstream.html


一步一步解析H.264码流的NALU(SPS,PSS,IDR)

http://guoh.org/lifelog/2013/10/h-264-bit-stream-sps-pps-idr-nalu/



  • 解讀h264 SPS的參考資料

The h.264 Sequence Parameter Set
https://cardinalpeak.com/blog/the-h-264-sequence-parameter-set/


  • IDR介紹

http://www.programgo.com/article/73452314422/


  • 如何区分H.264视频流的I frame 和 P frame

http://www.yaosansi.com/post/how-to-distinguish-between-I-frame-and-P-frame-H264-video-streams/


  •  x264命令行參數解釋

https://www.ptt.cc/bbs/AVEncode/M.1305719689.A.615.html


  • tool to extract H.264 frame size vector

http://forum.doom9.org/showthread.php?t=149122

  • ffprobe showframes 再結合awk或其它工具,就可以抓frame的資訊
http://superuser.com/questions/885452/extracting-the-index-of-key-frames-from-a-video-using-ffmpeg
https://trac.ffmpeg.org/wiki/FFprobeTips 

YUV檔案格式

【视频处理】YUV格式说明
http://www.cnblogs.com/xmphoenix/p/4508483.html

MSVC 使用linux C Library的方法

Microsoft Visual C++可以使用linux 有source code 的函式庫,如libjpeg等,方法如下:

  • 利用mingw 編譯liunx library,產生.a 及dll
  • 利用gcc 產生def檔, e.g., 
gcc -shared -o your_dll.dll your_dll_src.c -Wl,--output-def,your_dll.def
  • 利用MSVC的工具lib.exe ,結合dll及.def 檔轉換成.lib檔,之後就可以在vc內使用
lib /def:your_dll.def

Note: 只能轉換C library,不能轉換C++ Library,因為gcc 跟 msvc在處理C++ Library的方式不相容,所以只能轉換C 函式庫 

如何在vc內使用c lib?
例子:
extern "C" {
include "openssl.h"
}


Reference:
  • How to use libraries compiled with MingW in MSVC?
http://stackoverflow.com/questions/2529770/how-to-use-libraries-compiled-with-mingw-in-msvc

Mingw 64及codelite安裝

[更新,簡易安裝方法,直接下載codelite進行安裝。第一次安裝時會提示是否要安裝gcc,這時選擇tdm-gcc 64下載及安裝後,再回到codelite掃描環境,就會把相關參數一次設定好,不用像下文要手動設定 (但是codecomplete 還是要自己設定一下,比較好用。]

mingw 是最小化的gun tools for windows開發環境
msys 是最小化的linux shell,處理一些環境變數,基於cygwin

從source forge 安裝 mingw 64的installer 會有問題,所以參考下列網站,先安裝msys2,再由msys2的套件管理程式安裝mingw-64

1. 如何在 Windows 上面使用 gcc 進行 C/C++ 程式開發
https://www.gitbook.com/book/shaochien/how-to-use-gcc-to-develop-c-cpp-on-windows/details



  • Update the system packages with (Arch-Linux 的 pacman 套件管理程式,跟yum, apt類似的套件管理程式)

pacman --needed -Sy bash pacman pacman-mirrors msys2-runtime

  • 關掉 MSYS2, 再執行一遍( run it again from Start menu and update the rest with)

pacman -Su

  • 安裝git
pacman -S git

  •  用套件管理程式安裝 GCC

pacman -S mingw-w64-i686-gcc
pacman -S mingw-w64-x86_64-gcc
pacman -S gcc

  • 使用 gcc -v 來檢查是否安裝成功 
  • 安裝gdb
    pacman -S gdb

    • 安裝make

     pacman -S make





    2. 安裝開發工具codelite
    http://codelite.org/

    • 設定codelite及mingw 64 gcc compiler,到 build選單





    • 補充設定make及gdb路徑 
    • 設定codecompletion路徑,寫程式才會自動找到function, class自動補上


    • 建新專案,測試及執行